diff --git a/BUILD.gn b/BUILD.gn
index 4a7cd66..a14dc64 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -692,7 +692,7 @@
 
   if (enable_vr) {
     deps += [
-      "//chrome/browser/android/vr_shell:vr_common_unittests",
+      "//chrome/browser/vr:vr_common_unittests",
       "//tools/perf/contrib/vr_benchmarks:vr_perf_tests",
     ]
   }
diff --git a/DEPS b/DEPS
index 81c1b8c..775b3fd7 100644
--- a/DEPS
+++ b/DEPS
@@ -44,7 +44,7 @@
   # 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': 'e19aed3c064f77ce4a8cbe02eb039160fae86cbd',
+  'v8_revision': 'e6e187e6877b33bfe4d413beafaeb2644b2c2c5b',
   # 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.
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 50e0565..c81242c 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -2731,6 +2731,7 @@
       "test/android/javatests/src/org/chromium/base/test/util/TestFileUtil.java",
       "test/android/javatests/src/org/chromium/base/test/util/TestThread.java",
       "test/android/javatests/src/org/chromium/base/test/util/TimeoutScale.java",
+      "test/android/javatests/src/org/chromium/base/test/util/UserActionTester.java",
       "test/android/javatests/src/org/chromium/base/test/util/UrlUtils.java",
       "test/android/javatests/src/org/chromium/base/test/util/parameter/BaseParameter.java",
       "test/android/javatests/src/org/chromium/base/test/util/parameter/Parameter.java",
diff --git a/base/android/java/src/org/chromium/base/metrics/RecordUserAction.java b/base/android/java/src/org/chromium/base/metrics/RecordUserAction.java
index 5334746..0d2ba54 100644
--- a/base/android/java/src/org/chromium/base/metrics/RecordUserAction.java
+++ b/base/android/java/src/org/chromium/base/metrics/RecordUserAction.java
@@ -6,6 +6,7 @@
 
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.VisibleForTesting;
+import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
 
 /**
@@ -49,5 +50,36 @@
         });
     }
 
+    /**
+     * Interface to a class that receives a callback for each UserAction that is recorded.
+     */
+    public interface UserActionCallback {
+        @CalledByNative("UserActionCallback")
+        void onActionRecorded(String action);
+    }
+
+    private static long sNativeActionCallback;
+
+    /**
+     * Register a callback that is executed for each recorded UserAction.
+     * Only one callback can be registered at a time.
+     * The callback has to be unregistered using removeActionCallbackForTesting().
+     */
+    public static void setActionCallbackForTesting(UserActionCallback callback) {
+        assert sNativeActionCallback == 0;
+        sNativeActionCallback = nativeAddActionCallbackForTesting(callback);
+    }
+
+    /**
+     * Unregister the UserActionCallback.
+     */
+    public static void removeActionCallbackForTesting() {
+        assert sNativeActionCallback != 0;
+        nativeRemoveActionCallbackForTesting(sNativeActionCallback);
+        sNativeActionCallback = 0;
+    }
+
     private static native void nativeRecordUserAction(String action);
+    private static native long nativeAddActionCallbackForTesting(UserActionCallback callback);
+    private static native void nativeRemoveActionCallbackForTesting(long callbackId);
 }
diff --git a/base/android/record_user_action.cc b/base/android/record_user_action.cc
index 1452341..e375f8e 100644
--- a/base/android/record_user_action.cc
+++ b/base/android/record_user_action.cc
@@ -5,9 +5,19 @@
 #include "base/android/record_user_action.h"
 
 #include "base/android/jni_string.h"
+#include "base/bind.h"
+#include "base/callback.h"
 #include "base/metrics/user_metrics.h"
 #include "jni/RecordUserAction_jni.h"
 
+namespace {
+
+struct ActionCallbackWrapper {
+  base::ActionCallback action_callback;
+};
+
+}  // namespace
+
 namespace base {
 namespace android {
 
@@ -17,6 +27,34 @@
   RecordComputedAction(ConvertJavaStringToUTF8(env, j_action));
 }
 
+static void OnActionRecorded(const JavaRef<jobject>& callback,
+                             const std::string& action) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_UserActionCallback_onActionRecorded(
+      env, callback, ConvertUTF8ToJavaString(env, action));
+}
+
+static jlong AddActionCallbackForTesting(
+    JNIEnv* env,
+    const JavaParamRef<jclass>& clazz,
+    const JavaParamRef<jobject>& callback) {
+  // Create a wrapper for the ActionCallback, so it can life on the heap until
+  // RemoveActionCallbackForTesting() is called.
+  auto* wrapper = new ActionCallbackWrapper{base::Bind(
+      &OnActionRecorded, ScopedJavaGlobalRef<jobject>(env, callback))};
+  base::AddActionCallback(wrapper->action_callback);
+  return reinterpret_cast<intptr_t>(wrapper);
+}
+
+static void RemoveActionCallbackForTesting(JNIEnv* env,
+                                           const JavaParamRef<jclass>& clazz,
+                                           jlong callback_id) {
+  DCHECK(callback_id);
+  auto* wrapper = reinterpret_cast<ActionCallbackWrapper*>(callback_id);
+  base::RemoveActionCallback(wrapper->action_callback);
+  delete wrapper;
+}
+
 // Register native methods
 bool RegisterRecordUserAction(JNIEnv* env) {
   return RegisterNativesImpl(env);
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/UserActionTester.java b/base/test/android/javatests/src/org/chromium/base/test/util/UserActionTester.java
new file mode 100644
index 0000000..88e3551
--- /dev/null
+++ b/base/test/android/javatests/src/org/chromium/base/test/util/UserActionTester.java
@@ -0,0 +1,51 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.test.util;
+
+import org.chromium.base.ThreadUtils;
+import org.chromium.base.metrics.RecordUserAction;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A util class that records UserActions.
+ */
+public class UserActionTester implements RecordUserAction.UserActionCallback {
+    private List<String> mActions;
+
+    public UserActionTester() {
+        mActions = new ArrayList<>();
+        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+            @Override
+            public void run() {
+                RecordUserAction.setActionCallbackForTesting(UserActionTester.this);
+            }
+        });
+    }
+
+    public void tearDown() {
+        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+            @Override
+            public void run() {
+                RecordUserAction.removeActionCallbackForTesting();
+            }
+        });
+    }
+
+    @Override
+    public void onActionRecorded(String action) {
+        mActions.add(action);
+    }
+
+    public List<String> getActions() {
+        return mActions;
+    }
+
+    @Override
+    public String toString() {
+        return "Actions: " + mActions.toString();
+    }
+}
diff --git a/base/test/launcher/test_launcher.cc b/base/test/launcher/test_launcher.cc
index 8959e1e0..cd64bda 100644
--- a/base/test/launcher/test_launcher.cc
+++ b/base/test/launcher/test_launcher.cc
@@ -900,10 +900,6 @@
   results_tracker_.AddGlobalTag("OS_FREEBSD");
 #endif
 
-#if defined(OS_FUCHSIA)
-  results_tracker_.AddGlobalTag("OS_FUCHSIA");
-#endif
-
 #if defined(OS_IOS)
   results_tracker_.AddGlobalTag("OS_IOS");
 #endif
diff --git a/build/fuchsia/test_runner.py b/build/fuchsia/test_runner.py
index 20f1af35..e2c832a8 100755
--- a/build/fuchsia/test_runner.py
+++ b/build/fuchsia/test_runner.py
@@ -101,9 +101,7 @@
 
 
 def BuildBootfs(output_directory, runtime_deps_path, test_name, gtest_filter,
-                gtest_repeat, test_launcher_batch_limit,
-                test_launcher_filter_file, test_launcher_jobs,
-                single_process_tests, dry_run):
+                gtest_repeat, test_launcher_filter_file, dry_run):
   with open(runtime_deps_path) as f:
     lines = f.readlines()
 
@@ -135,14 +133,11 @@
   autorun_file.write('#!/bin/sh\n')
   autorun_file.write('/system/' + os.path.basename(test_name))
   autorun_file.write(' --test-launcher-retry-limit=0')
-
   if int(os.environ.get('CHROME_HEADLESS', 0)) != 0:
     # When running on bots (without KVM) execution is quite slow. The test
     # launcher times out a subprocess after 45s which can be too short. Make the
     # timeout twice as long.
     autorun_file.write(' --test-launcher-timeout=90000')
-  if single_process_tests:
-    autorun_file.write(' --single-process-tests')
   if test_launcher_filter_file:
     test_launcher_filter_file = os.path.normpath(
             os.path.join(output_directory, test_launcher_filter_file))
@@ -152,12 +147,6 @@
                        filter_file_on_device)
     target_source_pairs.append(
         [filter_file_on_device, test_launcher_filter_file])
-  if test_launcher_batch_limit:
-    autorun_file.write(' --test-launcher-batch-limit=%d' %
-                       test_launcher_batch_limit)
-  if test_launcher_jobs:
-    autorun_file.write(' --test-launcher-jobs=%d' %
-                       test_launcher_jobs)
   if gtest_filter:
     autorun_file.write(' --gtest_filter=' + gtest_filter)
   if gtest_repeat:
@@ -221,32 +210,18 @@
                       type=os.path.realpath,
                       help='Name of the the test')
   parser.add_argument('--gtest_filter',
-                      help='GTest filter to use in place of any default.')
+                      help='GTest filter to use in place of any default')
   parser.add_argument('--gtest_repeat',
-                      help='GTest repeat value to use.')
-  parser.add_argument('--single-process-tests', action='store_true',
-                      default=False,
-                      help='Runs the tests and the launcher in the same '
-                      'process. Useful for debugging.')
-  parser.add_argument('--test-launcher-batch-limit',
-                      type=int,
-                      help='Sets the limit of test batch to run in a single '
-                      'process.')
+                      help='GTest repeat value to use')
   parser.add_argument('--test-launcher-filter-file',
-                      type=os.path.realpath,
-                      help='Pass filter file through to target process.')
-  parser.add_argument('--test-launcher-jobs',
-                      type=int,
-                      help='Sets the number of parallel test jobs.')
+                      help='Pass filter file through to target process')
   parser.add_argument('--test_launcher_summary_output',
                       help='Currently ignored for 2-sided roll.')
   args = parser.parse_args()
 
   bootfs = BuildBootfs(args.output_directory, args.runtime_deps_path,
                        args.test_name, args.gtest_filter, args.gtest_repeat,
-                       args.test_launcher_batch_limit,
-                       args.test_launcher_filter_file, args.test_launcher_jobs,
-                       args.single_process_tests, args.dry_run)
+                       args.test_launcher_filter_file, args.dry_run)
 
   qemu_path = os.path.join(SDK_ROOT, 'qemu', 'bin', 'qemu-system-x86_64')
 
diff --git a/cc/surfaces/surface.h b/cc/surfaces/surface.h
index 660a6ecd..d4c8a7d7 100644
--- a/cc/surfaces/surface.h
+++ b/cc/surfaces/surface.h
@@ -54,6 +54,8 @@
     return previous_frame_surface_id_;
   }
 
+  base::WeakPtr<SurfaceClient> client() { return surface_client_; }
+
   bool has_deadline() const { return deadline_.has_deadline(); }
   const SurfaceDependencyDeadline& deadline() const { return deadline_; }
 
diff --git a/cc/surfaces/surface_aggregator.cc b/cc/surfaces/surface_aggregator.cc
index ea05182..d044150 100644
--- a/cc/surfaces/surface_aggregator.cc
+++ b/cc/surfaces/surface_aggregator.cc
@@ -141,8 +141,7 @@
   auto it = surface_id_to_resource_child_id_.find(surface->surface_id());
   if (it == surface_id_to_resource_child_id_.end()) {
     int child_id = provider_->CreateChild(
-        base::Bind(&SurfaceAggregator::UnrefResources,
-                   weak_factory_.GetWeakPtr(), surface->surface_id()));
+        base::Bind(&SurfaceAggregator::UnrefResources, surface->client()));
     provider_->SetChildNeedsSyncTokens(child_id, surface->needs_sync_tokens());
     surface_id_to_resource_child_id_[surface->surface_id()] = child_id;
     return child_id;
@@ -175,13 +174,13 @@
   return full_rect;
 }
 
+// static
 void SurfaceAggregator::UnrefResources(
-    const SurfaceId& surface_id,
+    base::WeakPtr<SurfaceClient> surface_client,
     const std::vector<ReturnedResource>& resources,
     BlockingTaskRunner* main_thread_task_runner) {
-  Surface* surface = manager_->GetSurfaceForId(surface_id);
-  if (surface)
-    surface->UnrefResources(resources);
+  if (surface_client)
+    surface_client->UnrefResources(resources);
 }
 
 void SurfaceAggregator::HandleSurfaceQuad(
diff --git a/cc/surfaces/surface_aggregator.h b/cc/surfaces/surface_aggregator.h
index fc71284..364f649 100644
--- a/cc/surfaces/surface_aggregator.h
+++ b/cc/surfaces/surface_aggregator.h
@@ -25,6 +25,7 @@
 class CompositorFrame;
 class ResourceProvider;
 class Surface;
+class SurfaceClient;
 class SurfaceDrawQuad;
 class SurfaceManager;
 
@@ -139,9 +140,9 @@
                                  const RenderPass& source,
                                  const gfx::Rect& full_rect) const;
 
-  void UnrefResources(const SurfaceId& surface_id,
-                      const std::vector<ReturnedResource>& resources,
-                      BlockingTaskRunner* main_thread_task_runner);
+  static void UnrefResources(base::WeakPtr<SurfaceClient> surface_client,
+                             const std::vector<ReturnedResource>& resources,
+                             BlockingTaskRunner* main_thread_task_runner);
 
   SurfaceManager* manager_;
   ResourceProvider* provider_;
diff --git a/cc/surfaces/surface_aggregator_unittest.cc b/cc/surfaces/surface_aggregator_unittest.cc
index a89f1c3c..e2361417c 100644
--- a/cc/surfaces/surface_aggregator_unittest.cc
+++ b/cc/surfaces/surface_aggregator_unittest.cc
@@ -2049,6 +2049,47 @@
   support->EvictCurrentSurface();
 }
 
+// This test verifies that when a CompositorFrame is submitted to a new surface
+// ID, and a new display frame is generated, then the resources of the old
+// surface are returned to the appropriate client.
+TEST_F(SurfaceAggregatorWithResourcesTest, ReturnResourcesAsSurfacesChange) {
+  FakeCompositorFrameSinkSupportClient client;
+  std::unique_ptr<CompositorFrameSinkSupport> support =
+      CompositorFrameSinkSupport::Create(
+          &client, &manager_, kArbitraryRootFrameSinkId, kRootIsRoot,
+          kHandlesFrameSinkIdInvalidation, kNeedsSyncPoints);
+  LocalSurfaceId local_surface_id1(7u, base::UnguessableToken::Create());
+  LocalSurfaceId local_surface_id2(8u, base::UnguessableToken::Create());
+  SurfaceId surface_id1(support->frame_sink_id(), local_surface_id1);
+  SurfaceId surface_id2(support->frame_sink_id(), local_surface_id2);
+
+  ResourceId ids[] = {11, 12, 13};
+  SubmitCompositorFrameWithResources(ids, arraysize(ids), true, SurfaceId(),
+                                     support.get(), surface_id1);
+
+  CompositorFrame frame = aggregator_->Aggregate(surface_id1);
+
+  // Nothing should be available to be returned yet.
+  EXPECT_TRUE(client.returned_resources().empty());
+
+  // Submitting a CompositorFrame to |surface_id2| should cause the surface
+  // associated with |surface_id1| to get garbage collected.
+  SubmitCompositorFrameWithResources(NULL, 0u, true, SurfaceId(), support.get(),
+                                     surface_id2);
+
+  frame = aggregator_->Aggregate(surface_id2);
+
+  ASSERT_EQ(3u, client.returned_resources().size());
+  ResourceId returned_ids[3];
+  for (size_t i = 0; i < 3; ++i) {
+    returned_ids[i] = client.returned_resources()[i].id;
+  }
+  EXPECT_THAT(returned_ids,
+              testing::WhenSorted(testing::ElementsAreArray(ids)));
+
+  support->EvictCurrentSurface();
+}
+
 TEST_F(SurfaceAggregatorWithResourcesTest, TakeInvalidResources) {
   FakeCompositorFrameSinkSupportClient client;
   std::unique_ptr<CompositorFrameSinkSupport> support =
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 9bdf03fa..ab211424 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -41,6 +41,8 @@
 if (enable_resource_whitelist_generation) {
   monochrome_resource_whitelist =
       "$target_gen_dir/monochrome_resource_whitelist.txt"
+  monochrome_locale_whitelist =
+      "$target_gen_dir/monochrome_locale_whitelist.txt"
 }
 
 jinja_template("chrome_public_android_manifest") {
@@ -730,9 +732,38 @@
               "/libmonochrome$shlib_extension.whitelist"
       output = monochrome_resource_whitelist
     }
+    
+    action("monochrome_locale_whitelist") {
+      script = "//tools/resources/filter_resource_whitelist.py"
+      
+      _system_webview_pak_whitelist =
+          "$root_gen_dir/android_webview/system_webview_pak_whitelist.txt"
+      
+      inputs = [
+        monochrome_resource_whitelist,
+        _system_webview_pak_whitelist,
+      ]
+      
+      outputs = [
+        monochrome_locale_whitelist,
+      ]
+      
+      deps = [
+        ":monochrome_resource_whitelist",
+        "//android_webview:system_webview_pak_whitelist",
+      ]
+      
+      args = [
+        "--input",
+        rebase_path(monochrome_resource_whitelist, root_build_dir),
+        "--filter",
+        rebase_path(_system_webview_pak_whitelist, root_build_dir),
+        "--output",
+        rebase_path(monochrome_locale_whitelist, root_build_dir),
+      ]
+    } 
   }
 
-  # This target does not output locale paks.
   chrome_paks("monochrome_paks") {
     output_dir = "$target_gen_dir/$target_name"
 
@@ -741,13 +772,26 @@
       "//android_webview:generate_aw_resources",
     ]
 
-    exclude_locale_paks = true
-
     if (enable_resource_whitelist_generation) {
       repack_whitelist = monochrome_resource_whitelist
       deps += [ ":monochrome_resource_whitelist" ]
+      locale_whitelist = monochrome_locale_whitelist
+      deps += [ ":monochrome_locale_whitelist" ]
     }
   }
+  
+  # This target is separate from monochrome_pak_assets because it does not
+  # disable compression.
+  android_assets("monochrome_locale_pak_assets") {
+    sources = []
+    foreach(_locale, locales - android_chrome_omitted_locales) {
+      sources += [ "$target_gen_dir/monochrome_paks/locales/$_locale.pak" ]
+    }
+  
+    deps = [
+      ":monochrome_paks",
+    ]
+  }
 
   # This target explicitly includes locale paks via deps.
   android_assets("monochrome_pak_assets") {
@@ -758,7 +802,7 @@
     disable_compression = true
 
     deps = [
-      ":chrome_public_locale_pak_assets",
+      ":monochrome_locale_pak_assets",
       ":monochrome_paks",
       "//android_webview:locale_pak_assets",
     ]
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferences.java
index abcd8fb..d1d5cdd1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferences.java
@@ -306,7 +306,7 @@
     }
 
     /**
-     * Notify subclasses that browsing data is about to be cleared.
+     * Notifies subclasses that browsing data is about to be cleared.
      */
     protected void onClearBrowsingData() {}
 
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni
index 690d0d0..0e5344fb 100644
--- a/chrome/android/java_sources.gni
+++ b/chrome/android/java_sources.gni
@@ -1604,6 +1604,7 @@
   "javatests/src/org/chromium/chrome/browser/preferences/PreferencesTest.java",
   "javatests/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionPromoUtilsTest.java",
   "javatests/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferencesTest.java",
+  "javatests/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataBridgeTest.java",
   "javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesTest.java",
   "javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesBasicTest.java",
   "javatests/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferencesManagerNativeTest.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataBridgeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataBridgeTest.java
new file mode 100644
index 0000000..1d5bf34
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataBridgeTest.java
@@ -0,0 +1,197 @@
+// 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.preferences.privacy;
+
+import static org.junit.Assert.assertThat;
+
+import android.support.test.filters.SmallTest;
+
+import org.hamcrest.Matchers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.ThreadUtils;
+import org.chromium.base.test.util.CallbackHelper;
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.UserActionTester;
+import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.browsing_data.BrowsingDataType;
+import org.chromium.chrome.browser.browsing_data.TimePeriod;
+import org.chromium.chrome.test.ChromeActivityTestRule;
+import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+
+/**
+ * Integration tests for ClearBrowsingDataPreferences.
+ */
+@RunWith(ChromeJUnit4ClassRunner.class)
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
+        ChromeActivityTestRule.DISABLE_NETWORK_PREDICTION_FLAG})
+public class BrowsingDataBridgeTest {
+    @Rule
+    public ChromeActivityTestRule<ChromeActivity> mActivityTestRule =
+            new ChromeActivityTestRule<>(ChromeActivity.class);
+
+    private CallbackHelper mCallbackHelper;
+    private BrowsingDataBridge.OnClearBrowsingDataListener mListener;
+    private UserActionTester mActionTester;
+
+    @Before
+    public void setUp() throws Exception {
+        mCallbackHelper = new CallbackHelper();
+        mListener = new BrowsingDataBridge.OnClearBrowsingDataListener() {
+            @Override
+            public void onBrowsingDataCleared() {
+                mCallbackHelper.notifyCalled();
+            }
+        };
+        mActivityTestRule.startMainActivityOnBlankPage();
+        mActionTester = new UserActionTester();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        mActionTester.tearDown();
+    }
+
+    /**
+     * Test no clear browsing data calls.
+     */
+    @Test
+    @SmallTest
+    public void testNoCalls() throws Exception {
+        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+            @Override
+            public void run() {
+                BrowsingDataBridge.getInstance().clearBrowsingData(
+                        mListener, new int[] {}, TimePeriod.ALL_TIME);
+            }
+        });
+        mCallbackHelper.waitForCallback(0);
+        assertThat(mActionTester.toString(), mActionTester.getActions(),
+                Matchers.contains("ClearBrowsingData_Everything"));
+    }
+
+    /**
+     * Test cookies deletion.
+     */
+    @Test
+    @SmallTest
+    public void testCookiesDeleted() throws Exception {
+        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+            @Override
+            public void run() {
+                BrowsingDataBridge.getInstance().clearBrowsingData(
+                        mListener, new int[] {BrowsingDataType.COOKIES}, TimePeriod.LAST_HOUR);
+            }
+        });
+        mCallbackHelper.waitForCallback(0);
+        assertThat(mActionTester.toString(), mActionTester.getActions(),
+                Matchers.containsInAnyOrder("ClearBrowsingData_LastHour",
+                        "ClearBrowsingData_MaskContainsUnprotectedWeb",
+                        "ClearBrowsingData_ChannelIDs", "ClearBrowsingData_Cookies"));
+    }
+
+    /**
+     * Test history deletion.
+     */
+    @Test
+    @SmallTest
+    public void testHistoryDeleted() throws Exception {
+        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+            @Override
+            public void run() {
+                BrowsingDataBridge.getInstance().clearBrowsingData(
+                        mListener, new int[] {BrowsingDataType.HISTORY}, TimePeriod.LAST_DAY);
+            }
+        });
+        mCallbackHelper.waitForCallback(0);
+        assertThat(mActionTester.toString(), mActionTester.getActions(),
+                Matchers.containsInAnyOrder("ClearBrowsingData_LastDay",
+                        "ClearBrowsingData_MaskContainsUnprotectedWeb",
+                        "ClearBrowsingData_History"));
+    }
+
+    /**
+     * Test deleting cache and content settings.
+     */
+    @Test
+    @SmallTest
+    public void testClearingSiteSettingsAndCache() throws Exception {
+        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+            @Override
+            public void run() {
+                BrowsingDataBridge.getInstance().clearBrowsingData(mListener,
+                        new int[] {
+                                BrowsingDataType.CACHE, BrowsingDataType.SITE_SETTINGS,
+                        },
+                        TimePeriod.FOUR_WEEKS);
+            }
+        });
+        mCallbackHelper.waitForCallback(0);
+        assertThat(mActionTester.toString(), mActionTester.getActions(),
+                Matchers.containsInAnyOrder("ClearBrowsingData_LastMonth",
+                        "ClearBrowsingData_MaskContainsUnprotectedWeb", "ClearBrowsingData_Cache",
+                        "ClearBrowsingData_ShaderCache", "ClearBrowsingData_ContentSettings"));
+    }
+
+    /**
+     * Test deleting cache and content settings with important sites.
+     */
+    @Test
+    @SmallTest
+    public void testClearingSiteSettingsAndCacheWithImportantSites() throws Exception {
+        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+            @Override
+            public void run() {
+                BrowsingDataBridge.getInstance().clearBrowsingDataExcludingDomains(mListener,
+                        new int[] {
+                                BrowsingDataType.CACHE, BrowsingDataType.SITE_SETTINGS,
+                        },
+                        TimePeriod.FOUR_WEEKS, new String[] {"google.com"}, new int[] {1},
+                        new String[0], new int[0]);
+            }
+        });
+        mCallbackHelper.waitForCallback(0);
+        assertThat(mActionTester.toString(), mActionTester.getActions(),
+                Matchers.containsInAnyOrder("ClearBrowsingData_LastMonth",
+                        // ClearBrowsingData_MaskContainsUnprotectedWeb is logged
+                        // twice because important storage is deleted separately.
+                        "ClearBrowsingData_MaskContainsUnprotectedWeb",
+                        "ClearBrowsingData_MaskContainsUnprotectedWeb", "ClearBrowsingData_Cache",
+                        "ClearBrowsingData_ShaderCache", "ClearBrowsingData_ContentSettings"));
+    }
+
+    /**
+     * Test deleting all browsing data. (Except bookmarks, they are deleted in Java code)
+     */
+    @Test
+    @SmallTest
+    public void testClearingAll() throws Exception {
+        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+            @Override
+            public void run() {
+                BrowsingDataBridge.getInstance().clearBrowsingData(mListener,
+                        new int[] {
+                                BrowsingDataType.CACHE, BrowsingDataType.COOKIES,
+                                BrowsingDataType.FORM_DATA, BrowsingDataType.HISTORY,
+                                BrowsingDataType.PASSWORDS, BrowsingDataType.SITE_SETTINGS,
+                        },
+                        TimePeriod.LAST_WEEK);
+            }
+        });
+        mCallbackHelper.waitForCallback(0);
+        assertThat(mActionTester.toString(), mActionTester.getActions(),
+                Matchers.containsInAnyOrder("ClearBrowsingData_LastWeek",
+                        "ClearBrowsingData_MaskContainsUnprotectedWeb", "ClearBrowsingData_Cache",
+                        "ClearBrowsingData_ShaderCache", "ClearBrowsingData_Cookies",
+                        "ClearBrowsingData_ChannelIDs", "ClearBrowsingData_Autofill",
+                        "ClearBrowsingData_History", "ClearBrowsingData_Passwords",
+                        "ClearBrowsingData_ContentSettings"));
+    }
+}
\ No newline at end of file
diff --git a/chrome/app/chrome_main_delegate.cc b/chrome/app/chrome_main_delegate.cc
index c382e53..0371d51 100644
--- a/chrome/app/chrome_main_delegate.cc
+++ b/chrome/app/chrome_main_delegate.cc
@@ -877,6 +877,16 @@
     ResourceBundle::InitSharedInstanceWithPakFileRegion(base::File(pak_fd),
                                                         pak_region);
 
+    // Load secondary locale .pak file if it exists.
+    pak_fd = global_descriptors->MaybeGet(kAndroidSecondaryLocalePakDescriptor);
+    if (pak_fd != -1) {
+      pak_region = global_descriptors->GetRegion(
+          kAndroidSecondaryLocalePakDescriptor);
+      ResourceBundle::GetSharedInstance().
+          LoadSecondaryLocaleDataWithPakFileRegion(
+              base::File(pak_fd), pak_region);
+    }
+
     int extra_pak_keys[] = {
       kAndroidChrome100PercentPakDescriptor,
       kAndroidUIResourcesPakDescriptor,
diff --git a/chrome/browser/android/vr_shell/BUILD.gn b/chrome/browser/android/vr_shell/BUILD.gn
index 61848af..eeaa5b2 100644
--- a/chrome/browser/android/vr_shell/BUILD.gn
+++ b/chrome/browser/android/vr_shell/BUILD.gn
@@ -2,243 +2,91 @@
 # 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")
 import("//chrome/common/features.gni")
 import("//device/vr/features/features.gni")
 import("//testing/test.gni")
 
-if (is_android) {
-  import("//build/config/android/rules.gni")
-}
-
 assert(enable_vr)
 
-# This library is platform-independent UI and related modules, which should
-# compile on any platform.
-static_library("vr_common") {
+static_library("vr_android") {
+  defines = []
+
   sources = [
-    "animation.cc",
-    "animation.h",
-    "color_scheme.cc",
-    "color_scheme.h",
-    "easing.cc",
-    "easing.h",
-    "font_fallback.cc",
-    "font_fallback.h",
-    "fps_meter.cc",
-    "fps_meter.h",
-    "gltf_asset.cc",
-    "gltf_asset.h",
-    "gltf_parser.cc",
-    "gltf_parser.h",
-    "textures/button_texture.cc",
-    "textures/button_texture.h",
-    "textures/close_button_texture.cc",
-    "textures/close_button_texture.h",
-    "textures/exclusive_screen_toast_texture.cc",
-    "textures/exclusive_screen_toast_texture.h",
-    "textures/exit_prompt_texture.cc",
-    "textures/exit_prompt_texture.h",
-    "textures/exit_warning_texture.cc",
-    "textures/exit_warning_texture.h",
-    "textures/insecure_content_permanent_texture.cc",
-    "textures/insecure_content_permanent_texture.h",
-    "textures/insecure_content_transient_texture.cc",
-    "textures/insecure_content_transient_texture.h",
-    "textures/loading_indicator_texture.cc",
-    "textures/loading_indicator_texture.h",
-    "textures/render_text_wrapper.cc",
-    "textures/render_text_wrapper.h",
-    "textures/splash_screen_icon_texture.cc",
-    "textures/splash_screen_icon_texture.h",
-    "textures/system_indicator_texture.cc",
-    "textures/system_indicator_texture.h",
-    "textures/ui_texture.cc",
-    "textures/ui_texture.h",
-    "textures/url_bar_texture.cc",
-    "textures/url_bar_texture.h",
-    "toolbar_helper.cc",
-    "toolbar_helper.h",
-    "toolbar_state.cc",
-    "toolbar_state.h",
-    "ui_browser_interface.h",
-    "ui_elements/button.cc",
-    "ui_elements/button.h",
-    "ui_elements/exclusive_screen_toast.cc",
-    "ui_elements/exclusive_screen_toast.h",
-    "ui_elements/exit_prompt.cc",
-    "ui_elements/exit_prompt.h",
-    "ui_elements/exit_prompt_backplane.cc",
-    "ui_elements/exit_prompt_backplane.h",
-    "ui_elements/loading_indicator.cc",
-    "ui_elements/loading_indicator.h",
-    "ui_elements/screen_dimmer.cc",
-    "ui_elements/screen_dimmer.h",
-    "ui_elements/simple_textured_element.h",
-    "ui_elements/splash_screen_icon.cc",
-    "ui_elements/splash_screen_icon.h",
-    "ui_elements/system_indicator.cc",
-    "ui_elements/system_indicator.h",
-    "ui_elements/textured_element.cc",
-    "ui_elements/textured_element.h",
-    "ui_elements/transience_manager.cc",
-    "ui_elements/transience_manager.h",
-    "ui_elements/transient_url_bar.cc",
-    "ui_elements/transient_url_bar.h",
-    "ui_elements/ui_element.cc",
-    "ui_elements/ui_element.h",
-    "ui_elements/ui_element_debug_id.h",
-    "ui_elements/url_bar.cc",
-    "ui_elements/url_bar.h",
-    "ui_input_manager.cc",
-    "ui_input_manager.h",
-    "ui_interface.h",
-    "ui_scene.cc",
-    "ui_scene.h",
-    "ui_scene_manager.cc",
-    "ui_scene_manager.h",
-    "ui_unsupported_mode.h",
+    "android_ui_gesture_target.cc",
+    "android_ui_gesture_target.h",
+    "elbow_model.cc",
+    "elbow_model.h",
+    "gl_browser_interface.h",
+    "mailbox_to_surface_bridge.cc",
+    "mailbox_to_surface_bridge.h",
+    "vr_compositor.cc",
+    "vr_compositor.h",
+    "vr_controller.cc",
+    "vr_controller.h",
+    "vr_controller_model.cc",
+    "vr_controller_model.h",
+    "vr_core_info.cc",
+    "vr_core_info.h",
+    "vr_gl_thread.cc",
+    "vr_gl_thread.h",
+    "vr_gl_util.cc",
+    "vr_gl_util.h",
+    "vr_input_manager.cc",
+    "vr_input_manager.h",
+    "vr_metrics_util.cc",
+    "vr_metrics_util.h",
+    "vr_shell.cc",
+    "vr_shell.h",
+    "vr_shell_delegate.cc",
+    "vr_shell_delegate.h",
+    "vr_shell_gl.cc",
+    "vr_shell_gl.h",
+    "vr_shell_renderer.cc",
+    "vr_shell_renderer.h",
+    "vr_usage_monitor.cc",
+    "vr_usage_monitor.h",
+    "vr_web_contents_observer.cc",
+    "vr_web_contents_observer.h",
   ]
 
   deps = [
+    ":vr_shell_jni_headers",
     "//base",
-    "//cc/paint",
-    "//chrome/app:generated_resources",
-    "//components/security_state/core",
-    "//components/strings",
-    "//components/toolbar",
-    "//components/url_formatter",
-    "//components/vector_icons",
-    "//skia",
+    "//cc",
+    "//chrome:resources",
+    "//chrome/browser/vr:vr_common",
+    "//components/rappor",
+    "//content/public/android:jni",
+    "//content/public/browser",
+    "//content/public/common",
+    "//device/gamepad",
+    "//device/vr",
+    "//services/ui/public/cpp/gpu",
+    "//ui/android",
     "//ui/base",
     "//ui/display",
     "//ui/gl",
     "//ui/gl/init",
-    "//ui/vector_icons",
   ]
+
+  public_deps = [
+    "//device/vr:mojo_bindings",
+  ]
+
+  libs = [
+    "//third_party/gvr-android-sdk/libgvr_shim_static_${current_cpu}.a",
+    "android",
+  ]
+
+  configs += [ "//third_party/gvr-android-sdk:libgvr_config" ]
 }
 
-if (is_android) {
-  # This library contains the VR code specific to Android.
-  # TODO(cjgrant): It should be renamed to reflect this.
-  static_library("vr_android") {
-    defines = []
-
-    sources = [
-      "android_ui_gesture_target.cc",
-      "android_ui_gesture_target.h",
-      "elbow_model.cc",
-      "elbow_model.h",
-      "gl_browser_interface.h",
-      "mailbox_to_surface_bridge.cc",
-      "mailbox_to_surface_bridge.h",
-      "vr_compositor.cc",
-      "vr_compositor.h",
-      "vr_controller.cc",
-      "vr_controller.h",
-      "vr_controller_model.cc",
-      "vr_controller_model.h",
-      "vr_core_info.cc",
-      "vr_core_info.h",
-      "vr_gl_thread.cc",
-      "vr_gl_thread.h",
-      "vr_gl_util.cc",
-      "vr_gl_util.h",
-      "vr_input_manager.cc",
-      "vr_input_manager.h",
-      "vr_metrics_util.cc",
-      "vr_metrics_util.h",
-      "vr_shell.cc",
-      "vr_shell.h",
-      "vr_shell_delegate.cc",
-      "vr_shell_delegate.h",
-      "vr_shell_gl.cc",
-      "vr_shell_gl.h",
-      "vr_shell_renderer.cc",
-      "vr_shell_renderer.h",
-      "vr_usage_monitor.cc",
-      "vr_usage_monitor.h",
-      "vr_web_contents_observer.cc",
-      "vr_web_contents_observer.h",
-    ]
-
-    deps = [
-      ":vr_common",
-      ":vr_shell_jni_headers",
-      "//base",
-      "//cc",
-      "//chrome:resources",
-      "//components/rappor",
-      "//content/public/android:jni",
-      "//content/public/browser",
-      "//content/public/common",
-      "//device/gamepad",
-      "//device/vr",
-      "//services/ui/public/cpp/gpu",
-      "//ui/android",
-      "//ui/base",
-      "//ui/display",
-      "//ui/gl",
-      "//ui/gl/init",
-    ]
-
-    public_deps = [
-      "//device/vr:mojo_bindings",
-    ]
-
-    libs = [
-      "//third_party/gvr-android-sdk/libgvr_shim_static_${current_cpu}.a",
-      "android",
-    ]
-
-    configs += [ "//third_party/gvr-android-sdk:libgvr_config" ]
-  }
-
-  generate_jni("vr_shell_jni_headers") {
-    sources = [
-      "//chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrCoreInfo.java",
-      "//chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java",
-      "//chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java",
-    ]
-    jni_package = "vr_shell"
-  }
-}
-
-test("vr_common_unittests") {
+generate_jni("vr_shell_jni_headers") {
   sources = [
-    "fps_meter_unittest.cc",
-    "gltf_parser_unittest.cc",
-    "run_all_unittests.cc",
-    "test/paths.cc",
-    "test/paths.h",
-    "textures/close_button_texture_unittest.cc",
-    "textures/url_bar_texture_unittest.cc",
-    "ui_elements/exit_prompt_unittest.cc",
-    "ui_elements/transience_manager_unittest.cc",
-    "ui_elements/ui_element_unittest.cc",
-    "ui_scene_manager_unittest.cc",
-    "ui_scene_unittest.cc",
+    "//chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrCoreInfo.java",
+    "//chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java",
+    "//chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java",
   ]
-
-  deps = [
-    ":vr_common",
-    "//base/test:test_support",
-    "//components:components_tests_pak",
-    "//components/security_state/core",
-    "//components/toolbar:vector_icons",
-    "//skia",
-    "//testing/gmock",
-    "//testing/gtest",
-    "//ui/gfx:test_support",
-    "//ui/gfx/geometry",
-    "//ui/gl",
-  ]
-
-  if (is_android) {
-    deps += [ "//ui/android:ui_java" ]
-  }
-
-  data = [
-    "test/data/",
-    "$root_out_dir/components_tests_resources.pak",
-  ]
+  jni_package = "vr_shell"
 }
diff --git a/chrome/browser/android/vr_shell/gl_browser_interface.h b/chrome/browser/android/vr_shell/gl_browser_interface.h
index aeec32e4..6bfb21d 100644
--- a/chrome/browser/android/vr_shell/gl_browser_interface.h
+++ b/chrome/browser/android/vr_shell/gl_browser_interface.h
@@ -8,7 +8,7 @@
 #include <memory>
 
 #include "base/android/jni_weak_ref.h"
-#include "chrome/browser/android/vr_shell/ui_interface.h"
+#include "chrome/browser/vr/ui_interface.h"
 #include "device/vr/android/gvr/gvr_gamepad_data_provider.h"
 #include "device/vr/vr_service.mojom.h"
 #include "third_party/gvr-android-sdk/src/libraries/headers/vr/gvr/capi/include/gvr_types.h"
@@ -29,7 +29,8 @@
   virtual void ContentSurfaceChanged(jobject surface) = 0;
   virtual void GvrDelegateReady(gvr::ViewerType viewer_type) = 0;
   virtual void UpdateGamepadData(device::GvrGamepadData) = 0;
-  virtual void AppButtonGesturePerformed(UiInterface::Direction direction) = 0;
+  virtual void AppButtonGesturePerformed(
+      vr::UiInterface::Direction direction) = 0;
   virtual void AppButtonClicked() = 0;
   virtual void ProcessContentGesture(
       std::unique_ptr<blink::WebInputEvent> event) = 0;
diff --git a/chrome/browser/android/vr_shell/test/paths.h b/chrome/browser/android/vr_shell/test/paths.h
deleted file mode 100644
index 6c358c7..0000000
--- a/chrome/browser/android/vr_shell/test/paths.h
+++ /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.
-
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_TEST_PATHS_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_TEST_PATHS_H_
-
-#include "base/files/file_path.h"
-
-namespace vr_shell {
-namespace test {
-
-void GetTestDataPath(base::FilePath* result);
-
-}  // namespace test
-}  // namespace vr_shell
-
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_TEST_PATHS_H_
diff --git a/chrome/browser/android/vr_shell/ui_elements/exclusive_screen_toast.h b/chrome/browser/android/vr_shell/ui_elements/exclusive_screen_toast.h
deleted file mode 100644
index 4c2d5f3..0000000
--- a/chrome/browser/android/vr_shell/ui_elements/exclusive_screen_toast.h
+++ /dev/null
@@ -1,28 +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 CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_EXCLUSIVE_SCREEN_TOAST_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_EXCLUSIVE_SCREEN_TOAST_H_
-
-#include "base/macros.h"
-#include "chrome/browser/android/vr_shell/textures/exclusive_screen_toast_texture.h"
-#include "chrome/browser/android/vr_shell/ui_elements/simple_textured_element.h"
-
-namespace vr_shell {
-
-class ExclusiveScreenToast
-    : public TransientSimpleTexturedElement<ExclusiveScreenToastTexture> {
- public:
-  ExclusiveScreenToast(int preferred_width, const base::TimeDelta& timeout);
-  ~ExclusiveScreenToast() override;
-
- private:
-  void UpdateElementSize() override;
-
-  DISALLOW_COPY_AND_ASSIGN(ExclusiveScreenToast);
-};
-
-}  // namespace vr_shell
-
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_EXCLUSIVE_SCREEN_TOAST_H_
diff --git a/chrome/browser/android/vr_shell/vr_controller.cc b/chrome/browser/android/vr_shell/vr_controller.cc
index 182101b..8a5e07f 100644
--- a/chrome/browser/android/vr_shell/vr_controller.cc
+++ b/chrome/browser/android/vr_shell/vr_controller.cc
@@ -248,7 +248,7 @@
         extrapolated_touch_ < kMaxNumOfExtrapolations))) {
     extrapolated_touch_++;
     touch_position_changed_ = true;
-    // Fill the touch_info
+    // vr::Fill the touch_info
     float duration = DeltaTimeSeconds(last_timestamp_nanos_);
     touch_info_->touch_point.position.set_x(cur_touch_point_->position.x() +
                                             overall_velocity_.x() * duration);
diff --git a/chrome/browser/android/vr_shell/vr_controller_model.cc b/chrome/browser/android/vr_shell/vr_controller_model.cc
index d08f2aa..edd30e4 100644
--- a/chrome/browser/android/vr_shell/vr_controller_model.cc
+++ b/chrome/browser/android/vr_shell/vr_controller_model.cc
@@ -6,7 +6,7 @@
 
 #include "base/memory/ptr_util.h"
 #include "base/trace_event/trace_event.h"
-#include "chrome/browser/android/vr_shell/gltf_parser.h"
+#include "chrome/browser/vr/gltf_parser.h"
 #include "chrome/grit/browser_resources.h"
 #include "third_party/skia/include/core/SkCanvas.h"
 #include "third_party/skia/include/core/SkRect.h"
@@ -47,15 +47,14 @@
 }  // namespace
 
 VrControllerModel::VrControllerModel(
-    std::unique_ptr<gltf::Asset> gltf_asset,
-    std::vector<std::unique_ptr<gltf::Buffer>> buffers)
-    : gltf_asset_(std::move(gltf_asset)),
-      buffers_(std::move(buffers)) {}
+    std::unique_ptr<vr::gltf::Asset> gltf_asset,
+    std::vector<std::unique_ptr<vr::gltf::Buffer>> buffers)
+    : gltf_asset_(std::move(gltf_asset)), buffers_(std::move(buffers)) {}
 
 VrControllerModel::~VrControllerModel() = default;
 
 const GLvoid* VrControllerModel::ElementsBuffer() const {
-  const gltf::BufferView* buffer_view =
+  const vr::gltf::BufferView* buffer_view =
       gltf_asset_->GetBufferView(ELEMENTS_BUFFER_ID);
   DCHECK(buffer_view && buffer_view->target == GL_ARRAY_BUFFER);
   const char* buffer = Buffer();
@@ -63,14 +62,14 @@
 }
 
 GLsizeiptr VrControllerModel::ElementsBufferSize() const {
-  const gltf::BufferView* buffer_view =
+  const vr::gltf::BufferView* buffer_view =
       gltf_asset_->GetBufferView(ELEMENTS_BUFFER_ID);
   DCHECK(buffer_view && buffer_view->target == GL_ARRAY_BUFFER);
   return buffer_view->byte_length;
 }
 
 const GLvoid* VrControllerModel::IndicesBuffer() const {
-  const gltf::BufferView* buffer_view =
+  const vr::gltf::BufferView* buffer_view =
       gltf_asset_->GetBufferView(INDICES_BUFFER_ID);
   DCHECK(buffer_view && buffer_view->target == GL_ELEMENT_ARRAY_BUFFER);
   const char* buffer = Buffer();
@@ -78,29 +77,29 @@
 }
 
 GLsizeiptr VrControllerModel::IndicesBufferSize() const {
-  const gltf::BufferView* buffer_view =
+  const vr::gltf::BufferView* buffer_view =
       gltf_asset_->GetBufferView(INDICES_BUFFER_ID);
   DCHECK(buffer_view && buffer_view->target == GL_ELEMENT_ARRAY_BUFFER);
   return buffer_view->byte_length;
 }
 
 GLenum VrControllerModel::DrawMode() const {
-  const gltf::Mesh* mesh = gltf_asset_->GetMesh(0);
+  const vr::gltf::Mesh* mesh = gltf_asset_->GetMesh(0);
   DCHECK(mesh && mesh->primitives.size());
   return mesh->primitives[0]->mode;
 }
 
-const gltf::Accessor* VrControllerModel::IndicesAccessor() const {
-  const gltf::Mesh* mesh = gltf_asset_->GetMesh(0);
+const vr::gltf::Accessor* VrControllerModel::IndicesAccessor() const {
+  const vr::gltf::Mesh* mesh = gltf_asset_->GetMesh(0);
   DCHECK(mesh && mesh->primitives.size());
   return mesh->primitives[0]->indices;
 }
 
-const gltf::Accessor* VrControllerModel::PositionAccessor() const {
+const vr::gltf::Accessor* VrControllerModel::PositionAccessor() const {
   return Accessor(kPosition);
 }
 
-const gltf::Accessor* VrControllerModel::TextureCoordinateAccessor() const {
+const vr::gltf::Accessor* VrControllerModel::TextureCoordinateAccessor() const {
   return Accessor(kTexCoord);
 }
 
@@ -136,9 +135,9 @@
   return buffers_[0]->data();
 }
 
-const gltf::Accessor* VrControllerModel::Accessor(
+const vr::gltf::Accessor* VrControllerModel::Accessor(
     const std::string& key) const {
-  const gltf::Mesh* mesh = gltf_asset_->GetMesh(0);
+  const vr::gltf::Mesh* mesh = gltf_asset_->GetMesh(0);
   DCHECK(mesh && mesh->primitives.size());
   auto it = mesh->primitives[0]->attributes.find(key);
   DCHECK(it != mesh->primitives[0]->attributes.begin());
@@ -147,11 +146,11 @@
 
 std::unique_ptr<VrControllerModel> VrControllerModel::LoadFromResources() {
   TRACE_EVENT0("gpu", "VrControllerModel::LoadFromResources");
-  std::vector<std::unique_ptr<gltf::Buffer>> buffers;
+  std::vector<std::unique_ptr<vr::gltf::Buffer>> buffers;
   auto model_data = ResourceBundle::GetSharedInstance().GetRawDataResource(
       IDR_VR_SHELL_DDCONTROLLER_MODEL);
-  std::unique_ptr<gltf::Asset> asset =
-      BinaryGltfParser::Parse(model_data, &buffers);
+  std::unique_ptr<vr::gltf::Asset> asset =
+      vr::BinaryGltfParser::Parse(model_data, &buffers);
   DCHECK(asset);
 
   auto controller_model =
diff --git a/chrome/browser/android/vr_shell/vr_controller_model.h b/chrome/browser/android/vr_shell/vr_controller_model.h
index 6bf81d7..4f010ca 100644
--- a/chrome/browser/android/vr_shell/vr_controller_model.h
+++ b/chrome/browser/android/vr_shell/vr_controller_model.h
@@ -7,7 +7,7 @@
 
 #include <memory>
 
-#include "chrome/browser/android/vr_shell/gltf_asset.h"
+#include "chrome/browser/vr/gltf_asset.h"
 #include "third_party/skia/include/core/SkImage.h"
 #include "ui/gfx/geometry/point.h"
 #include "ui/gl/gl_bindings.h"
@@ -26,8 +26,8 @@
   };
 
   explicit VrControllerModel(
-      std::unique_ptr<gltf::Asset> gltf_asset,
-      std::vector<std::unique_ptr<gltf::Buffer>> buffers);
+      std::unique_ptr<vr::gltf::Asset> gltf_asset,
+      std::vector<std::unique_ptr<vr::gltf::Buffer>> buffers);
   ~VrControllerModel();
 
   const GLvoid* ElementsBuffer() const;
@@ -35,9 +35,9 @@
   const GLvoid* IndicesBuffer() const;
   GLenum DrawMode() const;
   GLsizeiptr IndicesBufferSize() const;
-  const gltf::Accessor* IndicesAccessor() const;
-  const gltf::Accessor* PositionAccessor() const;
-  const gltf::Accessor* TextureCoordinateAccessor() const;
+  const vr::gltf::Accessor* IndicesAccessor() const;
+  const vr::gltf::Accessor* PositionAccessor() const;
+  const vr::gltf::Accessor* TextureCoordinateAccessor() const;
   void SetBaseTexture(sk_sp<SkImage> image);
   void SetTexture(int state, sk_sp<SkImage> patch);
   sk_sp<SkImage> GetTexture(int state) const;
@@ -45,13 +45,13 @@
   static std::unique_ptr<VrControllerModel> LoadFromResources();
 
  private:
-  std::unique_ptr<gltf::Asset> gltf_asset_;
+  std::unique_ptr<vr::gltf::Asset> gltf_asset_;
   sk_sp<SkImage> base_texture_;
   sk_sp<SkImage> textures_[STATE_COUNT];
-  std::vector<std::unique_ptr<gltf::Buffer>> buffers_;
+  std::vector<std::unique_ptr<vr::gltf::Buffer>> buffers_;
 
   const char* Buffer() const;
-  const gltf::Accessor* Accessor(const std::string& key) const;
+  const vr::gltf::Accessor* Accessor(const std::string& key) const;
 };
 
 }  // namespace vr_shell
diff --git a/chrome/browser/android/vr_shell/vr_gl_thread.cc b/chrome/browser/android/vr_shell/vr_gl_thread.cc
index a703d1b3..714d0b3 100644
--- a/chrome/browser/android/vr_shell/vr_gl_thread.cc
+++ b/chrome/browser/android/vr_shell/vr_gl_thread.cc
@@ -6,13 +6,13 @@
 
 #include <utility>
 
-#include "chrome/browser/android/vr_shell/toolbar_state.h"
-#include "chrome/browser/android/vr_shell/ui_interface.h"
-#include "chrome/browser/android/vr_shell/ui_scene.h"
-#include "chrome/browser/android/vr_shell/ui_scene_manager.h"
 #include "chrome/browser/android/vr_shell/vr_input_manager.h"
 #include "chrome/browser/android/vr_shell/vr_shell.h"
 #include "chrome/browser/android/vr_shell/vr_shell_gl.h"
+#include "chrome/browser/vr/toolbar_state.h"
+#include "chrome/browser/vr/ui_interface.h"
+#include "chrome/browser/vr/ui_scene.h"
+#include "chrome/browser/vr/ui_scene_manager.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 
 namespace vr_shell {
@@ -41,11 +41,11 @@
 }
 
 void VrGLThread::Init() {
-  scene_ = base::MakeUnique<UiScene>();
+  scene_ = base::MakeUnique<vr::UiScene>();
   vr_shell_gl_ = base::MakeUnique<VrShellGl>(this, gvr_api_, initially_web_vr_,
                                              reprojected_rendering_,
                                              daydream_support_, scene_.get());
-  scene_manager_ = base::MakeUnique<UiSceneManager>(
+  scene_manager_ = base::MakeUnique<vr::UiSceneManager>(
       this, scene_.get(), in_cct_, initially_web_vr_,
       web_vr_autopresentation_expected_);
 
@@ -74,12 +74,13 @@
 void VrGLThread::AppButtonClicked() {
   task_runner()->PostTask(
       FROM_HERE,
-      base::Bind(&UiSceneManager::OnAppButtonClicked, weak_scene_manager_));
+      base::Bind(&vr::UiSceneManager::OnAppButtonClicked, weak_scene_manager_));
 }
 
-void VrGLThread::AppButtonGesturePerformed(UiInterface::Direction direction) {
+void VrGLThread::AppButtonGesturePerformed(
+    vr::UiInterface::Direction direction) {
   task_runner()->PostTask(
-      FROM_HERE, base::Bind(&UiSceneManager::OnAppButtonGesturePerformed,
+      FROM_HERE, base::Bind(&vr::UiSceneManager::OnAppButtonGesturePerformed,
                             weak_scene_manager_, direction));
 }
 
@@ -137,10 +138,10 @@
 void VrGLThread::OnGLInitialized() {
   task_runner()->PostTask(
       FROM_HERE,
-      base::Bind(&UiSceneManager::OnGLInitialized, weak_scene_manager_));
+      base::Bind(&vr::UiSceneManager::OnGLInitialized, weak_scene_manager_));
 }
 
-void VrGLThread::OnUnsupportedMode(UiUnsupportedMode mode) {
+void VrGLThread::OnUnsupportedMode(vr::UiUnsupportedMode mode) {
   main_thread_task_runner_->PostTask(
       FROM_HERE,
       base::Bind(&VrShell::ExitVrDueToUnsupportedMode, weak_vr_shell_, mode));
@@ -148,93 +149,95 @@
 
 void VrGLThread::SetFullscreen(bool enabled) {
   WaitUntilThreadStarted();
-  task_runner()->PostTask(FROM_HERE, base::Bind(&UiSceneManager::SetFullscreen,
-                                                weak_scene_manager_, enabled));
+  task_runner()->PostTask(FROM_HERE,
+                          base::Bind(&vr::UiSceneManager::SetFullscreen,
+                                     weak_scene_manager_, enabled));
 }
 
 void VrGLThread::SetIncognito(bool incognito) {
   WaitUntilThreadStarted();
-  task_runner()->PostTask(
-      FROM_HERE, base::Bind(&UiSceneManager::SetIncognito, weak_scene_manager_,
-                            incognito));
+  task_runner()->PostTask(FROM_HERE,
+                          base::Bind(&vr::UiSceneManager::SetIncognito,
+                                     weak_scene_manager_, incognito));
 }
 
 void VrGLThread::SetHistoryButtonsEnabled(bool can_go_back,
                                           bool can_go_forward) {
   WaitUntilThreadStarted();
   task_runner()->PostTask(
-      FROM_HERE, base::Bind(&UiSceneManager::SetHistoryButtonsEnabled,
+      FROM_HERE, base::Bind(&vr::UiSceneManager::SetHistoryButtonsEnabled,
                             weak_scene_manager_, can_go_back, can_go_forward));
 }
 
 void VrGLThread::SetLoadProgress(float progress) {
   WaitUntilThreadStarted();
   task_runner()->PostTask(FROM_HERE,
-                          base::Bind(&UiSceneManager::SetLoadProgress,
+                          base::Bind(&vr::UiSceneManager::SetLoadProgress,
                                      weak_scene_manager_, progress));
 }
 
 void VrGLThread::SetLoading(bool loading) {
   WaitUntilThreadStarted();
-  task_runner()->PostTask(FROM_HERE, base::Bind(&UiSceneManager::SetLoading,
+  task_runner()->PostTask(FROM_HERE, base::Bind(&vr::UiSceneManager::SetLoading,
                                                 weak_scene_manager_, loading));
 }
 
-void VrGLThread::SetToolbarState(const ToolbarState& state) {
+void VrGLThread::SetToolbarState(const vr::ToolbarState& state) {
   WaitUntilThreadStarted();
-  task_runner()->PostTask(
-      FROM_HERE,
-      base::Bind(&UiSceneManager::SetToolbarState, weak_scene_manager_, state));
+  task_runner()->PostTask(FROM_HERE,
+                          base::Bind(&vr::UiSceneManager::SetToolbarState,
+                                     weak_scene_manager_, state));
 }
 
 void VrGLThread::SetWebVrMode(bool enabled, bool show_toast) {
   WaitUntilThreadStarted();
-  task_runner()->PostTask(
-      FROM_HERE, base::Bind(&UiSceneManager::SetWebVrMode, weak_scene_manager_,
-                            enabled, show_toast));
+  task_runner()->PostTask(FROM_HERE,
+                          base::Bind(&vr::UiSceneManager::SetWebVrMode,
+                                     weak_scene_manager_, enabled, show_toast));
 }
 
 void VrGLThread::SetWebVrSecureOrigin(bool secure) {
   WaitUntilThreadStarted();
   task_runner()->PostTask(FROM_HERE,
-                          base::Bind(&UiSceneManager::SetWebVrSecureOrigin,
+                          base::Bind(&vr::UiSceneManager::SetWebVrSecureOrigin,
                                      weak_scene_manager_, secure));
 }
 
 void VrGLThread::SetAudioCapturingIndicator(bool enabled) {
   task_runner()->PostTask(
-      FROM_HERE, base::Bind(&UiSceneManager::SetAudioCapturingIndicator,
+      FROM_HERE, base::Bind(&vr::UiSceneManager::SetAudioCapturingIndicator,
                             weak_scene_manager_, enabled));
 }
 
 void VrGLThread::SetVideoCapturingIndicator(bool enabled) {
   task_runner()->PostTask(
-      FROM_HERE, base::Bind(&UiSceneManager::SetVideoCapturingIndicator,
+      FROM_HERE, base::Bind(&vr::UiSceneManager::SetVideoCapturingIndicator,
                             weak_scene_manager_, enabled));
 }
 
 void VrGLThread::SetScreenCapturingIndicator(bool enabled) {
   task_runner()->PostTask(
-      FROM_HERE, base::Bind(&UiSceneManager::SetScreenCapturingIndicator,
+      FROM_HERE, base::Bind(&vr::UiSceneManager::SetScreenCapturingIndicator,
                             weak_scene_manager_, enabled));
 }
 
 void VrGLThread::SetBluetoothConnectedIndicator(bool enabled) {
   task_runner()->PostTask(
-      FROM_HERE, base::Bind(&UiSceneManager::SetBluetoothConnectedIndicator,
+      FROM_HERE, base::Bind(&vr::UiSceneManager::SetBluetoothConnectedIndicator,
                             weak_scene_manager_, enabled));
 }
 
 void VrGLThread::SetIsExiting() {
   WaitUntilThreadStarted();
-  task_runner()->PostTask(FROM_HERE, base::Bind(&UiSceneManager::SetIsExiting,
-                                                weak_scene_manager_));
+  task_runner()->PostTask(
+      FROM_HERE,
+      base::Bind(&vr::UiSceneManager::SetIsExiting, weak_scene_manager_));
 }
 
 void VrGLThread::SetSplashScreenIcon(const SkBitmap& bitmap) {
   WaitUntilThreadStarted();
   task_runner()->PostTask(FROM_HERE,
-                          base::Bind(&UiSceneManager::SetSplashScreenIcon,
+                          base::Bind(&vr::UiSceneManager::SetSplashScreenIcon,
                                      weak_scene_manager_, bitmap));
 }
 
diff --git a/chrome/browser/android/vr_shell/vr_gl_thread.h b/chrome/browser/android/vr_shell/vr_gl_thread.h
index 5bbcde9..6026c13 100644
--- a/chrome/browser/android/vr_shell/vr_gl_thread.h
+++ b/chrome/browser/android/vr_shell/vr_gl_thread.h
@@ -12,21 +12,24 @@
 #include "base/single_thread_task_runner.h"
 #include "base/threading/thread.h"
 #include "chrome/browser/android/vr_shell/gl_browser_interface.h"
-#include "chrome/browser/android/vr_shell/ui_browser_interface.h"
-#include "chrome/browser/android/vr_shell/ui_interface.h"
+#include "chrome/browser/vr/ui_browser_interface.h"
+#include "chrome/browser/vr/ui_interface.h"
 #include "third_party/gvr-android-sdk/src/libraries/headers/vr/gvr/capi/include/gvr_types.h"
 
+namespace vr {
+class UiScene;
+class UiSceneManager;
+}  // namespace vr
+
 namespace vr_shell {
 
-class UiScene;
-class UiSceneManager;
 class VrShell;
 class VrShellGl;
 
 class VrGLThread : public base::Thread,
                    public GlBrowserInterface,
-                   public UiBrowserInterface,
-                   public UiInterface {
+                   public vr::UiBrowserInterface,
+                   public vr::UiInterface {
  public:
   VrGLThread(
       const base::WeakPtr<VrShell>& weak_vr_shell,
@@ -40,7 +43,7 @@
 
   ~VrGLThread() override;
   base::WeakPtr<VrShellGl> GetVrShellGl() { return weak_vr_shell_gl_; }
-  base::WeakPtr<UiSceneManager> GetSceneManager() {
+  base::WeakPtr<vr::UiSceneManager> GetSceneManager() {
     return weak_scene_manager_;
   }
 
@@ -49,7 +52,7 @@
   void GvrDelegateReady(gvr::ViewerType viewer_type) override;
   void UpdateGamepadData(device::GvrGamepadData) override;
   void AppButtonClicked() override;
-  void AppButtonGesturePerformed(UiInterface::Direction direction) override;
+  void AppButtonGesturePerformed(vr::UiInterface::Direction direction) override;
   void ProcessContentGesture(
       std::unique_ptr<blink::WebInputEvent> event) override;
   void ForceExitVr() override;
@@ -60,20 +63,20 @@
   void ToggleCardboardGamepad(bool enabled) override;
   void OnGLInitialized() override;
 
-  // UiBrowserInterface implementation (UI calling to VrShell).
+  // vr::UiBrowserInterface implementation (UI calling to VrShell).
   void ExitPresent() override;
   void ExitFullscreen() override;
   void NavigateBack() override;
   void ExitCct() override;
-  void OnUnsupportedMode(UiUnsupportedMode mode) override;
+  void OnUnsupportedMode(vr::UiUnsupportedMode mode) override;
 
-  // UiInterface implementation (VrShell and GL calling to the UI).
+  // vr::UiInterface implementation (VrShell and GL calling to the UI).
   void SetFullscreen(bool enabled) override;
   void SetIncognito(bool incognito) override;
   void SetHistoryButtonsEnabled(bool can_go_back, bool can_go_forward) override;
   void SetLoadProgress(float progress) override;
   void SetLoading(bool loading) override;
-  void SetToolbarState(const ToolbarState& state) override;
+  void SetToolbarState(const vr::ToolbarState& state) override;
   void SetWebVrMode(bool enabled, bool show_toast) override;
   void SetWebVrSecureOrigin(bool secure) override;
   void SetVideoCapturingIndicator(bool enabled) override;
@@ -89,9 +92,9 @@
 
  private:
   // Created on GL thread.
-  std::unique_ptr<UiScene> scene_;
-  std::unique_ptr<UiSceneManager> scene_manager_;
-  base::WeakPtr<UiSceneManager> weak_scene_manager_;
+  std::unique_ptr<vr::UiScene> scene_;
+  std::unique_ptr<vr::UiSceneManager> scene_manager_;
+  base::WeakPtr<vr::UiSceneManager> weak_scene_manager_;
   std::unique_ptr<VrShellGl> vr_shell_gl_;
   base::WeakPtr<VrShellGl> weak_vr_shell_gl_;
 
diff --git a/chrome/browser/android/vr_shell/vr_shell.cc b/chrome/browser/android/vr_shell/vr_shell.cc
index 5da786a..fd602959 100644
--- a/chrome/browser/android/vr_shell/vr_shell.cc
+++ b/chrome/browser/android/vr_shell/vr_shell.cc
@@ -21,9 +21,6 @@
 #include "base/values.h"
 #include "chrome/browser/android/tab_android.h"
 #include "chrome/browser/android/vr_shell/android_ui_gesture_target.h"
-#include "chrome/browser/android/vr_shell/toolbar_helper.h"
-#include "chrome/browser/android/vr_shell/ui_interface.h"
-#include "chrome/browser/android/vr_shell/ui_scene_manager.h"
 #include "chrome/browser/android/vr_shell/vr_compositor.h"
 #include "chrome/browser/android/vr_shell/vr_controller_model.h"
 #include "chrome/browser/android/vr_shell/vr_gl_thread.h"
@@ -35,6 +32,9 @@
 #include "chrome/browser/android/vr_shell/vr_web_contents_observer.h"
 #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
 #include "chrome/browser/media/webrtc/media_stream_capture_indicator.h"
+#include "chrome/browser/vr/toolbar_helper.h"
+#include "chrome/browser/vr/ui_interface.h"
+#include "chrome/browser/vr/ui_scene_manager.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/navigation_controller.h"
@@ -118,7 +118,7 @@
       for_web_vr, web_vr_autopresentation_expected, in_cct,
       reprojected_rendering_, HasDaydreamSupport(env));
   ui_ = gl_thread_.get();
-  toolbar_ = base::MakeUnique<ToolbarHelper>(ui_, this);
+  toolbar_ = base::MakeUnique<vr::ToolbarHelper>(ui_, this);
 
   base::Thread::Options options(base::MessageLoop::TYPE_DEFAULT, 0);
   options.priority = base::ThreadPriority::DISPLAY;
@@ -578,10 +578,10 @@
   }
 }
 
-void VrShell::ExitVrDueToUnsupportedMode(UiUnsupportedMode mode) {
-  if (mode == UiUnsupportedMode::kUnhandledPageInfo) {
+void VrShell::ExitVrDueToUnsupportedMode(vr::UiUnsupportedMode mode) {
+  if (mode == vr::UiUnsupportedMode::kUnhandledPageInfo) {
     UMA_HISTOGRAM_ENUMERATION("VR.Shell.EncounteredUnsupportedMode", mode,
-                              UiUnsupportedMode::kCount);
+                              vr::UiUnsupportedMode::kCount);
     JNIEnv* env = base::android::AttachCurrentThread();
     Java_VrShellImpl_onUnhandledPageInfo(env, j_vr_shell_.obj());
     return;
@@ -592,7 +592,7 @@
       base::Bind(&VrShell::ForceExitVr, weak_ptr_factory_.GetWeakPtr()),
       kExitVrDueToUnsupportedModeDelay);
   UMA_HISTOGRAM_ENUMERATION("VR.Shell.EncounteredUnsupportedMode", mode,
-                            UiUnsupportedMode::kCount);
+                            vr::UiUnsupportedMode::kCount);
 }
 
 void VrShell::UpdateVSyncInterval(base::TimeTicks vsync_timebase,
diff --git a/chrome/browser/android/vr_shell/vr_shell.h b/chrome/browser/android/vr_shell/vr_shell.h
index fc72930..f69f2b7 100644
--- a/chrome/browser/android/vr_shell/vr_shell.h
+++ b/chrome/browser/android/vr_shell/vr_shell.h
@@ -14,10 +14,10 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/single_thread_task_runner.h"
-#include "chrome/browser/android/vr_shell/ui_interface.h"
-#include "chrome/browser/android/vr_shell/ui_unsupported_mode.h"
 #include "chrome/browser/android/vr_shell/vr_controller_model.h"
 #include "chrome/browser/ui/toolbar/chrome_toolbar_model_delegate.h"
+#include "chrome/browser/vr/ui_interface.h"
+#include "chrome/browser/vr/ui_unsupported_mode.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "device/vr/android/gvr/cardboard_gamepad_data_provider.h"
 #include "device/vr/android/gvr/gvr_delegate.h"
@@ -27,21 +27,24 @@
 
 namespace blink {
 class WebInputEvent;
-}
+}  // namespace blink
 
 namespace content {
 class WebContents;
-}
+}  // namespace content
 
 namespace ui {
 class WindowAndroid;
-}
+}  // namespace ui
+
+namespace vr {
+class ToolbarHelper;
+class UiInterface;
+}  // namespace vr
 
 namespace vr_shell {
 
 class AndroidUiGestureTarget;
-class ToolbarHelper;
-class UiInterface;
 class VrCompositor;
 class VrGLThread;
 class VrInputManager;
@@ -165,7 +168,7 @@
   void ForceExitVr();
   void ExitPresent();
   void ExitFullscreen();
-  void ExitVrDueToUnsupportedMode(UiUnsupportedMode mode);
+  void ExitVrDueToUnsupportedMode(vr::UiUnsupportedMode mode);
 
   void ProcessContentGesture(std::unique_ptr<blink::WebInputEvent> event);
   void SubmitControllerModel(std::unique_ptr<VrControllerModel> model);
@@ -229,8 +232,8 @@
   bool thread_started_ = false;
   bool reprojected_rendering_;
 
-  UiInterface* ui_;
-  std::unique_ptr<ToolbarHelper> toolbar_;
+  vr::UiInterface* ui_;
+  std::unique_ptr<vr::ToolbarHelper> toolbar_;
 
   jobject content_surface_ = nullptr;
   bool taken_surface_ = false;
diff --git a/chrome/browser/android/vr_shell/vr_shell_gl.cc b/chrome/browser/android/vr_shell/vr_shell_gl.cc
index bc91a39..7cca0b4 100644
--- a/chrome/browser/android/vr_shell/vr_shell_gl.cc
+++ b/chrome/browser/android/vr_shell/vr_shell_gl.cc
@@ -14,18 +14,18 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/task_scheduler/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "chrome/browser/android/vr_shell/fps_meter.h"
 #include "chrome/browser/android/vr_shell/gl_browser_interface.h"
 #include "chrome/browser/android/vr_shell/mailbox_to_surface_bridge.h"
-#include "chrome/browser/android/vr_shell/ui_elements/ui_element.h"
-#include "chrome/browser/android/vr_shell/ui_interface.h"
-#include "chrome/browser/android/vr_shell/ui_scene.h"
 #include "chrome/browser/android/vr_shell/vr_controller.h"
 #include "chrome/browser/android/vr_shell/vr_gl_util.h"
 #include "chrome/browser/android/vr_shell/vr_metrics_util.h"
 #include "chrome/browser/android/vr_shell/vr_shell.h"
 #include "chrome/browser/android/vr_shell/vr_shell_renderer.h"
 #include "chrome/browser/android/vr_shell/vr_usage_monitor.h"
+#include "chrome/browser/vr/elements/ui_element.h"
+#include "chrome/browser/vr/fps_meter.h"
+#include "chrome/browser/vr/ui_interface.h"
+#include "chrome/browser/vr/ui_scene.h"
 #include "device/vr/android/gvr/gvr_delegate.h"
 #include "device/vr/android/gvr/gvr_device.h"
 #include "device/vr/android/gvr/gvr_gamepad_data_provider.h"
@@ -209,7 +209,7 @@
                      bool initially_web_vr,
                      bool reprojected_rendering,
                      bool daydream_support,
-                     UiScene* scene)
+                     vr::UiScene* scene)
     : web_vr_mode_(initially_web_vr),
       surfaceless_rendering_(reprojected_rendering),
       daydream_support_(daydream_support),
@@ -217,9 +217,9 @@
       binding_(this),
       browser_(browser),
       scene_(scene),
-      fps_meter_(new FPSMeter()),
-      webvr_js_time_(new SlidingAverage(kWebVRSlidingAverageSize)),
-      webvr_render_time_(new SlidingAverage(kWebVRSlidingAverageSize)),
+      fps_meter_(new vr::FPSMeter()),
+      webvr_js_time_(new vr::SlidingAverage(kWebVRSlidingAverageSize)),
+      webvr_render_time_(new vr::SlidingAverage(kWebVRSlidingAverageSize)),
       weak_ptr_factory_(this) {
   GvrInit(gvr_api);
 }
@@ -308,7 +308,7 @@
                    task_runner_));
   }
 
-  input_manager_ = base::MakeUnique<UiInputManager>(scene_, this);
+  input_manager_ = base::MakeUnique<vr::UiInputManager>(scene_, this);
 }
 
 void VrShellGl::CreateContentSurface() {
@@ -546,16 +546,16 @@
 
   std::unique_ptr<GestureList> gesture_list_ptr = controller_->DetectGestures();
   GestureList& gesture_list = *gesture_list_ptr;
-  UiInputManager::ButtonState controller_button_state =
-      UiInputManager::ButtonState::UP;
+  vr::UiInputManager::ButtonState controller_button_state =
+      vr::UiInputManager::ButtonState::UP;
   DCHECK(!(controller_->ButtonUpHappened(gvr::kControllerButtonClick) &&
            controller_->ButtonDownHappened(gvr::kControllerButtonClick)))
       << "Cannot handle a button down and up event within one frame.";
   if (touch_pending_) {
-    controller_button_state = UiInputManager::ButtonState::CLICKED;
+    controller_button_state = vr::UiInputManager::ButtonState::CLICKED;
     touch_pending_ = false;
   } else if (controller_->ButtonState(gvr::kControllerButtonClick)) {
-    controller_button_state = UiInputManager::ButtonState::DOWN;
+    controller_button_state = vr::UiInputManager::ButtonState::DOWN;
   }
   input_manager_->HandleInput(controller_direction, pointer_start_,
                               controller_button_state, gesture_list,
@@ -713,7 +713,7 @@
     // considered a regular click
     // TODO(asimjour1): We need to refactor the gesture recognition outside of
     // VrShellGl.
-    UiInterface::Direction direction = UiInterface::NONE;
+    vr::UiInterface::Direction direction = vr::UiInterface::NONE;
     gfx::Vector3dF a = controller_start_direction_;
     gfx::Vector3dF b = controller_direction;
     a.set_y(0);
@@ -722,12 +722,12 @@
       float gesture_xz_angle =
           acos(gfx::DotProduct(a, b) / a.Length() / b.Length());
       if (fabs(gesture_xz_angle) > kMinAppButtonGestureAngleRad) {
-        direction =
-            gesture_xz_angle < 0 ? UiInterface::LEFT : UiInterface::RIGHT;
+        direction = gesture_xz_angle < 0 ? vr::UiInterface::LEFT
+                                         : vr::UiInterface::RIGHT;
         browser_->AppButtonGesturePerformed(direction);
       }
     }
-    if (direction == UiInterface::NONE)
+    if (direction == vr::UiInterface::NONE)
       browser_->AppButtonClicked();
   }
 }
@@ -957,7 +957,7 @@
                  SkColorGetA(backgroundColor) / 255.0);
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   }
-  std::vector<const UiElement*> elements = scene_->GetWorldElements();
+  std::vector<const vr::UiElement*> elements = scene_->GetWorldElements();
   const bool draw_reticle =
       !(scene_->is_exiting() || scene_->showing_splash_screen() ||
         ShouldDrawWebVr());
@@ -966,7 +966,7 @@
 }
 
 void VrShellGl::DrawOverlayElements(const gfx::Transform& head_pose) {
-  std::vector<const UiElement*> elements = scene_->GetOverlayElements();
+  std::vector<const vr::UiElement*> elements = scene_->GetOverlayElements();
   if (elements.empty())
     return;
 
@@ -981,7 +981,7 @@
 
 void VrShellGl::DrawHeadLockedElements() {
   TRACE_EVENT0("gpu", "VrShellGl::DrawHeadLockedElements");
-  std::vector<const UiElement*> elements = scene_->GetHeadLockedElements();
+  std::vector<const vr::UiElement*> elements = scene_->GetHeadLockedElements();
 
   // Add head-locked viewports. The list gets reset to just
   // the recommended viewports (for the primary buffer) each frame.
@@ -1003,7 +1003,7 @@
 }
 
 void VrShellGl::DrawUiView(const gfx::Transform& head_pose,
-                           const std::vector<const UiElement*>& elements,
+                           const std::vector<const vr::UiElement*>& elements,
                            const gfx::Size& render_size,
                            int viewport_offset,
                            bool draw_reticle) {
@@ -1037,7 +1037,7 @@
 }
 
 void VrShellGl::DrawElements(const gfx::Transform& view_proj_matrix,
-                             const std::vector<const UiElement*>& elements,
+                             const std::vector<const vr::UiElement*>& elements,
                              bool draw_reticle) {
   if (elements.empty())
     return;
@@ -1062,31 +1062,31 @@
 }
 
 void VrShellGl::DrawElement(const gfx::Transform& view_proj_matrix,
-                            const UiElement& element) {
+                            const vr::UiElement& element) {
   gfx::Transform transform = view_proj_matrix * element.transform();
 
   switch (element.fill()) {
-    case Fill::OPAQUE_GRADIENT: {
+    case vr::Fill::OPAQUE_GRADIENT: {
       vr_shell_renderer_->GetGradientQuadRenderer()->Draw(
           transform, element.edge_color(), element.center_color(),
           element.computed_opacity());
       break;
     }
-    case Fill::GRID_GRADIENT: {
+    case vr::Fill::GRID_GRADIENT: {
       vr_shell_renderer_->GetGradientGridRenderer()->Draw(
           transform, element.edge_color(), element.center_color(),
           element.grid_color(), element.gridline_count(),
           element.computed_opacity());
       break;
     }
-    case Fill::CONTENT: {
+    case vr::Fill::CONTENT: {
       vr_shell_renderer_->GetExternalTexturedQuadRenderer()->Draw(
           content_texture_id_, transform, render_size_vrshell_,
           gfx::SizeF(element.size().x(), element.size().y()),
           element.computed_opacity(), element.corner_radius());
       break;
     }
-    case Fill::SELF: {
+    case vr::Fill::SELF: {
       element.Render(vr_shell_renderer_.get(), transform);
       break;
     }
@@ -1095,10 +1095,10 @@
   }
 }
 
-std::vector<const UiElement*> VrShellGl::GetElementsInDrawOrder(
+std::vector<const vr::UiElement*> VrShellGl::GetElementsInDrawOrder(
     const gfx::Transform& view_matrix,
-    const std::vector<const UiElement*>& elements) {
-  std::vector<const UiElement*> sorted_elements = elements;
+    const std::vector<const vr::UiElement*>& elements) {
+  std::vector<const vr::UiElement*> sorted_elements = elements;
 
   // Sort elements primarily based on their draw phase (lower draw phase first)
   // and secondarily based on their z-axis distance (more distant first).
@@ -1107,7 +1107,7 @@
   // release, and provides a consistent ordering that we can easily design
   // around.
   std::sort(sorted_elements.begin(), sorted_elements.end(),
-            [](const UiElement* first, const UiElement* second) {
+            [](const vr::UiElement* first, const vr::UiElement* second) {
               if (first->draw_phase() != second->draw_phase()) {
                 return first->draw_phase() < second->draw_phase();
               } else {
diff --git a/chrome/browser/android/vr_shell/vr_shell_gl.h b/chrome/browser/android/vr_shell/vr_shell_gl.h
index 8977e81..8211ae8 100644
--- a/chrome/browser/android/vr_shell/vr_shell_gl.h
+++ b/chrome/browser/android/vr_shell/vr_shell_gl.h
@@ -5,7 +5,7 @@
 #ifndef CHROME_BROWSER_ANDROID_VR_SHELL_VR_SHELL_GL_H_
 #define CHROME_BROWSER_ANDROID_VR_SHELL_VR_SHELL_GL_H_
 
-#include <chrome/browser/android/vr_shell/ui_input_manager.h>
+#include <chrome/browser/vr/ui_input_manager.h>
 #include <memory>
 #include <queue>
 #include <utility>
@@ -29,7 +29,7 @@
 
 namespace blink {
 class WebMouseEvent;
-}
+}  // namespace blink
 
 namespace gl {
 class GLContext;
@@ -37,19 +37,22 @@
 class GLSurface;
 class ScopedJavaSurface;
 class SurfaceTexture;
-}
+}  // namespace gl
 
 namespace gpu {
 struct MailboxHolder;
-}
+}  // namespace gpu
 
-namespace vr_shell {
-
+namespace vr {
 class FPSMeter;
-class MailboxToSurfaceBridge;
 class SlidingAverage;
 class UiElement;
 class UiScene;
+}  // namespace vr
+
+namespace vr_shell {
+
+class MailboxToSurfaceBridge;
 class GlBrowserInterface;
 class VrController;
 class VrShell;
@@ -68,14 +71,14 @@
 // This class manages all GLThread owned objects and GL rendering for VrShell.
 // It is not threadsafe and must only be used on the GL thread.
 class VrShellGl : public device::mojom::VRPresentationProvider,
-                  public UiInputManagerDelegate {
+                  public vr::UiInputManagerDelegate {
  public:
   VrShellGl(GlBrowserInterface* browser,
             gvr_context* gvr_api,
             bool initially_web_vr,
             bool reprojected_rendering,
             bool daydream_support,
-            UiScene* scene);
+            vr::UiScene* scene);
   ~VrShellGl() override;
 
   void Initialize();
@@ -122,18 +125,18 @@
   void DrawOverlayElements(const gfx::Transform& head_pose);
   void DrawHeadLockedElements();
   void DrawUiView(const gfx::Transform& head_pose,
-                  const std::vector<const UiElement*>& elements,
+                  const std::vector<const vr::UiElement*>& elements,
                   const gfx::Size& render_size,
                   int viewport_offset,
                   bool draw_cursor);
   void DrawElements(const gfx::Transform& view_proj_matrix,
-                    const std::vector<const UiElement*>& elements,
+                    const std::vector<const vr::UiElement*>& elements,
                     bool draw_cursor);
   void DrawElement(const gfx::Transform& view_proj_matrix,
-                   const UiElement& element);
-  std::vector<const UiElement*> GetElementsInDrawOrder(
+                   const vr::UiElement& element);
+  std::vector<const vr::UiElement*> GetElementsInDrawOrder(
       const gfx::Transform& view_matrix,
-      const std::vector<const UiElement*>& elements);
+      const std::vector<const vr::UiElement*>& elements);
   void DrawReticle(const gfx::Transform& view_proj_matrix);
   void DrawLaser(const gfx::Transform& view_proj_matrix);
   void DrawController(const gfx::Transform& view_proj_matrix);
@@ -149,7 +152,7 @@
   void UpdateGesture(const gfx::PointF& normalized_content_hit_point,
                      blink::WebGestureEvent& gesture);
 
-  // UiInputManagerDelegate.
+  // vr::UiInputManagerDelegate.
   void OnContentEnter(const gfx::PointF& normalized_hit_point) override;
   void OnContentLeave() override;
   void OnContentMove(const gfx::PointF& normalized_hit_point) override;
@@ -233,7 +236,7 @@
   gfx::Quaternion controller_quat_;
 
   gfx::Point3F target_point_;
-  UiElement* reticle_render_target_ = nullptr;
+  vr::UiElement* reticle_render_target_ = nullptr;
 
   int content_tex_css_width_ = 0;
   int content_tex_css_height_ = 0;
@@ -265,7 +268,7 @@
 
   GlBrowserInterface* browser_;
 
-  UiScene* scene_ = nullptr;
+  vr::UiScene* scene_ = nullptr;
 
   uint8_t frame_index_ = 0;
   // Larger than frame_index_ so it can be initialized out-of-band.
@@ -274,14 +277,14 @@
   // Attributes for gesture detection while holding app button.
   gfx::Vector3dF controller_start_direction_;
 
-  std::unique_ptr<FPSMeter> fps_meter_;
+  std::unique_ptr<vr::FPSMeter> fps_meter_;
 
-  std::unique_ptr<SlidingAverage> webvr_js_time_;
-  std::unique_ptr<SlidingAverage> webvr_render_time_;
+  std::unique_ptr<vr::SlidingAverage> webvr_js_time_;
+  std::unique_ptr<vr::SlidingAverage> webvr_render_time_;
 
   gfx::Point3F pointer_start_;
 
-  std::unique_ptr<UiInputManager> input_manager_;
+  std::unique_ptr<vr::UiInputManager> input_manager_;
 
   base::WeakPtrFactory<VrShellGl> weak_ptr_factory_;
 
diff --git a/chrome/browser/android/vr_shell/vr_shell_renderer.cc b/chrome/browser/android/vr_shell/vr_shell_renderer.cc
index 64fec5c..a2242aaa 100644
--- a/chrome/browser/android/vr_shell/vr_shell_renderer.cc
+++ b/chrome/browser/android/vr_shell/vr_shell_renderer.cc
@@ -376,7 +376,7 @@
           uniform vec4 u_EdgeColor;
           uniform vec4 u_GridColor;
           uniform mediump float u_Opacity;
-          uniform int u_LinesCount;
+          uniform float u_LinesCount;
 
           void main() {
             float edgeColorWeight = clamp(length(v_GridPosition), 0.0, 1.0);
@@ -384,7 +384,7 @@
             vec4 bg_color = u_CenterColor * centerColorWeight +
                 u_EdgeColor * edgeColorWeight;
             bg_color = vec4(bg_color.xyz * bg_color.w, bg_color.w);
-            float linesCountF = float(u_LinesCount) / 2.0;
+            float linesCountF = u_LinesCount * 0.5;
             float pos_x = abs(v_GridPosition.x) * linesCountF;
             float pos_y = abs(v_GridPosition.y) * linesCountF;
             float diff_x = abs(pos_x - floor(pos_x + 0.5));
@@ -854,14 +854,14 @@
                  GL_RGBA, GL_UNSIGNED_BYTE, pixmap.addr());
   }
 
-  const gltf::Accessor* accessor = model->PositionAccessor();
-  position_components_ = gltf::GetTypeComponents(accessor->type);
+  const vr::gltf::Accessor* accessor = model->PositionAccessor();
+  position_components_ = vr::gltf::GetTypeComponents(accessor->type);
   position_type_ = accessor->component_type;
   position_stride_ = accessor->byte_stride;
   position_offset_ = VOID_OFFSET(accessor->byte_offset);
 
   accessor = model->TextureCoordinateAccessor();
-  tex_coord_components_ = gltf::GetTypeComponents(accessor->type);
+  tex_coord_components_ = vr::gltf::GetTypeComponents(accessor->type);
   tex_coord_type_ = accessor->component_type;
   tex_coord_stride_ = accessor->byte_stride;
   tex_coord_offset_ = VOID_OFFSET(accessor->byte_offset);
@@ -964,7 +964,7 @@
 
   // Tell shader the grid size so that it can calculate the fading.
   glUniform1f(scene_radius_handle_, kHalfSize);
-  glUniform1i(lines_count_handle_, gridline_count);
+  glUniform1f(lines_count_handle_, static_cast<float>(gridline_count));
 
   // Set the edge color to the fog color so that it seems to fade out.
   SetColorUniform(edge_color_handle_, edge_color);
diff --git a/chrome/browser/android/vr_shell/vr_shell_renderer.h b/chrome/browser/android/vr_shell/vr_shell_renderer.h
index 305a6590..657fd4eb9 100644
--- a/chrome/browser/android/vr_shell/vr_shell_renderer.h
+++ b/chrome/browser/android/vr_shell/vr_shell_renderer.h
@@ -10,8 +10,8 @@
 #include <vector>
 
 #include "base/macros.h"
-#include "chrome/browser/android/vr_shell/ui_element_renderer.h"
 #include "chrome/browser/android/vr_shell/vr_controller_model.h"
+#include "chrome/browser/vr/ui_element_renderer.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/geometry/size_f.h"
 #include "ui/gfx/transform.h"
@@ -287,12 +287,12 @@
   DISALLOW_COPY_AND_ASSIGN(GradientGridRenderer);
 };
 
-class VrShellRenderer : public UiElementRenderer {
+class VrShellRenderer : public vr::UiElementRenderer {
  public:
   VrShellRenderer();
   ~VrShellRenderer() override;
 
-  // UiElementRenderer interface (exposed to UI elements).
+  // vr::UiElementRenderer interface (exposed to UI elements).
   void DrawTexturedQuad(int texture_data_handle,
                         const gfx::Transform& view_proj_matrix,
                         const gfx::RectF& copy_rect,
diff --git a/chrome/browser/android/vr_shell/vr_web_contents_observer.cc b/chrome/browser/android/vr_shell/vr_web_contents_observer.cc
index aec6c6f..56e9846 100644
--- a/chrome/browser/android/vr_shell/vr_web_contents_observer.cc
+++ b/chrome/browser/android/vr_shell/vr_web_contents_observer.cc
@@ -4,9 +4,9 @@
 
 #include "chrome/browser/android/vr_shell/vr_web_contents_observer.h"
 
-#include "chrome/browser/android/vr_shell/toolbar_helper.h"
-#include "chrome/browser/android/vr_shell/ui_interface.h"
 #include "chrome/browser/android/vr_shell/vr_shell.h"
+#include "chrome/browser/vr/toolbar_helper.h"
+#include "chrome/browser/vr/ui_interface.h"
 #include "content/public/browser/render_view_host.h"
 #include "content/public/browser/render_widget_host.h"
 #include "content/public/browser/render_widget_host_view.h"
@@ -15,8 +15,8 @@
 
 VrWebContentsObserver::VrWebContentsObserver(content::WebContents* web_contents,
                                              VrShell* vr_shell,
-                                             UiInterface* ui_interface,
-                                             ToolbarHelper* toolbar)
+                                             vr::UiInterface* ui_interface,
+                                             vr::ToolbarHelper* toolbar)
     : WebContentsObserver(web_contents),
       vr_shell_(vr_shell),
       ui_interface_(ui_interface),
@@ -26,7 +26,7 @@
 
 VrWebContentsObserver::~VrWebContentsObserver() {}
 
-void VrWebContentsObserver::SetUiInterface(UiInterface* ui_interface) {
+void VrWebContentsObserver::SetUiInterface(vr::UiInterface* ui_interface) {
   ui_interface_ = ui_interface;
 }
 
diff --git a/chrome/browser/android/vr_shell/vr_web_contents_observer.h b/chrome/browser/android/vr_shell/vr_web_contents_observer.h
index ac10b059..f6624c9 100644
--- a/chrome/browser/android/vr_shell/vr_web_contents_observer.h
+++ b/chrome/browser/android/vr_shell/vr_web_contents_observer.h
@@ -10,24 +10,27 @@
 
 namespace content {
 class NavigationHandle;
-}
+}  // namespace content
+
+namespace vr {
+class ToolbarHelper;
+class UiInterface;
+}  // namespace vr
 
 namespace vr_shell {
 
-class UiInterface;
 class VrShell;
-class ToolbarHelper;
 
 class CONTENT_EXPORT VrWebContentsObserver
     : public content::WebContentsObserver {
  public:
   VrWebContentsObserver(content::WebContents* web_contents,
                         VrShell* vr_shell,
-                        UiInterface* ui_interface,
-                        ToolbarHelper* toolbar);
+                        vr::UiInterface* ui_interface,
+                        vr::ToolbarHelper* toolbar);
   ~VrWebContentsObserver() override;
 
-  void SetUiInterface(UiInterface* ui_interface);
+  void SetUiInterface(vr::UiInterface* ui_interface);
 
  private:
   // WebContentsObserver implementation.
@@ -51,8 +54,8 @@
 
   // This class does not own these pointers.
   VrShell* vr_shell_;
-  UiInterface* ui_interface_;
-  ToolbarHelper* toolbar_;
+  vr::UiInterface* ui_interface_;
+  vr::ToolbarHelper* toolbar_;
 
   DISALLOW_COPY_AND_ASSIGN(VrWebContentsObserver);
 };
diff --git a/chrome/browser/chrome_browser_main_android.cc b/chrome/browser/chrome_browser_main_android.cc
index 7c71f4f..27f240e 100644
--- a/chrome/browser/chrome_browser_main_android.cc
+++ b/chrome/browser/chrome_browser_main_android.cc
@@ -80,6 +80,10 @@
             crash_dump_dir, kAndroidMinidumpDescriptor));
   }
 
+  // Auto-detect based on en-US whether secondary locale .pak files exist.
+  ui::SetLoadSecondaryLocalePaks(
+      !ui::GetPathForAndroidLocalePakWithinApk("en-US").empty());
+
   return ChromeBrowserMainParts::PreCreateThreads();
 }
 
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 528d989..17f899b 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -2800,6 +2800,12 @@
   fd = ui::GetLocalePackFd(&region);
   mappings->ShareWithRegion(kAndroidLocalePakDescriptor, fd, region);
 
+  // Optional secondary locale .pak file.
+  fd = ui::GetSecondaryLocalePackFd(&region);
+  if (fd != -1) {
+    mappings->ShareWithRegion(kAndroidSecondaryLocalePakDescriptor, fd, region);
+  }
+
   breakpad::CrashDumpObserver::GetInstance()->BrowserChildProcessStarted(
       child_process_id, mappings);
 
diff --git a/chrome/browser/crash_upload_list/crash_upload_list.cc b/chrome/browser/crash_upload_list/crash_upload_list.cc
index 6f0eeec..c6345fb 100644
--- a/chrome/browser/crash_upload_list/crash_upload_list.cc
+++ b/chrome/browser/crash_upload_list/crash_upload_list.cc
@@ -4,37 +4,34 @@
 
 #include "chrome/browser/crash_upload_list/crash_upload_list.h"
 
-#include "base/files/file_path.h"
-#include "base/path_service.h"
-#include "base/threading/sequenced_worker_pool.h"
 #include "build/build_config.h"
-#include "chrome/common/chrome_paths.h"
-#include "content/public/browser/browser_thread.h"
 
 #if defined(OS_MACOSX) || defined(OS_WIN)
 #include "chrome/browser/crash_upload_list/crash_upload_list_crashpad.h"
+#else
+#include "base/files/file_path.h"
+#include "base/path_service.h"
+#include "chrome/common/chrome_paths.h"
+#include "components/upload_list/crash_upload_list.h"
+#include "components/upload_list/text_log_upload_list.h"
 #endif
 
 #if defined(OS_ANDROID)
 #include "chrome/browser/crash_upload_list/crash_upload_list_android.h"
 #endif
 
-scoped_refptr<CrashUploadList> CreateCrashUploadList(
-    UploadList::Delegate* delegate) {
+scoped_refptr<UploadList> CreateCrashUploadList() {
 #if defined(OS_MACOSX) || defined(OS_WIN)
-  return new CrashUploadListCrashpad(delegate,
-                                     content::BrowserThread::GetBlockingPool());
+  return new CrashUploadListCrashpad();
 #else
   base::FilePath crash_dir_path;
   PathService::Get(chrome::DIR_CRASH_DUMPS, &crash_dir_path);
   base::FilePath upload_log_path =
       crash_dir_path.AppendASCII(CrashUploadList::kReporterLogFilename);
 #if defined(OS_ANDROID)
-  return new CrashUploadListAndroid(delegate, upload_log_path,
-                                    content::BrowserThread::GetBlockingPool());
+  return new CrashUploadListAndroid(upload_log_path);
 #else
-  return new CrashUploadList(delegate, upload_log_path,
-                             content::BrowserThread::GetBlockingPool());
+  return new TextLogUploadList(upload_log_path);
 #endif  // defined(OS_ANDROID)
 #endif  // defined(OS_MACOSX) || defined(OS_WIN)
 }
diff --git a/chrome/browser/crash_upload_list/crash_upload_list.h b/chrome/browser/crash_upload_list/crash_upload_list.h
index 340ac3c..62debae 100644
--- a/chrome/browser/crash_upload_list/crash_upload_list.h
+++ b/chrome/browser/crash_upload_list/crash_upload_list.h
@@ -6,11 +6,10 @@
 #define CHROME_BROWSER_CRASH_UPLOAD_LIST_CRASH_UPLOAD_LIST_H_
 
 #include "base/memory/ref_counted.h"
-#include "components/upload_list/crash_upload_list.h"
+#include "components/upload_list/upload_list.h"
 
 // Factory that creates the platform-specific implementation of the crash
-// upload list with the given callback delegate.
-scoped_refptr<CrashUploadList> CreateCrashUploadList(
-    UploadList::Delegate* delegate);
+// report upload list.
+scoped_refptr<UploadList> CreateCrashUploadList();
 
 #endif  // CHROME_BROWSER_CRASH_UPLOAD_LIST_CRASH_UPLOAD_LIST_H_
diff --git a/chrome/browser/crash_upload_list/crash_upload_list_android.cc b/chrome/browser/crash_upload_list/crash_upload_list_android.cc
index 18ace2d..651fb61 100644
--- a/chrome/browser/crash_upload_list/crash_upload_list_android.cc
+++ b/chrome/browser/crash_upload_list/crash_upload_list_android.cc
@@ -11,28 +11,24 @@
 #include "base/files/file.h"
 #include "base/files/file_enumerator.h"
 #include "base/files/file_util.h"
-#include "base/task_runner.h"
 #include "jni/MinidumpUploadService_jni.h"
 #include "ui/base/text/bytes_formatting.h"
 
 CrashUploadListAndroid::CrashUploadListAndroid(
-    Delegate* delegate,
-    const base::FilePath& upload_log_path,
-    scoped_refptr<base::TaskRunner> task_runner)
-    : CrashUploadList(delegate, upload_log_path, std::move(task_runner)) {}
+    const base::FilePath& upload_log_path)
+    : TextLogUploadList(upload_log_path) {}
 
 CrashUploadListAndroid::~CrashUploadListAndroid() {}
 
-void CrashUploadListAndroid::LoadUploadList(
-    std::vector<UploadList::UploadInfo>* uploads) {
-  // This will load the list of successfully uploaded logs.
-  CrashUploadList::LoadUploadList(uploads);
-
-  LoadUnsuccessfulUploadList(uploads);
+std::vector<UploadList::UploadInfo> CrashUploadListAndroid::LoadUploadList() {
+  // First load the list of successfully uploaded logs.
+  std::vector<UploadInfo> uploads = TextLogUploadList::LoadUploadList();
+  // Then load the unsuccessful uploads.
+  LoadUnsuccessfulUploadList(&uploads);
+  return uploads;
 }
 
-void CrashUploadListAndroid::RequestSingleCrashUpload(
-    const std::string& local_id) {
+void CrashUploadListAndroid::RequestSingleUpload(const std::string& local_id) {
   JNIEnv* env = base::android::AttachCurrentThread();
   base::android::ScopedJavaLocalRef<jstring> j_local_id =
       base::android::ConvertUTF8ToJavaString(env, local_id);
diff --git a/chrome/browser/crash_upload_list/crash_upload_list_android.h b/chrome/browser/crash_upload_list/crash_upload_list_android.h
index adc75f2b..c7b0cebf 100644
--- a/chrome/browser/crash_upload_list/crash_upload_list_android.h
+++ b/chrome/browser/crash_upload_list/crash_upload_list_android.h
@@ -6,27 +6,24 @@
 #define CHROME_BROWSER_CRASH_UPLOAD_LIST_CRASH_UPLOAD_LIST_ANDROID_H_
 
 #include "base/macros.h"
-#include "components/upload_list/crash_upload_list.h"
+#include "components/upload_list/text_log_upload_list.h"
 
 namespace base {
 class FilePath;
-class TaskRunner;
 }
 
-// A CrashUploadList that retrieves the list of uploaded reports from the
-// Android crash reporter.
-class CrashUploadListAndroid : public CrashUploadList {
+// An UploadList that retrieves the list of crash reports available on the
+// client. This uses both the Breakpad text log format, as well as inspecting
+// the un-uploaded Minidump directory, managed by the MinidumpUploadService.
+class CrashUploadListAndroid : public TextLogUploadList {
  public:
-  CrashUploadListAndroid(Delegate* delegate,
-                         const base::FilePath& upload_log_path,
-                         scoped_refptr<base::TaskRunner> task_runner);
+  CrashUploadListAndroid(const base::FilePath& upload_log_path);
 
  protected:
   ~CrashUploadListAndroid() override;
 
-  // Called on a blocking pool thread.
-  void LoadUploadList(std::vector<UploadInfo>* uploads) override;
-  void RequestSingleCrashUpload(const std::string& local_id) override;
+  std::vector<UploadInfo> LoadUploadList() override;
+  void RequestSingleUpload(const std::string& local_id) override;
 
  private:
   void LoadUnsuccessfulUploadList(std::vector<UploadInfo>* uploads);
diff --git a/chrome/browser/crash_upload_list/crash_upload_list_crashpad.cc b/chrome/browser/crash_upload_list/crash_upload_list_crashpad.cc
index 49a0e0b33..017d9e1 100644
--- a/chrome/browser/crash_upload_list/crash_upload_list_crashpad.cc
+++ b/chrome/browser/crash_upload_list/crash_upload_list_crashpad.cc
@@ -8,7 +8,6 @@
 
 #include <utility>
 
-#include "base/task_runner.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "chrome/common/chrome_constants.h"
@@ -80,15 +79,16 @@
 
 }  // namespace
 
-CrashUploadListCrashpad::CrashUploadListCrashpad(
-    Delegate* delegate,
-    scoped_refptr<base::TaskRunner> task_runner)
-    : CrashUploadList(delegate, base::FilePath(), std::move(task_runner)) {}
+CrashUploadListCrashpad::CrashUploadListCrashpad() = default;
 
-CrashUploadListCrashpad::~CrashUploadListCrashpad() {}
+CrashUploadListCrashpad::~CrashUploadListCrashpad() = default;
 
-void CrashUploadListCrashpad::LoadUploadList(
-    std::vector<UploadList::UploadInfo>* uploads) {
+base::TaskTraits CrashUploadListCrashpad::LoadingTaskTraits() {
+  return {base::MayBlock(), base::TaskPriority::BACKGROUND,
+          base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN};
+}
+
+std::vector<UploadList::UploadInfo> CrashUploadListCrashpad::LoadUploadList() {
   std::vector<crash_reporter::Report> reports;
 #if defined(OS_WIN)
   // On Windows, we only link crash client into chrome.exe (not the dlls), and
@@ -100,16 +100,17 @@
   crash_reporter::GetReports(&reports);
 #endif
 
+  std::vector<UploadInfo> uploads;
   for (const crash_reporter::Report& report : reports) {
-    uploads->push_back(
+    uploads.push_back(
         UploadInfo(report.remote_id, base::Time::FromTimeT(report.upload_time),
                    report.local_id, base::Time::FromTimeT(report.capture_time),
                    ReportUploadStateToUploadInfoState(report.state)));
   }
+  return uploads;
 }
 
-void CrashUploadListCrashpad::RequestSingleCrashUpload(
-    const std::string& local_id) {
+void CrashUploadListCrashpad::RequestSingleUpload(const std::string& local_id) {
 #if defined(OS_WIN)
   // On Windows, crash reporting is handled by chrome_elf.dll, that's why we
   // can't call crash_reporter::RequestSingleCrashUpload directly.
diff --git a/chrome/browser/crash_upload_list/crash_upload_list_crashpad.h b/chrome/browser/crash_upload_list/crash_upload_list_crashpad.h
index 35eb567..8fa05ca 100644
--- a/chrome/browser/crash_upload_list/crash_upload_list_crashpad.h
+++ b/chrome/browser/crash_upload_list/crash_upload_list_crashpad.h
@@ -6,26 +6,20 @@
 #define CHROME_BROWSER_CRASH_UPLOAD_LIST_CRASH_UPLOAD_LIST_CRASHPAD_H_
 
 #include "base/macros.h"
-#include "components/upload_list/crash_upload_list.h"
+#include "components/upload_list/upload_list.h"
 
-namespace base {
-class TaskRunner;
-}
-
-// A CrashUploadList that retrieves the list of uploaded reports from the
+// An UploadList that retrieves the list of crash reports from the
 // Crashpad database.
-class CrashUploadListCrashpad : public CrashUploadList {
+class CrashUploadListCrashpad : public UploadList {
  public:
-  CrashUploadListCrashpad(Delegate* delegate,
-                          scoped_refptr<base::TaskRunner> task_runner);
+  CrashUploadListCrashpad();
 
  protected:
   ~CrashUploadListCrashpad() override;
 
-  // Called on a blocking pool thread.
-  void LoadUploadList(std::vector<UploadInfo>* uploads) override;
-
-  void RequestSingleCrashUpload(const std::string& local_id) override;
+  base::TaskTraits LoadingTaskTraits() override;
+  std::vector<UploadInfo> LoadUploadList() override;
+  void RequestSingleUpload(const std::string& local_id) override;
 
   DISALLOW_COPY_AND_ASSIGN(CrashUploadListCrashpad);
 };
diff --git a/chrome/browser/feedback/system_logs/log_sources/crash_ids_source.cc b/chrome/browser/feedback/system_logs/log_sources/crash_ids_source.cc
index cad5edd8..747a442 100644
--- a/chrome/browser/feedback/system_logs/log_sources/crash_ids_source.cc
+++ b/chrome/browser/feedback/system_logs/log_sources/crash_ids_source.cc
@@ -28,7 +28,7 @@
 
 CrashIdsSource::CrashIdsSource()
     : SystemLogsSource("CrashId"),
-      crash_upload_list_(CreateCrashUploadList(this)),
+      crash_upload_list_(CreateCrashUploadList()),
       pending_crash_list_loading_(false) {}
 
 CrashIdsSource::~CrashIdsSource() {}
@@ -42,7 +42,8 @@
     return;
 
   pending_crash_list_loading_ = true;
-  crash_upload_list_->LoadUploadListAsynchronously();
+  crash_upload_list_->Load(base::BindOnce(
+      &CrashIdsSource::OnUploadListAvailable, base::Unretained(this)));
 }
 
 void CrashIdsSource::OnUploadListAvailable() {
diff --git a/chrome/browser/feedback/system_logs/log_sources/crash_ids_source.h b/chrome/browser/feedback/system_logs/log_sources/crash_ids_source.h
index 60839cd..6339c5fb 100644
--- a/chrome/browser/feedback/system_logs/log_sources/crash_ids_source.h
+++ b/chrome/browser/feedback/system_logs/log_sources/crash_ids_source.h
@@ -9,13 +9,12 @@
 
 #include "base/callback_forward.h"
 #include "chrome/browser/feedback/system_logs/system_logs_source.h"
-#include "components/upload_list/crash_upload_list.h"
 #include "components/upload_list/upload_list.h"
 
 namespace system_logs {
 
 // Extract the most recent crash IDs (if any) and adds them to the system logs.
-class CrashIdsSource : public SystemLogsSource, public UploadList::Delegate {
+class CrashIdsSource : public SystemLogsSource {
  public:
   CrashIdsSource();
   ~CrashIdsSource() override;
@@ -23,13 +22,11 @@
   // SystemLogsSource:
   void Fetch(const SysLogsSourceCallback& callback) override;
 
-  // UploadList::Delegate:
-  void OnUploadListAvailable() override;
-
  private:
+  void OnUploadListAvailable();
   void RespondWithCrashIds(const SysLogsSourceCallback& callback) const;
 
-  scoped_refptr<CrashUploadList> crash_upload_list_;
+  scoped_refptr<UploadList> crash_upload_list_;
 
   // A comma-separated list of crash IDs as expected by the server.
   std::string crash_ids_list_;
diff --git a/chrome/browser/media/webrtc/webrtc_log_list.cc b/chrome/browser/media/webrtc/webrtc_log_list.cc
index 4187086..4663966 100644
--- a/chrome/browser/media/webrtc/webrtc_log_list.cc
+++ b/chrome/browser/media/webrtc/webrtc_log_list.cc
@@ -5,26 +5,24 @@
 #include "chrome/browser/media/webrtc/webrtc_log_list.h"
 
 #include "base/files/file.h"
-#include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/task_scheduler/post_task.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/chrome_paths.h"
+#include "components/upload_list/text_log_upload_list.h"
 
 namespace {
 
 const char kWebRtcLogDirectory[] = "WebRTC Logs";
 const char kWebRtcLogListFilename[] = "Log List";
 
-}
+}  // namespace
 
 // static
-UploadList* WebRtcLogList::CreateWebRtcLogList(UploadList::Delegate* delegate,
-                                               Profile* profile) {
+UploadList* WebRtcLogList::CreateWebRtcLogList(Profile* profile) {
   base::FilePath log_list_path = GetWebRtcLogListFileForDirectory(
       GetWebRtcLogDirectoryForProfile(profile->GetPath()));
-  return new UploadList(delegate, log_list_path,
-                        base::CreateTaskRunnerWithTraits({base::MayBlock()}));
+  return new TextLogUploadList(log_list_path);
 }
 
 // static
diff --git a/chrome/browser/media/webrtc/webrtc_log_list.h b/chrome/browser/media/webrtc/webrtc_log_list.h
index c5c56a5..07d5cf12 100644
--- a/chrome/browser/media/webrtc/webrtc_log_list.h
+++ b/chrome/browser/media/webrtc/webrtc_log_list.h
@@ -5,17 +5,17 @@
 #ifndef CHROME_BROWSER_MEDIA_WEBRTC_WEBRTC_LOG_LIST_H_
 #define CHROME_BROWSER_MEDIA_WEBRTC_WEBRTC_LOG_LIST_H_
 
-#include "components/upload_list/upload_list.h"
+#include "base/files/file_path.h"
 
 class Profile;
+class UploadList;
 
 class WebRtcLogList {
  public:
   // Creates the upload list with the given callback delegate for a
   // profile. The upload list loads and parses a text file list of WebRTC
   // logs stored locally and/or uploaded.
-  static UploadList* CreateWebRtcLogList(UploadList::Delegate* delegate,
-                                         Profile* profile);
+  static UploadList* CreateWebRtcLogList(Profile* profile);
 
   // Get the file path for the log directory for a profile.
   static base::FilePath GetWebRtcLogDirectoryForProfile(
diff --git a/chrome/browser/ntp_tiles/ntp_tiles_browsertest.cc b/chrome/browser/ntp_tiles/ntp_tiles_browsertest.cc
index 2d385ad..4e49c10 100644
--- a/chrome/browser/ntp_tiles/ntp_tiles_browsertest.cc
+++ b/chrome/browser/ntp_tiles/ntp_tiles_browsertest.cc
@@ -19,6 +19,7 @@
 namespace {
 
 using testing::Contains;
+using testing::Not;
 
 std::string PrintTile(const std::string& title,
                       const std::string& url,
@@ -102,4 +103,28 @@
                                           TileSource::TOP_SITES)));
 }
 
+// Tests that after navigating to a URL with a server redirect, ntp tiles will
+// include the correct URL.
+IN_PROC_BROWSER_TEST_F(NTPTilesTest, ServerRedirect) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  GURL final_url = embedded_test_server()->GetURL("/defaultresponse");
+  GURL first_url =
+      embedded_test_server()->GetURL("/server-redirect?" + final_url.spec());
+
+  ui_test_utils::NavigateToURLWithDisposition(
+      browser(), first_url, WindowOpenDisposition::CURRENT_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+  MostVisitedSitesWaiter waiter;
+  most_visited_sites_->SetMostVisitedURLsObserver(&waiter, /*num_sites=*/8);
+
+  NTPTilesVector tiles = waiter.WaitForTiles();
+
+  // TopSites uses the start of the redirect chain, so verify the first URL
+  // is listed, but not the final URL.
+  EXPECT_THAT(tiles, Contains(MatchesTile("", first_url.spec().c_str(),
+                                          TileSource::TOP_SITES)));
+  EXPECT_THAT(tiles, Not(Contains(MatchesTile("", final_url.spec().c_str(),
+                                              TileSource::TOP_SITES))));
+}
+
 }  // namespace ntp_tiles
diff --git a/chrome/browser/password_manager/password_store_factory.cc b/chrome/browser/password_manager/password_store_factory.cc
index 28e50f8..4c5297e3 100644
--- a/chrome/browser/password_manager/password_store_factory.cc
+++ b/chrome/browser/password_manager/password_store_factory.cc
@@ -28,6 +28,7 @@
 #include "components/os_crypt/os_crypt_switches.h"
 #include "components/password_manager/core/browser/http_data_cleaner.h"
 #include "components/password_manager/core/browser/login_database.h"
+#include "components/password_manager/core/browser/password_reuse_defines.h"
 #include "components/password_manager/core/browser/password_store.h"
 #include "components/password_manager/core/browser/password_store_default.h"
 #include "components/password_manager/core/browser/password_store_factory_util.h"
@@ -58,8 +59,7 @@
 #include "chrome/browser/password_manager/password_store_x.h"
 #endif
 
-#if defined(OS_WIN) || defined(OS_MACOSX) || \
-    (defined(OS_LINUX) && !defined(OS_CHROMEOS))
+#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
 #include "chrome/browser/password_manager/password_store_signin_notifier_impl.h"
 #endif
 
@@ -115,8 +115,7 @@
           "PasswordStore",
           BrowserContextDependencyManager::GetInstance()) {
   DependsOn(WebDataServiceFactory::GetInstance());
-#if defined(OS_WIN) || defined(OS_MACOSX) || \
-    (defined(OS_LINUX) && !defined(OS_CHROMEOS))
+#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
   // TODO(crbug.com/715987). Remove when PasswordReuseDetector is decoupled
   // from PasswordStore.
   DependsOn(SigninManagerFactory::GetInstance());
diff --git a/chrome/browser/profiles/avatar_menu.h b/chrome/browser/profiles/avatar_menu.h
index bb72593..cada138 100644
--- a/chrome/browser/profiles/avatar_menu.h
+++ b/chrome/browser/profiles/avatar_menu.h
@@ -116,7 +116,9 @@
   // an item.
   void EditProfile(size_t index);
 
-  // Rebuilds the menu from the cache.
+  // Rebuilds the menu from the cache. Note: If this is done in response to the
+  // active browser changing, ActiveBrowserChanged() should be called first to
+  // update this object's internal state.
   void RebuildMenu();
 
   // Gets the number of profiles.
@@ -136,8 +138,9 @@
   // string will be returned.
   base::string16 GetSupervisedUserInformation() const;
 
-  // This menu is also used for the always-present Mac system menubar. If the
-  // last active browser changes, the menu will need to reference that browser.
+  // This menu is also used for the always-present Mac and Linux system menubar.
+  // If the last active browser changes, the menu will need to reference that
+  // browser.
   void ActiveBrowserChanged(Browser* browser);
 
   // Returns true if the add profile link should be shown.
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_view.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_view.mm
index 947adde1b..12ac67f 100644
--- a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_view.mm
+++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_view.mm
@@ -7,6 +7,7 @@
 #include "base/metrics/user_metrics.h"
 #include "chrome/browser/profiles/profile.h"
 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.h"
+#import "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_window.h"
 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_folder_target.h"
 #import "chrome/browser/ui/cocoa/browser_window_controller.h"
 #include "components/bookmarks/browser/bookmark_pasteboard_helper_mac.h"
@@ -215,4 +216,9 @@
   }
 }
 
+- (void)drawRect:(NSRect)rect {
+  [[BookmarkBarFolderWindowContentView backgroundColor] set];
+  NSRectFill([self bounds]);
+}
+
 @end
diff --git a/chrome/browser/ui/views/frame/global_menu_bar_x11.cc b/chrome/browser/ui/views/frame/global_menu_bar_x11.cc
index ef4d2f6..af197f3 100644
--- a/chrome/browser/ui/views/frame/global_menu_bar_x11.cc
+++ b/chrome/browser/ui/views/frame/global_menu_bar_x11.cc
@@ -712,9 +712,10 @@
 }
 
 void GlobalMenuBarX11::OnBrowserSetLastActive(Browser* browser) {
-  // Rebuild the avatar menu so that the items have the correct active state.
-  avatar_menu_->RebuildMenu();
+  // Notify the avatar menu of the change and rebuild the menu. Note: The
+  // ActiveBrowserChanged() call needs to happen first to update the state.
   avatar_menu_->ActiveBrowserChanged(browser);
+  avatar_menu_->RebuildMenu();
   RebuildProfilesMenu();
 }
 
diff --git a/chrome/browser/ui/webui/crashes_ui.cc b/chrome/browser/ui/webui/crashes_ui.cc
index 730f03d6..684c4aa 100644
--- a/chrome/browser/ui/webui/crashes_ui.cc
+++ b/chrome/browser/ui/webui/crashes_ui.cc
@@ -66,8 +66,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 // The handler for Javascript messages for the chrome://crashes/ page.
-class CrashesDOMHandler : public WebUIMessageHandler,
-                          public CrashUploadList::Delegate {
+class CrashesDOMHandler : public WebUIMessageHandler {
  public:
   CrashesDOMHandler();
   ~CrashesDOMHandler() override;
@@ -75,10 +74,9 @@
   // WebUIMessageHandler implementation.
   void RegisterMessages() override;
 
-  // CrashUploadList::Delegate implemenation.
-  void OnUploadListAvailable() override;
-
  private:
+  void OnUploadListAvailable();
+
   // Asynchronously fetches the list of crashes. Called from JS.
   void HandleRequestCrashes(const base::ListValue* args);
 
@@ -93,7 +91,7 @@
   // Asynchronously requests a user triggered upload. Called from JS.
   void HandleRequestSingleCrashUpload(const base::ListValue* args);
 
-  scoped_refptr<CrashUploadList> upload_list_;
+  scoped_refptr<UploadList> upload_list_;
   bool list_available_;
   bool first_load_;
 
@@ -102,15 +100,16 @@
 
 CrashesDOMHandler::CrashesDOMHandler()
     : list_available_(false), first_load_(true) {
-  upload_list_ = CreateCrashUploadList(this);
+  upload_list_ = CreateCrashUploadList();
 }
 
 CrashesDOMHandler::~CrashesDOMHandler() {
-  upload_list_->ClearDelegate();
+  upload_list_->CancelCallback();
 }
 
 void CrashesDOMHandler::RegisterMessages() {
-  upload_list_->LoadUploadListAsynchronously();
+  upload_list_->Load(base::BindOnce(&CrashesDOMHandler::OnUploadListAvailable,
+                                    base::Unretained(this)));
   web_ui()->RegisterMessageCallback(
       crash::kCrashesUIRequestCrashList,
       base::Bind(&CrashesDOMHandler::HandleRequestCrashes,
@@ -136,7 +135,8 @@
       UpdateUI();
   } else {
     list_available_ = false;
-    upload_list_->LoadUploadListAsynchronously();
+    upload_list_->Load(base::BindOnce(&CrashesDOMHandler::OnUploadListAvailable,
+                                      base::Unretained(this)));
   }
 }
 
@@ -215,7 +215,7 @@
       IsMetricsReportingPolicyManaged()) {
     return;
   }
-  upload_list_->RequestSingleCrashUploadAsync(local_id);
+  upload_list_->RequestSingleUploadAsync(local_id);
 }
 
 }  // namespace
diff --git a/chrome/browser/ui/webui/flash_ui.cc b/chrome/browser/ui/webui/flash_ui.cc
index 451ca50..19b2ec96 100644
--- a/chrome/browser/ui/webui/flash_ui.cc
+++ b/chrome/browser/ui/webui/flash_ui.cc
@@ -87,7 +87,6 @@
 
 // The handler for JavaScript messages for the about:flags page.
 class FlashDOMHandler : public WebUIMessageHandler,
-                        public CrashUploadList::Delegate,
                         public content::GpuDataManagerObserver {
  public:
   FlashDOMHandler();
@@ -96,9 +95,6 @@
   // WebUIMessageHandler implementation.
   void RegisterMessages() override;
 
-  // CrashUploadList::Delegate implementation.
-  void OnUploadListAvailable() override;
-
   // GpuDataManager::Observer implementation.
   void OnGpuInfoUpdate() override;
 
@@ -109,6 +105,9 @@
   void OnGotPlugins(const std::vector<content::WebPluginInfo>& plugins);
 
  private:
+  // UploadList callback.
+  void OnUploadListAvailable();
+
   // Called when we think we might have enough information to return data back
   // to the page.
   void MaybeRespondToPage();
@@ -124,7 +123,7 @@
   base::OneShotTimer timeout_;
 
   // Crash list.
-  scoped_refptr<CrashUploadList> upload_list_;
+  scoped_refptr<UploadList> upload_list_;
 
   // Whether the list of all crashes is available.
   bool crash_list_available_;
@@ -146,9 +145,10 @@
       has_gpu_info_(false),
       has_plugin_info_(false),
       weak_ptr_factory_(this) {
-        // Request Crash data asynchronously.
-  upload_list_ = CreateCrashUploadList(this);
-  upload_list_->LoadUploadListAsynchronously();
+  // Request Crash data asynchronously.
+  upload_list_ = CreateCrashUploadList();
+  upload_list_->Load(base::BindOnce(&FlashDOMHandler::OnUploadListAvailable,
+                                    weak_ptr_factory_.GetWeakPtr()));
 
   // Watch for changes in GPUInfo.
   GpuDataManager::GetInstance()->AddObserver(this);
@@ -157,23 +157,23 @@
   // GPU process has not run yet, this will trigger its launch.
   GpuDataManager::GetInstance()->RequestCompleteGpuInfoIfNeeded();
 
-  // GPU access might not be allowed at all, which will cause us not to get a
-  // call back.
+  // GPU access might not be allowed at all, which will cause us not to
+  // get a call back.
   if (!GpuDataManager::GetInstance()->GpuAccessAllowed(NULL))
     OnGpuInfoUpdate();
 
   PluginService::GetInstance()->GetPlugins(base::Bind(
       &FlashDOMHandler::OnGotPlugins, weak_ptr_factory_.GetWeakPtr()));
 
-  // And lastly, we fire off a timer to make sure we never get stuck at the
-  // "Loading..." message.
+  // And lastly, we fire off a timer to make sure we never get stuck at
+  // the "Loading..." message.
   timeout_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(kTimeout),
                  this, &FlashDOMHandler::OnTimeout);
 }
 
 FlashDOMHandler::~FlashDOMHandler() {
   GpuDataManager::GetInstance()->RemoveObserver(this);
-  upload_list_->ClearDelegate();
+  upload_list_->CancelCallback();
 }
 
 void FlashDOMHandler::RegisterMessages() {
@@ -303,10 +303,10 @@
   bool crash_reporting_enabled =
       ChromeMetricsServiceAccessor::IsMetricsAndCrashReportingEnabled();
   if (crash_reporting_enabled) {
-    std::vector<CrashUploadList::UploadInfo> crashes;
+    std::vector<UploadList::UploadInfo> crashes;
     upload_list_->GetUploads(10, &crashes);
 
-    for (std::vector<CrashUploadList::UploadInfo>::iterator i = crashes.begin();
+    for (std::vector<UploadList::UploadInfo>::iterator i = crashes.begin();
          i != crashes.end(); ++i) {
       base::string16 crash_string(ASCIIToUTF16(i->upload_id));
       crash_string += ASCIIToUTF16(" ");
diff --git a/chrome/browser/ui/webui/media/webrtc_logs_ui.cc b/chrome/browser/ui/webui/media/webrtc_logs_ui.cc
index 5a3355f..70e7060 100644
--- a/chrome/browser/ui/webui/media/webrtc_logs_ui.cc
+++ b/chrome/browser/ui/webui/media/webrtc_logs_ui.cc
@@ -76,8 +76,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 // The handler for Javascript messages for the chrome://webrtc-logs/ page.
-class WebRtcLogsDOMHandler : public WebUIMessageHandler,
-                             public UploadList::Delegate {
+class WebRtcLogsDOMHandler : public WebUIMessageHandler {
  public:
   explicit WebRtcLogsDOMHandler(Profile* profile);
   ~WebRtcLogsDOMHandler() override;
@@ -85,10 +84,9 @@
   // WebUIMessageHandler implementation.
   void RegisterMessages() override;
 
-  // UploadList::Delegate implemenation.
-  void OnUploadListAvailable() override;
-
  private:
+  void OnUploadListAvailable();
+
   // Asynchronously fetches the list of upload WebRTC logs. Called from JS.
   void HandleRequestWebRtcLogs(const base::ListValue* args);
 
@@ -116,15 +114,16 @@
           WebRtcLogList::GetWebRtcLogDirectoryForProfile(profile->GetPath())),
       list_available_(false),
       js_request_pending_(false) {
-  upload_list_ = WebRtcLogList::CreateWebRtcLogList(this, profile);
+  upload_list_ = WebRtcLogList::CreateWebRtcLogList(profile);
 }
 
 WebRtcLogsDOMHandler::~WebRtcLogsDOMHandler() {
-  upload_list_->ClearDelegate();
+  upload_list_->CancelCallback();
 }
 
 void WebRtcLogsDOMHandler::RegisterMessages() {
-  upload_list_->LoadUploadListAsynchronously();
+  upload_list_->Load(base::BindOnce(
+      &WebRtcLogsDOMHandler::OnUploadListAvailable, base::Unretained(this)));
 
   web_ui()->RegisterMessageCallback("requestWebRtcLogsList",
       base::Bind(&WebRtcLogsDOMHandler::HandleRequestWebRtcLogs,
diff --git a/chrome/browser/vr/BUILD.gn b/chrome/browser/vr/BUILD.gn
new file mode 100644
index 0000000..4ec50df
--- /dev/null
+++ b/chrome/browser/vr/BUILD.gn
@@ -0,0 +1,156 @@
+# 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("//chrome/common/features.gni")
+import("//device/vr/features/features.gni")
+import("//testing/test.gni")
+
+if (is_android) {
+  import("//build/config/android/rules.gni")
+}
+
+assert(enable_vr)
+
+static_library("vr_common") {
+  sources = [
+    "animation.cc",
+    "animation.h",
+    "color_scheme.cc",
+    "color_scheme.h",
+    "easing.cc",
+    "easing.h",
+    "elements/button.cc",
+    "elements/button.h",
+    "elements/button_texture.cc",
+    "elements/button_texture.h",
+    "elements/close_button_texture.cc",
+    "elements/close_button_texture.h",
+    "elements/exclusive_screen_toast.cc",
+    "elements/exclusive_screen_toast.h",
+    "elements/exclusive_screen_toast_texture.cc",
+    "elements/exclusive_screen_toast_texture.h",
+    "elements/exit_prompt.cc",
+    "elements/exit_prompt.h",
+    "elements/exit_prompt_backplane.cc",
+    "elements/exit_prompt_backplane.h",
+    "elements/exit_prompt_texture.cc",
+    "elements/exit_prompt_texture.h",
+    "elements/exit_warning_texture.cc",
+    "elements/exit_warning_texture.h",
+    "elements/insecure_content_permanent_texture.cc",
+    "elements/insecure_content_permanent_texture.h",
+    "elements/insecure_content_transient_texture.cc",
+    "elements/insecure_content_transient_texture.h",
+    "elements/loading_indicator.cc",
+    "elements/loading_indicator.h",
+    "elements/loading_indicator_texture.cc",
+    "elements/loading_indicator_texture.h",
+    "elements/render_text_wrapper.cc",
+    "elements/render_text_wrapper.h",
+    "elements/screen_dimmer.cc",
+    "elements/screen_dimmer.h",
+    "elements/simple_textured_element.h",
+    "elements/splash_screen_icon.cc",
+    "elements/splash_screen_icon.h",
+    "elements/splash_screen_icon_texture.cc",
+    "elements/splash_screen_icon_texture.h",
+    "elements/system_indicator.cc",
+    "elements/system_indicator.h",
+    "elements/system_indicator_texture.cc",
+    "elements/system_indicator_texture.h",
+    "elements/textured_element.cc",
+    "elements/textured_element.h",
+    "elements/transience_manager.cc",
+    "elements/transience_manager.h",
+    "elements/transient_url_bar.cc",
+    "elements/transient_url_bar.h",
+    "elements/ui_element.cc",
+    "elements/ui_element.h",
+    "elements/ui_element_debug_id.h",
+    "elements/ui_texture.cc",
+    "elements/ui_texture.h",
+    "elements/url_bar.cc",
+    "elements/url_bar.h",
+    "elements/url_bar_texture.cc",
+    "elements/url_bar_texture.h",
+    "font_fallback.cc",
+    "font_fallback.h",
+    "fps_meter.cc",
+    "fps_meter.h",
+    "gltf_asset.cc",
+    "gltf_asset.h",
+    "gltf_parser.cc",
+    "gltf_parser.h",
+    "toolbar_helper.cc",
+    "toolbar_helper.h",
+    "toolbar_state.cc",
+    "toolbar_state.h",
+    "ui_browser_interface.h",
+    "ui_input_manager.cc",
+    "ui_input_manager.h",
+    "ui_interface.h",
+    "ui_scene.cc",
+    "ui_scene.h",
+    "ui_scene_manager.cc",
+    "ui_scene_manager.h",
+    "ui_unsupported_mode.h",
+  ]
+
+  deps = [
+    "//base",
+    "//cc/paint",
+    "//chrome/app:generated_resources",
+    "//components/security_state/core",
+    "//components/strings",
+    "//components/toolbar",
+    "//components/url_formatter",
+    "//components/vector_icons",
+    "//skia",
+    "//ui/base",
+    "//ui/display",
+    "//ui/gl",
+    "//ui/gl/init",
+    "//ui/vector_icons",
+  ]
+}
+
+test("vr_common_unittests") {
+  sources = [
+    "elements/close_button_texture_unittest.cc",
+    "elements/exit_prompt_unittest.cc",
+    "elements/transience_manager_unittest.cc",
+    "elements/ui_element_unittest.cc",
+    "elements/url_bar_texture_unittest.cc",
+    "fps_meter_unittest.cc",
+    "gltf_parser_unittest.cc",
+    "run_all_unittests.cc",
+    "test/paths.cc",
+    "test/paths.h",
+    "ui_scene_manager_unittest.cc",
+    "ui_scene_unittest.cc",
+  ]
+
+  deps = [
+    ":vr_common",
+    "//base/test:test_support",
+    "//components:components_tests_pak",
+    "//components/security_state/core",
+    "//components/toolbar:vector_icons",
+    "//skia",
+    "//testing/gmock",
+    "//testing/gtest",
+    "//ui/gfx:test_support",
+    "//ui/gfx/geometry",
+    "//ui/gl",
+  ]
+
+  if (is_android) {
+    deps += [ "//ui/android:ui_java" ]
+  }
+
+  data = [
+    "test/data/",
+    "$root_out_dir/components_tests_resources.pak",
+  ]
+}
diff --git a/chrome/browser/vr/OWNERS b/chrome/browser/vr/OWNERS
new file mode 100644
index 0000000..f388bb38
--- /dev/null
+++ b/chrome/browser/vr/OWNERS
@@ -0,0 +1,7 @@
+bajones@chromium.org
+bshe@chromium.org
+mthiesse@chromium.org
+cjgrant@chromium.org
+vollick@chromium.org
+
+# COMPONENT: UI>Browser>VR
diff --git a/chrome/browser/vr/PRESUBMIT.py b/chrome/browser/vr/PRESUBMIT.py
new file mode 100644
index 0000000..69da4ae1
--- /dev/null
+++ b/chrome/browser/vr/PRESUBMIT.py
@@ -0,0 +1,41 @@
+# 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.
+
+"""Presubmit script for changes affecting chrome/browser/vr
+
+See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
+for more details about the presubmit API built into depot_tools.
+"""
+
+import re
+
+# chrome/PRESUBMIT.py blocks several linters due to the infeasibility of
+# enforcing them on a large codebase. Here we'll start by enforcing all
+# linters, and add exclusions if necessary.
+#
+# Note that this list must be non-empty, or cpplint will use its default set of
+# filters.
+LINT_FILTERS = [
+  '-build/include',
+]
+
+VERBOSITY_LEVEL = 4
+
+INCLUDE_CPP_FILES_ONLY = (r'.*\.(cc|h)$',)
+
+def _CheckChangeLintsClean(input_api, output_api):
+  sources = lambda x: input_api.FilterSourceFile(
+      x, white_list=INCLUDE_CPP_FILES_ONLY)
+  return input_api.canned_checks.CheckChangeLintsClean(
+      input_api, output_api, sources, LINT_FILTERS, VERBOSITY_LEVEL)
+
+def CheckChangeOnUpload(input_api, output_api):
+  results = []
+  results.extend(_CheckChangeLintsClean(input_api, output_api))
+  return results
+
+def CheckChangeOnCommit(input_api, output_api):
+  results = []
+  results.extend(_CheckChangeLintsClean(input_api, output_api))
+  return results
diff --git a/chrome/browser/android/vr_shell/animation.cc b/chrome/browser/vr/animation.cc
similarity index 81%
rename from chrome/browser/android/vr_shell/animation.cc
rename to chrome/browser/vr/animation.cc
index d193def6..53483a2 100644
--- a/chrome/browser/android/vr_shell/animation.cc
+++ b/chrome/browser/vr/animation.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/animation.h"
+#include "chrome/browser/vr/animation.h"
 
 #include <utility>
 
-#include "chrome/browser/android/vr_shell/easing.h"
+#include "chrome/browser/vr/easing.h"
 
-namespace vr_shell {
+namespace vr {
 
 Animation::Animation(int id,
                      Property property,
@@ -27,4 +27,4 @@
 
 Animation::~Animation() {}
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/animation.h b/chrome/browser/vr/animation.h
similarity index 84%
rename from chrome/browser/android/vr_shell/animation.h
rename to chrome/browser/vr/animation.h
index db062bbc..9ab84b32 100644
--- a/chrome/browser/android/vr_shell/animation.h
+++ b/chrome/browser/vr/animation.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 CHROME_BROWSER_ANDROID_VR_SHELL_ANIMATION_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_ANIMATION_H_
+#ifndef CHROME_BROWSER_VR_ANIMATION_H_
+#define CHROME_BROWSER_VR_ANIMATION_H_
 
 #include <memory>
 #include <vector>
@@ -11,7 +11,7 @@
 #include "base/macros.h"
 #include "base/time/time.h"
 
-namespace vr_shell {
+namespace vr {
 
 namespace easing {
 class Easing;
@@ -51,6 +51,6 @@
   DISALLOW_COPY_AND_ASSIGN(Animation);
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_ANIMATION_H_
+#endif  // CHROME_BROWSER_VR_ANIMATION_H_
diff --git a/chrome/browser/android/vr_shell/color_scheme.cc b/chrome/browser/vr/color_scheme.cc
similarity index 97%
rename from chrome/browser/android/vr_shell/color_scheme.cc
rename to chrome/browser/vr/color_scheme.cc
index c65da25d..c55635f 100644
--- a/chrome/browser/android/vr_shell/color_scheme.cc
+++ b/chrome/browser/vr/color_scheme.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 "chrome/browser/android/vr_shell/color_scheme.h"
+#include "chrome/browser/vr/color_scheme.h"
 
 #include "ui/gfx/color_palette.h"
 
-namespace vr_shell {
+namespace vr {
 
 namespace {
 
@@ -132,4 +132,4 @@
   return kColorSchemes[static_cast<int>(mode)];
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/color_scheme.h b/chrome/browser/vr/color_scheme.h
similarity index 91%
rename from chrome/browser/android/vr_shell/color_scheme.h
rename to chrome/browser/vr/color_scheme.h
index ccefb8bb..afafcba 100644
--- a/chrome/browser/android/vr_shell/color_scheme.h
+++ b/chrome/browser/vr/color_scheme.h
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_COLOR_SCHEME_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_COLOR_SCHEME_H_
+#ifndef CHROME_BROWSER_VR_COLOR_SCHEME_H_
+#define CHROME_BROWSER_VR_COLOR_SCHEME_H_
 
 #include "third_party/skia/include/core/SkColor.h"
 
-namespace vr_shell {
+namespace vr {
 
 struct ColorScheme {
   enum Mode : int {
@@ -83,6 +83,6 @@
   SkColor splash_screen_background;
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_COLOR_SCHEME_H_
+#endif  // CHROME_BROWSER_VR_COLOR_SCHEME_H_
diff --git a/chrome/browser/android/vr_shell/easing.cc b/chrome/browser/vr/easing.cc
similarity index 92%
rename from chrome/browser/android/vr_shell/easing.cc
rename to chrome/browser/vr/easing.cc
index 137bcb5f..5e1c896 100644
--- a/chrome/browser/android/vr_shell/easing.cc
+++ b/chrome/browser/vr/easing.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/easing.h"
+#include "chrome/browser/vr/easing.h"
 
 #include <cmath>
 
 #include "base/logging.h"
 
-namespace vr_shell {
+namespace vr {
 namespace easing {
 
 double Easing::CalculateValue(double input) {
@@ -47,4 +47,4 @@
 }
 
 }  // namespace easing
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/easing.h b/chrome/browser/vr/easing.h
similarity index 90%
rename from chrome/browser/android/vr_shell/easing.h
rename to chrome/browser/vr/easing.h
index 0698154..6278184d 100644
--- a/chrome/browser/android/vr_shell/easing.h
+++ b/chrome/browser/vr/easing.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 CHROME_BROWSER_ANDROID_VR_SHELL_EASING_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_EASING_H_
+#ifndef CHROME_BROWSER_VR_EASING_H_
+#define CHROME_BROWSER_VR_EASING_H_
 
 #include "base/macros.h"
 #include "ui/gfx/geometry/cubic_bezier.h"
 
-namespace vr_shell {
+namespace vr {
 namespace easing {
 
 enum EasingType {
@@ -91,6 +91,6 @@
 };
 
 }  // namespace easing
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_EASING_H_
+#endif  // CHROME_BROWSER_VR_EASING_H_
diff --git a/chrome/browser/android/vr_shell/ui_elements/button.cc b/chrome/browser/vr/elements/button.cc
similarity index 88%
rename from chrome/browser/android/vr_shell/ui_elements/button.cc
rename to chrome/browser/vr/elements/button.cc
index 0f300aa..3214e0c8 100644
--- a/chrome/browser/android/vr_shell/ui_elements/button.cc
+++ b/chrome/browser/vr/elements/button.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/ui_elements/button.h"
+#include "chrome/browser/vr/elements/button.h"
 
 #include "base/memory/ptr_util.h"
-#include "chrome/browser/android/vr_shell/textures/button_texture.h"
+#include "chrome/browser/vr/elements/button_texture.h"
 #include "ui/gfx/geometry/point_f.h"
 
-namespace vr_shell {
+namespace vr {
 
 Button::Button(base::Callback<void()> click_handler,
                std::unique_ptr<ButtonTexture> texture)
@@ -60,4 +60,4 @@
   UpdateTexture();
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/ui_elements/button.h b/chrome/browser/vr/elements/button.h
similarity index 76%
rename from chrome/browser/android/vr_shell/ui_elements/button.h
rename to chrome/browser/vr/elements/button.h
index 923c6e5..e16d68d3 100644
--- a/chrome/browser/android/vr_shell/ui_elements/button.h
+++ b/chrome/browser/vr/elements/button.h
@@ -2,20 +2,20 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_BUTTON_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_BUTTON_H_
+#ifndef CHROME_BROWSER_VR_ELEMENTS_BUTTON_H_
+#define CHROME_BROWSER_VR_ELEMENTS_BUTTON_H_
 
 #include <memory>
 
 #include "base/callback.h"
 #include "base/macros.h"
-#include "chrome/browser/android/vr_shell/ui_elements/textured_element.h"
+#include "chrome/browser/vr/elements/textured_element.h"
 
 namespace gfx {
 class PointF;
-}  // gfx
+}  // namespace gfx
 
-namespace vr_shell {
+namespace vr {
 
 class ButtonTexture;
 
@@ -43,6 +43,6 @@
   DISALLOW_COPY_AND_ASSIGN(Button);
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_BUTTON_H_
+#endif  // CHROME_BROWSER_VR_ELEMENTS_BUTTON_H_
diff --git a/chrome/browser/android/vr_shell/textures/button_texture.cc b/chrome/browser/vr/elements/button_texture.cc
similarity index 82%
rename from chrome/browser/android/vr_shell/textures/button_texture.cc
rename to chrome/browser/vr/elements/button_texture.cc
index 3d3ff690..cb63abb 100644
--- a/chrome/browser/android/vr_shell/textures/button_texture.cc
+++ b/chrome/browser/vr/elements/button_texture.cc
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/textures/button_texture.h"
+#include "chrome/browser/vr/elements/button_texture.h"
 
-namespace vr_shell {
+namespace vr {
 
 ButtonTexture::ButtonTexture() = default;
 
@@ -26,4 +26,4 @@
   hovered_ = hovered;
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/textures/button_texture.h b/chrome/browser/vr/elements/button_texture.h
similarity index 62%
rename from chrome/browser/android/vr_shell/textures/button_texture.h
rename to chrome/browser/vr/elements/button_texture.h
index 806c02d9..de10ce9 100644
--- a/chrome/browser/android/vr_shell/textures/button_texture.h
+++ b/chrome/browser/vr/elements/button_texture.h
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_BUTTON_TEXTURE_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_BUTTON_TEXTURE_H_
+#ifndef CHROME_BROWSER_VR_ELEMENTS_BUTTON_TEXTURE_H_
+#define CHROME_BROWSER_VR_ELEMENTS_BUTTON_TEXTURE_H_
 
-#include "chrome/browser/android/vr_shell/textures/ui_texture.h"
+#include "chrome/browser/vr/elements/ui_texture.h"
 
-namespace vr_shell {
+namespace vr {
 
 class ButtonTexture : public UiTexture {
  public:
@@ -26,6 +26,6 @@
   bool hovered_ = false;
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_BUTTON_TEXTURE_H_
+#endif  // CHROME_BROWSER_VR_ELEMENTS_BUTTON_TEXTURE_H_
diff --git a/chrome/browser/android/vr_shell/textures/close_button_texture.cc b/chrome/browser/vr/elements/close_button_texture.cc
similarity index 89%
rename from chrome/browser/android/vr_shell/textures/close_button_texture.cc
rename to chrome/browser/vr/elements/close_button_texture.cc
index 7b57e21..1625b58 100644
--- a/chrome/browser/android/vr_shell/textures/close_button_texture.cc
+++ b/chrome/browser/vr/elements/close_button_texture.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 "chrome/browser/android/vr_shell/textures/close_button_texture.h"
+#include "chrome/browser/vr/elements/close_button_texture.h"
 
 #include "cc/paint/skia_paint_canvas.h"
-#include "chrome/browser/android/vr_shell/color_scheme.h"
-#include "chrome/browser/android/vr_shell/ui_elements/button.h"
+#include "chrome/browser/vr/color_scheme.h"
+#include "chrome/browser/vr/elements/button.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/geometry/point_f.h"
 #include "ui/gfx/geometry/rect.h"
@@ -15,7 +15,7 @@
 #include "ui/gfx/vector_icon_types.h"
 #include "ui/vector_icons/vector_icons.h"
 
-namespace vr_shell {
+namespace vr {
 
 namespace {
 
@@ -65,4 +65,4 @@
   return (point - gfx::PointF(0.5, 0.5)).LengthSquared() < 0.25;
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/textures/close_button_texture.h b/chrome/browser/vr/elements/close_button_texture.h
similarity index 64%
rename from chrome/browser/android/vr_shell/textures/close_button_texture.h
rename to chrome/browser/vr/elements/close_button_texture.h
index 4bd4a0b..fd54f86 100644
--- a/chrome/browser/android/vr_shell/textures/close_button_texture.h
+++ b/chrome/browser/vr/elements/close_button_texture.h
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_CLOSE_BUTTON_TEXTURE_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_CLOSE_BUTTON_TEXTURE_H_
+#ifndef CHROME_BROWSER_VR_ELEMENTS_CLOSE_BUTTON_TEXTURE_H_
+#define CHROME_BROWSER_VR_ELEMENTS_CLOSE_BUTTON_TEXTURE_H_
 
-#include "chrome/browser/android/vr_shell/textures/button_texture.h"
+#include "chrome/browser/vr/elements/button_texture.h"
 
 namespace gfx {
 class PointF;
 }  // namespace gfx
 
-namespace vr_shell {
+namespace vr {
 
 class CloseButtonTexture : public ButtonTexture {
  public:
@@ -27,6 +27,6 @@
   gfx::SizeF size_;
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_CLOSE_BUTTON_TEXTURE_H_
+#endif  // CHROME_BROWSER_VR_ELEMENTS_CLOSE_BUTTON_TEXTURE_H_
diff --git a/chrome/browser/android/vr_shell/textures/close_button_texture_unittest.cc b/chrome/browser/vr/elements/close_button_texture_unittest.cc
similarity index 86%
rename from chrome/browser/android/vr_shell/textures/close_button_texture_unittest.cc
rename to chrome/browser/vr/elements/close_button_texture_unittest.cc
index ffbb73df..68c2588 100644
--- a/chrome/browser/android/vr_shell/textures/close_button_texture_unittest.cc
+++ b/chrome/browser/vr/elements/close_button_texture_unittest.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/textures/close_button_texture.h"
+#include "chrome/browser/vr/elements/close_button_texture.h"
 
 #include "base/memory/ptr_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/gfx/geometry/point_f.h"
 
-namespace vr_shell {
+namespace vr {
 
 TEST(CloseButtonTextureTest, HitTest) {
   auto button = base::MakeUnique<CloseButtonTexture>();
@@ -28,4 +28,4 @@
   }
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/ui_elements/exclusive_screen_toast.cc b/chrome/browser/vr/elements/exclusive_screen_toast.cc
similarity index 74%
rename from chrome/browser/android/vr_shell/ui_elements/exclusive_screen_toast.cc
rename to chrome/browser/vr/elements/exclusive_screen_toast.cc
index 1cffe56..374de5e 100644
--- a/chrome/browser/android/vr_shell/ui_elements/exclusive_screen_toast.cc
+++ b/chrome/browser/vr/elements/exclusive_screen_toast.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/ui_elements/exclusive_screen_toast.h"
+#include "chrome/browser/vr/elements/exclusive_screen_toast.h"
 
-#include "chrome/browser/android/vr_shell/textures/ui_texture.h"
-#include "chrome/browser/android/vr_shell/ui_elements/textured_element.h"
+#include "chrome/browser/vr/elements/textured_element.h"
+#include "chrome/browser/vr/elements/ui_texture.h"
 
-namespace vr_shell {
+namespace vr {
 
 ExclusiveScreenToast::ExclusiveScreenToast(int preferred_width,
                                            const base::TimeDelta& timeout)
@@ -23,4 +23,4 @@
   set_size({width, size().y(), 1});
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/vr/elements/exclusive_screen_toast.h b/chrome/browser/vr/elements/exclusive_screen_toast.h
new file mode 100644
index 0000000..298d70cf
--- /dev/null
+++ b/chrome/browser/vr/elements/exclusive_screen_toast.h
@@ -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.
+
+#ifndef CHROME_BROWSER_VR_ELEMENTS_EXCLUSIVE_SCREEN_TOAST_H_
+#define CHROME_BROWSER_VR_ELEMENTS_EXCLUSIVE_SCREEN_TOAST_H_
+
+#include "base/macros.h"
+#include "chrome/browser/vr/elements/exclusive_screen_toast_texture.h"
+#include "chrome/browser/vr/elements/simple_textured_element.h"
+
+namespace vr {
+
+class ExclusiveScreenToast
+    : public TransientSimpleTexturedElement<ExclusiveScreenToastTexture> {
+ public:
+  ExclusiveScreenToast(int preferred_width, const base::TimeDelta& timeout);
+  ~ExclusiveScreenToast() override;
+
+ private:
+  void UpdateElementSize() override;
+
+  DISALLOW_COPY_AND_ASSIGN(ExclusiveScreenToast);
+};
+
+}  // namespace vr
+
+#endif  // CHROME_BROWSER_VR_ELEMENTS_EXCLUSIVE_SCREEN_TOAST_H_
diff --git a/chrome/browser/android/vr_shell/textures/exclusive_screen_toast_texture.cc b/chrome/browser/vr/elements/exclusive_screen_toast_texture.cc
similarity index 94%
rename from chrome/browser/android/vr_shell/textures/exclusive_screen_toast_texture.cc
rename to chrome/browser/vr/elements/exclusive_screen_toast_texture.cc
index 045fbb91..0b5379c 100644
--- a/chrome/browser/android/vr_shell/textures/exclusive_screen_toast_texture.cc
+++ b/chrome/browser/vr/elements/exclusive_screen_toast_texture.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 "chrome/browser/android/vr_shell/textures/exclusive_screen_toast_texture.h"
+#include "chrome/browser/vr/elements/exclusive_screen_toast_texture.h"
 
 #include "cc/paint/skia_paint_canvas.h"
 #include "chrome/grit/generated_resources.h"
@@ -13,7 +13,7 @@
 #include "ui/gfx/geometry/vector2d.h"
 #include "ui/gfx/render_text.h"
 
-namespace vr_shell {
+namespace vr {
 
 namespace {
 
@@ -75,4 +75,4 @@
   return size_;
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/textures/exclusive_screen_toast_texture.h b/chrome/browser/vr/elements/exclusive_screen_toast_texture.h
similarity index 62%
rename from chrome/browser/android/vr_shell/textures/exclusive_screen_toast_texture.h
rename to chrome/browser/vr/elements/exclusive_screen_toast_texture.h
index 6f7a49cc..0cafe33 100644
--- a/chrome/browser/android/vr_shell/textures/exclusive_screen_toast_texture.h
+++ b/chrome/browser/vr/elements/exclusive_screen_toast_texture.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 CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_EXCLUSIVE_SCREEN_TOAST_TEXTURE_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_EXCLUSIVE_SCREEN_TOAST_TEXTURE_H_
+#ifndef CHROME_BROWSER_VR_ELEMENTS_EXCLUSIVE_SCREEN_TOAST_TEXTURE_H_
+#define CHROME_BROWSER_VR_ELEMENTS_EXCLUSIVE_SCREEN_TOAST_TEXTURE_H_
 
 #include "base/macros.h"
-#include "chrome/browser/android/vr_shell/textures/ui_texture.h"
+#include "chrome/browser/vr/elements/ui_texture.h"
 
-namespace vr_shell {
+namespace vr {
 
 class ExclusiveScreenToastTexture : public UiTexture {
  public:
@@ -25,6 +25,6 @@
   DISALLOW_COPY_AND_ASSIGN(ExclusiveScreenToastTexture);
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_EXCLUSIVE_SCREEN_TOAST_TEXTURE_H_
+#endif  // CHROME_BROWSER_VR_ELEMENTS_EXCLUSIVE_SCREEN_TOAST_TEXTURE_H_
diff --git a/chrome/browser/android/vr_shell/ui_elements/exit_prompt.cc b/chrome/browser/vr/elements/exit_prompt.cc
similarity index 92%
rename from chrome/browser/android/vr_shell/ui_elements/exit_prompt.cc
rename to chrome/browser/vr/elements/exit_prompt.cc
index 909fd593..5d99491 100644
--- a/chrome/browser/android/vr_shell/ui_elements/exit_prompt.cc
+++ b/chrome/browser/vr/elements/exit_prompt.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/ui_elements/exit_prompt.h"
+#include "chrome/browser/vr/elements/exit_prompt.h"
 
 #include "base/memory/ptr_util.h"
-#include "chrome/browser/android/vr_shell/textures/exit_prompt_texture.h"
+#include "chrome/browser/vr/elements/exit_prompt_texture.h"
 
-namespace vr_shell {
+namespace vr {
 
 ExitPrompt::ExitPrompt(int preferred_width,
                        const base::Callback<void()>& primary_button_callback,
@@ -72,4 +72,4 @@
   return texture_.get();
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/ui_elements/exit_prompt.h b/chrome/browser/vr/elements/exit_prompt.h
similarity index 78%
rename from chrome/browser/android/vr_shell/ui_elements/exit_prompt.h
rename to chrome/browser/vr/elements/exit_prompt.h
index 51d44da7..982aebe 100644
--- a/chrome/browser/android/vr_shell/ui_elements/exit_prompt.h
+++ b/chrome/browser/vr/elements/exit_prompt.h
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_EXIT_PROMPT_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_EXIT_PROMPT_H_
+#ifndef CHROME_BROWSER_VR_ELEMENTS_EXIT_PROMPT_H_
+#define CHROME_BROWSER_VR_ELEMENTS_EXIT_PROMPT_H_
 
 #include <memory>
 
 #include "base/callback.h"
 #include "base/macros.h"
-#include "chrome/browser/android/vr_shell/ui_elements/textured_element.h"
+#include "chrome/browser/vr/elements/textured_element.h"
 
-namespace vr_shell {
+namespace vr {
 
 class ExitPromptTexture;
 
@@ -46,6 +46,6 @@
   DISALLOW_COPY_AND_ASSIGN(ExitPrompt);
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_EXIT_PROMPT_H_
+#endif  // CHROME_BROWSER_VR_ELEMENTS_EXIT_PROMPT_H_
diff --git a/chrome/browser/android/vr_shell/ui_elements/exit_prompt_backplane.cc b/chrome/browser/vr/elements/exit_prompt_backplane.cc
similarity index 86%
rename from chrome/browser/android/vr_shell/ui_elements/exit_prompt_backplane.cc
rename to chrome/browser/vr/elements/exit_prompt_backplane.cc
index 6dcd5a8..de9133e 100644
--- a/chrome/browser/android/vr_shell/ui_elements/exit_prompt_backplane.cc
+++ b/chrome/browser/vr/elements/exit_prompt_backplane.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 "chrome/browser/android/vr_shell/ui_elements/exit_prompt_backplane.h"
+#include "chrome/browser/vr/elements/exit_prompt_backplane.h"
 
 #include "base/memory/ptr_util.h"
 
-namespace vr_shell {
+namespace vr {
 
 ExitPromptBackplane::ExitPromptBackplane(
     const base::Callback<void()>& click_callback)
@@ -22,4 +22,4 @@
   click_callback_.Run();
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/ui_elements/exit_prompt_backplane.h b/chrome/browser/vr/elements/exit_prompt_backplane.h
similarity index 65%
rename from chrome/browser/android/vr_shell/ui_elements/exit_prompt_backplane.h
rename to chrome/browser/vr/elements/exit_prompt_backplane.h
index 8b9f7cb..d6aff604 100644
--- a/chrome/browser/android/vr_shell/ui_elements/exit_prompt_backplane.h
+++ b/chrome/browser/vr/elements/exit_prompt_backplane.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 CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_EXIT_PROMPT_BACKPLANE_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_EXIT_PROMPT_BACKPLANE_H_
+#ifndef CHROME_BROWSER_VR_ELEMENTS_EXIT_PROMPT_BACKPLANE_H_
+#define CHROME_BROWSER_VR_ELEMENTS_EXIT_PROMPT_BACKPLANE_H_
 
 #include "base/callback.h"
-#include "chrome/browser/android/vr_shell/ui_elements/ui_element.h"
+#include "chrome/browser/vr/elements/ui_element.h"
 
-namespace vr_shell {
+namespace vr {
 
 // An invisible but hittable plane behind the exit prompt, to keep the reticle
 // roughly planar with the prompt when its near the prompt.
@@ -25,6 +25,6 @@
   DISALLOW_COPY_AND_ASSIGN(ExitPromptBackplane);
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_EXIT_PROMPT_BACKPLANE_H_
+#endif  // CHROME_BROWSER_VR_ELEMENTS_EXIT_PROMPT_BACKPLANE_H_
diff --git a/chrome/browser/android/vr_shell/textures/exit_prompt_texture.cc b/chrome/browser/vr/elements/exit_prompt_texture.cc
similarity index 96%
rename from chrome/browser/android/vr_shell/textures/exit_prompt_texture.cc
rename to chrome/browser/vr/elements/exit_prompt_texture.cc
index 52d59558..166c7c1 100644
--- a/chrome/browser/android/vr_shell/textures/exit_prompt_texture.cc
+++ b/chrome/browser/vr/elements/exit_prompt_texture.cc
@@ -2,10 +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/android/vr_shell/textures/exit_prompt_texture.h"
+#include "chrome/browser/vr/elements/exit_prompt_texture.h"
 
 #include "cc/paint/skia_paint_canvas.h"
-#include "chrome/browser/android/vr_shell/color_scheme.h"
+#include "chrome/browser/vr/color_scheme.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/strings/grit/components_strings.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -15,7 +15,7 @@
 #include "ui/gfx/geometry/vector2d.h"
 #include "ui/gfx/render_text.h"
 
-namespace vr_shell {
+namespace vr {
 
 namespace {
 
@@ -171,4 +171,4 @@
   return size_;
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/textures/exit_prompt_texture.h b/chrome/browser/vr/elements/exit_prompt_texture.h
similarity index 80%
rename from chrome/browser/android/vr_shell/textures/exit_prompt_texture.h
rename to chrome/browser/vr/elements/exit_prompt_texture.h
index 8a64040..55341f7 100644
--- a/chrome/browser/android/vr_shell/textures/exit_prompt_texture.h
+++ b/chrome/browser/vr/elements/exit_prompt_texture.h
@@ -2,18 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_EXIT_PROMPT_TEXTURE_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_EXIT_PROMPT_TEXTURE_H_
+#ifndef CHROME_BROWSER_VR_ELEMENTS_EXIT_PROMPT_TEXTURE_H_
+#define CHROME_BROWSER_VR_ELEMENTS_EXIT_PROMPT_TEXTURE_H_
 
 #include "base/macros.h"
-#include "chrome/browser/android/vr_shell/textures/ui_texture.h"
+#include "chrome/browser/vr/elements/ui_texture.h"
 #include "ui/gfx/geometry/rect_f.h"
 
 namespace gfx {
 class PointF;
 }  // namespace gfx
 
-namespace vr_shell {
+namespace vr {
 
 class ExitPromptTexture : public UiTexture {
  public:
@@ -50,6 +50,6 @@
   DISALLOW_COPY_AND_ASSIGN(ExitPromptTexture);
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_EXIT_PROMPT_TEXTURE_H_
+#endif  // CHROME_BROWSER_VR_ELEMENTS_EXIT_PROMPT_TEXTURE_H_
diff --git a/chrome/browser/android/vr_shell/ui_elements/exit_prompt_unittest.cc b/chrome/browser/vr/elements/exit_prompt_unittest.cc
similarity index 94%
rename from chrome/browser/android/vr_shell/ui_elements/exit_prompt_unittest.cc
rename to chrome/browser/vr/elements/exit_prompt_unittest.cc
index 8d651168..e38036f 100644
--- a/chrome/browser/android/vr_shell/ui_elements/exit_prompt_unittest.cc
+++ b/chrome/browser/vr/elements/exit_prompt_unittest.cc
@@ -2,19 +2,19 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/ui_elements/exit_prompt.h"
+#include "chrome/browser/vr/elements/exit_prompt.h"
 
 #include "base/bind.h"
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
-#include "chrome/browser/android/vr_shell/textures/exit_prompt_texture.h"
+#include "chrome/browser/vr/elements/exit_prompt_texture.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/gfx/test/gfx_util.h"
 
 using ::testing::Return;
 
-namespace vr_shell {
+namespace vr {
 
 namespace {
 
@@ -99,4 +99,4 @@
   EXPECT_TRUE(prompt.secondary_button_pressed());
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/textures/exit_warning_texture.cc b/chrome/browser/vr/elements/exit_warning_texture.cc
similarity index 94%
rename from chrome/browser/android/vr_shell/textures/exit_warning_texture.cc
rename to chrome/browser/vr/elements/exit_warning_texture.cc
index b74a3302..746430f4 100644
--- a/chrome/browser/android/vr_shell/textures/exit_warning_texture.cc
+++ b/chrome/browser/vr/elements/exit_warning_texture.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 "chrome/browser/android/vr_shell/textures/exit_warning_texture.h"
+#include "chrome/browser/vr/elements/exit_warning_texture.h"
 
 #include "cc/paint/skia_paint_canvas.h"
 #include "components/strings/grit/components_strings.h"
@@ -16,7 +16,7 @@
 #include "ui/gfx/vector_icon_types.h"
 #include "ui/vector_icons/vector_icons.h"
 
-namespace vr_shell {
+namespace vr {
 
 namespace {
 
@@ -73,4 +73,4 @@
   return size_;
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/textures/exit_warning_texture.h b/chrome/browser/vr/elements/exit_warning_texture.h
similarity index 63%
rename from chrome/browser/android/vr_shell/textures/exit_warning_texture.h
rename to chrome/browser/vr/elements/exit_warning_texture.h
index 53dfc8e..9c4d60e 100644
--- a/chrome/browser/android/vr_shell/textures/exit_warning_texture.h
+++ b/chrome/browser/vr/elements/exit_warning_texture.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 CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_EXIT_WARNING_TEXTURE_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_EXIT_WARNING_TEXTURE_H_
+#ifndef CHROME_BROWSER_VR_ELEMENTS_EXIT_WARNING_TEXTURE_H_
+#define CHROME_BROWSER_VR_ELEMENTS_EXIT_WARNING_TEXTURE_H_
 
 #include "base/macros.h"
-#include "chrome/browser/android/vr_shell/textures/ui_texture.h"
+#include "chrome/browser/vr/elements/ui_texture.h"
 
-namespace vr_shell {
+namespace vr {
 
 class ExitWarningTexture : public UiTexture {
  public:
@@ -25,6 +25,6 @@
   DISALLOW_COPY_AND_ASSIGN(ExitWarningTexture);
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_EXIT_WARNING_TEXTURE_H_
+#endif  // CHROME_BROWSER_VR_ELEMENTS_EXIT_WARNING_TEXTURE_H_
diff --git a/chrome/browser/android/vr_shell/textures/insecure_content_permanent_texture.cc b/chrome/browser/vr/elements/insecure_content_permanent_texture.cc
similarity index 95%
rename from chrome/browser/android/vr_shell/textures/insecure_content_permanent_texture.cc
rename to chrome/browser/vr/elements/insecure_content_permanent_texture.cc
index f43c061..6210b2c 100644
--- a/chrome/browser/android/vr_shell/textures/insecure_content_permanent_texture.cc
+++ b/chrome/browser/vr/elements/insecure_content_permanent_texture.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 "chrome/browser/android/vr_shell/textures/insecure_content_permanent_texture.h"
+#include "chrome/browser/vr/elements/insecure_content_permanent_texture.h"
 
 #include "cc/paint/skia_paint_canvas.h"
 #include "components/strings/grit/components_strings.h"
@@ -16,7 +16,7 @@
 #include "ui/gfx/vector_icon_types.h"
 #include "ui/vector_icons/vector_icons.h"
 
-namespace vr_shell {
+namespace vr {
 
 namespace {
 
@@ -91,4 +91,4 @@
   return size_;
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/textures/insecure_content_permanent_texture.h b/chrome/browser/vr/elements/insecure_content_permanent_texture.h
similarity index 62%
rename from chrome/browser/android/vr_shell/textures/insecure_content_permanent_texture.h
rename to chrome/browser/vr/elements/insecure_content_permanent_texture.h
index ae48322..cc4c9d47 100644
--- a/chrome/browser/android/vr_shell/textures/insecure_content_permanent_texture.h
+++ b/chrome/browser/vr/elements/insecure_content_permanent_texture.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 CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_INSECURE_CONTENT_PERMANENT_TEXTURE_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_INSECURE_CONTENT_PERMANENT_TEXTURE_H_
+#ifndef CHROME_BROWSER_VR_ELEMENTS_INSECURE_CONTENT_PERMANENT_TEXTURE_H_
+#define CHROME_BROWSER_VR_ELEMENTS_INSECURE_CONTENT_PERMANENT_TEXTURE_H_
 
 #include "base/macros.h"
-#include "chrome/browser/android/vr_shell/textures/ui_texture.h"
+#include "chrome/browser/vr/elements/ui_texture.h"
 
-namespace vr_shell {
+namespace vr {
 
 class InsecureContentPermanentTexture : public UiTexture {
  public:
@@ -25,6 +25,6 @@
   DISALLOW_COPY_AND_ASSIGN(InsecureContentPermanentTexture);
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_INSECURE_CONTENT_PERMANENT_TEXTURE_H_
+#endif  // CHROME_BROWSER_VR_ELEMENTS_INSECURE_CONTENT_PERMANENT_TEXTURE_H_
diff --git a/chrome/browser/android/vr_shell/textures/insecure_content_transient_texture.cc b/chrome/browser/vr/elements/insecure_content_transient_texture.cc
similarity index 94%
rename from chrome/browser/android/vr_shell/textures/insecure_content_transient_texture.cc
rename to chrome/browser/vr/elements/insecure_content_transient_texture.cc
index ea82914..8008c7f 100644
--- a/chrome/browser/android/vr_shell/textures/insecure_content_transient_texture.cc
+++ b/chrome/browser/vr/elements/insecure_content_transient_texture.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 "chrome/browser/android/vr_shell/textures/insecure_content_transient_texture.h"
+#include "chrome/browser/vr/elements/insecure_content_transient_texture.h"
 
 #include "cc/paint/skia_paint_canvas.h"
 #include "components/strings/grit/components_strings.h"
@@ -16,7 +16,7 @@
 #include "ui/gfx/vector_icon_types.h"
 #include "ui/vector_icons/vector_icons.h"
 
-namespace vr_shell {
+namespace vr {
 
 namespace {
 
@@ -73,4 +73,4 @@
   return size_;
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/textures/insecure_content_transient_texture.h b/chrome/browser/vr/elements/insecure_content_transient_texture.h
similarity index 62%
rename from chrome/browser/android/vr_shell/textures/insecure_content_transient_texture.h
rename to chrome/browser/vr/elements/insecure_content_transient_texture.h
index 8cabcab..1179fba 100644
--- a/chrome/browser/android/vr_shell/textures/insecure_content_transient_texture.h
+++ b/chrome/browser/vr/elements/insecure_content_transient_texture.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 CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_INSECURE_CONTENT_TRANSIENT_TEXTURE_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_INSECURE_CONTENT_TRANSIENT_TEXTURE_H_
+#ifndef CHROME_BROWSER_VR_ELEMENTS_INSECURE_CONTENT_TRANSIENT_TEXTURE_H_
+#define CHROME_BROWSER_VR_ELEMENTS_INSECURE_CONTENT_TRANSIENT_TEXTURE_H_
 
 #include "base/macros.h"
-#include "chrome/browser/android/vr_shell/textures/ui_texture.h"
+#include "chrome/browser/vr/elements/ui_texture.h"
 
-namespace vr_shell {
+namespace vr {
 
 class InsecureContentTransientTexture : public UiTexture {
  public:
@@ -25,6 +25,6 @@
   DISALLOW_COPY_AND_ASSIGN(InsecureContentTransientTexture);
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_INSECURE_CONTENT_TRANSIENT_TEXTURE_H_
+#endif  // CHROME_BROWSER_VR_ELEMENTS_INSECURE_CONTENT_TRANSIENT_TEXTURE_H_
diff --git a/chrome/browser/android/vr_shell/ui_elements/loading_indicator.cc b/chrome/browser/vr/elements/loading_indicator.cc
similarity index 87%
rename from chrome/browser/android/vr_shell/ui_elements/loading_indicator.cc
rename to chrome/browser/vr/elements/loading_indicator.cc
index c255fae..8a14088 100644
--- a/chrome/browser/android/vr_shell/ui_elements/loading_indicator.cc
+++ b/chrome/browser/vr/elements/loading_indicator.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/ui_elements/loading_indicator.h"
+#include "chrome/browser/vr/elements/loading_indicator.h"
 
 #include "base/memory/ptr_util.h"
-#include "chrome/browser/android/vr_shell/textures/loading_indicator_texture.h"
+#include "chrome/browser/vr/elements/loading_indicator_texture.h"
 
-namespace vr_shell {
+namespace vr {
 
 namespace {
 
@@ -61,4 +61,4 @@
   set_visible(enabled_ && (loading_ || visibility_timer_.IsRunning()));
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/ui_elements/loading_indicator.h b/chrome/browser/vr/elements/loading_indicator.h
similarity index 70%
rename from chrome/browser/android/vr_shell/ui_elements/loading_indicator.h
rename to chrome/browser/vr/elements/loading_indicator.h
index 31c3c50..7d4b58f 100644
--- a/chrome/browser/android/vr_shell/ui_elements/loading_indicator.h
+++ b/chrome/browser/vr/elements/loading_indicator.h
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_LOADING_INDICATOR_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_LOADING_INDICATOR_H_
+#ifndef CHROME_BROWSER_VR_ELEMENTS_LOADING_INDICATOR_H_
+#define CHROME_BROWSER_VR_ELEMENTS_LOADING_INDICATOR_H_
 
 #include <memory>
 
 #include "base/macros.h"
 #include "base/timer/timer.h"
-#include "chrome/browser/android/vr_shell/ui_elements/textured_element.h"
+#include "chrome/browser/vr/elements/textured_element.h"
 
-namespace vr_shell {
+namespace vr {
 
 class LoadingIndicatorTexture;
 
@@ -39,6 +39,6 @@
   DISALLOW_COPY_AND_ASSIGN(LoadingIndicator);
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_LOADING_INDICATOR_H_
+#endif  // CHROME_BROWSER_VR_ELEMENTS_LOADING_INDICATOR_H_
diff --git a/chrome/browser/android/vr_shell/textures/loading_indicator_texture.cc b/chrome/browser/vr/elements/loading_indicator_texture.cc
similarity index 93%
rename from chrome/browser/android/vr_shell/textures/loading_indicator_texture.cc
rename to chrome/browser/vr/elements/loading_indicator_texture.cc
index bdc78793..84527437 100644
--- a/chrome/browser/android/vr_shell/textures/loading_indicator_texture.cc
+++ b/chrome/browser/vr/elements/loading_indicator_texture.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/textures/loading_indicator_texture.h"
+#include "chrome/browser/vr/elements/loading_indicator_texture.h"
 
 #include "base/logging.h"
 #include "cc/paint/skia_paint_canvas.h"
 #include "third_party/skia/include/core/SkCanvas.h"
 
-namespace vr_shell {
+namespace vr {
 
 namespace {
 
@@ -69,4 +69,4 @@
   canvas->restore();
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/textures/loading_indicator_texture.h b/chrome/browser/vr/elements/loading_indicator_texture.h
similarity index 66%
rename from chrome/browser/android/vr_shell/textures/loading_indicator_texture.h
rename to chrome/browser/vr/elements/loading_indicator_texture.h
index 2f0a8f3..39302e4 100644
--- a/chrome/browser/android/vr_shell/textures/loading_indicator_texture.h
+++ b/chrome/browser/vr/elements/loading_indicator_texture.h
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_LOADING_INDICATOR_TEXTURE_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_LOADING_INDICATOR_TEXTURE_H_
+#ifndef CHROME_BROWSER_VR_ELEMENTS_LOADING_INDICATOR_TEXTURE_H_
+#define CHROME_BROWSER_VR_ELEMENTS_LOADING_INDICATOR_TEXTURE_H_
 
-#include "chrome/browser/android/vr_shell/textures/ui_texture.h"
+#include "chrome/browser/vr/elements/ui_texture.h"
 #include "ui/gfx/geometry/size.h"
 
 class SkCanvas;
 
-namespace vr_shell {
+namespace vr {
 
 class LoadingIndicatorTexture : public UiTexture {
  public:
@@ -29,6 +29,6 @@
   float progress_ = 0;
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_LOADING_INDICATOR_TEXTURE_H_
+#endif  // CHROME_BROWSER_VR_ELEMENTS_LOADING_INDICATOR_TEXTURE_H_
diff --git a/chrome/browser/android/vr_shell/textures/render_text_wrapper.cc b/chrome/browser/vr/elements/render_text_wrapper.cc
similarity index 88%
rename from chrome/browser/android/vr_shell/textures/render_text_wrapper.cc
rename to chrome/browser/vr/elements/render_text_wrapper.cc
index 4576bed4..99102517 100644
--- a/chrome/browser/android/vr_shell/textures/render_text_wrapper.cc
+++ b/chrome/browser/vr/elements/render_text_wrapper.cc
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/textures/render_text_wrapper.h"
+#include "chrome/browser/vr/elements/render_text_wrapper.h"
 
-namespace vr_shell {
+namespace vr {
 
 RenderTextWrapper::RenderTextWrapper(gfx::RenderText* render_text)
     : render_text_(render_text) {}
@@ -33,4 +33,4 @@
   render_text_->set_strike_thickness_factor(factor);
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/textures/render_text_wrapper.h b/chrome/browser/vr/elements/render_text_wrapper.h
similarity index 77%
rename from chrome/browser/android/vr_shell/textures/render_text_wrapper.h
rename to chrome/browser/vr/elements/render_text_wrapper.h
index c959f4d6..11da3df2 100644
--- a/chrome/browser/android/vr_shell/textures/render_text_wrapper.h
+++ b/chrome/browser/vr/elements/render_text_wrapper.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 CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_RENDER_TEXT_WRAPPER_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_RENDER_TEXT_WRAPPER_H_
+#ifndef CHROME_BROWSER_VR_ELEMENTS_RENDER_TEXT_WRAPPER_H_
+#define CHROME_BROWSER_VR_ELEMENTS_RENDER_TEXT_WRAPPER_H_
 
 #include "base/macros.h"
 #include "ui/gfx/render_text.h"
 
-namespace vr_shell {
+namespace vr {
 
 // A minimal, mockable wrapper around gfx::RenderText, to facilitate testing of
 // RenderText users.
@@ -33,6 +33,6 @@
   DISALLOW_COPY_AND_ASSIGN(RenderTextWrapper);
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_RENDER_TEXT_WRAPPER_H_
+#endif  // CHROME_BROWSER_VR_ELEMENTS_RENDER_TEXT_WRAPPER_H_
diff --git a/chrome/browser/android/vr_shell/ui_elements/screen_dimmer.cc b/chrome/browser/vr/elements/screen_dimmer.cc
similarity index 79%
rename from chrome/browser/android/vr_shell/ui_elements/screen_dimmer.cc
rename to chrome/browser/vr/elements/screen_dimmer.cc
index 9e1a034..facc7b5 100644
--- a/chrome/browser/android/vr_shell/ui_elements/screen_dimmer.cc
+++ b/chrome/browser/vr/elements/screen_dimmer.cc
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/ui_elements/screen_dimmer.h"
+#include "chrome/browser/vr/elements/screen_dimmer.h"
 
-#include "chrome/browser/android/vr_shell/color_scheme.h"
-#include "chrome/browser/android/vr_shell/ui_element_renderer.h"
+#include "chrome/browser/vr/color_scheme.h"
+#include "chrome/browser/vr/ui_element_renderer.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/gfx/geometry/quaternion.h"
 #include "ui/gfx/transform.h"
 
-namespace vr_shell {
+namespace vr {
 
 namespace {
 static const float kDimmerOpacity = 0.9f;
@@ -36,4 +36,4 @@
                              color_scheme.dimmer_inner, kDimmerOpacity);
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/ui_elements/screen_dimmer.h b/chrome/browser/vr/elements/screen_dimmer.h
similarity index 60%
rename from chrome/browser/android/vr_shell/ui_elements/screen_dimmer.h
rename to chrome/browser/vr/elements/screen_dimmer.h
index 47dbac1..dd1112a 100644
--- a/chrome/browser/android/vr_shell/ui_elements/screen_dimmer.h
+++ b/chrome/browser/vr/elements/screen_dimmer.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 CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_SCREEN_DIMMER_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_SCREEN_DIMMER_H_
+#ifndef CHROME_BROWSER_VR_ELEMENTS_SCREEN_DIMMER_H_
+#define CHROME_BROWSER_VR_ELEMENTS_SCREEN_DIMMER_H_
 
 #include "base/macros.h"
-#include "chrome/browser/android/vr_shell/ui_elements/ui_element.h"
+#include "chrome/browser/vr/elements/ui_element.h"
 
-namespace vr_shell {
+namespace vr {
 
 class ScreenDimmer : public UiElement {
  public:
@@ -24,6 +24,6 @@
   DISALLOW_COPY_AND_ASSIGN(ScreenDimmer);
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_SCREEN_DIMMER_H_
+#endif  // CHROME_BROWSER_VR_ELEMENTS_SCREEN_DIMMER_H_
diff --git a/chrome/browser/android/vr_shell/ui_elements/simple_textured_element.h b/chrome/browser/vr/elements/simple_textured_element.h
similarity index 68%
rename from chrome/browser/android/vr_shell/ui_elements/simple_textured_element.h
rename to chrome/browser/vr/elements/simple_textured_element.h
index c4467c9..9fe2fed 100644
--- a/chrome/browser/android/vr_shell/ui_elements/simple_textured_element.h
+++ b/chrome/browser/vr/elements/simple_textured_element.h
@@ -2,22 +2,22 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_SIMPLE_TEXTURED_ELEMENT_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_SIMPLE_TEXTURED_ELEMENT_H_
+#ifndef CHROME_BROWSER_VR_ELEMENTS_SIMPLE_TEXTURED_ELEMENT_H_
+#define CHROME_BROWSER_VR_ELEMENTS_SIMPLE_TEXTURED_ELEMENT_H_
 
 #include <memory>
 
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
-#include "chrome/browser/android/vr_shell/textures/exclusive_screen_toast_texture.h"
-#include "chrome/browser/android/vr_shell/textures/exit_warning_texture.h"
-#include "chrome/browser/android/vr_shell/textures/insecure_content_permanent_texture.h"
-#include "chrome/browser/android/vr_shell/textures/insecure_content_transient_texture.h"
-#include "chrome/browser/android/vr_shell/textures/ui_texture.h"
-#include "chrome/browser/android/vr_shell/ui_elements/textured_element.h"
-#include "chrome/browser/android/vr_shell/ui_elements/transience_manager.h"
+#include "chrome/browser/vr/elements/exclusive_screen_toast_texture.h"
+#include "chrome/browser/vr/elements/exit_warning_texture.h"
+#include "chrome/browser/vr/elements/insecure_content_permanent_texture.h"
+#include "chrome/browser/vr/elements/insecure_content_transient_texture.h"
+#include "chrome/browser/vr/elements/textured_element.h"
+#include "chrome/browser/vr/elements/transience_manager.h"
+#include "chrome/browser/vr/elements/ui_texture.h"
 
-namespace vr_shell {
+namespace vr {
 
 template <class T>
 class SimpleTexturedElement : public TexturedElement {
@@ -64,6 +64,6 @@
 typedef TransientSimpleTexturedElement<InsecureContentTransientTexture>
     TransientSecurityWarning;
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_SIMPLE_TEXTURED_ELEMENT_H_
+#endif  // CHROME_BROWSER_VR_ELEMENTS_SIMPLE_TEXTURED_ELEMENT_H_
diff --git a/chrome/browser/android/vr_shell/ui_elements/splash_screen_icon.cc b/chrome/browser/vr/elements/splash_screen_icon.cc
similarity index 75%
rename from chrome/browser/android/vr_shell/ui_elements/splash_screen_icon.cc
rename to chrome/browser/vr/elements/splash_screen_icon.cc
index dc67480..037fb44 100644
--- a/chrome/browser/android/vr_shell/ui_elements/splash_screen_icon.cc
+++ b/chrome/browser/vr/elements/splash_screen_icon.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/ui_elements/splash_screen_icon.h"
+#include "chrome/browser/vr/elements/splash_screen_icon.h"
 
 #include "base/memory/ptr_util.h"
-#include "chrome/browser/android/vr_shell/textures/splash_screen_icon_texture.h"
+#include "chrome/browser/vr/elements/splash_screen_icon_texture.h"
 
-namespace vr_shell {
+namespace vr {
 
 SplashScreenIcon::SplashScreenIcon(int preferred_width)
     : TexturedElement(preferred_width),
@@ -24,4 +24,4 @@
   return texture_.get();
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/ui_elements/splash_screen_icon.h b/chrome/browser/vr/elements/splash_screen_icon.h
similarity index 64%
rename from chrome/browser/android/vr_shell/ui_elements/splash_screen_icon.h
rename to chrome/browser/vr/elements/splash_screen_icon.h
index feaf6be..3de9af27e 100644
--- a/chrome/browser/android/vr_shell/ui_elements/splash_screen_icon.h
+++ b/chrome/browser/vr/elements/splash_screen_icon.h
@@ -2,17 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_SPLASH_SCREEN_ICON_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_SPLASH_SCREEN_ICON_H_
+#ifndef CHROME_BROWSER_VR_ELEMENTS_SPLASH_SCREEN_ICON_H_
+#define CHROME_BROWSER_VR_ELEMENTS_SPLASH_SCREEN_ICON_H_
 
 #include <memory>
 
 #include "base/macros.h"
-#include "chrome/browser/android/vr_shell/ui_elements/textured_element.h"
+#include "chrome/browser/vr/elements/textured_element.h"
 
 class SkBitmap;
 
-namespace vr_shell {
+namespace vr {
 
 class SplashScreenIconTexture;
 
@@ -31,6 +31,6 @@
   DISALLOW_COPY_AND_ASSIGN(SplashScreenIcon);
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_SPLASH_SCREEN_ICON_H_
+#endif  // CHROME_BROWSER_VR_ELEMENTS_SPLASH_SCREEN_ICON_H_
diff --git a/chrome/browser/android/vr_shell/textures/splash_screen_icon_texture.cc b/chrome/browser/vr/elements/splash_screen_icon_texture.cc
similarity index 88%
rename from chrome/browser/android/vr_shell/textures/splash_screen_icon_texture.cc
rename to chrome/browser/vr/elements/splash_screen_icon_texture.cc
index 6bc62a4..8cee70a5 100644
--- a/chrome/browser/android/vr_shell/textures/splash_screen_icon_texture.cc
+++ b/chrome/browser/vr/elements/splash_screen_icon_texture.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 "chrome/browser/android/vr_shell/textures/splash_screen_icon_texture.h"
+#include "chrome/browser/vr/elements/splash_screen_icon_texture.h"
 
 #include "ui/gfx/canvas.h"
 
-namespace vr_shell {
+namespace vr {
 
 SplashScreenIconTexture::SplashScreenIconTexture() = default;
 
@@ -35,4 +35,4 @@
   return size_;
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/textures/splash_screen_icon_texture.h b/chrome/browser/vr/elements/splash_screen_icon_texture.h
similarity index 67%
rename from chrome/browser/android/vr_shell/textures/splash_screen_icon_texture.h
rename to chrome/browser/vr/elements/splash_screen_icon_texture.h
index d2a4959..df9f984 100644
--- a/chrome/browser/android/vr_shell/textures/splash_screen_icon_texture.h
+++ b/chrome/browser/vr/elements/splash_screen_icon_texture.h
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_SPLASH_SCREEN_ICON_TEXTURE_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_SPLASH_SCREEN_ICON_TEXTURE_H_
+#ifndef CHROME_BROWSER_VR_ELEMENTS_SPLASH_SCREEN_ICON_TEXTURE_H_
+#define CHROME_BROWSER_VR_ELEMENTS_SPLASH_SCREEN_ICON_TEXTURE_H_
 
 #include "base/macros.h"
-#include "chrome/browser/android/vr_shell/textures/ui_texture.h"
+#include "chrome/browser/vr/elements/ui_texture.h"
 #include "third_party/skia/include/core/SkImage.h"
 
-namespace vr_shell {
+namespace vr {
 
 class SplashScreenIconTexture : public UiTexture {
  public:
@@ -29,6 +29,6 @@
   DISALLOW_COPY_AND_ASSIGN(SplashScreenIconTexture);
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_SPLASH_SCREEN_ICON_TEXTURE_H_
+#endif  // CHROME_BROWSER_VR_ELEMENTS_SPLASH_SCREEN_ICON_TEXTURE_H_
diff --git a/chrome/browser/android/vr_shell/ui_elements/system_indicator.cc b/chrome/browser/vr/elements/system_indicator.cc
similarity index 83%
rename from chrome/browser/android/vr_shell/ui_elements/system_indicator.cc
rename to chrome/browser/vr/elements/system_indicator.cc
index bc3a53a..d5691dc 100644
--- a/chrome/browser/android/vr_shell/ui_elements/system_indicator.cc
+++ b/chrome/browser/vr/elements/system_indicator.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/ui_elements/system_indicator.h"
+#include "chrome/browser/vr/elements/system_indicator.h"
 
 #include "base/memory/ptr_util.h"
-#include "chrome/browser/android/vr_shell/textures/system_indicator_texture.h"
+#include "chrome/browser/vr/elements/system_indicator_texture.h"
 
-namespace vr_shell {
+namespace vr {
 
 SystemIndicator::SystemIndicator(int preferred_width,
                                  float height_meters,
@@ -33,4 +33,4 @@
   return texture_.get();
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/ui_elements/system_indicator.h b/chrome/browser/vr/elements/system_indicator.h
similarity index 69%
rename from chrome/browser/android/vr_shell/ui_elements/system_indicator.h
rename to chrome/browser/vr/elements/system_indicator.h
index d103abb..8440765e 100644
--- a/chrome/browser/android/vr_shell/ui_elements/system_indicator.h
+++ b/chrome/browser/vr/elements/system_indicator.h
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_SYSTEM_INDICATOR_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_SYSTEM_INDICATOR_H_
+#ifndef CHROME_BROWSER_VR_ELEMENTS_SYSTEM_INDICATOR_H_
+#define CHROME_BROWSER_VR_ELEMENTS_SYSTEM_INDICATOR_H_
 
 #include <memory>
 
 #include "base/macros.h"
-#include "chrome/browser/android/vr_shell/ui_elements/textured_element.h"
+#include "chrome/browser/vr/elements/textured_element.h"
 #include "ui/gfx/vector_icon_types.h"
 
-namespace vr_shell {
+namespace vr {
 
 class UiTexture;
 
@@ -34,6 +34,6 @@
   DISALLOW_COPY_AND_ASSIGN(SystemIndicator);
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_SYSTEM_INDICATOR_H_
+#endif  // CHROME_BROWSER_VR_ELEMENTS_SYSTEM_INDICATOR_H_
diff --git a/chrome/browser/android/vr_shell/textures/system_indicator_texture.cc b/chrome/browser/vr/elements/system_indicator_texture.cc
similarity index 96%
rename from chrome/browser/android/vr_shell/textures/system_indicator_texture.cc
rename to chrome/browser/vr/elements/system_indicator_texture.cc
index d87c6b94..b92622a 100644
--- a/chrome/browser/android/vr_shell/textures/system_indicator_texture.cc
+++ b/chrome/browser/vr/elements/system_indicator_texture.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 "chrome/browser/android/vr_shell/textures/system_indicator_texture.h"
+#include "chrome/browser/vr/elements/system_indicator_texture.h"
 
 #include "base/strings/utf_string_conversions.h"
 #include "cc/paint/skia_paint_canvas.h"
@@ -15,7 +15,7 @@
 #include "ui/gfx/render_text.h"
 #include "ui/gfx/vector_icon_types.h"
 
-namespace vr_shell {
+namespace vr {
 
 namespace {
 
@@ -109,4 +109,4 @@
   return size_;
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/textures/system_indicator_texture.h b/chrome/browser/vr/elements/system_indicator_texture.h
similarity index 69%
rename from chrome/browser/android/vr_shell/textures/system_indicator_texture.h
rename to chrome/browser/vr/elements/system_indicator_texture.h
index ab03721..ea6fd86 100644
--- a/chrome/browser/android/vr_shell/textures/system_indicator_texture.h
+++ b/chrome/browser/vr/elements/system_indicator_texture.h
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_SYSTEM_INDICATOR_TEXTURE_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_SYSTEM_INDICATOR_TEXTURE_H_
+#ifndef CHROME_BROWSER_VR_ELEMENTS_SYSTEM_INDICATOR_TEXTURE_H_
+#define CHROME_BROWSER_VR_ELEMENTS_SYSTEM_INDICATOR_TEXTURE_H_
 
 #include "base/macros.h"
-#include "chrome/browser/android/vr_shell/textures/ui_texture.h"
+#include "chrome/browser/vr/elements/ui_texture.h"
 #include "ui/gfx/vector_icon_types.h"
 
-namespace vr_shell {
+namespace vr {
 
 class SystemIndicatorTexture : public UiTexture {
  public:
@@ -30,6 +30,6 @@
   DISALLOW_COPY_AND_ASSIGN(SystemIndicatorTexture);
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_SYSTEM_INDICATOR_TEXTURE_H_
+#endif  // CHROME_BROWSER_VR_ELEMENTS_SYSTEM_INDICATOR_TEXTURE_H_
diff --git a/chrome/browser/android/vr_shell/ui_elements/textured_element.cc b/chrome/browser/vr/elements/textured_element.cc
similarity index 91%
rename from chrome/browser/android/vr_shell/ui_elements/textured_element.cc
rename to chrome/browser/vr/elements/textured_element.cc
index afe2ae8..f15fcb4 100644
--- a/chrome/browser/android/vr_shell/ui_elements/textured_element.cc
+++ b/chrome/browser/vr/elements/textured_element.cc
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/ui_elements/textured_element.h"
+#include "chrome/browser/vr/elements/textured_element.h"
 
 #include "base/trace_event/trace_event.h"
 #include "cc/paint/skia_paint_canvas.h"
-#include "chrome/browser/android/vr_shell/textures/ui_texture.h"
-#include "chrome/browser/android/vr_shell/ui_element_renderer.h"
+#include "chrome/browser/vr/elements/ui_texture.h"
+#include "chrome/browser/vr/ui_element_renderer.h"
 #include "third_party/skia/include/core/SkSurface.h"
 #include "ui/gfx/geometry/rect_f.h"
 
-namespace vr_shell {
+namespace vr {
 
 TexturedElement::TexturedElement(int maximum_width)
     : texture_handle_(-1), maximum_width_(maximum_width) {}
@@ -82,4 +82,4 @@
   UpdateTexture();
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/ui_elements/textured_element.h b/chrome/browser/vr/elements/textured_element.h
similarity index 78%
rename from chrome/browser/android/vr_shell/ui_elements/textured_element.h
rename to chrome/browser/vr/elements/textured_element.h
index 848fe425..97b14e5 100644
--- a/chrome/browser/android/vr_shell/ui_elements/textured_element.h
+++ b/chrome/browser/vr/elements/textured_element.h
@@ -2,17 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_TEXTURED_ELEMENT_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_TEXTURED_ELEMENT_H_
+#ifndef CHROME_BROWSER_VR_ELEMENTS_TEXTURED_ELEMENT_H_
+#define CHROME_BROWSER_VR_ELEMENTS_TEXTURED_ELEMENT_H_
 
 #include "base/macros.h"
-#include "chrome/browser/android/vr_shell/ui_elements/ui_element.h"
+#include "chrome/browser/vr/elements/ui_element.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gl/gl_bindings.h"
 
 class SkSurface;
 
-namespace vr_shell {
+namespace vr {
 
 class UiTexture;
 
@@ -50,6 +50,6 @@
   DISALLOW_COPY_AND_ASSIGN(TexturedElement);
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_TEXTURED_ELEMENT_H_
+#endif  // CHROME_BROWSER_VR_ELEMENTS_TEXTURED_ELEMENT_H_
diff --git a/chrome/browser/android/vr_shell/ui_elements/transience_manager.cc b/chrome/browser/vr/elements/transience_manager.cc
similarity index 90%
rename from chrome/browser/android/vr_shell/ui_elements/transience_manager.cc
rename to chrome/browser/vr/elements/transience_manager.cc
index 94ce01e..40d1ff5a 100644
--- a/chrome/browser/android/vr_shell/ui_elements/transience_manager.cc
+++ b/chrome/browser/vr/elements/transience_manager.cc
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/ui_elements/transience_manager.h"
+#include "chrome/browser/vr/elements/transience_manager.h"
 
-namespace vr_shell {
+namespace vr {
 
 TransienceManager::TransienceManager(UiElement* element,
                                      const base::TimeDelta& timeout)
@@ -49,4 +49,4 @@
   element_->set_visible(false);
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/ui_elements/transience_manager.h b/chrome/browser/vr/elements/transience_manager.h
similarity index 66%
rename from chrome/browser/android/vr_shell/ui_elements/transience_manager.h
rename to chrome/browser/vr/elements/transience_manager.h
index b248f479..0d5434c36c 100644
--- a/chrome/browser/android/vr_shell/ui_elements/transience_manager.h
+++ b/chrome/browser/vr/elements/transience_manager.h
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_TRANSIENCE_MANAGER_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_TRANSIENCE_MANAGER_H_
+#ifndef CHROME_BROWSER_VR_ELEMENTS_TRANSIENCE_MANAGER_H_
+#define CHROME_BROWSER_VR_ELEMENTS_TRANSIENCE_MANAGER_H_
 
 #include <memory>
 
 #include "base/macros.h"
 #include "base/timer/timer.h"
-#include "chrome/browser/android/vr_shell/ui_elements/ui_element.h"
+#include "chrome/browser/vr/elements/ui_element.h"
 
-namespace vr_shell {
+namespace vr {
 
 class TransienceManager {
  public:
@@ -32,6 +32,6 @@
   base::OneShotTimer visibility_timer_;
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_TRANSIENCE_MANAGER_H_
+#endif  // CHROME_BROWSER_VR_ELEMENTS_TRANSIENCE_MANAGER_H_
diff --git a/chrome/browser/android/vr_shell/ui_elements/transience_manager_unittest.cc b/chrome/browser/vr/elements/transience_manager_unittest.cc
similarity index 90%
rename from chrome/browser/android/vr_shell/ui_elements/transience_manager_unittest.cc
rename to chrome/browser/vr/elements/transience_manager_unittest.cc
index 6fc1e72..dea1519d 100644
--- a/chrome/browser/android/vr_shell/ui_elements/transience_manager_unittest.cc
+++ b/chrome/browser/vr/elements/transience_manager_unittest.cc
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/ui_elements/transience_manager.h"
+#include "chrome/browser/vr/elements/transience_manager.h"
 
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
 #include "base/test/scoped_mock_time_message_loop_task_runner.h"
-#include "chrome/browser/android/vr_shell/ui_elements/ui_element.h"
+#include "chrome/browser/vr/elements/ui_element.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace vr_shell {
+namespace vr {
 
 TEST(TransienceManager, Visibility) {
   base::MessageLoop message_loop_;
@@ -56,4 +56,4 @@
   EXPECT_EQ(element.visible(), false);
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/ui_elements/transient_url_bar.cc b/chrome/browser/vr/elements/transient_url_bar.cc
similarity index 81%
rename from chrome/browser/android/vr_shell/ui_elements/transient_url_bar.cc
rename to chrome/browser/vr/elements/transient_url_bar.cc
index ad4c4e5..8909e29 100644
--- a/chrome/browser/android/vr_shell/ui_elements/transient_url_bar.cc
+++ b/chrome/browser/vr/elements/transient_url_bar.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/ui_elements/transient_url_bar.h"
+#include "chrome/browser/vr/elements/transient_url_bar.h"
 
 #include "base/memory/ptr_util.h"
-#include "chrome/browser/android/vr_shell/textures/url_bar_texture.h"
+#include "chrome/browser/vr/elements/url_bar_texture.h"
 
-namespace vr_shell {
+namespace vr {
 
 TransientUrlBar::TransientUrlBar(
     int preferred_width,
@@ -31,4 +31,4 @@
   texture_->SetToolbarState(state);
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/ui_elements/transient_url_bar.h b/chrome/browser/vr/elements/transient_url_bar.h
similarity index 67%
rename from chrome/browser/android/vr_shell/ui_elements/transient_url_bar.h
rename to chrome/browser/vr/elements/transient_url_bar.h
index b28d1662..c7c8ec7 100644
--- a/chrome/browser/android/vr_shell/ui_elements/transient_url_bar.h
+++ b/chrome/browser/vr/elements/transient_url_bar.h
@@ -2,21 +2,21 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_TRANSIENT_URL_BAR_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_TRANSIENT_URL_BAR_H_
+#ifndef CHROME_BROWSER_VR_ELEMENTS_TRANSIENT_URL_BAR_H_
+#define CHROME_BROWSER_VR_ELEMENTS_TRANSIENT_URL_BAR_H_
 
 #include <memory>
 
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/time/time.h"
-#include "chrome/browser/android/vr_shell/ui_elements/textured_element.h"
-#include "chrome/browser/android/vr_shell/ui_elements/transience_manager.h"
-#include "chrome/browser/android/vr_shell/ui_unsupported_mode.h"
+#include "chrome/browser/vr/elements/textured_element.h"
+#include "chrome/browser/vr/elements/transience_manager.h"
+#include "chrome/browser/vr/ui_unsupported_mode.h"
 #include "components/security_state/core/security_state.h"
 #include "url/gurl.h"
 
-namespace vr_shell {
+namespace vr {
 
 class UrlBarTexture;
 struct ToolbarState;
@@ -44,6 +44,6 @@
   DISALLOW_COPY_AND_ASSIGN(TransientUrlBar);
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_TRANSIENT_URL_BAR_H_
+#endif  // CHROME_BROWSER_VR_ELEMENTS_TRANSIENT_URL_BAR_H_
diff --git a/chrome/browser/android/vr_shell/ui_elements/ui_element.cc b/chrome/browser/vr/elements/ui_element.cc
similarity index 96%
rename from chrome/browser/android/vr_shell/ui_elements/ui_element.cc
rename to chrome/browser/vr/elements/ui_element.cc
index 3183a159..0ddc77d 100644
--- a/chrome/browser/android/vr_shell/ui_elements/ui_element.cc
+++ b/chrome/browser/vr/elements/ui_element.cc
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/ui_elements/ui_element.h"
+#include "chrome/browser/vr/elements/ui_element.h"
 
 #include <limits>
 
 #include "base/logging.h"
 #include "base/time/time.h"
-#include "chrome/browser/android/vr_shell/animation.h"
-#include "chrome/browser/android/vr_shell/easing.h"
+#include "chrome/browser/vr/animation.h"
+#include "chrome/browser/vr/easing.h"
 
-namespace vr_shell {
+namespace vr {
 
 namespace {
 
@@ -206,4 +206,4 @@
 
 void UiElement::OnSetMode() {}
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/ui_elements/ui_element.h b/chrome/browser/vr/elements/ui_element.h
similarity index 96%
rename from chrome/browser/android/vr_shell/ui_elements/ui_element.h
rename to chrome/browser/vr/elements/ui_element.h
index 140677b9..faf88f7 100644
--- a/chrome/browser/android/vr_shell/ui_elements/ui_element.h
+++ b/chrome/browser/vr/elements/ui_element.h
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_UI_ELEMENT_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_UI_ELEMENT_H_
+#ifndef CHROME_BROWSER_VR_ELEMENTS_UI_ELEMENT_H_
+#define CHROME_BROWSER_VR_ELEMENTS_UI_ELEMENT_H_
 
 #include <memory>
 #include <string>
 #include <vector>
 
 #include "base/macros.h"
-#include "chrome/browser/android/vr_shell/color_scheme.h"
-#include "chrome/browser/android/vr_shell/ui_elements/ui_element_debug_id.h"
+#include "chrome/browser/vr/color_scheme.h"
+#include "chrome/browser/vr/elements/ui_element_debug_id.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/gfx/geometry/point3_f.h"
 #include "ui/gfx/geometry/quaternion.h"
@@ -22,7 +22,7 @@
 class TimeTicks;
 }
 
-namespace vr_shell {
+namespace vr {
 
 class Animation;
 class UiElementRenderer;
@@ -329,6 +329,6 @@
   DISALLOW_COPY_AND_ASSIGN(UiElement);
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_UI_ELEMENT_H_
+#endif  // CHROME_BROWSER_VR_ELEMENTS_UI_ELEMENT_H_
diff --git a/chrome/browser/android/vr_shell/ui_elements/ui_element_debug_id.h b/chrome/browser/vr/elements/ui_element_debug_id.h
similarity index 73%
rename from chrome/browser/android/vr_shell/ui_elements/ui_element_debug_id.h
rename to chrome/browser/vr/elements/ui_element_debug_id.h
index 7051e44c..51d6668f 100644
--- a/chrome/browser/android/vr_shell/ui_elements/ui_element_debug_id.h
+++ b/chrome/browser/vr/elements/ui_element_debug_id.h
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_UI_ELEMENT_DEBUG_ID_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_UI_ELEMENT_DEBUG_ID_H_
+#ifndef CHROME_BROWSER_VR_ELEMENTS_UI_ELEMENT_DEBUG_ID_H_
+#define CHROME_BROWSER_VR_ELEMENTS_UI_ELEMENT_DEBUG_ID_H_
 
-namespace vr_shell {
+namespace vr {
 
 // These identifiers may be used by UI elements to tag themselves for purposes
 // of testing or debugging.
@@ -34,6 +34,6 @@
   kBluetoothConnectedIndicator,
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_UI_ELEMENT_DEBUG_ID_H_
+#endif  // CHROME_BROWSER_VR_ELEMENTS_UI_ELEMENT_DEBUG_ID_H_
diff --git a/chrome/browser/android/vr_shell/ui_elements/ui_element_unittest.cc b/chrome/browser/vr/elements/ui_element_unittest.cc
similarity index 96%
rename from chrome/browser/android/vr_shell/ui_elements/ui_element_unittest.cc
rename to chrome/browser/vr/elements/ui_element_unittest.cc
index e6ecdbb0..eb22978 100644
--- a/chrome/browser/android/vr_shell/ui_elements/ui_element_unittest.cc
+++ b/chrome/browser/vr/elements/ui_element_unittest.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/ui_elements/ui_element.h"
+#include "chrome/browser/vr/elements/ui_element.h"
 
 #include <utility>
 
 #include "base/macros.h"
-#include "chrome/browser/android/vr_shell/animation.h"
-#include "chrome/browser/android/vr_shell/easing.h"
+#include "chrome/browser/vr/animation.h"
+#include "chrome/browser/vr/easing.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 #define EXPECT_VEC3F_EQ(a, b)    \
@@ -28,7 +28,7 @@
   EXPECT_FLOAT_EQ(a.z(), b.z()); \
   EXPECT_FLOAT_EQ(a.w(), b.w());
 
-namespace vr_shell {
+namespace vr {
 
 namespace {
 
@@ -165,4 +165,4 @@
   EXPECT_VEC3F_EQ(gfx::Vector3dF(50, 500, 5000), rect.translation());
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/textures/ui_texture.cc b/chrome/browser/vr/elements/ui_texture.cc
similarity index 96%
rename from chrome/browser/android/vr_shell/textures/ui_texture.cc
rename to chrome/browser/vr/elements/ui_texture.cc
index 26434c88..e34fb11 100644
--- a/chrome/browser/android/vr_shell/textures/ui_texture.cc
+++ b/chrome/browser/vr/elements/ui_texture.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 "chrome/browser/android/vr_shell/textures/ui_texture.h"
+#include "chrome/browser/vr/elements/ui_texture.h"
 
 #include <set>
 #include <string>
@@ -13,7 +13,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/strings/string_util.h"
 #include "base/trace_event/trace_event.h"
-#include "chrome/browser/android/vr_shell/font_fallback.h"
+#include "chrome/browser/vr/font_fallback.h"
 #include "third_party/icu/source/common/unicode/uscript.h"
 #include "third_party/skia/include/core/SkCanvas.h"
 #include "ui/gfx/canvas.h"
@@ -22,7 +22,7 @@
 #include "ui/gfx/text_elider.h"
 #include "ui/gl/gl_bindings.h"
 
-namespace vr_shell {
+namespace vr {
 
 namespace {
 
@@ -207,4 +207,4 @@
   force_font_fallback_failure_for_testing_ = force;
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/textures/ui_texture.h b/chrome/browser/vr/elements/ui_texture.h
similarity index 89%
rename from chrome/browser/android/vr_shell/textures/ui_texture.h
rename to chrome/browser/vr/elements/ui_texture.h
index 4f5e008..9bb77c58 100644
--- a/chrome/browser/android/vr_shell/textures/ui_texture.h
+++ b/chrome/browser/vr/elements/ui_texture.h
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_UI_TEXTURE_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_UI_TEXTURE_H_
+#ifndef CHROME_BROWSER_VR_ELEMENTS_UI_TEXTURE_H_
+#define CHROME_BROWSER_VR_ELEMENTS_UI_TEXTURE_H_
 
 #include <memory>
 #include <vector>
 
 #include "base/macros.h"
 #include "base/strings/string16.h"
-#include "chrome/browser/android/vr_shell/color_scheme.h"
+#include "chrome/browser/vr/color_scheme.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/size.h"
@@ -26,7 +26,7 @@
 
 }  // namespace gfx
 
-namespace vr_shell {
+namespace vr {
 
 class UiTexture {
  public:
@@ -97,6 +97,6 @@
   DISALLOW_COPY_AND_ASSIGN(UiTexture);
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_UI_TEXTURE_H_
+#endif  // CHROME_BROWSER_VR_ELEMENTS_UI_TEXTURE_H_
diff --git a/chrome/browser/android/vr_shell/ui_elements/url_bar.cc b/chrome/browser/vr/elements/url_bar.cc
similarity index 92%
rename from chrome/browser/android/vr_shell/ui_elements/url_bar.cc
rename to chrome/browser/vr/elements/url_bar.cc
index 18369ad..8544006 100644
--- a/chrome/browser/android/vr_shell/ui_elements/url_bar.cc
+++ b/chrome/browser/vr/elements/url_bar.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/ui_elements/url_bar.h"
+#include "chrome/browser/vr/elements/url_bar.h"
 
 #include "base/memory/ptr_util.h"
-#include "chrome/browser/android/vr_shell/textures/url_bar_texture.h"
+#include "chrome/browser/vr/elements/url_bar_texture.h"
 
-namespace vr_shell {
+namespace vr {
 
 UrlBar::UrlBar(int preferred_width,
                const base::Callback<void()>& back_button_callback,
@@ -77,4 +77,4 @@
   UpdateTexture();
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/ui_elements/url_bar.h b/chrome/browser/vr/elements/url_bar.h
similarity index 79%
rename from chrome/browser/android/vr_shell/ui_elements/url_bar.h
rename to chrome/browser/vr/elements/url_bar.h
index d7651bbd..8240f38 100644
--- a/chrome/browser/android/vr_shell/ui_elements/url_bar.h
+++ b/chrome/browser/vr/elements/url_bar.h
@@ -2,20 +2,20 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_URL_BAR_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_URL_BAR_H_
+#ifndef CHROME_BROWSER_VR_ELEMENTS_URL_BAR_H_
+#define CHROME_BROWSER_VR_ELEMENTS_URL_BAR_H_
 
 #include <memory>
 
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/time/time.h"
-#include "chrome/browser/android/vr_shell/ui_elements/textured_element.h"
-#include "chrome/browser/android/vr_shell/ui_unsupported_mode.h"
+#include "chrome/browser/vr/elements/textured_element.h"
+#include "chrome/browser/vr/ui_unsupported_mode.h"
 #include "components/security_state/core/security_state.h"
 #include "url/gurl.h"
 
-namespace vr_shell {
+namespace vr {
 
 class UrlBarTexture;
 struct ToolbarState;
@@ -52,6 +52,6 @@
   DISALLOW_COPY_AND_ASSIGN(UrlBar);
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENTS_URL_BAR_H_
+#endif  // CHROME_BROWSER_VR_ELEMENTS_URL_BAR_H_
diff --git a/chrome/browser/android/vr_shell/textures/url_bar_texture.cc b/chrome/browser/vr/elements/url_bar_texture.cc
similarity index 96%
rename from chrome/browser/android/vr_shell/textures/url_bar_texture.cc
rename to chrome/browser/vr/elements/url_bar_texture.cc
index 5b35f4f..687caa0d 100644
--- a/chrome/browser/android/vr_shell/textures/url_bar_texture.cc
+++ b/chrome/browser/vr/elements/url_bar_texture.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/textures/url_bar_texture.h"
+#include "chrome/browser/vr/elements/url_bar_texture.h"
 
 #include "base/strings/utf_string_conversions.h"
 #include "cc/paint/skia_paint_canvas.h"
-#include "chrome/browser/android/vr_shell/color_scheme.h"
-#include "chrome/browser/android/vr_shell/textures/render_text_wrapper.h"
+#include "chrome/browser/vr/color_scheme.h"
+#include "chrome/browser/vr/elements/render_text_wrapper.h"
 #include "components/url_formatter/url_formatter.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/font.h"
@@ -18,7 +18,7 @@
 #include "ui/gfx/render_text.h"
 #include "ui/vector_icons/vector_icons.h"
 
-namespace vr_shell {
+namespace vr {
 
 namespace {
 
@@ -65,7 +65,7 @@
                       : GetSchemeColor(level, color_scheme);
 }
 
-void setEmphasis(vr_shell::RenderTextWrapper* render_text,
+void setEmphasis(vr::RenderTextWrapper* render_text,
                  bool emphasis,
                  const gfx::Range& range,
                  const ColorScheme& color_scheme) {
@@ -87,8 +87,7 @@
 UrlBarTexture::UrlBarTexture(
     bool web_vr,
     const base::Callback<void(UiUnsupportedMode)>& failure_callback)
-    : has_back_button_(!web_vr),
-      failure_callback_(failure_callback) {}
+    : has_back_button_(!web_vr), failure_callback_(failure_callback) {}
 
 UrlBarTexture::~UrlBarTexture() = default;
 
@@ -350,7 +349,7 @@
     failure_callback_.Run(UiUnsupportedMode::kCouldNotElideURL);
   }
 
-  vr_shell::RenderTextWrapper vr_render_text(render_text.get());
+  vr::RenderTextWrapper vr_render_text(render_text.get());
   ApplyUrlStyling(text, parsed, state_.security_level, &vr_render_text,
                   color_scheme());
 
@@ -364,7 +363,7 @@
     const base::string16& formatted_url,
     const url::Parsed& parsed,
     const security_state::SecurityLevel security_level,
-    vr_shell::RenderTextWrapper* render_text,
+    vr::RenderTextWrapper* render_text,
     const ColorScheme& color_scheme) {
   const url::Component& scheme = parsed.scheme;
   const url::Component& host = parsed.host;
@@ -433,4 +432,4 @@
   return size_;
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/textures/url_bar_texture.h b/chrome/browser/vr/elements/url_bar_texture.h
similarity index 81%
rename from chrome/browser/android/vr_shell/textures/url_bar_texture.h
rename to chrome/browser/vr/elements/url_bar_texture.h
index ed721e5..58e88d5 100644
--- a/chrome/browser/android/vr_shell/textures/url_bar_texture.h
+++ b/chrome/browser/vr/elements/url_bar_texture.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 CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_URL_BAR_TEXTURE_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_URL_BAR_TEXTURE_H_
+#ifndef CHROME_BROWSER_VR_ELEMENTS_URL_BAR_TEXTURE_H_
+#define CHROME_BROWSER_VR_ELEMENTS_URL_BAR_TEXTURE_H_
 
 #include <memory>
 #include <vector>
@@ -11,10 +11,10 @@
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/android/vr_shell/textures/ui_texture.h"
-#include "chrome/browser/android/vr_shell/toolbar_state.h"
-#include "chrome/browser/android/vr_shell/ui_interface.h"
-#include "chrome/browser/android/vr_shell/ui_unsupported_mode.h"
+#include "chrome/browser/vr/elements/ui_texture.h"
+#include "chrome/browser/vr/toolbar_state.h"
+#include "chrome/browser/vr/ui_interface.h"
+#include "chrome/browser/vr/ui_unsupported_mode.h"
 #include "components/security_state/core/security_state.h"
 #include "ui/gfx/geometry/rect_f.h"
 #include "url/gurl.h"
@@ -24,7 +24,7 @@
 class RenderText;
 }  // namespace gfx
 
-namespace vr_shell {
+namespace vr {
 
 class RenderTextWrapper;
 struct ColorScheme;
@@ -57,7 +57,7 @@
   static void ApplyUrlStyling(const base::string16& formatted_url,
                               const url::Parsed& parsed,
                               security_state::SecurityLevel security_level,
-                              vr_shell::RenderTextWrapper* render_text,
+                              vr::RenderTextWrapper* render_text,
                               const ColorScheme& color_scheme);
 
   std::unique_ptr<gfx::RenderText> url_render_text_;
@@ -89,6 +89,6 @@
   DISALLOW_COPY_AND_ASSIGN(UrlBarTexture);
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_TEXTURES_URL_BAR_TEXTURE_H_
+#endif  // CHROME_BROWSER_VR_ELEMENTS_URL_BAR_TEXTURE_H_
diff --git a/chrome/browser/android/vr_shell/textures/url_bar_texture_unittest.cc b/chrome/browser/vr/elements/url_bar_texture_unittest.cc
similarity index 96%
rename from chrome/browser/android/vr_shell/textures/url_bar_texture_unittest.cc
rename to chrome/browser/vr/elements/url_bar_texture_unittest.cc
index f9701a40..1f36bee 100644
--- a/chrome/browser/android/vr_shell/textures/url_bar_texture_unittest.cc
+++ b/chrome/browser/vr/elements/url_bar_texture_unittest.cc
@@ -2,14 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/textures/url_bar_texture.h"
+#include "chrome/browser/vr/elements/url_bar_texture.h"
 
 #include "base/bind.h"
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/android/vr_shell/textures/render_text_wrapper.h"
-#include "chrome/browser/android/vr_shell/toolbar_state.h"
+#include "build/build_config.h"
+#include "chrome/browser/vr/elements/render_text_wrapper.h"
+#include "chrome/browser/vr/toolbar_state.h"
 #include "components/security_state/core/security_state.h"
 #include "components/toolbar/vector_icons.h"
 #include "components/url_formatter/url_formatter.h"
@@ -22,7 +23,7 @@
 
 using security_state::SecurityLevel;
 
-namespace vr_shell {
+namespace vr {
 
 // TODO(cjgrant): Use ColorScheme instead of hardcoded values
 // where it makes sense.
@@ -59,7 +60,7 @@
   static void TestUrlStyling(const base::string16& formatted_url,
                              const url::Parsed& parsed,
                              security_state::SecurityLevel security_level,
-                             vr_shell::RenderTextWrapper* render_text,
+                             vr::RenderTextWrapper* render_text,
                              const ColorScheme& color_scheme) {
     ApplyUrlStyling(formatted_url, parsed, security_level, render_text,
                     color_scheme);
@@ -292,4 +293,4 @@
   EXPECT_EQ(UiUnsupportedMode::kCount, texture.unsupported_mode());
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/font_fallback.cc b/chrome/browser/vr/font_fallback.cc
similarity index 97%
rename from chrome/browser/android/vr_shell/font_fallback.cc
rename to chrome/browser/vr/font_fallback.cc
index 5c0f997..bd5fee5 100644
--- a/chrome/browser/android/vr_shell/font_fallback.cc
+++ b/chrome/browser/vr/font_fallback.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 "chrome/browser/android/vr_shell/font_fallback.h"
+#include "chrome/browser/vr/font_fallback.h"
 
 #include <map>
 #include <set>
@@ -17,7 +17,7 @@
 #include "third_party/skia/include/ports/SkFontMgr.h"
 #include "ui/gfx/platform_font_linux.h"
 
-namespace vr_shell {
+namespace vr {
 
 namespace {
 
@@ -150,4 +150,4 @@
   return cached_font_set.GetFallbackFontNameForChar(c, font_name);
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/font_fallback.h b/chrome/browser/vr/font_fallback.h
similarity index 83%
rename from chrome/browser/android/vr_shell/font_fallback.h
rename to chrome/browser/vr/font_fallback.h
index c0104aa1..72738bb 100644
--- a/chrome/browser/android/vr_shell/font_fallback.h
+++ b/chrome/browser/vr/font_fallback.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 CHROME_BROWSER_ANDROID_VR_SHELL_FONT_FALLBACK_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_FONT_FALLBACK_H_
+#ifndef CHROME_BROWSER_VR_FONT_FALLBACK_H_
+#define CHROME_BROWSER_VR_FONT_FALLBACK_H_
 
 #include <string>
 
@@ -13,7 +13,7 @@
 class Font;
 }  // namespace gfx
 
-namespace vr_shell {
+namespace vr {
 
 // Return a font name which provides a glyph for the Unicode code point
 // specified by character.
@@ -36,6 +36,6 @@
                                 const std::string& preferred_locale,
                                 std::string* font_name);
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_FONT_FALLBACK_H_
+#endif  // CHROME_BROWSER_VR_FONT_FALLBACK_H_
diff --git a/chrome/browser/android/vr_shell/fps_meter.cc b/chrome/browser/vr/fps_meter.cc
similarity index 94%
rename from chrome/browser/android/vr_shell/fps_meter.cc
rename to chrome/browser/vr/fps_meter.cc
index c6d03126..c4a79526 100644
--- a/chrome/browser/android/vr_shell/fps_meter.cc
+++ b/chrome/browser/vr/fps_meter.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 "chrome/browser/android/vr_shell/fps_meter.h"
+#include "chrome/browser/vr/fps_meter.h"
 
 #include <algorithm>
 
-namespace vr_shell {
+namespace vr {
 
 namespace {
 
@@ -84,4 +84,4 @@
   return values_.GetSum() / values_.GetCount();
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/fps_meter.h b/chrome/browser/vr/fps_meter.h
similarity index 86%
rename from chrome/browser/android/vr_shell/fps_meter.h
rename to chrome/browser/vr/fps_meter.h
index 86da976..4fd90821 100644
--- a/chrome/browser/android/vr_shell/fps_meter.h
+++ b/chrome/browser/vr/fps_meter.h
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_FPS_METER_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_FPS_METER_H_
+#ifndef CHROME_BROWSER_VR_FPS_METER_H_
+#define CHROME_BROWSER_VR_FPS_METER_H_
 
 #include <vector>
 
 #include "base/macros.h"
 #include "base/time/time.h"
 
-namespace vr_shell {
+namespace vr {
 
 class SampleQueue {
  public:
@@ -68,6 +68,6 @@
   SampleQueue values_;
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_FPS_METER_H_
+#endif  // CHROME_BROWSER_VR_FPS_METER_H_
diff --git a/chrome/browser/android/vr_shell/fps_meter_unittest.cc b/chrome/browser/vr/fps_meter_unittest.cc
similarity index 96%
rename from chrome/browser/android/vr_shell/fps_meter_unittest.cc
rename to chrome/browser/vr/fps_meter_unittest.cc
index 18403f3..481086b 100644
--- a/chrome/browser/android/vr_shell/fps_meter_unittest.cc
+++ b/chrome/browser/vr/fps_meter_unittest.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/fps_meter.h"
+#include "chrome/browser/vr/fps_meter.h"
 
 #include "base/macros.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace vr_shell {
+namespace vr {
 
 namespace {
 
@@ -110,4 +110,4 @@
   EXPECT_EQ(30, meter.GetAverage());
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/gltf_asset.cc b/chrome/browser/vr/gltf_asset.cc
similarity index 95%
rename from chrome/browser/android/vr_shell/gltf_asset.cc
rename to chrome/browser/vr/gltf_asset.cc
index 752cd7cb..4591715 100644
--- a/chrome/browser/android/vr_shell/gltf_asset.cc
+++ b/chrome/browser/vr/gltf_asset.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/gltf_asset.h"
+#include "chrome/browser/vr/gltf_asset.h"
 
 #include <unordered_map>
 
 #include "base/logging.h"
 
-namespace vr_shell {
+namespace vr {
 
 namespace gltf {
 
@@ -115,4 +115,4 @@
 
 }  // namespace gltf
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/gltf_asset.h b/chrome/browser/vr/gltf_asset.h
similarity index 92%
rename from chrome/browser/android/vr_shell/gltf_asset.h
rename to chrome/browser/vr/gltf_asset.h
index 599c02f..45bbc5d 100644
--- a/chrome/browser/android/vr_shell/gltf_asset.h
+++ b/chrome/browser/vr/gltf_asset.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 CHROME_BROWSER_ANDROID_VR_SHELL_GLTF_ASSET_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_GLTF_ASSET_H_
+#ifndef CHROME_BROWSER_VR_GLTF_ASSET_H_
+#define CHROME_BROWSER_VR_GLTF_ASSET_H_
 
 #include <map>
 #include <memory>
@@ -12,7 +12,7 @@
 
 #include "ui/gl/gl_bindings.h"
 
-namespace vr_shell {
+namespace vr {
 
 namespace gltf {
 
@@ -119,6 +119,6 @@
 
 }  // namespace gltf
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_GLTF_ASSET_H_
+#endif  // CHROME_BROWSER_VR_GLTF_ASSET_H_
diff --git a/chrome/browser/android/vr_shell/gltf_parser.cc b/chrome/browser/vr/gltf_parser.cc
similarity index 98%
rename from chrome/browser/android/vr_shell/gltf_parser.cc
rename to chrome/browser/vr/gltf_parser.cc
index 210afcd..b5e8aa2 100644
--- a/chrome/browser/android/vr_shell/gltf_parser.cc
+++ b/chrome/browser/vr/gltf_parser.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 "chrome/browser/android/vr_shell/gltf_parser.h"
+#include "chrome/browser/vr/gltf_parser.h"
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
@@ -18,7 +18,7 @@
 #include "net/base/filename_util.h"
 #include "url/gurl.h"
 
-namespace vr_shell {
+namespace vr {
 
 namespace {
 constexpr const char kFailedtoReadBinaryGltfMsg[] =
@@ -428,4 +428,4 @@
   return gltf_asset;
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/gltf_parser.h b/chrome/browser/vr/gltf_parser.h
similarity index 91%
rename from chrome/browser/android/vr_shell/gltf_parser.h
rename to chrome/browser/vr/gltf_parser.h
index 3c4406f..8d9931c3 100644
--- a/chrome/browser/android/vr_shell/gltf_parser.h
+++ b/chrome/browser/vr/gltf_parser.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 CHROME_BROWSER_ANDROID_VR_SHELL_GLTF_PARSER_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_GLTF_PARSER_H_
+#ifndef CHROME_BROWSER_VR_GLTF_PARSER_H_
+#define CHROME_BROWSER_VR_GLTF_PARSER_H_
 
 #include <memory>
 #include <string>
@@ -11,9 +11,9 @@
 
 #include "base/files/file_path.h"
 #include "base/values.h"
-#include "chrome/browser/android/vr_shell/gltf_asset.h"
+#include "chrome/browser/vr/gltf_asset.h"
 
-namespace vr_shell {
+namespace vr {
 
 // Parser for glTF 1.0 specification
 // https://github.com/KhronosGroup/glTF/tree/master/specification/1.0
@@ -77,6 +77,6 @@
       const base::FilePath& path = base::FilePath());
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_GLTF_PARSER_H_
+#endif  // CHROME_BROWSER_VR_GLTF_PARSER_H_
diff --git a/chrome/browser/android/vr_shell/gltf_parser_unittest.cc b/chrome/browser/vr/gltf_parser_unittest.cc
similarity index 97%
rename from chrome/browser/android/vr_shell/gltf_parser_unittest.cc
rename to chrome/browser/vr/gltf_parser_unittest.cc
index 657bcd34..c1ffa435 100644
--- a/chrome/browser/android/vr_shell/gltf_parser_unittest.cc
+++ b/chrome/browser/vr/gltf_parser_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 "chrome/browser/android/vr_shell/gltf_parser.h"
+#include "chrome/browser/vr/gltf_parser.h"
 
 #include <memory>
 
@@ -11,10 +11,10 @@
 #include "base/json/json_file_value_serializer.h"
 #include "base/memory/ptr_util.h"
 #include "base/values.h"
-#include "chrome/browser/android/vr_shell/test/paths.h"
+#include "chrome/browser/vr/test/paths.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace vr_shell {
+namespace vr {
 
 class DataDrivenTest : public testing::Test {
  protected:
@@ -173,4 +173,4 @@
   EXPECT_EQ(0, buffer_view->buffer);
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/run_all_unittests.cc b/chrome/browser/vr/run_all_unittests.cc
similarity index 97%
rename from chrome/browser/android/vr_shell/run_all_unittests.cc
rename to chrome/browser/vr/run_all_unittests.cc
index 7c615de..9cfe7d8 100644
--- a/chrome/browser/android/vr_shell/run_all_unittests.cc
+++ b/chrome/browser/vr/run_all_unittests.cc
@@ -7,6 +7,7 @@
 #include "base/path_service.h"
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/test/test_suite.h"
+#include "build/build_config.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/base/ui_base_paths.h"
 
diff --git a/chrome/browser/android/vr_shell/test/data/sample.bin b/chrome/browser/vr/test/data/sample.bin
similarity index 100%
rename from chrome/browser/android/vr_shell/test/data/sample.bin
rename to chrome/browser/vr/test/data/sample.bin
diff --git a/chrome/browser/android/vr_shell/test/data/sample.glb b/chrome/browser/vr/test/data/sample.glb
similarity index 100%
rename from chrome/browser/android/vr_shell/test/data/sample.glb
rename to chrome/browser/vr/test/data/sample.glb
Binary files differ
diff --git a/chrome/browser/android/vr_shell/test/data/sample_external.gltf b/chrome/browser/vr/test/data/sample_external.gltf
similarity index 100%
rename from chrome/browser/android/vr_shell/test/data/sample_external.gltf
rename to chrome/browser/vr/test/data/sample_external.gltf
diff --git a/chrome/browser/android/vr_shell/test/data/sample_inline.gltf b/chrome/browser/vr/test/data/sample_inline.gltf
similarity index 100%
rename from chrome/browser/android/vr_shell/test/data/sample_inline.gltf
rename to chrome/browser/vr/test/data/sample_inline.gltf
diff --git a/chrome/browser/android/vr_shell/test/paths.cc b/chrome/browser/vr/test/paths.cc
similarity index 77%
rename from chrome/browser/android/vr_shell/test/paths.cc
rename to chrome/browser/vr/test/paths.cc
index b06cabd..068921f 100644
--- a/chrome/browser/android/vr_shell/test/paths.cc
+++ b/chrome/browser/vr/test/paths.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/test/paths.h"
+#include "chrome/browser/vr/test/paths.h"
 
 #include "base/files/file_util.h"
 #include "base/path_service.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace vr_shell {
+namespace vr {
 namespace test {
 
 void GetTestDataPath(base::FilePath* result) {
@@ -16,8 +16,7 @@
   ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &path));
   path = path.Append(FILE_PATH_LITERAL("chrome"))
              .Append(FILE_PATH_LITERAL("browser"))
-             .Append(FILE_PATH_LITERAL("android"))
-             .Append(FILE_PATH_LITERAL("vr_shell"))
+             .Append(FILE_PATH_LITERAL("vr"))
              .Append(FILE_PATH_LITERAL("test"))
              .Append(FILE_PATH_LITERAL("data"));
   ASSERT_TRUE(base::PathExists(path));
@@ -25,4 +24,4 @@
 }
 
 }  // namespace test
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/vr/test/paths.h b/chrome/browser/vr/test/paths.h
new file mode 100644
index 0000000..4a14a92
--- /dev/null
+++ b/chrome/browser/vr/test/paths.h
@@ -0,0 +1,18 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_VR_TEST_PATHS_H_
+#define CHROME_BROWSER_VR_TEST_PATHS_H_
+
+#include "base/files/file_path.h"
+
+namespace vr {
+namespace test {
+
+void GetTestDataPath(base::FilePath* result);
+
+}  // namespace test
+}  // namespace vr
+
+#endif  // CHROME_BROWSER_VR_TEST_PATHS_H_
diff --git a/chrome/browser/android/vr_shell/toolbar_helper.cc b/chrome/browser/vr/toolbar_helper.cc
similarity index 90%
rename from chrome/browser/android/vr_shell/toolbar_helper.cc
rename to chrome/browser/vr/toolbar_helper.cc
index b776a57..e7f5e12c5 100644
--- a/chrome/browser/android/vr_shell/toolbar_helper.cc
+++ b/chrome/browser/vr/toolbar_helper.cc
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/toolbar_helper.h"
+#include "chrome/browser/vr/toolbar_helper.h"
 
 #include "base/memory/ptr_util.h"
 #include "components/toolbar/toolbar_model_impl.h"
 
 class ToolbarModelDelegate;
 
-namespace vr_shell {
+namespace vr {
 
 namespace {
 
@@ -38,4 +38,4 @@
   ui_->SetToolbarState(state);
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/toolbar_helper.h b/chrome/browser/vr/toolbar_helper.h
similarity index 67%
rename from chrome/browser/android/vr_shell/toolbar_helper.h
rename to chrome/browser/vr/toolbar_helper.h
index c87491d8..d29e184c 100644
--- a/chrome/browser/android/vr_shell/toolbar_helper.h
+++ b/chrome/browser/vr/toolbar_helper.h
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_TOOLBAR_HELPER_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_TOOLBAR_HELPER_H_
+#ifndef CHROME_BROWSER_VR_TOOLBAR_HELPER_H_
+#define CHROME_BROWSER_VR_TOOLBAR_HELPER_H_
 
-#include "chrome/browser/android/vr_shell/toolbar_state.h"
-#include "chrome/browser/android/vr_shell/ui_interface.h"
+#include "chrome/browser/vr/toolbar_state.h"
+#include "chrome/browser/vr/ui_interface.h"
 
 class ToolbarModel;
 class ToolbarModelDelegate;
 
-namespace vr_shell {
+namespace vr {
 
 class UiInterface;
 
@@ -31,6 +31,6 @@
   ToolbarState current_state_;
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_TOOLBAR_HELPER_H_
+#endif  // CHROME_BROWSER_VR_TOOLBAR_HELPER_H_
diff --git a/chrome/browser/android/vr_shell/toolbar_state.cc b/chrome/browser/vr/toolbar_state.cc
similarity index 92%
rename from chrome/browser/android/vr_shell/toolbar_state.cc
rename to chrome/browser/vr/toolbar_state.cc
index 2d684527..f22180d 100644
--- a/chrome/browser/android/vr_shell/toolbar_state.cc
+++ b/chrome/browser/vr/toolbar_state.cc
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/toolbar_state.h"
+#include "chrome/browser/vr/toolbar_state.h"
 
-namespace vr_shell {
+namespace vr {
 
 ToolbarState::ToolbarState()
     : gurl(GURL()),
@@ -40,4 +40,4 @@
   return !(*this == other);
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/toolbar_state.h b/chrome/browser/vr/toolbar_state.h
similarity index 81%
rename from chrome/browser/android/vr_shell/toolbar_state.h
rename to chrome/browser/vr/toolbar_state.h
index 0a1eb78..dcfeaa3 100644
--- a/chrome/browser/android/vr_shell/toolbar_state.h
+++ b/chrome/browser/vr/toolbar_state.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 CHROME_BROWSER_ANDROID_VR_SHELL_TOOLBAR_STATE_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_TOOLBAR_STATE_H_
+#ifndef CHROME_BROWSER_VR_TOOLBAR_STATE_H_
+#define CHROME_BROWSER_VR_TOOLBAR_STATE_H_
 
 #include "components/security_state/core/security_state.h"
 #include "url/gurl.h"
@@ -12,7 +12,7 @@
 struct VectorIcon;
 }
 
-namespace vr_shell {
+namespace vr {
 
 // Passes information obtained from ToolbarModel to the VR UI framework.
 struct ToolbarState {
@@ -37,6 +37,6 @@
   bool offline_page;
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_TOOLBAR_STATE_H_
+#endif  // CHROME_BROWSER_VR_TOOLBAR_STATE_H_
diff --git a/chrome/browser/android/vr_shell/ui_browser_interface.h b/chrome/browser/vr/ui_browser_interface.h
similarity index 65%
rename from chrome/browser/android/vr_shell/ui_browser_interface.h
rename to chrome/browser/vr/ui_browser_interface.h
index d0456055..c787e8a 100644
--- a/chrome/browser/android/vr_shell/ui_browser_interface.h
+++ b/chrome/browser/vr/ui_browser_interface.h
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_UI_BROWSER_INTERFACE_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_UI_BROWSER_INTERFACE_H_
+#ifndef CHROME_BROWSER_VR_UI_BROWSER_INTERFACE_H_
+#define CHROME_BROWSER_VR_UI_BROWSER_INTERFACE_H_
 
-#include "chrome/browser/android/vr_shell/ui_unsupported_mode.h"
+#include "chrome/browser/vr/ui_unsupported_mode.h"
 
-namespace vr_shell {
+namespace vr {
 
 // An interface for the UI to communicate with VrShell.  Many of the functions
 // in this interface are proxies to methods on VrShell.
@@ -22,6 +22,6 @@
   virtual void OnUnsupportedMode(UiUnsupportedMode mode) = 0;
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_UI_BROWSER_INTERFACE_H_
+#endif  // CHROME_BROWSER_VR_UI_BROWSER_INTERFACE_H_
diff --git a/chrome/browser/android/vr_shell/ui_element_renderer.h b/chrome/browser/vr/ui_element_renderer.h
similarity index 79%
rename from chrome/browser/android/vr_shell/ui_element_renderer.h
rename to chrome/browser/vr/ui_element_renderer.h
index 24fd174..bf7bfcf 100644
--- a/chrome/browser/android/vr_shell/ui_element_renderer.h
+++ b/chrome/browser/vr/ui_element_renderer.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 CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENT_RENDERER_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENT_RENDERER_H_
+#ifndef CHROME_BROWSER_VR_UI_ELEMENT_RENDERER_H_
+#define CHROME_BROWSER_VR_UI_ELEMENT_RENDERER_H_
 
 #include "third_party/skia/include/core/SkColor.h"
 
@@ -12,7 +12,7 @@
 class Transform;
 }  // namespace gfx
 
-namespace vr_shell {
+namespace vr {
 
 // This is the interface offered by VrShell's GL system to UI elements.
 class UiElementRenderer {
@@ -30,6 +30,6 @@
                                 float opacity) = 0;
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_UI_ELEMENT_RENDERER_H_
+#endif  // CHROME_BROWSER_VR_UI_ELEMENT_RENDERER_H_
diff --git a/chrome/browser/android/vr_shell/ui_input_manager.cc b/chrome/browser/vr/ui_input_manager.cc
similarity index 97%
rename from chrome/browser/android/vr_shell/ui_input_manager.cc
rename to chrome/browser/vr/ui_input_manager.cc
index 1a82987..7e96486a 100644
--- a/chrome/browser/android/vr_shell/ui_input_manager.cc
+++ b/chrome/browser/vr/ui_input_manager.cc
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/ui_input_manager.h"
+#include "chrome/browser/vr/ui_input_manager.h"
 
 #include "base/macros.h"
-#include "chrome/browser/android/vr_shell/ui_elements/ui_element.h"
-#include "chrome/browser/android/vr_shell/ui_scene.h"
+#include "chrome/browser/vr/elements/ui_element.h"
+#include "chrome/browser/vr/ui_scene.h"
 // TODO(tiborg): Remove include once we use a generic type to pass scroll/fling
 // gestures.
 #include "third_party/WebKit/public/platform/WebGestureEvent.h"
 
-namespace vr_shell {
+namespace vr {
 
 namespace {
 
@@ -343,4 +343,4 @@
   return true;
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/ui_input_manager.h b/chrome/browser/vr/ui_input_manager.h
similarity index 92%
rename from chrome/browser/android/vr_shell/ui_input_manager.h
rename to chrome/browser/vr/ui_input_manager.h
index 10e9d4b1..a333a79 100644
--- a/chrome/browser/android/vr_shell/ui_input_manager.h
+++ b/chrome/browser/vr/ui_input_manager.h
@@ -2,23 +2,27 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_UI_INPUT_MANAGER_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_UI_INPUT_MANAGER_H_
+#ifndef CHROME_BROWSER_VR_UI_INPUT_MANAGER_H_
+#define CHROME_BROWSER_VR_UI_INPUT_MANAGER_H_
 
 #include <memory>
+#include <vector>
 
-// TODO(tiborg): Remove include once we use a generic type to pass scroll/fling
-// gestures.
-#include "chrome/browser/android/vr_shell/vr_controller.h"
 #include "ui/gfx/geometry/point3_f.h"
 #include "ui/gfx/geometry/point_f.h"
 #include "ui/gfx/geometry/vector3d_f.h"
 
-namespace vr_shell {
+namespace blink {
+class WebGestureEvent;
+}
+
+namespace vr {
 
 class UiScene;
 class UiElement;
 
+using GestureList = std::vector<std::unique_ptr<blink::WebGestureEvent>>;
+
 // Receives interaction events with the web content from the UiInputManager.
 class UiInputManagerDelegate {
  public:
@@ -115,6 +119,6 @@
   ButtonState previous_button_state_ = ButtonState::UP;
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_UI_INPUT_MANAGER_H_
+#endif  // CHROME_BROWSER_VR_UI_INPUT_MANAGER_H_
diff --git a/chrome/browser/android/vr_shell/ui_interface.h b/chrome/browser/vr/ui_interface.h
similarity index 88%
rename from chrome/browser/android/vr_shell/ui_interface.h
rename to chrome/browser/vr/ui_interface.h
index 29c3bf3..fde6f7f 100644
--- a/chrome/browser/android/vr_shell/ui_interface.h
+++ b/chrome/browser/vr/ui_interface.h
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_UI_INTERFACE_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_UI_INTERFACE_H_
+#ifndef CHROME_BROWSER_VR_UI_INTERFACE_H_
+#define CHROME_BROWSER_VR_UI_INTERFACE_H_
 
 #include "components/security_state/core/security_state.h"
 
 class SkBitmap;
 
-namespace vr_shell {
+namespace vr {
 
 struct ToolbarState;
 
@@ -53,6 +53,6 @@
   virtual void RemoveTab(bool incognito, int id) {}
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_UI_INTERFACE_H_
+#endif  // CHROME_BROWSER_VR_UI_INTERFACE_H_
diff --git a/chrome/browser/android/vr_shell/ui_scene.cc b/chrome/browser/vr/ui_scene.cc
similarity index 96%
rename from chrome/browser/android/vr_shell/ui_scene.cc
rename to chrome/browser/vr/ui_scene.cc
index 5956b75..3c65f5d 100644
--- a/chrome/browser/android/vr_shell/ui_scene.cc
+++ b/chrome/browser/vr/ui_scene.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 "chrome/browser/android/vr_shell/ui_scene.h"
+#include "chrome/browser/vr/ui_scene.h"
 
 #include <string>
 #include <utility>
@@ -10,11 +10,11 @@
 #include "base/memory/ptr_util.h"
 #include "base/time/time.h"
 #include "base/values.h"
-#include "chrome/browser/android/vr_shell/animation.h"
-#include "chrome/browser/android/vr_shell/easing.h"
-#include "chrome/browser/android/vr_shell/ui_elements/ui_element.h"
+#include "chrome/browser/vr/animation.h"
+#include "chrome/browser/vr/easing.h"
+#include "chrome/browser/vr/elements/ui_element.h"
 
-namespace vr_shell {
+namespace vr {
 
 namespace {
 
@@ -280,4 +280,4 @@
   }
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/ui_scene.h b/chrome/browser/vr/ui_scene.h
similarity index 89%
rename from chrome/browser/android/vr_shell/ui_scene.h
rename to chrome/browser/vr/ui_scene.h
index 12bf9df..d7f52163 100644
--- a/chrome/browser/android/vr_shell/ui_scene.h
+++ b/chrome/browser/vr/ui_scene.h
@@ -2,24 +2,24 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_UI_SCENE_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_UI_SCENE_H_
+#ifndef CHROME_BROWSER_VR_UI_SCENE_H_
+#define CHROME_BROWSER_VR_UI_SCENE_H_
 
 #include <memory>
 #include <vector>
 
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "chrome/browser/android/vr_shell/color_scheme.h"
-#include "chrome/browser/android/vr_shell/ui_elements/ui_element_debug_id.h"
+#include "chrome/browser/vr/color_scheme.h"
+#include "chrome/browser/vr/elements/ui_element_debug_id.h"
 #include "third_party/skia/include/core/SkColor.h"
 
 namespace base {
 class ListValue;
 class TimeTicks;
-}
+}  // namespace base
 
-namespace vr_shell {
+namespace vr {
 
 class Animation;
 class UiElement;
@@ -105,6 +105,6 @@
   DISALLOW_COPY_AND_ASSIGN(UiScene);
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_UI_SCENE_H_
+#endif  // CHROME_BROWSER_VR_UI_SCENE_H_
diff --git a/chrome/browser/android/vr_shell/ui_scene_manager.cc b/chrome/browser/vr/ui_scene_manager.cc
similarity index 93%
rename from chrome/browser/android/vr_shell/ui_scene_manager.cc
rename to chrome/browser/vr/ui_scene_manager.cc
index 5e756c6..9dbf83cb 100644
--- a/chrome/browser/android/vr_shell/ui_scene_manager.cc
+++ b/chrome/browser/vr/ui_scene_manager.cc
@@ -2,31 +2,31 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/ui_scene_manager.h"
+#include "chrome/browser/vr/ui_scene_manager.h"
 
 #include "base/callback.h"
 #include "base/memory/ptr_util.h"
-#include "chrome/browser/android/vr_shell/textures/close_button_texture.h"
-#include "chrome/browser/android/vr_shell/textures/ui_texture.h"
-#include "chrome/browser/android/vr_shell/ui_browser_interface.h"
-#include "chrome/browser/android/vr_shell/ui_elements/button.h"
-#include "chrome/browser/android/vr_shell/ui_elements/exclusive_screen_toast.h"
-#include "chrome/browser/android/vr_shell/ui_elements/exit_prompt.h"
-#include "chrome/browser/android/vr_shell/ui_elements/exit_prompt_backplane.h"
-#include "chrome/browser/android/vr_shell/ui_elements/loading_indicator.h"
-#include "chrome/browser/android/vr_shell/ui_elements/screen_dimmer.h"
-#include "chrome/browser/android/vr_shell/ui_elements/splash_screen_icon.h"
-#include "chrome/browser/android/vr_shell/ui_elements/system_indicator.h"
-#include "chrome/browser/android/vr_shell/ui_elements/transient_url_bar.h"
-#include "chrome/browser/android/vr_shell/ui_elements/ui_element.h"
-#include "chrome/browser/android/vr_shell/ui_elements/ui_element_debug_id.h"
-#include "chrome/browser/android/vr_shell/ui_elements/url_bar.h"
-#include "chrome/browser/android/vr_shell/ui_scene.h"
+#include "chrome/browser/vr/elements/button.h"
+#include "chrome/browser/vr/elements/close_button_texture.h"
+#include "chrome/browser/vr/elements/exclusive_screen_toast.h"
+#include "chrome/browser/vr/elements/exit_prompt.h"
+#include "chrome/browser/vr/elements/exit_prompt_backplane.h"
+#include "chrome/browser/vr/elements/loading_indicator.h"
+#include "chrome/browser/vr/elements/screen_dimmer.h"
+#include "chrome/browser/vr/elements/splash_screen_icon.h"
+#include "chrome/browser/vr/elements/system_indicator.h"
+#include "chrome/browser/vr/elements/transient_url_bar.h"
+#include "chrome/browser/vr/elements/ui_element.h"
+#include "chrome/browser/vr/elements/ui_element_debug_id.h"
+#include "chrome/browser/vr/elements/ui_texture.h"
+#include "chrome/browser/vr/elements/url_bar.h"
+#include "chrome/browser/vr/ui_browser_interface.h"
+#include "chrome/browser/vr/ui_scene.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/vector_icons/vector_icons.h"
 #include "ui/vector_icons/vector_icons.h"
 
-namespace vr_shell {
+namespace vr {
 
 namespace {
 
@@ -165,7 +165,7 @@
   element = base::MakeUnique<ScreenDimmer>();
   element->set_debug_id(kScreenDimmer);
   element->set_id(AllocateId());
-  element->set_fill(vr_shell::Fill::NONE);
+  element->set_fill(vr::Fill::NONE);
   element->set_visible(false);
   element->set_hit_testable(false);
   element->set_is_overlay(true);
@@ -181,7 +181,7 @@
   element = base::MakeUnique<PermanentSecurityWarning>(512);
   element->set_debug_id(kWebVrPermanentHttpSecurityWarning);
   element->set_id(AllocateId());
-  element->set_fill(vr_shell::Fill::NONE);
+  element->set_fill(vr::Fill::NONE);
   element->set_size({kPermanentWarningWidth, kPermanentWarningHeight, 1});
   element->set_scale({kWarningDistance, kWarningDistance, 1});
   element->set_translation(
@@ -201,7 +201,7 @@
   element = std::move(transient_warning);
   element->set_debug_id(kWebVrTransientHttpSecurityWarning);
   element->set_id(AllocateId());
-  element->set_fill(vr_shell::Fill::NONE);
+  element->set_fill(vr::Fill::NONE);
   element->set_size({kTransientWarningWidth, kTransientWarningHeight, 1});
   element->set_scale({kWarningDistance, kWarningDistance, 1});
   element->set_translation({0, 0, -kWarningDistance});
@@ -213,7 +213,7 @@
   element = base::MakeUnique<ExitWarning>(1024);
   element->set_debug_id(kExitWarning);
   element->set_id(AllocateId());
-  element->set_fill(vr_shell::Fill::NONE);
+  element->set_fill(vr::Fill::NONE);
   element->set_size({kExitWarningWidth, kExitWarningHeight, 1});
   element->set_scale({kExitWarningDistance, kExitWarningDistance, 1});
   element->set_translation({0, 0, -kExitWarningDistance});
@@ -268,7 +268,7 @@
   element = base::MakeUnique<UiElement>();
   element->set_debug_id(kContentQuad);
   element->set_id(AllocateId());
-  element->set_fill(vr_shell::Fill::CONTENT);
+  element->set_fill(vr::Fill::CONTENT);
   element->set_size({kContentWidth, kContentHeight, 1});
   element->set_translation({0, kContentVerticalOffset, -kContentDistance});
   element->set_visible(false);
@@ -282,7 +282,7 @@
   element = base::MakeUnique<UiElement>();
   element->set_debug_id(kBackplane);
   element->set_id(AllocateId());
-  element->set_fill(vr_shell::Fill::NONE);
+  element->set_fill(vr::Fill::NONE);
   element->set_size({kBackplaneSize, kBackplaneSize, 1.0});
   element->set_translation({0.0, 0.0, -kTextureOffset});
   element->set_parent_id(main_content_->id());
@@ -318,7 +318,7 @@
   element->set_size({kSceneSize, kSceneSize, 1.0});
   element->set_translation({0.0, -kSceneHeight / 2, 0.0});
   element->set_rotation(gfx::Quaternion(gfx::Vector3dF(1, 0, 0), -M_PI / 2));
-  element->set_fill(vr_shell::Fill::GRID_GRADIENT);
+  element->set_fill(vr::Fill::GRID_GRADIENT);
   element->set_draw_phase(0);
   element->set_gridline_count(kFloorGridlineCount);
   floor_ = element.get();
@@ -332,7 +332,7 @@
   element->set_size({kSceneSize, kSceneSize, 1.0});
   element->set_translation({0.0, kSceneHeight / 2, 0.0});
   element->set_rotation(gfx::Quaternion(gfx::Vector3dF(1, 0, 0), M_PI / 2));
-  element->set_fill(vr_shell::Fill::OPAQUE_GRADIENT);
+  element->set_fill(vr::Fill::OPAQUE_GRADIENT);
   element->set_draw_phase(0);
   ceiling_ = element.get();
   background_elements_.push_back(element.get());
@@ -396,7 +396,7 @@
       base::MakeUnique<CloseButtonTexture>());
   element->set_debug_id(kCloseButton);
   element->set_id(AllocateId());
-  element->set_fill(vr_shell::Fill::NONE);
+  element->set_fill(vr::Fill::NONE);
   element->set_translation(
       gfx::Vector3dF(0, kContentVerticalOffset - (kContentHeight / 2) - 0.3,
                      -kCloseButtonDistance));
@@ -414,7 +414,7 @@
                  base::Unretained(this)));
   element->set_debug_id(kExitPrompt);
   element->set_id(AllocateId());
-  element->set_fill(vr_shell::Fill::NONE);
+  element->set_fill(vr::Fill::NONE);
   element->set_size({kExitPromptWidth, kExitPromptHeight, 1});
   element->set_translation({0.0, kExitPromptVerticalOffset, kTextureOffset});
   element->set_parent_id(main_content_->id());
@@ -428,7 +428,7 @@
       &UiSceneManager::OnExitPromptBackplaneClicked, base::Unretained(this)));
   element->set_debug_id(kExitPromptBackplane);
   element->set_id(AllocateId());
-  element->set_fill(vr_shell::Fill::NONE);
+  element->set_fill(vr::Fill::NONE);
   element->set_size({kExitPromptBackplaneSize, kExitPromptBackplaneSize, 1.0});
   element->set_translation({0.0, 0.0, -kTextureOffset});
   element->set_parent_id(exit_prompt_->id());
@@ -442,7 +442,7 @@
       512, base::TimeDelta::FromSeconds(kToastTimeoutSeconds));
   element->set_debug_id(kExclusiveScreenToast);
   element->set_id(AllocateId());
-  element->set_fill(vr_shell::Fill::NONE);
+  element->set_fill(vr::Fill::NONE);
   element->set_size({kToastWidthDMM, kToastHeightDMM, 1});
   element->set_visible(false);
   element->set_hit_testable(false);
@@ -786,4 +786,4 @@
   return ColorScheme::GetColorScheme(mode());
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/ui_scene_manager.h b/chrome/browser/vr/ui_scene_manager.h
similarity index 89%
rename from chrome/browser/android/vr_shell/ui_scene_manager.h
rename to chrome/browser/vr/ui_scene_manager.h
index 81e5615..c306026 100644
--- a/chrome/browser/android/vr_shell/ui_scene_manager.h
+++ b/chrome/browser/vr/ui_scene_manager.h
@@ -2,20 +2,20 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_UI_SCENE_MANAGER_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_UI_SCENE_MANAGER_H_
+#ifndef CHROME_BROWSER_VR_UI_SCENE_MANAGER_H_
+#define CHROME_BROWSER_VR_UI_SCENE_MANAGER_H_
 
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/values.h"
-#include "chrome/browser/android/vr_shell/color_scheme.h"
-#include "chrome/browser/android/vr_shell/ui_elements/simple_textured_element.h"
-#include "chrome/browser/android/vr_shell/ui_interface.h"
-#include "chrome/browser/android/vr_shell/ui_unsupported_mode.h"
+#include "chrome/browser/vr/color_scheme.h"
+#include "chrome/browser/vr/elements/simple_textured_element.h"
+#include "chrome/browser/vr/ui_interface.h"
+#include "chrome/browser/vr/ui_unsupported_mode.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 
-namespace vr_shell {
+namespace vr {
 
 class ExclusiveScreenToast;
 class LoadingIndicator;
@@ -144,6 +144,6 @@
   DISALLOW_COPY_AND_ASSIGN(UiSceneManager);
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_UI_SCENE_MANAGER_H_
+#endif  // CHROME_BROWSER_VR_UI_SCENE_MANAGER_H_
diff --git a/chrome/browser/android/vr_shell/ui_scene_manager_unittest.cc b/chrome/browser/vr/ui_scene_manager_unittest.cc
similarity index 97%
rename from chrome/browser/android/vr_shell/ui_scene_manager_unittest.cc
rename to chrome/browser/vr/ui_scene_manager_unittest.cc
index 197bfea..22923339 100644
--- a/chrome/browser/android/vr_shell/ui_scene_manager_unittest.cc
+++ b/chrome/browser/vr/ui_scene_manager_unittest.cc
@@ -2,20 +2,20 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/vr_shell/ui_scene_manager.h"
+#include "chrome/browser/vr/ui_scene_manager.h"
 
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
 #include "base/test/scoped_mock_time_message_loop_task_runner.h"
-#include "chrome/browser/android/vr_shell/ui_browser_interface.h"
-#include "chrome/browser/android/vr_shell/ui_elements/ui_element.h"
-#include "chrome/browser/android/vr_shell/ui_elements/ui_element_debug_id.h"
-#include "chrome/browser/android/vr_shell/ui_scene.h"
+#include "chrome/browser/vr/elements/ui_element.h"
+#include "chrome/browser/vr/elements/ui_element_debug_id.h"
+#include "chrome/browser/vr/ui_browser_interface.h"
+#include "chrome/browser/vr/ui_scene.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace vr_shell {
+namespace vr {
 
 namespace {
 
@@ -449,4 +449,4 @@
   EXPECT_TRUE(VerifyVisibility(indicators, false));
 }
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/ui_scene_unittest.cc b/chrome/browser/vr/ui_scene_unittest.cc
similarity index 95%
rename from chrome/browser/android/vr_shell/ui_scene_unittest.cc
rename to chrome/browser/vr/ui_scene_unittest.cc
index fe09178..b9afd76 100644
--- a/chrome/browser/android/vr_shell/ui_scene_unittest.cc
+++ b/chrome/browser/vr/ui_scene_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 "chrome/browser/android/vr_shell/ui_scene.h"
+#include "chrome/browser/vr/ui_scene.h"
 
 #define _USE_MATH_DEFINES  // For M_PI in MSVC.
 #include <cmath>
@@ -11,9 +11,9 @@
 
 #include "base/memory/ptr_util.h"
 #include "base/values.h"
-#include "chrome/browser/android/vr_shell/animation.h"
-#include "chrome/browser/android/vr_shell/easing.h"
-#include "chrome/browser/android/vr_shell/ui_elements/ui_element.h"
+#include "chrome/browser/vr/animation.h"
+#include "chrome/browser/vr/easing.h"
+#include "chrome/browser/vr/elements/ui_element.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 #define TOLERANCE 0.0001
@@ -23,7 +23,7 @@
   EXPECT_NEAR(a.y(), b.y(), TOLERANCE); \
   EXPECT_NEAR(a.z(), b.z(), TOLERANCE);
 
-namespace vr_shell {
+namespace vr {
 
 namespace {
 
@@ -226,4 +226,4 @@
                         AnchoringTest,
                         ::testing::ValuesIn(anchoring_test_cases));
 
-}  // namespace vr_shell
+}  // namespace vr
diff --git a/chrome/browser/android/vr_shell/ui_unsupported_mode.h b/chrome/browser/vr/ui_unsupported_mode.h
similarity index 69%
rename from chrome/browser/android/vr_shell/ui_unsupported_mode.h
rename to chrome/browser/vr/ui_unsupported_mode.h
index 67c93fe..b144670 100644
--- a/chrome/browser/android/vr_shell/ui_unsupported_mode.h
+++ b/chrome/browser/vr/ui_unsupported_mode.h
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ANDROID_VR_SHELL_UI_UNSUPPORTED_MODE_H_
-#define CHROME_BROWSER_ANDROID_VR_SHELL_UI_UNSUPPORTED_MODE_H_
+#ifndef CHROME_BROWSER_VR_UI_UNSUPPORTED_MODE_H_
+#define CHROME_BROWSER_VR_UI_UNSUPPORTED_MODE_H_
 
-namespace vr_shell {
+namespace vr {
 
 // Ensure that this stays in sync with VRUnsupportedMode in enums.xml
 // These values are written to logs.  New enum values can be added, but existing
@@ -20,6 +20,6 @@
   kCount,
 };
 
-}  // namespace vr_shell
+}  // namespace vr
 
-#endif  // CHROME_BROWSER_ANDROID_VR_SHELL_UI_UNSUPPORTED_MODE_H_
+#endif  // CHROME_BROWSER_VR_UI_UNSUPPORTED_MODE_H_
diff --git a/chrome/chrome_paks.gni b/chrome/chrome_paks.gni
index 235ee70..94ccca2a 100644
--- a/chrome/chrome_paks.gni
+++ b/chrome/chrome_paks.gni
@@ -184,7 +184,7 @@
 #   output_dir [required]: Directory to output .pak files. Locale .pak files
 #       will always be place in $output_dir/locales
 #   additional_extra_paks: List of extra .pak sources for resources.pak.
-#   exclude_locale_paks: if set to true, skip chrome_repack_locales.
+#   locale_whitelist: if set, override repack_whitelist for locale .pak files.
 #   copy_data_to_bundle:
 #   deps:
 #   output_dir:
@@ -234,24 +234,26 @@
     }
   }
 
-  if (!defined(invoker.exclude_locale_paks) || !invoker.exclude_locale_paks) {
-    chrome_repack_locales("${target_name}_locales") {
-      forward_variables_from(invoker,
-                             [
-                               "copy_data_to_bundle",
-                               "deps",
-                               "repack_whitelist",
-                               "visibility",
-                             ])
+  chrome_repack_locales("${target_name}_locales") {
+    forward_variables_from(invoker,
+                           [
+                             "copy_data_to_bundle",
+                             "deps",
+                             "visibility",
+                           ])
+    if (defined(invoker.locale_whitelist)) {
+      repack_whitelist = invoker.locale_whitelist
+    } else if (defined(invoker.repack_whitelist)) {
+      repack_whitelist = invoker.repack_whitelist
+    }
 
-      input_locales = locales
-      output_dir = "${invoker.output_dir}/locales"
+    input_locales = locales
+    output_dir = "${invoker.output_dir}/locales"
 
-      if (is_mac) {
-        output_locales = locales_as_mac_outputs
-      } else {
-        output_locales = locales
-      }
+    if (is_mac) {
+      output_locales = locales_as_mac_outputs
+    } else {
+      output_locales = locales
     }
   }
 
@@ -260,10 +262,8 @@
     public_deps = [
       ":${target_name}_100_percent",
       ":${target_name}_extra",
+      ":${target_name}_locales",
     ]
-    if (!defined(invoker.exclude_locale_paks) || !invoker.exclude_locale_paks) {
-      public_deps += [ ":${target_name}_locales" ]
-    }
     if (enable_hidpi) {
       public_deps += [ ":${target_name}_200_percent" ]
     }
diff --git a/chrome/common/descriptors_android.h b/chrome/common/descriptors_android.h
index 9dcf4a1..40c6f6d 100644
--- a/chrome/common/descriptors_android.h
+++ b/chrome/common/descriptors_android.h
@@ -11,6 +11,7 @@
 enum {
 #if defined(OS_ANDROID)
   kAndroidLocalePakDescriptor = kContentIPCDescriptorMax + 1,
+  kAndroidSecondaryLocalePakDescriptor,
   kAndroidChrome100PercentPakDescriptor,
   kAndroidUIResourcesPakDescriptor,
   kAndroidMinidumpDescriptor,
diff --git a/components/favicon/core/large_icon_service.cc b/components/favicon/core/large_icon_service.cc
index bb99ce88..72886e7 100644
--- a/components/favicon/core/large_icon_service.cc
+++ b/components/favicon/core/large_icon_service.cc
@@ -25,6 +25,7 @@
 #include "components/favicon_base/favicon_types.h"
 #include "components/favicon_base/favicon_util.h"
 #include "components/image_fetcher/core/request_metadata.h"
+#include "net/base/network_change_notifier.h"
 #include "skia/ext/image_operations.h"
 #include "ui/gfx/codec/png_codec.h"
 #include "ui/gfx/geometry/size.h"
@@ -129,6 +130,7 @@
     int desired_size,
     favicon_base::FaviconRawBitmapResult* raw_result,
     SkBitmap* bitmap,
+    GURL* icon_url,
     favicon_base::FallbackIconStyle* fallback_icon_style) {
   if (IsDbResultAdequate(db_result, min_source_size)) {
     gfx::Image image;
@@ -144,6 +146,9 @@
       if (bitmap) {
         *bitmap = image.AsBitmap();
       }
+      if (icon_url) {
+        *icon_url = db_result.icon_url;
+      }
       return;
     }
   }
@@ -205,6 +210,7 @@
 
   favicon_base::FaviconRawBitmapResult raw_bitmap_result_;
   SkBitmap bitmap_result_;
+  GURL icon_url_;
   std::unique_ptr<favicon_base::FallbackIconStyle> fallback_icon_style_;
 
   DISALLOW_COPY_AND_ASSIGN(LargeIconWorker);
@@ -237,6 +243,7 @@
                  min_source_size_in_pixel_, desired_size_in_pixel_,
                  raw_bitmap_callback_ ? &raw_bitmap_result_ : nullptr,
                  image_callback_ ? &bitmap_result_ : nullptr,
+                 image_callback_ ? &icon_url_ : nullptr,
                  fallback_icon_style_.get()),
       base::Bind(&LargeIconWorker::OnIconProcessingComplete, this));
 }
@@ -256,7 +263,7 @@
 
   if (!bitmap_result_.isNull()) {
     image_callback_.Run(favicon_base::LargeIconImageResult(
-        gfx::Image::CreateFrom1xBitmap(bitmap_result_)));
+        gfx::Image::CreateFrom1xBitmap(bitmap_result_), icon_url_));
     return;
   }
   image_callback_.Run(
@@ -367,6 +374,16 @@
         const favicon_base::GoogleFaviconServerCallback& callback) {
   DCHECK_LE(0, min_source_size_in_pixel);
 
+  if (net::NetworkChangeNotifier::IsOffline()) {
+    // By exiting early when offline, we avoid caching the failure and thus
+    // allow icon fetches later when coming back online.
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE,
+        base::Bind(callback, favicon_base::GoogleFaviconServerRequestStatus::
+                                 FAILURE_CONNECTION_ERROR));
+    return;
+  }
+
   const GURL trimmed_page_url = TrimPageUrlForGoogleServer(page_url);
   const GURL server_request_url = GetRequestUrlForGoogleServerV2(
       trimmed_page_url, min_source_size_in_pixel, desired_size_in_pixel,
@@ -401,6 +418,10 @@
       traffic_annotation);
 }
 
+void LargeIconService::TouchIconFromGoogleServer(const GURL& icon_url) {
+  favicon_service_->TouchOnDemandFavicon(icon_url);
+}
+
 base::CancelableTaskTracker::TaskId
 LargeIconService::GetLargeIconOrFallbackStyleImpl(
     const GURL& page_url,
diff --git a/components/favicon/core/large_icon_service.h b/components/favicon/core/large_icon_service.h
index d44ace6..ec79fd54 100644
--- a/components/favicon/core/large_icon_service.h
+++ b/components/favicon/core/large_icon_service.h
@@ -102,6 +102,14 @@
       const net::NetworkTrafficAnnotationTag& traffic_annotation,
       const favicon_base::GoogleFaviconServerCallback& callback);
 
+  // Update the time that the icon at |icon_url| was requested. This should be
+  // called after obtaining the icon by GetLargeIcon*OrFallbackStyle() for any
+  // icon that _may_ originate from the Google favicon server (i.e. if the
+  // caller uses
+  // GetLargeIconOrFallbackStyleFromGoogleServerSkippingLocalCache()). This
+  // postpones the automatic eviction of the favicon from the database.
+  void TouchIconFromGoogleServer(const GURL& icon_url);
+
  private:
   base::CancelableTaskTracker::TaskId GetLargeIconOrFallbackStyleImpl(
       const GURL& page_url,
diff --git a/components/favicon/core/large_icon_service_unittest.cc b/components/favicon/core/large_icon_service_unittest.cc
index e048504..9646cd98 100644
--- a/components/favicon/core/large_icon_service_unittest.cc
+++ b/components/favicon/core/large_icon_service_unittest.cc
@@ -411,6 +411,7 @@
     if (!result.image.IsEmpty()) {
       returned_bitmap_size_ =
           base::MakeUnique<gfx::Size>(result.image.ToImageSkia()->size());
+      ASSERT_TRUE(result.icon_url.is_valid());
     }
     StoreFallbackStyle(result.fallback_icon_style.get());
   }
diff --git a/components/favicon_base/favicon_types.cc b/components/favicon_base/favicon_types.cc
index b03f0ec..3e661137 100644
--- a/components/favicon_base/favicon_types.cc
+++ b/components/favicon_base/favicon_types.cc
@@ -41,8 +41,9 @@
 // --------------------------------------------------------
 // LargeIconImageResult
 
-LargeIconImageResult::LargeIconImageResult(const gfx::Image& image_in)
-    : image(image_in) {}
+LargeIconImageResult::LargeIconImageResult(const gfx::Image& image_in,
+                                           const GURL& icon_url_in)
+    : image(image_in), icon_url(icon_url_in) {}
 
 LargeIconImageResult::LargeIconImageResult(
     FallbackIconStyle* fallback_icon_style_in)
diff --git a/components/favicon_base/favicon_types.h b/components/favicon_base/favicon_types.h
index 4afec6f..9f47be4 100644
--- a/components/favicon_base/favicon_types.h
+++ b/components/favicon_base/favicon_types.h
@@ -103,7 +103,8 @@
 // Contains either the gfx::Image if the favicon database has a sufficiently
 // large favicon bitmap and the style of the fallback icon otherwise.
 struct LargeIconImageResult {
-  explicit LargeIconImageResult(const gfx::Image& image_in);
+  explicit LargeIconImageResult(const gfx::Image& image_in,
+                                const GURL& icon_url_in);
 
   // Takes ownership of |fallback_icon_style_in|.
   explicit LargeIconImageResult(FallbackIconStyle* fallback_icon_style_in);
@@ -114,6 +115,9 @@
   // large one.
   gfx::Image image;
 
+  // The URL of the containing favicon. Specified only if |image| is not empty.
+  GURL icon_url;
+
   // The fallback icon style if a sufficiently large icon isn't available. This
   // uses the dominant color of a smaller icon as the background if available.
   std::unique_ptr<FallbackIconStyle> fallback_icon_style;
diff --git a/components/ntp_snippets/content_suggestions_service.cc b/components/ntp_snippets/content_suggestions_service.cc
index aced3bb3..1ce55f30 100644
--- a/components/ntp_snippets/content_suggestions_service.cc
+++ b/components/ntp_snippets/content_suggestions_service.cc
@@ -233,6 +233,9 @@
     RecordFaviconFetchResult(continue_to_google_server
                                  ? FaviconFetchResult::SUCCESS_CACHED
                                  : FaviconFetchResult::SUCCESS_FETCHED);
+    // Update the time when the icon was last requested - postpone thus the
+    // automatic eviction of the favicon from the favicon database.
+    large_icon_service_->TouchIconFromGoogleServer(result.icon_url);
     return;
   }
 
diff --git a/components/ntp_tiles/icon_cacher_impl.cc b/components/ntp_tiles/icon_cacher_impl.cc
index 48769f33..00bb3b16d 100644
--- a/components/ntp_tiles/icon_cacher_impl.cc
+++ b/components/ntp_tiles/icon_cacher_impl.cc
@@ -210,9 +210,13 @@
     const GURL& page_url,
     const favicon_base::LargeIconResult& result) {
   if (!HasResultDefaultBackgroundColor(result)) {
-    // We should only fetch for default "gray" tiles so that we never overrite
-    // any favicon of any size.
+    // There is already an icon, there is nothing to do. (We should only fetch
+    // for default "gray" tiles so that we never overwrite any favicon of any
+    // size.)
     FinishRequestAndNotifyIconAvailable(page_url, /*newly_available=*/false);
+    // Update the time when the icon was last requested - postpone thus the
+    // automatic eviction of the favicon from the favicon database.
+    large_icon_service_->TouchIconFromGoogleServer(result.bitmap.icon_url);
     return;
   }
 
diff --git a/components/password_manager/core/browser/BUILD.gn b/components/password_manager/core/browser/BUILD.gn
index 292331a..713da91 100644
--- a/components/password_manager/core/browser/BUILD.gn
+++ b/components/password_manager/core/browser/BUILD.gn
@@ -104,6 +104,7 @@
     "password_manager_metrics_util.h",
     "password_manager_util.cc",
     "password_manager_util.h",
+    "password_reuse_defines.h",
     "password_store.cc",
     "password_store.h",
     "password_store_change.cc",
@@ -141,8 +142,6 @@
 
   if (password_reuse_detection_support) {
     sources += [
-      "hash_password_manager.cc",
-      "hash_password_manager.h",
       "password_reuse_detection_manager.cc",
       "password_reuse_detection_manager.h",
       "password_reuse_detector.cc",
@@ -153,6 +152,8 @@
 
     if (is_win || is_mac || (is_linux && !is_chromeos)) {
       sources += [
+        "hash_password_manager.cc",
+        "hash_password_manager.h",
         "password_store_signin_notifier.cc",
         "password_store_signin_notifier.h",
       ]
@@ -355,11 +356,13 @@
   }
   if (password_reuse_detection_support) {
     sources += [
-      "hash_password_manager_unittest.cc",
       "password_reuse_detection_manager_unittest.cc",
       "password_reuse_detector_unittest.cc",
     ]
   }
+  if (is_win || is_mac || (is_linux && !is_chromeos)) {
+    sources += [ "hash_password_manager_unittest.cc" ]
+  }
   deps = [
     ":test_support",
     ":unit_tests_bundle_data",
diff --git a/components/password_manager/core/browser/password_reuse_defines.h b/components/password_manager/core/browser/password_reuse_defines.h
new file mode 100644
index 0000000..99c8f73
--- /dev/null
+++ b/components/password_manager/core/browser/password_reuse_defines.h
@@ -0,0 +1,14 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_REUSE_DEFINES_H_
+#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_REUSE_DEFINES_H_
+
+#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS)) || \
+    (defined(OS_LINUX) && !defined(OS_CHROMEOS))
+// Enable the detection when the sync password is typed not on the sync domain.
+#define SYNC_PASSWORD_REUSE_DETECTION_ENABLED
+#endif
+
+#endif  // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_REUSE_DEFINES_H_
diff --git a/components/password_manager/core/browser/password_store.cc b/components/password_manager/core/browser/password_store.cc
index 6047979..44cfc53 100644
--- a/components/password_manager/core/browser/password_store.cc
+++ b/components/password_manager/core/browser/password_store.cc
@@ -118,7 +118,7 @@
 bool PasswordStore::Init(const syncer::SyncableService::StartSyncFlare& flare,
                          PrefService* prefs) {
   ScheduleTask(base::Bind(&PasswordStore::InitOnBackgroundThread, this, flare));
-#if !defined(OS_ANDROID) && !defined(OS_IOS)
+#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
   hash_password_manager_.set_prefs(prefs);
   ScheduleTask(
       base::Bind(&PasswordStore::SaveSyncPasswordHashImpl, this,
@@ -315,7 +315,7 @@
   // The AffiliationService must be destroyed from the main thread.
   affiliated_match_helper_.reset();
   shutdown_called_ = true;
-#if !defined(OS_ANDROID) && !defined(OS_IOS) && !defined(OS_CHROMEOS)
+#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
   if (notifier_)
     notifier_->UnsubscribeFromSigninEvents();
 #endif
@@ -337,8 +337,9 @@
   ScheduleTask(base::Bind(&PasswordStore::CheckReuseImpl, this,
                           base::Passed(&check_reuse_request), input, domain));
 }
+#endif
 
-#if !defined(OS_CHROMEOS)
+#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
 void PasswordStore::SaveSyncPasswordHash(const base::string16& password) {
   // TODO(crbug.com/657041): Log success of saving password hash to UMA.
   hash_password_manager_.SavePasswordHash(password);
@@ -361,7 +362,6 @@
   notifier_->SubscribeToSigninEvents(this);
 }
 #endif
-#endif
 
 PasswordStore::~PasswordStore() {
   DCHECK(shutdown_called_);
diff --git a/components/password_manager/core/browser/password_store.h b/components/password_manager/core/browser/password_store.h
index 0db72af..5616935 100644
--- a/components/password_manager/core/browser/password_store.h
+++ b/components/password_manager/core/browser/password_store.h
@@ -17,6 +17,7 @@
 #include "base/sequenced_task_runner.h"
 #include "base/time/time.h"
 #include "components/keyed_service/core/refcounted_keyed_service.h"
+#include "components/password_manager/core/browser/password_reuse_defines.h"
 #include "components/password_manager/core/browser/password_store_change.h"
 #include "components/password_manager/core/browser/password_store_sync.h"
 #include "components/sync/model/syncable_service.h"
@@ -593,10 +594,10 @@
 // TODO(crbug.com/706392): Fix password reuse detection for Android.
 #if !defined(OS_ANDROID) && !defined(OS_IOS)
   std::unique_ptr<PasswordReuseDetector> reuse_detector_;
-  HashPasswordManager hash_password_manager_;
-#if !defined(OS_CHROMEOS)
-  std::unique_ptr<PasswordStoreSigninNotifier> notifier_;
 #endif
+#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
+  std::unique_ptr<PasswordStoreSigninNotifier> notifier_;
+  HashPasswordManager hash_password_manager_;
 #endif
 
   bool is_propagating_password_changes_to_web_credentials_enabled_;
diff --git a/components/password_manager/core/browser/password_store_unittest.cc b/components/password_manager/core/browser/password_store_unittest.cc
index 6d2eab58..4bf7312cc 100644
--- a/components/password_manager/core/browser/password_store_unittest.cc
+++ b/components/password_manager/core/browser/password_store_unittest.cc
@@ -998,8 +998,9 @@
   store->ShutdownOnUIThread();
   base::RunLoop().RunUntilIdle();
 }
+#endif
 
-#if !defined(OS_CHROMEOS)
+#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
 TEST_F(PasswordStoreTest, SavingClearingSyncPassword) {
   scoped_refptr<PasswordStoreDefault> store(new PasswordStoreDefault(
       base::SequencedTaskRunnerHandle::Get(),
@@ -1063,6 +1064,5 @@
   base::RunLoop().RunUntilIdle();
 }
 #endif
-#endif
 
 }  // namespace password_manager
diff --git a/components/password_manager/core/browser/sql_table_builder.cc b/components/password_manager/core/browser/sql_table_builder.cc
index caa654be..709c2add 100644
--- a/components/password_manager/core/browser/sql_table_builder.cc
+++ b/components/password_manager/core/browser/sql_table_builder.cc
@@ -235,7 +235,8 @@
   return ++sealed_version_;
 }
 
-bool SQLTableBuilder::MigrateFrom(unsigned old_version, sql::Connection* db) {
+bool SQLTableBuilder::MigrateFrom(unsigned old_version,
+                                  sql::Connection* db) const {
   for (; old_version < sealed_version_; ++old_version) {
     if (!MigrateToNextFrom(old_version, db))
       return false;
@@ -244,7 +245,7 @@
   return true;
 }
 
-bool SQLTableBuilder::CreateTable(sql::Connection* db) {
+bool SQLTableBuilder::CreateTable(sql::Connection* db) const {
   DCHECK(IsVersionLastAndSealed(sealed_version_));
   DCHECK(!constraints_.empty());
 
@@ -354,7 +355,7 @@
 }
 
 bool SQLTableBuilder::MigrateToNextFrom(unsigned old_version,
-                                        sql::Connection* db) {
+                                        sql::Connection* db) const {
   DCHECK_LT(old_version, sealed_version_);
   DCHECK_GE(old_version, 0u);
   DCHECK(IsVersionLastAndSealed(sealed_version_));
@@ -456,7 +457,7 @@
 }
 
 bool SQLTableBuilder::MigrateIndicesToNextFrom(unsigned old_version,
-                                               sql::Connection* db) {
+                                               sql::Connection* db) const {
   DCHECK_LT(old_version, sealed_version_);
   DCHECK(IsVersionLastAndSealed(sealed_version_));
   sql::Transaction transaction(db);
diff --git a/components/password_manager/core/browser/sql_table_builder.h b/components/password_manager/core/browser/sql_table_builder.h
index 6cf78cca..da1c8920 100644
--- a/components/password_manager/core/browser/sql_table_builder.h
+++ b/components/password_manager/core/browser/sql_table_builder.h
@@ -100,13 +100,13 @@
   // Assuming that the database connected through |db| contains a table called
   // |table_name_| in a state described by version |old_version|, migrates it to
   // the current version, which must be sealed. Returns true on success.
-  bool MigrateFrom(unsigned old_version, sql::Connection* db);
+  bool MigrateFrom(unsigned old_version, sql::Connection* db) const;
 
   // If |db| connects to a database where table |table_name_| already exists,
   // this is a no-op and returns true. Otherwise, |table_name_| is created in a
   // state described by the current version known to the builder. The current
   // version must be sealed. Returns true on success.
-  bool CreateTable(sql::Connection* db);
+  bool CreateTable(sql::Connection* db) const;
 
   // Returns the comma-separated list of all column names present in the last
   // version. The last version must be sealed.
@@ -151,14 +151,15 @@
   // |table_name_| in a state described by version |old_version|, migrates it to
   // version |old_version + 1|. The current version known to the builder must be
   // at least |old_version + 1| and sealed. Returns true on success.
-  bool MigrateToNextFrom(unsigned old_version, sql::Connection* db);
+  bool MigrateToNextFrom(unsigned old_version, sql::Connection* db) const;
 
   // Assuming that the database connected through |db| contains a table called
   // |table_name_| in a state described by version |old_version|, migrates it
   // indices to version |old_version + 1|. The current version known to the
   // builder must be at least |old_version + 1| and sealed. Returns true on
   // success.
-  bool MigrateIndicesToNextFrom(unsigned old_version, sql::Connection* db);
+  bool MigrateIndicesToNextFrom(unsigned old_version,
+                                sql::Connection* db) const;
 
   // Looks up column named |name| in |columns_|. If present, returns the last
   // one.
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index 99f9c91f..b457811 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -1536,7 +1536,9 @@
 
       If this policy is left not set Google Sync will be available for the user to choose whether to use it or not.
 
-      To fully disable Google Sync, it is recommended that you disable the Google Sync service in the Google Admin console.''',
+      To fully disable Google Sync, it is recommended that you disable the Google Sync service in the Google Admin console.
+
+      This policy should not be enabled when <ph name="ROAMING_PROFILE_SUPPORT_ENABLED_POLICY_NAME">RoamingProfileSupportEnabled</ph> policy is set to enabled as that feature shares the same client side functionality. The Google-hosted synchronization is disabled in this case completely.''',
       'arc_support': 'Disabling Google Sync will cause Android Backup and Restore to not function properly.',
     },
     {
@@ -1552,13 +1554,11 @@
       'id': 358,
       'caption': '''Enable the creation of roaming copies for <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> profile data''',
       'tags': ['local-data-access'],
-      'desc': '''If you enable this setting, the settings stored in <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> profiles like bookmarks, autofill data, passwords, etc. will also be written to a file stored in the Roaming user profile folder or a location specified by the Administrator through the <ph name="ROAMING_PROFILE_LOCATION_POLICY_NAME">$1<ex>RoamingProfileLocation</ex></ph> policy.
+      'desc': '''If you enable this setting, the settings stored in <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> profiles like bookmarks, autofill data, passwords, etc. will also be written to a file stored in the Roaming user profile folder or a location specified by the Administrator through the <ph name="ROAMING_PROFILE_LOCATION_POLICY_NAME">$1<ex>RoamingProfileLocation</ex></ph> policy. Enabling this policy disables cloud sync.
 
-      Google Sync is automatically disabled when this policy is enabled.
+      If this policy is disabled or left not set only the regular local profiles will be used.
 
-      To prevent accidental data leaks it is advisable to also set the <ph name="SIGNIN_ALLOWED_POLICY_NAME">$1<ex>SigninAllowed</ex></ph> policy to False.
-
-      If this policy is disabled or left not set only the regular local profiles will be used.''',
+      The <ph name="SYNC_DISABLED_POLICY_NAME">SyncDisabled</ph> policy disables all data synchronization, overriding RoamingProfileSupportEnabled.''',
       'label': '''Enable the creation of roaming copies for <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> profile data.''',
     },
     {
diff --git a/components/upload_list/BUILD.gn b/components/upload_list/BUILD.gn
index 46b8692..28aaec4 100644
--- a/components/upload_list/BUILD.gn
+++ b/components/upload_list/BUILD.gn
@@ -6,6 +6,8 @@
   sources = [
     "crash_upload_list.cc",
     "crash_upload_list.h",
+    "text_log_upload_list.cc",
+    "text_log_upload_list.h",
     "upload_list.cc",
     "upload_list.h",
   ]
@@ -18,7 +20,7 @@
 source_set("unit_tests") {
   testonly = true
   sources = [
-    "upload_list_unittest.cc",
+    "text_log_upload_list_unittest.cc",
   ]
 
   deps = [
diff --git a/components/upload_list/crash_upload_list.cc b/components/upload_list/crash_upload_list.cc
index 9b00ed2..704814a 100644
--- a/components/upload_list/crash_upload_list.cc
+++ b/components/upload_list/crash_upload_list.cc
@@ -4,17 +4,5 @@
 
 #include "components/upload_list/crash_upload_list.h"
 
-#include <utility>
-
-#include "base/files/file_path.h"
-#include "base/path_service.h"
-
 // static
 const char CrashUploadList::kReporterLogFilename[] = "uploads.log";
-
-CrashUploadList::CrashUploadList(Delegate* delegate,
-                                 const base::FilePath& upload_log_path,
-                                 scoped_refptr<base::TaskRunner> task_runner)
-    : UploadList(delegate, upload_log_path, std::move(task_runner)) {}
-
-CrashUploadList::~CrashUploadList() = default;
diff --git a/components/upload_list/crash_upload_list.h b/components/upload_list/crash_upload_list.h
index b1095ebc..cbb2d31 100644
--- a/components/upload_list/crash_upload_list.h
+++ b/components/upload_list/crash_upload_list.h
@@ -5,32 +5,16 @@
 #ifndef COMPONENTS_UPLOAD_LIST_CRASH_UPLOAD_LIST_H_
 #define COMPONENTS_UPLOAD_LIST_CRASH_UPLOAD_LIST_H_
 
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/task_runner.h"
-#include "components/upload_list/upload_list.h"
-
-namespace base {
-class FilePath;
-}
-
-// An upload list manager for crash reports from breakpad.
-class CrashUploadList : public UploadList {
+// TODO(rsesek): Remove this class. Clients only use it for the constant
+// it defines.
+class CrashUploadList {
  public:
   // Should match kReporterLogFilename in
   // breakpad/src/client/apple/Framework/BreakpadDefines.h.
   static const char kReporterLogFilename[];
 
-  // Creates a new crash upload list with the given callback delegate.
-  CrashUploadList(Delegate* delegate,
-                  const base::FilePath& upload_log_path,
-                  scoped_refptr<base::TaskRunner> task_runner);
-
- protected:
-  ~CrashUploadList() override;
-
  private:
-  DISALLOW_COPY_AND_ASSIGN(CrashUploadList);
+  CrashUploadList() {}
 };
 
 #endif  // COMPONENTS_UPLOAD_LIST_CRASH_UPLOAD_LIST_H_
diff --git a/components/upload_list/text_log_upload_list.cc b/components/upload_list/text_log_upload_list.cc
new file mode 100644
index 0000000..3239739
--- /dev/null
+++ b/components/upload_list/text_log_upload_list.cc
@@ -0,0 +1,76 @@
+// 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/upload_list/text_log_upload_list.h"
+
+#include <string>
+
+#include "base/files/file_util.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/string_split.h"
+#include "base/strings/string_util.h"
+
+TextLogUploadList::TextLogUploadList(const base::FilePath& upload_log_path)
+    : UploadList(), upload_log_path_(upload_log_path) {}
+
+TextLogUploadList::~TextLogUploadList() = default;
+
+base::TaskTraits TextLogUploadList::LoadingTaskTraits() {
+  return {base::MayBlock(), base::TaskPriority::BACKGROUND,
+          base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN};
+}
+
+std::vector<UploadList::UploadInfo> TextLogUploadList::LoadUploadList() {
+  std::vector<UploadInfo> uploads;
+
+  if (base::PathExists(upload_log_path_)) {
+    std::string contents;
+    base::ReadFileToString(upload_log_path_, &contents);
+    std::vector<std::string> log_entries =
+        base::SplitString(contents, base::kWhitespaceASCII,
+                          base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
+    ParseLogEntries(log_entries, &uploads);
+  }
+
+  return uploads;
+}
+
+void TextLogUploadList::ParseLogEntries(
+    const std::vector<std::string>& log_entries,
+    std::vector<UploadInfo>* uploads) {
+  std::vector<std::string>::const_reverse_iterator i;
+  for (i = log_entries.rbegin(); i != log_entries.rend(); ++i) {
+    std::vector<std::string> components =
+        base::SplitString(*i, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
+    // Skip any blank (or corrupted) lines.
+    if (components.size() < 2 || components.size() > 5)
+      continue;
+    base::Time upload_time;
+    double seconds_since_epoch;
+    if (!components[0].empty()) {
+      if (!base::StringToDouble(components[0], &seconds_since_epoch))
+        continue;
+      upload_time = base::Time::FromDoubleT(seconds_since_epoch);
+    }
+    UploadInfo info(components[1], upload_time);
+
+    // Add local ID if present.
+    if (components.size() > 2)
+      info.local_id = components[2];
+
+    // Add capture time if present.
+    if (components.size() > 3 && !components[3].empty() &&
+        base::StringToDouble(components[3], &seconds_since_epoch)) {
+      info.capture_time = base::Time::FromDoubleT(seconds_since_epoch);
+    }
+
+    int state;
+    if (components.size() > 4 && !components[4].empty() &&
+        base::StringToInt(components[4], &state)) {
+      info.state = static_cast<UploadInfo::State>(state);
+    }
+
+    uploads->push_back(info);
+  }
+}
diff --git a/components/upload_list/text_log_upload_list.h b/components/upload_list/text_log_upload_list.h
new file mode 100644
index 0000000..449dcd42
--- /dev/null
+++ b/components/upload_list/text_log_upload_list.h
@@ -0,0 +1,44 @@
+// 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_UPLOAD_LIST_TEXT_LOG_UPLOAD_LIST_H_
+#define COMPONENTS_UPLOAD_LIST_TEXT_LOG_UPLOAD_LIST_H_
+
+#include <vector>
+
+#include "base/files/file_path.h"
+#include "base/macros.h"
+#include "components/upload_list/upload_list.h"
+
+// Loads and parses an upload list text file of the format
+// upload_time,upload_id[,local_id[,capture_time[,state]]]
+// upload_time,upload_id[,local_id[,capture_time[,state]]]
+// etc.
+// where each line represents an upload. |upload_time| and |capture_time| are in
+// Unix time. |state| is an int in the range of UploadInfo::State. A line may
+// or may not contain |local_id|, |capture_time|, and |state|.
+class TextLogUploadList : public UploadList {
+ public:
+  // Creates a new upload list that parses the log at |upload_log_path|.
+  explicit TextLogUploadList(const base::FilePath& upload_log_path);
+
+  const base::FilePath& upload_log_path() const { return upload_log_path_; }
+
+ protected:
+  ~TextLogUploadList() override;
+
+  // UploadList:
+  base::TaskTraits LoadingTaskTraits() override;
+  std::vector<UploadList::UploadInfo> LoadUploadList() override;
+
+  // Parses upload log lines, converting them to UploadInfo entries.
+  void ParseLogEntries(const std::vector<std::string>& log_entries,
+                       std::vector<UploadInfo>* uploads);
+
+  const base::FilePath upload_log_path_;
+
+  DISALLOW_COPY_AND_ASSIGN(TextLogUploadList);
+};
+
+#endif  // COMPONENTS_UPLOAD_LIST_TEXT_LOG_UPLOAD_LIST_H_
diff --git a/components/upload_list/upload_list_unittest.cc b/components/upload_list/text_log_upload_list_unittest.cc
similarity index 75%
rename from components/upload_list/upload_list_unittest.cc
rename to components/upload_list/text_log_upload_list_unittest.cc
index 837f7fb8..ce1174a 100644
--- a/components/upload_list/upload_list_unittest.cc
+++ b/components/upload_list/text_log_upload_list_unittest.cc
@@ -2,9 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/upload_list/upload_list.h"
-
-#include <stddef.h>
+#include "components/upload_list/text_log_upload_list.h"
 
 #include <string>
 
@@ -13,11 +11,9 @@
 #include "base/files/scoped_temp_dir.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task_runner.h"
-#include "base/threading/thread.h"
+#include "base/test/scoped_task_environment.h"
 #include "base/time/time.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -28,14 +24,12 @@
 const char kTestLocalID[] = "fedcba9876543210";
 const char kTestCaptureTime[] = "2345678901";
 
-class UploadListTest : public testing::Test,
-                       public UploadList::Delegate {
+class TextLogUploadListTest : public testing::Test {
  public:
-  UploadListTest() : worker_thread_("UploadListTest") {}
+  TextLogUploadListTest() = default;
 
   void SetUp() override {
     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
-    ASSERT_TRUE(worker_thread_.Start());
   }
 
  protected:
@@ -45,33 +39,15 @@
               0);
   }
 
-  void WaitForUploadList() {
-    base::RunLoop run_loop;
-    quit_closure_ = run_loop.QuitClosure();
-    run_loop.Run();
-  }
-
-  // UploadList::Delegate:
-  void OnUploadListAvailable() override {
-    ASSERT_FALSE(quit_closure_.is_null());
-    quit_closure_.Run();
-  }
-
-  scoped_refptr<base::TaskRunner> task_runner() const {
-    return worker_thread_.task_runner();
-  }
-
   base::FilePath log_path() {
     return temp_dir_.GetPath().Append(FILE_PATH_LITERAL("uploads.log"));
   }
 
  private:
-  base::MessageLoop message_loop_;
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
   base::ScopedTempDir temp_dir_;
-  base::Thread worker_thread_;
-  base::Closure quit_closure_;
 
-  DISALLOW_COPY_AND_ASSIGN(UploadListTest);
+  DISALLOW_COPY_AND_ASSIGN(TextLogUploadListTest);
 };
 
 // These tests test that UploadList can parse a vector of log entry strings of
@@ -80,17 +56,18 @@
 
 // Test log entry string with upload time and upload ID.
 // This is the format that crash reports are stored in.
-TEST_F(UploadListTest, ParseUploadTimeUploadId) {
+TEST_F(TextLogUploadListTest, ParseUploadTimeUploadId) {
   std::string test_entry = kTestUploadTime;
   test_entry += ",";
   test_entry.append(kTestUploadId);
   WriteUploadLog(test_entry);
 
-  scoped_refptr<UploadList> upload_list =
-      new UploadList(this, log_path(), task_runner());
+  scoped_refptr<TextLogUploadList> upload_list =
+      new TextLogUploadList(log_path());
 
-  upload_list->LoadUploadListAsynchronously();
-  WaitForUploadList();
+  base::RunLoop run_loop;
+  upload_list->Load(run_loop.QuitClosure());
+  run_loop.Run();
 
   std::vector<UploadList::UploadInfo> uploads;
   upload_list->GetUploads(999, &uploads);
@@ -106,7 +83,7 @@
 
 // Test log entry string with upload time, upload ID and local ID.
 // This is the old format that WebRTC logs were stored in.
-TEST_F(UploadListTest, ParseUploadTimeUploadIdLocalId) {
+TEST_F(TextLogUploadListTest, ParseUploadTimeUploadIdLocalId) {
   std::string test_entry = kTestUploadTime;
   test_entry += ",";
   test_entry.append(kTestUploadId);
@@ -114,11 +91,12 @@
   test_entry.append(kTestLocalID);
   WriteUploadLog(test_entry);
 
-  scoped_refptr<UploadList> upload_list =
-      new UploadList(this, log_path(), task_runner());
+  scoped_refptr<TextLogUploadList> upload_list =
+      new TextLogUploadList(log_path());
 
-  upload_list->LoadUploadListAsynchronously();
-  WaitForUploadList();
+  base::RunLoop run_loop;
+  upload_list->Load(run_loop.QuitClosure());
+  run_loop.Run();
 
   std::vector<UploadList::UploadInfo> uploads;
   upload_list->GetUploads(999, &uploads);
@@ -135,7 +113,7 @@
 // Test log entry string with upload time, upload ID and capture time.
 // This is the format that WebRTC logs that only have been uploaded only are
 // stored in.
-TEST_F(UploadListTest, ParseUploadTimeUploadIdCaptureTime) {
+TEST_F(TextLogUploadListTest, ParseUploadTimeUploadIdCaptureTime) {
   std::string test_entry = kTestUploadTime;
   test_entry += ",";
   test_entry.append(kTestUploadId);
@@ -143,11 +121,12 @@
   test_entry.append(kTestCaptureTime);
   WriteUploadLog(test_entry);
 
-  scoped_refptr<UploadList> upload_list =
-      new UploadList(this, log_path(), task_runner());
+  scoped_refptr<TextLogUploadList> upload_list =
+      new TextLogUploadList(log_path());
 
-  upload_list->LoadUploadListAsynchronously();
-  WaitForUploadList();
+  base::RunLoop run_loop;
+  upload_list->Load(run_loop.QuitClosure());
+  run_loop.Run();
 
   std::vector<UploadList::UploadInfo> uploads;
   upload_list->GetUploads(999, &uploads);
@@ -164,18 +143,19 @@
 // Test log entry string with local ID and capture time.
 // This is the format that WebRTC logs that only are stored locally are stored
 // in.
-TEST_F(UploadListTest, ParseLocalIdCaptureTime) {
+TEST_F(TextLogUploadListTest, ParseLocalIdCaptureTime) {
   std::string test_entry = ",,";
   test_entry.append(kTestLocalID);
   test_entry += ",";
   test_entry.append(kTestCaptureTime);
   WriteUploadLog(test_entry);
 
-  scoped_refptr<UploadList> upload_list =
-      new UploadList(this, log_path(), task_runner());
+  scoped_refptr<TextLogUploadList> upload_list =
+      new TextLogUploadList(log_path());
 
-  upload_list->LoadUploadListAsynchronously();
-  WaitForUploadList();
+  base::RunLoop run_loop;
+  upload_list->Load(run_loop.QuitClosure());
+  run_loop.Run();
 
   std::vector<UploadList::UploadInfo> uploads;
   upload_list->GetUploads(999, &uploads);
@@ -193,7 +173,7 @@
 // time.
 // This is the format that WebRTC logs that are stored locally and have been
 // uploaded are stored in.
-TEST_F(UploadListTest, ParseUploadTimeUploadIdLocalIdCaptureTime) {
+TEST_F(TextLogUploadListTest, ParseUploadTimeUploadIdLocalIdCaptureTime) {
   std::string test_entry = kTestUploadTime;
   test_entry += ",";
   test_entry.append(kTestUploadId);
@@ -203,11 +183,12 @@
   test_entry.append(kTestCaptureTime);
   WriteUploadLog(test_entry);
 
-  scoped_refptr<UploadList> upload_list =
-      new UploadList(this, log_path(), task_runner());
+  scoped_refptr<TextLogUploadList> upload_list =
+      new TextLogUploadList(log_path());
 
-  upload_list->LoadUploadListAsynchronously();
-  WaitForUploadList();
+  base::RunLoop run_loop;
+  upload_list->Load(run_loop.QuitClosure());
+  run_loop.Run();
 
   std::vector<UploadList::UploadInfo> uploads;
   upload_list->GetUploads(999, &uploads);
@@ -221,7 +202,7 @@
   EXPECT_STREQ(kTestCaptureTime, base::DoubleToString(time_double).c_str());
 }
 
-TEST_F(UploadListTest, ParseMultipleEntries) {
+TEST_F(TextLogUploadListTest, ParseMultipleEntries) {
   std::string test_entry;
   for (int i = 1; i <= 4; ++i) {
     test_entry.append(kTestUploadTime);
@@ -235,11 +216,12 @@
   }
   WriteUploadLog(test_entry);
 
-  scoped_refptr<UploadList> upload_list =
-      new UploadList(this, log_path(), task_runner());
+  scoped_refptr<TextLogUploadList> upload_list =
+      new TextLogUploadList(log_path());
 
-  upload_list->LoadUploadListAsynchronously();
-  WaitForUploadList();
+  base::RunLoop run_loop;
+  upload_list->Load(run_loop.QuitClosure());
+  run_loop.Run();
 
   std::vector<UploadList::UploadInfo> uploads;
   upload_list->GetUploads(999, &uploads);
@@ -255,7 +237,7 @@
   }
 }
 
-TEST_F(UploadListTest, ParseWithState) {
+TEST_F(TextLogUploadListTest, ParseWithState) {
   std::string test_entry;
   for (int i = 1; i <= 4; ++i) {
     test_entry.append(kTestUploadTime);
@@ -272,11 +254,12 @@
   }
   WriteUploadLog(test_entry);
 
-  scoped_refptr<UploadList> upload_list =
-      new UploadList(this, log_path(), task_runner());
+  scoped_refptr<TextLogUploadList> upload_list =
+      new TextLogUploadList(log_path());
 
-  upload_list->LoadUploadListAsynchronously();
-  WaitForUploadList();
+  base::RunLoop run_loop;
+  upload_list->Load(run_loop.QuitClosure());
+  run_loop.Run();
 
   std::vector<UploadList::UploadInfo> uploads;
   upload_list->GetUploads(999, &uploads);
@@ -294,7 +277,7 @@
 }
 
 // https://crbug.com/597384
-TEST_F(UploadListTest, SimultaneousAccess) {
+TEST_F(TextLogUploadListTest, SimultaneousAccess) {
   std::string test_entry = kTestUploadTime;
   test_entry += ",";
   test_entry.append(kTestUploadId);
@@ -304,17 +287,17 @@
   test_entry.append(kTestCaptureTime);
   WriteUploadLog(test_entry);
 
-  scoped_refptr<UploadList> upload_list =
-      new UploadList(this, log_path(), task_runner());
+  scoped_refptr<TextLogUploadList> upload_list =
+      new TextLogUploadList(log_path());
 
   // Queue up a bunch of loads, waiting only for the first one to complete.
-  // Clearing the delegate prevents the QuitClosure from being Run more than
-  // once.
+  base::RunLoop run_loop;
+  upload_list->Load(run_loop.QuitClosure());
+  run_loop.Run();
+
   for (int i = 1; i <= 20; ++i) {
-    upload_list->LoadUploadListAsynchronously();
+    upload_list->Load(base::OnceClosure());
   }
-  WaitForUploadList();
-  upload_list->ClearDelegate();
 
   // Read the list a few times to try and race one of the loads above.
   for (int i = 1; i <= 4; ++i) {
diff --git a/components/upload_list/upload_list.cc b/components/upload_list/upload_list.cc
index 082c01df..3c8d947 100644
--- a/components/upload_list/upload_list.cc
+++ b/components/upload_list/upload_list.cc
@@ -9,14 +9,7 @@
 #include <utility>
 
 #include "base/bind.h"
-#include "base/files/file_util.h"
-#include "base/location.h"
-#include "base/sequenced_task_runner.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_split.h"
-#include "base/strings/string_util.h"
-#include "base/task_runner.h"
-#include "base/threading/sequenced_task_runner_handle.h"
+#include "base/task_scheduler/post_task.h"
 
 UploadList::UploadInfo::UploadInfo(const std::string& upload_id,
                                    const base::Time& upload_time,
@@ -52,98 +45,28 @@
 
 UploadList::UploadInfo::~UploadInfo() = default;
 
-UploadList::UploadList(Delegate* delegate,
-                       const base::FilePath& upload_log_path,
-                       scoped_refptr<base::TaskRunner> task_runner)
-    : delegate_(delegate),
-      upload_log_path_(upload_log_path),
-      task_runner_(std::move(task_runner)) {}
+UploadList::UploadList() = default;
 
 UploadList::~UploadList() = default;
 
-void UploadList::LoadUploadListAsynchronously() {
+void UploadList::Load(base::OnceClosure callback) {
   DCHECK(sequence_checker_.CalledOnValidSequence());
-  task_runner_->PostTask(
-      FROM_HERE, base::Bind(&UploadList::PerformLoadAndNotifyDelegate, this,
-                            base::SequencedTaskRunnerHandle::Get()));
+  callback_ = std::move(callback);
+  base::PostTaskWithTraitsAndReplyWithResult(
+      FROM_HERE, LoadingTaskTraits(),
+      base::Bind(&UploadList::LoadUploadList, this),
+      base::Bind(&UploadList::OnLoadComplete, this));
 }
 
-void UploadList::ClearDelegate() {
+void UploadList::CancelCallback() {
+  callback_.Reset();
+}
+
+void UploadList::RequestSingleUploadAsync(const std::string& local_id) {
   DCHECK(sequence_checker_.CalledOnValidSequence());
-  delegate_ = NULL;
-}
-
-void UploadList::PerformLoadAndNotifyDelegate(
-    scoped_refptr<base::SequencedTaskRunner> task_runner) {
-  std::vector<UploadInfo> uploads;
-  LoadUploadList(&uploads);
-  task_runner->PostTask(
-      FROM_HERE,
-      base::Bind(&UploadList::SetUploadsAndNotifyDelegate, this,
-                 std::move(uploads)));
-}
-
-void UploadList::LoadUploadList(std::vector<UploadInfo>* uploads) {
-  if (base::PathExists(upload_log_path_)) {
-    std::string contents;
-    base::ReadFileToString(upload_log_path_, &contents);
-    std::vector<std::string> log_entries = base::SplitString(
-        contents, base::kWhitespaceASCII, base::KEEP_WHITESPACE,
-        base::SPLIT_WANT_NONEMPTY);
-    ParseLogEntries(log_entries, uploads);
-  }
-}
-
-const base::FilePath& UploadList::upload_log_path() const {
-  return upload_log_path_;
-}
-
-void UploadList::ParseLogEntries(
-    const std::vector<std::string>& log_entries,
-    std::vector<UploadInfo>* uploads) {
-  std::vector<std::string>::const_reverse_iterator i;
-  for (i = log_entries.rbegin(); i != log_entries.rend(); ++i) {
-    std::vector<std::string> components = base::SplitString(
-        *i, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
-    // Skip any blank (or corrupted) lines.
-    if (components.size() < 2 || components.size() > 5)
-      continue;
-    base::Time upload_time;
-    double seconds_since_epoch;
-    if (!components[0].empty()) {
-      if (!base::StringToDouble(components[0], &seconds_since_epoch))
-        continue;
-      upload_time = base::Time::FromDoubleT(seconds_since_epoch);
-    }
-    UploadInfo info(components[1], upload_time);
-
-    // Add local ID if present.
-    if (components.size() > 2)
-      info.local_id = components[2];
-
-    // Add capture time if present.
-    if (components.size() > 3 &&
-        !components[3].empty() &&
-        base::StringToDouble(components[3], &seconds_since_epoch)) {
-      info.capture_time = base::Time::FromDoubleT(seconds_since_epoch);
-    }
-
-    int state;
-    if (components.size() > 4 &&
-        !components[4].empty() &&
-        base::StringToInt(components[4], &state)) {
-      info.state = static_cast<UploadInfo::State>(state);
-    }
-
-    uploads->push_back(info);
-  }
-}
-
-void UploadList::SetUploadsAndNotifyDelegate(std::vector<UploadInfo> uploads) {
-  DCHECK(sequence_checker_.CalledOnValidSequence());
-  uploads_ = std::move(uploads);
-  if (delegate_)
-    delegate_->OnUploadListAvailable();
+  base::PostTaskWithTraits(
+      FROM_HERE, LoadingTaskTraits(),
+      base::Bind(&UploadList::RequestSingleUpload, this, local_id));
 }
 
 void UploadList::GetUploads(size_t max_count,
@@ -154,15 +77,14 @@
             std::back_inserter(*uploads));
 }
 
-void UploadList::RequestSingleCrashUploadAsync(const std::string& local_id) {
-  DCHECK(sequence_checker_.CalledOnValidSequence());
-  task_runner_->PostTask(
-      FROM_HERE,
-      base::Bind(&UploadList::RequestSingleCrashUpload, this, local_id));
-}
-
-void UploadList::RequestSingleCrashUpload(const std::string& local_id) {
+void UploadList::RequestSingleUpload(const std::string& local_id) {
   // Manual uploads for not-yet uploaded crash reports are only available for
   // Crashpad systems and for Android.
   NOTREACHED();
 }
+
+void UploadList::OnLoadComplete(const std::vector<UploadInfo>& uploads) {
+  uploads_ = uploads;
+  if (!callback_.is_null())
+    std::move(callback_).Run();
+}
diff --git a/components/upload_list/upload_list.h b/components/upload_list/upload_list.h
index ebcab50..8b5a866 100644
--- a/components/upload_list/upload_list.h
+++ b/components/upload_list/upload_list.h
@@ -10,26 +10,19 @@
 #include <string>
 #include <vector>
 
-#include "base/files/file_path.h"
+#include "base/callback.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/sequence_checker.h"
+#include "base/task_scheduler/task_traits.h"
 #include "base/time/time.h"
 
-namespace base {
-class SequencedTaskRunner;
-class TaskRunner;
-}
-
-// Loads and parses an upload list text file of the format
-// upload_time,upload_id[,local_id[,capture_time[,state]]]
-// upload_time,upload_id[,local_id[,capture_time[,state]]]
-// etc.
-// where each line represents an upload. |upload_time| and |capture_time| are in
-// Unix time. |state| is an int in the range of UploadInfo::State. Must be used
-// from the UI thread. The loading and parsing is done on a blocking pool task
-// runner. A line may or may not contain |local_id|, |capture_time|, and
-// |state|.
+// An UploadList is an abstraction over a list of client-side data files that
+// are uploaded to a server. The UploadList allows accessing the UploadInfo
+// for these files, usually to display in a UI.
+//
+// The UploadList loads the information asynchronously and notifies the
+// client that requested the information when it is available.
 class UploadList : public base::RefCountedThreadSafe<UploadList> {
  public:
   struct UploadInfo {
@@ -71,75 +64,53 @@
     base::string16 file_size;
   };
 
-  class Delegate {
-   public:
-    // Invoked when the upload list has been loaded. Will be called on the
-    // UI thread.
-    virtual void OnUploadListAvailable() = 0;
-
-   protected:
-    virtual ~Delegate() {}
-  };
-
   // Creates a new upload list with the given callback delegate.
-  UploadList(Delegate* delegate,
-             const base::FilePath& upload_log_path,
-             scoped_refptr<base::TaskRunner> task_runner);
+  UploadList();
 
   // Starts loading the upload list. OnUploadListAvailable will be called when
-  // loading is complete.
-  void LoadUploadListAsynchronously();
+  // loading is complete. If this is called twice, the second |callback| will
+  // overwrite the previously supplied one, and the first will not be called.
+  void Load(base::OnceClosure callback);
+
+  // Clears any callback specified in Load().
+  void CancelCallback();
 
   // Asynchronously requests a user triggered upload.
-  void RequestSingleCrashUploadAsync(const std::string& local_id);
-
-  // Clears the delegate, so that any outstanding asynchronous load will not
-  // call the delegate on completion.
-  void ClearDelegate();
+  void RequestSingleUploadAsync(const std::string& local_id);
 
   // Populates |uploads| with the |max_count| most recent uploads,
   // in reverse chronological order.
-  // Must be called only after OnUploadListAvailable has been called.
+  // Must be called only after a Load() callback has been received.
   void GetUploads(size_t max_count, std::vector<UploadInfo>* uploads);
 
  protected:
   virtual ~UploadList();
 
+  // Returns the TaskTraits that should be used for LoadUploadList() and
+  // RequestSingleUpload().
+  virtual base::TaskTraits LoadingTaskTraits() = 0;
+
   // Reads the upload log and stores the entries in |uploads|.
-  virtual void LoadUploadList(std::vector<UploadInfo>* uploads);
+  virtual std::vector<UploadInfo> LoadUploadList() = 0;
 
   // Requests a user triggered upload for a crash report with a given id.
-  virtual void RequestSingleCrashUpload(const std::string& local_id);
-
-  const base::FilePath& upload_log_path() const;
+  virtual void RequestSingleUpload(const std::string& local_id);
 
  private:
   friend class base::RefCountedThreadSafe<UploadList>;
 
-  // Manages the background thread work for LoadUploadListAsynchronously().
-  void PerformLoadAndNotifyDelegate(
-      scoped_refptr<base::SequencedTaskRunner> task_runner);
-
-  // Calls the delegate's callback method, if there is a delegate. Stores
-  // the newly loaded |uploads| into |uploads_| on the delegate's task runner.
-  void SetUploadsAndNotifyDelegate(std::vector<UploadInfo> uploads);
-
-  // Parses upload log lines, converting them to UploadInfo entries.
-  void ParseLogEntries(const std::vector<std::string>& log_entries,
-                       std::vector<UploadInfo>* uploads);
+  // When LoadUploadList() finishes, the results are reported in |uploads|
+  // and the |callback_| is run.
+  void OnLoadComplete(const std::vector<UploadInfo>& uploads);
 
   // Ensures that this class' thread unsafe state is only accessed from the
   // sequence that owns this UploadList.
   base::SequenceChecker sequence_checker_;
 
+  base::OnceClosure callback_;
+
   std::vector<UploadInfo> uploads_;
 
-  Delegate* delegate_;
-
-  const base::FilePath upload_log_path_;
-
-  const scoped_refptr<base::TaskRunner> task_runner_;
-
   DISALLOW_COPY_AND_ASSIGN(UploadList);
 };
 
diff --git a/content/browser/frame_host/navigation_handle_impl.cc b/content/browser/frame_host/navigation_handle_impl.cc
index 4f024e8..20437dd 100644
--- a/content/browser/frame_host/navigation_handle_impl.cc
+++ b/content/browser/frame_host/navigation_handle_impl.cc
@@ -375,10 +375,25 @@
   NavigationThrottle::ThrottleCheckResult result = NavigationThrottle::DEFER;
   if (state_ == DEFERRING_START) {
     result = CheckWillStartRequest();
+    if (result == NavigationThrottle::DEFER) {
+      // DO NOT ADD CODE: the NavigationHandle might have been destroyed during
+      // one of the NavigationThrottle checks.
+      return;
+    }
   } else if (state_ == DEFERRING_REDIRECT) {
     result = CheckWillRedirectRequest();
+    if (result == NavigationThrottle::DEFER) {
+      // DO NOT ADD CODE: the NavigationHandle might have been destroyed during
+      // one of the NavigationThrottle checks.
+      return;
+    }
   } else {
     result = CheckWillProcessResponse();
+    if (result == NavigationThrottle::DEFER) {
+      // DO NOT ADD CODE: the NavigationHandle might have been destroyed during
+      // one of the NavigationThrottle checks.
+      return;
+    }
 
     // If the navigation is about to proceed after having been deferred while
     // processing the response, then it's ready to commit. Determine which
@@ -389,12 +404,11 @@
     if (result == NavigationThrottle::PROCEED && !MaybeTransferAndProceed())
       return;
   }
+  DCHECK_NE(NavigationThrottle::DEFER, result);
 
-  if (result != NavigationThrottle::DEFER) {
-    TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
-                                 "Resuming");
-    RunCompleteCallback(result);
-  }
+  TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
+                               "Resuming");
+  RunCompleteCallback(result);
 }
 
 void NavigationHandleImpl::CancelDeferredNavigation(
@@ -615,13 +629,15 @@
 
   // Notify each throttle of the request.
   NavigationThrottle::ThrottleCheckResult result = CheckWillStartRequest();
-
-  // If the navigation is not deferred, run the callback.
-  if (result != NavigationThrottle::DEFER) {
-    TRACE_EVENT_ASYNC_STEP_INTO1("navigation", "NavigationHandle", this,
-                                 "StartRequest", "result", result);
-    RunCompleteCallback(result);
+  if (result == NavigationThrottle::DEFER) {
+    // DO NOT ADD CODE: the NavigationHandle might have been destroyed during
+    // one of the NavigationThrottle checks.
+    return;
   }
+
+  TRACE_EVENT_ASYNC_STEP_INTO1("navigation", "NavigationHandle", this,
+                               "StartRequest", "result", result);
+  RunCompleteCallback(result);
 }
 
 void NavigationHandleImpl::WillRedirectRequest(
@@ -672,13 +688,15 @@
 
   // Notify each throttle of the request.
   NavigationThrottle::ThrottleCheckResult result = CheckWillRedirectRequest();
-
-  // If the navigation is not deferred, run the callback.
-  if (result != NavigationThrottle::DEFER) {
-    TRACE_EVENT_ASYNC_STEP_INTO1("navigation", "NavigationHandle", this,
-                                 "RedirectRequest", "result", result);
-    RunCompleteCallback(result);
+  if (result == NavigationThrottle::DEFER) {
+    // DO NOT ADD CODE: the NavigationHandle might have been destroyed during
+    // one of the NavigationThrottle checks.
+    return;
   }
+
+  TRACE_EVENT_ASYNC_STEP_INTO1("navigation", "NavigationHandle", this,
+                               "RedirectRequest", "result", result);
+  RunCompleteCallback(result);
 }
 
 void NavigationHandleImpl::WillProcessResponse(
@@ -710,6 +728,11 @@
 
   // Notify each throttle of the response.
   NavigationThrottle::ThrottleCheckResult result = CheckWillProcessResponse();
+  if (result == NavigationThrottle::DEFER) {
+    // DO NOT ADD CODE: the NavigationHandle might have been destroyed during
+    // one of the NavigationThrottle checks.
+    return;
+  }
 
   // If the navigation is done processing the response, then it's ready to
   // commit. Determine which RenderFrameHost should render the response, based
@@ -719,12 +742,9 @@
   if (result == NavigationThrottle::PROCEED && !MaybeTransferAndProceed())
     return;
 
-  // If the navigation is not deferred, run the callback.
-  if (result != NavigationThrottle::DEFER) {
-    TRACE_EVENT_ASYNC_STEP_INTO1("navigation", "NavigationHandle", this,
-                                 "ProcessResponse", "result", result);
-    RunCompleteCallback(result);
-  }
+  TRACE_EVENT_ASYNC_STEP_INTO1("navigation", "NavigationHandle", this,
+                               "ProcessResponse", "result", result);
+  RunCompleteCallback(result);
 }
 
 void NavigationHandleImpl::ReadyToCommitNavigation(
@@ -865,9 +885,15 @@
   DCHECK(state_ == WILL_SEND_REQUEST || state_ == DEFERRING_START);
   DCHECK(state_ != WILL_SEND_REQUEST || next_index_ == 0);
   DCHECK(state_ != DEFERRING_START || next_index_ != 0);
+  base::WeakPtr<NavigationHandleImpl> weak_ref = weak_factory_.GetWeakPtr();
   for (size_t i = next_index_; i < throttles_.size(); ++i) {
     NavigationThrottle::ThrottleCheckResult result =
         throttles_[i]->WillStartRequest();
+    if (!weak_ref) {
+      // The NavigationThrottle execution has destroyed this NavigationHandle.
+      // Return immediately.
+      return NavigationThrottle::DEFER;
+    }
     TRACE_EVENT_ASYNC_STEP_INTO0(
         "navigation", "NavigationHandle", this,
         base::StringPrintf("CheckWillStartRequest: %s: %d",
@@ -905,9 +931,15 @@
   DCHECK(state_ != WILL_REDIRECT_REQUEST || next_index_ == 0);
   DCHECK(state_ != DEFERRING_REDIRECT || next_index_ != 0);
 
+  base::WeakPtr<NavigationHandleImpl> weak_ref = weak_factory_.GetWeakPtr();
   for (size_t i = next_index_; i < throttles_.size(); ++i) {
     NavigationThrottle::ThrottleCheckResult result =
         throttles_[i]->WillRedirectRequest();
+    if (!weak_ref) {
+      // The NavigationThrottle execution has destroyed this NavigationHandle.
+      // Return immediately.
+      return NavigationThrottle::DEFER;
+    }
     TRACE_EVENT_ASYNC_STEP_INTO0(
         "navigation", "NavigationHandle", this,
         base::StringPrintf("CheckWillRedirectRequest: %s: %d",
@@ -952,9 +984,15 @@
   DCHECK(state_ != WILL_PROCESS_RESPONSE || next_index_ == 0);
   DCHECK(state_ != DEFERRING_RESPONSE || next_index_ != 0);
 
+  base::WeakPtr<NavigationHandleImpl> weak_ref = weak_factory_.GetWeakPtr();
   for (size_t i = next_index_; i < throttles_.size(); ++i) {
     NavigationThrottle::ThrottleCheckResult result =
         throttles_[i]->WillProcessResponse();
+    if (!weak_ref) {
+      // The NavigationThrottle execution has destroyed this NavigationHandle.
+      // Return immediately.
+      return NavigationThrottle::DEFER;
+    }
     TRACE_EVENT_ASYNC_STEP_INTO0(
         "navigation", "NavigationHandle", this,
         base::StringPrintf("CheckWillProcessResponse: %s: %d",
diff --git a/content/browser/frame_host/navigation_handle_impl_unittest.cc b/content/browser/frame_host/navigation_handle_impl_unittest.cc
index 0cb0857..c3bd36f1 100644
--- a/content/browser/frame_host/navigation_handle_impl_unittest.cc
+++ b/content/browser/frame_host/navigation_handle_impl_unittest.cc
@@ -6,6 +6,7 @@
 #include "base/macros.h"
 #include "content/public/browser/navigation_throttle.h"
 #include "content/public/browser/ssl_status.h"
+#include "content/public/common/browser_side_navigation_policy.h"
 #include "content/public/common/request_context_type.h"
 #include "content/public/common/url_constants.h"
 #include "content/test/test_content_browser_client.h"
@@ -82,6 +83,38 @@
   int will_process_response_calls_;
 };
 
+// Test version of a NavigationThrottle that will execute a callback when
+// called.
+class TestNavigationThrottleWithCallback : public NavigationThrottle {
+ public:
+  TestNavigationThrottleWithCallback(NavigationHandle* handle,
+                                     const base::RepeatingClosure& callback)
+      : NavigationThrottle(handle), callback_(callback) {}
+  ~TestNavigationThrottleWithCallback() override {}
+
+  NavigationThrottle::ThrottleCheckResult WillStartRequest() override {
+    callback_.Run();
+    return NavigationThrottle::PROCEED;
+  }
+
+  NavigationThrottle::ThrottleCheckResult WillRedirectRequest() override {
+    callback_.Run();
+    return NavigationThrottle::PROCEED;
+  }
+
+  NavigationThrottle::ThrottleCheckResult WillProcessResponse() override {
+    callback_.Run();
+    return NavigationThrottle::PROCEED;
+  }
+
+  const char* GetNameForLogging() override {
+    return "TestNavigationThrottleWithCallback";
+  }
+
+ private:
+  base::RepeatingClosure callback_;
+};
+
 class NavigationHandleImplTest : public RenderViewHostImplTestHarness {
  public:
   NavigationHandleImplTest()
@@ -90,14 +123,7 @@
 
   void SetUp() override {
     RenderViewHostImplTestHarness::SetUp();
-    test_handle_ = NavigationHandleImpl::Create(
-        GURL(), std::vector<GURL>(), main_test_rfh()->frame_tree_node(),
-        true,   // is_renderer_initiated
-        false,  // is_same_page
-        base::TimeTicks::Now(), 0,
-        false,                  // started_from_context_menu
-        CSPDisposition::CHECK,  // should_check_main_world_csp
-        false);                 // is_form_submission
+    CreateNavigationHandle();
     EXPECT_EQ(REQUEST_CONTEXT_TYPE_UNSPECIFIED,
               test_handle_->request_context_type_);
     contents()->GetMainFrame()->InitializeRenderFrameIfNeeded();
@@ -204,6 +230,28 @@
     return test_throttle;
   }
 
+  // Creates and register a NavigationThrottle that will delete the
+  // NavigationHandle in checks.
+  void AddDeletingNavigationThrottle() {
+    DCHECK(test_handle_);
+    test_handle()->RegisterThrottleForTesting(
+        base::MakeUnique<TestNavigationThrottleWithCallback>(
+            test_handle(), base::BindRepeating(
+                               &NavigationHandleImplTest::ResetNavigationHandle,
+                               base::Unretained(this))));
+  }
+
+  void CreateNavigationHandle() {
+    test_handle_ = NavigationHandleImpl::Create(
+        GURL(), std::vector<GURL>(), main_test_rfh()->frame_tree_node(),
+        true,   // is_renderer_initiated
+        false,  // is_same_page
+        base::TimeTicks::Now(), 0,
+        false,                  // started_from_context_menu
+        CSPDisposition::CHECK,  // should_check_main_world_csp
+        false);                 // is_form_submission
+  }
+
  private:
   // The callback provided to NavigationHandleImpl::WillStartRequest and
   // NavigationHandleImpl::WillRedirectRequest during the tests.
@@ -213,6 +261,8 @@
     was_callback_called_ = true;
   }
 
+  void ResetNavigationHandle() { test_handle_ = nullptr; }
+
   std::unique_ptr<NavigationHandleImpl> test_handle_;
   bool was_callback_called_;
   NavigationThrottle::ThrottleCheckResult callback_result_;
@@ -812,4 +862,86 @@
   EXPECT_EQ(0, proceed_throttle->will_process_response_calls());
 }
 
+// Checks that a NavigationHandle can be safely deleted by teh execution of one
+// of its NavigationThrottle.
+TEST_F(NavigationHandleImplTest, DeletionByNavigationThrottle) {
+  // Test deletion in WillStartRequest.
+  AddDeletingNavigationThrottle();
+  SimulateWillStartRequest();
+  EXPECT_EQ(nullptr, test_handle());
+  if (IsBrowserSideNavigationEnabled()) {
+    EXPECT_FALSE(was_callback_called());
+  } else {
+    EXPECT_EQ(NavigationThrottle::CANCEL_AND_IGNORE, callback_result());
+  }
+
+  // Test deletion in WillStartRequest after being deferred.
+  CreateNavigationHandle();
+  CreateTestNavigationThrottle(NavigationThrottle::DEFER);
+  AddDeletingNavigationThrottle();
+  SimulateWillStartRequest();
+  EXPECT_NE(nullptr, test_handle());
+  test_handle()->Resume();
+  EXPECT_EQ(nullptr, test_handle());
+  if (IsBrowserSideNavigationEnabled()) {
+    EXPECT_FALSE(was_callback_called());
+  } else {
+    EXPECT_EQ(NavigationThrottle::CANCEL_AND_IGNORE, callback_result());
+  }
+
+  // Test deletion in WillRedirectRequest.
+  CreateNavigationHandle();
+  SimulateWillStartRequest();
+  AddDeletingNavigationThrottle();
+  SimulateWillRedirectRequest();
+  EXPECT_EQ(nullptr, test_handle());
+  if (IsBrowserSideNavigationEnabled()) {
+    EXPECT_FALSE(was_callback_called());
+  } else {
+    EXPECT_EQ(NavigationThrottle::CANCEL_AND_IGNORE, callback_result());
+  }
+
+  // Test deletion in WillRedirectRequest after being deferred.
+  CreateNavigationHandle();
+  SimulateWillStartRequest();
+  CreateTestNavigationThrottle(NavigationThrottle::DEFER);
+  AddDeletingNavigationThrottle();
+  SimulateWillRedirectRequest();
+  EXPECT_NE(nullptr, test_handle());
+  test_handle()->Resume();
+  EXPECT_EQ(nullptr, test_handle());
+  if (IsBrowserSideNavigationEnabled()) {
+    EXPECT_FALSE(was_callback_called());
+  } else {
+    EXPECT_EQ(NavigationThrottle::CANCEL_AND_IGNORE, callback_result());
+  }
+
+  // Test deletion in WillProcessResponse.
+  CreateNavigationHandle();
+  SimulateWillStartRequest();
+  AddDeletingNavigationThrottle();
+  SimulateWillProcessResponse();
+  EXPECT_EQ(nullptr, test_handle());
+  if (IsBrowserSideNavigationEnabled()) {
+    EXPECT_FALSE(was_callback_called());
+  } else {
+    EXPECT_EQ(NavigationThrottle::CANCEL_AND_IGNORE, callback_result());
+  }
+
+  // Test deletion in WillProcessResponse after being deferred.
+  CreateNavigationHandle();
+  SimulateWillStartRequest();
+  CreateTestNavigationThrottle(NavigationThrottle::DEFER);
+  AddDeletingNavigationThrottle();
+  SimulateWillProcessResponse();
+  EXPECT_NE(nullptr, test_handle());
+  test_handle()->Resume();
+  EXPECT_EQ(nullptr, test_handle());
+  if (IsBrowserSideNavigationEnabled()) {
+    EXPECT_FALSE(was_callback_called());
+  } else {
+    EXPECT_EQ(NavigationThrottle::CANCEL_AND_IGNORE, callback_result());
+  }
+}
+
 }  // namespace content
diff --git a/headless/app/headless_shell.cc b/headless/app/headless_shell.cc
index aace371..f5f288d 100644
--- a/headless/app/headless_shell.cc
+++ b/headless/app/headless_shell.cc
@@ -623,13 +623,9 @@
   if (command_line.HasSwitch(switches::kProxyServer)) {
     std::string proxy_server =
         command_line.GetSwitchValueASCII(switches::kProxyServer);
-    net::HostPortPair parsed_proxy_server =
-        net::HostPortPair::FromString(proxy_server);
-    if (parsed_proxy_server.host().empty() || !parsed_proxy_server.port()) {
-      LOG(ERROR) << "Malformed proxy server url";
-      return EXIT_FAILURE;
-    }
-    builder.SetProxyServer(parsed_proxy_server);
+    std::unique_ptr<net::ProxyConfig> proxy_config(new net::ProxyConfig);
+    proxy_config->proxy_rules().ParseFromString(proxy_server);
+    builder.SetProxyConfig(std::move(proxy_config));
   }
 
   if (command_line.HasSwitch(switches::kHostResolverRules)) {
diff --git a/headless/lib/browser/headless_browser_context_impl.cc b/headless/lib/browser/headless_browser_context_impl.cc
index aadea8fe..1954451 100644
--- a/headless/lib/browser/headless_browser_context_impl.cc
+++ b/headless/lib/browser/headless_browser_context_impl.cc
@@ -381,9 +381,9 @@
 }
 
 HeadlessBrowserContext::Builder&
-HeadlessBrowserContext::Builder::SetProxyServer(
-    const net::HostPortPair& proxy_server) {
-  options_->proxy_server_ = proxy_server;
+HeadlessBrowserContext::Builder::SetProxyConfig(
+    std::unique_ptr<net::ProxyConfig> proxy_config) {
+  options_->proxy_config_ = std::move(proxy_config);
   return *this;
 }
 
diff --git a/headless/lib/browser/headless_browser_context_options.cc b/headless/lib/browser/headless_browser_context_options.cc
index e31158bd..5ca1ab3 100644
--- a/headless/lib/browser/headless_browser_context_options.cc
+++ b/headless/lib/browser/headless_browser_context_options.cc
@@ -45,8 +45,10 @@
   return browser_options_->user_agent;
 }
 
-const net::HostPortPair& HeadlessBrowserContextOptions::proxy_server() const {
-  return ReturnOverriddenValue(proxy_server_, browser_options_->proxy_server);
+const net::ProxyConfig* HeadlessBrowserContextOptions::proxy_config() const {
+  if (proxy_config_)
+    return proxy_config_.get();
+  return browser_options_->proxy_config.get();
 }
 
 const std::string& HeadlessBrowserContextOptions::host_resolver_rules() const {
diff --git a/headless/lib/browser/headless_browser_context_options.h b/headless/lib/browser/headless_browser_context_options.h
index f8096d8..1d3fb84 100644
--- a/headless/lib/browser/headless_browser_context_options.h
+++ b/headless/lib/browser/headless_browser_context_options.h
@@ -29,8 +29,8 @@
   const std::string& product_name_and_version() const;
   const std::string& user_agent() const;
 
-  // See HeadlessBrowser::Options::proxy_server.
-  const net::HostPortPair& proxy_server() const;
+  // See HeadlessBrowser::Options::proxy_config.
+  const net::ProxyConfig* proxy_config() const;
 
   // See HeadlessBrowser::Options::host_resolver_rules.
   const std::string& host_resolver_rules() const;
@@ -62,7 +62,7 @@
   HeadlessBrowser::Options* browser_options_;
 
   base::Optional<std::string> product_name_and_version_;
-  base::Optional<net::HostPortPair> proxy_server_;
+  std::unique_ptr<net::ProxyConfig> proxy_config_;
   base::Optional<std::string> host_resolver_rules_;
   base::Optional<gfx::Size> window_size_;
   base::Optional<base::FilePath> user_data_dir_;
diff --git a/headless/lib/browser/headless_url_request_context_getter.cc b/headless/lib/browser/headless_url_request_context_getter.cc
index f3ebc55e..bb00b63a 100644
--- a/headless/lib/browser/headless_url_request_context_getter.cc
+++ b/headless/lib/browser/headless_url_request_context_getter.cc
@@ -33,7 +33,7 @@
           {base::MayBlock(), base::TaskPriority::BACKGROUND})),
       user_agent_(options->user_agent()),
       host_resolver_rules_(options->host_resolver_rules()),
-      proxy_server_(options->proxy_server()),
+      proxy_config_(options->proxy_config()),
       request_interceptors_(std::move(request_interceptors)),
       net_log_(net_log),
       headless_browser_context_(headless_browser_context) {
@@ -52,7 +52,7 @@
   // We must create the proxy config service on the UI loop on Linux because it
   // must synchronously run on the glib message loop. This will be passed to
   // the URLRequestContextStorage on the IO thread in GetURLRequestContext().
-  if (proxy_server_.IsEmpty()) {
+  if (!proxy_config_) {
     proxy_config_service_ =
         net::ProxyService::CreateSystemProxyConfigService(io_task_runner_);
   }
@@ -71,9 +71,8 @@
     builder.set_data_enabled(true);
     builder.set_file_enabled(true);
     builder.SetFileTaskRunner(file_task_runner_);
-    if (!proxy_server_.IsEmpty()) {
-      builder.set_proxy_service(
-          net::ProxyService::CreateFixed(proxy_server_.ToString()));
+    if (proxy_config_) {
+      builder.set_proxy_service(net::ProxyService::CreateFixed(*proxy_config_));
     } else {
       builder.set_proxy_config_service(std::move(proxy_config_service_));
     }
diff --git a/headless/lib/browser/headless_url_request_context_getter.h b/headless/lib/browser/headless_url_request_context_getter.h
index 79cef02..5080fa89 100644
--- a/headless/lib/browser/headless_url_request_context_getter.h
+++ b/headless/lib/browser/headless_url_request_context_getter.h
@@ -16,6 +16,7 @@
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/content_browser_client.h"
 #include "headless/public/headless_browser.h"
+#include "net/proxy/proxy_config.h"
 #include "net/proxy/proxy_config_service.h"
 #include "net/url_request/url_request_context_getter.h"
 #include "net/url_request/url_request_job_factory.h"
@@ -61,7 +62,7 @@
   // thread.
   std::string user_agent_;
   std::string host_resolver_rules_;
-  net::HostPortPair proxy_server_;
+  const net::ProxyConfig* proxy_config_;  // Not owned.
 
   std::unique_ptr<net::ProxyConfigService> proxy_config_service_;
   std::unique_ptr<net::URLRequestContext> url_request_context_;
diff --git a/headless/lib/headless_browser_browsertest.cc b/headless/lib/headless_browser_browsertest.cc
index 5ca4e66..1206725 100644
--- a/headless/lib/headless_browser_browsertest.cc
+++ b/headless/lib/headless_browser_browsertest.cc
@@ -207,11 +207,14 @@
   net::SpawnedTestServer proxy_server_;
 };
 
-IN_PROC_BROWSER_TEST_F(HeadlessBrowserTestWithProxy, SetProxyServer) {
+IN_PROC_BROWSER_TEST_F(HeadlessBrowserTestWithProxy, SetProxyConfig) {
+  std::unique_ptr<net::ProxyConfig> proxy_config(new net::ProxyConfig);
+  proxy_config->proxy_rules().ParseFromString(
+      proxy_server()->host_port_pair().ToString());
   HeadlessBrowserContext* browser_context =
       browser()
           ->CreateBrowserContextBuilder()
-          .SetProxyServer(proxy_server()->host_port_pair())
+          .SetProxyConfig(std::move(proxy_config))
           .Build();
 
   // Load a page which doesn't actually exist, but for which the our proxy
diff --git a/headless/public/headless_browser.cc b/headless/public/headless_browser.cc
index 4eed919..d70edaf6 100644
--- a/headless/public/headless_browser.cc
+++ b/headless/public/headless_browser.cc
@@ -99,8 +99,9 @@
   return *this;
 }
 
-Builder& Builder::SetProxyServer(const net::HostPortPair& proxy_server) {
-  options_.proxy_server = proxy_server;
+Builder& Builder::SetProxyConfig(
+    std::unique_ptr<net::ProxyConfig> proxy_config) {
+  options_.proxy_config = std::move(proxy_config);
   return *this;
 }
 
diff --git a/headless/public/headless_browser.h b/headless/public/headless_browser.h
index dc431c73..63f6c74 100644
--- a/headless/public/headless_browser.h
+++ b/headless/public/headless_browser.h
@@ -18,7 +18,6 @@
 #include "headless/public/headless_browser_context.h"
 #include "headless/public/headless_export.h"
 #include "headless/public/headless_web_contents.h"
-#include "net/base/host_port_pair.h"
 #include "net/base/ip_endpoint.h"
 #include "ui/gfx/geometry/size.h"
 
@@ -152,9 +151,8 @@
   std::string product_name_and_version;
   std::string user_agent;
 
-  // Address of the HTTP/HTTPS proxy server to use. The system proxy settings
-  // are used by default.
-  net::HostPortPair proxy_server;
+  // The ProxyConfig to use. The system proxy settings are used by default.
+  std::unique_ptr<net::ProxyConfig> proxy_config;
 
   // Comma-separated list of rules that control how hostnames are mapped. See
   // chrome::switches::kHostRules for a description for the format.
@@ -218,7 +216,7 @@
   Builder& SetProductNameAndVersion(
       const std::string& product_name_and_version);
   Builder& SetUserAgent(const std::string& user_agent);
-  Builder& SetProxyServer(const net::HostPortPair& proxy_server);
+  Builder& SetProxyConfig(std::unique_ptr<net::ProxyConfig> proxy_config);
   Builder& SetHostResolverRules(const std::string& host_resolver_rules);
   Builder& SetWindowSize(const gfx::Size& window_size);
   Builder& SetUserDataDir(const base::FilePath& user_data_dir);
diff --git a/headless/public/headless_browser_context.h b/headless/public/headless_browser_context.h
index 60b73ca6..0b2a002 100644
--- a/headless/public/headless_browser_context.h
+++ b/headless/public/headless_browser_context.h
@@ -16,7 +16,7 @@
 #include "content/public/common/web_preferences.h"
 #include "headless/public/headless_export.h"
 #include "headless/public/headless_web_contents.h"
-#include "net/base/host_port_pair.h"
+#include "net/proxy/proxy_service.h"
 #include "net/url_request/url_request_job_factory.h"
 
 namespace base {
@@ -121,7 +121,7 @@
   Builder& SetProductNameAndVersion(
       const std::string& product_name_and_version);
   Builder& SetUserAgent(const std::string& user_agent);
-  Builder& SetProxyServer(const net::HostPortPair& proxy_server);
+  Builder& SetProxyConfig(std::unique_ptr<net::ProxyConfig> proxy_config);
   Builder& SetHostResolverRules(const std::string& host_resolver_rules);
   Builder& SetWindowSize(const gfx::Size& window_size);
   Builder& SetUserDataDir(const base::FilePath& user_data_dir);
diff --git a/ios/chrome/browser/crash_report/crash_upload_list.cc b/ios/chrome/browser/crash_report/crash_upload_list.cc
index 17d5519..6f216da 100644
--- a/ios/chrome/browser/crash_report/crash_upload_list.cc
+++ b/ios/chrome/browser/crash_report/crash_upload_list.cc
@@ -6,20 +6,18 @@
 
 #include "base/files/file_path.h"
 #include "base/path_service.h"
-#include "base/threading/sequenced_worker_pool.h"
+#include "components/upload_list/crash_upload_list.h"
+#include "components/upload_list/text_log_upload_list.h"
 #include "ios/chrome/browser/chrome_paths.h"
-#include "ios/web/public/web_thread.h"
 
 namespace ios {
 
-scoped_refptr<CrashUploadList> CreateCrashUploadList(
-    UploadList::Delegate* delegate) {
+scoped_refptr<UploadList> CreateCrashUploadList() {
   base::FilePath crash_dir_path;
   PathService::Get(ios::DIR_CRASH_DUMPS, &crash_dir_path);
   base::FilePath upload_log_path =
       crash_dir_path.AppendASCII(CrashUploadList::kReporterLogFilename);
-  return new CrashUploadList(delegate, upload_log_path,
-                             web::WebThread::GetBlockingPool());
+  return new TextLogUploadList(upload_log_path);
 }
 
 }  // namespace ios
diff --git a/ios/chrome/browser/crash_report/crash_upload_list.h b/ios/chrome/browser/crash_report/crash_upload_list.h
index 4f4ce42..b84f05cd 100644
--- a/ios/chrome/browser/crash_report/crash_upload_list.h
+++ b/ios/chrome/browser/crash_report/crash_upload_list.h
@@ -6,14 +6,13 @@
 #define IOS_CHROME_BROWSER_CRASH_REPORT_CRASH_UPLOAD_LIST_H_
 
 #include "base/memory/ref_counted.h"
-#include "components/upload_list/crash_upload_list.h"
+#include "components/upload_list/upload_list.h"
 
 namespace ios {
 
 // Factory that creates the platform-specific implementation of the crash
 // upload list with the given callback delegate.
-scoped_refptr<CrashUploadList> CreateCrashUploadList(
-    UploadList::Delegate* delegate);
+scoped_refptr<UploadList> CreateCrashUploadList();
 
 }  // namespace ios
 
diff --git a/ios/chrome/browser/ntp_tiles/BUILD.gn b/ios/chrome/browser/ntp_tiles/BUILD.gn
index e8ce0d2..5e2036d 100644
--- a/ios/chrome/browser/ntp_tiles/BUILD.gn
+++ b/ios/chrome/browser/ntp_tiles/BUILD.gn
@@ -29,3 +29,19 @@
     "//ios/web",
   ]
 }
+
+source_set("eg_tests") {
+  testonly = true
+  configs += [ "//build/config/compiler:enable_arc" ]
+  sources = [
+    "ntp_tiles_egtest.mm",
+  ]
+  deps = [
+    ":ntp_tiles",
+    "//components/ntp_tiles:ntp_tiles",
+    "//ios/chrome/test/app:test_support",
+    "//ios/chrome/test/earl_grey:test_support",
+    "//ios/testing:ios_test_support",
+    "//ios/web/public/test/http_server:http_server",
+  ]
+}
diff --git a/ios/chrome/browser/ntp_tiles/ntp_tiles_egtest.mm b/ios/chrome/browser/ntp_tiles/ntp_tiles_egtest.mm
new file mode 100644
index 0000000..6296993
--- /dev/null
+++ b/ios/chrome/browser/ntp_tiles/ntp_tiles_egtest.mm
@@ -0,0 +1,57 @@
+// 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 <EarlGrey/EarlGrey.h>
+
+#import "ios/chrome/test/app/chrome_test_util.h"
+#import "ios/chrome/test/app/history_test_util.h"
+#import "ios/chrome/test/app/tab_test_util.h"
+#import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_matchers.h"
+#import "ios/chrome/test/earl_grey/chrome_test_case.h"
+#import "ios/testing/wait_util.h"
+#import "ios/web/public/test/http_server/http_server.h"
+#include "ios/web/public/test/http_server/http_server_util.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+// Test case for NTP tiles.
+@interface NTPTilesTest : ChromeTestCase
+@end
+
+@implementation NTPTilesTest
+
+// Tests that loading a URL ends up creating an NTP tile.
+- (void)testTopSitesTileAfterLoadURL {
+  std::map<GURL, std::string> responses;
+  GURL URL = web::test::HttpServer::MakeUrl("http://simple_tile.html");
+  responses[URL] =
+      "<head><title>title1</title></head>"
+      "<body>You are here.</body>";
+  web::test::SetUpSimpleHttpServer(responses);
+
+  // Clear history and verify that the tile does not exist.
+  chrome_test_util::ClearBrowsingHistory();
+  [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
+  chrome_test_util::OpenNewTab();
+
+  [[EarlGrey selectElementWithMatcher:
+                 chrome_test_util::StaticTextWithAccessibilityLabel(@"title1")]
+      assertWithMatcher:grey_nil()];
+
+  [ChromeEarlGrey loadURL:URL];
+
+  // After loading URL, need to do another action before opening a new tab
+  // with the icon present.
+  [ChromeEarlGrey goBack];
+
+  chrome_test_util::OpenNewTab();
+  [[EarlGrey selectElementWithMatcher:
+                 chrome_test_util::StaticTextWithAccessibilityLabel(@"title1")]
+      assertWithMatcher:grey_notNil()];
+}
+
+@end
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_handset_view_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_home_handset_view_controller.mm
index d642cb6..429843b 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_home_handset_view_controller.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_handset_view_controller.mm
@@ -52,8 +52,7 @@
     BookmarkFolderViewControllerDelegate,
     BookmarkMenuViewDelegate,
     BookmarkModelBridgeObserver,
-    BookmarkPanelViewDelegate,
-    BookmarkPromoControllerDelegate> {
+    BookmarkPanelViewDelegate> {
   // Bridge to register for bookmark changes.
   std::unique_ptr<bookmarks::BookmarkModelBridge> _bridge;
 }
@@ -89,11 +88,6 @@
 @property(nonatomic, strong) BookmarkFolderViewController* folderSelector;
 // The view controller to present when editing the current folder.
 @property(nonatomic, strong) BookmarkFolderEditorViewController* folderEditor;
-#pragma mark Specific to this class.
-
-// The controller managing the display of the promo cell and the promo view
-// controller.
-@property(nonatomic, strong) BookmarkPromoController* bookmarkPromoController;
 
 #pragma mark View loading and switching
 // This method should be called at most once in the life-cycle of the
@@ -201,8 +195,6 @@
 @synthesize folderSelector = _folderSelector;
 @synthesize folderEditor = _folderEditor;
 
-@synthesize bookmarkPromoController = _bookmarkPromoController;
-
 @synthesize delegate = _delegate;
 @synthesize editIndexPaths = _editIndexPaths;
 @synthesize editing = _editing;
@@ -216,11 +208,6 @@
     [self resetEditNodes];
 
     _bridge.reset(new bookmarks::BookmarkModelBridge(self, self.bookmarks));
-    // It is important to initialize the promo controller with the browser state
-    // passed in, as it could be incognito.
-    _bookmarkPromoController =
-        [[BookmarkPromoController alloc] initWithBrowserState:browserState
-                                                     delegate:self];
   }
   return self;
 }
@@ -1071,13 +1058,6 @@
                                                  navigationToUrl:url];
 }
 
-#pragma mark - BookmarkPromoControllerDelegate
-
-- (void)promoStateChanged:(BOOL)promoEnabled {
-  [self.folderView
-      promoStateChangedAnimated:self.folderView == [self primaryView]];
-}
-
 - (NSIndexPath*)indexPathForCell:(UICollectionViewCell*)cell {
   DCHECK([self primaryView].collectionView);
   NSIndexPath* indexPath =
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_tablet_ntp_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_home_tablet_ntp_controller.mm
index f7d4eba..4c2ac35 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_home_tablet_ntp_controller.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_tablet_ntp_controller.mm
@@ -60,8 +60,7 @@
     BookmarkFolderEditorViewControllerDelegate,
     BookmarkFolderViewControllerDelegate,
     BookmarkMenuViewDelegate,
-    BookmarkModelBridgeObserver,
-    BookmarkPromoControllerDelegate> {
+    BookmarkModelBridgeObserver> {
   // Bridge to register for bookmark changes.
   std::unique_ptr<bookmarks::BookmarkModelBridge> _bridge;
 
@@ -112,9 +111,6 @@
 // The view controller to present when editing the current folder.
 @property(nonatomic, strong)
     BookmarkFolderEditorViewController* folderEditor;  // FIX
-// The controller managing the display of the promo cell and the promo view
-// controller.
-@property(nonatomic, strong) BookmarkPromoController* bookmarkPromoController;
 
 #pragma mark Specific to this class.
 
@@ -221,7 +217,6 @@
 @synthesize editViewController = _editViewController;
 @synthesize folderSelector = _folderSelector;
 @synthesize folderEditor = _folderEditor;
-@synthesize bookmarkPromoController = _bookmarkPromoController;
 
 // Property declared in NewTabPagePanelProtocol.
 @synthesize delegate = _delegate;
@@ -232,11 +227,6 @@
   if (self) {
     _bridge.reset(new bookmarks::BookmarkModelBridge(self, self.bookmarks));
     _editIndexPaths = [[NSMutableArray alloc] init];
-    // It is important to initialize the promo controller with the browser state
-    // passed in, as it could be incognito.
-    _bookmarkPromoController =
-        [[BookmarkPromoController alloc] initWithBrowserState:browserState
-                                                     delegate:self];
   }
   return self;
 }
@@ -1114,13 +1104,6 @@
   [self setEditing:NO animated:YES];
 }
 
-#pragma mark - BookmarkPromoControllerDelegate
-
-- (void)promoStateChanged:(BOOL)promoEnabled {
-  [self.folderView
-      promoStateChangedAnimated:self.folderView == [self primaryView]];
-}
-
 - (NSIndexPath*)indexPathForCell:(UICollectionViewCell*)cell {
   DCHECK([self primaryView].collectionView);
   NSIndexPath* indexPath =
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h
index 9f29228..7c671b5 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h
@@ -27,6 +27,7 @@
 @class BookmarkHomeWaitingView;
 @class BookmarkNavigationBar;
 @class BookmarkMenuItem;
+@class BookmarkPromoController;
 
 // Class to navigate the bookmark hierarchy, needs subclassing for tablet /
 // handset case.
@@ -92,6 +93,11 @@
 
 // The active collection view that corresponds to primaryMenuItem.
 - (UIView<BookmarkHomePrimaryView>*)primaryView;
+
+// The controller managing the display of the promo cell and the promo view
+// controller.
+@property(nonatomic, strong, readonly)
+    BookmarkPromoController* bookmarkPromoController;
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_BOOKMARKS_HOME_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm
index 4ebcdcc..261bc0c 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm
@@ -14,6 +14,7 @@
 #import "ios/chrome/browser/ui/bookmarks/bookmark_menu_item.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_menu_view.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_panel_view.h"
+#import "ios/chrome/browser/ui/bookmarks/bookmark_promo_controller.h"
 #import "ios/chrome/browser/ui/rtl_geometry.h"
 #import "ios/chrome/browser/ui/ui_util.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
@@ -26,8 +27,9 @@
 const CGFloat kMenuWidth = 264;
 }
 
-@interface BookmarkHomeViewController ()
+@interface BookmarkHomeViewController ()<BookmarkPromoControllerDelegate>
 // Read / write declaration of read only properties.
+@property(nonatomic, strong) BookmarkPromoController* bookmarkPromoController;
 @property(nonatomic, assign) bookmarks::BookmarkModel* bookmarks;
 @property(nonatomic, assign) ios::ChromeBrowserState* browserState;
 @property(nonatomic, strong) BookmarkCollectionView* folderView;
@@ -40,6 +42,7 @@
 
 @implementation BookmarkHomeViewController
 
+@synthesize bookmarkPromoController = _bookmarkPromoController;
 @synthesize bookmarks = _bookmarks;
 @synthesize browserState = _browserState;
 @synthesize folderView = _folderView;
@@ -66,6 +69,11 @@
     _loader = loader;
 
     _bookmarks = ios::BookmarkModelFactory::GetForBrowserState(browserState);
+    // It is important to initialize the promo controller with the browser state
+    // passed in, as it could be incognito.
+    _bookmarkPromoController =
+        [[BookmarkPromoController alloc] initWithBrowserState:browserState
+                                                     delegate:self];
   }
   return self;
 }
@@ -150,4 +158,11 @@
   return kMenuWidth;
 }
 
+#pragma mark - BookmarkPromoControllerDelegate
+
+- (void)promoStateChanged:(BOOL)promoEnabled {
+  [self.folderView
+      promoStateChangedAnimated:self.folderView == [self primaryView]];
+}
+
 @end
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_popup_material_view_controller.mm b/ios/chrome/browser/ui/omnibox/omnibox_popup_material_view_controller.mm
index f6da302..8f0c006 100644
--- a/ios/chrome/browser/ui/omnibox/omnibox_popup_material_view_controller.mm
+++ b/ios/chrome/browser/ui/omnibox/omnibox_popup_material_view_controller.mm
@@ -8,6 +8,8 @@
 
 #include "base/ios/ios_util.h"
 #include "base/mac/scoped_cftyperef.h"
+#include "base/metrics/user_metrics.h"
+#include "base/metrics/user_metrics_action.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #import "components/image_fetcher/ios/ios_image_data_fetcher_wrapper.h"
@@ -646,6 +648,15 @@
   NSUInteger row = [sender tag];
   const AutocompleteMatch& match =
       ((const AutocompleteResult&)_currentResult).match_at(row);
+
+  if (AutocompleteMatch::IsSearchType(match.type)) {
+    base::RecordAction(
+        base::UserMetricsAction("MobileOmniboxRefineSuggestion.Search"));
+  } else {
+    base::RecordAction(
+        base::UserMetricsAction("MobileOmniboxRefineSuggestion.Url"));
+  }
+
   // Make a defensive copy of |match.contents|, as CopyToOmnibox() will trigger
   // a new round of autocomplete and modify |_currentResult|.
   base::string16 contents(match.contents);
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_switcher_controller.mm b/ios/chrome/browser/ui/tab_switcher/tab_switcher_controller.mm
index fbf31011..a16f189 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_switcher_controller.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_switcher_controller.mm
@@ -468,8 +468,8 @@
 
 - (UIImage*)updateScreenshotForCellIfNeeded:(TabSwitcherLocalSessionCell*)cell
                                    tabModel:(TabModel*)tabModel {
-  if (cell.screenshot)
-    return cell.screenshot;
+  if (cell.snapshot)
+    return cell.snapshot;
   UIColor* backgroundColor = [tabModel isOffTheRecord]
                                  ? [[MDCPalette greyPalette] tint700]
                                  : [UIColor whiteColor];
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_cell.h b/ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_cell.h
index c290a783..c3b01b0 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_cell.h
+++ b/ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_cell.h
@@ -39,9 +39,12 @@
 // Cell showing information about a local session.
 @interface TabSwitcherLocalSessionCell : TabSwitcherSessionCell
 
+// Getter and setter for the snapshot image.
+@property(nonatomic, weak) UIImage* snapshot;
+
 // Returns the top bar of the cell. The top bar holds the favicon and the tab
 // title.
-@property(unsafe_unretained, nonatomic, readonly) UIView* topBar;
+@property(nonatomic, weak, readonly) UIView* topBar;
 
 // Sets the cell's appearance using information in |tab|.
 // The delegate needs to be set before calling this method.
@@ -50,11 +53,6 @@
 // Sets the cell's appearance depending on |type|.
 - (void)setSessionType:(TabSwitcherSessionType)type;
 
-// Returns the current screenshot set on the cell.
-- (UIImage*)screenshot;
-// Sets the snapshot.
-- (void)setSnapshot:(UIImage*)snapshot;
-
 @end
 
 @interface TabSwitcherDistantSessionCell : TabSwitcherSessionCell
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_cell.mm b/ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_cell.mm
index b9ebf28..19d72dde9 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_cell.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_cell.mm
@@ -214,18 +214,21 @@
   return self;
 }
 
+#pragma mark - Public properties
+
+- (UIImage*)snapshot {
+  return _snapshot.image;
+}
+
+- (void)setSnapshot:(UIImage*)snapshot {
+  _snapshot.image = snapshot;
+}
+
 - (UIView*)topBar {
   return _topBar;
 }
 
-- (UIImage*)screenshot {
-  return [_snapshot image];
-}
-
-- (void)setSnapshot:(UIImage*)image {
-  DCHECK(!ImageHasAlphaChannel(image));
-  [_snapshot setImage:image];
-}
+#pragma mark - Public methods
 
 - (void)setAppearanceForTab:(Tab*)tab cellSize:(CGSize)cellSize {
   [_titleLabel setText:tab.title];
@@ -274,6 +277,8 @@
   [_snapshot setBackgroundColor:snapshotBackgroundColor];
 }
 
+#pragma mark -
+
 - (void)snapshotPressed {
   [self.delegate cellPressed:self];
 }
diff --git a/ios/chrome/browser/ui/webui/crashes_ui.cc b/ios/chrome/browser/ui/webui/crashes_ui.cc
index 37ae935c..0586d13 100644
--- a/ios/chrome/browser/ui/webui/crashes_ui.cc
+++ b/ios/chrome/browser/ui/webui/crashes_ui.cc
@@ -55,8 +55,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 // The handler for Javascript messages for the chrome://crashes/ page.
-class CrashesDOMHandler : public web::WebUIIOSMessageHandler,
-                          public CrashUploadList::Delegate {
+class CrashesDOMHandler : public web::WebUIIOSMessageHandler {
  public:
   CrashesDOMHandler();
   ~CrashesDOMHandler() override;
@@ -64,17 +63,18 @@
   // WebUIMessageHandler implementation.
   void RegisterMessages() override;
 
-  // CrashUploadList::Delegate implemenation.
-  void OnUploadListAvailable() override;
 
  private:
+  // Crash UploadList callback.
+  void OnUploadListAvailable();
+
   // Asynchronously fetches the list of crashes. Called from JS.
   void HandleRequestCrashes(const base::ListValue* args);
 
   // Sends the recent crashes list JS.
   void UpdateUI();
 
-  scoped_refptr<CrashUploadList> upload_list_;
+  scoped_refptr<UploadList> upload_list_;
   bool list_available_;
   bool first_load_;
 
@@ -83,15 +83,16 @@
 
 CrashesDOMHandler::CrashesDOMHandler()
     : list_available_(false), first_load_(true) {
-  upload_list_ = ios::CreateCrashUploadList(this);
+  upload_list_ = ios::CreateCrashUploadList();
 }
 
 CrashesDOMHandler::~CrashesDOMHandler() {
-  upload_list_->ClearDelegate();
+  upload_list_->CancelCallback();
 }
 
 void CrashesDOMHandler::RegisterMessages() {
-  upload_list_->LoadUploadListAsynchronously();
+  upload_list_->Load(base::BindOnce(&CrashesDOMHandler::OnUploadListAvailable,
+                                    base::Unretained(this)));
   web_ui()->RegisterMessageCallback(
       crash::kCrashesUIRequestCrashList,
       base::Bind(&CrashesDOMHandler::HandleRequestCrashes,
@@ -105,7 +106,8 @@
       UpdateUI();
   } else {
     list_available_ = false;
-    upload_list_->LoadUploadListAsynchronously();
+    upload_list_->Load(base::Bind(&CrashesDOMHandler::OnUploadListAvailable,
+                                  base::Unretained(this)));
   }
 }
 
diff --git a/ios/chrome/test/earl_grey/BUILD.gn b/ios/chrome/test/earl_grey/BUILD.gn
index 57f2156..f5f171e 100644
--- a/ios/chrome/test/earl_grey/BUILD.gn
+++ b/ios/chrome/test/earl_grey/BUILD.gn
@@ -27,6 +27,7 @@
     "//ios/chrome/browser/device_sharing:eg_tests",
     "//ios/chrome/browser/metrics:eg_tests",
     "//ios/chrome/browser/net:eg_tests",
+    "//ios/chrome/browser/ntp_tiles:eg_tests",
   ]
 }
 
diff --git a/ios/clean/chrome/browser/ui/tab_collection/tab_collection_tab_cell_unittest.mm b/ios/clean/chrome/browser/ui/tab_collection/tab_collection_tab_cell_unittest.mm
index 23605ab..7575de5 100644
--- a/ios/clean/chrome/browser/ui/tab_collection/tab_collection_tab_cell_unittest.mm
+++ b/ios/clean/chrome/browser/ui/tab_collection/tab_collection_tab_cell_unittest.mm
@@ -23,12 +23,10 @@
 
 @interface TestTabCell : TabCollectionTabCell
 @property(nonatomic) UILabel* titleLabel;
-@property(nonatomic) TabSwitcherButton* snapshotButton;
 @end
 
 @implementation TestTabCell
 @dynamic titleLabel;
-@dynamic snapshotButton;
 @end
 
 class TabCollectionTabCellTest : public PlatformTest {
@@ -69,7 +67,7 @@
         callback(nil);
       });
   [cell_ configureCell:item_ snapshotCache:snapshotCache_];
-  EXPECT_EQ(nil, [cell_.snapshotButton imageForState:UIControlStateNormal]);
+  EXPECT_EQ(nil, cell_.snapshot);
 }
 
 // Tests that -configureCell: updates the cell's snapshot from the cache.
@@ -82,9 +80,8 @@
         callback(snapshot_);
       });
   [cell_ configureCell:item_ snapshotCache:snapshotCache_];
-  UIImage* cellImage =
-      [cell_.snapshotButton imageForState:UIControlStateNormal];
-  EXPECT_TRUE(ui::test::uiimage_utils::UIImagesAreEqual(snapshot_, cellImage));
+  EXPECT_TRUE(
+      ui::test::uiimage_utils::UIImagesAreEqual(snapshot_, cell_.snapshot));
 }
 
 // Tests that asynchronous snapshot retrieval does not set the image after
@@ -100,5 +97,5 @@
         callback(snapshot_);
       });
   [cell_ configureCell:item_ snapshotCache:snapshotCache_];
-  EXPECT_EQ(nil, [cell_.snapshotButton imageForState:UIControlStateNormal]);
+  EXPECT_EQ(nil, cell_.snapshot);
 }
diff --git a/mojo/edk/system/message_pipe_dispatcher.cc b/mojo/edk/system/message_pipe_dispatcher.cc
index 6a4706c0..3b09c71 100644
--- a/mojo/edk/system/message_pipe_dispatcher.cc
+++ b/mojo/edk/system/message_pipe_dispatcher.cc
@@ -274,11 +274,14 @@
 
   const SerializedState* state = static_cast<const SerializedState*>(data);
 
+  ports::Node* node = internal::g_core->GetNodeController()->node();
   ports::PortRef port;
-  if (internal::g_core->GetNodeController()->node()->GetPort(ports[0], &port) !=
-      ports::OK) {
+  if (node->GetPort(ports[0], &port) != ports::OK)
     return nullptr;
-  }
+
+  ports::PortStatus status;
+  if (node->GetStatus(port, &status) != ports::OK)
+    return nullptr;
 
   return new MessagePipeDispatcher(internal::g_core->GetNodeController(), port,
                                    state->pipe_id, state->endpoint);
diff --git a/mojo/edk/system/ports/message_queue.cc b/mojo/edk/system/ports/message_queue.cc
index f99f738..8596362 100644
--- a/mojo/edk/system/ports/message_queue.cc
+++ b/mojo/edk/system/ports/message_queue.cc
@@ -69,13 +69,6 @@
   }
 }
 
-void MessageQueue::GetReferencedPorts(std::vector<PortName>* port_names) {
-  for (const auto& message : heap_) {
-    for (size_t i = 0; i < message->num_ports(); ++i)
-      port_names->push_back(message->ports()[i]);
-  }
-}
-
 void MessageQueue::TakeAllMessages(
     std::vector<std::unique_ptr<UserMessageEvent>>* messages) {
   *messages = std::move(heap_);
diff --git a/mojo/edk/system/ports/message_queue.h b/mojo/edk/system/ports/message_queue.h
index 4142999..724f0bb 100644
--- a/mojo/edk/system/ports/message_queue.h
+++ b/mojo/edk/system/ports/message_queue.h
@@ -56,9 +56,6 @@
   void AcceptMessage(std::unique_ptr<UserMessageEvent> message,
                      bool* has_next_message);
 
-  // Returns all of the ports referenced by messages in this message queue.
-  void GetReferencedPorts(std::vector<PortName>* ports);
-
   // Takes all messages from this queue. Used to safely destroy queued messages
   // without holding any Port lock.
   void TakeAllMessages(
diff --git a/mojo/edk/system/ports/node.cc b/mojo/edk/system/ports/node.cc
index 3a051eb..8554533 100644
--- a/mojo/edk/system/ports/node.cc
+++ b/mojo/edk/system/ports/node.cc
@@ -205,7 +205,7 @@
 }
 
 int Node::ClosePort(const PortRef& port_ref) {
-  std::vector<PortName> referenced_port_names;
+  std::vector<std::unique_ptr<UserMessageEvent>> undelivered_messages;
   NodeName peer_node_name;
   PortName peer_port_name;
   uint64_t last_sequence_num = 0;
@@ -231,7 +231,7 @@
 
         // If the port being closed still has unread messages, then we need to
         // take care to close those ports so as to avoid leaking memory.
-        port->message_queue.GetReferencedPorts(&referenced_port_names);
+        port->message_queue.TakeAllMessages(&undelivered_messages);
         break;
 
       default:
@@ -247,10 +247,12 @@
     delegate_->ForwardEvent(peer_node_name,
                             base::MakeUnique<ObserveClosureEvent>(
                                 peer_port_name, last_sequence_num));
-    for (const auto& name : referenced_port_names) {
-      PortRef ref;
-      if (GetPort(name, &ref) == OK)
-        ClosePort(ref);
+    for (const auto& message : undelivered_messages) {
+      for (size_t i = 0; i < message->num_ports(); ++i) {
+        PortRef ref;
+        if (GetPort(message->ports()[i], &ref) == OK)
+          ClosePort(ref);
+      }
     }
   }
   return OK;
@@ -554,6 +556,9 @@
         event_to_forward = base::MakeUnique<ObserveProxyAckEvent>(
             event->proxy_port_name(), port->next_sequence_num_to_send - 1);
         update_status = true;
+        DVLOG(2) << "Forwarding ObserveProxyAck from " << event->port_name()
+                 << "@" << name_ << " to " << event->proxy_port_name() << "@"
+                 << event_target_node;
       } else {
         // As a proxy ourselves, we don't know how to honor the ObserveProxy
         // event or to populate the last_sequence_num field of ObserveProxyAck.
@@ -1240,7 +1245,7 @@
 
   std::vector<PortRef> ports_to_notify;
   std::vector<PortName> dead_proxies_to_broadcast;
-  std::vector<PortName> referenced_port_names;
+  std::vector<std::unique_ptr<UserMessageEvent>> undelivered_messages;
 
   {
     PortLocker::AssertNoPortsLockedOnCurrentThread();
@@ -1276,8 +1281,10 @@
           // inefficient but rare.
           if (port->state != Port::kReceiving) {
             dead_proxies_to_broadcast.push_back(iter->first);
-            iter->second->message_queue.GetReferencedPorts(
-                &referenced_port_names);
+            std::vector<std::unique_ptr<UserMessageEvent>> messages;
+            iter->second->message_queue.TakeAllMessages(&messages);
+            for (auto& message : messages)
+              undelivered_messages.emplace_back(std::move(message));
           }
         }
       }
@@ -1306,11 +1313,13 @@
     DestroyAllPortsWithPeer(name_, proxy_name);
   }
 
-  // Close any ports referenced by the closed proxies.
-  for (const auto& name : referenced_port_names) {
-    PortRef ref;
-    if (GetPort(name, &ref) == OK)
-      ClosePort(ref);
+  // Close any ports referenced by undelivered messages.
+  for (const auto& message : undelivered_messages) {
+    for (size_t i = 0; i < message->num_ports(); ++i) {
+      PortRef ref;
+      if (GetPort(message->ports()[i], &ref) == OK)
+        ClosePort(ref);
+    }
   }
 }
 
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h
index 7ceb5aa5..6d1edca 100644
--- a/skia/config/SkUserConfig.h
+++ b/skia/config/SkUserConfig.h
@@ -202,6 +202,10 @@
 #   define SK_SUPPORT_LEGACY_ANISOTROPIC_MIPMAP_SCALE
 #endif
 
+#ifndef SK_SUPPORT_LEGACY_IMAGE_ENCODE_API
+#define SK_SUPPORT_LEGACY_IMAGE_ENCODE_API
+#endif
+
 // Remove this after we fixed all the issues related to the new SDF algorithm
 // (https://codereview.chromium.org/1643143002)
 #ifndef    SK_USE_LEGACY_DISTANCE_FIELDS
diff --git a/testing/buildbot/chromium.perf.fyi.json b/testing/buildbot/chromium.perf.fyi.json
index 0ceb38a..5521ff7 100644
--- a/testing/buildbot/chromium.perf.fyi.json
+++ b/testing/buildbot/chromium.perf.fyi.json
@@ -4872,65 +4872,6 @@
       },
       {
         "args": [
-          "v8.mobile_infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.mobile_infinite_scroll_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device5",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.mobile_infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.mobile_infinite_scroll_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device5",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.runtimestats.browsing_mobile",
           "-v",
           "--upload-results",
@@ -10065,65 +10006,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:22b1",
-              "id": "build151-b1",
-              "os": "Windows-10-10586",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:22b1",
-              "id": "build151-b1",
-              "os": "Windows-10-10586",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.runtime_stats.top_25",
           "-v",
           "--upload-results",
@@ -15172,65 +15054,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:9874",
-              "id": "build215-b4",
-              "os": "Windows-10-10586",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:9874",
-              "id": "build215-b4",
-              "os": "Windows-10-10586",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.runtime_stats.top_25",
           "-v",
           "--upload-results",
diff --git a/testing/buildbot/chromium.perf.json b/testing/buildbot/chromium.perf.json
index 51bc228..8b2bf384 100644
--- a/testing/buildbot/chromium.perf.json
+++ b/testing/buildbot/chromium.perf.json
@@ -4937,65 +4937,6 @@
       },
       {
         "args": [
-          "v8.mobile_infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.mobile_infinite_scroll_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build48-b1--device5",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.mobile_infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.mobile_infinite_scroll_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build48-b1--device5",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.runtimestats.browsing_mobile",
           "-v",
           "--upload-results",
@@ -10025,65 +9966,6 @@
       },
       {
         "args": [
-          "v8.mobile_infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.mobile_infinite_scroll_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build75-b1--device5",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.mobile_infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.mobile_infinite_scroll_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build75-b1--device5",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.runtimestats.browsing_mobile",
           "-v",
           "--upload-results",
@@ -12696,36 +12578,6 @@
       },
       {
         "args": [
-          "v8.mobile_infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-webview",
-          "--webview-embedder-apk=../../out/Release/apks/SystemWebViewShell.apk"
-        ],
-        "isolate_name": "telemetry_perf_webview_tests",
-        "name": "v8.mobile_infinite_scroll_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_webview_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build166-b1--device5",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.runtimestats.browsing_mobile",
           "-v",
           "--upload-results",
@@ -17717,65 +17569,6 @@
       },
       {
         "args": [
-          "v8.mobile_infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.mobile_infinite_scroll_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build45-b1--device5",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.mobile_infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.mobile_infinite_scroll_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build45-b1--device5",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.runtimestats.browsing_mobile",
           "-v",
           "--upload-results",
@@ -20388,36 +20181,6 @@
       },
       {
         "args": [
-          "v8.mobile_infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-webview",
-          "--webview-embedder-apk=../../out/Release/apks/SystemWebViewShell.apk"
-        ],
-        "isolate_name": "telemetry_perf_webview_tests",
-        "name": "v8.mobile_infinite_scroll_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_webview_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build114-b1--device5",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.runtimestats.browsing_mobile",
           "-v",
           "--upload-results",
@@ -25409,65 +25172,6 @@
       },
       {
         "args": [
-          "v8.mobile_infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.mobile_infinite_scroll_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build49-b1--device5",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.mobile_infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.mobile_infinite_scroll_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build49-b1--device5",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.runtimestats.browsing_mobile",
           "-v",
           "--upload-results",
@@ -30497,65 +30201,6 @@
       },
       {
         "args": [
-          "v8.mobile_infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.mobile_infinite_scroll_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build47-b1--device5",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.mobile_infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.mobile_infinite_scroll_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build47-b1--device5",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.runtimestats.browsing_mobile",
           "-v",
           "--upload-results",
@@ -35573,65 +35218,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0166",
-              "id": "build106-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0166",
-              "id": "build106-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.runtime_stats.top_25",
           "-v",
           "--upload-results",
@@ -40700,65 +40286,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a2e",
-              "id": "build162-m1",
-              "os": "Mac-10.12",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a2e",
-              "id": "build162-m1",
-              "os": "Mac-10.12",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.runtime_stats.top_25",
           "-v",
           "--upload-results",
@@ -45827,65 +45354,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1626",
-              "id": "build127-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1626",
-              "id": "build127-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.runtime_stats.top_25",
           "-v",
           "--upload-results",
@@ -50934,65 +50402,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a26",
-              "id": "build28-b1",
-              "os": "Mac-10.12",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a26",
-              "id": "build28-b1",
-              "os": "Mac-10.12",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.runtime_stats.top_25",
           "-v",
           "--upload-results",
@@ -56061,65 +55470,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821",
-              "id": "build132-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821",
-              "id": "build132-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.runtime_stats.top_25",
           "-v",
           "--upload-results",
@@ -61188,65 +60538,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0d26",
-              "id": "build30-b4",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0d26",
-              "id": "build30-b4",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.runtime_stats.top_25",
           "-v",
           "--upload-results",
@@ -66295,65 +65586,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1616",
-              "id": "build180-b4",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1616",
-              "id": "build180-b4",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.runtime_stats.top_25",
           "-v",
           "--upload-results",
@@ -71422,65 +70654,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0534",
-              "id": "build136-m1",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0534",
-              "id": "build136-m1",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.runtime_stats.top_25",
           "-v",
           "--upload-results",
@@ -76609,65 +75782,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6613",
-              "id": "build105-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6613",
-              "id": "build105-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.runtime_stats.top_25",
           "-v",
           "--upload-results",
@@ -81776,65 +80890,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:041a",
-              "id": "build168-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:041a",
-              "id": "build168-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.runtime_stats.top_25",
           "-v",
           "--upload-results",
@@ -86943,65 +85998,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "10de:104a",
-              "id": "build95-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "10de:104a",
-              "id": "build95-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.runtime_stats.top_25",
           "-v",
           "--upload-results",
@@ -92090,65 +91086,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build189-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build189-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.runtime_stats.top_25",
           "-v",
           "--upload-results",
@@ -97237,65 +96174,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build142-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build142-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.runtime_stats.top_25",
           "-v",
           "--upload-results",
@@ -102404,65 +101282,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build146-m1",
-              "os": "Windows-2012ServerR2-SP0",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build146-m1",
-              "os": "Windows-2012ServerR2-SP0",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.runtime_stats.top_25",
           "-v",
           "--upload-results",
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl
index b79229b..19116ea 100644
--- a/testing/buildbot/gn_isolate_map.pyl
+++ b/testing/buildbot/gn_isolate_map.pyl
@@ -1074,7 +1074,7 @@
     "type": "windowed_test_launcher",
   },
   "vr_common_unittests": {
-    "label": "//chrome/browser/android/vr_shell:vr_common_unittests",
+    "label": "//chrome/browser/vr:vr_common_unittests",
     "type": "console_test_launcher",
   },
   "webapk_client_junit_tests": {
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
index 867450f..e66905f5 100644
--- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
+++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
@@ -219,7 +219,7 @@
 crbug.com/591099 accessibility/table-with-empty-thead-causes-crash.html [ Failure ]
 crbug.com/591099 accessibility/table-with-hidden-head-section.html [ Failure ]
 crbug.com/591099 accessibility/text-change-notification.html [ Crash Failure ]
-crbug.com/591099 accessibility/textarea-caret-position.html [ Crash Timeout ]
+crbug.com/591099 accessibility/textarea-caret-position.html [ Crash Failure Timeout ]
 crbug.com/591099 accessibility/textarea-line-for-index.html [ Crash Failure ]
 crbug.com/591099 accessibility/textarea-selection.html [ Crash Failure ]
 crbug.com/591099 accessibility/textbox-role-on-contenteditable-crash.html [ Failure ]
@@ -229,20 +229,20 @@
 crbug.com/591099 animations/3d/change-transform-in-end-event.html [ Failure Pass ]
 crbug.com/591099 animations/3d/state-at-end-event-transform.html [ Failure Pass ]
 crbug.com/591099 animations/animation-css-rule-types.html [ Failure ]
-crbug.com/591099 animations/events/animation-events-create.html [ Failure ]
 crbug.com/591099 animations/animations-parsing.html [ Timeout ]
-crbug.com/591099 animations/responsive/animations-responsive-to-color-change.html [ Crash Pass ]
-crbug.com/591099 animations/svg/clear-svg-animation-effects.html [ Crash Pass ]
 crbug.com/591099 animations/composition/background-position-composition.html [ Crash Pass ]
 crbug.com/591099 animations/composition/caret-color-composition.html [ Crash Pass ]
 crbug.com/591099 animations/composition/stroke-dasharray-composition.html [ Crash Pass ]
 crbug.com/591099 animations/computed-style.html [ Failure ]
-crbug.com/591099 animations/svg/css-animation-overrides-svg-presentation-attribute-animation.html [ Crash Pass ]
-crbug.com/591099 animations/events/delay-start-event.html [ Failure ]
 crbug.com/591099 animations/display-change-does-not-terminate-animation.html [ Crash Failure ]
 crbug.com/591099 animations/display-inline-style-adjust.html [ Failure ]
 crbug.com/591099 animations/display-none-cancel-computedstyle.html [ Failure ]
 crbug.com/591099 animations/display-none-terminates-animation.html [ Failure ]
+crbug.com/591099 animations/events/animation-events-create.html [ Failure ]
+crbug.com/591099 animations/events/delay-start-event.html [ Failure ]
+crbug.com/591099 animations/events/negative-delay-events.html [ Failure ]
+crbug.com/591099 animations/events/play-state-initially-paused-start-event.html [ Failure ]
+crbug.com/591099 animations/font-size-using-ems.html [ Failure ]
 crbug.com/591099 animations/hit-testing/inline-element-animation-end-hit-test.html [ Failure ]
 crbug.com/591099 animations/interpolation/backdrop-filter-interpolation.html [ Crash Timeout ]
 crbug.com/591099 animations/interpolation/background-color-interpolation.html [ Crash Pass ]
@@ -330,14 +330,19 @@
 crbug.com/591099 animations/interpolation/webkit-transform-origin-interpolation.html [ Crash Pass ]
 crbug.com/591099 animations/keyframes-rule.html [ Failure ]
 crbug.com/591099 animations/lazy-detached-animation-stop.html [ Failure ]
-crbug.com/591099 animations/events/negative-delay-events.html [ Failure ]
-crbug.com/591099 animations/events/play-state-initially-paused-start-event.html [ Failure ]
 crbug.com/591099 animations/play-state.html [ Failure ]
 crbug.com/591099 animations/prefixed/animation-inherit-initial-unprefixed.html [ Failure ]
 crbug.com/591099 animations/prefixed/keyframes-cssom-prefixed-02.html [ Failure ]
 crbug.com/591099 animations/prefixed/keyframes-cssom-unprefixed-02.html [ Failure ]
+crbug.com/591099 animations/responsive/animations-responsive-to-color-change.html [ Crash Pass ]
 crbug.com/591099 animations/responsive/interpolation/d-responsive.html [ Crash Pass ]
 crbug.com/591099 animations/responsive/interpolation/line-height-responsive.html [ Pass Timeout ]
+crbug.com/591099 animations/responsive/interpolation/svg-d-responsive.html [ Crash Pass ]
+crbug.com/591099 animations/responsive/interpolation/svg-points-responsive.html [ Crash Pass ]
+crbug.com/591099 animations/responsive/interpolation/svg-tableValues-responsive.html [ Crash Pass ]
+crbug.com/591099 animations/responsive/interpolation/svg-transform-responsive.html [ Crash Pass ]
+crbug.com/591099 animations/responsive/interpolation/svg-x-list-responsive.html [ Crash Pass ]
+crbug.com/591099 animations/responsive/svg-responsive-to-timing-updates.html [ Crash Pass ]
 crbug.com/591099 animations/rotate-transform-equivalent.html [ Failure ]
 crbug.com/591099 animations/skew-notsequential-compositor.html [ Failure ]
 crbug.com/591099 animations/stability/animation-end-event-destroy-renderer.html [ Failure ]
@@ -502,13 +507,9 @@
 crbug.com/591099 animations/svg-attribute-interpolation/svg-xChannelSelector-interpolation.html [ Crash Pass ]
 crbug.com/591099 animations/svg-attribute-interpolation/svg-y-list-interpolation.html [ Crash Pass ]
 crbug.com/591099 animations/svg-attribute-interpolation/svg-z-interpolation.html [ Crash Pass ]
-crbug.com/591099 animations/responsive/interpolation/svg-d-responsive.html [ Crash Pass ]
-crbug.com/591099 animations/responsive/interpolation/svg-points-responsive.html [ Crash Pass ]
-crbug.com/591099 animations/responsive/interpolation/svg-tableValues-responsive.html [ Crash Pass ]
-crbug.com/591099 animations/responsive/interpolation/svg-transform-responsive.html [ Crash Pass ]
-crbug.com/591099 animations/responsive/interpolation/svg-x-list-responsive.html [ Crash Pass ]
+crbug.com/591099 animations/svg/clear-svg-animation-effects.html [ Crash Pass ]
+crbug.com/591099 animations/svg/css-animation-overrides-svg-presentation-attribute-animation.html [ Crash Pass ]
 crbug.com/591099 animations/svg/svg-presentation-attribute-animation.html [ Crash Pass ]
-crbug.com/591099 animations/responsive/svg-responsive-to-timing-updates.html [ Crash Pass ]
 crbug.com/591099 animations/timing/timing-model.html [ Pass Timeout ]
 crbug.com/591099 battery-status/api-defined.html [ Failure ]
 crbug.com/591099 battery-status/detached-no-crash.html [ Failure ]
@@ -4650,6 +4651,12 @@
 crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-014.html [ Crash Failure ]
 crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-015.html [ Crash Pass ]
 crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-016.html [ Crash 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 ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-010.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-011.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-012.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-grid-1/grid-definition/fr-unit-with-percentage.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-grid-1/grid-definition/fr-unit.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-grid-1/grid-items/grid-inline-z-axis-ordering-overlapped-items-006.html [ Failure ]
@@ -5666,6 +5673,7 @@
 crbug.com/591099 external/wpt/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-3.html [ Crash Pass ]
 crbug.com/591099 external/wpt/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-4.html [ Crash Pass ]
 crbug.com/591099 external/wpt/http/basic-auth-cache-test.html [ Crash Timeout ]
+crbug.com/591099 external/wpt/http/content_length.html [ Crash Pass ]
 crbug.com/591099 external/wpt/innerText/getter.html [ Crash Failure ]
 crbug.com/591099 external/wpt/input-events/input-events-typing-data-manual.html [ Crash Pass ]
 crbug.com/591099 external/wpt/intersection-observer/client-rect.html [ Crash Pass ]
@@ -5675,7 +5683,7 @@
 crbug.com/591099 external/wpt/intersection-observer/remove-element.html [ Failure ]
 crbug.com/591099 external/wpt/intersection-observer/root-margin.html [ Crash Pass ]
 crbug.com/591099 external/wpt/intersection-observer/same-document-root.html [ Crash Failure ]
-crbug.com/591099 external/wpt/media-source/mediasource-activesourcebuffers.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-activesourcebuffers.html [ Crash Failure Pass ]
 crbug.com/591099 external/wpt/media-source/mediasource-addsourcebuffer-mode.html [ Crash Pass ]
 crbug.com/591099 external/wpt/media-source/mediasource-addsourcebuffer.html [ Crash Pass ]
 crbug.com/591099 external/wpt/media-source/mediasource-append-buffer.html [ Crash Pass ]
@@ -10131,7 +10139,7 @@
 crbug.com/591099 fast/events/popup-forwarded-gesture-blocked.html [ Failure ]
 crbug.com/591099 fast/events/popup-forwarded-gesture.html [ Failure ]
 crbug.com/591099 fast/events/programmatic-check-no-change-event.html [ Failure ]
-crbug.com/591099 fast/events/recorded-keydown-event.html [ Crash Failure ]
+crbug.com/591099 fast/events/recorded-keydown-event.html [ Crash Failure Timeout ]
 crbug.com/591099 fast/events/related-target-focusevent.html [ Failure Timeout ]
 crbug.com/591099 fast/events/related-target.html [ Failure ]
 crbug.com/591099 fast/events/relative-offset-of-simulated-click.html [ Failure ]
@@ -11377,7 +11385,7 @@
 crbug.com/591099 fast/forms/textarea/textarea-placeholder-visibility-1.html [ Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-placeholder-visibility-2.html [ Crash Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-placeholder-wrapping.html [ Crash Failure ]
-crbug.com/591099 fast/forms/textarea/textarea-resize-above-min-size-and-below-initial-size.html [ Crash Pass ]
+crbug.com/591099 fast/forms/textarea/textarea-resize-above-min-size-and-below-initial-size.html [ Crash Pass Timeout ]
 crbug.com/591099 fast/forms/textarea/textarea-resize-below-min-intrinsic-size.html [ Crash Pass Timeout ]
 crbug.com/591099 fast/forms/textarea/textarea-resize-below-min-size-zoomed.html [ Crash Pass Timeout ]
 crbug.com/591099 fast/forms/textarea/textarea-resize-below-min-size.html [ Crash Pass ]
@@ -12801,7 +12809,6 @@
 crbug.com/591099 fast/parser/assertion-empty-attribute.html [ Failure ]
 crbug.com/591099 fast/parser/bad-xml-slash.html [ Failure ]
 crbug.com/591099 fast/parser/badentity.xhtml [ Failure ]
-crbug.com/591099 fast/parser/block-nesting-cap.html [ Failure ]
 crbug.com/591099 fast/parser/broken-comment-1.html [ Failure ]
 crbug.com/591099 fast/parser/broken-comment-2.html [ Failure ]
 crbug.com/591099 fast/parser/broken-comment-3.html [ Failure ]
@@ -14477,45 +14484,51 @@
 crbug.com/591099 html5lib/generated/run-tests2-write.html [ Failure ]
 crbug.com/591099 html5lib/generated/run-webkit02-data.html [ Failure ]
 crbug.com/591099 html5lib/generated/run-webkit02-write.html [ Failure ]
-crbug.com/591099 http/tests/accessibility/slow-document-load.html [ Failure ]
+crbug.com/591099 http/tests/accessibility/slow-document-load.html [ Crash Failure ]
 crbug.com/591099 http/tests/activedomobject/media.html [ Failure ]
-crbug.com/591099 http/tests/appcache/404-manifest.html [ Failure ]
+crbug.com/591099 http/tests/appcache/404-manifest.html [ Crash Failure ]
 crbug.com/591099 http/tests/appcache/404-resource-cross-origin.html [ Failure ]
 crbug.com/591099 http/tests/appcache/404-resource.html [ Failure ]
+crbug.com/591099 http/tests/appcache/abort-cache-onchecking.html [ Crash Pass ]
 crbug.com/591099 http/tests/appcache/access-via-redirect.php [ Failure ]
+crbug.com/591099 http/tests/appcache/crash-when-navigating-away-then-back.html [ Crash Pass ]
 crbug.com/591099 http/tests/appcache/credential-url.html [ Failure Timeout ]
 crbug.com/591099 http/tests/appcache/cyrillic-uri.html [ Crash Failure ]
 crbug.com/591099 http/tests/appcache/deferred-events-delete-while-raising-timer.html [ Crash Failure ]
 crbug.com/591099 http/tests/appcache/deferred-events-delete-while-raising.html [ Crash Failure ]
+crbug.com/591099 http/tests/appcache/deferred-events.html [ Crash Pass ]
 crbug.com/591099 http/tests/appcache/destroyed-frame.html [ Crash Failure ]
 crbug.com/591099 http/tests/appcache/detached-iframe.html [ Crash Failure ]
 crbug.com/591099 http/tests/appcache/different-https-origin-resource-main.html [ Failure ]
 crbug.com/591099 http/tests/appcache/different-origin-manifest.html [ Failure ]
 crbug.com/591099 http/tests/appcache/different-scheme.html [ Failure Timeout ]
+crbug.com/591099 http/tests/appcache/document-write-html-element.html [ Crash Pass ]
+crbug.com/591099 http/tests/appcache/empty-manifest.html [ Crash Pass ]
 crbug.com/591099 http/tests/appcache/exceptions.html [ Failure ]
+crbug.com/591099 http/tests/appcache/fail-on-update-2.html [ Crash Pass ]
 crbug.com/591099 http/tests/appcache/fallback.html [ Failure ]
 crbug.com/591099 http/tests/appcache/foreign-fallback.html [ Failure ]
 crbug.com/591099 http/tests/appcache/foreign-iframe-main.html [ Failure Timeout ]
 crbug.com/591099 http/tests/appcache/local-content.html [ Failure ]
-crbug.com/591099 http/tests/appcache/main-resource-hash.html [ Failure Timeout ]
-crbug.com/591099 http/tests/appcache/main-resource-redirect.html [ Failure ]
+crbug.com/591099 http/tests/appcache/main-resource-hash.html [ Crash Failure Timeout ]
+crbug.com/591099 http/tests/appcache/main-resource-redirect.html [ Crash Failure ]
 crbug.com/591099 http/tests/appcache/manifest-parsing.html [ Failure ]
 crbug.com/591099 http/tests/appcache/manifest-redirect-2.html [ Failure ]
 crbug.com/591099 http/tests/appcache/manifest-redirect.html [ Failure ]
 crbug.com/591099 http/tests/appcache/modified-manifest.html [ Failure ]
-crbug.com/591099 http/tests/appcache/multi-fallback.html [ Failure ]
+crbug.com/591099 http/tests/appcache/multi-fallback.html [ Crash Failure ]
 crbug.com/591099 http/tests/appcache/non-html.xhtml [ Failure ]
 crbug.com/591099 http/tests/appcache/obsolete-error-events.html [ Failure Timeout ]
-crbug.com/591099 http/tests/appcache/offline-access.html [ Failure ]
-crbug.com/591099 http/tests/appcache/online-fallback-layering.html [ Failure ]
+crbug.com/591099 http/tests/appcache/offline-access.html [ Crash Failure ]
+crbug.com/591099 http/tests/appcache/online-fallback-layering.html [ Crash Failure ]
 crbug.com/591099 http/tests/appcache/online-whitelist.html [ Failure ]
-crbug.com/591099 http/tests/appcache/reload.html [ Failure ]
+crbug.com/591099 http/tests/appcache/reload.html [ Crash Failure ]
 crbug.com/591099 http/tests/appcache/remove-cache.html [ Crash Failure ]
 crbug.com/591099 http/tests/appcache/resource-redirect-2.html [ Failure ]
-crbug.com/591099 http/tests/appcache/resource-redirect.html [ Failure ]
+crbug.com/591099 http/tests/appcache/resource-redirect.html [ Crash Failure ]
 crbug.com/591099 http/tests/appcache/top-frame-1.html [ Failure ]
 crbug.com/591099 http/tests/appcache/top-frame-2.html [ Failure Timeout ]
-crbug.com/591099 http/tests/appcache/top-frame-3.html [ Failure ]
+crbug.com/591099 http/tests/appcache/top-frame-3.html [ Crash Failure ]
 crbug.com/591099 http/tests/appcache/top-frame-4.html [ Failure ]
 crbug.com/591099 http/tests/appcache/update-cache.html [ Failure ]
 crbug.com/591099 http/tests/appcache/video.html [ Crash Pass ]
@@ -14524,42 +14537,63 @@
 crbug.com/591099 http/tests/appcache/wrong-signature-2.html [ Failure ]
 crbug.com/591099 http/tests/appcache/wrong-signature.html [ Failure ]
 crbug.com/591099 http/tests/appcache/xhr-foreign-resource.html [ Failure ]
+crbug.com/591099 http/tests/background_fetch/background-fetch-manager-fetch.https.html [ Crash Pass ]
+crbug.com/591099 http/tests/background_fetch/background-fetch-manager-get.https.html [ Crash Pass ]
+crbug.com/591099 http/tests/background_sync/chromium/stop-worker-no-crash.html [ Crash Pass ]
+crbug.com/591099 http/tests/budget/get-budget-in-service-worker.html [ Crash Pass ]
+crbug.com/591099 http/tests/cache/cancel-multiple-post-xhrs.html [ Crash Pass ]
 crbug.com/591099 http/tests/cache/content-type-ignored-during-revalidation.html [ Failure ]
 crbug.com/591099 http/tests/cache/history-only-cached-subresource-loads-max-age-https.html [ Failure ]
 crbug.com/591099 http/tests/cache/history-only-cached-subresource-loads.html [ Failure ]
 crbug.com/591099 http/tests/cache/network-error-during-revalidation.html [ Failure ]
+crbug.com/591099 http/tests/cache/post-redirect-get.php [ Crash Pass ]
+crbug.com/591099 http/tests/cache/smil-usecounter-in-cached-image.html [ Crash Pass ]
 crbug.com/591099 http/tests/cache/subresource-fragment-identifier.html [ Crash Failure ]
-crbug.com/591099 http/tests/cache/subresource-multiple-instances.html [ 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/xhr-body.html [ Failure ]
-crbug.com/591099 http/tests/cache/xhr-vary-header.html [ Failure ]
+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 ]
 crbug.com/591099 http/tests/canvas/canvas-filter-svg-external-multiple.html [ Failure ]
 crbug.com/591099 http/tests/canvas/canvas-filter-svg-external.html [ Failure ]
-crbug.com/591099 http/tests/canvas/webgl/origin-clean-conformance.html [ Failure ]
-crbug.com/591099 http/tests/cookies/double-quoted-value-with-semi-colon.html [ Failure ]
-crbug.com/591099 http/tests/cookies/http-get-cookie-set-in-js.html [ Failure ]
-crbug.com/591099 http/tests/cookies/js-get-and-set-http-only-cookie.html [ Failure ]
-crbug.com/591099 http/tests/cookies/js-set-null.html [ Failure ]
+crbug.com/591099 http/tests/canvas/philip/tests/security.pattern.canvas.fillStyle.html [ Crash Pass ]
+crbug.com/591099 http/tests/canvas/philip/tests/security.pattern.cross.html [ Crash Pass ]
+crbug.com/591099 http/tests/canvas/philip/tests/security.reset.html [ Crash Pass ]
+crbug.com/591099 http/tests/canvas/webgl/origin-clean-conformance.html [ Crash Failure ]
+crbug.com/591099 http/tests/cookies/double-quoted-value-with-semi-colon.html [ Crash Failure ]
+crbug.com/591099 http/tests/cookies/http-get-cookie-set-in-js.html [ Crash Failure ]
+crbug.com/591099 http/tests/cookies/js-get-and-set-http-only-cookie.html [ Crash Failure ]
+crbug.com/591099 http/tests/cookies/js-set-null.html [ Crash Failure ]
 crbug.com/591099 http/tests/cookies/multiple-cookies.html [ Failure ]
+crbug.com/591099 http/tests/cookies/same-site/basics.html [ Crash Pass ]
+crbug.com/591099 http/tests/cookies/set-cookie-on-redirect.html [ Crash Pass ]
 crbug.com/591099 http/tests/cookies/simple-cookies-expired.html [ Failure ]
-crbug.com/591099 http/tests/cookies/simple-cookies-max-age.html [ Failure ]
+crbug.com/591099 http/tests/cookies/simple-cookies-max-age.html [ Crash Failure ]
 crbug.com/591099 http/tests/cookies/single-quoted-value.html [ Failure ]
+crbug.com/591099 http/tests/credentialmanager/credentialscontainer-create-basics.html [ Crash Pass ]
 crbug.com/591099 http/tests/credentialmanager/credentialscontainer-frame-errors.html [ Crash Pass ]
+crbug.com/591099 http/tests/credentialmanager/credentialscontainer-get-basics.html [ Crash Pass ]
+crbug.com/591099 http/tests/credentialmanager/credentialscontainer-preventsilentaccess-basics.html [ Crash Pass ]
+crbug.com/591099 http/tests/credentialmanager/passwordcredential-fetch-registrabledomain.html [ Crash Pass ]
+crbug.com/591099 http/tests/credentialmanager/passwordcredential-fetch.html [ Crash Pass ]
+crbug.com/591099 http/tests/credentialmanager/passwordcredential-redirect.html [ Crash Pass ]
 crbug.com/591099 http/tests/css/border-image-loading.html [ Failure ]
+crbug.com/591099 http/tests/css/cross-fade-reload.html [ Crash Pass ]
 crbug.com/591099 http/tests/css/css-image-loading.html [ Crash Failure ]
 crbug.com/591099 http/tests/css/css-image-valued-shape.html [ Failure ]
 crbug.com/591099 http/tests/css/css-non-blocking.html [ Failure ]
 crbug.com/591099 http/tests/css/font-face-src-loading.html [ Failure ]
 crbug.com/591099 http/tests/css/image-value-cached.html [ Crash Pass ]
-crbug.com/591099 http/tests/css/mask-image-loading.html [ Failure ]
+crbug.com/591099 http/tests/css/mask-image-loading.html [ Crash Failure ]
+crbug.com/591099 http/tests/css/missing-repaint-after-slow-style-sheet.pl [ Crash Pass ]
 crbug.com/591099 http/tests/css/pending-stylesheet-offset-width.html [ Failure ]
 crbug.com/591099 http/tests/css/performance-info-with-cached-sheet.html [ Failure ]
 crbug.com/591099 http/tests/css/reflection-mask-image-loading.html [ Failure ]
 crbug.com/591099 http/tests/css/shape-image-file.html [ Failure ]
-crbug.com/591099 http/tests/css/shared-stylesheet-mutation-preconstruct.html [ Failure ]
+crbug.com/591099 http/tests/css/shared-stylesheet-mutation-preconstruct.html [ Crash Failure ]
 crbug.com/591099 http/tests/css/shared-stylesheet-mutation.html [ Failure ]
+crbug.com/591099 http/tests/css/vertical-align-baseline-after-image-load-3.html [ Crash Pass ]
 crbug.com/591099 http/tests/csspaint/border-color.html [ Failure ]
 crbug.com/591099 http/tests/csspaint/invalidation-background-image.html [ Timeout ]
 crbug.com/591099 http/tests/csspaint/invalidation-border-image.html [ Timeout ]
@@ -14575,8 +14609,8 @@
 crbug.com/591099 http/tests/download/inherited-encoding.html [ Failure Timeout ]
 crbug.com/591099 http/tests/download/literal-utf-8.html [ Failure ]
 crbug.com/591099 http/tests/eventsource/eventsource-bad-mime-type.html [ Failure ]
-crbug.com/591099 http/tests/eventsource/eventsource-content-type-charset.html [ Failure ]
-crbug.com/591099 http/tests/eventsource/eventsource-cors-basic.html [ Failure ]
+crbug.com/591099 http/tests/eventsource/eventsource-content-type-charset.html [ Crash Failure ]
+crbug.com/591099 http/tests/eventsource/eventsource-cors-basic.html [ Crash Failure ]
 crbug.com/591099 http/tests/eventsource/eventsource-cors-no-server.html [ Failure ]
 crbug.com/591099 http/tests/eventsource/eventsource-cors-non-http.html [ Failure ]
 crbug.com/591099 http/tests/eventsource/eventsource-cors-redirect.html [ Failure ]
@@ -14589,7 +14623,7 @@
 crbug.com/591099 http/tests/eventsource/eventsource-reconnect.html [ Failure ]
 crbug.com/591099 http/tests/eventsource/eventsource-retry-precision.html [ Failure ]
 crbug.com/591099 http/tests/eventsource/eventsource-status-code-states.html [ Failure ]
-crbug.com/591099 http/tests/eventsource/eventsource-url-attribute.html [ Failure ]
+crbug.com/591099 http/tests/eventsource/eventsource-url-attribute.html [ Crash Failure ]
 crbug.com/591099 http/tests/eventsource/existent-eventsource-status-error-iframe-crash.html [ Crash Pass ]
 crbug.com/591099 http/tests/eventsource/non-existent-eventsource-status-error-iframe-crash.html [ Crash Pass ]
 crbug.com/591099 http/tests/eventsource/workers/eventsource-bad-mime-type.html [ Failure ]
@@ -14624,6 +14658,7 @@
 crbug.com/591099 http/tests/feature-policy/payment-disabled.php [ Crash Failure ]
 crbug.com/591099 http/tests/feature-policy/payment-enabledforall.php [ Crash Failure ]
 crbug.com/591099 http/tests/feature-policy/payment-enabledforself.php [ Crash Pass ]
+crbug.com/591099 http/tests/fetch/chromium/data-saver.html [ Crash Pass ]
 crbug.com/591099 http/tests/fetch/chromium/discarded-window.html [ Crash Pass ]
 crbug.com/591099 http/tests/fetch/window/pageimportancesignals.html [ Failure ]
 crbug.com/591099 http/tests/fileapi/blob-url-in-subframe.html [ Failure ]
@@ -14739,7 +14774,7 @@
 crbug.com/591099 http/tests/inspector/bindings/bindings-frame-attach-detach.html [ Crash Failure Timeout ]
 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 ]
-crbug.com/591099 http/tests/inspector/bindings/bindings-multiple-frames.html [ Crash Failure ]
+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-navigator-multiple-frames.html [ Crash Failure Timeout ]
 crbug.com/591099 http/tests/inspector/bindings/dynamic-bindings-frame-attach-detach.html [ Failure ]
@@ -14775,7 +14810,7 @@
 crbug.com/591099 http/tests/inspector/console/console-links-on-messages-before-inspection.html [ Failure ]
 crbug.com/591099 http/tests/inspector/console/console-on-paint-worklet.html [ Failure ]
 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 ]
+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/styles/edit-css-with-source-url.html [ Crash Failure ]
@@ -14788,12 +14823,12 @@
 crbug.com/591099 http/tests/inspector/elements/styles/styles-do-not-add-inline-stylesheets-in-navigator.html [ Failure Timeout ]
 crbug.com/591099 http/tests/inspector/elements/styles/styles-redirected-css.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/elements/styles/stylesheet-tracking.html [ Crash Failure Timeout ]
-crbug.com/591099 http/tests/inspector/elements/styles/xsl-transformed.xml [ Crash Failure ]
+crbug.com/591099 http/tests/inspector/elements/styles/xsl-transformed.xml [ Crash Failure Timeout ]
 crbug.com/591099 http/tests/inspector/extensions-headers.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/extensions-iframe-eval.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/extensions-ignore-cache.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/extensions-network-redirect.html [ Crash Failure ]
-crbug.com/591099 http/tests/inspector/extensions-useragent.html [ Crash Failure ]
+crbug.com/591099 http/tests/inspector/extensions-useragent.html [ Crash Failure Timeout ]
 crbug.com/591099 http/tests/inspector/extensions/extensions-api.html [ Failure ]
 crbug.com/591099 http/tests/inspector/extensions/extensions-audits-api.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/extensions/extensions-audits-content-script.html [ Crash Failure ]
@@ -14812,7 +14847,7 @@
 crbug.com/591099 http/tests/inspector/fragment.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/indexeddb/database-data.html [ Failure ]
 crbug.com/591099 http/tests/inspector/indexeddb/database-names.html [ Failure ]
-crbug.com/591099 http/tests/inspector/indexeddb/database-refresh-view.html [ Crash Failure ]
+crbug.com/591099 http/tests/inspector/indexeddb/database-refresh-view.html [ Crash Failure Timeout ]
 crbug.com/591099 http/tests/inspector/indexeddb/database-structure.html [ Failure ]
 crbug.com/591099 http/tests/inspector/indexeddb/resources-panel.html [ Failure ]
 crbug.com/591099 http/tests/inspector/indexeddb/transaction-promise-console.html [ Failure ]
@@ -16424,7 +16459,7 @@
 crbug.com/591099 inspector-enabled/sources/debugger/script-formatter-console.html [ Failure ]
 crbug.com/591099 inspector-enabled/tabbed-pane-closeable-persistence-restore.html [ Failure ]
 crbug.com/591099 inspector-protocol/accessibility/accessibility-ignoredNodes.js [ Crash Failure Timeout ]
-crbug.com/591099 inspector-protocol/accessibility/accessibility-nameSources-buttons.js [ Crash Failure Timeout ]
+crbug.com/591099 inspector-protocol/accessibility/accessibility-nameSources-buttons.js [ Crash Failure Pass Timeout ]
 crbug.com/591099 inspector-protocol/accessibility/accessibility-nameSources-img-figure.js [ Crash Failure Timeout ]
 crbug.com/591099 inspector-protocol/accessibility/accessibility-nameSources-input-buttons.js [ Crash Timeout ]
 crbug.com/591099 inspector-protocol/accessibility/accessibility-nameSources-input.js [ Crash Failure Timeout ]
@@ -17224,7 +17259,7 @@
 crbug.com/591099 inspector/tracing/timeline-js/timeline-js-line-level-profile.html [ Crash Pass ]
 crbug.com/591099 inspector/tracing/timeline-js/timeline-microtasks.html [ Crash Failure ]
 crbug.com/591099 inspector/tracing/timeline-js/timeline-open-function-call.html [ Failure ]
-crbug.com/591099 inspector/tracing/timeline-js/timeline-runtime-stats.html [ Crash Pass ]
+crbug.com/591099 inspector/tracing/timeline-js/timeline-runtime-stats.html [ Crash Failure Pass ]
 crbug.com/591099 inspector/tracing/timeline-js/timeline-script-id.html [ Crash Failure ]
 crbug.com/591099 inspector/tracing/timeline-js/timeline-script-tag-1.html [ Crash Failure ]
 crbug.com/591099 inspector/tracing/timeline-js/timeline-script-tag-2.html [ Crash Failure ]
@@ -20351,26 +20386,42 @@
 crbug.com/591099 vibration/vibration-exceptions.html [ Failure ]
 crbug.com/591099 vibration/vibration-iframe.html [ Timeout ]
 crbug.com/591099 vibration/vibration-patterns.html [ Failure ]
-crbug.com/591099 virtual/android/fast/rootscroller/set-root-scroller.html [ Failure ]
+crbug.com/591099 virtual/android/fast/rootscroller/root-scroller-apply-filter-to-parent.html [ Crash Pass ]
+crbug.com/591099 virtual/android/fast/rootscroller/set-root-scroller.html [ Crash Failure ]
 crbug.com/591099 virtual/android/fullscreen/anonymous-block-merge-crash.html [ Crash Pass ]
+crbug.com/591099 virtual/android/fullscreen/api/element-request-fullscreen-two-iframes.html [ Crash Pass ]
+crbug.com/591099 virtual/android/fullscreen/api/element-request-fullscreen-vs-exit.html [ Crash Pass ]
 crbug.com/591099 virtual/android/fullscreen/compositor-touch-hit-rects-fullscreen-video-controls.html [ Failure ]
 crbug.com/591099 virtual/android/fullscreen/exit-full-screen-iframe.html [ Crash Failure ]
 crbug.com/591099 virtual/android/fullscreen/full-screen-cancel-nested.html [ Crash Failure ]
 crbug.com/591099 virtual/android/fullscreen/full-screen-child-not-allowed-crash.html [ Failure ]
+crbug.com/591099 virtual/android/fullscreen/full-screen-contentEditable-crash.html [ Crash Pass ]
 crbug.com/591099 virtual/android/fullscreen/full-screen-crash-offsetLeft.html [ Failure ]
+crbug.com/591099 virtual/android/fullscreen/full-screen-detached-document.html [ Crash Pass ]
 crbug.com/591099 virtual/android/fullscreen/full-screen-element-stack.html [ Failure ]
 crbug.com/591099 virtual/android/fullscreen/full-screen-frameset.html [ Failure ]
 crbug.com/591099 virtual/android/fullscreen/full-screen-iframe-allowed-nested.html [ Timeout ]
 crbug.com/591099 virtual/android/fullscreen/full-screen-iframe-allowed.html [ Crash Failure ]
 crbug.com/591099 virtual/android/fullscreen/full-screen-iframe-legacy.html [ Failure ]
 crbug.com/591099 virtual/android/fullscreen/full-screen-iframe-not-allowed.html [ Failure ]
-crbug.com/591099 virtual/android/fullscreen/full-screen-iframe-without-allow-attribute-allowed-from-parent.html [ Failure ]
+crbug.com/591099 virtual/android/fullscreen/full-screen-iframe-ua-style.html [ Crash Pass ]
+crbug.com/591099 virtual/android/fullscreen/full-screen-iframe-without-allow-attribute-allowed-from-parent.html [ Crash Failure ]
+crbug.com/591099 virtual/android/fullscreen/full-screen-keyboard-enabled.html [ Crash Pass ]
+crbug.com/591099 virtual/android/fullscreen/full-screen-not-enabled-when-unsupported.html [ Crash Pass ]
 crbug.com/591099 virtual/android/fullscreen/full-screen-placeholder.html [ Failure ]
-crbug.com/591099 virtual/android/fullscreen/full-screen-request-removed.html [ Failure ]
+crbug.com/591099 virtual/android/fullscreen/full-screen-remove-ancestor-after.html [ Crash Pass ]
+crbug.com/591099 virtual/android/fullscreen/full-screen-remove-ancestor.html [ Crash Pass ]
+crbug.com/591099 virtual/android/fullscreen/full-screen-render-inline.html [ Crash Pass ]
+crbug.com/591099 virtual/android/fullscreen/full-screen-request-removed.html [ Crash Failure ]
+crbug.com/591099 virtual/android/fullscreen/full-screen-request.html [ Crash Pass ]
+crbug.com/591099 virtual/android/fullscreen/full-screen-restrictions.html [ Crash Pass ]
 crbug.com/591099 virtual/android/fullscreen/full-screen-table-section.html [ Failure ]
 crbug.com/591099 virtual/android/fullscreen/full-screen-with-css-reference-filter.html [ Failure ]
 crbug.com/591099 virtual/android/fullscreen/full-screen-with-flex-item.html [ Crash Failure ]
+crbug.com/591099 virtual/android/fullscreen/full-screen-zIndex-after.html [ Crash Pass ]
 crbug.com/591099 virtual/android/fullscreen/model/fully-exit-fullscreen-nested-iframe.html [ Crash Pass ]
+crbug.com/591099 virtual/android/fullscreen/model/fully-exit-fullscreen-single.html [ Crash Pass ]
+crbug.com/591099 virtual/android/fullscreen/orthogonal-writing-mode-full-screen-reattach-crash.html [ Crash Pass ]
 crbug.com/591099 virtual/android/fullscreen/video-controls-override.html [ Failure ]
 crbug.com/591099 virtual/android/fullscreen/video-controls-timeline.html [ Failure ]
 crbug.com/591099 virtual/android/fullscreen/video-fail-to-enter-full-screen.html [ Failure ]
@@ -20382,7 +20433,9 @@
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/2d.text.draw.fill.maxWidth.veryLarge.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/2d.text.draw.fill.maxWidth.verySmall.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/OffscreenCanvas-constructor-in-worker.html [ Failure ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/OffscreenCanvas-invalid-args-in-worker.html [ Failure ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/OffscreenCanvas-getContext-in-worker.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/OffscreenCanvas-invalid-args-in-worker.html [ Crash Failure ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/OffscreenCanvas-resize.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/OffscreenCanvas-transferable-exceptions.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/OffscreenCanvas-transferable.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/access-zero-sized-canvas.html [ Crash Pass ]
@@ -20398,16 +20451,25 @@
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-ImageData-workers.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-after-destroy-iframe.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-alphaImageData-behavior.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-arc-connecting-line.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-arc-zero-lineto.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-bezier-same-endpoint.html [ Crash Pass ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-blending-image-over-image.html [ Failure ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-blend-solid.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-blending-fill-style.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-blending-image-over-color.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-blending-image-over-image.html [ Crash Failure ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-blending-pattern-over-image.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-blending-text.html [ Failure ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-blending-transforms.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-closePath-single-point.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-composite-alpha.html [ Crash Failure ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-composite-canvas.html [ Failure ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-composite-canvas.html [ Crash Failure ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-composite-fill-repaint.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-composite-image.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-composite-stroke-alpha.html [ Crash Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-composite-text-alpha.html [ Crash Failure ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-context-attributes-default-value.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-createImageBitmap-blob-in-workers.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-createImageBitmap-createPattern.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-createImageBitmap-data-in-workers.html [ Failure ]
@@ -20419,8 +20481,9 @@
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-createImageBitmap-invalid-args.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-createImageBitmap-invalid-blob-in-workers.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-createImageBitmap-recursive.html [ Failure ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-createImageBitmap-svg-no-intrinsic-size.html [ Failure ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-createImageBitmap-svg-no-intrinsic-size.html [ Crash Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-createImageBitmap-svg.html [ Failure ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-createImageBitmap-webgl.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-createPattern-fillRect-shadow.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-currentColor.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-direction.html [ Crash Pass ]
@@ -20429,21 +20492,30 @@
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-drawImage-animated.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-drawImage-live-video.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-drawImage-shadow.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-drawImage-svg.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse-360-winding.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse-circumference.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse-connecting-line.html [ Failure Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse-zero-lineto.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-empty-image-pattern.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-fill-zeroSizeGradient.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-fillPath-alpha-shadow.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-fillPath-gradient-shadow.html [ Crash Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-fillPath-pattern-shadow.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-fillPath-shadow.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-fillRect-gradient-shadow.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-fillRect-shadow.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-fillRect-zeroSizeGradient.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-fillRect.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-fillStyle-strokeStyle-stringification.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-fill-liveness.html [ Failure ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-fill-paint-color.html [ Failure ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-fill-paint-color.html [ Crash Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-fill-paint-gradient.html [ Failure ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-fill-paint-pattern.html [ Failure ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-fill-paint-pattern.html [ Crash Failure ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-liveness.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-removed.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-shadow.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-stroke-liveness.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-stroke-paint-color.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-stroke-paint-gradient.html [ Failure ]
@@ -20451,12 +20523,15 @@
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-svg-bbox.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-svg-inline.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-svg-liveness.html [ Failure ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-svg-off-screen.html [ Failure ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-svg-off-screen.html [ Crash Failure ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-undefined.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-units-off-screen.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-width-height-hidpi-scale.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-width-height-hidpi.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-width-height-scale.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-filter-width-height.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-font-cache.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-getImageData.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hides-fallback.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-accessibility-test.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-basic-test.html [ Crash Pass ]
@@ -20482,14 +20557,16 @@
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-isPointInStroke-with-path.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-isPointInStroke.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-large-dimensions.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-large-pattern.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-lineDash-input-sequence.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-lineDash-invalid.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-lineDash.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-lineWidth-intact-after-strokeRect.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-lost-gpu-context.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-measure-bidi-text.html [ Failure Pass ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-negative-size.html [ Failure ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-negative-size.html [ Crash Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-normalize-string.html [ Failure ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-overloads-strokeText.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-path-context-clip.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-path-context-fill.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-path-context-stroke.html [ Crash Pass ]
@@ -20500,6 +20577,7 @@
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-quadratic-same-endpoint.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-render-layer.html [ Failure Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-resetTransform.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-resize-after-paint-without-layout.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-resize-after-paint.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-scale-drawImage-shadow.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-scale-fillPath-shadow.html [ Crash Pass ]
@@ -20518,67 +20596,98 @@
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-strokeRect-gradient-shadow.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-text-baseline-tiny-fonts.html [ Failure Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-text-space-characters.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-textMetrics-all.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-textMetrics-width.html [ Failure ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-toDataURL-webp.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-transforms-during-path.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-transforms-fillRect-shadow.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas_arc_largeangles.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/color-space/display_linear-rgb.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/currentTransform-null.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/draw-focus-if-needed-invisible-crash.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/draw-focus-if-needed-on-event.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/draw-focus-if-needed-with-path2d.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/draw-focus-if-needed.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/drawImage-with-bad-canvas.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/drawImage-with-globalAlpha.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/drawImage-with-negative-source-destination.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/fallback-content.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/feimage-with-foreignobject-taint-canvas-2.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/feimage-with-foreignobject-taint-canvas.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/fill-stroke-clip-reset-path.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/fillText-shadow.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/fillrect-gradient-zero-stops.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/fillrect_gradient.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/font-no-zoom.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/gradient-with-clip.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/image-with-foreignobject-taint-canvas-2.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/image-with-foreignobject-taint-canvas.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/imagebitmap/transferFromImageBitmap-alpha.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/imagebitmap/transferFromImageBitmap-no-alpha.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/imagebitmap/transferFromImageBitmap.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/painting-on-bad-canvas.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/pattern-with-transform.html [ Crash Pass ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/quadraticCurveTo.xml [ Failure ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/pixelated-resize.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/pixelated.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/quadraticCurveTo.xml [ Crash Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/resize-while-save-active.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/set-empty-font-crash.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/setWidthResetAfterForcedRender.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/shadow-huge-blur.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/shadow-offset-1.html [ Failure ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/synchronous-create-pattern.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/toDataURL-alpha.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/toDataURL-noData.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/toDataURL-supportedTypes.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/transformed-canvas-reset.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/unclosed-canvas-1.html [ Failure ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/unclosed-canvas-3.html [ Failure ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/unclosed-canvas-3.html [ Crash Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/unclosed-canvas-4.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/canvas-getContext-crash.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/canvas-resize-crash.html [ Failure ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/compressed-tex-image.html [ Failure ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/compressed-tex-image.html [ Crash Failure ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/context-destroyed-crash.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/context-gc-custom-properties.html [ Failure ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/draw-webgl-to-canvas-2d.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/offscreenCanvas-APIs-NOT-alter-webgl-states.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/pixelated.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/renderer-and-vendor-strings.html [ Failure ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/shader-deleted-by-accessor.html [ Failure ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/tex-sub-image-cube-maps.html [ Failure ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/shader-deleted-by-accessor.html [ Crash Failure ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/tex-sub-image-cube-maps.html [ Crash Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/texImage-imageBitmap-from-canvas-resize.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/texImage-imageBitmap-from-image-resize.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/texImage-imageBitmap-from-image.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/texImage-imageBitmap-from-imageBitmap-from-blob.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/texImage-imageBitmap-from-imageBitmap-from-canvas.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/texImage-imageBitmap-from-imageBitmap-from-image.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/texImage-imageBitmap-from-video-resize.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/texImage-imageBitmap-structured-clone.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/texture-color-profile.html [ Failure ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/webgl-texture-binding-preserved.html [ Failure ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/webgl-shadow-no-alpha.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/webgl-texture-binding-preserved.html [ Crash Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/webgl/webgl-viewport-parameters-preserved.html [ Failure ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/yuv-video-on-accelerated-canvas.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/zero-size-fill-rect.html [ Crash Pass ]
 crbug.com/591099 virtual/enable_wasm/external/wpt/wasm/wasm_local_iframe_test.html [ Crash Pass Timeout ]
+crbug.com/591099 virtual/enable_wasm/external/wpt/wasm/wasm_serialization_tests.html [ Crash Pass ]
+crbug.com/591099 virtual/enable_wasm/external/wpt/wasm/wasm_service_worker_test.html [ Crash Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/12-55.html [ Failure ]
-crbug.com/591099 virtual/exotic-color-space/images/182.html [ Failure ]
-crbug.com/591099 virtual/exotic-color-space/images/2-comp.html [ Failure ]
+crbug.com/591099 virtual/exotic-color-space/images/182.html [ Crash Failure ]
+crbug.com/591099 virtual/exotic-color-space/images/2-comp.html [ Crash Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/2-dht.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/23-55.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/55.html [ Crash Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/alt-text-wrapping.html [ Crash Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/animated-background-image-crash.html [ Failure ]
-crbug.com/591099 virtual/exotic-color-space/images/color-jpeg-with-color-profile.html [ Failure ]
+crbug.com/591099 virtual/exotic-color-space/images/animated-gif-with-offsets.html [ Crash Pass ]
+crbug.com/591099 virtual/exotic-color-space/images/animated-png.html [ Crash Failure ]
+crbug.com/591099 virtual/exotic-color-space/images/color-jpeg-with-color-profile.html [ Crash Failure ]
+crbug.com/591099 virtual/exotic-color-space/images/color-profile-animate-rotate.html [ Crash Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-background-clip-text.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-background-image-cover.html [ Failure Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-background-image-cross-fade-png.html [ Failure Pass ]
-crbug.com/591099 virtual/exotic-color-space/images/color-profile-background-image-cross-fade.html [ Failure Pass ]
+crbug.com/591099 virtual/exotic-color-space/images/color-profile-background-image-cross-fade.html [ Crash Failure Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-background-image-repeat.html [ Failure Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-background-image-space.html [ Failure Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-border-image-source.html [ Failure ]
@@ -20588,36 +20697,44 @@
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-group.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-iframe.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-image-canvas-pattern.html [ Failure Pass ]
-crbug.com/591099 virtual/exotic-color-space/images/color-profile-image-canvas.html [ Failure Pass ]
+crbug.com/591099 virtual/exotic-color-space/images/color-profile-image-canvas.html [ Crash Failure Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-image-filter-all.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-image-object-fit.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-image-profile-match.html [ Failure ]
-crbug.com/591099 virtual/exotic-color-space/images/color-profile-image-pseudo-content.html [ Failure ]
+crbug.com/591099 virtual/exotic-color-space/images/color-profile-image-pseudo-content.html [ Crash Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-image-shape.html [ Failure ]
+crbug.com/591099 virtual/exotic-color-space/images/color-profile-image-svg-resource-url.html [ Crash Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-image.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-layer-filter.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-layer.html [ Failure ]
-crbug.com/591099 virtual/exotic-color-space/images/color-profile-mask-image-svg.html [ Failure ]
+crbug.com/591099 virtual/exotic-color-space/images/color-profile-mask-image-svg.html [ Crash Failure ]
+crbug.com/591099 virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb.html [ Crash Pass ]
+crbug.com/591099 virtual/exotic-color-space/images/color-profile-munsell-srgb-to-srgb.html [ Crash Pass ]
+crbug.com/591099 virtual/exotic-color-space/images/color-profile-object.html [ Crash Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-svg-foreign-object.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/content-url-image-with-alt-text-dynamic-2.html [ Crash Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/cross-fade-background-size.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/cross-fade-blending.html [ Failure ]
+crbug.com/591099 virtual/exotic-color-space/images/cross-fade-broken-image.html [ Crash Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/cross-fade-invalidation.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/cross-fade-overflow-position.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/cross-fade-simple.html [ Failure ]
-crbug.com/591099 virtual/exotic-color-space/images/cross-fade-sizing.html [ Failure ]
+crbug.com/591099 virtual/exotic-color-space/images/cross-fade-sizing.html [ Crash Failure ]
+crbug.com/591099 virtual/exotic-color-space/images/cross-fade-svg-fragments.html [ Crash Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/cross-fade-svg-size-diff.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/cross-fade-svg-size.html [ Failure ]
-crbug.com/591099 virtual/exotic-color-space/images/cross-fade-tiled.html [ Failure ]
+crbug.com/591099 virtual/exotic-color-space/images/cross-fade-tiled.html [ Crash Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/destroyed-image-load-event.html [ Crash Failure ]
+crbug.com/591099 virtual/exotic-color-space/images/drag-image-descendant-painting-sibling.html [ Crash Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/drag-svg-image.html [ Failure ]
-crbug.com/591099 virtual/exotic-color-space/images/embed-does-not-propagate-dimensions-to-object-ancestor.html [ Failure ]
+crbug.com/591099 virtual/exotic-color-space/images/embed-does-not-propagate-dimensions-to-object-ancestor.html [ Crash Failure ]
+crbug.com/591099 virtual/exotic-color-space/images/embed-image.html [ Crash Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/exif-orientation-css.html [ Crash Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/exif-orientation-height-image-document.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/exif-orientation-image-document.html [ Crash Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/exif-orientation.html [ Crash Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/extra-image-in-image-document.html [ Failure ]
-crbug.com/591099 virtual/exotic-color-space/images/favicon-as-image.html [ Failure ]
+crbug.com/591099 virtual/exotic-color-space/images/favicon-as-image.html [ Crash Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/gif-loop-count.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/gif-short-app-extension-string.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/gray-scale-jpeg-with-color-profile.html [ Failure ]
@@ -20633,16 +20750,16 @@
 crbug.com/591099 virtual/exotic-color-space/images/image-hover-display-alt.html [ Crash Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/image-in-map.html [ Crash Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/image-invalid-data.html [ Crash Failure ]
-crbug.com/591099 virtual/exotic-color-space/images/image-load-event-in-fragment.html [ Failure ]
+crbug.com/591099 virtual/exotic-color-space/images/image-load-event-in-fragment.html [ Crash Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/image-map-anchor-children.html [ Failure ]
-crbug.com/591099 virtual/exotic-color-space/images/image-map-multiple-xhtml.xhtml [ Failure ]
+crbug.com/591099 virtual/exotic-color-space/images/image-map-multiple-xhtml.xhtml [ Crash Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/image-map-multiple.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/image-map-zoom-alt-content.html [ Crash Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/image-map-zoom.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/image-page-injected-script-crash.html [ Crash Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/image-use-counters.html [ Crash Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/image-zoom-to-25.html [ Failure ]
-crbug.com/591099 virtual/exotic-color-space/images/image-zoom-to-500.html [ Failure ]
+crbug.com/591099 virtual/exotic-color-space/images/image-zoom-to-500.html [ Crash Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/imagemap-circle-focus-ring.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/imagemap-focus-ring-in-positioned-container.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/imagemap-focus-ring-outline-color-explicitly-inherited-from-map.html [ Failure ]
@@ -20651,28 +20768,38 @@
 crbug.com/591099 virtual/exotic-color-space/images/imagemap-focus-ring-with-paint-root-offset.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/imagemap-focus-ring-with-scale-transform.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/imagemap-focus-ring-zero-outline-width.html [ Failure ]
+crbug.com/591099 virtual/exotic-color-space/images/imagemap-focus-ring-zoom-style-default-shape.html [ Crash Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/imagemap-focus-ring-zoom.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/imagemap-focus-ring.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/imagemap-overflowing-circle-focus-ring.html [ Failure ]
-crbug.com/591099 virtual/exotic-color-space/images/imagemap-overflowing-polygon-focus-ring.html [ Failure ]
+crbug.com/591099 virtual/exotic-color-space/images/imagemap-overflowing-polygon-focus-ring.html [ Crash Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/imagemap-polygon-focus-ring.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/imagemap-scroll.html [ Crash Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/img-dimensions-styled.html [ Crash Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/invalid-image-url-crash.html [ Crash Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/jpeg-yuv-image-decoding.html [ Failure Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/jpeg-yuv-progressive-canvas.html [ Failure Pass ]
-crbug.com/591099 virtual/exotic-color-space/images/jpeg-yuv-progressive-image.html [ Failure Pass ]
+crbug.com/591099 virtual/exotic-color-space/images/jpeg-yuv-progressive-image.html [ Crash Failure Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/link-body-content-imageDimensionChanged-crash.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/load-img-with-empty-src.html [ Failure ]
-crbug.com/591099 virtual/exotic-color-space/images/motion-jpeg-single-frame.html [ Failure ]
+crbug.com/591099 virtual/exotic-color-space/images/mask-box-image-crash.html [ Crash Pass ]
+crbug.com/591099 virtual/exotic-color-space/images/motion-jpeg-single-frame.html [ Crash Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/move-image-to-new-document.html [ Crash Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/multiple-inflight-error-event-crash.html [ Crash Pass ]
+crbug.com/591099 virtual/exotic-color-space/images/natural-dimensions-correct-after-image-reset.html [ Crash Pass ]
+crbug.com/591099 virtual/exotic-color-space/images/onload-event-when-reloading-image-after-successful-image-load.html [ Crash Pass ]
+crbug.com/591099 virtual/exotic-color-space/images/optimize-contrast-image.html [ Crash Pass ]
+crbug.com/591099 virtual/exotic-color-space/images/paletted-png-with-color-profile.html [ Crash Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/pdf-as-background.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/pdf-as-tiled-background.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/percent-height-image.html [ Failure ]
+crbug.com/591099 virtual/exotic-color-space/images/percentage-height-image-with-auto-height-container-computes-as-percentage.html [ Crash Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/pixel-crack-image-background-webkit-transform-scale.html [ Failure ]
-crbug.com/591099 virtual/exotic-color-space/images/png-extra-row-crash.html [ Failure ]
+crbug.com/591099 virtual/exotic-color-space/images/pixelated-hidpi.html [ Crash Pass ]
+crbug.com/591099 virtual/exotic-color-space/images/pixelated-image.html [ Crash Pass ]
+crbug.com/591099 virtual/exotic-color-space/images/png-extra-row-crash.html [ Crash Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/png-suite/test.html [ Crash Failure ]
+crbug.com/591099 virtual/exotic-color-space/images/png-with-color-profile.html [ Crash Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/png_per_row_alpha_decoding.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/rendering-broken-0px-images-quirk.html [ Crash Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/rendering-broken-0px-images.html [ Crash Failure ]
@@ -20691,23 +20818,27 @@
 crbug.com/591099 virtual/exotic-color-space/images/update-alt-text.html [ Crash Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/viewport-in-standalone-image-document.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/webgl-teximage2d.html [ Crash Pass ]
-crbug.com/591099 virtual/exotic-color-space/images/webp-flip.html [ Failure ]
+crbug.com/591099 virtual/exotic-color-space/images/webp-flip.html [ Crash Failure ]
+crbug.com/591099 virtual/exotic-color-space/images/zoomed-img-height-acid3.html [ Crash Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/zoomed-img-size.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/zoomed-offset-size.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/12-55.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/182.html [ Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/2-comp.html [ Failure ]
+crbug.com/591099 virtual/gpu-rasterization/images/2-comp.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/2-dht.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/23-55.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/55.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/alt-text-wrapping.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/animated-background-image-crash.html [ Failure ]
+crbug.com/591099 virtual/gpu-rasterization/images/animated-gif-fast-crash.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu-rasterization/images/animated-gif-with-offsets.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu-rasterization/images/animated-png.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-jpeg-with-color-profile.html [ Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/color-profile-background-image-cover.html [ Failure Pass ]
+crbug.com/591099 virtual/gpu-rasterization/images/color-profile-background-image-cover.html [ Crash Failure Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-background-image-cross-fade-png.html [ Failure Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-background-image-cross-fade.html [ Crash Failure Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-background-image-repeat.html [ Failure Pass ]
-crbug.com/591099 virtual/gpu-rasterization/images/color-profile-background-image-space.html [ Failure Pass ]
+crbug.com/591099 virtual/gpu-rasterization/images/color-profile-background-image-space.html [ Crash Failure Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-border-image-source.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-border-radius.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-drag-image.html [ Failure ]
@@ -20715,45 +20846,52 @@
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-group.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-iframe.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-image-canvas-pattern.html [ Failure Pass ]
+crbug.com/591099 virtual/gpu-rasterization/images/color-profile-image-canvas-svg.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-image-canvas.html [ Failure Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-image-filter-all.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-image-object-fit.html [ Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/color-profile-image-profile-match.html [ Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/color-profile-image-pseudo-content.html [ Failure ]
+crbug.com/591099 virtual/gpu-rasterization/images/color-profile-image-profile-match.html [ Crash Failure ]
+crbug.com/591099 virtual/gpu-rasterization/images/color-profile-image-pseudo-content.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-image-shape.html [ Failure ]
+crbug.com/591099 virtual/gpu-rasterization/images/color-profile-image-svg-resource-url.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-image.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-layer-filter.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-layer.html [ Failure Timeout ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-mask-image-svg.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-svg-foreign-object.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/content-url-image-with-alt-text-dynamic-2.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu-rasterization/images/content-url-image-with-alt-text.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu-rasterization/images/crash-when-fallback-content-deleted.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/cross-fade-background-size.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/cross-fade-blending.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/cross-fade-invalidation.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/cross-fade-overflow-position.html [ Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/cross-fade-simple.html [ Failure ]
+crbug.com/591099 virtual/gpu-rasterization/images/cross-fade-simple.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/cross-fade-sizing.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/cross-fade-tiled.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/destroyed-image-load-event.html [ Crash Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/drag-svg-image.html [ Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/embed-does-not-propagate-dimensions-to-object-ancestor.html [ Failure Pass ]
+crbug.com/591099 virtual/gpu-rasterization/images/drag-image-2.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu-rasterization/images/drag-image-transformed-child.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu-rasterization/images/drag-image.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu-rasterization/images/drag-svg-image.html [ Crash Failure ]
+crbug.com/591099 virtual/gpu-rasterization/images/embed-does-not-propagate-dimensions-to-object-ancestor.html [ Crash Failure Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/exif-orientation-css.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/exif-orientation-height-image-document.html [ Failure Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/exif-orientation-image-document.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/exif-orientation.html [ Crash Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/extra-image-in-image-document.html [ Failure ]
+crbug.com/591099 virtual/gpu-rasterization/images/extra-image-in-image-document.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/favicon-as-image.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/gif-loop-count.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/gif-short-app-extension-string.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/gray-scale-jpeg-with-color-profile.html [ Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/gray-scale-png-with-color-profile.html [ Failure ]
+crbug.com/591099 virtual/gpu-rasterization/images/gray-scale-png-with-color-profile.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/icon-0colors.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/icon-decoding.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/image-change-src.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/image-change-without-resize-shouldnt-layout.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/image-click-scale-restore-zoomed-image.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/image-css3-content-data.html [ Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/image-document-write-assert.html [ Failure ]
+crbug.com/591099 virtual/gpu-rasterization/images/image-document-write-assert.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/image-empty-data.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/image-hover-display-alt.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/image-in-map.html [ Crash Failure ]
@@ -20769,6 +20907,7 @@
 crbug.com/591099 virtual/gpu-rasterization/images/image-zoom-to-25.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/image-zoom-to-500.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/imagemap-circle-focus-ring.html [ Failure ]
+crbug.com/591099 virtual/gpu-rasterization/images/imagemap-duplicate-outlines-crash.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/imagemap-focus-ring-in-positioned-container.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-explicitly-inherited-from-map.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-not-inherited-from-map.html [ Failure ]
@@ -20776,26 +20915,32 @@
 crbug.com/591099 virtual/gpu-rasterization/images/imagemap-focus-ring-with-paint-root-offset.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/imagemap-focus-ring-with-scale-transform.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/imagemap-focus-ring-zero-outline-width.html [ Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/imagemap-focus-ring-zoom.html [ Failure ]
+crbug.com/591099 virtual/gpu-rasterization/images/imagemap-focus-ring-zoom.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/imagemap-focus-ring.html [ Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/imagemap-overflowing-circle-focus-ring.html [ Failure ]
+crbug.com/591099 virtual/gpu-rasterization/images/imagemap-overflowing-circle-focus-ring.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/imagemap-overflowing-polygon-focus-ring.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/imagemap-polygon-focus-ring.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/imagemap-scroll.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/img-dimensions-styled.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/invalid-image-url-crash.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu-rasterization/images/jpeg-with-color-profile.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/jpeg-yuv-image-decoding.html [ Failure Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/jpeg-yuv-progressive-canvas.html [ Failure Pass ]
-crbug.com/591099 virtual/gpu-rasterization/images/jpeg-yuv-progressive-image.html [ Failure Pass ]
+crbug.com/591099 virtual/gpu-rasterization/images/jpeg-yuv-progressive-image.html [ Crash Failure Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/link-body-content-imageDimensionChanged-crash.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/load-img-with-empty-src.html [ Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/motion-jpeg-single-frame.html [ Failure ]
+crbug.com/591099 virtual/gpu-rasterization/images/motion-jpeg-single-frame.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/move-image-to-new-document.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/multiple-inflight-error-event-crash.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu-rasterization/images/onload-event-when-reloading-image-after-interrupted-broken-image-load.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu-rasterization/images/optimize-contrast-canvas.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu-rasterization/images/paletted-png-with-color-profile.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/pdf-as-background.html [ Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/pdf-as-tiled-background.html [ Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/percent-height-image.html [ Failure ]
+crbug.com/591099 virtual/gpu-rasterization/images/pdf-as-tiled-background.html [ Crash Failure ]
+crbug.com/591099 virtual/gpu-rasterization/images/percent-height-image.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/pixel-crack-image-background-webkit-transform-scale.html [ Crash Failure Timeout ]
+crbug.com/591099 virtual/gpu-rasterization/images/pixelated-canvas.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu-rasterization/images/pixelated-svg-image.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/png-extra-row-crash.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/png-suite/test.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/png_per_row_alpha_decoding.html [ Failure ]
@@ -20807,17 +20952,21 @@
 crbug.com/591099 virtual/gpu-rasterization/images/rendering-broken-block-flow-images.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/rendering-broken-images-empty-alt.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/rendering-broken-images.html [ Crash Failure ]
+crbug.com/591099 virtual/gpu-rasterization/images/rgb-jpeg-endian-pixels.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/script-counter-imageDimensionChanged-crash.html [ Failure ]
+crbug.com/591099 virtual/gpu-rasterization/images/size-failure.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/sprite-no-bleed.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/style-access-during-imageChanged-crash.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/style-access-during-imageChanged-style-freeze.html [ Crash Pass ]
-crbug.com/591099 virtual/gpu-rasterization/images/text-content-crash-2.html [ Failure ]
+crbug.com/591099 virtual/gpu-rasterization/images/text-content-crash-2.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/text-content-crash.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/update-alt-text.html [ Crash Pass ]
-crbug.com/591099 virtual/gpu-rasterization/images/viewport-in-standalone-image-document.html [ Failure ]
+crbug.com/591099 virtual/gpu-rasterization/images/viewport-in-standalone-image-document.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/webgl-teximage2d.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu-rasterization/images/webp-animation.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu-rasterization/images/webp-color-profile-lossless.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/webp-flip.html [ Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/zoomed-img-size.html [ Failure ]
+crbug.com/591099 virtual/gpu-rasterization/images/zoomed-img-size.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/zoomed-offset-size.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/2d.composite.globalAlpha.fillPath.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/2d.fillText.gradient.html [ Crash Pass ]
@@ -20825,7 +20974,12 @@
 crbug.com/591099 virtual/gpu/fast/canvas/2d.text.draw.fill.maxWidth.negative.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/2d.text.draw.fill.maxWidth.veryLarge.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/2d.text.draw.fill.maxWidth.verySmall.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/CanvasRendering2D-prototype-chain.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/OffscreenCanvas-ImageBitmapSource.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/OffscreenCanvas-commit-frameless-doc.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/OffscreenCanvas-commit-retains-backing.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/OffscreenCanvas-constructor-in-worker.html [ Failure ]
+crbug.com/591099 virtual/gpu/fast/canvas/OffscreenCanvas-filter-in-worker.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/OffscreenCanvas-invalid-args-in-worker.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/OffscreenCanvas-transferable-exceptions.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/OffscreenCanvas-transferable.html [ Failure ]
@@ -20833,6 +20987,8 @@
 crbug.com/591099 virtual/gpu/fast/canvas/alpha.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/arc-crash.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/arc360.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/bidi-multi-run.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/bug445162.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/bug544329.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-2d-clip-anti-aliasing.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-ImageBitmap-close.html [ Failure ]
@@ -20842,8 +20998,12 @@
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-ImageData-workers.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-after-destroy-iframe.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-alphaImageData-behavior.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-arc-connecting-line.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-arc-zero-lineto.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-bezier-same-endpoint.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-blending-color-over-image.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-blending-gradient-over-color.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-blending-gradient-over-pattern.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-blending-image-over-image.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-blending-text.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-closePath-single-point.html [ Crash Pass ]
@@ -20852,6 +21012,8 @@
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-composite-image.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-composite-stroke-alpha.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-composite-text-alpha.html [ Crash Failure ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-context-attributes-default-value.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-createImageBitmap-animated.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-createImageBitmap-blob-in-workers.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-createImageBitmap-createPattern.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-createImageBitmap-data-in-workers.html [ Failure ]
@@ -20859,17 +21021,18 @@
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-createImageBitmap-drawImage-video.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-createImageBitmap-drawImage.html [ Timeout ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-createImageBitmap-from-canvas-toBlob.html [ Failure ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-createImageBitmap-immutable.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-createImageBitmap-invalid-args-in-workers.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-createImageBitmap-invalid-args.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-createImageBitmap-invalid-blob-in-workers.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-createImageBitmap-recursive.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-createImageBitmap-svg-no-intrinsic-size.html [ Failure ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-createImageBitmap-svg.html [ Failure ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-createImageBitmap-svg.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-createPattern-fillRect-shadow.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-currentColor.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-direction.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-draw-canvas-on-canvas-shadow.html [ Crash Pass ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-drawImage-animated-images.html [ Failure ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-drawImage-animated-images.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-drawImage-animated.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-drawImage-live-video.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-drawImage-shadow.html [ Crash Pass ]
@@ -20891,16 +21054,19 @@
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-filter-stroke-liveness.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-filter-stroke-paint-color.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-filter-stroke-paint-gradient.html [ Failure ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-filter-stroke-paint-pattern.html [ Failure ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-filter-stroke-paint-pattern.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-filter-svg-bbox.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-filter-svg-inline.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-filter-svg-liveness.html [ Failure ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-filter-svg-off-screen.html [ Failure ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-filter-width-height-hidpi-scale.html [ Failure ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-filter-svg-off-screen.html [ Crash Failure ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-filter-width-height-hidpi-scale.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-filter-width-height-hidpi.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-filter-width-height-scale.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-filter-width-height.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-font-cache.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-getImageData-invalid.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-getImageData-negative-source.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-gradient-without-path.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-hides-fallback.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-accessibility-test.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-basic-test.html [ Crash Pass ]
@@ -20920,6 +21086,7 @@
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-transform-test.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-imageSmoothingEnabled-repaint.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-imageSmoothingQuality.html [ Crash Failure ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-incremental-repaint-3.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-invalid-fillstyle.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-invalid-strokestyle.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-invalid-video.html [ Failure ]
@@ -20961,11 +21128,18 @@
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-strokeRect-alpha-shadow.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-strokeRect-gradient-shadow.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-text-baseline-tiny-fonts.html [ Failure Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-text-ideographic-space.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-text-space-characters.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-textMetrics-width.html [ Failure ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-toBlob-jpeg-medium-quality.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-toDataURL-jpeg-maximum-quality.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-toDataURL-webp-alpha.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-transforms-during-path.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-transforms-fillRect-shadow.html [ Crash Pass ]
-crbug.com/591099 virtual/gpu/fast/canvas/currentTransform-null.html [ Failure ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-with-illegal-args.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/color-space/display_linear-rgb.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/currentTransform-null.html [ Crash Failure ]
+crbug.com/591099 virtual/gpu/fast/canvas/downsample-quality.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/draw-focus-if-needed-invisible-crash.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/draw-focus-if-needed-on-event.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/draw-focus-if-needed-with-path2d.html [ Crash Pass ]
@@ -20978,10 +21152,15 @@
 crbug.com/591099 virtual/gpu/fast/canvas/fillText-shadow.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/fillrect_gradient.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/font-no-zoom.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/font-update.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/gradient-addColorStop-with-invalid-offset.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/gradient-with-clip.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/image-object-in-canvas.html [ Failure ]
+crbug.com/591099 virtual/gpu/fast/canvas/image-pattern-rotate.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/image-with-foreignobject-taint-canvas-2.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/image-with-foreignobject-taint-canvas.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/invalid-set-font-crash.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/linearGradient-infinite-values.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/painting-on-bad-canvas.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/pattern-with-transform.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/quadraticCurveTo.xml [ Failure ]
@@ -20989,7 +21168,8 @@
 crbug.com/591099 virtual/gpu/fast/canvas/set-empty-font-crash.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/setWidthResetAfterForcedRender.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/shadow-huge-blur.html [ Crash Pass ]
-crbug.com/591099 virtual/gpu/fast/canvas/shadow-offset-1.html [ Failure ]
+crbug.com/591099 virtual/gpu/fast/canvas/shadow-offset-1.html [ Crash Failure ]
+crbug.com/591099 virtual/gpu/fast/canvas/text-globalAlpha.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/toDataURL-alpha.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/toDataURL-noData.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/toDataURL-supportedTypes.html [ Failure ]
@@ -20997,21 +21177,99 @@
 crbug.com/591099 virtual/gpu/fast/canvas/unclosed-canvas-1.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/unclosed-canvas-3.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/unclosed-canvas-4.html [ Failure ]
-crbug.com/591099 virtual/gpu/fast/canvas/webgl/canvas-getContext-crash.html [ Failure ]
+crbug.com/591099 virtual/gpu/fast/canvas/webgl/canvas-getContext-crash.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/webgl/canvas-resize-crash.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/webgl/compressed-tex-image.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/webgl/context-gc-custom-properties.html [ Failure ]
+crbug.com/591099 virtual/gpu/fast/canvas/webgl/draw-webgl-to-canvas-2d.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/webgl/offscreenCanvas-context-lost.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/webgl/offscreenCanvas-transferToImageBitmap-invalid-mailbox.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/webgl/renderer-and-vendor-strings.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/webgl/shader-deleted-by-accessor.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/webgl/tex-sub-image-cube-maps.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/webgl/texImage-imageBitmap-from-canvas-resize.html [ Crash Pass ]
-crbug.com/591099 virtual/gpu/fast/canvas/webgl/texture-color-profile.html [ Failure ]
+crbug.com/591099 virtual/gpu/fast/canvas/webgl/texImage-imageBitmap-from-imageBitmap-from-blob.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/webgl/texImage-imageBitmap-from-imageBitmap-from-image.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/webgl/texImage-imageBitmap-from-imageData.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/webgl/texImage-imageBitmap-from-video-resize.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/webgl/texImage-imageBitmap-transferable.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/webgl/texture-color-profile.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/webgl/webgl-texture-binding-preserved.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/webgl/webgl-viewport-parameters-preserved.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/zero-size-fill-rect.html [ Crash Pass ]
+crbug.com/591099 virtual/high-contrast-mode/paint/high-contrast-mode/image-filter-all/image-invert.html [ Crash Pass ]
 crbug.com/591099 virtual/high-contrast-mode/paint/high-contrast-mode/image-filter-all/text-on-backgrounds.html [ Failure ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/abspos/abspos-containing-block-initial-005a.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/clear-002.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/clear-applies-to-009.xht [ Crash Pass ]
+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/clear-float-003.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/clear-float-004.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/clear-float-007.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/float-applies-to-009.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/float-non-replaced-width-009.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/float-replaced-height-001.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/float-replaced-height-003.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/float-replaced-height-007.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/float-replaced-width-006.xht [ Crash Pass ]
+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-007.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/floats-026.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/floats-031.xht [ Crash Failure ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/floats-112.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/floats-122.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/floats-139.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/floats-149.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/margin-collapse-024.xht [ Crash Pass ]
+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-clear/margin-collapse-166.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/margin-collapse-clear-003.xht [ Crash Failure ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/margin-collapse-clear-016.xht [ Crash Pass ]
+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-001c.xht [ Crash Failure ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats/floats-placement-vertical-003.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats/floats-placement-vertical-004.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats/floats-rule3-outside-right-001.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats/floats-wrap-bfc-003-left-table.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats/floats-wrap-bfc-004.xht [ Crash Failure ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats/floats-wrap-bfc-005.xht [ Crash Failure ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats/floats-wrap-top-below-bfc-001r.xht [ Crash Failure ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats/floats-wrap-top-below-bfc-003r.xht [ Crash Pass ]
 crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats/floats-wrap-top-below-inline-003r.xht [ Failure Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/linebox/inline-formatting-context-011.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/linebox/inline-formatting-context-015.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/linebox/line-height-016.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/linebox/line-height-018.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/linebox/line-height-035.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/linebox/line-height-037.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/linebox/line-height-040.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/linebox/line-height-050.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/linebox/line-height-applies-to-006.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/linebox/line-height-applies-to-013.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/linebox/vertical-align-019.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/linebox/vertical-align-020.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/linebox/vertical-align-067.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/linebox/vertical-align-088.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/linebox/vertical-align-089.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/linebox/vertical-align-109.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/linebox/vertical-align-applies-to-001.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/linebox/vertical-align-baseline-008.xht [ Crash Pass ]
+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-in-inline-empty-004.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/normal-flow/block-in-inline-insert-001c.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/normal-flow/block-replaced-height-007.xht [ Crash Pass ]
 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/height-084.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/normal-flow/inlines-016.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/normal-flow/max-width-083.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/normal-flow/min-height-024.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/normal-flow/min-height-111.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/normal-flow/min-width-049.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/normal-flow/min-width-applies-to-016.xht [ Crash 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/normal-flow/width-006.xht [ Crash Pass ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/positioning/right-101.xht [ Crash Pass ]
 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 ]
 crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/positioning/top-031.xht [ Crash Failure ]
@@ -21042,6 +21300,65 @@
 crbug.com/591099 virtual/layout_ng/fast/block/float/rubybase-children-moved-crash.html [ Failure ]
 crbug.com/591099 virtual/layout_ng/fast/block/margin-collapse/line-beside-float-complex-margin-collapsing.html [ Failure ]
 crbug.com/591099 virtual/layout_ng/fast/block/margin-collapse/self-collapsing-block-creates-block-formatting-context.html [ Failure ]
+crbug.com/591099 virtual/mojo-loading/http/tests/canvas/canvas-filter-svg-external-multiple.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/cookies/multiple-cookies.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/credentialmanager/credentialscontainer-frame-errors.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/dom/mutationobserver-parserappend-childlist.php [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/dom/script-module-load-incomplete-no-crash.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/download/default-encoding.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/eventsource/eventsource-cors-redirect.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/eventsource/eventsource-reconnect-during-navigate-crash.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/eventsource/eventsource-retry-precision.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/feature-policy/fullscreen-allowed-by-container-policy-relocate.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/feature-policy/fullscreen-disabled.php [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/feature-policy/payment-enabledforself.php [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/chromium/data-saver.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/chromium/mime-sniffing.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/serviceworker-proxied/thorough/access-control-base-https-other-https.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/serviceworker-proxied/thorough/access-control.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/serviceworker-proxied/thorough/auth-nocors-other-https.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/serviceworker-proxied/thorough/auth-other-https.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/serviceworker-proxied/thorough/auth.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/serviceworker-proxied/thorough/cookie-base-https-other-https.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/serviceworker-proxied/thorough/cookie-nocors-other-https.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/serviceworker-proxied/thorough/cookie.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/serviceworker-proxied/thorough/cors-preflight.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/serviceworker-proxied/thorough/cors-preflight2.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/serviceworker-proxied/thorough/cors.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/serviceworker-proxied/thorough/nocors.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/serviceworker-proxied/thorough/redirect-loop-base-https-other-https.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/serviceworker-proxied/thorough/redirect-nocors-other-https.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/serviceworker-proxied/thorough/scheme-blob.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/serviceworker/request-base-https-other-https.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/serviceworker/response.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/serviceworker/stream-reader.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/serviceworker/thorough/access-control-base-https-other-https.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/serviceworker/thorough/auth.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/serviceworker/thorough/cookie-other-https.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/serviceworker/thorough/cors-preflight2-base-https-other-https.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/serviceworker/thorough/nocors-other-https.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/serviceworker/thorough/nocors.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/serviceworker/thorough/redirect-loop.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/serviceworker/thorough/redirect-nocors-other-https.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/serviceworker/thorough/redirect-password-base-https-other-https.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/serviceworker/thorough/scheme-data.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/window/block-mixed-content-nocors-base-https.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/window/body-mixin-base-https-other-https.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/window/fetch.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/window/filtered-response-base-https-other-https.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/window/referrer-base-https-other-https.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/window/referrer.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/window/stream-reader-base-https-other-https.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/window/thorough/cors-preflight-other-https.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/window/thorough/cors.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/window/thorough/redirect-other-https.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/window/thorough/redirect-password-base-https-other-https.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/window/thorough/redirect-password-other-https.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/window/thorough/scheme-blob-other-https.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/workers/headers-base-https-other-https.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/workers/request-base-https-other-https.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/workers/request.html [ Crash Pass ]
+crbug.com/591099 virtual/mojo-loading/http/tests/fetch/workers/thorough/cors.html [ Crash Pass ]
 crbug.com/591099 virtual/mojo-loading/http/tests/inspector-protocol/network/disable-interception-midway.html [ 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 ]
@@ -21625,23 +21942,23 @@
 crbug.com/591099 virtual/threaded/animations/3d/change-transform-in-end-event.html [ Failure Pass ]
 crbug.com/591099 virtual/threaded/animations/3d/state-at-end-event-transform.html [ Failure Pass ]
 crbug.com/591099 virtual/threaded/animations/animation-css-rule-types.html [ Failure ]
-crbug.com/591099 virtual/threaded/animations/events/animation-events-create.html [ Failure ]
 crbug.com/591099 virtual/threaded/animations/animations-parsing.html [ Timeout ]
-crbug.com/591099 virtual/threaded/animations/responsive/animations-responsive-to-color-change.html [ Crash Pass ]
-crbug.com/591099 virtual/threaded/animations/svg/clear-svg-animation-effects.html [ Crash Pass ]
 crbug.com/591099 virtual/threaded/animations/composition/background-position-composition.html [ Crash Pass ]
 crbug.com/591099 virtual/threaded/animations/composition/caret-color-composition.html [ Crash Pass ]
 crbug.com/591099 virtual/threaded/animations/composition/stroke-dasharray-composition.html [ Crash Pass ]
 crbug.com/591099 virtual/threaded/animations/computed-style.html [ Failure ]
-crbug.com/591099 virtual/threaded/animations/svg/css-animation-overrides-svg-presentation-attribute-animation.html [ Crash Pass ]
-crbug.com/591099 virtual/threaded/animations/events/delay-start-event.html [ Failure ]
 crbug.com/591099 virtual/threaded/animations/display-change-does-not-terminate-animation.html [ Crash Failure ]
 crbug.com/591099 virtual/threaded/animations/display-inline-style-adjust.html [ Failure Timeout ]
 crbug.com/591099 virtual/threaded/animations/display-none-cancel-computedstyle.html [ Failure ]
 crbug.com/591099 virtual/threaded/animations/display-none-terminates-animation.html [ Failure ]
+crbug.com/591099 virtual/threaded/animations/events/animation-events-create.html [ Failure ]
+crbug.com/591099 virtual/threaded/animations/events/delay-start-event.html [ Failure ]
+crbug.com/591099 virtual/threaded/animations/events/negative-delay-events.html [ Failure ]
+crbug.com/591099 virtual/threaded/animations/events/play-state-initially-paused-start-event.html [ Failure ]
+crbug.com/591099 virtual/threaded/animations/font-size-using-ems.html [ Failure ]
+crbug.com/591099 virtual/threaded/animations/hit-testing/inline-element-animation-end-hit-test.html [ Failure ]
 crbug.com/591099 virtual/threaded/animations/img-element-transform.html [ Crash Pass Timeout ]
 crbug.com/591099 virtual/threaded/animations/inline-block-transform.html [ Crash Pass ]
-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-color-interpolation.html [ Crash Pass ]
 crbug.com/591099 virtual/threaded/animations/interpolation/background-image-interpolation.html [ Crash Timeout ]
@@ -21728,14 +22045,19 @@
 crbug.com/591099 virtual/threaded/animations/interpolation/webkit-transform-origin-interpolation.html [ Crash Pass ]
 crbug.com/591099 virtual/threaded/animations/keyframes-rule.html [ Failure ]
 crbug.com/591099 virtual/threaded/animations/lazy-detached-animation-stop.html [ Failure ]
-crbug.com/591099 virtual/threaded/animations/events/negative-delay-events.html [ Failure ]
-crbug.com/591099 virtual/threaded/animations/events/play-state-initially-paused-start-event.html [ Failure ]
 crbug.com/591099 virtual/threaded/animations/play-state.html [ Failure ]
 crbug.com/591099 virtual/threaded/animations/prefixed/animation-inherit-initial-unprefixed.html [ Failure ]
 crbug.com/591099 virtual/threaded/animations/prefixed/keyframes-cssom-prefixed-02.html [ Failure ]
 crbug.com/591099 virtual/threaded/animations/prefixed/keyframes-cssom-unprefixed-02.html [ Failure ]
+crbug.com/591099 virtual/threaded/animations/responsive/animations-responsive-to-color-change.html [ Crash Pass ]
 crbug.com/591099 virtual/threaded/animations/responsive/interpolation/d-responsive.html [ Crash Pass ]
 crbug.com/591099 virtual/threaded/animations/responsive/interpolation/line-height-responsive.html [ Pass Timeout ]
+crbug.com/591099 virtual/threaded/animations/responsive/interpolation/svg-d-responsive.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/responsive/interpolation/svg-points-responsive.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/responsive/interpolation/svg-tableValues-responsive.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/responsive/interpolation/svg-transform-responsive.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/responsive/interpolation/svg-x-list-responsive.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/responsive/svg-responsive-to-timing-updates.html [ Crash Pass ]
 crbug.com/591099 virtual/threaded/animations/rotate-transform-equivalent.html [ Failure Timeout ]
 crbug.com/591099 virtual/threaded/animations/skew-notsequential-compositor.html [ Failure Timeout ]
 crbug.com/591099 virtual/threaded/animations/stability/animation-end-event-destroy-renderer.html [ Failure ]
@@ -21900,13 +22222,9 @@
 crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-xChannelSelector-interpolation.html [ Crash Pass ]
 crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-y-list-interpolation.html [ Crash Pass ]
 crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-z-interpolation.html [ Crash Pass ]
-crbug.com/591099 virtual/threaded/animations/responsive/interpolation/svg-d-responsive.html [ Crash Pass ]
-crbug.com/591099 virtual/threaded/animations/responsive/interpolation/svg-points-responsive.html [ Crash Pass ]
-crbug.com/591099 virtual/threaded/animations/responsive/interpolation/svg-tableValues-responsive.html [ Crash Pass ]
-crbug.com/591099 virtual/threaded/animations/responsive/interpolation/svg-transform-responsive.html [ Crash Pass ]
-crbug.com/591099 virtual/threaded/animations/responsive/interpolation/svg-x-list-responsive.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg/clear-svg-animation-effects.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg/css-animation-overrides-svg-presentation-attribute-animation.html [ Crash Pass ]
 crbug.com/591099 virtual/threaded/animations/svg/svg-presentation-attribute-animation.html [ Crash Pass ]
-crbug.com/591099 virtual/threaded/animations/responsive/svg-responsive-to-timing-updates.html [ Crash Pass ]
 crbug.com/591099 virtual/threaded/animations/timing/timing-model.html [ Pass Timeout ]
 crbug.com/591099 virtual/threaded/compositing/visibility/compositing-and-visibility-turned-off-together.html [ Failure ]
 crbug.com/591099 virtual/threaded/compositing/visibility/hidden-iframe.html [ Failure ]
@@ -21956,7 +22274,7 @@
 crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-js-line-level-profile.html [ Crash Pass ]
 crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-microtasks.html [ Crash Failure ]
 crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-open-function-call.html [ Failure ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-runtime-stats.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-runtime-stats.html [ Crash Failure Pass ]
 crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-script-id.html [ Crash Failure ]
 crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-script-tag-1.html [ Crash Failure ]
 crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-script-tag-2.html [ Crash Failure ]
diff --git a/third_party/WebKit/LayoutTests/NeverFixTests b/third_party/WebKit/LayoutTests/NeverFixTests
index e9406fde..f92cde6 100644
--- a/third_party/WebKit/LayoutTests/NeverFixTests
+++ b/third_party/WebKit/LayoutTests/NeverFixTests
@@ -824,7 +824,6 @@
 external/wpt/viewport/viewport-scale-manual.html [ WontFix ]
 external/wpt/viewport/viewport-scroll-event-manual.html [ WontFix ]
 external/wpt/web-share/share-cancel-manual.html [ WontFix ]
-external/wpt/web-share/share-empty-manual.html [ WontFix ]
 external/wpt/web-share/share-extra-argument-manual.html [ WontFix ]
 external/wpt/web-share/share-extra-field-manual.html [ WontFix ]
 external/wpt/web-share/share-non-string-manual.html [ WontFix ]
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
index 91fc5cf..92f98e3 100644
--- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
+++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
@@ -115,6 +115,30 @@
      {}
     ]
    ],
+   "clipboard-apis/async-write-dttext-read-dttext-manual.https.html": [
+    [
+     "/clipboard-apis/async-write-dttext-read-dttext-manual.https.html",
+     {}
+    ]
+   ],
+   "clipboard-apis/async-write-dttext-read-text-manual.https.html": [
+    [
+     "/clipboard-apis/async-write-dttext-read-text-manual.https.html",
+     {}
+    ]
+   ],
+   "clipboard-apis/async-write-text-read-dttext-manual.https.html": [
+    [
+     "/clipboard-apis/async-write-text-read-dttext-manual.https.html",
+     {}
+    ]
+   ],
+   "clipboard-apis/async-write-text-read-text-manual.https.html": [
+    [
+     "/clipboard-apis/async-write-text-read-text-manual.https.html",
+     {}
+    ]
+   ],
    "console/console-count-logging-manual.html": [
     [
      "/console/console-count-logging-manual.html",
@@ -4099,12 +4123,6 @@
      {}
     ]
    ],
-   "web-share/share-empty-manual.html": [
-    [
-     "/web-share/share-empty-manual.html",
-     {}
-    ]
-   ],
    "web-share/share-extra-argument-manual.html": [
     [
      "/web-share/share-extra-argument-manual.html",
@@ -4959,6 +4977,138 @@
      {}
     ]
    ],
+   "css-paint-api/geometry-background-image-001.html": [
+    [
+     "/css-paint-api/geometry-background-image-001.html",
+     [
+      [
+       "/css-paint-api/geometry-background-image-001-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/geometry-background-image-002.html": [
+    [
+     "/css-paint-api/geometry-background-image-002.html",
+     [
+      [
+       "/css-paint-api/geometry-background-image-002-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/geometry-background-image-003.html": [
+    [
+     "/css-paint-api/geometry-background-image-003.html",
+     [
+      [
+       "/css-paint-api/geometry-background-image-003-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/geometry-background-image-tiled-001.html": [
+    [
+     "/css-paint-api/geometry-background-image-tiled-001.html",
+     [
+      [
+       "/css-paint-api/geometry-background-image-tiled-001-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/geometry-background-image-tiled-002.html": [
+    [
+     "/css-paint-api/geometry-background-image-tiled-002.html",
+     [
+      [
+       "/css-paint-api/geometry-background-image-tiled-002-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/geometry-background-image-tiled-003.html": [
+    [
+     "/css-paint-api/geometry-background-image-tiled-003.html",
+     [
+      [
+       "/css-paint-api/geometry-background-image-tiled-003-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/geometry-border-image-001.html": [
+    [
+     "/css-paint-api/geometry-border-image-001.html",
+     [
+      [
+       "/css-paint-api/geometry-border-image-001-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/geometry-border-image-002.html": [
+    [
+     "/css-paint-api/geometry-border-image-002.html",
+     [
+      [
+       "/css-paint-api/geometry-border-image-002-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/geometry-border-image-003.html": [
+    [
+     "/css-paint-api/geometry-border-image-003.html",
+     [
+      [
+       "/css-paint-api/geometry-border-image-003-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/geometry-border-image-004.html": [
+    [
+     "/css-paint-api/geometry-border-image-004.html",
+     [
+      [
+       "/css-paint-api/geometry-border-image-004-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/geometry-border-image-005.html": [
+    [
+     "/css-paint-api/geometry-border-image-005.html",
+     [
+      [
+       "/css-paint-api/geometry-border-image-005-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css-paint-api/invalid-image-constructor-error.html": [
     [
      "/css-paint-api/invalid-image-constructor-error.html",
@@ -5127,6 +5277,270 @@
      {}
     ]
    ],
+   "css-paint-api/paint2d-zoom.html": [
+    [
+     "/css-paint-api/paint2d-zoom.html",
+     [
+      [
+       "/css-paint-api/paint2d-zoom-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/parse-input-arguments-001.html": [
+    [
+     "/css-paint-api/parse-input-arguments-001.html",
+     [
+      [
+       "/css-paint-api/parse-input-arguments-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/parse-input-arguments-002.html": [
+    [
+     "/css-paint-api/parse-input-arguments-002.html",
+     [
+      [
+       "/css-paint-api/parse-input-arguments-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/parse-input-arguments-003.html": [
+    [
+     "/css-paint-api/parse-input-arguments-003.html",
+     [
+      [
+       "/css-paint-api/parse-input-arguments-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/parse-input-arguments-004.html": [
+    [
+     "/css-paint-api/parse-input-arguments-004.html",
+     [
+      [
+       "/css-paint-api/parse-input-arguments-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/parse-input-arguments-005.html": [
+    [
+     "/css-paint-api/parse-input-arguments-005.html",
+     [
+      [
+       "/css-paint-api/parse-input-arguments-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/parse-input-arguments-006.html": [
+    [
+     "/css-paint-api/parse-input-arguments-006.html",
+     [
+      [
+       "/css-paint-api/parse-input-arguments-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/parse-input-arguments-007.html": [
+    [
+     "/css-paint-api/parse-input-arguments-007.html",
+     [
+      [
+       "/css-paint-api/parse-input-arguments-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/parse-input-arguments-008.html": [
+    [
+     "/css-paint-api/parse-input-arguments-008.html",
+     [
+      [
+       "/css-paint-api/parse-input-arguments-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/parse-input-arguments-009.html": [
+    [
+     "/css-paint-api/parse-input-arguments-009.html",
+     [
+      [
+       "/css-paint-api/parse-input-arguments-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/parse-input-arguments-010.html": [
+    [
+     "/css-paint-api/parse-input-arguments-010.html",
+     [
+      [
+       "/css-paint-api/parse-input-arguments-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/parse-input-arguments-011.html": [
+    [
+     "/css-paint-api/parse-input-arguments-011.html",
+     [
+      [
+       "/css-paint-api/parse-input-arguments-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/parse-input-arguments-012.html": [
+    [
+     "/css-paint-api/parse-input-arguments-012.html",
+     [
+      [
+       "/css-paint-api/parse-input-arguments-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/parse-input-arguments-013.html": [
+    [
+     "/css-paint-api/parse-input-arguments-013.html",
+     [
+      [
+       "/css-paint-api/parse-input-arguments-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/parse-input-arguments-014.html": [
+    [
+     "/css-paint-api/parse-input-arguments-014.html",
+     [
+      [
+       "/css-paint-api/parse-input-arguments-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/parse-input-arguments-015.html": [
+    [
+     "/css-paint-api/parse-input-arguments-015.html",
+     [
+      [
+       "/css-paint-api/parse-input-arguments-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/parse-input-arguments-016.html": [
+    [
+     "/css-paint-api/parse-input-arguments-016.html",
+     [
+      [
+       "/css-paint-api/parse-input-arguments-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/parse-input-arguments-017.html": [
+    [
+     "/css-paint-api/parse-input-arguments-017.html",
+     [
+      [
+       "/css-paint-api/parse-input-arguments-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/registered-properties-in-custom-paint.html": [
+    [
+     "/css-paint-api/registered-properties-in-custom-paint.html",
+     [
+      [
+       "/css-paint-api/parse-input-arguments-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/style-background-image.html": [
+    [
+     "/css-paint-api/style-background-image.html",
+     [
+      [
+       "/css-paint-api/style-background-image-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/style-before-pseudo.html": [
+    [
+     "/css-paint-api/style-before-pseudo.html",
+     [
+      [
+       "/css-paint-api/style-before-pseudo-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css-paint-api/style-first-letter-pseudo.html": [
+    [
+     "/css-paint-api/style-first-letter-pseudo.html",
+     [
+      [
+       "/css-paint-api/style-first-letter-pseudo-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css-paint-api/valid-image-after-load.html": [
     [
      "/css-paint-api/valid-image-after-load.html",
@@ -33371,6 +33785,18 @@
      {}
     ]
    ],
+   "css/css-position-3/position-sticky-grid.html": [
+    [
+     "/css/css-position-3/position-sticky-grid.html",
+     [
+      [
+       "/css/css-position-3/position-sticky-grid-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/css-position-3/position-sticky-left.html": [
     [
      "/css/css-position-3/position-sticky-left.html",
@@ -65933,21 +66359,6 @@
      {}
     ]
    ],
-   "WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-expected.txt": [
-    [
-     {}
-    ]
-   ],
-   "WebIDL/ecmascript-binding/es-exceptions/constructor-object-expected.txt": [
-    [
-     {}
-    ]
-   ],
-   "WebIDL/ecmascript-binding/es-exceptions/constructor-object.js": [
-    [
-     {}
-    ]
-   ],
    "WebIDL/ecmascript-binding/es-exceptions/exceptions-expected.txt": [
     [
      {}
@@ -65958,6 +66369,11 @@
      {}
     ]
    ],
+   "WebIDL/ecmascript-binding/legacy-platform-object-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "WebIDL/ecmascript-binding/sequence-conversion-expected.txt": [
     [
      {}
@@ -68633,6 +69049,61 @@
      {}
     ]
    ],
+   "css-paint-api/geometry-background-image-001-ref.html": [
+    [
+     {}
+    ]
+   ],
+   "css-paint-api/geometry-background-image-002-ref.html": [
+    [
+     {}
+    ]
+   ],
+   "css-paint-api/geometry-background-image-003-ref.html": [
+    [
+     {}
+    ]
+   ],
+   "css-paint-api/geometry-background-image-tiled-001-ref.html": [
+    [
+     {}
+    ]
+   ],
+   "css-paint-api/geometry-background-image-tiled-002-ref.html": [
+    [
+     {}
+    ]
+   ],
+   "css-paint-api/geometry-background-image-tiled-003-ref.html": [
+    [
+     {}
+    ]
+   ],
+   "css-paint-api/geometry-border-image-001-ref.html": [
+    [
+     {}
+    ]
+   ],
+   "css-paint-api/geometry-border-image-002-ref.html": [
+    [
+     {}
+    ]
+   ],
+   "css-paint-api/geometry-border-image-003-ref.html": [
+    [
+     {}
+    ]
+   ],
+   "css-paint-api/geometry-border-image-004-ref.html": [
+    [
+     {}
+    ]
+   ],
+   "css-paint-api/geometry-border-image-005-ref.html": [
+    [
+     {}
+    ]
+   ],
    "css-paint-api/invalid-image-constructor-error-ref.html": [
     [
      {}
@@ -68703,6 +69174,31 @@
      {}
     ]
    ],
+   "css-paint-api/paint2d-zoom-ref.html": [
+    [
+     {}
+    ]
+   ],
+   "css-paint-api/parse-input-arguments-ref.html": [
+    [
+     {}
+    ]
+   ],
+   "css-paint-api/style-background-image-ref.html": [
+    [
+     {}
+    ]
+   ],
+   "css-paint-api/style-before-pseudo-ref.html": [
+    [
+     {}
+    ]
+   ],
+   "css-paint-api/style-first-letter-pseudo-ref.html": [
+    [
+     {}
+    ]
+   ],
    "css-paint-api/valid-image-after-load-ref.html": [
     [
      {}
@@ -74363,6 +74859,11 @@
      {}
     ]
    ],
+   "css/css-position-3/position-sticky-grid-ref.html": [
+    [
+     {}
+    ]
+   ],
    "css/css-position-3/position-sticky-left-ref.html": [
     [
      {}
@@ -81943,11 +82444,6 @@
      {}
     ]
    ],
-   "css/geometry-1/historical-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "css/geometry-1/interfaces-expected.txt": [
     [
      {}
@@ -83228,11 +83724,6 @@
      {}
     ]
    ],
-   "cssom-view/cssom-getBoundingClientRect-002-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "cssom-view/cssom-getClientRects-002-expected.txt": [
     [
      {}
@@ -94993,16 +95484,6 @@
      {}
     ]
    ],
-   "html/semantics/embedded-content/media-elements/interfaces/TextTrackCueList/getter-expected.txt": [
-    [
-     {}
-    ]
-   ],
-   "html/semantics/embedded-content/media-elements/interfaces/TextTrackList/getter-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "html/semantics/embedded-content/media-elements/interfaces/TrackEvent/createEvent-expected.txt": [
     [
      {}
@@ -96573,11 +97054,26 @@
      {}
     ]
    ],
+   "html/semantics/scripting-1/the-script-element/resources/load-error-events-helpers.js": [
+    [
+     {}
+    ]
+   ],
+   "html/semantics/scripting-1/the-script-element/resources/load-error-events.py": [
+    [
+     {}
+    ]
+   ],
    "html/semantics/scripting-1/the-script-element/resources/set-script-executed.js": [
     [
      {}
     ]
    ],
+   "html/semantics/scripting-1/the-script-element/resources/slow.py": [
+    [
+     {}
+    ]
+   ],
    "html/semantics/scripting-1/the-script-element/script-charset-01-expected.txt": [
     [
      {}
@@ -98318,6 +98814,11 @@
      {}
     ]
    ],
+   "interfaces/clipboard.idl": [
+    [
+     {}
+    ]
+   ],
    "interfaces/cssom.idl": [
     [
      {}
@@ -100153,6 +100654,11 @@
      {}
     ]
    ],
+   "page-visibility/resources/iframe-with-subframes.html": [
+    [
+     {}
+    ]
+   ],
    "page-visibility/resources/pagevistestharness.js": [
     [
      {}
@@ -100198,11 +100704,6 @@
      {}
     ]
    ],
-   "payment-request/payment-request-canmakepayment-method.https.http": [
-    [
-     {}
-    ]
-   ],
    "payment-request/payment-request-response-id.html": [
     [
      {}
@@ -100238,6 +100739,16 @@
      {}
     ]
    ],
+   "performance-timeline/resources/worker-with-performance-observer.js": [
+    [
+     {}
+    ]
+   ],
+   "performance-timeline/worker-with-performance-observer-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "pointerevents/OWNERS": [
     [
      {}
@@ -117077,27 +117588,43 @@
      {}
     ]
    ],
-   "WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.html": [
+   "WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.any.js": [
     [
-     "/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.html",
+     "/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.any.html",
+     {}
+    ],
+    [
+     "/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.any.worker.html",
      {}
     ]
    ],
-   "WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor.html": [
+   "WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-and-prototype.any.js": [
     [
-     "/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor.html",
+     "/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-and-prototype.any.html",
+     {}
+    ],
+    [
+     "/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-and-prototype.any.worker.html",
      {}
     ]
    ],
-   "WebIDL/ecmascript-binding/es-exceptions/constructor-object.html": [
+   "WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.js": [
     [
-     "/WebIDL/ecmascript-binding/es-exceptions/constructor-object.html",
+     "/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.html",
+     {}
+    ],
+    [
+     "/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.worker.html",
      {}
     ]
    ],
-   "WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.js": [
+   "WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.js": [
     [
-     "/WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.html",
+     "/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.html",
+     {}
+    ],
+    [
+     "/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.worker.html",
      {}
     ]
    ],
@@ -117131,6 +117658,12 @@
      {}
     ]
    ],
+   "WebIDL/ecmascript-binding/legacy-platform-object.html": [
+    [
+     "/WebIDL/ecmascript-binding/legacy-platform-object.html",
+     {}
+    ]
+   ],
    "WebIDL/ecmascript-binding/put-forwards.html": [
     [
      "/WebIDL/ecmascript-binding/put-forwards.html",
@@ -118629,9 +119162,27 @@
      {}
     ]
    ],
-   "clear-site-data/navigation.html": [
+   "clear-site-data/navigation-insecure.html": [
     [
-     "/clear-site-data/navigation.html",
+     "/clear-site-data/navigation-insecure.html",
+     {}
+    ]
+   ],
+   "clear-site-data/navigation.https.html": [
+    [
+     "/clear-site-data/navigation.https.html",
+     {}
+    ]
+   ],
+   "clipboard-apis/async-interfaces.https.html": [
+    [
+     "/clipboard-apis/async-interfaces.https.html",
+     {}
+    ]
+   ],
+   "clipboard-apis/async-navigator-clipboard-basics.https.html": [
+    [
+     "/clipboard-apis/async-navigator-clipboard-basics.https.html",
      {}
     ]
    ],
@@ -124729,6 +125280,16 @@
      {}
     ]
    ],
+   "dom/events/EventTarget-constructible.any.js": [
+    [
+     "/dom/events/EventTarget-constructible.any.html",
+     {}
+    ],
+    [
+     "/dom/events/EventTarget-constructible.any.worker.html",
+     {}
+    ]
+   ],
    "dom/events/EventTarget-dispatchEvent-returnvalue.html": [
     [
      "/dom/events/EventTarget-dispatchEvent-returnvalue.html",
@@ -129525,6 +130086,12 @@
      {}
     ]
    ],
+   "hr-time/timing-attack.html": [
+    [
+     "/hr-time/timing-attack.html",
+     {}
+    ]
+   ],
    "hr-time/window-worker-time-origin.html": [
     [
      "/hr-time/window-worker-time-origin.html",
@@ -135019,9 +135586,21 @@
      {}
     ]
    ],
-   "html/semantics/scripting-1/the-script-element/load-event.html": [
+   "html/semantics/scripting-1/the-script-element/load-error-events-1.html": [
     [
-     "/html/semantics/scripting-1/the-script-element/load-event.html",
+     "/html/semantics/scripting-1/the-script-element/load-error-events-1.html",
+     {}
+    ]
+   ],
+   "html/semantics/scripting-1/the-script-element/load-error-events-2.html": [
+    [
+     "/html/semantics/scripting-1/the-script-element/load-error-events-2.html",
+     {}
+    ]
+   ],
+   "html/semantics/scripting-1/the-script-element/load-error-events-3.html": [
+    [
+     "/html/semantics/scripting-1/the-script-element/load-error-events-3.html",
      {}
     ]
    ],
@@ -135171,6 +135750,18 @@
      {}
     ]
    ],
+   "html/semantics/scripting-1/the-script-element/module/load-error-events-inline.html": [
+    [
+     "/html/semantics/scripting-1/the-script-element/module/load-error-events-inline.html",
+     {}
+    ]
+   ],
+   "html/semantics/scripting-1/the-script-element/module/load-error-events.html": [
+    [
+     "/html/semantics/scripting-1/the-script-element/module/load-error-events.html",
+     {}
+    ]
+   ],
    "html/semantics/scripting-1/the-script-element/module/module-vs-script-1.html": [
     [
      "/html/semantics/scripting-1/the-script-element/module/module-vs-script-1.html",
@@ -149551,6 +150142,12 @@
      {}
     ]
    ],
+   "page-visibility/iframe-unload.html": [
+    [
+     "/page-visibility/iframe-unload.html",
+     {}
+    ]
+   ],
    "page-visibility/prerender_call.html": [
     [
      "/page-visibility/prerender_call.html",
@@ -149695,6 +150292,12 @@
      {}
     ]
    ],
+   "payment-request/payment-request-canmakepayment-method.https.html": [
+    [
+     "/payment-request/payment-request-canmakepayment-method.https.html",
+     {}
+    ]
+   ],
    "payment-request/payment-request-constructor-crash.https.html": [
     [
      "/payment-request/payment-request-constructor-crash.https.html",
@@ -149831,6 +150434,12 @@
      {}
     ]
    ],
+   "performance-timeline/worker-with-performance-observer.html": [
+    [
+     "/performance-timeline/worker-with-performance-observer.html",
+     {}
+    ]
+   ],
    "pointerevents/extension/idlharness.html": [
     [
      "/pointerevents/extension/idlharness.html",
@@ -162405,6 +163014,12 @@
      {}
     ]
    ],
+   "web-share/share-empty.https.html": [
+    [
+     "/web-share/share-empty.https.html",
+     {}
+    ]
+   ],
    "web-share/share-securecontext.http.html": [
     [
      "/web-share/share-securecontext.http.html",
@@ -163149,6 +163764,12 @@
      {}
     ]
    ],
+   "webrtc/RTCConfiguration-bundlePolicy.html": [
+    [
+     "/webrtc/RTCConfiguration-bundlePolicy.html",
+     {}
+    ]
+   ],
    "webrtc/RTCConfiguration-iceCandidatePoolSize.html": [
     [
      "/webrtc/RTCConfiguration-iceCandidatePoolSize.html",
@@ -163245,6 +163866,12 @@
      {}
     ]
    ],
+   "webrtc/RTCPeerConnection-getDefaultIceServers.html": [
+    [
+     "/webrtc/RTCPeerConnection-getDefaultIceServers.html",
+     {}
+    ]
+   ],
    "webrtc/RTCPeerConnection-getTransceivers.html": [
     [
      "/webrtc/RTCPeerConnection-getTransceivers.html",
@@ -163311,6 +163938,12 @@
      {}
     ]
    ],
+   "webrtc/RTCRtpTransceiver-setDirection.html": [
+    [
+     "/webrtc/RTCRtpTransceiver-setDirection.html",
+     {}
+    ]
+   ],
    "webrtc/RTCSctpTransport-constructor.html": [
     [
      "/webrtc/RTCSctpTransport-constructor.html",
@@ -177746,32 +178379,20 @@
    "167c7c1f53ae2bf457f6b3f917f0ef988c585c7c",
    "testharness"
   ],
-  "WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.html": [
-   "9ae0ceb48cac77c8470b114576ab17c2e7c1a88c",
+  "WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.any.js": [
+   "34432979f039c4e1ba4eb90d4f2acc96d1d441d8",
    "testharness"
   ],
-  "WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-expected.txt": [
-   "911eb6c33539be782926705760d10c58ea540f16",
-   "support"
-  ],
-  "WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor.html": [
-   "24f79517a695477aa4af4b1005ff24977fe44b72",
+  "WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-and-prototype.any.js": [
+   "7fc6412ffa2a2586e5ea2dca7f5cdafba38c7585",
    "testharness"
   ],
-  "WebIDL/ecmascript-binding/es-exceptions/constructor-object-expected.txt": [
-   "7f0da6ca4e04455ec18cccdbb75520f19b74aa15",
-   "support"
-  ],
-  "WebIDL/ecmascript-binding/es-exceptions/constructor-object.html": [
-   "480d5c2f21d8f18e5231e8293cf44d1050b9106a",
+  "WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.js": [
+   "d297d4c52ecf1667cb79ddb076260f9005ee5df4",
    "testharness"
   ],
-  "WebIDL/ecmascript-binding/es-exceptions/constructor-object.js": [
-   "3d637243f719e2df7ecc9af4e44522e746f38ab7",
-   "support"
-  ],
-  "WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.js": [
-   "b986594f41fc9df68ee2d3a3aaccae51bf7dd3e9",
+  "WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.js": [
+   "f20cbaff1efb774748241b90778a0964f5671fee",
    "testharness"
   ],
   "WebIDL/ecmascript-binding/es-exceptions/exceptions-expected.txt": [
@@ -177779,7 +178400,7 @@
    "support"
   ],
   "WebIDL/ecmascript-binding/es-exceptions/exceptions.html": [
-   "15537c428eeb22a3addb13497ff02181666a1de1",
+   "fc4d6cf93ff64192ee325d7309ac267cf8ff5d6c",
    "testharness"
   ],
   "WebIDL/ecmascript-binding/has-instance.html": [
@@ -177802,6 +178423,14 @@
    "4eac8c853a0627577d2bd96ed76c45bd187a5734",
    "testharness"
   ],
+  "WebIDL/ecmascript-binding/legacy-platform-object-expected.txt": [
+   "6590f7ecb08504332e418020ebd7543630c72a1e",
+   "support"
+  ],
+  "WebIDL/ecmascript-binding/legacy-platform-object.html": [
+   "952b388d06c804b0a145fba585aa81dc533ff0c2",
+   "testharness"
+  ],
   "WebIDL/ecmascript-binding/put-forwards.html": [
    "95fcfc28dae32ab9aadf21d2512a519d6a9fd5ab",
    "testharness"
@@ -179354,18 +179983,46 @@
    "5d4d8278b1f24798765974c35777f70fcbfc9cfa",
    "testharness"
   ],
-  "clear-site-data/navigation.html": [
-   "daf340429ca71997c7d9c6021354522f0285c4d1",
+  "clear-site-data/navigation-insecure.html": [
+   "4e1b422168f236cff16fd2a03b8baad179be1836",
+   "testharness"
+  ],
+  "clear-site-data/navigation.https.html": [
+   "d984555fcc5e26f7647c816a5b37bd9370d1dcfb",
    "testharness"
   ],
   "clear-site-data/support/echo-clear-site-data.py": [
-   "d8768caed378b9a3eadeb7a566bcd099f6c2e9de",
+   "87087d99371d829cd627224379d2970602a434aa",
    "support"
   ],
   "clear-site-data/support/test_utils.js": [
-   "6980ed5592440f13bccbd83afdf6c6aa0b55e2f2",
+   "c48c8340e1360e9203a8b5f865d0816298ec71ea",
    "support"
   ],
+  "clipboard-apis/async-interfaces.https.html": [
+   "68a1ea255a72e54e6a2147797d4213914a79aece",
+   "testharness"
+  ],
+  "clipboard-apis/async-navigator-clipboard-basics.https.html": [
+   "59f25a9968d47079857989146e26562c3784be34",
+   "testharness"
+  ],
+  "clipboard-apis/async-write-dttext-read-dttext-manual.https.html": [
+   "7b2a4d7f1e1e918f8a96694f6619875b746d0255",
+   "manual"
+  ],
+  "clipboard-apis/async-write-dttext-read-text-manual.https.html": [
+   "d0fbfc54f1d1a68aaf5a2b96e25101dfe9aec883",
+   "manual"
+  ],
+  "clipboard-apis/async-write-text-read-dttext-manual.https.html": [
+   "4b0df740f9f8fa6f3831b1255dde491b83e3ef6c",
+   "manual"
+  ],
+  "clipboard-apis/async-write-text-read-text-manual.https.html": [
+   "e69933ca4cdc42105d469b7ffb105aa60a8e0875",
+   "manual"
+  ],
   "common/PrefixedLocalStorage.js": [
    "0516e849d40a16e82e1bb800372df28ed802aa8d",
    "support"
@@ -182430,6 +183087,94 @@
    "03aff62fc21832b44d9de15805232d87d0089ed3",
    "reftest"
   ],
+  "css-paint-api/geometry-background-image-001-ref.html": [
+   "bca138ca3ce5b6dee10f935fd2ff9756d18b12ef",
+   "support"
+  ],
+  "css-paint-api/geometry-background-image-001.html": [
+   "a1f6d2148bfcdb68e4ca437b396b0ccbada101a9",
+   "reftest"
+  ],
+  "css-paint-api/geometry-background-image-002-ref.html": [
+   "4d33168e6298c1ed7d44ff431791615cdaf9038f",
+   "support"
+  ],
+  "css-paint-api/geometry-background-image-002.html": [
+   "f48a940cfc7b3654ee92b655330ae30af5315e17",
+   "reftest"
+  ],
+  "css-paint-api/geometry-background-image-003-ref.html": [
+   "e5b4098a1f1b9aab0a27c7bdae0532db4dc26a92",
+   "support"
+  ],
+  "css-paint-api/geometry-background-image-003.html": [
+   "98eac1f4d92084ebee4c26d87706bc394d8d5a79",
+   "reftest"
+  ],
+  "css-paint-api/geometry-background-image-tiled-001-ref.html": [
+   "df994fa58244f5e8d4b4aac7f0ad335fe8570dcc",
+   "support"
+  ],
+  "css-paint-api/geometry-background-image-tiled-001.html": [
+   "f89e6c4f164c10a64037a3feefd915d760a99765",
+   "reftest"
+  ],
+  "css-paint-api/geometry-background-image-tiled-002-ref.html": [
+   "c5363f4f7843ff8025ae5457524c0c9f4aac144c",
+   "support"
+  ],
+  "css-paint-api/geometry-background-image-tiled-002.html": [
+   "051788b53366cffcc10debdf2d678d50bffd1f54",
+   "reftest"
+  ],
+  "css-paint-api/geometry-background-image-tiled-003-ref.html": [
+   "d4f9428be3b8f9003eb9373b3eb87ebed0c55c15",
+   "support"
+  ],
+  "css-paint-api/geometry-background-image-tiled-003.html": [
+   "29141ae2c9c87237ed3406dd43c6b3a7a1a5aa36",
+   "reftest"
+  ],
+  "css-paint-api/geometry-border-image-001-ref.html": [
+   "81026e756ea8e3be653e176c09f1762507915cb8",
+   "support"
+  ],
+  "css-paint-api/geometry-border-image-001.html": [
+   "d8f948af1254c810496739e4c7cc570ba96cf64f",
+   "reftest"
+  ],
+  "css-paint-api/geometry-border-image-002-ref.html": [
+   "076c1f3e3b5cfd3a434e94f33872f5f598a7225b",
+   "support"
+  ],
+  "css-paint-api/geometry-border-image-002.html": [
+   "57b518eb310db31c40f0db37637b0f8199ee9734",
+   "reftest"
+  ],
+  "css-paint-api/geometry-border-image-003-ref.html": [
+   "141bf94dcd935420b95ee4da52139bf51318196d",
+   "support"
+  ],
+  "css-paint-api/geometry-border-image-003.html": [
+   "9d01df8817d9e5beb27d3439789cbe914c418b2c",
+   "reftest"
+  ],
+  "css-paint-api/geometry-border-image-004-ref.html": [
+   "d730b44bd1020305b70da095a15f9a4f7e9f262a",
+   "support"
+  ],
+  "css-paint-api/geometry-border-image-004.html": [
+   "368a9d855ffc46457e6c54cddfbc934e92096ee0",
+   "reftest"
+  ],
+  "css-paint-api/geometry-border-image-005-ref.html": [
+   "b401ed261976a4acd2408a84fda9d63d27d1c3a4",
+   "support"
+  ],
+  "css-paint-api/geometry-border-image-005.html": [
+   "a2d9214ac53508c5e551547be9beb953be7ab141",
+   "reftest"
+  ],
   "css-paint-api/invalid-image-constructor-error-ref.html": [
    "b0c34ee1480fe1108fe8dc53f2bbb2f3ffa1c408",
    "support"
@@ -182542,6 +183287,114 @@
    "f840916bab6d10cff1b08d1cfaecee97699d80cb",
    "reftest"
   ],
+  "css-paint-api/paint2d-zoom-ref.html": [
+   "37354f2479a070eadd2a571ff6207953cad3597d",
+   "support"
+  ],
+  "css-paint-api/paint2d-zoom.html": [
+   "4d790b6ab70a3a80dc11a08677ea2a1f1cfbadf6",
+   "reftest"
+  ],
+  "css-paint-api/parse-input-arguments-001.html": [
+   "0ba1a9978d295825784a2909447e565701e6fc09",
+   "reftest"
+  ],
+  "css-paint-api/parse-input-arguments-002.html": [
+   "d35b4e39d8b0f54935571ee62fe7255e93c917dd",
+   "reftest"
+  ],
+  "css-paint-api/parse-input-arguments-003.html": [
+   "f6c8cb6feba2b14349bc3fa3170b278e698df526",
+   "reftest"
+  ],
+  "css-paint-api/parse-input-arguments-004.html": [
+   "1dd64759c041d9633ce04add066f4e1573fd05e5",
+   "reftest"
+  ],
+  "css-paint-api/parse-input-arguments-005.html": [
+   "25d32d33e5de6d289d0e8c776876cb66f03e7c2e",
+   "reftest"
+  ],
+  "css-paint-api/parse-input-arguments-006.html": [
+   "effa515567b0212403d83588c335d8fc72c056f6",
+   "reftest"
+  ],
+  "css-paint-api/parse-input-arguments-007.html": [
+   "f2f837e7c82462f17d9ebb1a8ab5346e5b8c945c",
+   "reftest"
+  ],
+  "css-paint-api/parse-input-arguments-008.html": [
+   "60034209a8984ac0be807494fc4373329d3792eb",
+   "reftest"
+  ],
+  "css-paint-api/parse-input-arguments-009.html": [
+   "d57e2370218d385a02e2021219869b5dec0e45c4",
+   "reftest"
+  ],
+  "css-paint-api/parse-input-arguments-010.html": [
+   "9d4ef380f3596a73ea7816d13b3913b541ec05b9",
+   "reftest"
+  ],
+  "css-paint-api/parse-input-arguments-011.html": [
+   "15edc8fc44d339514911566fe7cf07ec899cf04a",
+   "reftest"
+  ],
+  "css-paint-api/parse-input-arguments-012.html": [
+   "0cc064f143a0b1bed6b6e3b79f9a95754eb60ea3",
+   "reftest"
+  ],
+  "css-paint-api/parse-input-arguments-013.html": [
+   "e4a99687b156723308ed27a9e863754cb6dcdbd2",
+   "reftest"
+  ],
+  "css-paint-api/parse-input-arguments-014.html": [
+   "c10d44a53a00e6a9745d6ea1c359298723a0aee1",
+   "reftest"
+  ],
+  "css-paint-api/parse-input-arguments-015.html": [
+   "a78c728b67af31e47c8d46e60e33ba437769a020",
+   "reftest"
+  ],
+  "css-paint-api/parse-input-arguments-016.html": [
+   "e06d4a98a350f1cd2ba3bacf132f1ada83f750c1",
+   "reftest"
+  ],
+  "css-paint-api/parse-input-arguments-017.html": [
+   "6a16052f0435cc615447b548c598a6da5ce7d49b",
+   "reftest"
+  ],
+  "css-paint-api/parse-input-arguments-ref.html": [
+   "6133bd65ef569456f58f1e501d81e088256bdc0a",
+   "support"
+  ],
+  "css-paint-api/registered-properties-in-custom-paint.html": [
+   "3855c8c28ea3a24bade81080f3f288ef75243dce",
+   "reftest"
+  ],
+  "css-paint-api/style-background-image-ref.html": [
+   "0985e20363c8aac715c534ad59f1209889244fb0",
+   "support"
+  ],
+  "css-paint-api/style-background-image.html": [
+   "a3202db04922cc2527436fa319ea9e8432eecdcd",
+   "reftest"
+  ],
+  "css-paint-api/style-before-pseudo-ref.html": [
+   "6dcbe78ab89343178e18e3e92744b25759ec8241",
+   "support"
+  ],
+  "css-paint-api/style-before-pseudo.html": [
+   "7808e4e86a0556202a0e2ea5574d60c94bf2c537",
+   "reftest"
+  ],
+  "css-paint-api/style-first-letter-pseudo-ref.html": [
+   "c6a94e5bafa098b8f4023312db97abebe992abc3",
+   "support"
+  ],
+  "css-paint-api/style-first-letter-pseudo.html": [
+   "034cc6ebdf18ea4d346a2a363be69eb8added8e7",
+   "reftest"
+  ],
   "css-paint-api/valid-image-after-load-ref.html": [
    "b0c34ee1480fe1108fe8dc53f2bbb2f3ffa1c408",
    "support"
@@ -200182,6 +201035,14 @@
    "5b9a1a29084f46228749c1b2b1a664be3ce02c43",
    "testharness"
   ],
+  "css/css-position-3/position-sticky-grid-ref.html": [
+   "9748c25d3db9b5ec2753ff53ceb0b82db9453cdc",
+   "support"
+  ],
+  "css/css-position-3/position-sticky-grid.html": [
+   "a06a40f39b4a748c111dc01281261c5451204f95",
+   "reftest"
+  ],
   "css/css-position-3/position-sticky-left-ref.html": [
    "9de7a8ba6019395d729b32e514cc3bd9fee25d2b",
    "support"
@@ -215130,10 +215991,6 @@
    "35d9a1d1a7f655b55d94d0b409e9562a3fd08db5",
    "testharness"
   ],
-  "css/geometry-1/historical-expected.txt": [
-   "8511b6d1ffa140cd38cd68cd756c3d7b5e9afda5",
-   "support"
-  ],
   "css/geometry-1/historical.html": [
    "f3462b981784755425a82ba050850ef8d3d36976",
    "testharness"
@@ -217822,10 +218679,6 @@
    "7118495560adadebcca98e6add47a74669f87788",
    "testharness"
   ],
-  "cssom-view/cssom-getBoundingClientRect-002-expected.txt": [
-   "3a77f2a2a04d37ae64ca7c4fb1a47534faa8bdee",
-   "support"
-  ],
   "cssom-view/cssom-getBoundingClientRect-002.html": [
    "8dfaa313b4abad30281d07ce22ac06a61754cc06",
    "testharness"
@@ -218847,7 +219700,7 @@
    "testharness"
   ],
   "dom/collections/HTMLCollection-supported-property-indices-expected.txt": [
-   "f13683da962c681b75b4d33fee384ab7580a0846",
+   "4fd8dc6c2e84f32bb94460a4e38b9854262ea66b",
    "support"
   ],
   "dom/collections/HTMLCollection-supported-property-indices.html": [
@@ -219050,6 +219903,10 @@
    "85dea0178b16b5c3e8ddbfa9a8b4bd8424bc0a3d",
    "testharness"
   ],
+  "dom/events/EventTarget-constructible.any.js": [
+   "cd6977c89454651d094f8679c71b5ba512dd687f",
+   "testharness"
+  ],
   "dom/events/EventTarget-dispatchEvent-returnvalue.html": [
    "70fedeb118930fdc57292ce5f2bfe621f63c2563",
    "testharness"
@@ -219075,7 +219932,7 @@
    "testharness"
   ],
   "dom/interfaces.html": [
-   "f8eb7f5fcfdc9ca4a500d5e43855a24a169c81cf",
+   "aae8f328bc52cbb17f47f78ace6d20c25a9c3acc",
    "testharness"
   ],
   "dom/lists/DOMTokenList-Iterable.html": [
@@ -219563,7 +220420,7 @@
    "testharness"
   ],
   "dom/nodes/Document-getElementsByTagName-expected.txt": [
-   "a7e42a7152761f5974f193d2f390822cd0fc1838",
+   "e184b2d38e6ee7b78316115879b057b3db515117",
    "support"
   ],
   "dom/nodes/Document-getElementsByTagName-xhtml.xhtml": [
@@ -219723,7 +220580,7 @@
    "testharness"
   ],
   "dom/nodes/Element-getElementsByTagName-expected.txt": [
-   "838fa4636275a4656766c3c68f73457c39c34d4b",
+   "96af851083113bfd7dc2267dd9c4c99377fe746b",
    "support"
   ],
   "dom/nodes/Element-getElementsByTagName.html": [
@@ -224203,7 +225060,7 @@
    "testharness"
   ],
   "hr-time/idlharness.html": [
-   "b56993b32650d40226e08beee147bc28c76cfa22",
+   "2f10557869a4841ec9d826906d542109f606df43",
    "testharness"
   ],
   "hr-time/monotonic-clock.any.js": [
@@ -224218,6 +225075,10 @@
    "289c39cd0c74f3ca28fe5087b75ef01135396594",
    "testharness"
   ],
+  "hr-time/timing-attack.html": [
+   "1d3d88e71fb886374b50c6dc2c1141a80c8c0a06",
+   "testharness"
+  ],
   "hr-time/window-worker-time-origin.html": [
    "556079c9d81c55df55c69738384991d31cad2c77",
    "testharness"
@@ -226555,11 +227416,11 @@
    "testharness"
   ],
   "html/browsers/the-window-object/window-indexed-properties-expected.txt": [
-   "993d4ee44994a8a0d06d354abe3aa596946dd72a",
+   "56b31c55fc865b08b89c82207990ea00e1b45240",
    "support"
   ],
   "html/browsers/the-window-object/window-indexed-properties-strict-expected.txt": [
-   "624baff00a9efae0597ae657ed81dfd2403248d4",
+   "afb98a47953d8fec2b1fe4e11647cd826192ec9a",
    "support"
   ],
   "html/browsers/the-window-object/window-indexed-properties-strict.html": [
@@ -228663,7 +229524,7 @@
    "support"
   ],
   "html/dom/interfaces-expected.txt": [
-   "f3a223067481ba42ffbbf26aa314da421b787ab5",
+   "f49e7e627e4802214f110a1a838b17385a8198b2",
    "support"
   ],
   "html/dom/interfaces.html": [
@@ -234386,10 +235247,6 @@
    "075014da26e3a5571feb7af16656f83aa0d5df1f",
    "testharness"
   ],
-  "html/semantics/embedded-content/media-elements/interfaces/TextTrackCueList/getter-expected.txt": [
-   "85045b646926dc16ac2bf42d0d93d27365c7d483",
-   "support"
-  ],
   "html/semantics/embedded-content/media-elements/interfaces/TextTrackCueList/getter.html": [
    "119472b70b588c3032529a7959e6b3e3ef8fcb88",
    "testharness"
@@ -234402,10 +235259,6 @@
    "cb76121ffc7f6d4a8cb434c375468742007e0673",
    "testharness"
   ],
-  "html/semantics/embedded-content/media-elements/interfaces/TextTrackList/getter-expected.txt": [
-   "e1ceedeec4428cbcdfcf5fa1d4aa1cbd171e7ae4",
-   "support"
-  ],
   "html/semantics/embedded-content/media-elements/interfaces/TextTrackList/getter.html": [
    "38f55a09a5d33c2e46e5ff2c60dd5d7c7b73ca37",
    "testharness"
@@ -236762,8 +237615,16 @@
    "5d5e954fd50f3d474e69875d11e03ade7c80d7cd",
    "testharness"
   ],
-  "html/semantics/scripting-1/the-script-element/load-event.html": [
-   "e702aa5d09183d147850f61503d2e18f78a0a660",
+  "html/semantics/scripting-1/the-script-element/load-error-events-1.html": [
+   "f97f03f6a6e73665eb2f5c4c61801f432f75a59d",
+   "testharness"
+  ],
+  "html/semantics/scripting-1/the-script-element/load-error-events-2.html": [
+   "a20dbe60fad2827bc97fb647c3a29ec1c54cfd0c",
+   "testharness"
+  ],
+  "html/semantics/scripting-1/the-script-element/load-error-events-3.html": [
+   "a2dd0a60944fb8785493a50ad802f7793355a385",
    "testharness"
   ],
   "html/semantics/scripting-1/the-script-element/log.py": [
@@ -237058,6 +237919,14 @@
    "2fd8c4ee6fcc66a8ddc2100a0840ebcc324a7d58",
    "testharness"
   ],
+  "html/semantics/scripting-1/the-script-element/module/load-error-events-inline.html": [
+   "9b35d8d7ba6bb4826274c9570056cc962660d715",
+   "testharness"
+  ],
+  "html/semantics/scripting-1/the-script-element/module/load-error-events.html": [
+   "304dc3a7e9cd48699742b0a1431adda1d0f253c0",
+   "testharness"
+  ],
   "html/semantics/scripting-1/the-script-element/module/missing-export-nested.js": [
    "5c6c1dae178b88b42ce87964e372f7d7db99ba70",
    "support"
@@ -237214,10 +238083,22 @@
    "5797045ac8591d2662a6714367ae5fb257881793",
    "support"
   ],
+  "html/semantics/scripting-1/the-script-element/resources/load-error-events-helpers.js": [
+   "57a043fff23635ce04b62672429b6abb088cdb9b",
+   "support"
+  ],
+  "html/semantics/scripting-1/the-script-element/resources/load-error-events.py": [
+   "0a9007a17bed4635d7f384d3a32a6d2dff11738c",
+   "support"
+  ],
   "html/semantics/scripting-1/the-script-element/resources/set-script-executed.js": [
    "87f80eee703965c88f2bf7015bfa76233d459d06",
    "support"
   ],
+  "html/semantics/scripting-1/the-script-element/resources/slow.py": [
+   "200bd721dadd0eb50d0b7734b17a081505697cc9",
+   "support"
+  ],
   "html/semantics/scripting-1/the-script-element/script-charset-01-expected.txt": [
    "89ed2800022ff8f95d94bd1f5035de488b8c75f1",
    "support"
@@ -239175,7 +240056,7 @@
    "manual"
   ],
   "html/webappapis/scripting/events/event-handler-all-global-events-expected.txt": [
-   "5c8a11538bc70d93f3a7f4cbd33710bac3a34bc0",
+   "4f354373460dfe647b47cf902259e84a4d3da481",
    "support"
   ],
   "html/webappapis/scripting/events/event-handler-all-global-events.html": [
@@ -240094,6 +240975,10 @@
    "f94325d74e69fbd62bfdff3c0f4676a3d2c50d09",
    "manual"
   ],
+  "interfaces/clipboard.idl": [
+   "5af2846c7f9ff93f2f4f13780d0356cdac6a0d4f",
+   "support"
+  ],
   "interfaces/cssom.idl": [
    "bb17bbe93776dbeb33f061a7a90889e922e3138e",
    "support"
@@ -240103,7 +240988,7 @@
    "support"
   ],
   "interfaces/dom.idl": [
-   "86f2e15d4b32af7b5127283eb3cfab5a78b46c0a",
+   "2b94c6332d8535bbcfd605bc3ed46ba6f705de62",
    "support"
   ],
   "interfaces/fullscreen.idl": [
@@ -240135,7 +241020,7 @@
    "support"
   ],
   "interfaces/web-share.idl": [
-   "0f43a814700a62e8f5ea54056ae901e1bdb3a610",
+   "d3ab33fa078f1b3bd4b29e174369073aab3963d5",
    "support"
   ],
   "interfaces/webrtc-pc.idl": [
@@ -242863,7 +243748,7 @@
    "support"
   ],
   "navigation-timing/nav2_idlharness.html": [
-   "6931ae3947e9f6553890c4c7895b774faad02102",
+   "ffc5d6f4a11a4bf2ad72404fc62d88be1c45a5f5",
    "testharness"
   ],
   "navigation-timing/nav2_test_attributes_exist.html": [
@@ -242971,7 +243856,7 @@
    "support"
   ],
   "navigation-timing/resources/webperftestharness.js": [
-   "670154a84de50de0c6b310edfeb23a1f3d0d72d1",
+   "c149cde434fc6e82e9e50936308ec0ad9b3c2997",
    "support"
   ],
   "navigation-timing/test_document_open.html": [
@@ -249351,7 +250236,11 @@
    "support"
   ],
   "page-visibility/idlharness.html": [
-   "6bbcc548a783a56340aa256e5f51ca51c1b3f4d3",
+   "d6d16a7aed48659afaf14acd5e21271a8ce8cec0",
+   "testharness"
+  ],
+  "page-visibility/iframe-unload.html": [
+   "b97bb09efe6a8e410f6bfd71dc92f041d1b980bf",
    "testharness"
   ],
   "page-visibility/prerender_call-expected.txt": [
@@ -249366,8 +250255,12 @@
    "2d6d55d85e17a9fe978db6dbe25ae35a599d5683",
    "support"
   ],
+  "page-visibility/resources/iframe-with-subframes.html": [
+   "17615ac4c33fd7f2e49c3b5357de3b976eb2963b",
+   "support"
+  ],
   "page-visibility/resources/pagevistestharness.js": [
-   "63604473eabaa8d3b9b410a1a0087d9b4b2e7b90",
+   "1c77f9af66e2d39e97056273c35197827f03bb06",
    "support"
   ],
   "page-visibility/resources/prerender_target.html": [
@@ -249443,7 +250336,7 @@
    "testharness"
   ],
   "payment-request/allowpaymentrequest/removing-allowpaymentrequest.https.sub.html": [
-   "9452392f0dc2b4feb4ee87f09952819998b9e39c",
+   "41265b7c3d0e8d4c8f462f957627139f8aa5a3a3",
    "testharness"
   ],
   "payment-request/allowpaymentrequest/setting-allowpaymentrequest-timing.https.sub-expected.txt": [
@@ -249451,11 +250344,11 @@
    "support"
   ],
   "payment-request/allowpaymentrequest/setting-allowpaymentrequest-timing.https.sub.html": [
-   "b8c0121e830a6b2c8897d98ee8cbd381802d4735",
+   "5eb37c0c6ad39187c4505a8cbe113c4b68e51c92",
    "testharness"
   ],
   "payment-request/allowpaymentrequest/setting-allowpaymentrequest.https.sub.html": [
-   "6e4028440fff617d6a0e9abb06625891eb53b28a",
+   "e5be539c1b0ca1c571df1fc979fde5bf6482b43d",
    "testharness"
   ],
   "payment-request/historical.https.html": [
@@ -249502,9 +250395,9 @@
    "c9ee5af2ccd5ad364090807c8427f1d4624d3747",
    "testharness"
   ],
-  "payment-request/payment-request-canmakepayment-method.https.http": [
+  "payment-request/payment-request-canmakepayment-method.https.html": [
    "b20131bc3f2717212f9940920183d650ee111333",
-   "support"
+   "testharness"
   ],
   "payment-request/payment-request-constructor-crash.https.html": [
    "dd2f95bd4d94a819c507e942b19a60de05a16971",
@@ -249567,7 +250460,7 @@
    "testharness"
   ],
   "performance-timeline/idlharness.html": [
-   "14c5244fdb2af22bdad8b5333d2dd5b9696a9e49",
+   "b021a9528875942d44b33c3fc3f4cd643194fad5",
    "testharness"
   ],
   "performance-timeline/performanceobservers.js": [
@@ -249610,6 +250503,18 @@
    "f2f3c2b3cef895f514f595932b767299cd6dade0",
    "support"
   ],
+  "performance-timeline/resources/worker-with-performance-observer.js": [
+   "6536127a1136f45cd59f62a9851fe61ceabe3d5b",
+   "support"
+  ],
+  "performance-timeline/worker-with-performance-observer-expected.txt": [
+   "0956fee8c746137cf4a2bbf3d247ee424ba7c42e",
+   "support"
+  ],
+  "performance-timeline/worker-with-performance-observer.html": [
+   "dc978fd8669d67118109fcab245010fdd7d799b0",
+   "testharness"
+  ],
   "pointerevents/OWNERS": [
    "a4fed30c25d50d5ce774e4e5b431efa99f73ecf3",
    "support"
@@ -257839,7 +258744,7 @@
    "support"
   ],
   "resource-timing/idlharness.html": [
-   "c2582fcd7d9cf40d10d86589c341789ba94a68bd",
+   "60e2a57792827713ffd1176a0793da97c1ccf599",
    "testharness"
   ],
   "resource-timing/iframe-setdomain.sub.html": [
@@ -262639,7 +263544,7 @@
    "testharness"
   ],
   "url/urlsearchparams-delete.html": [
-   "eaeaab453fb90ba939c4dca0db11a07d50acce26",
+   "b1fcda755e2a9e3308a222fe213abf0a255f0777",
    "testharness"
   ],
   "url/urlsearchparams-foreach-expected.txt": [
@@ -263374,9 +264279,9 @@
    "b4dcc0ac05c2a14907d55058f7d51190842fe0d3",
    "manual"
   ],
-  "web-share/share-empty-manual.html": [
-   "0a465dc66c930601d611ea3cfef0a271b6cc0b0a",
-   "manual"
+  "web-share/share-empty.https.html": [
+   "aa25dc3fef3c62d9b128866a2c48df204bfaa548",
+   "testharness"
   ],
   "web-share/share-extra-argument-manual.html": [
    "d0d2e67e49c16b874e5c5cbe4d1c6920b6b70a17",
@@ -263439,7 +264344,7 @@
    "manual"
   ],
   "web-share/share-without-user-gesture.https.html": [
-   "aaa84c716125c6332b3a5c114a97d5986af38c37",
+   "d883b2469759722cf76c4624a1a81908c9aa5ae0",
    "testharness"
   ],
   "webaudio/.gitignore": [
@@ -264126,6 +265031,10 @@
    "76e0c5f601c8ba4aefb06d1ebab8454c78fe07df",
    "testharness"
   ],
+  "webrtc/RTCConfiguration-bundlePolicy.html": [
+   "260ead036b3f4facd720dafbcaaa11040c145228",
+   "testharness"
+  ],
   "webrtc/RTCConfiguration-iceCandidatePoolSize-expected.txt": [
    "a3c6a87b158deb84be0f56e8467b1f9bf16aba71",
    "support"
@@ -264207,7 +265116,7 @@
    "support"
   ],
   "webrtc/RTCPeerConnection-constructor.html": [
-   "60e9ec4bec3e3d3b785568be8cf089c959e71813",
+   "785610c964c8ed95a3b4f65c68a2612c2442145a",
    "testharness"
   ],
   "webrtc/RTCPeerConnection-createAnswer-expected.txt": [
@@ -264238,6 +265147,10 @@
    "27fb46922255203da0fc26a63808aeb98a60b640",
    "testharness"
   ],
+  "webrtc/RTCPeerConnection-getDefaultIceServers.html": [
+   "3b8f625e068cfd6ec3fe80bab276b2216fa8eda5",
+   "testharness"
+  ],
   "webrtc/RTCPeerConnection-getTransceivers-expected.txt": [
    "c2256fadf711bf5daa8ee81af75c269e15e7c34d",
    "support"
@@ -264267,7 +265180,7 @@
    "testharness"
   ],
   "webrtc/RTCPeerConnection-idl-expected.txt": [
-   "a8578ee98585cababd679ff4569850e81bf439ee",
+   "b0a742082027191a583c2982b3245cb18fa3aaad",
    "support"
   ],
   "webrtc/RTCPeerConnection-idl.html": [
@@ -264318,6 +265231,10 @@
    "9e8eca4fa11cc72471bc48d98bec8e5936111334",
    "testharness"
   ],
+  "webrtc/RTCRtpTransceiver-setDirection.html": [
+   "539eaba516eef7419c5e543d7218a41f850f5e7b",
+   "testharness"
+  ],
   "webrtc/RTCSctpTransport-constructor-expected.txt": [
    "b3ab3dc6b944a3273263ffb739fbb0b7c37ce8d2",
    "support"
@@ -264351,7 +265268,7 @@
    "testharness"
   ],
   "webrtc/interfaces-expected.txt": [
-   "9fb4c9aa96921b2099227fe2294c0c7799bb1ebb",
+   "24a06be7ff2b7bcbf6bd857dc91f39ec5869206d",
    "support"
   ],
   "webrtc/interfaces.html": [
@@ -265611,7 +266528,7 @@
    "support"
   ],
   "webusb/resources/usb-helpers.js": [
-   "41af64a414c353777e67eb9b57d08fd96a6fa88c",
+   "164413453b70ea42f885481cc3ed839a4314527e",
    "support"
   ],
   "webusb/usb-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html": [
@@ -265667,7 +266584,7 @@
    "testharness"
   ],
   "webusb/usbIsochronousInTransferResult.https.html": [
-   "bf85d36769b9f52c0d8f69027875199669eb64e0",
+   "131e36c8782adf4c02198b1905d233159295d5aa",
    "testharness"
   ],
   "webusb/usbIsochronousOutTransferPacket.https.html": [
diff --git a/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.html b/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.any.js
similarity index 66%
rename from third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.html
rename to third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.any.js
index 450b4b3..bb846a4 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.any.js
@@ -1,12 +1,5 @@
-<!doctype html>
-<meta charset=utf-8>
-<title>DOMException constants</title>
-<link rel=help href="https://heycam.github.io/webidl/#es-DOMException-constructor-object">
-<link rel=help href="https://heycam.github.io/webidl/#es-DOMException-prototype-object">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<div id="log"></div>
-<script>
+'use strict';
+
 test(function() {
   // https://www.w3.org/Bugs/Public/show_bug.cgi?id=27732
   var constants = [
@@ -47,13 +40,12 @@
         assert_equals(object[name], i + 1, name)
         assert_own_property(object, name)
         var pd = Object.getOwnPropertyDescriptor(object, name)
-        assert_false("get" in pd, "property has getter")
-        assert_false("set" in pd, "property has setter")
-        assert_false(pd.writable, "not writable")
+        assert_false("get" in pd, "get")
+        assert_false("set" in pd, "set")
+        assert_false(pd.writable, "writable")
         assert_true(pd.enumerable, "enumerable")
-        assert_false(pd.configurable, "not configurable")
+        assert_false(pd.configurable, "configurable")
       }, "Constant " + name + " on " + description)
     })
   })
 })
-</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-and-prototype.any.js b/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-and-prototype.any.js
new file mode 100644
index 0000000..a015470
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-and-prototype.any.js
@@ -0,0 +1,32 @@
+test(function() {
+    assert_own_property(self, "DOMException", "property of global");
+
+    var desc = Object.getOwnPropertyDescriptor(self, "DOMException");
+    assert_false("get" in desc, "get");
+    assert_false("set" in desc, "set");
+    assert_true(desc.writable, "writable");
+    assert_false(desc.enumerable, "enumerable");
+    assert_true(desc.configurable, "configurable");
+}, "existence and property descriptor of DOMException");
+
+test(function() {
+    assert_own_property(self.DOMException, "prototype", "prototype property");
+
+    var desc = Object.getOwnPropertyDescriptor(self.DOMException, "prototype");
+    assert_false("get" in desc, "get");
+    assert_false("set" in desc, "set");
+    assert_false(desc.writable, "writable");
+    assert_false(desc.enumerable, "enumerable");
+    assert_false(desc.configurable, "configurable");
+}, "existence and property descriptor of DOMException.prototype");
+
+test(function() {
+    assert_own_property(self.DOMException.prototype, "constructor", "property of prototype");
+    var desc = Object.getOwnPropertyDescriptor(self.DOMException.prototype, "constructor");
+    assert_false("get" in desc, "get");
+    assert_false("set" in desc, "set");
+    assert_true(desc.writable, "writable");
+    assert_false(desc.enumerable, "enumerable");
+    assert_true(desc.configurable, "configurable");
+    assert_equals(self.DOMException.prototype.constructor, self.DOMException, "equality with actual constructor");
+}, "existence and property descriptor of DOMException.prototype.constructor");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor.html b/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.js
similarity index 75%
rename from third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor.html
rename to third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.js
index 0e5ffea7..d6e1cdd 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.js
@@ -1,13 +1,5 @@
-<!doctype html>
-<meta charset=utf-8>
-<title>DOMException constructor</title>
-<link rel=help href="https://heycam.github.io/webidl/#es-DOMException-constructor-object">
-<link rel=help href="https://people.mozilla.org/~jorendorff/es6-draft.html#sec-error.prototype.message">
-<link rel=help href="https://people.mozilla.org/~jorendorff/es6-draft.html#sec-error.prototype.name">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<div id="log"></div>
-<script>
+'use strict';
+
 test(function() {
   var ex = new DOMException();
   assert_equals(ex.name, "Error",
@@ -22,7 +14,7 @@
                "The name property should be inherited");
   assert_false(ex.hasOwnProperty("message"),
                "The message property should be inherited");
-}, 'new DOMException(): own-ness');
+}, 'new DOMException(): inherited-ness');
 
 test(function() {
   var ex = new DOMException(null);
@@ -46,7 +38,7 @@
                "The name property should be inherited");
   assert_false(ex.hasOwnProperty("message"),
                "The message property should be inherited");
-}, 'new DOMException(undefined): own-ness');
+}, 'new DOMException(undefined): inherited-ness');
 
 test(function() {
   var ex = new DOMException("foo");
@@ -59,9 +51,9 @@
   var ex = new DOMException("foo");
   assert_false(ex.hasOwnProperty("name"),
                "The name property should be inherited");
-  assert_true(ex.hasOwnProperty("message"),
-              "The message property should be own");
-}, 'new DOMException("foo"): own-ness');
+  assert_false(ex.hasOwnProperty("message"),
+              "The message property should be inherited");
+}, 'new DOMException("foo"): inherited-ness');
 
 test(function() {
   var ex = new DOMException("bar", undefined);
@@ -80,11 +72,11 @@
 
 test(function() {
   var ex = new DOMException("bar", "NotSupportedError");
-  assert_true(ex.hasOwnProperty("name"),
-              "The name property should be own");
-  assert_true(ex.hasOwnProperty("message"),
-              "The message property should be own");
-}, 'new DOMException("bar", "NotSupportedError"): own-ness');
+  assert_false(ex.hasOwnProperty("name"),
+              "The name property should be inherited");
+  assert_false(ex.hasOwnProperty("message"),
+              "The message property should be inherited");
+}, 'new DOMException("bar", "NotSupportedError"): inherited-ness');
 
 test(function() {
   var ex = new DOMException("bar", "foo");
@@ -127,13 +119,3 @@
                   "Should have matching legacy code from error names table");
   },'new DOMexception("msg", "' + test_case.name + '")');
 });
-
-test(function() {
-  var ex = new DOMException("bar", "UnknownError");
-  assert_equals(ex.name, "UnknownError", "Should be using the passed-in name");
-  assert_equals(ex.message, "bar", "Should still be using passed-in message");
-  assert_equals(ex.code, 0,
-                "Should have 0 for code for a name in the exception names table with no legacy code");
-}, 'new DOMException("bar", "UnknownError")');
-
-</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-expected.txt
deleted file mode 100644
index b38cc07..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-expected.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-This is a testharness.js-based test.
-PASS new DOMException() 
-PASS new DOMException(): own-ness 
-PASS new DOMException(null) 
-PASS new DOMException(undefined) 
-PASS new DOMException(undefined): own-ness 
-PASS new DOMException("foo") 
-FAIL new DOMException("foo"): own-ness assert_true: The message property should be own expected true got false
-PASS new DOMException("bar", undefined) 
-PASS new DOMException("bar", "NotSupportedError") 
-FAIL new DOMException("bar", "NotSupportedError"): own-ness assert_true: The name property should be own expected true got false
-PASS new DOMException("bar", "foo") 
-PASS new DOMexception("msg", "IndexSizeError") 
-PASS new DOMexception("msg", "HierarchyRequestError") 
-PASS new DOMexception("msg", "WrongDocumentError") 
-PASS new DOMexception("msg", "InvalidCharacterError") 
-PASS new DOMexception("msg", "NoModificationAllowedError") 
-PASS new DOMexception("msg", "NotFoundError") 
-PASS new DOMexception("msg", "NotSupportedError") 
-PASS new DOMexception("msg", "InUseAttributeError") 
-PASS new DOMexception("msg", "InvalidStateError") 
-PASS new DOMexception("msg", "SyntaxError") 
-PASS new DOMexception("msg", "InvalidModificationError") 
-PASS new DOMexception("msg", "NamespaceError") 
-PASS new DOMexception("msg", "InvalidAccessError") 
-PASS new DOMexception("msg", "SecurityError") 
-PASS new DOMexception("msg", "NetworkError") 
-PASS new DOMexception("msg", "AbortError") 
-PASS new DOMexception("msg", "URLMismatchError") 
-PASS new DOMexception("msg", "QuotaExceededError") 
-PASS new DOMexception("msg", "TimeoutError") 
-PASS new DOMexception("msg", "InvalidNodeTypeError") 
-PASS new DOMexception("msg", "DataCloneError") 
-PASS new DOMException("bar", "UnknownError") 
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any-expected.txt
new file mode 100644
index 0000000..2a61639
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any-expected.txt
@@ -0,0 +1,18 @@
+This is a testharness.js-based test.
+PASS Cannot construct without new 
+PASS inherits from Error: prototype-side 
+PASS does not inherit from Error: class-side 
+PASS message property descriptor 
+PASS message getter performs brand checks (i.e. is not [LenientThis] 
+PASS name property descriptor 
+PASS name getter performs brand checks (i.e. is not [LenientThis] 
+PASS code property descriptor 
+PASS code getter performs brand checks (i.e. is not [LenientThis] 
+PASS code property is not affected by shadowing the name property 
+PASS Object.prototype.toString behavior is like other interfaces 
+FAIL Inherits its toString() from Error.prototype assert_false: toString must not exist on DOMException.prototype expected false got true
+FAIL toString() behavior from Error.prototype applies as expected assert_equals: The default Error.prototype.toString() behavior must work on shadowed names and messages expected "new name: new message" but got "name: message"
+PASS DOMException.prototype.toString() applied to DOMException.prototype throws because of name/message brand checks 
+FAIL If the implementation has a stack property on normal errors, it also does on DOMExceptions assert_equals: The typeof values must match expected "string" but got "undefined"
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.js b/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.js
new file mode 100644
index 0000000..8d69c6e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.js
@@ -0,0 +1,120 @@
+"use strict";
+
+test(() => {
+  assert_throws(new TypeError(), () => DOMException());
+}, "Cannot construct without new");
+
+test(() => {
+  assert_equals(Object.getPrototypeOf(DOMException.prototype), Error.prototype);
+}, "inherits from Error: prototype-side");
+
+test(() => {
+  assert_equals(Object.getPrototypeOf(DOMException), Function.prototype);
+}, "does not inherit from Error: class-side");
+
+test(() => {
+  const e = new DOMException("message", "name");
+  assert_false(e.hasOwnProperty("message"), "property is not own");
+
+  const propDesc = Object.getOwnPropertyDescriptor(DOMException.prototype, "message");
+  assert_equals(typeof propDesc.get, "function", "property descriptor is a getter");
+  assert_equals(propDesc.set, undefined, "property descriptor is not a setter");
+  assert_true(propDesc.enumerable, "property descriptor enumerable");
+  assert_true(propDesc.configurable, "property descriptor configurable");
+}, "message property descriptor");
+
+test(() => {
+  const getter = Object.getOwnPropertyDescriptor(DOMException.prototype, "message").get;
+
+  assert_throws(new TypeError(), () => getter.apply({}));
+}, "message getter performs brand checks (i.e. is not [LenientThis]");
+
+test(() => {
+  const e = new DOMException("message", "name");
+  assert_false(e.hasOwnProperty("name"), "property is not own");
+
+  const propDesc = Object.getOwnPropertyDescriptor(DOMException.prototype, "name");
+  assert_equals(typeof propDesc.get, "function", "property descriptor is a getter");
+  assert_equals(propDesc.set, undefined, "property descriptor is not a setter");
+  assert_true(propDesc.enumerable, "property descriptor enumerable");
+  assert_true(propDesc.configurable, "property descriptor configurable");
+}, "name property descriptor");
+
+test(() => {
+  const getter = Object.getOwnPropertyDescriptor(DOMException.prototype, "name").get;
+
+  assert_throws(new TypeError(), () => getter.apply({}));
+}, "name getter performs brand checks (i.e. is not [LenientThis]");
+
+test(() => {
+  const e = new DOMException("message", "name");
+  assert_false(e.hasOwnProperty("code"), "property is not own");
+
+  const propDesc = Object.getOwnPropertyDescriptor(DOMException.prototype, "code");
+  assert_equals(typeof propDesc.get, "function", "property descriptor is a getter");
+  assert_equals(propDesc.set, undefined, "property descriptor is not a setter");
+  assert_true(propDesc.enumerable, "property descriptor enumerable");
+  assert_true(propDesc.configurable, "property descriptor configurable");
+}, "code property descriptor");
+
+test(() => {
+  const getter = Object.getOwnPropertyDescriptor(DOMException.prototype, "code").get;
+
+  assert_throws(new TypeError(), () => getter.apply({}));
+}, "code getter performs brand checks (i.e. is not [LenientThis]");
+
+test(() => {
+  const e = new DOMException("message", "InvalidCharacterError");
+  assert_equals(e.code, 5, "Initially the code is set to 5");
+
+  Object.defineProperty(e, "name", {
+    value: "WrongDocumentError"
+  });
+
+  assert_equals(e.code, 5, "The code is still set to 5");
+}, "code property is not affected by shadowing the name property");
+
+test(() => {
+  const e = new DOMException("message", "name");
+  assert_equals(Object.prototype.toString.call(e), "[object DOMException]");
+}, "Object.prototype.toString behavior is like other interfaces");
+
+test(() => {
+  const e = new DOMException("message", "name");
+  assert_false(e.hasOwnProperty("toString"), "toString must not exist on the instance");
+  assert_false(DOMException.prototype.hasOwnProperty("toString"), "toString must not exist on DOMException.prototype");
+  assert_equals(typeof e.toString, "function", "toString must still exist (via Error.prototype)");
+}, "Inherits its toString() from Error.prototype");
+
+test(() => {
+  const e = new DOMException("message", "name");
+  assert_equals(e.toString(), "name: message",
+    "The default Error.prototype.toString() behavior must work on supplied name and message");
+
+  Object.defineProperty(e, "name", { value: "new name" });
+  Object.defineProperty(e, "message", { value: "new message" });
+  assert_equals(e.toString(), "new name: new message",
+    "The default Error.prototype.toString() behavior must work on shadowed names and messages");
+}, "toString() behavior from Error.prototype applies as expected");
+
+test(() => {
+  assert_throws(new TypeError(), () => DOMException.prototype.toString());
+}, "DOMException.prototype.toString() applied to DOMException.prototype throws because of name/message brand checks");
+
+test(() => {
+  let stackOnNormalErrors;
+  try {
+    throw new Error("normal error");
+  } catch (e) {
+    stackOnNormalErrors = e.stack;
+  }
+
+  let stackOnDOMException;
+  try {
+    throw new DOMException("message", "name");
+  } catch (e) {
+    stackOnDOMException = e.stack;
+  }
+
+  assert_equals(typeof stackOnDOMException, typeof stackOnNormalErrors, "The typeof values must match");
+}, "If the implementation has a stack property on normal errors, it also does on DOMExceptions");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.worker-expected.txt
new file mode 100644
index 0000000..2a61639
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.worker-expected.txt
@@ -0,0 +1,18 @@
+This is a testharness.js-based test.
+PASS Cannot construct without new 
+PASS inherits from Error: prototype-side 
+PASS does not inherit from Error: class-side 
+PASS message property descriptor 
+PASS message getter performs brand checks (i.e. is not [LenientThis] 
+PASS name property descriptor 
+PASS name getter performs brand checks (i.e. is not [LenientThis] 
+PASS code property descriptor 
+PASS code getter performs brand checks (i.e. is not [LenientThis] 
+PASS code property is not affected by shadowing the name property 
+PASS Object.prototype.toString behavior is like other interfaces 
+FAIL Inherits its toString() from Error.prototype assert_false: toString must not exist on DOMException.prototype expected false got true
+FAIL toString() behavior from Error.prototype applies as expected assert_equals: The default Error.prototype.toString() behavior must work on shadowed names and messages expected "new name: new message" but got "name: message"
+PASS DOMException.prototype.toString() applied to DOMException.prototype throws because of name/message brand checks 
+FAIL If the implementation has a stack property on normal errors, it also does on DOMExceptions assert_equals: The typeof values must match expected "string" but got "undefined"
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/constructor-object-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/constructor-object-expected.txt
deleted file mode 100644
index 65f0523..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/constructor-object-expected.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-This is a testharness.js-based test.
-FAIL existence and properties of DOMException assert_equals: prototype of self's property "DOMException" is not Error expected function "function Error() { [native code] }" but got function "function () { [native code] }"
-FAIL existence and properties of DOMException.prototype assert_equals: class string of DOMException.prototype expected "[object DOMExceptionPrototype]" but got "[object DOMException]"
-FAIL existence of name and code properties on DOMException.prototype assert_false: DOMException.prototype should not have an own "name" property. expected false got true
-PASS existence and properties of exception interface prototype object's "constructor" property 
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/constructor-object.html b/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/constructor-object.html
deleted file mode 100644
index ddb40f4..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/constructor-object.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<title>DOMException constructor and prototype object</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src=constructor-object.js></script>
-<div id="log"></div>
-<script>
-setup({ explicit_done: true })
-run_test()
-</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/constructor-object.js b/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/constructor-object.js
deleted file mode 100644
index e539d85db..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/constructor-object.js
+++ /dev/null
@@ -1,111 +0,0 @@
-function run_test() {
-    test(function() {
-        // "There MUST exist a property on the ECMAScript global object whose
-        // name is “DOMException” and value is an object called the
-        // DOMException constructor object, which provides access to legacy
-        // DOMException code constants. The property has the attributes
-        // { [[Writable]]: true, [[Enumerable]]: false,
-        // [[Configurable]]: true }."
-        assert_own_property(self, "DOMException",
-                            "self does not have own property \"DOMException\"");
-        var desc = Object.getOwnPropertyDescriptor(self, "DOMException");
-        assert_false("get" in desc, "self's property \"DOMException\" has getter");
-        assert_false("set" in desc, "self's property \"DOMException\" has setter");
-        assert_true(desc.writable, "self's property \"DOMException\" is not writable");
-        assert_false(desc.enumerable, "self's property \"DOMException\" is enumerable");
-        assert_true(desc.configurable, "self's property \"DOMException\" is not configurable");
-
-        // "The DOMException constructor object MUST be a function object but
-        // with a [[Prototype]] value of %Error% ([ECMA-262], section 6.1.7.4)."
-        assert_equals(Object.getPrototypeOf(self.DOMException), Error,
-                      "prototype of self's property \"DOMException\" is not Error");
-
-        // "Its [[Get]] internal property is set as described in ECMA-262
-        // section 9.1.8."
-        // Not much to test for this.
-        // "Its [[Construct]] internal property is set as described in ECMA-262
-        // section 19.2.2.3."
-        // "Its @@hasInstance property is set as described in ECMA-262 section
-        // 19.2.3.8, unless otherwise specified."
-
-        // String() returns something implementation-dependent, because it
-        // calls Function#toString.
-        assert_class_string(self.DOMException, "Function",
-                            "class string of DOMException");
-
-        // "For every legacy code listed in the error names table, there MUST
-        // be a property on the DOMException constructor object whose name and
-        // value are as indicated in the table. The property has attributes
-        // { [[Writable]]: false, [[Enumerable]]: true,
-        // [[Configurable]]: false }."
-        // See DOMException-constants.html.
-    }, "existence and properties of DOMException");
-
-    test(function() {
-        assert_own_property(self, "DOMException",
-                            "self does not have own property \"DOMException\"");
-
-        // "The DOMException constructor object MUST also have a property named
-        // “prototype” with attributes { [[Writable]]: false,
-        // [[Enumerable]]: false, [[Configurable]]: false } whose value is an
-        // object called the DOMException prototype object. This object also
-        // provides access to the legacy code values."
-        assert_own_property(self.DOMException, "prototype",
-                            'exception "DOMException" does not have own property "prototype"');
-        var desc = Object.getOwnPropertyDescriptor(self.DOMException, "prototype");
-        assert_false("get" in desc, "DOMException.prototype has getter");
-        assert_false("set" in desc, "DOMException.prototype has setter");
-        assert_false(desc.writable, "DOMException.prototype is writable");
-        assert_false(desc.enumerable, "DOMException.prototype is enumerable");
-        assert_false(desc.configurable, "DOMException.prototype is configurable");
-
-        // "The DOMException prototype object MUST have an internal
-        // [[Prototype]] property whose value is %ErrorPrototype% ([ECMA-262],
-        // section 6.1.7.4)."
-        assert_own_property(self, "Error",
-                            'should inherit from Error, but self has no such property');
-        assert_own_property(self.Error, "prototype",
-                            'should inherit from Error, but that object has no "prototype" property');
-        assert_equals(Object.getPrototypeOf(self.DOMException.prototype),
-                      self.Error.prototype,
-                      'prototype of DOMException.prototype is not Error.prototype');
-
-        // "The class string of the DOMException prototype object is
-        // “DOMExceptionPrototype”."
-        assert_class_string(self.DOMException.prototype, "DOMExceptionPrototype",
-                            "class string of DOMException.prototype");
-    }, "existence and properties of DOMException.prototype");
-
-    test(function() {
-        assert_false(self.DOMException.prototype.hasOwnProperty("name"),
-                     "DOMException.prototype should not have an own \"name\" " +
-                     "property.");
-        assert_false(self.DOMException.prototype.hasOwnProperty("code"),
-                     "DOMException.prototype should not have an own \"name\" " +
-                     "property.");
-    }, "existence of name and code properties on DOMException.prototype");
-
-    test(function() {
-        assert_own_property(self, "DOMException",
-                            "self does not have own property \"DOMException\"");
-        assert_own_property(self.DOMException, "prototype",
-                            'interface "DOMException" does not have own property "prototype"');
-
-        // "There MUST be a property named “constructor” on the DOMException
-        // prototype object with attributes { [[Writable]]: true,
-        // [[Enumerable]]: false, [[Configurable]]: true } and whose value is
-        // the DOMException constructor object."
-        assert_own_property(self.DOMException.prototype, "constructor",
-                            "DOMException" + '.prototype does not have own property "constructor"');
-        var desc = Object.getOwnPropertyDescriptor(self.DOMException.prototype, "constructor");
-        assert_false("get" in desc, "DOMException.prototype.constructor has getter");
-        assert_false("set" in desc, "DOMException.prototype.constructor has setter");
-        assert_true(desc.writable, "DOMException.prototype.constructor is not writable");
-        assert_false(desc.enumerable, "DOMException.prototype.constructor is enumerable");
-        assert_true(desc.configurable, "DOMException.prototype.constructor in not configurable");
-        assert_equals(self.DOMException.prototype.constructor, self.DOMException,
-                      "DOMException.prototype.constructor is not the same object as DOMException");
-    }, "existence and properties of exception interface prototype object's \"constructor\" property");
-
-    done();
-}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.js b/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.js
deleted file mode 100644
index 7514924..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.js
+++ /dev/null
@@ -1,3 +0,0 @@
-importScripts("/resources/testharness.js")
-importScripts("constructor-object.js")
-run_test();
diff --git a/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/exceptions-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/exceptions-expected.txt
deleted file mode 100644
index 97ca4bd6..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/exceptions-expected.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-This is a testharness.js-based test.
-PASS Object.getPrototypeOf(exception) === DOMException.prototype 
-FAIL exception.hasOwnProperty("name") assert_true: expected true got false
-PASS exception.name === "HierarchyRequestError" 
-FAIL Object.getOwnPropertyDescriptor(exception, "name") Cannot read property 'writable' of undefined
-PASS Object.getOwnPropertyDescriptor(exception, "message") 
-FAIL typeof exception.message === "string" assert_equals: expected "" but got "Failed to execute 'appendChild' on 'Node': The new child element contains the parent."
-PASS Object.prototype.toString.call(exception) === "[object DOMException]" 
-PASS exception.code === DOMException.HIERARCHY_REQUEST_ERR 
-FAIL Object.getOwnPropertyDescriptor(exception, "code") Cannot read property 'writable' of undefined
-PASS In iframe: Object.getPrototypeOf(exception) === DOMException.prototype 
-FAIL In iframe: exception.hasOwnProperty("name") assert_true: expected true got false
-PASS In iframe: exception.name === "HierarchyRequestError" 
-FAIL In iframe: Object.getOwnPropertyDescriptor(exception, "name") Cannot read property 'writable' of undefined
-PASS In iframe: Object.getOwnPropertyDescriptor(exception, "message") 
-FAIL In iframe: typeof exception.message === "string" assert_equals: expected "" but got "Failed to execute 'appendChild' on 'Node': The new child element contains the parent."
-PASS In iframe: Object.prototype.toString.call(exception) === "[object DOMException]" 
-PASS In iframe: exception.code === DOMException.HIERARCHY_REQUEST_ERR 
-FAIL In iframe: Object.getOwnPropertyDescriptor(exception, "code") Cannot read property 'writable' of undefined
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/exceptions.html b/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/exceptions.html
index 06c196ef..396d0a4c 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/exceptions.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/WebIDL/ecmascript-binding/es-exceptions/exceptions.html
@@ -20,90 +20,31 @@
 setup({explicit_done: true});
 
 function testException(exception, global, desc) {
-  // https://heycam.github.io/webidl/#es-exception-objects
-  // (as of 2015-01-03): "The value of the internal [[Prototype]] property of a
-  // DOMException object MUST be the DOMException prototype object from the
-  // global environment the exception object is associated with."
   test(function() {
     assert_equals(global.Object.getPrototypeOf(exception),
                   global.DOMException.prototype);
   }, desc + "Object.getPrototypeOf(exception) === DOMException.prototype");
 
 
-  // https://heycam.github.io/webidl/#es-creating-throwing-exceptions
-  // (as of 2015-01-03): "Call the [[DefineOwnProperty]] internal method of /O/
-  // passing “name”, Property Descriptor { [[Value]]: /N/, [[Writable]]: true,
-  // [[Enumerable]]: true, [[Configurable]]: true }, and false as arguments."
   test(function() {
-    assert_true(exception.hasOwnProperty("name"));
+    assert_false(exception.hasOwnProperty("name"));
   }, desc + "exception.hasOwnProperty(\"name\")");
+  test(function() {
+    assert_false(exception.hasOwnProperty("message"));
+  }, desc + "exception.hasOwnProperty(\"message\")");
 
   test(function() {
     assert_equals(exception.name, "HierarchyRequestError");
   }, desc + "exception.name === \"HierarchyRequestError\"");
 
   test(function() {
-    var desc = global.Object.getOwnPropertyDescriptor(exception, "name");
-    assert_true(desc.writable, "must be writable");
-    assert_true(desc.enumerable, "must be enumerable");
-    assert_true(desc.configurable, "must be configurable");
-  }, desc + "Object.getOwnPropertyDescriptor(exception, \"name\")");
-
-
-  // https://heycam.github.io/webidl/#es-creating-throwing-exceptions
-  // (as of 2015-01-03): "If the optional user agent-defined message /M/ was
-  // specified, then this list has a single element whose value is the result
-  // of converting /M/ to a String value. Otherwise, the list is empty."
-  //
-  // https://heycam.github.io/webidl/#es-DOMException-constructor-object
-  // (as of 2015-01-03): "Call the [[DefineOwnProperty]] internal method of /O/
-  // passing “message”, Property Descriptor { [[Value]]: /S/,
-  // [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }, and
-  // false as arguments."
-  test(function() {
-    if (exception.hasOwnProperty("message")) {
-      var desc = global.Object.getOwnPropertyDescriptor(exception, "message");
-      assert_true(desc.writable, "must be writable");
-      assert_false(desc.enumerable, "must not be enumerable");
-      assert_true(desc.configurable, "must be configurable");
-    }
-  }, desc + "Object.getOwnPropertyDescriptor(exception, \"message\")");
-
-  test(function() {
-    if (exception.hasOwnProperty("message")) {
-      // Can't test anything more specific, since it's implementation-defined :(
-      assert_equals(typeof exception.message, "string");
-    } else {
-      // Error.prototype.message
-      assert_equals(exception.message, "");
-    }
-  }, desc + "typeof exception.message === \"string\"");
-
-
-  // https://heycam.github.io/webidl/#es-exception-objects
-  // (as of 2015-01-03): "The class string of a DOMException object MUST be
-  // “DOMException”."
-  test(function() {
-    assert_equals(global.Object.prototype.toString.call(exception),
-                  "[object DOMException]");
-  }, desc + "Object.prototype.toString.call(exception) === \"[object DOMException]\"");
-
-
-  // https://heycam.github.io/webidl/#es-creating-throwing-exceptions
-  // (as of 2015-01-03): "Call the [[DefineOwnProperty]] internal method of /O/
-  // passing “code”, Property Descriptor { [[Value]]: /code/,
-  // [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true }, and
-  // false as arguments."
-  test(function() {
     assert_equals(exception.code, global.DOMException.HIERARCHY_REQUEST_ERR);
   }, desc + "exception.code === DOMException.HIERARCHY_REQUEST_ERR");
 
   test(function() {
-    var desc = global.Object.getOwnPropertyDescriptor(exception, "name");
-    assert_true(desc.writable, "must be writable");
-    assert_true(desc.enumerable, "must be enumerable");
-    assert_true(desc.configurable, "must be configurable");
-  }, desc + "Object.getOwnPropertyDescriptor(exception, \"code\")");
+    assert_equals(global.Object.prototype.toString.call(exception),
+                  "[object DOMException]");
+  }, desc + "Object.prototype.toString.call(exception) === \"[object DOMException]\"");
 }
 
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/dom/events/EventTarget-constructible.any-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/dom/events/EventTarget-constructible.any-expected.txt
new file mode 100644
index 0000000..a19cf28
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/dom/events/EventTarget-constructible.any-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+FAIL A constructed EventTarget can be used as expected Illegal constructor
+FAIL EventTarget can be subclassed Illegal constructor
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/dom/events/EventTarget-constructible.any.js b/third_party/WebKit/LayoutTests/external/wpt/dom/events/EventTarget-constructible.any.js
new file mode 100644
index 0000000..b0e7614
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/dom/events/EventTarget-constructible.any.js
@@ -0,0 +1,62 @@
+"use strict";
+
+test(() => {
+  const target = new EventTarget();
+  const event = new Event("foo", { bubbles: true, cancelable: false });
+  let callCount = 0;
+
+  function listener(e) {
+    assert_equals(e, event);
+    ++callCount;
+  }
+
+  target.addEventListener("foo", listener);
+
+  target.dispatchEvent(event);
+  assert_equals(callCount, 1);
+
+  target.dispatchEvent(event);
+  assert_equals(callCount, 2);
+
+  target.removeEventListener("foo", listener);
+  target.dispatchEvent(event);
+  assert_equals(callCount, 2);
+}, "A constructed EventTarget can be used as expected");
+
+test(() => {
+  class NicerEventTarget extends EventTarget {
+    on(...args) {
+      this.addEventListener(...args);
+    }
+
+    off(...args) {
+      this.removeEventListener(...args);
+    }
+
+    dispatch(type, detail) {
+      this.dispatchEvent(new CustomEvent(type, { detail }));
+    }
+  }
+
+  const target = new NicerEventTarget();
+  const event = new Event("foo", { bubbles: true, cancelable: false });
+  const detail = "some data";
+  let callCount = 0;
+
+  function listener(e) {
+    assert_equals(e.detail, detail);
+    ++callCount;
+  }
+
+  target.on("foo", listener);
+
+  target.dispatch("foo", detail);
+  assert_equals(callCount, 1);
+
+  target.dispatch("foo", detail);
+  assert_equals(callCount, 2);
+
+  target.off("foo", listener);
+  target.dispatch("foo", detail);
+  assert_equals(callCount, 2);
+}, "EventTarget can be subclassed");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/dom/events/EventTarget-constructible.any.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/dom/events/EventTarget-constructible.any.worker-expected.txt
new file mode 100644
index 0000000..a19cf28
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/dom/events/EventTarget-constructible.any.worker-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+FAIL A constructed EventTarget can be used as expected Illegal constructor
+FAIL EventTarget can be subclassed Illegal constructor
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces-expected.txt
new file mode 100644
index 0000000..a5f71f6
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces-expected.txt
@@ -0,0 +1,1622 @@
+This is a testharness.js-based test.
+Found 1618 tests; 1610 PASS, 8 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS Test driver 
+PASS Event interface: existence and properties of interface object 
+PASS Event interface object length 
+PASS Event interface object name 
+PASS Event interface: existence and properties of interface prototype object 
+PASS Event interface: existence and properties of interface prototype object's "constructor" property 
+PASS Event interface: attribute type 
+PASS Event interface: attribute target 
+PASS Event interface: attribute currentTarget 
+PASS Event interface: constant NONE on interface object 
+PASS Event interface: constant NONE on interface prototype object 
+PASS Event interface: constant CAPTURING_PHASE on interface object 
+PASS Event interface: constant CAPTURING_PHASE on interface prototype object 
+PASS Event interface: constant AT_TARGET on interface object 
+PASS Event interface: constant AT_TARGET on interface prototype object 
+PASS Event interface: constant BUBBLING_PHASE on interface object 
+PASS Event interface: constant BUBBLING_PHASE on interface prototype object 
+PASS Event interface: attribute eventPhase 
+PASS Event interface: operation stopPropagation() 
+PASS Event interface: operation stopImmediatePropagation() 
+PASS Event interface: attribute bubbles 
+PASS Event interface: attribute cancelable 
+PASS Event interface: operation preventDefault() 
+PASS Event interface: attribute defaultPrevented 
+PASS Event interface: attribute timeStamp 
+PASS Event interface: operation initEvent(DOMString,boolean,boolean) 
+PASS Event must be primary interface of document.createEvent("Event") 
+PASS Stringification of document.createEvent("Event") 
+PASS Event interface: document.createEvent("Event") must inherit property "type" with the proper type (0) 
+PASS Event interface: document.createEvent("Event") must inherit property "target" with the proper type (1) 
+PASS Event interface: document.createEvent("Event") must inherit property "currentTarget" with the proper type (2) 
+PASS Event interface: document.createEvent("Event") must inherit property "NONE" with the proper type (3) 
+PASS Event interface: document.createEvent("Event") must inherit property "CAPTURING_PHASE" with the proper type (4) 
+PASS Event interface: document.createEvent("Event") must inherit property "AT_TARGET" with the proper type (5) 
+PASS Event interface: document.createEvent("Event") must inherit property "BUBBLING_PHASE" with the proper type (6) 
+PASS Event interface: document.createEvent("Event") must inherit property "eventPhase" with the proper type (7) 
+PASS Event interface: document.createEvent("Event") must inherit property "stopPropagation" with the proper type (8) 
+PASS Event interface: document.createEvent("Event") must inherit property "stopImmediatePropagation" with the proper type (9) 
+PASS Event interface: document.createEvent("Event") must inherit property "bubbles" with the proper type (10) 
+PASS Event interface: document.createEvent("Event") must inherit property "cancelable" with the proper type (11) 
+PASS Event interface: document.createEvent("Event") must inherit property "preventDefault" with the proper type (12) 
+PASS Event interface: document.createEvent("Event") must inherit property "defaultPrevented" with the proper type (13) 
+PASS Event interface: document.createEvent("Event") must have own property "isTrusted" 
+PASS Event interface: document.createEvent("Event") must inherit property "timeStamp" with the proper type (15) 
+PASS Event interface: document.createEvent("Event") must inherit property "initEvent" with the proper type (16) 
+PASS Event interface: calling initEvent(DOMString,boolean,boolean) on document.createEvent("Event") with too few arguments must throw TypeError 
+PASS Event must be primary interface of new Event("foo") 
+PASS Stringification of new Event("foo") 
+PASS Event interface: new Event("foo") must inherit property "type" with the proper type (0) 
+PASS Event interface: new Event("foo") must inherit property "target" with the proper type (1) 
+PASS Event interface: new Event("foo") must inherit property "currentTarget" with the proper type (2) 
+PASS Event interface: new Event("foo") must inherit property "NONE" with the proper type (3) 
+PASS Event interface: new Event("foo") must inherit property "CAPTURING_PHASE" with the proper type (4) 
+PASS Event interface: new Event("foo") must inherit property "AT_TARGET" with the proper type (5) 
+PASS Event interface: new Event("foo") must inherit property "BUBBLING_PHASE" with the proper type (6) 
+PASS Event interface: new Event("foo") must inherit property "eventPhase" with the proper type (7) 
+PASS Event interface: new Event("foo") must inherit property "stopPropagation" with the proper type (8) 
+PASS Event interface: new Event("foo") must inherit property "stopImmediatePropagation" with the proper type (9) 
+PASS Event interface: new Event("foo") must inherit property "bubbles" with the proper type (10) 
+PASS Event interface: new Event("foo") must inherit property "cancelable" with the proper type (11) 
+PASS Event interface: new Event("foo") must inherit property "preventDefault" with the proper type (12) 
+PASS Event interface: new Event("foo") must inherit property "defaultPrevented" with the proper type (13) 
+PASS Event interface: new Event("foo") must have own property "isTrusted" 
+PASS Event interface: new Event("foo") must inherit property "timeStamp" with the proper type (15) 
+PASS Event interface: new Event("foo") must inherit property "initEvent" with the proper type (16) 
+PASS Event interface: calling initEvent(DOMString,boolean,boolean) on new Event("foo") with too few arguments must throw TypeError 
+PASS CustomEvent interface: existence and properties of interface object 
+PASS CustomEvent interface object length 
+PASS CustomEvent interface object name 
+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 must be primary interface of new CustomEvent("foo") 
+PASS Stringification of new CustomEvent("foo") 
+PASS CustomEvent interface: new CustomEvent("foo") must inherit property "detail" with the proper type (0) 
+PASS CustomEvent interface: new CustomEvent("foo") must inherit property "initCustomEvent" with the proper type (1) 
+PASS CustomEvent interface: calling initCustomEvent(DOMString,boolean,boolean,any) on new CustomEvent("foo") with too few arguments must throw TypeError 
+PASS Event interface: new CustomEvent("foo") must inherit property "type" with the proper type (0) 
+PASS Event interface: new CustomEvent("foo") must inherit property "target" with the proper type (1) 
+PASS Event interface: new CustomEvent("foo") must inherit property "currentTarget" with the proper type (2) 
+PASS Event interface: new CustomEvent("foo") must inherit property "NONE" with the proper type (3) 
+PASS Event interface: new CustomEvent("foo") must inherit property "CAPTURING_PHASE" with the proper type (4) 
+PASS Event interface: new CustomEvent("foo") must inherit property "AT_TARGET" with the proper type (5) 
+PASS Event interface: new CustomEvent("foo") must inherit property "BUBBLING_PHASE" with the proper type (6) 
+PASS Event interface: new CustomEvent("foo") must inherit property "eventPhase" with the proper type (7) 
+PASS Event interface: new CustomEvent("foo") must inherit property "stopPropagation" with the proper type (8) 
+PASS Event interface: new CustomEvent("foo") must inherit property "stopImmediatePropagation" with the proper type (9) 
+PASS Event interface: new CustomEvent("foo") must inherit property "bubbles" with the proper type (10) 
+PASS Event interface: new CustomEvent("foo") must inherit property "cancelable" with the proper type (11) 
+PASS Event interface: new CustomEvent("foo") must inherit property "preventDefault" with the proper type (12) 
+PASS Event interface: new CustomEvent("foo") must inherit property "defaultPrevented" with the proper type (13) 
+PASS Event interface: new CustomEvent("foo") must have own property "isTrusted" 
+PASS Event interface: new CustomEvent("foo") must inherit property "timeStamp" with the proper type (15) 
+PASS Event interface: new CustomEvent("foo") must inherit property "initEvent" with the proper type (16) 
+PASS Event interface: calling initEvent(DOMString,boolean,boolean) on new CustomEvent("foo") with too few arguments must throw TypeError 
+PASS EventTarget interface: existence and properties of interface object 
+PASS EventTarget interface object length 
+PASS EventTarget interface object name 
+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) 
+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: 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 
+PASS EventListener interface: existence and properties of interface prototype object's "constructor" property 
+PASS EventListener interface: operation handleEvent(Event) 
+PASS NodeList interface: existence and properties of interface object 
+PASS NodeList interface object length 
+PASS NodeList interface object name 
+PASS NodeList interface: existence and properties of interface prototype object 
+PASS NodeList interface: existence and properties of interface prototype object's "constructor" property 
+PASS NodeList interface: operation item(unsigned long) 
+PASS NodeList interface: attribute length 
+PASS NodeList must be primary interface of document.querySelectorAll("script") 
+PASS Stringification of document.querySelectorAll("script") 
+PASS NodeList interface: document.querySelectorAll("script") must inherit property "item" with the proper type (0) 
+PASS NodeList interface: calling item(unsigned long) on document.querySelectorAll("script") with too few arguments must throw TypeError 
+PASS NodeList interface: document.querySelectorAll("script") must inherit property "length" with the proper type (1) 
+PASS HTMLCollection interface: existence and properties of interface object 
+PASS HTMLCollection interface object length 
+PASS HTMLCollection interface object name 
+PASS HTMLCollection interface: existence and properties of interface prototype object 
+PASS HTMLCollection interface: existence and properties of interface prototype object's "constructor" property 
+PASS HTMLCollection interface: attribute length 
+PASS HTMLCollection interface: operation item(unsigned long) 
+PASS HTMLCollection interface: operation namedItem(DOMString) 
+PASS HTMLCollection must be primary interface of document.body.children 
+PASS Stringification of document.body.children 
+PASS HTMLCollection interface: document.body.children must inherit property "length" with the proper type (0) 
+PASS HTMLCollection interface: document.body.children must inherit property "item" with the proper type (1) 
+PASS HTMLCollection interface: calling item(unsigned long) on document.body.children with too few arguments must throw TypeError 
+PASS HTMLCollection interface: document.body.children must inherit property "namedItem" with the proper type (2) 
+PASS HTMLCollection interface: calling namedItem(DOMString) on document.body.children with too few arguments must throw TypeError 
+PASS MutationObserver interface: existence and properties of interface object 
+PASS MutationObserver interface object length 
+PASS MutationObserver interface object name 
+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 disconnect() 
+PASS MutationObserver interface: operation takeRecords() 
+PASS MutationRecord interface: existence and properties of interface object 
+PASS MutationRecord interface object length 
+PASS MutationRecord interface object name 
+PASS MutationRecord interface: existence and properties of interface prototype object 
+PASS MutationRecord interface: existence and properties of interface prototype object's "constructor" property 
+PASS MutationRecord interface: attribute type 
+PASS MutationRecord interface: attribute target 
+PASS MutationRecord interface: attribute addedNodes 
+PASS MutationRecord interface: attribute removedNodes 
+PASS MutationRecord interface: attribute previousSibling 
+PASS MutationRecord interface: attribute nextSibling 
+PASS MutationRecord interface: attribute attributeName 
+PASS MutationRecord interface: attribute attributeNamespace 
+PASS MutationRecord interface: attribute oldValue 
+PASS Node interface: existence and properties of interface object 
+PASS Node interface object length 
+PASS Node interface object name 
+PASS Node interface: existence and properties of interface prototype object 
+PASS Node interface: existence and properties of interface prototype object's "constructor" property 
+PASS Node interface: constant ELEMENT_NODE on interface object 
+PASS Node interface: constant ELEMENT_NODE on interface prototype object 
+PASS Node interface: constant ATTRIBUTE_NODE on interface object 
+PASS Node interface: constant ATTRIBUTE_NODE on interface prototype object 
+PASS Node interface: constant TEXT_NODE on interface object 
+PASS Node interface: constant TEXT_NODE on interface prototype object 
+PASS Node interface: constant CDATA_SECTION_NODE on interface object 
+PASS Node interface: constant CDATA_SECTION_NODE on interface prototype object 
+PASS Node interface: constant ENTITY_REFERENCE_NODE on interface object 
+PASS Node interface: constant ENTITY_REFERENCE_NODE on interface prototype object 
+PASS Node interface: constant ENTITY_NODE on interface object 
+PASS Node interface: constant ENTITY_NODE on interface prototype object 
+PASS Node interface: constant PROCESSING_INSTRUCTION_NODE on interface object 
+PASS Node interface: constant PROCESSING_INSTRUCTION_NODE on interface prototype object 
+PASS Node interface: constant COMMENT_NODE on interface object 
+PASS Node interface: constant COMMENT_NODE on interface prototype object 
+PASS Node interface: constant DOCUMENT_NODE on interface object 
+PASS Node interface: constant DOCUMENT_NODE on interface prototype object 
+PASS Node interface: constant DOCUMENT_TYPE_NODE on interface object 
+PASS Node interface: constant DOCUMENT_TYPE_NODE on interface prototype object 
+PASS Node interface: constant DOCUMENT_FRAGMENT_NODE on interface object 
+PASS Node interface: constant DOCUMENT_FRAGMENT_NODE on interface prototype object 
+PASS Node interface: constant NOTATION_NODE on interface object 
+PASS Node interface: constant NOTATION_NODE on interface prototype object 
+PASS Node interface: attribute nodeType 
+PASS Node interface: attribute nodeName 
+PASS Node interface: attribute baseURI 
+PASS Node interface: attribute isConnected 
+PASS Node interface: attribute ownerDocument 
+PASS Node interface: operation getRootNode(GetRootNodeOptions) 
+PASS Node interface: attribute parentNode 
+PASS Node interface: attribute parentElement 
+PASS Node interface: operation hasChildNodes() 
+PASS Node interface: attribute childNodes 
+PASS Node interface: attribute firstChild 
+PASS Node interface: attribute lastChild 
+PASS Node interface: attribute previousSibling 
+PASS Node interface: attribute nextSibling 
+PASS Node interface: attribute nodeValue 
+PASS Node interface: attribute textContent 
+PASS Node interface: operation normalize() 
+PASS Node interface: operation cloneNode(boolean) 
+PASS Node interface: operation isEqualNode(Node) 
+PASS Node interface: operation isSameNode(Node) 
+PASS Node interface: constant DOCUMENT_POSITION_DISCONNECTED on interface object 
+PASS Node interface: constant DOCUMENT_POSITION_DISCONNECTED on interface prototype object 
+PASS Node interface: constant DOCUMENT_POSITION_PRECEDING on interface object 
+PASS Node interface: constant DOCUMENT_POSITION_PRECEDING on interface prototype object 
+PASS Node interface: constant DOCUMENT_POSITION_FOLLOWING on interface object 
+PASS Node interface: constant DOCUMENT_POSITION_FOLLOWING on interface prototype object 
+PASS Node interface: constant DOCUMENT_POSITION_CONTAINS on interface object 
+PASS Node interface: constant DOCUMENT_POSITION_CONTAINS on interface prototype object 
+PASS Node interface: constant DOCUMENT_POSITION_CONTAINED_BY on interface object 
+PASS Node interface: constant DOCUMENT_POSITION_CONTAINED_BY on interface prototype object 
+PASS Node interface: constant DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC on interface object 
+PASS Node interface: constant DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC on interface prototype object 
+PASS Node interface: operation compareDocumentPosition(Node) 
+PASS Node interface: operation contains(Node) 
+PASS Node interface: operation lookupPrefix(DOMString) 
+PASS Node interface: operation lookupNamespaceURI(DOMString) 
+PASS Node interface: operation isDefaultNamespace(DOMString) 
+PASS Node interface: operation insertBefore(Node,Node) 
+PASS Node interface: operation appendChild(Node) 
+PASS Node interface: operation replaceChild(Node,Node) 
+PASS Node interface: operation removeChild(Node) 
+PASS Document interface: existence and properties of interface object 
+PASS Document interface object length 
+PASS Document interface object name 
+PASS Document interface: existence and properties of interface prototype object 
+PASS Document interface: existence and properties of interface prototype object's "constructor" property 
+PASS Document interface: attribute implementation 
+PASS Document interface: attribute URL 
+PASS Document interface: attribute documentURI 
+PASS Document interface: attribute origin 
+PASS Document interface: attribute compatMode 
+PASS Document interface: attribute characterSet 
+PASS Document interface: attribute charset 
+PASS Document interface: attribute inputEncoding 
+PASS Document interface: attribute contentType 
+PASS Document interface: attribute doctype 
+PASS Document interface: attribute documentElement 
+PASS Document interface: operation getElementsByTagName(DOMString) 
+PASS Document interface: operation getElementsByTagNameNS(DOMString,DOMString) 
+PASS Document interface: operation getElementsByClassName(DOMString) 
+PASS Document interface: operation createElement(DOMString,ElementCreationOptions) 
+PASS Document interface: operation createElementNS(DOMString,DOMString,ElementCreationOptions) 
+PASS Document interface: operation createDocumentFragment() 
+PASS Document interface: operation createTextNode(DOMString) 
+PASS Document interface: operation createCDATASection(DOMString) 
+PASS Document interface: operation createComment(DOMString) 
+PASS Document interface: operation createProcessingInstruction(DOMString,DOMString) 
+PASS Document interface: operation importNode(Node,boolean) 
+PASS Document interface: operation adoptNode(Node) 
+PASS Document interface: operation createAttribute(DOMString) 
+PASS Document interface: operation createAttributeNS(DOMString,DOMString) 
+PASS Document interface: operation createEvent(DOMString) 
+PASS Document interface: operation createRange() 
+PASS Document interface: operation createNodeIterator(Node,unsigned long,NodeFilter) 
+PASS Document interface: operation createTreeWalker(Node,unsigned long,NodeFilter) 
+PASS Document interface: operation getElementById(DOMString) 
+PASS Document interface: attribute children 
+PASS Document interface: attribute firstElementChild 
+PASS Document interface: attribute lastElementChild 
+PASS Document interface: attribute childElementCount 
+PASS Document interface: operation prepend([object Object],[object Object]) 
+PASS Document interface: operation append([object Object],[object Object]) 
+PASS Document interface: operation querySelector(DOMString) 
+PASS Document interface: operation querySelectorAll(DOMString) 
+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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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 
+PASS XMLDocument interface object name 
+PASS XMLDocument interface: existence and properties of interface prototype object 
+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: calling getElementsByTagName(DOMString) on xmlDoc with too few arguments must throw TypeError 
+PASS Document interface: xmlDoc must inherit property "getElementsByTagNameNS" with the proper type (12) 
+PASS Document interface: calling getElementsByTagNameNS(DOMString,DOMString) on xmlDoc with too few arguments must throw TypeError 
+PASS Document interface: xmlDoc must inherit property "getElementsByClassName" with the proper type (13) 
+PASS Document interface: calling getElementsByClassName(DOMString) on xmlDoc with too few arguments must throw TypeError 
+PASS Document interface: xmlDoc must inherit property "createElement" with the proper type (14) 
+PASS Document interface: calling createElement(DOMString,ElementCreationOptions) on xmlDoc with too few arguments must throw TypeError 
+PASS Document interface: xmlDoc must inherit property "createElementNS" with the proper type (15) 
+PASS Document interface: calling createElementNS(DOMString,DOMString,ElementCreationOptions) on xmlDoc with too few arguments must throw TypeError 
+PASS Document interface: xmlDoc must inherit property "createDocumentFragment" with the proper type (16) 
+PASS Document interface: xmlDoc must inherit property "createTextNode" with the proper type (17) 
+PASS Document interface: calling createTextNode(DOMString) on xmlDoc with too few arguments must throw TypeError 
+PASS Document interface: xmlDoc must inherit property "createCDATASection" with the proper type (18) 
+PASS Document interface: calling createCDATASection(DOMString) on xmlDoc with too few arguments must throw TypeError 
+PASS Document interface: xmlDoc must inherit property "createComment" with the proper type (19) 
+PASS Document interface: calling createComment(DOMString) on xmlDoc with too few arguments must throw TypeError 
+PASS Document interface: xmlDoc must inherit property "createProcessingInstruction" with the proper type (20) 
+PASS Document interface: calling createProcessingInstruction(DOMString,DOMString) on xmlDoc with too few arguments must throw TypeError 
+PASS Document interface: xmlDoc must inherit property "importNode" with the proper type (21) 
+PASS Document interface: calling importNode(Node,boolean) on xmlDoc with too few arguments must throw TypeError 
+PASS Document interface: xmlDoc must inherit property "adoptNode" with the proper type (22) 
+PASS Document interface: calling adoptNode(Node) on xmlDoc with too few arguments must throw TypeError 
+PASS Document interface: xmlDoc must inherit property "createAttribute" with the proper type (23) 
+PASS Document interface: calling createAttribute(DOMString) on xmlDoc with too few arguments must throw TypeError 
+PASS Document interface: xmlDoc must inherit property "createAttributeNS" with the proper type (24) 
+PASS Document interface: calling createAttributeNS(DOMString,DOMString) on xmlDoc with too few arguments must throw TypeError 
+PASS Document interface: xmlDoc must inherit property "createEvent" with the proper type (25) 
+PASS Document interface: calling createEvent(DOMString) on xmlDoc with too few arguments must throw TypeError 
+PASS Document interface: xmlDoc must inherit property "createRange" with the proper type (26) 
+PASS Document interface: xmlDoc must inherit property "createNodeIterator" with the proper type (27) 
+PASS Document interface: calling createNodeIterator(Node,unsigned long,NodeFilter) on xmlDoc with too few arguments must throw TypeError 
+PASS Document interface: xmlDoc must inherit property "createTreeWalker" with the proper type (28) 
+PASS Document interface: calling createTreeWalker(Node,unsigned long,NodeFilter) on xmlDoc with too few arguments must throw TypeError 
+PASS Document interface: xmlDoc must inherit property "getElementById" with the proper type (29) 
+PASS Document interface: calling getElementById(DOMString) on xmlDoc with too few arguments must throw TypeError 
+PASS Document interface: xmlDoc must inherit property "children" with the proper type (30) 
+PASS Document interface: xmlDoc must inherit property "firstElementChild" with the proper type (31) 
+PASS Document interface: xmlDoc must inherit property "lastElementChild" with the proper type (32) 
+PASS Document interface: xmlDoc must inherit property "childElementCount" with the proper type (33) 
+PASS Document interface: xmlDoc must inherit property "prepend" with the proper type (34) 
+PASS Document interface: calling prepend([object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError 
+PASS Document interface: xmlDoc must inherit property "append" with the proper type (35) 
+PASS Document interface: calling append([object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError 
+PASS Document interface: xmlDoc must inherit property "querySelector" with the proper type (36) 
+PASS Document interface: calling querySelector(DOMString) on xmlDoc with too few arguments must throw TypeError 
+PASS Document interface: xmlDoc must inherit property "querySelectorAll" with the proper type (37) 
+PASS Document interface: calling querySelectorAll(DOMString) on xmlDoc with too few arguments must throw TypeError 
+PASS Node interface: xmlDoc must inherit property "ELEMENT_NODE" with the proper type (0) 
+PASS Node interface: xmlDoc must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
+PASS Node interface: xmlDoc must inherit property "TEXT_NODE" with the proper type (2) 
+PASS Node interface: xmlDoc must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
+PASS Node interface: xmlDoc must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
+PASS Node interface: xmlDoc must inherit property "ENTITY_NODE" with the proper type (5) 
+PASS Node interface: xmlDoc must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
+PASS Node interface: xmlDoc must inherit property "COMMENT_NODE" with the proper type (7) 
+PASS Node interface: xmlDoc must inherit property "DOCUMENT_NODE" with the proper type (8) 
+PASS Node interface: xmlDoc must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
+PASS Node interface: xmlDoc must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
+PASS Node interface: xmlDoc must inherit property "NOTATION_NODE" with the proper type (11) 
+PASS Node interface: xmlDoc must inherit property "nodeType" with the proper type (12) 
+PASS Node interface: xmlDoc must inherit property "nodeName" with the proper type (13) 
+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: calling getRootNode(GetRootNodeOptions) on xmlDoc with too few arguments must throw TypeError 
+PASS Node interface: xmlDoc must inherit property "parentNode" with the proper type (18) 
+PASS Node interface: xmlDoc must inherit property "parentElement" with the proper type (19) 
+PASS Node interface: xmlDoc must inherit property "hasChildNodes" with the proper type (20) 
+PASS Node interface: xmlDoc must inherit property "childNodes" with the proper type (21) 
+PASS Node interface: xmlDoc must inherit property "firstChild" with the proper type (22) 
+PASS Node interface: xmlDoc must inherit property "lastChild" with the proper type (23) 
+PASS Node interface: xmlDoc must inherit property "previousSibling" with the proper type (24) 
+PASS Node interface: xmlDoc must inherit property "nextSibling" with the proper type (25) 
+PASS Node interface: xmlDoc must inherit property "nodeValue" with the proper type (26) 
+PASS Node interface: xmlDoc must inherit property "textContent" with the proper type (27) 
+PASS Node interface: xmlDoc must inherit property "normalize" with the proper type (28) 
+PASS Node interface: xmlDoc must inherit property "cloneNode" with the proper type (29) 
+PASS Node interface: calling cloneNode(boolean) on xmlDoc with too few arguments must throw TypeError 
+PASS Node interface: xmlDoc must inherit property "isEqualNode" with the proper type (30) 
+PASS Node interface: calling isEqualNode(Node) on xmlDoc with too few arguments must throw TypeError 
+PASS Node interface: xmlDoc must inherit property "isSameNode" with the proper type (31) 
+PASS Node interface: calling isSameNode(Node) on xmlDoc with too few arguments must throw TypeError 
+PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
+PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
+PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
+PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
+PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
+PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
+PASS Node interface: xmlDoc must inherit property "compareDocumentPosition" with the proper type (38) 
+PASS Node interface: calling compareDocumentPosition(Node) on xmlDoc with too few arguments must throw TypeError 
+PASS Node interface: xmlDoc must inherit property "contains" with the proper type (39) 
+PASS Node interface: calling contains(Node) on xmlDoc with too few arguments must throw TypeError 
+PASS Node interface: xmlDoc must inherit property "lookupPrefix" with the proper type (40) 
+PASS Node interface: calling lookupPrefix(DOMString) on xmlDoc with too few arguments must throw TypeError 
+PASS Node interface: xmlDoc must inherit property "lookupNamespaceURI" with the proper type (41) 
+PASS Node interface: calling lookupNamespaceURI(DOMString) on xmlDoc with too few arguments must throw TypeError 
+PASS Node interface: xmlDoc must inherit property "isDefaultNamespace" with the proper type (42) 
+PASS Node interface: calling isDefaultNamespace(DOMString) on xmlDoc with too few arguments must throw TypeError 
+PASS Node interface: xmlDoc must inherit property "insertBefore" with the proper type (43) 
+PASS Node interface: calling insertBefore(Node,Node) on xmlDoc with too few arguments must throw TypeError 
+PASS Node interface: xmlDoc must inherit property "appendChild" with the proper type (44) 
+PASS Node interface: calling appendChild(Node) on xmlDoc with too few arguments must throw TypeError 
+PASS Node interface: xmlDoc must inherit property "replaceChild" with the proper type (45) 
+PASS Node interface: calling replaceChild(Node,Node) on xmlDoc with too few arguments must throw TypeError 
+PASS Node interface: xmlDoc must inherit property "removeChild" with the proper type (46) 
+PASS Node interface: calling removeChild(Node) on xmlDoc with too few arguments must throw TypeError 
+PASS EventTarget interface: xmlDoc must inherit property "addEventListener" with the proper type (0) 
+PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError 
+PASS EventTarget interface: xmlDoc must inherit property "removeEventListener" with the proper type (1) 
+PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError 
+PASS EventTarget interface: xmlDoc must inherit property "dispatchEvent" with the proper type (2) 
+PASS EventTarget interface: calling dispatchEvent(Event) on xmlDoc with too few arguments must throw TypeError 
+PASS DOMImplementation interface: existence and properties of interface object 
+PASS DOMImplementation interface object length 
+PASS DOMImplementation interface object name 
+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 createHTMLDocument(DOMString) 
+PASS DOMImplementation interface: operation hasFeature() 
+PASS DOMImplementation must be primary interface of document.implementation 
+PASS Stringification of document.implementation 
+PASS DOMImplementation interface: document.implementation must inherit property "createDocumentType" with the proper type (0) 
+PASS DOMImplementation interface: calling createDocumentType(DOMString,DOMString,DOMString) on document.implementation with too few arguments must throw TypeError 
+PASS DOMImplementation interface: document.implementation must inherit property "createDocument" with the proper type (1) 
+PASS DOMImplementation interface: calling createDocument(DOMString,DOMString,DocumentType) on document.implementation with too few arguments must throw TypeError 
+PASS DOMImplementation interface: document.implementation must inherit property "createHTMLDocument" with the proper type (2) 
+PASS DOMImplementation interface: calling createHTMLDocument(DOMString) on document.implementation with too few arguments must throw TypeError 
+PASS DOMImplementation interface: document.implementation must inherit property "hasFeature" with the proper type (3) 
+PASS DocumentType interface: existence and properties of interface object 
+PASS DocumentType interface object length 
+PASS DocumentType interface object name 
+PASS DocumentType interface: existence and properties of interface prototype object 
+PASS DocumentType interface: existence and properties of interface prototype object's "constructor" property 
+PASS DocumentType interface: attribute name 
+PASS DocumentType interface: attribute publicId 
+PASS DocumentType interface: attribute systemId 
+PASS DocumentType interface: operation before([object Object],[object Object]) 
+PASS DocumentType interface: operation after([object Object],[object Object]) 
+PASS DocumentType interface: operation replaceWith([object Object],[object Object]) 
+PASS DocumentType interface: operation remove() 
+PASS DocumentType must be primary interface of document.doctype 
+PASS Stringification of document.doctype 
+PASS DocumentType interface: document.doctype must inherit property "name" with the proper type (0) 
+PASS DocumentType interface: document.doctype must inherit property "publicId" with the proper type (1) 
+PASS DocumentType interface: document.doctype must inherit property "systemId" with the proper type (2) 
+PASS DocumentType interface: document.doctype must inherit property "before" with the proper type (3) 
+PASS DocumentType interface: calling before([object Object],[object Object]) on document.doctype with too few arguments must throw TypeError 
+PASS DocumentType interface: document.doctype must inherit property "after" with the proper type (4) 
+PASS DocumentType interface: calling after([object Object],[object Object]) on document.doctype with too few arguments must throw TypeError 
+PASS DocumentType interface: document.doctype must inherit property "replaceWith" with the proper type (5) 
+PASS DocumentType interface: calling replaceWith([object Object],[object Object]) on document.doctype with too few arguments must throw TypeError 
+PASS DocumentType interface: document.doctype must inherit property "remove" with the proper type (6) 
+PASS Node interface: document.doctype must inherit property "ELEMENT_NODE" with the proper type (0) 
+PASS Node interface: document.doctype must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
+PASS Node interface: document.doctype must inherit property "TEXT_NODE" with the proper type (2) 
+PASS Node interface: document.doctype must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
+PASS Node interface: document.doctype must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
+PASS Node interface: document.doctype must inherit property "ENTITY_NODE" with the proper type (5) 
+PASS Node interface: document.doctype must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
+PASS Node interface: document.doctype must inherit property "COMMENT_NODE" with the proper type (7) 
+PASS Node interface: document.doctype must inherit property "DOCUMENT_NODE" with the proper type (8) 
+PASS Node interface: document.doctype must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
+PASS Node interface: document.doctype must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
+PASS Node interface: document.doctype must inherit property "NOTATION_NODE" with the proper type (11) 
+PASS Node interface: document.doctype must inherit property "nodeType" with the proper type (12) 
+PASS Node interface: document.doctype must inherit property "nodeName" with the proper type (13) 
+PASS Node interface: document.doctype must inherit property "baseURI" with the proper type (14) 
+PASS Node interface: document.doctype must inherit property "isConnected" with the proper type (15) 
+PASS Node interface: document.doctype must inherit property "ownerDocument" with the proper type (16) 
+PASS Node interface: document.doctype must inherit property "getRootNode" with the proper type (17) 
+PASS Node interface: calling getRootNode(GetRootNodeOptions) on document.doctype with too few arguments must throw TypeError 
+PASS Node interface: document.doctype must inherit property "parentNode" with the proper type (18) 
+PASS Node interface: document.doctype must inherit property "parentElement" with the proper type (19) 
+PASS Node interface: document.doctype must inherit property "hasChildNodes" with the proper type (20) 
+PASS Node interface: document.doctype must inherit property "childNodes" with the proper type (21) 
+PASS Node interface: document.doctype must inherit property "firstChild" with the proper type (22) 
+PASS Node interface: document.doctype must inherit property "lastChild" with the proper type (23) 
+PASS Node interface: document.doctype must inherit property "previousSibling" with the proper type (24) 
+PASS Node interface: document.doctype must inherit property "nextSibling" with the proper type (25) 
+PASS Node interface: document.doctype must inherit property "nodeValue" with the proper type (26) 
+PASS Node interface: document.doctype must inherit property "textContent" with the proper type (27) 
+PASS Node interface: document.doctype must inherit property "normalize" with the proper type (28) 
+PASS Node interface: document.doctype must inherit property "cloneNode" with the proper type (29) 
+PASS Node interface: calling cloneNode(boolean) on document.doctype with too few arguments must throw TypeError 
+PASS Node interface: document.doctype must inherit property "isEqualNode" with the proper type (30) 
+PASS Node interface: calling isEqualNode(Node) on document.doctype with too few arguments must throw TypeError 
+PASS Node interface: document.doctype must inherit property "isSameNode" with the proper type (31) 
+PASS Node interface: calling isSameNode(Node) on document.doctype with too few arguments must throw TypeError 
+PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
+PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
+PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
+PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
+PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
+PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
+PASS Node interface: document.doctype must inherit property "compareDocumentPosition" with the proper type (38) 
+PASS Node interface: calling compareDocumentPosition(Node) on document.doctype with too few arguments must throw TypeError 
+PASS Node interface: document.doctype must inherit property "contains" with the proper type (39) 
+PASS Node interface: calling contains(Node) on document.doctype with too few arguments must throw TypeError 
+PASS Node interface: document.doctype must inherit property "lookupPrefix" with the proper type (40) 
+PASS Node interface: calling lookupPrefix(DOMString) on document.doctype with too few arguments must throw TypeError 
+PASS Node interface: document.doctype must inherit property "lookupNamespaceURI" with the proper type (41) 
+PASS Node interface: calling lookupNamespaceURI(DOMString) on document.doctype with too few arguments must throw TypeError 
+PASS Node interface: document.doctype must inherit property "isDefaultNamespace" with the proper type (42) 
+PASS Node interface: calling isDefaultNamespace(DOMString) on document.doctype with too few arguments must throw TypeError 
+PASS Node interface: document.doctype must inherit property "insertBefore" with the proper type (43) 
+PASS Node interface: calling insertBefore(Node,Node) on document.doctype with too few arguments must throw TypeError 
+PASS Node interface: document.doctype must inherit property "appendChild" with the proper type (44) 
+PASS Node interface: calling appendChild(Node) on document.doctype with too few arguments must throw TypeError 
+PASS Node interface: document.doctype must inherit property "replaceChild" with the proper type (45) 
+PASS Node interface: calling replaceChild(Node,Node) on document.doctype with too few arguments must throw TypeError 
+PASS Node interface: document.doctype must inherit property "removeChild" with the proper type (46) 
+PASS Node interface: calling removeChild(Node) on document.doctype with too few arguments must throw TypeError 
+PASS EventTarget interface: document.doctype must inherit property "addEventListener" with the proper type (0) 
+PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on document.doctype with too few arguments must throw TypeError 
+PASS EventTarget interface: document.doctype must inherit property "removeEventListener" with the proper type (1) 
+PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on document.doctype with too few arguments must throw TypeError 
+PASS EventTarget interface: document.doctype must inherit property "dispatchEvent" with the proper type (2) 
+PASS EventTarget interface: calling dispatchEvent(Event) on document.doctype with too few arguments must throw TypeError 
+PASS DocumentFragment interface: existence and properties of interface object 
+PASS DocumentFragment interface object length 
+PASS DocumentFragment interface object name 
+PASS DocumentFragment interface: existence and properties of interface prototype object 
+PASS DocumentFragment interface: existence and properties of interface prototype object's "constructor" property 
+PASS DocumentFragment interface: operation getElementById(DOMString) 
+PASS DocumentFragment interface: attribute children 
+PASS DocumentFragment interface: attribute firstElementChild 
+PASS DocumentFragment interface: attribute lastElementChild 
+PASS DocumentFragment interface: attribute childElementCount 
+PASS DocumentFragment interface: operation prepend([object Object],[object Object]) 
+PASS DocumentFragment interface: operation append([object Object],[object Object]) 
+PASS DocumentFragment interface: operation querySelector(DOMString) 
+PASS DocumentFragment interface: operation querySelectorAll(DOMString) 
+PASS DocumentFragment must be primary interface of document.createDocumentFragment() 
+PASS Stringification of document.createDocumentFragment() 
+PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "getElementById" with the proper type (0) 
+PASS DocumentFragment interface: calling getElementById(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError 
+PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "children" with the proper type (1) 
+PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "firstElementChild" with the proper type (2) 
+PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "lastElementChild" with the proper type (3) 
+PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "childElementCount" with the proper type (4) 
+PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "prepend" with the proper type (5) 
+PASS DocumentFragment interface: calling prepend([object Object],[object Object]) on document.createDocumentFragment() with too few arguments must throw TypeError 
+PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "append" with the proper type (6) 
+PASS DocumentFragment interface: calling append([object Object],[object Object]) on document.createDocumentFragment() with too few arguments must throw TypeError 
+PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "querySelector" with the proper type (7) 
+PASS DocumentFragment interface: calling querySelector(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError 
+PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "querySelectorAll" with the proper type (8) 
+PASS DocumentFragment interface: calling querySelectorAll(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError 
+PASS Node interface: document.createDocumentFragment() must inherit property "ELEMENT_NODE" with the proper type (0) 
+PASS Node interface: document.createDocumentFragment() must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
+PASS Node interface: document.createDocumentFragment() must inherit property "TEXT_NODE" with the proper type (2) 
+PASS Node interface: document.createDocumentFragment() must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
+PASS Node interface: document.createDocumentFragment() must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
+PASS Node interface: document.createDocumentFragment() must inherit property "ENTITY_NODE" with the proper type (5) 
+PASS Node interface: document.createDocumentFragment() must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
+PASS Node interface: document.createDocumentFragment() must inherit property "COMMENT_NODE" with the proper type (7) 
+PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_NODE" with the proper type (8) 
+PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
+PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
+PASS Node interface: document.createDocumentFragment() must inherit property "NOTATION_NODE" with the proper type (11) 
+PASS Node interface: document.createDocumentFragment() must inherit property "nodeType" with the proper type (12) 
+PASS Node interface: document.createDocumentFragment() must inherit property "nodeName" with the proper type (13) 
+PASS Node interface: document.createDocumentFragment() must inherit property "baseURI" with the proper type (14) 
+PASS Node interface: document.createDocumentFragment() must inherit property "isConnected" with the proper type (15) 
+PASS Node interface: document.createDocumentFragment() must inherit property "ownerDocument" with the proper type (16) 
+PASS Node interface: document.createDocumentFragment() must inherit property "getRootNode" with the proper type (17) 
+PASS Node interface: calling getRootNode(GetRootNodeOptions) on document.createDocumentFragment() with too few arguments must throw TypeError 
+PASS Node interface: document.createDocumentFragment() must inherit property "parentNode" with the proper type (18) 
+PASS Node interface: document.createDocumentFragment() must inherit property "parentElement" with the proper type (19) 
+PASS Node interface: document.createDocumentFragment() must inherit property "hasChildNodes" with the proper type (20) 
+PASS Node interface: document.createDocumentFragment() must inherit property "childNodes" with the proper type (21) 
+PASS Node interface: document.createDocumentFragment() must inherit property "firstChild" with the proper type (22) 
+PASS Node interface: document.createDocumentFragment() must inherit property "lastChild" with the proper type (23) 
+PASS Node interface: document.createDocumentFragment() must inherit property "previousSibling" with the proper type (24) 
+PASS Node interface: document.createDocumentFragment() must inherit property "nextSibling" with the proper type (25) 
+PASS Node interface: document.createDocumentFragment() must inherit property "nodeValue" with the proper type (26) 
+PASS Node interface: document.createDocumentFragment() must inherit property "textContent" with the proper type (27) 
+PASS Node interface: document.createDocumentFragment() must inherit property "normalize" with the proper type (28) 
+PASS Node interface: document.createDocumentFragment() must inherit property "cloneNode" with the proper type (29) 
+PASS Node interface: calling cloneNode(boolean) on document.createDocumentFragment() with too few arguments must throw TypeError 
+PASS Node interface: document.createDocumentFragment() must inherit property "isEqualNode" with the proper type (30) 
+PASS Node interface: calling isEqualNode(Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
+PASS Node interface: document.createDocumentFragment() must inherit property "isSameNode" with the proper type (31) 
+PASS Node interface: calling isSameNode(Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
+PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
+PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
+PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
+PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
+PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
+PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
+PASS Node interface: document.createDocumentFragment() must inherit property "compareDocumentPosition" with the proper type (38) 
+PASS Node interface: calling compareDocumentPosition(Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
+PASS Node interface: document.createDocumentFragment() must inherit property "contains" with the proper type (39) 
+PASS Node interface: calling contains(Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
+PASS Node interface: document.createDocumentFragment() must inherit property "lookupPrefix" with the proper type (40) 
+PASS Node interface: calling lookupPrefix(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError 
+PASS Node interface: document.createDocumentFragment() must inherit property "lookupNamespaceURI" with the proper type (41) 
+PASS Node interface: calling lookupNamespaceURI(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError 
+PASS Node interface: document.createDocumentFragment() must inherit property "isDefaultNamespace" with the proper type (42) 
+PASS Node interface: calling isDefaultNamespace(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError 
+PASS Node interface: document.createDocumentFragment() must inherit property "insertBefore" with the proper type (43) 
+PASS Node interface: calling insertBefore(Node,Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
+PASS Node interface: document.createDocumentFragment() must inherit property "appendChild" with the proper type (44) 
+PASS Node interface: calling appendChild(Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
+PASS Node interface: document.createDocumentFragment() must inherit property "replaceChild" with the proper type (45) 
+PASS Node interface: calling replaceChild(Node,Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
+PASS Node interface: document.createDocumentFragment() must inherit property "removeChild" with the proper type (46) 
+PASS Node interface: calling removeChild(Node) on document.createDocumentFragment() with too few arguments must throw TypeError 
+PASS EventTarget interface: document.createDocumentFragment() must inherit property "addEventListener" with the proper type (0) 
+PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createDocumentFragment() with too few arguments must throw TypeError 
+PASS EventTarget interface: document.createDocumentFragment() must inherit property "removeEventListener" with the proper type (1) 
+PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createDocumentFragment() with too few arguments must throw TypeError 
+PASS EventTarget interface: document.createDocumentFragment() must inherit property "dispatchEvent" with the proper type (2) 
+PASS EventTarget interface: calling dispatchEvent(Event) on document.createDocumentFragment() with too few arguments must throw TypeError 
+PASS ShadowRoot interface: existence and properties of interface object 
+PASS ShadowRoot interface object length 
+PASS ShadowRoot interface object name 
+PASS ShadowRoot interface: existence and properties of interface prototype object 
+PASS ShadowRoot interface: existence and properties of interface prototype object's "constructor" property 
+PASS ShadowRoot interface: attribute mode 
+PASS ShadowRoot interface: attribute host 
+PASS Element interface: existence and properties of interface object 
+PASS Element interface object length 
+PASS Element interface object name 
+PASS Element interface: existence and properties of interface prototype object 
+PASS Element interface: existence and properties of interface prototype object's "constructor" property 
+PASS Element interface: attribute namespaceURI 
+PASS Element interface: attribute prefix 
+PASS Element interface: attribute localName 
+PASS Element interface: attribute tagName 
+PASS Element interface: attribute id 
+PASS Element interface: attribute className 
+PASS Element interface: attribute classList 
+PASS Element interface: attribute slot 
+PASS Element interface: operation hasAttributes() 
+PASS Element interface: attribute attributes 
+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 removeAttribute(DOMString) 
+PASS Element interface: operation removeAttributeNS(DOMString,DOMString) 
+PASS Element interface: operation hasAttribute(DOMString) 
+PASS Element interface: operation hasAttributeNS(DOMString,DOMString) 
+PASS Element interface: operation getAttributeNode(DOMString) 
+PASS Element interface: operation getAttributeNodeNS(DOMString,DOMString) 
+PASS Element interface: operation setAttributeNode(Attr) 
+PASS Element interface: operation setAttributeNodeNS(Attr) 
+PASS Element interface: operation removeAttributeNode(Attr) 
+PASS Element interface: operation attachShadow(ShadowRootInit) 
+PASS Element interface: attribute shadowRoot 
+PASS Element interface: operation closest(DOMString) 
+PASS Element interface: operation matches(DOMString) 
+PASS Element interface: operation webkitMatchesSelector(DOMString) 
+PASS Element interface: operation getElementsByTagName(DOMString) 
+PASS Element interface: operation getElementsByTagNameNS(DOMString,DOMString) 
+PASS Element interface: operation getElementsByClassName(DOMString) 
+PASS Element interface: operation insertAdjacentElement(DOMString,Element) 
+PASS Element interface: operation insertAdjacentText(DOMString,DOMString) 
+PASS Element interface: attribute children 
+PASS Element interface: attribute firstElementChild 
+PASS Element interface: attribute lastElementChild 
+PASS Element interface: attribute childElementCount 
+PASS Element interface: operation prepend([object Object],[object Object]) 
+PASS Element interface: operation append([object Object],[object Object]) 
+PASS Element interface: operation querySelector(DOMString) 
+PASS Element interface: operation querySelectorAll(DOMString) 
+PASS Element interface: attribute previousElementSibling 
+PASS Element interface: attribute nextElementSibling 
+PASS Element interface: operation before([object Object],[object Object]) 
+PASS Element interface: operation after([object Object],[object Object]) 
+PASS Element interface: operation replaceWith([object Object],[object Object]) 
+PASS Element interface: operation remove() 
+PASS Element interface: attribute assignedSlot 
+PASS Element must be primary interface of element 
+PASS Stringification of element 
+PASS Element interface: element must inherit property "namespaceURI" with the proper type (0) 
+PASS Element interface: element must inherit property "prefix" with the proper type (1) 
+PASS Element interface: element must inherit property "localName" with the proper type (2) 
+PASS Element interface: element must inherit property "tagName" with the proper type (3) 
+PASS Element interface: element must inherit property "id" with the proper type (4) 
+PASS Element interface: element must inherit property "className" with the proper type (5) 
+PASS Element interface: element must inherit property "classList" with the proper type (6) 
+PASS Element interface: element must inherit property "slot" with the proper type (7) 
+PASS Element interface: element must inherit property "hasAttributes" with the proper type (8) 
+PASS Element interface: element must inherit property "attributes" with the proper type (9) 
+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: calling getAttribute(DOMString) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "getAttributeNS" with the proper type (12) 
+PASS Element interface: calling getAttributeNS(DOMString,DOMString) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "setAttribute" with the proper type (13) 
+PASS Element interface: calling setAttribute(DOMString,DOMString) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "setAttributeNS" with the proper type (14) 
+PASS Element interface: calling setAttributeNS(DOMString,DOMString,DOMString) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "removeAttribute" with the proper type (15) 
+PASS Element interface: calling removeAttribute(DOMString) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "removeAttributeNS" with the proper type (16) 
+PASS Element interface: calling removeAttributeNS(DOMString,DOMString) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "hasAttribute" with the proper type (17) 
+PASS Element interface: calling hasAttribute(DOMString) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "hasAttributeNS" with the proper type (18) 
+PASS Element interface: calling hasAttributeNS(DOMString,DOMString) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "getAttributeNode" with the proper type (19) 
+PASS Element interface: calling getAttributeNode(DOMString) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "getAttributeNodeNS" with the proper type (20) 
+PASS Element interface: calling getAttributeNodeNS(DOMString,DOMString) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "setAttributeNode" with the proper type (21) 
+PASS Element interface: calling setAttributeNode(Attr) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "setAttributeNodeNS" with the proper type (22) 
+PASS Element interface: calling setAttributeNodeNS(Attr) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "removeAttributeNode" with the proper type (23) 
+PASS Element interface: calling removeAttributeNode(Attr) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "attachShadow" with the proper type (24) 
+PASS Element interface: calling attachShadow(ShadowRootInit) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "shadowRoot" with the proper type (25) 
+PASS Element interface: element must inherit property "closest" with the proper type (26) 
+PASS Element interface: calling closest(DOMString) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "matches" with the proper type (27) 
+PASS Element interface: calling matches(DOMString) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "webkitMatchesSelector" with the proper type (28) 
+PASS Element interface: calling webkitMatchesSelector(DOMString) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "getElementsByTagName" with the proper type (29) 
+PASS Element interface: calling getElementsByTagName(DOMString) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "getElementsByTagNameNS" with the proper type (30) 
+PASS Element interface: calling getElementsByTagNameNS(DOMString,DOMString) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "getElementsByClassName" with the proper type (31) 
+PASS Element interface: calling getElementsByClassName(DOMString) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "insertAdjacentElement" with the proper type (32) 
+PASS Element interface: calling insertAdjacentElement(DOMString,Element) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "insertAdjacentText" with the proper type (33) 
+PASS Element interface: calling insertAdjacentText(DOMString,DOMString) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "children" with the proper type (34) 
+PASS Element interface: element must inherit property "firstElementChild" with the proper type (35) 
+PASS Element interface: element must inherit property "lastElementChild" with the proper type (36) 
+PASS Element interface: element must inherit property "childElementCount" with the proper type (37) 
+PASS Element interface: element must inherit property "prepend" with the proper type (38) 
+PASS Element interface: calling prepend([object Object],[object Object]) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "append" with the proper type (39) 
+PASS Element interface: calling append([object Object],[object Object]) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "querySelector" with the proper type (40) 
+PASS Element interface: calling querySelector(DOMString) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "querySelectorAll" with the proper type (41) 
+PASS Element interface: calling querySelectorAll(DOMString) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "previousElementSibling" with the proper type (42) 
+PASS Element interface: element must inherit property "nextElementSibling" with the proper type (43) 
+PASS Element interface: element must inherit property "before" with the proper type (44) 
+PASS Element interface: calling before([object Object],[object Object]) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "after" with the proper type (45) 
+PASS Element interface: calling after([object Object],[object Object]) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "replaceWith" with the proper type (46) 
+PASS Element interface: calling replaceWith([object Object],[object Object]) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "remove" with the proper type (47) 
+PASS Element interface: element must inherit property "assignedSlot" with the proper type (48) 
+PASS Node interface: element must inherit property "ELEMENT_NODE" with the proper type (0) 
+PASS Node interface: element must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
+PASS Node interface: element must inherit property "TEXT_NODE" with the proper type (2) 
+PASS Node interface: element must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
+PASS Node interface: element must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
+PASS Node interface: element must inherit property "ENTITY_NODE" with the proper type (5) 
+PASS Node interface: element must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
+PASS Node interface: element must inherit property "COMMENT_NODE" with the proper type (7) 
+PASS Node interface: element must inherit property "DOCUMENT_NODE" with the proper type (8) 
+PASS Node interface: element must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
+PASS Node interface: element must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
+PASS Node interface: element must inherit property "NOTATION_NODE" with the proper type (11) 
+PASS Node interface: element must inherit property "nodeType" with the proper type (12) 
+PASS Node interface: element must inherit property "nodeName" with the proper type (13) 
+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 Node interface: calling getRootNode(GetRootNodeOptions) on element with too few arguments must throw TypeError 
+PASS Node interface: element must inherit property "parentNode" with the proper type (18) 
+PASS Node interface: element must inherit property "parentElement" with the proper type (19) 
+PASS Node interface: element must inherit property "hasChildNodes" with the proper type (20) 
+PASS Node interface: element must inherit property "childNodes" with the proper type (21) 
+PASS Node interface: element must inherit property "firstChild" with the proper type (22) 
+PASS Node interface: element must inherit property "lastChild" with the proper type (23) 
+PASS Node interface: element must inherit property "previousSibling" with the proper type (24) 
+PASS Node interface: element must inherit property "nextSibling" with the proper type (25) 
+PASS Node interface: element must inherit property "nodeValue" with the proper type (26) 
+PASS Node interface: element must inherit property "textContent" with the proper type (27) 
+PASS Node interface: element must inherit property "normalize" with the proper type (28) 
+PASS Node interface: element must inherit property "cloneNode" with the proper type (29) 
+PASS Node interface: calling cloneNode(boolean) on element with too few arguments must throw TypeError 
+PASS Node interface: element must inherit property "isEqualNode" with the proper type (30) 
+PASS Node interface: calling isEqualNode(Node) on element with too few arguments must throw TypeError 
+PASS Node interface: element must inherit property "isSameNode" with the proper type (31) 
+PASS Node interface: calling isSameNode(Node) on element with too few arguments must throw TypeError 
+PASS Node interface: element must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
+PASS Node interface: element must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
+PASS Node interface: element must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
+PASS Node interface: element must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
+PASS Node interface: element must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
+PASS Node interface: element must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
+PASS Node interface: element must inherit property "compareDocumentPosition" with the proper type (38) 
+PASS Node interface: calling compareDocumentPosition(Node) on element with too few arguments must throw TypeError 
+PASS Node interface: element must inherit property "contains" with the proper type (39) 
+PASS Node interface: calling contains(Node) on element with too few arguments must throw TypeError 
+PASS Node interface: element must inherit property "lookupPrefix" with the proper type (40) 
+PASS Node interface: calling lookupPrefix(DOMString) on element with too few arguments must throw TypeError 
+PASS Node interface: element must inherit property "lookupNamespaceURI" with the proper type (41) 
+PASS Node interface: calling lookupNamespaceURI(DOMString) on element with too few arguments must throw TypeError 
+PASS Node interface: element must inherit property "isDefaultNamespace" with the proper type (42) 
+PASS Node interface: calling isDefaultNamespace(DOMString) on element with too few arguments must throw TypeError 
+PASS Node interface: element must inherit property "insertBefore" with the proper type (43) 
+PASS Node interface: calling insertBefore(Node,Node) on element with too few arguments must throw TypeError 
+PASS Node interface: element must inherit property "appendChild" with the proper type (44) 
+PASS Node interface: calling appendChild(Node) on element with too few arguments must throw TypeError 
+PASS Node interface: element must inherit property "replaceChild" with the proper type (45) 
+PASS Node interface: calling replaceChild(Node,Node) on element with too few arguments must throw TypeError 
+PASS Node interface: element must inherit property "removeChild" with the proper type (46) 
+PASS Node interface: calling removeChild(Node) on element with too few arguments must throw TypeError 
+PASS EventTarget interface: element must inherit property "addEventListener" with the proper type (0) 
+PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on element with too few arguments must throw TypeError 
+PASS EventTarget interface: element must inherit property "removeEventListener" with the proper type (1) 
+PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on element with too few arguments must throw TypeError 
+PASS EventTarget interface: element must inherit property "dispatchEvent" with the proper type (2) 
+PASS EventTarget interface: calling dispatchEvent(Event) on element with too few arguments must throw TypeError 
+PASS NamedNodeMap interface: existence and properties of interface object 
+PASS NamedNodeMap interface object length 
+PASS NamedNodeMap interface object name 
+PASS NamedNodeMap interface: existence and properties of interface prototype object 
+PASS NamedNodeMap interface: existence and properties of interface prototype object's "constructor" property 
+PASS NamedNodeMap interface: attribute length 
+PASS NamedNodeMap interface: operation item(unsigned long) 
+PASS NamedNodeMap interface: operation getNamedItem(DOMString) 
+PASS NamedNodeMap interface: operation getNamedItemNS(DOMString,DOMString) 
+PASS NamedNodeMap interface: operation setNamedItem(Attr) 
+PASS NamedNodeMap interface: operation setNamedItemNS(Attr) 
+PASS NamedNodeMap interface: operation removeNamedItem(DOMString) 
+PASS NamedNodeMap interface: operation removeNamedItemNS(DOMString,DOMString) 
+PASS Attr interface: existence and properties of interface object 
+PASS Attr interface object length 
+PASS Attr interface object name 
+PASS Attr interface: existence and properties of interface prototype object 
+PASS Attr interface: existence and properties of interface prototype object's "constructor" property 
+PASS Attr interface: attribute namespaceURI 
+PASS Attr interface: attribute prefix 
+PASS Attr interface: attribute localName 
+PASS Attr interface: attribute name 
+PASS Attr interface: attribute value 
+PASS Attr interface: attribute ownerElement 
+PASS Attr interface: attribute specified 
+PASS Attr must be primary interface of document.querySelector("[id]").attributes[0] 
+PASS Stringification of document.querySelector("[id]").attributes[0] 
+PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "namespaceURI" with the proper type (0) 
+PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "prefix" with the proper type (1) 
+PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "localName" with the proper type (2) 
+PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "name" with the proper type (3) 
+PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "value" with the proper type (4) 
+PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "ownerElement" with the proper type (5) 
+PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "specified" with the proper type (6) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ELEMENT_NODE" with the proper type (0) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "TEXT_NODE" with the proper type (2) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ENTITY_NODE" with the proper type (5) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "COMMENT_NODE" with the proper type (7) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_NODE" with the proper type (8) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "NOTATION_NODE" with the proper type (11) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "nodeType" with the proper type (12) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "nodeName" with the proper type (13) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "baseURI" with the proper type (14) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "isConnected" with the proper type (15) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ownerDocument" with the proper type (16) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "getRootNode" with the proper type (17) 
+PASS Node interface: calling getRootNode(GetRootNodeOptions) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "parentNode" with the proper type (18) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "parentElement" with the proper type (19) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "hasChildNodes" with the proper type (20) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "childNodes" with the proper type (21) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "firstChild" with the proper type (22) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "lastChild" with the proper type (23) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "previousSibling" with the proper type (24) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "nextSibling" with the proper type (25) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "nodeValue" with the proper type (26) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "textContent" with the proper type (27) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "normalize" with the proper type (28) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "cloneNode" with the proper type (29) 
+PASS Node interface: calling cloneNode(boolean) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "isEqualNode" with the proper type (30) 
+PASS Node interface: calling isEqualNode(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "isSameNode" with the proper type (31) 
+PASS Node interface: calling isSameNode(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "compareDocumentPosition" with the proper type (38) 
+PASS Node interface: calling compareDocumentPosition(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "contains" with the proper type (39) 
+PASS Node interface: calling contains(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "lookupPrefix" with the proper type (40) 
+PASS Node interface: calling lookupPrefix(DOMString) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "lookupNamespaceURI" with the proper type (41) 
+PASS Node interface: calling lookupNamespaceURI(DOMString) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "isDefaultNamespace" with the proper type (42) 
+PASS Node interface: calling isDefaultNamespace(DOMString) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "insertBefore" with the proper type (43) 
+PASS Node interface: calling insertBefore(Node,Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "appendChild" with the proper type (44) 
+PASS Node interface: calling appendChild(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "replaceChild" with the proper type (45) 
+PASS Node interface: calling replaceChild(Node,Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "removeChild" with the proper type (46) 
+PASS Node interface: calling removeChild(Node) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
+PASS EventTarget interface: document.querySelector("[id]").attributes[0] must inherit property "addEventListener" with the proper type (0) 
+PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
+PASS EventTarget interface: document.querySelector("[id]").attributes[0] must inherit property "removeEventListener" with the proper type (1) 
+PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
+PASS EventTarget interface: document.querySelector("[id]").attributes[0] must inherit property "dispatchEvent" with the proper type (2) 
+PASS EventTarget interface: calling dispatchEvent(Event) on document.querySelector("[id]").attributes[0] with too few arguments must throw TypeError 
+PASS CharacterData interface: existence and properties of interface object 
+PASS CharacterData interface object length 
+PASS CharacterData interface object name 
+PASS CharacterData interface: existence and properties of interface prototype object 
+PASS CharacterData interface: existence and properties of interface prototype object's "constructor" property 
+PASS CharacterData interface: attribute data 
+PASS CharacterData interface: attribute length 
+PASS CharacterData interface: operation substringData(unsigned long,unsigned long) 
+PASS CharacterData interface: operation appendData(DOMString) 
+PASS CharacterData interface: operation insertData(unsigned long,DOMString) 
+PASS CharacterData interface: operation deleteData(unsigned long,unsigned long) 
+PASS CharacterData interface: operation replaceData(unsigned long,unsigned long,DOMString) 
+PASS CharacterData interface: attribute previousElementSibling 
+PASS CharacterData interface: attribute nextElementSibling 
+PASS CharacterData interface: operation before([object Object],[object Object]) 
+PASS CharacterData interface: operation after([object Object],[object Object]) 
+PASS CharacterData interface: operation replaceWith([object Object],[object Object]) 
+PASS CharacterData interface: operation remove() 
+PASS Text interface: existence and properties of interface object 
+PASS Text interface object length 
+PASS Text interface object name 
+PASS Text interface: existence and properties of interface prototype object 
+PASS Text interface: existence and properties of interface prototype object's "constructor" property 
+PASS Text interface: operation splitText(unsigned long) 
+PASS Text interface: attribute wholeText 
+PASS Text interface: attribute assignedSlot 
+PASS Text must be primary interface of document.createTextNode("abc") 
+PASS Stringification of document.createTextNode("abc") 
+PASS Text interface: document.createTextNode("abc") must inherit property "splitText" with the proper type (0) 
+PASS Text interface: calling splitText(unsigned long) on document.createTextNode("abc") with too few arguments must throw TypeError 
+PASS Text interface: document.createTextNode("abc") must inherit property "wholeText" with the proper type (1) 
+PASS Text interface: document.createTextNode("abc") must inherit property "assignedSlot" with the proper type (2) 
+PASS CharacterData interface: document.createTextNode("abc") must inherit property "data" with the proper type (0) 
+PASS CharacterData interface: document.createTextNode("abc") must inherit property "length" with the proper type (1) 
+PASS CharacterData interface: document.createTextNode("abc") must inherit property "substringData" with the proper type (2) 
+PASS CharacterData interface: calling substringData(unsigned long,unsigned long) on document.createTextNode("abc") with too few arguments must throw TypeError 
+PASS CharacterData interface: document.createTextNode("abc") must inherit property "appendData" with the proper type (3) 
+PASS CharacterData interface: calling appendData(DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError 
+PASS CharacterData interface: document.createTextNode("abc") must inherit property "insertData" with the proper type (4) 
+PASS CharacterData interface: calling insertData(unsigned long,DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError 
+PASS CharacterData interface: document.createTextNode("abc") must inherit property "deleteData" with the proper type (5) 
+PASS CharacterData interface: calling deleteData(unsigned long,unsigned long) on document.createTextNode("abc") with too few arguments must throw TypeError 
+PASS CharacterData interface: document.createTextNode("abc") must inherit property "replaceData" with the proper type (6) 
+PASS CharacterData interface: calling replaceData(unsigned long,unsigned long,DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError 
+PASS CharacterData interface: document.createTextNode("abc") must inherit property "previousElementSibling" with the proper type (7) 
+PASS CharacterData interface: document.createTextNode("abc") must inherit property "nextElementSibling" with the proper type (8) 
+PASS CharacterData interface: document.createTextNode("abc") must inherit property "before" with the proper type (9) 
+PASS CharacterData interface: calling before([object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError 
+PASS CharacterData interface: document.createTextNode("abc") must inherit property "after" with the proper type (10) 
+PASS CharacterData interface: calling after([object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError 
+PASS CharacterData interface: document.createTextNode("abc") must inherit property "replaceWith" with the proper type (11) 
+PASS CharacterData interface: calling replaceWith([object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError 
+PASS CharacterData interface: document.createTextNode("abc") must inherit property "remove" with the proper type (12) 
+PASS Node interface: document.createTextNode("abc") must inherit property "ELEMENT_NODE" with the proper type (0) 
+PASS Node interface: document.createTextNode("abc") must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
+PASS Node interface: document.createTextNode("abc") must inherit property "TEXT_NODE" with the proper type (2) 
+PASS Node interface: document.createTextNode("abc") must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
+PASS Node interface: document.createTextNode("abc") must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
+PASS Node interface: document.createTextNode("abc") must inherit property "ENTITY_NODE" with the proper type (5) 
+PASS Node interface: document.createTextNode("abc") must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
+PASS Node interface: document.createTextNode("abc") must inherit property "COMMENT_NODE" with the proper type (7) 
+PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_NODE" with the proper type (8) 
+PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
+PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
+PASS Node interface: document.createTextNode("abc") must inherit property "NOTATION_NODE" with the proper type (11) 
+PASS Node interface: document.createTextNode("abc") must inherit property "nodeType" with the proper type (12) 
+PASS Node interface: document.createTextNode("abc") must inherit property "nodeName" with the proper type (13) 
+PASS Node interface: document.createTextNode("abc") must inherit property "baseURI" with the proper type (14) 
+PASS Node interface: document.createTextNode("abc") must inherit property "isConnected" with the proper type (15) 
+PASS Node interface: document.createTextNode("abc") must inherit property "ownerDocument" with the proper type (16) 
+PASS Node interface: document.createTextNode("abc") must inherit property "getRootNode" with the proper type (17) 
+PASS Node interface: calling getRootNode(GetRootNodeOptions) on document.createTextNode("abc") with too few arguments must throw TypeError 
+PASS Node interface: document.createTextNode("abc") must inherit property "parentNode" with the proper type (18) 
+PASS Node interface: document.createTextNode("abc") must inherit property "parentElement" with the proper type (19) 
+PASS Node interface: document.createTextNode("abc") must inherit property "hasChildNodes" with the proper type (20) 
+PASS Node interface: document.createTextNode("abc") must inherit property "childNodes" with the proper type (21) 
+PASS Node interface: document.createTextNode("abc") must inherit property "firstChild" with the proper type (22) 
+PASS Node interface: document.createTextNode("abc") must inherit property "lastChild" with the proper type (23) 
+PASS Node interface: document.createTextNode("abc") must inherit property "previousSibling" with the proper type (24) 
+PASS Node interface: document.createTextNode("abc") must inherit property "nextSibling" with the proper type (25) 
+PASS Node interface: document.createTextNode("abc") must inherit property "nodeValue" with the proper type (26) 
+PASS Node interface: document.createTextNode("abc") must inherit property "textContent" with the proper type (27) 
+PASS Node interface: document.createTextNode("abc") must inherit property "normalize" with the proper type (28) 
+PASS Node interface: document.createTextNode("abc") must inherit property "cloneNode" with the proper type (29) 
+PASS Node interface: calling cloneNode(boolean) on document.createTextNode("abc") with too few arguments must throw TypeError 
+PASS Node interface: document.createTextNode("abc") must inherit property "isEqualNode" with the proper type (30) 
+PASS Node interface: calling isEqualNode(Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
+PASS Node interface: document.createTextNode("abc") must inherit property "isSameNode" with the proper type (31) 
+PASS Node interface: calling isSameNode(Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
+PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
+PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
+PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
+PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
+PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
+PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
+PASS Node interface: document.createTextNode("abc") must inherit property "compareDocumentPosition" with the proper type (38) 
+PASS Node interface: calling compareDocumentPosition(Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
+PASS Node interface: document.createTextNode("abc") must inherit property "contains" with the proper type (39) 
+PASS Node interface: calling contains(Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
+PASS Node interface: document.createTextNode("abc") must inherit property "lookupPrefix" with the proper type (40) 
+PASS Node interface: calling lookupPrefix(DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError 
+PASS Node interface: document.createTextNode("abc") must inherit property "lookupNamespaceURI" with the proper type (41) 
+PASS Node interface: calling lookupNamespaceURI(DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError 
+PASS Node interface: document.createTextNode("abc") must inherit property "isDefaultNamespace" with the proper type (42) 
+PASS Node interface: calling isDefaultNamespace(DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError 
+PASS Node interface: document.createTextNode("abc") must inherit property "insertBefore" with the proper type (43) 
+PASS Node interface: calling insertBefore(Node,Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
+PASS Node interface: document.createTextNode("abc") must inherit property "appendChild" with the proper type (44) 
+PASS Node interface: calling appendChild(Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
+PASS Node interface: document.createTextNode("abc") must inherit property "replaceChild" with the proper type (45) 
+PASS Node interface: calling replaceChild(Node,Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
+PASS Node interface: document.createTextNode("abc") must inherit property "removeChild" with the proper type (46) 
+PASS Node interface: calling removeChild(Node) on document.createTextNode("abc") with too few arguments must throw TypeError 
+PASS EventTarget interface: document.createTextNode("abc") must inherit property "addEventListener" with the proper type (0) 
+PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError 
+PASS EventTarget interface: document.createTextNode("abc") must inherit property "removeEventListener" with the proper type (1) 
+PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError 
+PASS EventTarget interface: document.createTextNode("abc") must inherit property "dispatchEvent" with the proper type (2) 
+PASS EventTarget interface: calling dispatchEvent(Event) on document.createTextNode("abc") with too few arguments must throw TypeError 
+PASS CDATASection interface: existence and properties of interface object 
+PASS CDATASection interface object length 
+PASS CDATASection interface object name 
+PASS CDATASection interface: existence and properties of interface prototype object 
+PASS CDATASection interface: existence and properties of interface prototype object's "constructor" property 
+PASS ProcessingInstruction interface: existence and properties of interface object 
+PASS ProcessingInstruction interface object length 
+PASS ProcessingInstruction interface object name 
+PASS ProcessingInstruction interface: existence and properties of interface prototype object 
+PASS ProcessingInstruction interface: existence and properties of interface prototype object's "constructor" property 
+PASS ProcessingInstruction interface: attribute target 
+PASS ProcessingInstruction must be primary interface of xmlDoc.createProcessingInstruction("abc", "def") 
+PASS Stringification of xmlDoc.createProcessingInstruction("abc", "def") 
+PASS ProcessingInstruction interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "target" with the proper type (0) 
+PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "data" with the proper type (0) 
+PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "length" with the proper type (1) 
+PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "substringData" with the proper type (2) 
+PASS CharacterData interface: calling substringData(unsigned long,unsigned long) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
+PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "appendData" with the proper type (3) 
+PASS CharacterData interface: calling appendData(DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
+PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "insertData" with the proper type (4) 
+PASS CharacterData interface: calling insertData(unsigned long,DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
+PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "deleteData" with the proper type (5) 
+PASS CharacterData interface: calling deleteData(unsigned long,unsigned long) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
+PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "replaceData" with the proper type (6) 
+PASS CharacterData interface: calling replaceData(unsigned long,unsigned long,DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
+PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "previousElementSibling" with the proper type (7) 
+PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nextElementSibling" with the proper type (8) 
+PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "before" with the proper type (9) 
+PASS CharacterData interface: calling before([object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
+PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "after" with the proper type (10) 
+PASS CharacterData interface: calling after([object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
+PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "replaceWith" with the proper type (11) 
+PASS CharacterData interface: calling replaceWith([object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
+PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "remove" with the proper type (12) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ELEMENT_NODE" with the proper type (0) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "TEXT_NODE" with the proper type (2) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ENTITY_NODE" with the proper type (5) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "COMMENT_NODE" with the proper type (7) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_NODE" with the proper type (8) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "NOTATION_NODE" with the proper type (11) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nodeType" with the proper type (12) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nodeName" with the proper type (13) 
+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 Node interface: calling getRootNode(GetRootNodeOptions) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "parentNode" with the proper type (18) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "parentElement" with the proper type (19) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "hasChildNodes" with the proper type (20) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "childNodes" with the proper type (21) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "firstChild" with the proper type (22) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "lastChild" with the proper type (23) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "previousSibling" with the proper type (24) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nextSibling" with the proper type (25) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nodeValue" with the proper type (26) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "textContent" with the proper type (27) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "normalize" with the proper type (28) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "cloneNode" with the proper type (29) 
+PASS Node interface: calling cloneNode(boolean) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isEqualNode" with the proper type (30) 
+PASS Node interface: calling isEqualNode(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isSameNode" with the proper type (31) 
+PASS Node interface: calling isSameNode(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "compareDocumentPosition" with the proper type (38) 
+PASS Node interface: calling compareDocumentPosition(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "contains" with the proper type (39) 
+PASS Node interface: calling contains(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "lookupPrefix" with the proper type (40) 
+PASS Node interface: calling lookupPrefix(DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "lookupNamespaceURI" with the proper type (41) 
+PASS Node interface: calling lookupNamespaceURI(DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isDefaultNamespace" with the proper type (42) 
+PASS Node interface: calling isDefaultNamespace(DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "insertBefore" with the proper type (43) 
+PASS Node interface: calling insertBefore(Node,Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "appendChild" with the proper type (44) 
+PASS Node interface: calling appendChild(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "replaceChild" with the proper type (45) 
+PASS Node interface: calling replaceChild(Node,Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "removeChild" with the proper type (46) 
+PASS Node interface: calling removeChild(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
+PASS EventTarget interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "addEventListener" with the proper type (0) 
+PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
+PASS EventTarget interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "removeEventListener" with the proper type (1) 
+PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
+PASS EventTarget interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "dispatchEvent" with the proper type (2) 
+PASS EventTarget interface: calling dispatchEvent(Event) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
+PASS Comment interface: existence and properties of interface object 
+PASS Comment interface object length 
+PASS Comment interface object name 
+PASS Comment interface: existence and properties of interface prototype object 
+PASS Comment interface: existence and properties of interface prototype object's "constructor" property 
+PASS Comment must be primary interface of document.createComment("abc") 
+PASS Stringification of document.createComment("abc") 
+PASS CharacterData interface: document.createComment("abc") must inherit property "data" with the proper type (0) 
+PASS CharacterData interface: document.createComment("abc") must inherit property "length" with the proper type (1) 
+PASS CharacterData interface: document.createComment("abc") must inherit property "substringData" with the proper type (2) 
+PASS CharacterData interface: calling substringData(unsigned long,unsigned long) on document.createComment("abc") with too few arguments must throw TypeError 
+PASS CharacterData interface: document.createComment("abc") must inherit property "appendData" with the proper type (3) 
+PASS CharacterData interface: calling appendData(DOMString) on document.createComment("abc") with too few arguments must throw TypeError 
+PASS CharacterData interface: document.createComment("abc") must inherit property "insertData" with the proper type (4) 
+PASS CharacterData interface: calling insertData(unsigned long,DOMString) on document.createComment("abc") with too few arguments must throw TypeError 
+PASS CharacterData interface: document.createComment("abc") must inherit property "deleteData" with the proper type (5) 
+PASS CharacterData interface: calling deleteData(unsigned long,unsigned long) on document.createComment("abc") with too few arguments must throw TypeError 
+PASS CharacterData interface: document.createComment("abc") must inherit property "replaceData" with the proper type (6) 
+PASS CharacterData interface: calling replaceData(unsigned long,unsigned long,DOMString) on document.createComment("abc") with too few arguments must throw TypeError 
+PASS CharacterData interface: document.createComment("abc") must inherit property "previousElementSibling" with the proper type (7) 
+PASS CharacterData interface: document.createComment("abc") must inherit property "nextElementSibling" with the proper type (8) 
+PASS CharacterData interface: document.createComment("abc") must inherit property "before" with the proper type (9) 
+PASS CharacterData interface: calling before([object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError 
+PASS CharacterData interface: document.createComment("abc") must inherit property "after" with the proper type (10) 
+PASS CharacterData interface: calling after([object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError 
+PASS CharacterData interface: document.createComment("abc") must inherit property "replaceWith" with the proper type (11) 
+PASS CharacterData interface: calling replaceWith([object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError 
+PASS CharacterData interface: document.createComment("abc") must inherit property "remove" with the proper type (12) 
+PASS Node interface: document.createComment("abc") must inherit property "ELEMENT_NODE" with the proper type (0) 
+PASS Node interface: document.createComment("abc") must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
+PASS Node interface: document.createComment("abc") must inherit property "TEXT_NODE" with the proper type (2) 
+PASS Node interface: document.createComment("abc") must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
+PASS Node interface: document.createComment("abc") must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
+PASS Node interface: document.createComment("abc") must inherit property "ENTITY_NODE" with the proper type (5) 
+PASS Node interface: document.createComment("abc") must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
+PASS Node interface: document.createComment("abc") must inherit property "COMMENT_NODE" with the proper type (7) 
+PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_NODE" with the proper type (8) 
+PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
+PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
+PASS Node interface: document.createComment("abc") must inherit property "NOTATION_NODE" with the proper type (11) 
+PASS Node interface: document.createComment("abc") must inherit property "nodeType" with the proper type (12) 
+PASS Node interface: document.createComment("abc") must inherit property "nodeName" with the proper type (13) 
+PASS Node interface: document.createComment("abc") must inherit property "baseURI" with the proper type (14) 
+PASS Node interface: document.createComment("abc") must inherit property "isConnected" with the proper type (15) 
+PASS Node interface: document.createComment("abc") must inherit property "ownerDocument" with the proper type (16) 
+PASS Node interface: document.createComment("abc") must inherit property "getRootNode" with the proper type (17) 
+PASS Node interface: calling getRootNode(GetRootNodeOptions) on document.createComment("abc") with too few arguments must throw TypeError 
+PASS Node interface: document.createComment("abc") must inherit property "parentNode" with the proper type (18) 
+PASS Node interface: document.createComment("abc") must inherit property "parentElement" with the proper type (19) 
+PASS Node interface: document.createComment("abc") must inherit property "hasChildNodes" with the proper type (20) 
+PASS Node interface: document.createComment("abc") must inherit property "childNodes" with the proper type (21) 
+PASS Node interface: document.createComment("abc") must inherit property "firstChild" with the proper type (22) 
+PASS Node interface: document.createComment("abc") must inherit property "lastChild" with the proper type (23) 
+PASS Node interface: document.createComment("abc") must inherit property "previousSibling" with the proper type (24) 
+PASS Node interface: document.createComment("abc") must inherit property "nextSibling" with the proper type (25) 
+PASS Node interface: document.createComment("abc") must inherit property "nodeValue" with the proper type (26) 
+PASS Node interface: document.createComment("abc") must inherit property "textContent" with the proper type (27) 
+PASS Node interface: document.createComment("abc") must inherit property "normalize" with the proper type (28) 
+PASS Node interface: document.createComment("abc") must inherit property "cloneNode" with the proper type (29) 
+PASS Node interface: calling cloneNode(boolean) on document.createComment("abc") with too few arguments must throw TypeError 
+PASS Node interface: document.createComment("abc") must inherit property "isEqualNode" with the proper type (30) 
+PASS Node interface: calling isEqualNode(Node) on document.createComment("abc") with too few arguments must throw TypeError 
+PASS Node interface: document.createComment("abc") must inherit property "isSameNode" with the proper type (31) 
+PASS Node interface: calling isSameNode(Node) on document.createComment("abc") with too few arguments must throw TypeError 
+PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
+PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
+PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
+PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
+PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
+PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
+PASS Node interface: document.createComment("abc") must inherit property "compareDocumentPosition" with the proper type (38) 
+PASS Node interface: calling compareDocumentPosition(Node) on document.createComment("abc") with too few arguments must throw TypeError 
+PASS Node interface: document.createComment("abc") must inherit property "contains" with the proper type (39) 
+PASS Node interface: calling contains(Node) on document.createComment("abc") with too few arguments must throw TypeError 
+PASS Node interface: document.createComment("abc") must inherit property "lookupPrefix" with the proper type (40) 
+PASS Node interface: calling lookupPrefix(DOMString) on document.createComment("abc") with too few arguments must throw TypeError 
+PASS Node interface: document.createComment("abc") must inherit property "lookupNamespaceURI" with the proper type (41) 
+PASS Node interface: calling lookupNamespaceURI(DOMString) on document.createComment("abc") with too few arguments must throw TypeError 
+PASS Node interface: document.createComment("abc") must inherit property "isDefaultNamespace" with the proper type (42) 
+PASS Node interface: calling isDefaultNamespace(DOMString) on document.createComment("abc") with too few arguments must throw TypeError 
+PASS Node interface: document.createComment("abc") must inherit property "insertBefore" with the proper type (43) 
+PASS Node interface: calling insertBefore(Node,Node) on document.createComment("abc") with too few arguments must throw TypeError 
+PASS Node interface: document.createComment("abc") must inherit property "appendChild" with the proper type (44) 
+PASS Node interface: calling appendChild(Node) on document.createComment("abc") with too few arguments must throw TypeError 
+PASS Node interface: document.createComment("abc") must inherit property "replaceChild" with the proper type (45) 
+PASS Node interface: calling replaceChild(Node,Node) on document.createComment("abc") with too few arguments must throw TypeError 
+PASS Node interface: document.createComment("abc") must inherit property "removeChild" with the proper type (46) 
+PASS Node interface: calling removeChild(Node) on document.createComment("abc") with too few arguments must throw TypeError 
+PASS EventTarget interface: document.createComment("abc") must inherit property "addEventListener" with the proper type (0) 
+PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError 
+PASS EventTarget interface: document.createComment("abc") must inherit property "removeEventListener" with the proper type (1) 
+PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError 
+PASS EventTarget interface: document.createComment("abc") must inherit property "dispatchEvent" with the proper type (2) 
+PASS EventTarget interface: calling dispatchEvent(Event) on document.createComment("abc") with too few arguments must throw TypeError 
+PASS Range interface: existence and properties of interface object 
+PASS Range interface object length 
+PASS Range interface object name 
+PASS Range interface: existence and properties of interface prototype object 
+PASS Range interface: existence and properties of interface prototype object's "constructor" property 
+PASS Range interface: attribute startContainer 
+PASS Range interface: attribute startOffset 
+PASS Range interface: attribute endContainer 
+PASS Range interface: attribute endOffset 
+PASS Range interface: attribute collapsed 
+PASS Range interface: attribute commonAncestorContainer 
+PASS Range interface: operation setStart(Node,unsigned long) 
+PASS Range interface: operation setEnd(Node,unsigned long) 
+PASS Range interface: operation setStartBefore(Node) 
+PASS Range interface: operation setStartAfter(Node) 
+PASS Range interface: operation setEndBefore(Node) 
+PASS Range interface: operation setEndAfter(Node) 
+PASS Range interface: operation collapse(boolean) 
+PASS Range interface: operation selectNode(Node) 
+PASS Range interface: operation selectNodeContents(Node) 
+PASS Range interface: constant START_TO_START on interface object 
+PASS Range interface: constant START_TO_START on interface prototype object 
+PASS Range interface: constant START_TO_END on interface object 
+PASS Range interface: constant START_TO_END on interface prototype object 
+PASS Range interface: constant END_TO_END on interface object 
+PASS Range interface: constant END_TO_END on interface prototype object 
+PASS Range interface: constant END_TO_START on interface object 
+PASS Range interface: constant END_TO_START on interface prototype object 
+PASS Range interface: operation compareBoundaryPoints(unsigned short,Range) 
+PASS Range interface: operation deleteContents() 
+PASS Range interface: operation extractContents() 
+PASS Range interface: operation cloneContents() 
+PASS Range interface: operation insertNode(Node) 
+PASS Range interface: operation surroundContents(Node) 
+PASS Range interface: operation cloneRange() 
+PASS Range interface: operation detach() 
+PASS Range interface: operation isPointInRange(Node,unsigned long) 
+PASS Range interface: operation comparePoint(Node,unsigned long) 
+PASS Range interface: operation intersectsNode(Node) 
+PASS Range interface: stringifier 
+PASS Range must be primary interface of document.createRange() 
+PASS Stringification of document.createRange() 
+PASS Range interface: document.createRange() must inherit property "startContainer" with the proper type (0) 
+PASS Range interface: document.createRange() must inherit property "startOffset" with the proper type (1) 
+PASS Range interface: document.createRange() must inherit property "endContainer" with the proper type (2) 
+PASS Range interface: document.createRange() must inherit property "endOffset" with the proper type (3) 
+PASS Range interface: document.createRange() must inherit property "collapsed" with the proper type (4) 
+PASS Range interface: document.createRange() must inherit property "commonAncestorContainer" with the proper type (5) 
+PASS Range interface: document.createRange() must inherit property "setStart" with the proper type (6) 
+PASS Range interface: calling setStart(Node,unsigned long) on document.createRange() with too few arguments must throw TypeError 
+PASS Range interface: document.createRange() must inherit property "setEnd" with the proper type (7) 
+PASS Range interface: calling setEnd(Node,unsigned long) on document.createRange() with too few arguments must throw TypeError 
+PASS Range interface: document.createRange() must inherit property "setStartBefore" with the proper type (8) 
+PASS Range interface: calling setStartBefore(Node) on document.createRange() with too few arguments must throw TypeError 
+PASS Range interface: document.createRange() must inherit property "setStartAfter" with the proper type (9) 
+PASS Range interface: calling setStartAfter(Node) on document.createRange() with too few arguments must throw TypeError 
+PASS Range interface: document.createRange() must inherit property "setEndBefore" with the proper type (10) 
+PASS Range interface: calling setEndBefore(Node) on document.createRange() with too few arguments must throw TypeError 
+PASS Range interface: document.createRange() must inherit property "setEndAfter" with the proper type (11) 
+PASS Range interface: calling setEndAfter(Node) on document.createRange() with too few arguments must throw TypeError 
+PASS Range interface: document.createRange() must inherit property "collapse" with the proper type (12) 
+PASS Range interface: calling collapse(boolean) on document.createRange() with too few arguments must throw TypeError 
+PASS Range interface: document.createRange() must inherit property "selectNode" with the proper type (13) 
+PASS Range interface: calling selectNode(Node) on document.createRange() with too few arguments must throw TypeError 
+PASS Range interface: document.createRange() must inherit property "selectNodeContents" with the proper type (14) 
+PASS Range interface: calling selectNodeContents(Node) on document.createRange() with too few arguments must throw TypeError 
+PASS Range interface: document.createRange() must inherit property "START_TO_START" with the proper type (15) 
+PASS Range interface: document.createRange() must inherit property "START_TO_END" with the proper type (16) 
+PASS Range interface: document.createRange() must inherit property "END_TO_END" with the proper type (17) 
+PASS Range interface: document.createRange() must inherit property "END_TO_START" with the proper type (18) 
+PASS Range interface: document.createRange() must inherit property "compareBoundaryPoints" with the proper type (19) 
+PASS Range interface: calling compareBoundaryPoints(unsigned short,Range) on document.createRange() with too few arguments must throw TypeError 
+PASS Range interface: document.createRange() must inherit property "deleteContents" with the proper type (20) 
+PASS Range interface: document.createRange() must inherit property "extractContents" with the proper type (21) 
+PASS Range interface: document.createRange() must inherit property "cloneContents" with the proper type (22) 
+PASS Range interface: document.createRange() must inherit property "insertNode" with the proper type (23) 
+PASS Range interface: calling insertNode(Node) on document.createRange() with too few arguments must throw TypeError 
+PASS Range interface: document.createRange() must inherit property "surroundContents" with the proper type (24) 
+PASS Range interface: calling surroundContents(Node) on document.createRange() with too few arguments must throw TypeError 
+PASS Range interface: document.createRange() must inherit property "cloneRange" with the proper type (25) 
+PASS Range interface: document.createRange() must inherit property "detach" with the proper type (26) 
+PASS Range interface: document.createRange() must inherit property "isPointInRange" with the proper type (27) 
+PASS Range interface: calling isPointInRange(Node,unsigned long) on document.createRange() with too few arguments must throw TypeError 
+PASS Range interface: document.createRange() must inherit property "comparePoint" with the proper type (28) 
+PASS Range interface: calling comparePoint(Node,unsigned long) on document.createRange() with too few arguments must throw TypeError 
+PASS Range interface: document.createRange() must inherit property "intersectsNode" with the proper type (29) 
+PASS Range interface: calling intersectsNode(Node) on document.createRange() with too few arguments must throw TypeError 
+PASS Range must be primary interface of detachedRange 
+PASS Stringification of detachedRange 
+PASS Range interface: detachedRange must inherit property "startContainer" with the proper type (0) 
+PASS Range interface: detachedRange must inherit property "startOffset" with the proper type (1) 
+PASS Range interface: detachedRange must inherit property "endContainer" with the proper type (2) 
+PASS Range interface: detachedRange must inherit property "endOffset" with the proper type (3) 
+PASS Range interface: detachedRange must inherit property "collapsed" with the proper type (4) 
+PASS Range interface: detachedRange must inherit property "commonAncestorContainer" with the proper type (5) 
+PASS Range interface: detachedRange must inherit property "setStart" with the proper type (6) 
+PASS Range interface: calling setStart(Node,unsigned long) on detachedRange with too few arguments must throw TypeError 
+PASS Range interface: detachedRange must inherit property "setEnd" with the proper type (7) 
+PASS Range interface: calling setEnd(Node,unsigned long) on detachedRange with too few arguments must throw TypeError 
+PASS Range interface: detachedRange must inherit property "setStartBefore" with the proper type (8) 
+PASS Range interface: calling setStartBefore(Node) on detachedRange with too few arguments must throw TypeError 
+PASS Range interface: detachedRange must inherit property "setStartAfter" with the proper type (9) 
+PASS Range interface: calling setStartAfter(Node) on detachedRange with too few arguments must throw TypeError 
+PASS Range interface: detachedRange must inherit property "setEndBefore" with the proper type (10) 
+PASS Range interface: calling setEndBefore(Node) on detachedRange with too few arguments must throw TypeError 
+PASS Range interface: detachedRange must inherit property "setEndAfter" with the proper type (11) 
+PASS Range interface: calling setEndAfter(Node) on detachedRange with too few arguments must throw TypeError 
+PASS Range interface: detachedRange must inherit property "collapse" with the proper type (12) 
+PASS Range interface: calling collapse(boolean) on detachedRange with too few arguments must throw TypeError 
+PASS Range interface: detachedRange must inherit property "selectNode" with the proper type (13) 
+PASS Range interface: calling selectNode(Node) on detachedRange with too few arguments must throw TypeError 
+PASS Range interface: detachedRange must inherit property "selectNodeContents" with the proper type (14) 
+PASS Range interface: calling selectNodeContents(Node) on detachedRange with too few arguments must throw TypeError 
+PASS Range interface: detachedRange must inherit property "START_TO_START" with the proper type (15) 
+PASS Range interface: detachedRange must inherit property "START_TO_END" with the proper type (16) 
+PASS Range interface: detachedRange must inherit property "END_TO_END" with the proper type (17) 
+PASS Range interface: detachedRange must inherit property "END_TO_START" with the proper type (18) 
+PASS Range interface: detachedRange must inherit property "compareBoundaryPoints" with the proper type (19) 
+PASS Range interface: calling compareBoundaryPoints(unsigned short,Range) on detachedRange with too few arguments must throw TypeError 
+PASS Range interface: detachedRange must inherit property "deleteContents" with the proper type (20) 
+PASS Range interface: detachedRange must inherit property "extractContents" with the proper type (21) 
+PASS Range interface: detachedRange must inherit property "cloneContents" with the proper type (22) 
+PASS Range interface: detachedRange must inherit property "insertNode" with the proper type (23) 
+PASS Range interface: calling insertNode(Node) on detachedRange with too few arguments must throw TypeError 
+PASS Range interface: detachedRange must inherit property "surroundContents" with the proper type (24) 
+PASS Range interface: calling surroundContents(Node) on detachedRange with too few arguments must throw TypeError 
+PASS Range interface: detachedRange must inherit property "cloneRange" with the proper type (25) 
+PASS Range interface: detachedRange must inherit property "detach" with the proper type (26) 
+PASS Range interface: detachedRange must inherit property "isPointInRange" with the proper type (27) 
+PASS Range interface: calling isPointInRange(Node,unsigned long) on detachedRange with too few arguments must throw TypeError 
+PASS Range interface: detachedRange must inherit property "comparePoint" with the proper type (28) 
+PASS Range interface: calling comparePoint(Node,unsigned long) on detachedRange with too few arguments must throw TypeError 
+PASS Range interface: detachedRange must inherit property "intersectsNode" with the proper type (29) 
+PASS Range interface: calling intersectsNode(Node) on detachedRange with too few arguments must throw TypeError 
+PASS NodeIterator interface: existence and properties of interface object 
+PASS NodeIterator interface object length 
+PASS NodeIterator interface object name 
+PASS NodeIterator interface: existence and properties of interface prototype object 
+PASS NodeIterator interface: existence and properties of interface prototype object's "constructor" property 
+PASS NodeIterator interface: attribute root 
+PASS NodeIterator interface: attribute referenceNode 
+PASS NodeIterator interface: attribute pointerBeforeReferenceNode 
+PASS NodeIterator interface: attribute whatToShow 
+PASS NodeIterator interface: attribute filter 
+PASS NodeIterator interface: operation nextNode() 
+PASS NodeIterator interface: operation previousNode() 
+PASS NodeIterator interface: operation detach() 
+PASS NodeIterator must be primary interface of document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) 
+PASS Stringification of document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) 
+PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "root" with the proper type (0) 
+PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "referenceNode" with the proper type (1) 
+PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "pointerBeforeReferenceNode" with the proper type (2) 
+PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "whatToShow" with the proper type (3) 
+PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "filter" with the proper type (4) 
+PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "nextNode" with the proper type (5) 
+PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "previousNode" with the proper type (6) 
+PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "detach" with the proper type (7) 
+PASS TreeWalker interface: existence and properties of interface object 
+PASS TreeWalker interface object length 
+PASS TreeWalker interface object name 
+PASS TreeWalker interface: existence and properties of interface prototype object 
+PASS TreeWalker interface: existence and properties of interface prototype object's "constructor" property 
+PASS TreeWalker interface: attribute root 
+PASS TreeWalker interface: attribute whatToShow 
+PASS TreeWalker interface: attribute filter 
+PASS TreeWalker interface: attribute currentNode 
+PASS TreeWalker interface: operation parentNode() 
+PASS TreeWalker interface: operation firstChild() 
+PASS TreeWalker interface: operation lastChild() 
+PASS TreeWalker interface: operation previousSibling() 
+PASS TreeWalker interface: operation nextSibling() 
+PASS TreeWalker interface: operation previousNode() 
+PASS TreeWalker interface: operation nextNode() 
+PASS TreeWalker must be primary interface of document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) 
+PASS Stringification of document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) 
+PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "root" with the proper type (0) 
+PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "whatToShow" with the proper type (1) 
+PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "filter" with the proper type (2) 
+PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "currentNode" with the proper type (3) 
+PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "parentNode" with the proper type (4) 
+PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "firstChild" with the proper type (5) 
+PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "lastChild" with the proper type (6) 
+PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "previousSibling" with the proper type (7) 
+PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "nextSibling" with the proper type (8) 
+PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "previousNode" with the proper type (9) 
+PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "nextNode" with the proper type (10) 
+PASS NodeFilter interface: existence and properties of interface object 
+PASS NodeFilter interface object name 
+PASS NodeFilter interface: existence and properties of interface prototype object 
+PASS NodeFilter interface: existence and properties of interface prototype object's "constructor" property 
+PASS NodeFilter interface: constant FILTER_ACCEPT on interface object 
+PASS NodeFilter interface: constant FILTER_ACCEPT on interface prototype object 
+PASS NodeFilter interface: constant FILTER_REJECT on interface object 
+PASS NodeFilter interface: constant FILTER_REJECT on interface prototype object 
+PASS NodeFilter interface: constant FILTER_SKIP on interface object 
+PASS NodeFilter interface: constant FILTER_SKIP on interface prototype object 
+PASS NodeFilter interface: constant SHOW_ALL on interface object 
+PASS NodeFilter interface: constant SHOW_ALL on interface prototype object 
+PASS NodeFilter interface: constant SHOW_ELEMENT on interface object 
+PASS NodeFilter interface: constant SHOW_ELEMENT on interface prototype object 
+PASS NodeFilter interface: constant SHOW_ATTRIBUTE on interface object 
+PASS NodeFilter interface: constant SHOW_ATTRIBUTE on interface prototype object 
+PASS NodeFilter interface: constant SHOW_TEXT on interface object 
+PASS NodeFilter interface: constant SHOW_TEXT on interface prototype object 
+PASS NodeFilter interface: constant SHOW_CDATA_SECTION on interface object 
+PASS NodeFilter interface: constant SHOW_CDATA_SECTION on interface prototype object 
+PASS NodeFilter interface: constant SHOW_ENTITY_REFERENCE on interface object 
+PASS NodeFilter interface: constant SHOW_ENTITY_REFERENCE on interface prototype object 
+PASS NodeFilter interface: constant SHOW_ENTITY on interface object 
+PASS NodeFilter interface: constant SHOW_ENTITY on interface prototype object 
+PASS NodeFilter interface: constant SHOW_PROCESSING_INSTRUCTION on interface object 
+PASS NodeFilter interface: constant SHOW_PROCESSING_INSTRUCTION on interface prototype object 
+PASS NodeFilter interface: constant SHOW_COMMENT on interface object 
+PASS NodeFilter interface: constant SHOW_COMMENT on interface prototype object 
+PASS NodeFilter interface: constant SHOW_DOCUMENT on interface object 
+PASS NodeFilter interface: constant SHOW_DOCUMENT on interface prototype object 
+PASS NodeFilter interface: constant SHOW_DOCUMENT_TYPE on interface object 
+PASS NodeFilter interface: constant SHOW_DOCUMENT_TYPE on interface prototype object 
+PASS NodeFilter interface: constant SHOW_DOCUMENT_FRAGMENT on interface object 
+PASS NodeFilter interface: constant SHOW_DOCUMENT_FRAGMENT on interface prototype object 
+PASS NodeFilter interface: constant SHOW_NOTATION on interface object 
+PASS NodeFilter interface: constant SHOW_NOTATION on interface prototype object 
+PASS NodeFilter interface: operation acceptNode(Node) 
+PASS DOMTokenList interface: existence and properties of interface object 
+PASS DOMTokenList interface object length 
+PASS DOMTokenList interface object name 
+PASS DOMTokenList interface: existence and properties of interface prototype object 
+PASS DOMTokenList interface: existence and properties of interface prototype object's "constructor" property 
+PASS DOMTokenList interface: attribute length 
+PASS DOMTokenList interface: operation item(unsigned long) 
+PASS DOMTokenList interface: operation contains(DOMString) 
+PASS DOMTokenList interface: operation add(DOMString) 
+PASS DOMTokenList interface: operation remove(DOMString) 
+PASS DOMTokenList interface: operation toggle(DOMString,boolean) 
+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: calling item(unsigned long) on document.body.classList with too few arguments must throw TypeError 
+PASS DOMTokenList interface: document.body.classList must inherit property "contains" with the proper type (2) 
+PASS DOMTokenList interface: calling contains(DOMString) on document.body.classList with too few arguments must throw TypeError 
+PASS DOMTokenList interface: document.body.classList must inherit property "add" with the proper type (3) 
+PASS DOMTokenList interface: calling add(DOMString) on document.body.classList with too few arguments must throw TypeError 
+PASS DOMTokenList interface: document.body.classList must inherit property "remove" with the proper type (4) 
+PASS DOMTokenList interface: calling remove(DOMString) on document.body.classList with too few arguments must throw TypeError 
+PASS DOMTokenList interface: document.body.classList must inherit property "toggle" with the proper type (5) 
+PASS DOMTokenList interface: calling toggle(DOMString,boolean) on document.body.classList with too few arguments must throw TypeError 
+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: calling supports(DOMString) on document.body.classList with too few arguments must throw TypeError 
+PASS DOMTokenList interface: document.body.classList must inherit property "value" with the proper type (8) 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces.html b/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces.html
index e6b12e3c..8b4140d 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces.html
@@ -21,6 +21,7 @@
 function doTest(idl) {
   idlArray.add_idls(idl);
   idlArray.add_objects({
+    EventTarget: ['new EventTarget()'],
     Event: ['document.createEvent("Event")', 'new Event("foo")'],
     CustomEvent: ['new CustomEvent("foo")'],
     Document: ['new Document()'],
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
new file mode 100644
index 0000000..cbdd61f6
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness-expected.txt
@@ -0,0 +1,17 @@
+This is a testharness.js-based test.
+PASS Window interface: attribute performance 
+PASS WorkerGlobalScope interface: existence and properties of interface object 
+PASS Performance interface: existence and properties of interface object 
+PASS Performance interface object length 
+PASS Performance interface object name 
+PASS Performance interface: existence and properties of interface prototype object 
+PASS Performance interface: existence and properties of interface prototype object's "constructor" property 
+PASS Performance interface: operation now() 
+PASS Performance interface: operation toJSON() 
+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) 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness.html b/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness.html
index 9dfea66..30b6c268 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness.html
@@ -34,7 +34,7 @@
 [Exposed=(Window,Worker)]
 interface Performance : EventTarget {
     DOMHighResTimeStamp now();
-    serializer = {attribute};
+    [Default] object toJSON();
 };
 
 [NoInterfaceObject,
diff --git a/third_party/WebKit/LayoutTests/external/wpt/hr-time/timing-attack.html b/third_party/WebKit/LayoutTests/external/wpt/hr-time/timing-attack.html
new file mode 100644
index 0000000..71ade4a8
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/hr-time/timing-attack.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8" />
+<title>window.performance.now should not enable timing attacks</title>
+<link rel="author" title="W3C" href="http://www.w3.org/" />
+<link rel="help" href="http://w3c.github.io/hr-time/#privacy-security"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+test(function() {
+  function check_resolutions(times, length) {
+    var end = length - 2;
+
+    // we compare each value with the following ones
+    for (var i = 0; i < end; i++) {
+      var h1 = times[i];
+      for (var j = i+1; j < end; j++) {
+        var h2 = times[j];
+        var diff = h2 - h1;
+        assert_true((diff === 0) || ((diff * 1000) >= 5),
+          "Differences smaller than 5 microseconds: " + diff);
+      }
+    }
+    return true;
+  }
+
+  var times = new Array(10);
+  var index = 0;
+  var hrt1, hrt2, hrt;
+
+  // rapid firing of performance.now
+  hrt1 = performance.now();
+  hrt2 = performance.now();
+  times[index++] = hrt1;
+  times[index++] = hrt2;
+
+  // ensure that we get performance.now() to return a different value
+  do {
+    hrt = performance.now();
+    times[index++] = hrt;
+  } while ((hrt - hrt1) === 0);
+
+  assert_true(check_resolutions(times, index), 'Difference should be at least 5 microseconds.');
+}, 'The recommended minimum resolution of the Performance interface has been set to 5 microseconds');
+</script>
+</head>
+<body>
+<h1>Description</h1>
+<p>The recommended minimum resolution of the Performance interface should be set to 5 microseconds.</p>
+
+<div id="log"></div>
+
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/dom.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/dom.idl
index 7e2667ff..9ca270ea 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/interfaces/dom.idl
+++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/dom.idl
@@ -44,7 +44,7 @@
 };
 
 
-//[Exposed=(Window,Worker)]
+[Constructor/*, Exposed=(Window,Worker)*/]
 interface EventTarget {
   void addEventListener(DOMString type, EventListener? callback, optional (EventListenerOptions or boolean) options);
   void removeEventListener(DOMString type, EventListener? callback, optional (EventListenerOptions or boolean) options);
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/web-share.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/web-share.idl
index df0bd88..cf19b7e9 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/interfaces/web-share.idl
+++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/web-share.idl
@@ -2,7 +2,7 @@
 
 partial interface Navigator {
   [SecureContext]
-  Promise<void> share(ShareData data);
+  Promise<void> share(optional ShareData data);
 };
 
 dictionary ShareData {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/navigation-timing/nav2_idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/navigation-timing/nav2_idlharness-expected.txt
index 3388f2c..31d3c5e4 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/navigation-timing/nav2_idlharness-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/navigation-timing/nav2_idlharness-expected.txt
@@ -14,5 +14,6 @@
 PASS PerformanceNavigationTiming interface: attribute loadEventEnd 
 PASS PerformanceNavigationTiming interface: attribute type 
 PASS PerformanceNavigationTiming interface: attribute redirectCount 
+FAIL PerformanceNavigationTiming interface: operation toJSON() undefined PerformanceEntry not found (inherited by PerformanceResourceTiming)
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/navigation-timing/nav2_idlharness.html b/third_party/WebKit/LayoutTests/external/wpt/navigation-timing/nav2_idlharness.html
index 7bdd5d50..eb7d94b 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/navigation-timing/nav2_idlharness.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/navigation-timing/nav2_idlharness.html
@@ -53,6 +53,7 @@
     readonly attribute DOMHighResTimeStamp loadEventEnd;
     readonly attribute NavigationType      type;
     readonly attribute unsigned short      redirectCount;
+    [Default] object toJSON();
 };
 </pre>
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/navigation-timing/resources/webperftestharness.js b/third_party/WebKit/LayoutTests/external/wpt/navigation-timing/resources/webperftestharness.js
index f9b56d9..afdfa2a7 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/navigation-timing/resources/webperftestharness.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/navigation-timing/resources/webperftestharness.js
@@ -72,6 +72,11 @@
     // ensure it's in the right order
     msg = "window.performance.timing." + attribute_name + " >= window.performance.timing." + greater_than_attribute;
     wp_test(function() { assert_true(performanceNamespace.timing[attribute_name] >= performanceNamespace.timing[greater_than_attribute], msg); }, msg, properties);
+
+    // ensure we have at least 5 microseconds difference or it's 0
+    msg = "window.performance.timing." + attribute_name + " difference with window.performance.timing." + greater_than_attribute + " is 0 or at least 5 microseconds";
+    var diff = performanceNamespace.timing[attribute_name] - performanceNamespace.timing[greater_than_attribute];
+    wp_test(function() { assert_true((diff === 0) || ((diff * 1000) >= 5), msg); }, msg, properties);
 }
 
 function test_timing_greater_than(attribute_name, greater_than, properties)
diff --git a/third_party/WebKit/LayoutTests/external/wpt/page-visibility/idlharness.html b/third_party/WebKit/LayoutTests/external/wpt/page-visibility/idlharness.html
index f5999eaa7eb..a4356ce 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/page-visibility/idlharness.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/page-visibility/idlharness.html
@@ -4,7 +4,7 @@
 <meta charset="utf-8">
 <title>Page Visibility IDL tests</title>
 <link rel="author" title="W3C" href="http://www.w3.org/" />
-<link rel="help" href="http://www.w3.org/TR/page-visibility/#sec-document-interface"/>
+<link rel="help" href="https://w3c.github.io/page-visibility/"/>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="/resources/WebIDLParser.js"></script>
@@ -16,6 +16,10 @@
 <pre id='untested_idl' style='display:none'>
 interface Document {
 };
+
+[TreatNonObjectAsNull]
+callback EventHandlerNonNull = any (Event event);
+typedef EventHandlerNonNull? EventHandler;
 </pre>
 
 <pre id='idl'>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/page-visibility/iframe-unload.html b/third_party/WebKit/LayoutTests/external/wpt/page-visibility/iframe-unload.html
new file mode 100644
index 0000000..6d049a8
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/page-visibility/iframe-unload.html
@@ -0,0 +1,49 @@
+<html>
+<title>visibilitychange fires on unload with iframes</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<script>
+
+var frameDocs = [];
+var docsLoaded = 0;
+var numFrames = 3;
+
+var ast = new async_test("visibilitychange fires on unload with iframes");
+
+function startTest() {
+  if (++docsLoaded < numFrames)
+    return;
+
+  ast.step(function () {
+    frameDocs.push(window[0].document);
+    frameDocs.push(window[0][0].document);
+    frameDocs.push(window[0][1].document);
+
+    for (var i = 0; i < frameDocs.length; ++i) {
+      frameDocs[i].addEventListener(
+          "visibilitychange",
+          onVisibilityChange.bind(null, i), false);
+    }
+
+    document.body.removeChild(document.getElementById("frame1"));
+  });
+}
+
+var checkedFrames = 0;
+
+function onVisibilityChange(i) {
+  ast.step(function () {
+    assert_equals(frameDocs[i].visibilityState, "hidden");
+  });
+  if (++checkedFrames >= numFrames) {
+    ast.done();
+  }
+}
+
+
+
+</script>
+<iframe id="frame1" src="resources/iframe-with-subframes.html"></iframe>
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/page-visibility/resources/iframe-with-subframes.html b/third_party/WebKit/LayoutTests/external/wpt/page-visibility/resources/iframe-with-subframes.html
new file mode 100644
index 0000000..febb954
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/page-visibility/resources/iframe-with-subframes.html
@@ -0,0 +1,6 @@
+<html>
+<body onload="parent.startTest()">
+<iframe id="subIframe1" onload="parent.parent.startTest()"></iframe>
+<iframe id="subIframe2" onload="parent.parent.startTest()"></iframe>
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/page-visibility/resources/pagevistestharness.js b/third_party/WebKit/LayoutTests/external/wpt/page-visibility/resources/pagevistestharness.js
index d53d73b..bfc4deb 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/page-visibility/resources/pagevistestharness.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/page-visibility/resources/pagevistestharness.js
@@ -117,5 +117,5 @@
 {
     //var open_link = window.open("http://www.bing.com");
     open_link = window.open('', '_blank');
-    setTimeout(function() { open_link.close(); }, 2000);
+    step_timeout(function() { open_link.close(); }, 2000);
 }
diff --git a/third_party/WebKit/LayoutTests/external/wpt/payment-request/allowpaymentrequest/removing-allowpaymentrequest.https.sub-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/payment-request/allowpaymentrequest/removing-allowpaymentrequest.https.sub-expected.txt
new file mode 100644
index 0000000..533d6d6
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/payment-request/allowpaymentrequest/removing-allowpaymentrequest.https.sub-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL PaymentRequest removing allowpaymentrequest after load and then navigating assert_equals: after navigation expected "Exception" but got "Success"
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/payment-request/allowpaymentrequest/removing-allowpaymentrequest.https.sub.html b/third_party/WebKit/LayoutTests/external/wpt/payment-request/allowpaymentrequest/removing-allowpaymentrequest.https.sub.html
index 048b93a..fcd7f1d 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/payment-request/allowpaymentrequest/removing-allowpaymentrequest.https.sub.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/payment-request/allowpaymentrequest/removing-allowpaymentrequest.https.sub.html
@@ -13,7 +13,7 @@
   const path = location.pathname.substring(0, location.pathname.lastIndexOf('/') + 1);
   iframe.src = "https://{{domains[www1]}}:{{ports[https][0]}}" + path + "echo-PaymentRequest.html";
   iframe.onload = t.step_func(() => {
-    if (i === 0) {
+    if (i === 1) {
       iframe.allowPaymentRequest = false;
     }
     iframe.contentWindow.postMessage('What is the result of new PaymentRequest(...)?', '*');
diff --git a/third_party/WebKit/LayoutTests/external/wpt/payment-request/allowpaymentrequest/setting-allowpaymentrequest-timing.https.sub-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/payment-request/allowpaymentrequest/setting-allowpaymentrequest-timing.https.sub-expected.txt
deleted file mode 100644
index 2103791b..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/payment-request/allowpaymentrequest/setting-allowpaymentrequest-timing.https.sub-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL PaymentRequest setting allowpaymentrequest after document creation, before response assert_equals: expected "Exception" but got "Success"
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/payment-request/allowpaymentrequest/setting-allowpaymentrequest-timing.https.sub.html b/third_party/WebKit/LayoutTests/external/wpt/payment-request/allowpaymentrequest/setting-allowpaymentrequest-timing.https.sub.html
index c7ed3ae..6a12214 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/payment-request/allowpaymentrequest/setting-allowpaymentrequest-timing.https.sub.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/payment-request/allowpaymentrequest/setting-allowpaymentrequest-timing.https.sub.html
@@ -18,8 +18,7 @@
   });
 
   window.onmessage = t.step_func_done((e) => {
-    assert_equals(e.data.message, 'Exception');
-    assert_array_equals(e.data.details, [true /* ex instanceof DOMException*/, 18 /* ex.code */, 'SecurityError' /* ex.name */]);
+    assert_equals(e.data.message, 'Success');
   });
 
   document.body.appendChild(iframe);
diff --git a/third_party/WebKit/LayoutTests/external/wpt/payment-request/allowpaymentrequest/setting-allowpaymentrequest.https.sub-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/payment-request/allowpaymentrequest/setting-allowpaymentrequest.https.sub-expected.txt
new file mode 100644
index 0000000..b1372064
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/payment-request/allowpaymentrequest/setting-allowpaymentrequest.https.sub-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL PaymentRequest setting allowpaymentrequest after load and then navigating assert_equals: after navigation expected "Success" but got "Exception"
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/payment-request/allowpaymentrequest/setting-allowpaymentrequest.https.sub.html b/third_party/WebKit/LayoutTests/external/wpt/payment-request/allowpaymentrequest/setting-allowpaymentrequest.https.sub.html
index 4564d264..bf6fe14 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/payment-request/allowpaymentrequest/setting-allowpaymentrequest.https.sub.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/payment-request/allowpaymentrequest/setting-allowpaymentrequest.https.sub.html
@@ -13,7 +13,7 @@
   const path = location.pathname.substring(0, location.pathname.lastIndexOf('/') + 1);
   iframe.src = "https://{{domains[www1]}}:{{ports[https][0]}}" + path + "echo-PaymentRequest.html";
   iframe.onload = t.step_func(() => {
-    if (i === 0) {
+    if (i === 1) {
       iframe.allowPaymentRequest = true;
     }
     iframe.contentWindow.postMessage('What is the result of new PaymentRequest(...)?', '*');
diff --git a/third_party/WebKit/LayoutTests/external/wpt/payment-request/payment-request-canmakepayment-method.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/payment-request/payment-request-canmakepayment-method.https-expected.txt
new file mode 100644
index 0000000..26436ee
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/payment-request/payment-request-canmakepayment-method.https-expected.txt
@@ -0,0 +1,10 @@
+This is a testharness.js-based test.
+Harness Error. harness_status.status = 1 , harness_status.message = Request failed
+FAIL If request.[[state]] is "created", then return a promise that resolves to true for known method. promise_test: Unhandled rejection with value: object "ReferenceError: assert_equal is not defined"
+FAIL If request.[[state]] is "interactive", then return a promise rejected with an "InvalidStateError" DOMException. promise_test: Unhandled rejection with value: object "InvalidStateError: Never called show(), so nothing to abort"
+FAIL If request.[[state]] is "closed", then return a promise rejected with an "InvalidStateError" DOMException. promise_test: Unhandled rejection with value: object "UnknownError: Request failed"
+FAIL If payment method identifier and serialized parts are supported, resolve promise with true. promise_test: Unhandled rejection with value: object "UnknownError: Request failed"
+FAIL If payment method identifier is unknown, resolve promise with false. assert_true: Unexpected exception testing method this-is-not-supported, expected false. See error console. expected true got false
+FAIL Optionally, at the user agent's discretion, return a promise rejected with a "NotAllowedError" DOMException. promise_test: Unhandled rejection with value: object "ReferenceError: assert_equal is not defined"
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/payment-request/payment-request-canmakepayment-method.https.http b/third_party/WebKit/LayoutTests/external/wpt/payment-request/payment-request-canmakepayment-method.https.html
similarity index 100%
rename from third_party/WebKit/LayoutTests/external/wpt/payment-request/payment-request-canmakepayment-method.https.http
rename to third_party/WebKit/LayoutTests/external/wpt/payment-request/payment-request-canmakepayment-method.https.html
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
new file mode 100644
index 0000000..61a1522
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/performance-timeline/idlharness-expected.txt
@@ -0,0 +1,37 @@
+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: 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: 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 PerformanceEntry interface: existence and properties of interface object 
+PASS PerformanceEntry interface object length 
+PASS PerformanceEntry interface object name 
+PASS PerformanceEntry interface: existence and properties of interface prototype object 
+PASS PerformanceEntry interface: existence and properties of interface prototype object's "constructor" property 
+PASS PerformanceEntry interface: attribute name 
+PASS PerformanceEntry interface: attribute entryType 
+PASS PerformanceEntry interface: attribute startTime 
+PASS PerformanceEntry interface: attribute duration 
+FAIL PerformanceEntry interface: operation toJSON() Type DOMHighResTimeStamp not found
+PASS PerformanceObserverEntryList interface: existence and properties of interface object 
+PASS PerformanceObserverEntryList interface object length 
+PASS PerformanceObserverEntryList interface object name 
+PASS PerformanceObserverEntryList interface: existence and properties of interface prototype object 
+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 PerformanceObserver interface: existence and properties of interface object 
+PASS PerformanceObserver interface object length 
+PASS PerformanceObserver interface object name 
+PASS PerformanceObserver interface: existence and properties of interface prototype object 
+PASS PerformanceObserver interface: existence and properties of interface prototype object's "constructor" property 
+PASS PerformanceObserver interface: operation observe(PerformanceObserverInit) 
+PASS PerformanceObserver interface: operation disconnect() 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/performance-timeline/idlharness.html b/third_party/WebKit/LayoutTests/external/wpt/performance-timeline/idlharness.html
index 0500b3e..7d6741d2 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/performance-timeline/idlharness.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/performance-timeline/idlharness.html
@@ -28,7 +28,7 @@
     readonly attribute DOMString           entryType;
     readonly attribute DOMHighResTimeStamp startTime;
     readonly attribute DOMHighResTimeStamp duration;
-    serializer = {attribute};
+    [Default] object toJSON();
 };
 
 dictionary PerformanceEntryFilterOptions {
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
new file mode 100644
index 0000000..451d5a9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/resource-timing/idlharness-expected.txt
@@ -0,0 +1,28 @@
+This is a testharness.js-based test.
+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: 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 PerformanceResourceTiming interface: existence and properties of interface object 
+PASS PerformanceResourceTiming interface object length 
+PASS PerformanceResourceTiming interface object name 
+PASS PerformanceResourceTiming interface: existence and properties of interface prototype object 
+PASS PerformanceResourceTiming interface: existence and properties of interface prototype object's "constructor" property 
+PASS PerformanceResourceTiming interface: attribute initiatorType 
+PASS PerformanceResourceTiming interface: attribute redirectStart 
+PASS PerformanceResourceTiming interface: attribute redirectEnd 
+PASS PerformanceResourceTiming interface: attribute fetchStart 
+PASS PerformanceResourceTiming interface: attribute domainLookupStart 
+PASS PerformanceResourceTiming interface: attribute domainLookupEnd 
+PASS PerformanceResourceTiming interface: attribute connectStart 
+PASS PerformanceResourceTiming interface: attribute connectEnd 
+PASS PerformanceResourceTiming interface: attribute secureConnectionStart 
+PASS PerformanceResourceTiming interface: attribute requestStart 
+PASS PerformanceResourceTiming interface: attribute responseStart 
+PASS PerformanceResourceTiming interface: attribute responseEnd 
+FAIL PerformanceResourceTiming interface: operation toJSON() assert_own_property: interface prototype object missing non-static operation expected property "toJSON" missing
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/resource-timing/idlharness.html b/third_party/WebKit/LayoutTests/external/wpt/resource-timing/idlharness.html
index 15afd094..8daf946 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/resource-timing/idlharness.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/resource-timing/idlharness.html
@@ -54,7 +54,7 @@
     readonly attribute DOMHighResTimeStamp requestStart;
     readonly attribute DOMHighResTimeStamp responseStart;
     readonly attribute DOMHighResTimeStamp responseEnd;
-    serializer = {inherit, attribute};
+    [Default] object toJSON();
 };
 partial interface Performance {
     void clearResourceTimings();
diff --git a/third_party/WebKit/LayoutTests/external/wpt/url/urlsearchparams-delete-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/url/urlsearchparams-delete-expected.txt
new file mode 100644
index 0000000..f3a9421
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/url/urlsearchparams-delete-expected.txt
@@ -0,0 +1,6 @@
+This is a testharness.js-based test.
+PASS Delete basics 
+PASS Deleting appended multiple 
+FAIL Deleting all params keeps ? in URL assert_equals: url.href has ? expected "http://example.com/?" but got "http://example.com/"
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/url/urlsearchparams-delete.html b/third_party/WebKit/LayoutTests/external/wpt/url/urlsearchparams-delete.html
index fca64621..afc9c60 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/url/urlsearchparams-delete.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/url/urlsearchparams-delete.html
@@ -36,6 +36,14 @@
     params.delete('first');
     assert_false(params.has('first'), 'Search params object has no "first" name');
 }, 'Deleting appended multiple');
+
+test(function() {
+    var url = new URL('http://example.com/?param1&param2');
+    url.searchParams.delete('param1');
+    url.searchParams.delete('param2');
+    assert_equals(url.href, 'http://example.com/?', 'url.href has ?');
+    assert_equals(url.search, '', 'url.search does not have ?');
+}, 'Deleting all params keeps ? in URL');
 </script>
 </head>
 </html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-share/idlharness.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/web-share/idlharness.https-expected.txt
new file mode 100644
index 0000000..95f8804d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-share/idlharness.https-expected.txt
@@ -0,0 +1,7 @@
+This is a testharness.js-based test.
+PASS Test driver 
+FAIL Navigator interface: operation share(ShareData) assert_equals: property has wrong .length expected 0 but got 1
+PASS Navigator interface: navigator must inherit property "share" with the proper type (0) 
+PASS Navigator interface: calling share(ShareData) on navigator with too few arguments must throw TypeError 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-share/share-empty-manual.html b/third_party/WebKit/LayoutTests/external/wpt/web-share/share-empty-manual.html
deleted file mode 100644
index 63b2d4d..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/web-share/share-empty-manual.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <title>WebShare Test: Share with empty ShareData</title>
-    <script src="/resources/testharness.js"></script>
-    <script src="/resources/testharnessreport.js"></script>
-    <script src="resources/manual-helper.js"></script>
-  </head>
-  <body>
-    <script>
-        setup({explicit_timeout: true});
-
-        setupManualShareTest({title: '', text: '', url: ''});
-        callWhenButtonClicked(() => navigator.share({}));
-    </script>
-  </body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-share/share-empty.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/web-share/share-empty.https-expected.txt
new file mode 100644
index 0000000..cad8a4d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-share/share-empty.https-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+PASS share with no arguments (same as empty dictionary) 
+FAIL share with an empty dictionary assert_throws: function "function () { throw e }" threw object "SecurityError: Must be handling a user gesture to perform a share request." ("SecurityError") expected object "TypeError" ("TypeError")
+FAIL share with a undefined argument (same as empty dictionary) assert_throws: function "function () { throw e }" threw object "SecurityError: Must be handling a user gesture to perform a share request." ("SecurityError") expected object "TypeError" ("TypeError")
+FAIL share with a null argument (same as empty dictionary) assert_throws: function "function () { throw e }" threw object "SecurityError: Must be handling a user gesture to perform a share request." ("SecurityError") expected object "TypeError" ("TypeError")
+FAIL share with a dictionary containing only surplus fields assert_throws: function "function () { throw e }" threw object "SecurityError: Must be handling a user gesture to perform a share request." ("SecurityError") expected object "TypeError" ("TypeError")
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-share/share-empty.https.html b/third_party/WebKit/LayoutTests/external/wpt/web-share/share-empty.https.html
new file mode 100644
index 0000000..ee10518
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-share/share-empty.https.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>WebShare Test: Share no known fields</title>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="resources/manual-helper.js"></script>
+  </head>
+  <body>
+    <script>
+        promise_test(t => {
+          return promise_rejects(t, new TypeError(), navigator.share());
+        }, 'share with no arguments (same as empty dictionary)');
+
+        promise_test(t => {
+          return promise_rejects(t, new TypeError(), navigator.share({}));
+        }, 'share with an empty dictionary');
+
+        promise_test(t => {
+          return promise_rejects(t, new TypeError(), navigator.share(undefined));
+        }, 'share with a undefined argument (same as empty dictionary)');
+
+        promise_test(t => {
+          return promise_rejects(t, new TypeError(), navigator.share(null));
+        }, 'share with a null argument (same as empty dictionary)');
+
+        promise_test(t => {
+          return promise_rejects(t,
+              new TypeError(), navigator.share({unused: 'unexpected field'}));
+        }, 'share with a dictionary containing only surplus fields');
+    </script>
+  </body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-share/share-without-user-gesture.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/web-share/share-without-user-gesture.https-expected.txt
new file mode 100644
index 0000000..c230bd5
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-share/share-without-user-gesture.https-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL share without a user gesture assert_throws: function "function () { throw e }" threw object "SecurityError: Must be handling a user gesture to perform a share request." that is not a DOMException NotAllowedError: property "code" is equal to 18, expected 0
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-share/share-without-user-gesture.https.html b/third_party/WebKit/LayoutTests/external/wpt/web-share/share-without-user-gesture.https.html
index fc87a4af..cf933b8 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-share/share-without-user-gesture.https.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-share/share-without-user-gesture.https.html
@@ -10,7 +10,7 @@
     <script>
         promise_test(t => {
           return promise_rejects(
-              t, 'SecurityError',
+              t, 'NotAllowedError',
               navigator.share({title: 'the title', text: 'the message',
                                url: 'data:the url'}));
         }, 'share without a user gesture');
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCConfiguration-bundlePolicy-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCConfiguration-bundlePolicy-expected.txt
new file mode 100644
index 0000000..c031d6e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCConfiguration-bundlePolicy-expected.txt
@@ -0,0 +1,18 @@
+This is a testharness.js-based test.
+FAIL Default bundlePolicy should be balanced pc.getConfiguration is not a function
+FAIL new RTCPeerConnection({ bundlePolicy: undefined }) should have bundlePolicy balanced pc.getConfiguration is not a function
+FAIL new RTCPeerConnection({ bundlePolicy: 'balanced' }) should succeed pc.getConfiguration is not a function
+FAIL new RTCPeerConnection({ bundlePolicy: 'max-compat' }) should succeed pc.getConfiguration is not a function
+FAIL new RTCPeerConnection({ bundlePolicy: 'max-bundle' }) should succeed pc.getConfiguration is not a function
+PASS setConfiguration({}) with initial default bundlePolicy balanced should succeed 
+PASS setConfiguration({}) with initial bundlePolicy balanced should succeed 
+PASS setConfiguration({ bundlePolicy: balanced }) with initial default bundlePolicy balanced should succeed 
+PASS setConfiguration({ bundlePolicy: 'balanced' }) with initial bundlePolicy balanced should succeed 
+PASS setConfiguration({ bundlePolicy: 'max-compat' }) with initial bundlePolicy max-compat should succeed 
+PASS setConfiguration({ bundlePolicy: 'max-bundle' }) with initial bundlePolicy max-bundle should succeed 
+PASS new RTCPeerConnection({ bundlePolicy: null }) should throw TypeError 
+PASS new RTCPeerConnection({ bundlePolicy: 'invalid' }) should throw TypeError 
+FAIL setConfiguration({ bundlePolicy: 'max-compat' }) with initial bundlePolicy max-bundle should throw InvalidModificationError assert_own_property: expected property "setConfiguration" missing
+FAIL setConfiguration({}) with initial bundlePolicy max-bundle should throw InvalidModificationError assert_own_property: expected property "setConfiguration" missing
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCConfiguration-bundlePolicy.html b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCConfiguration-bundlePolicy.html
new file mode 100644
index 0000000..e609ce4
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCConfiguration-bundlePolicy.html
@@ -0,0 +1,128 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCConfiguration bundlePolicy</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+  'use strict';
+
+  // Test is based on the following editor draft:
+  // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+  /*
+    4.3.2.  Interface Definition
+      [Constructor(optional RTCConfiguration configuration)]
+      interface RTCPeerConnection : EventTarget {
+        ...
+        RTCConfiguration                   getConfiguration();
+        void                               setConfiguration(RTCConfiguration configuration);
+      };
+
+    4.2.1.  RTCConfiguration Dictionary
+      dictionary RTCConfiguration {
+        RTCBundlePolicy          bundlePolicy = "balanced";
+        ...
+      };
+
+    4.2.6.  RTCBundlePolicy Enum
+      enum RTCBundlePolicy {
+        "balanced",
+        "max-compat",
+        "max-bundle"
+      };
+   */
+
+  test(() => {
+    const pc = new RTCPeerConnection();
+    assert_equals(pc.getConfiguration().bundlePolicy, 'balanced');
+  }, 'Default bundlePolicy should be balanced');
+
+  test(() => {
+    const pc = new RTCPeerConnection({ bundlePolicy: undefined });
+    assert_equals(pc.getConfiguration().bundlePolicy, 'balanced');
+  }, `new RTCPeerConnection({ bundlePolicy: undefined }) should have bundlePolicy balanced`);
+
+  test(() => {
+    const pc = new RTCPeerConnection({ bundlePolicy: 'balanced' });
+    assert_equals(pc.getConfiguration().bundlePolicy, 'balanced');
+  }, `new RTCPeerConnection({ bundlePolicy: 'balanced' }) should succeed`);
+
+  test(() => {
+    const pc = new RTCPeerConnection({ bundlePolicy: 'max-compat' });
+    assert_equals(pc.getConfiguration().bundlePolicy, 'max-compat');
+  }, `new RTCPeerConnection({ bundlePolicy: 'max-compat' }) should succeed`);
+
+  test(() => {
+    const pc = new RTCPeerConnection({ bundlePolicy: 'max-bundle' });
+    assert_equals(pc.getConfiguration().bundlePolicy, 'max-bundle');
+  }, `new RTCPeerConnection({ bundlePolicy: 'max-bundle' }) should succeed`);
+
+  test(() => {
+    const pc = new RTCPeerConnection();
+    pc.setConfiguration({});
+  }, 'setConfiguration({}) with initial default bundlePolicy balanced should succeed');
+
+  test(() => {
+    const pc = new RTCPeerConnection({ bundlePolicy: 'balanced' });
+    pc.setConfiguration({});
+  }, 'setConfiguration({}) with initial bundlePolicy balanced should succeed');
+
+  test(() => {
+    const pc = new RTCPeerConnection();
+    pc.setConfiguration({ bundlePolicy: 'balanced' });
+  }, 'setConfiguration({ bundlePolicy: balanced }) with initial default bundlePolicy balanced should succeed');
+
+  test(() => {
+    const pc = new RTCPeerConnection({ bundlePolicy: 'balanced' });
+    pc.setConfiguration({ bundlePolicy: 'balanced' });
+  }, `setConfiguration({ bundlePolicy: 'balanced' }) with initial bundlePolicy balanced should succeed`);
+
+  test(() => {
+    const pc = new RTCPeerConnection({ bundlePolicy: 'max-compat' });
+    pc.setConfiguration({ bundlePolicy: 'max-compat' });
+  }, `setConfiguration({ bundlePolicy: 'max-compat' }) with initial bundlePolicy max-compat should succeed`);
+
+  test(() => {
+    const pc = new RTCPeerConnection({ bundlePolicy: 'max-bundle' });
+    pc.setConfiguration({ bundlePolicy: 'max-bundle' });
+  }, `setConfiguration({ bundlePolicy: 'max-bundle' }) with initial bundlePolicy max-bundle should succeed`);
+
+  test(() => {
+    assert_throws(new TypeError(), () =>
+      new RTCPeerConnection({ bundlePolicy: null }));
+  }, `new RTCPeerConnection({ bundlePolicy: null }) should throw TypeError`);
+
+  test(() => {
+    assert_throws(new TypeError(), () =>
+      new RTCPeerConnection({ bundlePolicy: 'invalid' }));
+  }, `new RTCPeerConnection({ bundlePolicy: 'invalid' }) should throw TypeError`);
+
+  /*
+    4.3.2.  Interface Definition
+      To set a configuration
+        5.  If configuration.bundlePolicy is set and its value differs from the
+            connection's bundle policy, throw an InvalidModificationError.
+   */
+  test(() => {
+    const pc = new RTCPeerConnection({ bundlePolicy: 'max-bundle' });
+    assert_own_property(pc, 'setConfiguration');
+
+    assert_throws('InvalidModificationError', () =>
+      pc.setConfiguration({ bundlePolicy: 'max-compat' }));
+  }, `setConfiguration({ bundlePolicy: 'max-compat' }) with initial bundlePolicy max-bundle should throw InvalidModificationError`);
+
+  test(() => {
+    const pc = new RTCPeerConnection({ bundlePolicy: 'max-bundle' });
+    assert_own_property(pc, 'setConfiguration');
+
+    // the default value for bundlePolicy is balanced
+    assert_throws('InvalidModificationError', () =>
+      pc.setConfiguration({}));
+  }, `setConfiguration({}) with initial bundlePolicy max-bundle should throw InvalidModificationError`);
+
+  /*
+    Coverage Report
+      Tested    2
+      Total     2
+   */
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-constructor-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-constructor-expected.txt
index e5236ea..2621126a 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-constructor-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-constructor-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 71 tests; 60 PASS, 11 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 65 tests; 54 PASS, 11 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS RTCPeerConnection.length 
 PASS new RTCPeerConnection() 
 PASS new RTCPeerConnection(null) 
@@ -46,12 +46,6 @@
 PASS new RTCPeerConnection({ iceTransportPolicy: "none" }) 
 FAIL new RTCPeerConnection({ iceTransports: "invalid" }) Failed to construct 'RTCPeerConnection': The provided value 'invalid' is not a valid enum value of type RTCIceTransportPolicy.
 FAIL new RTCPeerConnection({ iceTransports: "none" }) Failed to construct 'RTCPeerConnection': The provided value 'none' is not a valid enum value of type RTCIceTransportPolicy.
-PASS new RTCPeerConnection({ bundlePolicy: null }) 
-PASS new RTCPeerConnection({ bundlePolicy: undefined }) 
-PASS new RTCPeerConnection({ bundlePolicy: "balanced" }) 
-PASS new RTCPeerConnection({ bundlePolicy: "max-compat" }) 
-PASS new RTCPeerConnection({ bundlePolicy: "max-bundle" }) 
-PASS new RTCPeerConnection({ bundlePolicy: "invalid" }) 
 PASS new RTCPeerConnection({ rtcpMuxPolicy: null }) 
 PASS new RTCPeerConnection({ rtcpMuxPolicy: undefined }) 
 PASS new RTCPeerConnection({ rtcpMuxPolicy: "negotiate" }) 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-constructor.html b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-constructor.html
index 97cc200b..d14afaf 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-constructor.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-constructor.html
@@ -70,14 +70,6 @@
   '{ iceTransports: "invalid" }': false,
   '{ iceTransports: "none" }': false,
 
-  // bundlePolicy
-  '{ bundlePolicy: null }': new TypeError,
-  '{ bundlePolicy: undefined }': false,
-  '{ bundlePolicy: "balanced" }': false,
-  '{ bundlePolicy: "max-compat" }': false,
-  '{ bundlePolicy: "max-bundle" }': false,
-  '{ bundlePolicy: "invalid" }': new TypeError,
-
   // rtcpMuxPolicy
   '{ rtcpMuxPolicy: null }': new TypeError,
   '{ rtcpMuxPolicy: undefined }': false,
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-getDefaultIceServers-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-getDefaultIceServers-expected.txt
new file mode 100644
index 0000000..559d50c3
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-getDefaultIceServers-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL RTCPeerConnection.getDefaultIceServers() should return array of RTCIceServer assert_own_property: expected property "getDefaultIceServers" missing
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-getDefaultIceServers.html b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-getDefaultIceServers.html
new file mode 100644
index 0000000..8d06f08
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-getDefaultIceServers.html
@@ -0,0 +1,99 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCPeerConnection.getDefaultIceServers</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+  'use strict';
+
+  // Test is based on the following editor draft:
+  // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+  /*
+      [Constructor(optional RTCConfiguration configuration)]
+      interface RTCPeerConnection : EventTarget {
+        static sequence<RTCIceServer>      getDefaultIceServers();
+        ...
+      };
+
+      dictionary RTCIceServer {
+        required (DOMString or sequence<DOMString>) urls;
+                 DOMString                          username;
+                 (DOMString or RTCOAuthCredential)  credential;
+                 RTCIceCredentialType               credentialType = "password";
+      };
+
+      dictionary RTCOAuthCredential {
+        required DOMString macKey;
+        required DOMString accessToken;
+      };
+
+      enum RTCIceCredentialType {
+        "password",
+        "oauth"
+      };
+   */
+
+  test(() => {
+    assert_own_property(RTCPeerConnection, 'getDefaultIceServers');
+    const iceServers = RTCPeerConnection.getDefaultIceServers();
+
+    assert_true(Array.isArray(iceServers),
+      'Expect iceServers to be an array');
+
+    // dictionary IDL cannot be tested automatically using idlharness
+    for(const server of iceServers) {
+      const { urls, username, credential, credentialType } = server;
+
+      if(Array.isArray(urls)) {
+        for(const url of urls) {
+          assert_equals(typeof url, 'string',
+            'Expect elements in urls array to be string');
+        }
+      } else {
+        assert_equals(typeof urls, 'string',
+          'Expect urls to be either string or array');
+      }
+
+      if(username !== undefined) {
+        assert_equals(typeof username, 'string',
+          'Expect username to be either undefined or string');
+      }
+
+      assert_true(credentialType === 'password' || credentialType === 'oauth',
+        'Expect credentialType to be either password or oauth')
+
+      if(credential) {
+        if(typeof(credential) === 'object') {
+          const { macKey, accessToken } = credential;
+          assert_equals(typeof macKey, 'string',
+            'Expect macKey to be string');
+
+          assert_equals(typeof accessToken, 'string',
+            'Expect accessToken to be string');
+
+        } else {
+          assert_equals(typeof credential, 'string',
+            'Expect credential to be either undefined, string, or RTCOauthCredential dictionary');
+        }
+      }
+    }
+
+    // Expect default ice servers to be accepted as valid configuration
+    const pc = new RTCPeerConnection({ iceServers });
+
+    // Only make sure there are same number of ice servers configured
+    // and not do any deep equality checking
+    assert_equals(pc.getConfiguration().iceServers.length, iceServers.length);
+
+  }, 'RTCPeerConnection.getDefaultIceServers() should return array of RTCIceServer');
+
+  /*
+    Coverage Report
+      Since there is no steps involved and we are only checking basic call,
+      This is counted as 1 trivial test coverage.
+
+      Tested    1
+      Total     1
+   */
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCRtpTransceiver-setDirection-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCRtpTransceiver-setDirection-expected.txt
new file mode 100644
index 0000000..f871d9e1
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCRtpTransceiver-setDirection-expected.txt
@@ -0,0 +1,6 @@
+This is a testharness.js-based test.
+FAIL setDirection should change transceiver.direction pc.addTransceiver is not a function
+FAIL setDirection with same direction should have no effect pc.addTransceiver is not a function
+FAIL setDirection should change transceiver.direction independent of transceiver.currentDirection pc.addTransceiver is not a function
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCRtpTransceiver-setDirection.html b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCRtpTransceiver-setDirection.html
new file mode 100644
index 0000000..00cddce
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCRtpTransceiver-setDirection.html
@@ -0,0 +1,94 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCRtpTransceiver.prototype.setDirection</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
+<script>
+  'use strict';
+
+  // Test is based on the following editor draft:
+  // https://rawgit.com/w3c/webrtc-pc/cc8d80f455b86c8041d63bceb8b457f45c72aa89/webrtc.html
+
+  // The following helper functions are called from RTCPeerConnection-helper.js:
+  // generateAnswer
+
+  /*
+    5.4.  RTCRtpTransceiver Interface
+      interface RTCRtpTransceiver {
+        readonly attribute RTCRtpTransceiverDirection  direction;
+        readonly attribute RTCRtpTransceiverDirection? currentDirection;
+        void setDirection(RTCRtpTransceiverDirection direction);
+        ...
+      };
+   */
+
+   /*
+    5.4.  setDirection
+      4.  Set transceiver's [[Direction]] slot to newDirection.
+   */
+  test(t => {
+    const pc = new RTCPeerConnection();
+    const transceiver = pc.addTransceiver('audio');
+    assert_equals(transceiver.direction, 'sendrecv');
+    assert_equals(transceiver.currentDirection, null);
+
+    transceiver.setDirection('recvonly');
+    assert_equals(transceiver.direction, 'recvonly');
+    assert_equals(transceiver.currentDirection, null,
+      'Expect transceiver.currentDirection to not change');
+
+  }, 'setDirection should change transceiver.direction');
+
+   /*
+    5.4.  setDirection
+      3.  If newDirection is equal to transceiver's [[Direction]] slot, abort
+          these steps.
+   */
+  test(t => {
+    const pc = new RTCPeerConnection();
+    const transceiver = pc.addTransceiver('audio', { direction: 'sendonly' });
+    assert_equals(transceiver.direction, 'sendonly');
+    transceiver.setDirection('sendonly');
+    assert_equals(transceiver.direction, 'sendonly');
+
+  }, 'setDirection with same direction should have no effect');
+
+  promise_test(t => {
+    const pc = new RTCPeerConnection();
+    const transceiver = pc.addTransceiver('audio', { direction: 'recvonly' });
+    assert_equals(transceiver.direction, 'recvonly');
+    assert_equals(transceiver.currentDirection, null);
+
+    return pc.createOffer()
+    .then(offer =>
+      pc.setLocalDescription(offer)
+      .then(() => generateAnswer(offer)))
+    .then(answer => pc.setRemoteDescription(answer))
+    .then(() => {
+      assert_equals(transceiver.currentDirection, 'recvonly');
+      transceiver.setDirection('sendrecv');
+      assert_equals(transceiver.direction, 'sendrecv');
+      assert_equals(transceiver.currentDirection, 'recvonly');
+    });
+  }, 'setDirection should change transceiver.direction independent of transceiver.currentDirection');
+
+  /*
+    TODO
+        Calls to setDirection() do not take effect immediately. Instead, future calls
+        to createOffer and createAnswer mark the corresponding media description as
+        sendrecv, sendonly, recvonly or inactive as defined in [JSEP] (section 5.2.2.
+        and section 5.3.2.).
+
+    Tested in RTCPeerConnection-onnegotiationneeded.html
+      5.4.  setDirection
+        6.  Update the negotiation-needed flag for connection.
+
+    Coverage Report
+      Tested        6
+      Not Tested    1
+      Untestable    0
+      Total         7
+   */
+
+</script>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-02-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-02-t.svg
index ce7bdc9..3c8f3a53 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-02-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-02-t.svg
@@ -90,4 +90,8 @@
     <text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.8 $</text>
     <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
    </g>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-03-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-03-t.svg
index 51c8e899..27cdf90 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-03-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-03-t.svg
@@ -85,4 +85,8 @@
   </g>
   <text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.10 $</text>
   <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-04-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-04-t.svg
index ac3cdee..cee696b 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-04-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-04-t.svg
@@ -50,4 +50,8 @@
 	</g>
 	<text id="revision" x="5" y="57" font-size="6" stroke="none" fill="black">$Revision: 1.7 $</text>
 	<rect id="test-frame" x="1" y="1" width="78" height="58" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-05-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-05-t.svg
index 5cb72ad..e1a2c3c6b 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-05-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-05-t.svg
@@ -52,4 +52,8 @@
 	</g>
 	<text id="revision" x="5" y="57" font-size="6" stroke="none" fill="black">$Revision: 1.8 $</text>
 	<rect id="test-frame" x="1" y="1" width="78" height="58" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-06-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-06-t.svg
index 1cb3f5b..d17c878 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-06-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-06-t.svg
@@ -51,4 +51,8 @@
 	</g>
 	<text id="revision" x="5" y="57" font-size="6" stroke="none" fill="black">$Revision: 1.9 $</text>
 	<rect id="test-frame" x="1" y="1" width="78" height="58" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-07-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-07-t.svg
index 44867325..92409b6 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-07-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-07-t.svg
@@ -53,4 +53,8 @@
 	</g>
 	<text id="revision" x="5" y="57" font-size="6" stroke="none" fill="black">$Revision: 1.8 $</text>
 	<rect id="test-frame" x="1" y="1" width="78" height="58" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-08-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-08-t.svg
index 588d5c6..6e2c45c 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-08-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-08-t.svg
@@ -68,4 +68,8 @@
 	</g>
 	<text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.8 $</text>
 	<rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-09-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-09-t.svg
index 16401ca..3162bcf9 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-09-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-09-t.svg
@@ -87,4 +87,8 @@
     </g>
     <text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.8 $</text>
     <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-10-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-10-t.svg
index 7c3473ea..ae29af8 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-10-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-10-t.svg
@@ -84,4 +84,8 @@
     </g>
     <text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.8 $</text>
     <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-11-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-11-t.svg
index 783ac15..5b1c63e7 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-11-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-11-t.svg
@@ -83,4 +83,8 @@
     </g>
     <text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.9 $</text>
     <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-12-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-12-t.svg
index 7f8b3c56..613e85bb 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-12-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-12-t.svg
@@ -83,4 +83,8 @@
     </g>
     <text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.8 $</text>
     <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-13-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-13-t.svg
index 8f0aff07f..98d6ab1 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-13-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-13-t.svg
@@ -91,4 +91,8 @@
 
     <text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.8 $</text>
     <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-14-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-14-t.svg
index 6809fd47..782ca91 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-14-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-14-t.svg
@@ -72,5 +72,9 @@
    </g>
    <text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.6 $</text>
    <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
 
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-15-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-15-t.svg
index c075c15..1f57eaa 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-15-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-15-t.svg
@@ -73,5 +73,9 @@
    </g>
    <text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.5 $</text>
    <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
 
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-16-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-16-t.svg
index c5d8d15..f00afe0 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-16-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-16-t.svg
@@ -73,5 +73,9 @@
    </g>
    <text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.1 $</text>
    <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
 
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-17-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-17-t.svg
index b1d378f7..d84c63b5 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-17-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-17-t.svg
@@ -73,5 +73,9 @@
    </g>
    <text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.6 $</text>
    <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
 
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-18-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-18-t.svg
index af4c139..f63d5ce 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-18-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-18-t.svg
@@ -72,5 +72,9 @@
    </g>
    <text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.1 $</text>
    <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
 
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-19-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-19-t.svg
index f01c31e..2d8fa90 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-19-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-19-t.svg
@@ -73,5 +73,9 @@
    </g>
    <text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.6 $</text>
    <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
 
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-20-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-20-t.svg
index 3aa6b057..431f4527 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-20-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-20-t.svg
@@ -72,4 +72,8 @@
 	</g>
 	<text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.8 $</text>
 	<rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-21-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-21-t.svg
index 05b36deb..e2baa0b 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-21-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-21-t.svg
@@ -84,4 +84,8 @@
 	</g>
 	<text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.8 $</text>
 	<rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-22-b.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-22-b.svg
index c2fc11d..cba1ecb 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-22-b.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-22-b.svg
@@ -76,5 +76,9 @@
 	</g>
 	<text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.6 $</text>
 	<rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
 
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-23-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-23-t.svg
index fbfa958..03eef70a 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-23-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-23-t.svg
@@ -83,5 +83,9 @@
 	</g>
 	<text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.7 $</text>
 	<rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
 
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-24-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-24-t.svg
index 2d2f041..3415fdc 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-24-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-24-t.svg
@@ -102,4 +102,8 @@
 	</g>
 	<text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.7 $</text>
 	<rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-25-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-25-t.svg
index f515038f..1d400ad2 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-25-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-25-t.svg
@@ -56,4 +56,8 @@
 	</g>
 	<text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.7 $</text>
 	<rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-26-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-26-t.svg
index 02f0116..53a1d7a9 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-26-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-26-t.svg
@@ -56,4 +56,8 @@
 	</g>
 	<text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.7 $</text>
 	<rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-27-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-27-t.svg
index d6e36db5..3e0ef48 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-27-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-27-t.svg
@@ -73,5 +73,9 @@
 	</g>
 	<text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.7 $</text>
 	<rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
 
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-28-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-28-t.svg
index c99306e..16ad4b6 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-28-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-28-t.svg
@@ -50,4 +50,8 @@
     <text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.6 $</text>
     <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
 	</g>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-29-b.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-29-b.svg
index 10f46659..d171d1c 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-29-b.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-29-b.svg
@@ -95,4 +95,8 @@
 	</g>
 	<text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.5 $</text>
 	<rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-30-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-30-t.svg
index 191a42b..40e3942b 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-30-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-30-t.svg
@@ -131,4 +131,8 @@
    
    <text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.6 $</text>
    <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-31-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-31-t.svg
index 42306e3d..142fafc 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-31-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-31-t.svg
@@ -94,4 +94,8 @@
     
     <text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.6 $</text>
     <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-32-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-32-t.svg
index 3b6be56..ae199495 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-32-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-32-t.svg
@@ -134,4 +134,8 @@
     </g>
 	<text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.16 $</text>
 	<rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-33-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-33-t.svg
index 491f623..6c8babb86 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-33-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-33-t.svg
@@ -110,4 +110,8 @@
 	<text x="5" y="265" font-size="18">Number indicates the circle's passing time in seconds.</text>
 	<text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.8 $</text>
 	<rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-34-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-34-t.svg
index 4aef8951..b0551ddf 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-34-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-34-t.svg
@@ -78,4 +78,8 @@
        
 <text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.7 $</text>
 <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-36-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-36-t.svg
index 9f06e85..2a88f14 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-36-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-36-t.svg
@@ -118,4 +118,8 @@
         </g>
 
     </g>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-37-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-37-t.svg
index 2c774b47..d0a9775 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-37-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-37-t.svg
@@ -75,4 +75,8 @@
             <text y="60" text-anchor="middle">&lt;polygon&gt;</text>
         </g>
     </g>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-39-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-39-t.svg
index 48e7384..7825a5d 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-39-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-39-t.svg
@@ -120,4 +120,8 @@
 
 
     </g>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-40-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-40-t.svg
index e9be779..ee39a99 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-40-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-40-t.svg
@@ -198,4 +198,8 @@
 
     <text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.8 $</text>
     <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-41-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-41-t.svg
index 50cc3bf..d02f14b8 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-41-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-41-t.svg
@@ -403,4 +403,8 @@
     </g>
     <text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.9 $</text>
     <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-44-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-44-t.svg
index 7090a96f..eaf740a 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-44-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-44-t.svg
@@ -52,4 +52,8 @@
     <text x="5" y="275" font-size="18">Filled circle should follow morphing digit discretely.</text>
     <text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.7 $</text>
     <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-46-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-46-t.svg
index 4f90f63..35246d1 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-46-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-46-t.svg
@@ -218,4 +218,8 @@
     </g>
     <text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.8 $</text>
     <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-52-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-52-t.svg
index 1a5e7ec..4153b98 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-52-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-52-t.svg
@@ -76,4 +76,8 @@
 
    <text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.8 $</text>
    <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-60-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-60-t.svg
index 3a0ad69..f3abd75 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-60-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-60-t.svg
@@ -432,4 +432,8 @@
 
     </g>
 
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-61-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-61-t.svg
index 3c203c5..3beb5a96 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-61-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-61-t.svg
@@ -312,4 +312,8 @@
 
     </g>
 
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-62-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-62-t.svg
index 3e33ed6..b41a998 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-62-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-62-t.svg
@@ -438,4 +438,8 @@
 
     </g>
 
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-63-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-63-t.svg
index 956d962..b5d6ec1 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-63-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-63-t.svg
@@ -320,4 +320,8 @@
 
     </g>
 
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-64-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-64-t.svg
index 1b16073..31271bf 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-64-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-64-t.svg
@@ -102,4 +102,8 @@
             </g>
         </g>
     </g>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-65-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-65-t.svg
index b4579a1..2e6def4 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-65-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-65-t.svg
@@ -183,4 +183,8 @@
             </g>
         </g>
     </g>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-66-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-66-t.svg
index 049781e..8270d882 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-66-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-66-t.svg
@@ -185,4 +185,8 @@
 
         </g>
     </g>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-67-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-67-t.svg
index d834ee8..ea013a1 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-67-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-67-t.svg
@@ -147,4 +147,8 @@
             </g>
         </g>
     </g>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-68-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-68-t.svg
index dd83fdc..5f1c312 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-68-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-68-t.svg
@@ -112,4 +112,8 @@
 
         </g>
     </g>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-69-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-69-t.svg
index ab50778b3..55b87c99 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-69-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-69-t.svg
@@ -129,4 +129,8 @@
             </g>
         </g>
     </g>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-70-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-70-t.svg
index b1c2204..10198df 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-70-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-70-t.svg
@@ -123,4 +123,8 @@
             </g>
         </g>
     </g>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-77-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-77-t.svg
index 930e54e..b26417a 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-77-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-77-t.svg
@@ -292,4 +292,8 @@
             </g> 
         </g> 
     </g>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-78-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-78-t.svg
index 96dc8b1f..c1b4ecca 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-78-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-78-t.svg
@@ -501,4 +501,8 @@
         </g>
 
     </g>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-80-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-80-t.svg
index 4201236..cf6c974 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-80-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-80-t.svg
@@ -251,4 +251,8 @@
         </g>
 
     </g>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-81-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-81-t.svg
index 4decb7b..7adda2b1 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-81-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-81-t.svg
@@ -135,4 +135,8 @@
         </g>
 
     </g>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-82-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-82-t.svg
index a81ef55..fea4d78 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-82-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-82-t.svg
@@ -284,4 +284,8 @@
 
 
     </g>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-83-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-83-t.svg
index 6503558..5cd3c193 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-83-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-83-t.svg
@@ -191,4 +191,8 @@
         </g>
 
     </g>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-84-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-84-t.svg
index 1749453..ab740ac 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-84-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-84-t.svg
@@ -62,4 +62,8 @@
   </g>
   <text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.4 $</text>
   <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-85-t.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-85-t.svg
index 122c9f3..3fa506d 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-85-t.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/animate-elem-85-t.svg
@@ -66,4 +66,8 @@
   </g>
   <text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.2 $</text>
   <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/filters-light-04-f.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/filters-light-04-f.svg
index bd3ee58b..b1f176f 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/filters-light-04-f.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/filters-light-04-f.svg
@@ -133,4 +133,8 @@
     <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
       text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
   </g>-->
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/pservers-grad-19-b.svg b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/pservers-grad-19-b.svg
index 12d62929..90110ece 100644
--- a/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/pservers-grad-19-b.svg
+++ b/third_party/WebKit/LayoutTests/svg/W3C-SVG-1.1/pservers-grad-19-b.svg
@@ -78,4 +78,8 @@
   </g>
   <text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.6 $</text>
   <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+  <script>
+    // Pause the animation at t=0.
+    document.documentElement.pauseAnimations();
+  </script>
 </svg>
diff --git a/tools/perf/benchmark.csv b/tools/perf/benchmark.csv
index 81b19a1..767f75a0 100644
--- a/tools/perf/benchmark.csv
+++ b/tools/perf/benchmark.csv
@@ -127,8 +127,6 @@
 v8.browsing_desktop,ulan@chromium.org,
 v8.browsing_mobile,ulan@chromium.org,
 v8.detached_context_age_in_gc,ulan@chromium.org,
-v8.infinite_scroll_tbmv2,ulan@chromium.org,
-v8.mobile_infinite_scroll_tbmv2,ulan@chromium.org,
 v8.runtime_stats.top_25,cbruni@chromium.org,
 v8.runtimestats.browsing_desktop,mythria@chromium.org,
 v8.runtimestats.browsing_mobile,mythria@chromium.org,
diff --git a/tools/perf/benchmarks/system_health_smoke_test.py b/tools/perf/benchmarks/system_health_smoke_test.py
index fb8dead..4e80dd2 100644
--- a/tools/perf/benchmarks/system_health_smoke_test.py
+++ b/tools/perf/benchmarks/system_health_smoke_test.py
@@ -65,14 +65,6 @@
 
   # crbug.com/699966
   'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_desktop.multitab:misc:typical24', # pylint: disable=line-too-long
-  # crbug.com/725923
-  'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_desktop.load:social:facebook', # pylint: disable=line-too-long
-  'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_desktop.load:media:flickr', # pylint: disable=line-too-long
-  'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_desktop.load:social:tumblr', # pylint: disable=line-too-long
-  'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_desktop.load:social:twitter', # pylint: disable=line-too-long
-  'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_mobile.load:social:facebook', # pylint: disable=line-too-long
-  'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_mobile.load:social:tumblr', # pylint: disable=line-too-long
-  'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_mobile.load:social:pinterest', # pylint: disable=line-too-long
   # crbug.com/725386
   'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_desktop.browse:social:twitter', # pylint: disable=line-too-long
 })
diff --git a/tools/perf/benchmarks/v8.py b/tools/perf/benchmarks/v8.py
index f285662..f5d8241 100644
--- a/tools/perf/benchmarks/v8.py
+++ b/tools/perf/benchmarks/v8.py
@@ -3,7 +3,6 @@
 # found in the LICENSE file.
 from core import perf_benchmark
 
-from benchmarks import v8_helper
 
 from measurements import v8_detached_context_age_in_gc
 import page_sets
@@ -11,7 +10,6 @@
 from telemetry import benchmark
 from telemetry import story
 from telemetry.timeline import chrome_trace_category_filter
-from telemetry.timeline import chrome_trace_config
 from telemetry.web_perf import timeline_based_measurement
 
 
@@ -40,95 +38,6 @@
         pass # Nothing not disabled.
     return StoryExpectations()
 
-class _InfiniteScrollBenchmark(perf_benchmark.PerfBenchmark):
-  """ Base class for infinite scroll benchmarks.
-  """
-
-  def SetExtraBrowserOptions(self, options):
-    options.AppendExtraBrowserArgs([
-        # Disable push notifications for Facebook.
-        '--disable-notifications',
-    ])
-    v8_helper.AppendJSFlags(options, '--heap-growing-percent=10')
-
-  def CreateTimelineBasedMeasurementOptions(self):
-    categories = [
-      # Disable all categories by default.
-      '-*',
-      # Memory categories.
-      'disabled-by-default-memory-infra',
-      # EQT categories.
-      'blink.user_timing',
-      'loading',
-      'navigation',
-      'toplevel',
-      # V8 categories.
-      'blink.console',
-      'disabled-by-default-v8.compile',
-      'disabled-by-default-v8.gc',
-      'renderer.scheduler',
-      'v8',
-      'webkit.console'
-    ]
-    category_filter = chrome_trace_category_filter.ChromeTraceCategoryFilter(
-        ','.join(categories))
-    options = timeline_based_measurement.Options(category_filter)
-    # TODO(ulan): Add frame time discrepancy once it is ported to TBMv2,
-    # see crbug.com/606841.
-    options.SetTimelineBasedMetrics([
-      'expectedQueueingTimeMetric', 'v8AndMemoryMetrics'])
-    # Setting an empty memory dump config disables periodic dumps.
-    options.config.chrome_trace_config.SetMemoryDumpConfig(
-        chrome_trace_config.MemoryDumpConfig())
-    return options
-
-  @classmethod
-  def ValueCanBeAddedPredicate(cls, value, _):
-    return ('v8' in value.name) or ('eqt' in value.name)
-
-  @classmethod
-  def ShouldTearDownStateAfterEachStoryRun(cls):
-    return True
-
-
-@benchmark.Disabled('android') # Android runs V8MobileInfiniteScroll.
-@benchmark.Owner(emails=['ulan@chromium.org'])
-class V8InfiniteScroll(_InfiniteScrollBenchmark):
-  """Measures V8 GC metrics and memory usage while scrolling the top web pages.
-  http://www.chromium.org/developers/design-documents/rendering-benchmarks"""
-
-  page_set = page_sets.InfiniteScrollStorySet
-
-  @classmethod
-  def Name(cls):
-    return 'v8.infinite_scroll_tbmv2'
-
-  def GetExpectations(self):
-    class StoryExpectations(story.expectations.StoryExpectations):
-      def SetExpectations(self):
-         pass # blank_page.html not disabled.
-    return StoryExpectations()
-
-
-@benchmark.Enabled('android')
-@benchmark.Owner(emails=['ulan@chromium.org'])
-class V8MobileInfiniteScroll(_InfiniteScrollBenchmark):
-  """Measures V8 GC metrics and memory usage while scrolling the top mobile
-  web pages.
-  http://www.chromium.org/developers/design-documents/rendering-benchmarks"""
-
-  page_set = page_sets.MobileInfiniteScrollStorySet
-
-  @classmethod
-  def Name(cls):
-    return 'v8.mobile_infinite_scroll_tbmv2'
-
-  def GetExpectations(self):
-    class StoryExpectations(story.expectations.StoryExpectations):
-      def SetExpectations(self):
-        pass # blank_page.html not disabled.
-    return StoryExpectations()
-
 
 class _Top25RuntimeStats(perf_benchmark.PerfBenchmark):
   options = {'pageset_repeat': 3}
diff --git a/tools/perf/page_sets/data/infinite_scroll.json b/tools/perf/page_sets/data/infinite_scroll.json
deleted file mode 100644
index 53f53c3..0000000
--- a/tools/perf/page_sets/data/infinite_scroll.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
-    "archives": {
-        "discourse": {
-            "DEFAULT": "infinite_scroll_004.wpr"
-        },
-        "espn": {
-            "DEFAULT": "infinite_scroll_000.wpr"
-        },
-        "facebook": {
-            "DEFAULT": "infinite_scroll_001.wpr"
-        },
-        "flickr": {
-            "DEFAULT": "infinite_scroll_003.wpr"
-        },
-        "tumblr": {
-            "DEFAULT": "infinite_scroll_002.wpr"
-        },
-        "twitter": {
-            "DEFAULT": "infinite_scroll_000.wpr"
-        },
-        "yahoo": {
-            "DEFAULT": "infinite_scroll_000.wpr"
-        }
-    },
-    "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating.",
-    "platform_specific": true
-}
\ No newline at end of file
diff --git a/tools/perf/page_sets/data/infinite_scroll_000.wpr.sha1 b/tools/perf/page_sets/data/infinite_scroll_000.wpr.sha1
deleted file mode 100644
index 94829170..0000000
--- a/tools/perf/page_sets/data/infinite_scroll_000.wpr.sha1
+++ /dev/null
@@ -1 +0,0 @@
-1c02c0cf53e6e39316e75dbb26e78585f21695ea
\ No newline at end of file
diff --git a/tools/perf/page_sets/data/infinite_scroll_001.wpr.sha1 b/tools/perf/page_sets/data/infinite_scroll_001.wpr.sha1
deleted file mode 100644
index 20348f8e..0000000
--- a/tools/perf/page_sets/data/infinite_scroll_001.wpr.sha1
+++ /dev/null
@@ -1 +0,0 @@
-8837d917d8d14b17442ec7bf1fe18cb7cbfaac0a
\ No newline at end of file
diff --git a/tools/perf/page_sets/data/infinite_scroll_002.wpr.sha1 b/tools/perf/page_sets/data/infinite_scroll_002.wpr.sha1
deleted file mode 100644
index 10295d73..0000000
--- a/tools/perf/page_sets/data/infinite_scroll_002.wpr.sha1
+++ /dev/null
@@ -1 +0,0 @@
-16b472c2033ce5682584f7182f1962e49792a943
\ No newline at end of file
diff --git a/tools/perf/page_sets/data/infinite_scroll_003.wpr.sha1 b/tools/perf/page_sets/data/infinite_scroll_003.wpr.sha1
deleted file mode 100644
index ee6af776..0000000
--- a/tools/perf/page_sets/data/infinite_scroll_003.wpr.sha1
+++ /dev/null
@@ -1 +0,0 @@
-ddb456bd12709473e0aee8821d5d7af1b18e9b1a
\ No newline at end of file
diff --git a/tools/perf/page_sets/data/infinite_scroll_004.wpr.sha1 b/tools/perf/page_sets/data/infinite_scroll_004.wpr.sha1
deleted file mode 100644
index 62b9e54..0000000
--- a/tools/perf/page_sets/data/infinite_scroll_004.wpr.sha1
+++ /dev/null
@@ -1 +0,0 @@
-404375ec3af6383b273e6745b0f885e99cbcf9bc
\ No newline at end of file
diff --git a/tools/perf/page_sets/data/mobile_infinite_scroll.json b/tools/perf/page_sets/data/mobile_infinite_scroll.json
deleted file mode 100644
index a8bd5f7..0000000
--- a/tools/perf/page_sets/data/mobile_infinite_scroll.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-    "archives": {
-        "discourse": {
-            "DEFAULT": "mobile_infinite_scroll_000.wpr"
-        },
-        "facebook": {
-            "DEFAULT": "mobile_infinite_scroll_000.wpr"
-        },
-        "flickr": {
-            "DEFAULT": "mobile_infinite_scroll_000.wpr"
-        },
-        "pinterest": {
-            "DEFAULT": "mobile_infinite_scroll_001.wpr"
-        },
-        "tumblr": {
-            "DEFAULT": "mobile_infinite_scroll_000.wpr"
-        },
-        "twitter": {
-            "DEFAULT": "mobile_infinite_scroll_000.wpr"
-        }
-    },
-    "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating.",
-    "platform_specific": true
-}
diff --git a/tools/perf/page_sets/data/mobile_infinite_scroll_000.wpr.sha1 b/tools/perf/page_sets/data/mobile_infinite_scroll_000.wpr.sha1
deleted file mode 100644
index 55d18b8b..0000000
--- a/tools/perf/page_sets/data/mobile_infinite_scroll_000.wpr.sha1
+++ /dev/null
@@ -1 +0,0 @@
-36df7ee7e6088363f3743ad28b467cba4c54b328
\ No newline at end of file
diff --git a/tools/perf/page_sets/data/mobile_infinite_scroll_001.wpr.sha1 b/tools/perf/page_sets/data/mobile_infinite_scroll_001.wpr.sha1
deleted file mode 100644
index 16f9bab..0000000
--- a/tools/perf/page_sets/data/mobile_infinite_scroll_001.wpr.sha1
+++ /dev/null
@@ -1 +0,0 @@
-29b293f9d8bbe10577858fd9104c0811028d66be
\ No newline at end of file
diff --git a/tools/perf/page_sets/infinite_scroll_cases.py b/tools/perf/page_sets/infinite_scroll_cases.py
deleted file mode 100644
index ebde46a..0000000
--- a/tools/perf/page_sets/infinite_scroll_cases.py
+++ /dev/null
@@ -1,158 +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 sys
-
-from page_sets.login_helpers import facebook_login
-from page_sets.system_health import platforms
-from telemetry.page import page
-from telemetry.page import shared_page_state
-from telemetry import story
-
-from py_utils import discover
-
-class _InfiniteScrollStory(page.Page):
-  """ Base class for infinite scroll stories."""
-
-  NAME = NotImplemented
-  URL = NotImplemented
-  SUPPORTED_PLATFORMS = platforms.ALL_PLATFORMS
-
-  SCROLL_DISTANCE = 25000
-  SCROLL_STEP = 1000
-  MAX_SCROLL_RETRIES = 5
-  TIME_BEFORE_SCROLL_RETRY_IN_SECONDS = 2
-  TIME_TO_WAIT_BEFORE_STARTING_IN_SECONDS = 5
-
-  def __init__(self, story_set):
-    super(_InfiniteScrollStory, self).__init__(
-        page_set=story_set, url=self.URL, name=self.NAME,
-        shared_page_state_class=shared_page_state.SharedPageState,
-        credentials_path='data/credentials.json')
-    # TODO(ulan): Remove this once crbug.com/541508 is fixed.
-    self.script_to_evaluate_on_commit = '''
-        window.WebSocket = undefined;
-        window.Worker = undefined;
-        window.performance = undefined;'''
-
-  def RunPageInteractions(self, action_runner):
-    with action_runner.CreateInteraction('Load'):
-      action_runner.WaitForJavaScriptCondition(
-        'document.body != null && '
-        'document.body.scrollHeight > window.innerHeight && '
-        '!document.body.addEventListener("touchstart", function() {})')
-    with action_runner.CreateInteraction('Wait'):
-      action_runner.Wait(self.TIME_TO_WAIT_BEFORE_STARTING_IN_SECONDS)
-    with action_runner.CreateInteraction('GC'):
-      action_runner.ForceGarbageCollection()
-    with action_runner.CreateInteraction('Begin'):
-      action_runner.tab.browser.DumpMemory()
-    with action_runner.CreateInteraction('Scrolling'):
-      self._Scroll(action_runner, self.SCROLL_DISTANCE, self.SCROLL_STEP)
-    with action_runner.CreateInteraction('End'):
-      action_runner.tab.browser.DumpMemory()
-
-  def _Scroll(self, action_runner, distance, step_size):
-    """ This function scrolls the webpage by the given scroll distance in
-    multiple steps, where each step (except the last one) has the given size.
-
-    If scrolling gets stuck, the functions retries scrolling MAX_SCROLL_RETRIES
-    times waiting TIME_BEFORE_SCROLL_RETRY_IN_SECONDS seconds between retries.
-    """
-    remaining = distance - action_runner.EvaluateJavaScript('window.scrollY')
-    retry_count = 0
-    # Scroll until the window.scrollY is within 1 pixel of the target distance.
-    while remaining > 1:
-      action_runner.ScrollPage(distance=min(remaining, step_size) + 1)
-      new_remaining = (distance -
-          action_runner.EvaluateJavaScript('window.scrollY'))
-      if remaining == new_remaining:
-        # Scrolling is stuck. This can happen if the page is loading
-        # resources. Give the page some time and retry scrolling.
-        if retry_count == self.MAX_SCROLL_RETRIES:
-          raise Exception('Scrolling stuck at %d' % remaining)
-        retry_count += 1
-        action_runner.Wait(self.TIME_BEFORE_SCROLL_RETRY_IN_SECONDS)
-      else:
-        retry_count = 0
-        remaining = new_remaining
-
-class DiscourseDesktopStory(_InfiniteScrollStory):
-  NAME = 'discourse'
-  URL = ('https://meta.discourse.org/t/the-official-discourse-tags-plugin' +
-     '-discourse-tagging/26482')
-  SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY
-
-class DiscourseMobileStory(_InfiniteScrollStory):
-  NAME = 'discourse'
-  URL = ('https://meta.discourse.org/t/the-official-discourse-tags-plugin' +
-     '-discourse-tagging/26482')
-  SUPPORTED_PLATFORMS = platforms.MOBILE_ONLY
-  SCROLL_DISTANCE = 15000
-
-class FacebookDesktopStory(_InfiniteScrollStory):
-  NAME = 'facebook'
-  URL = 'https://www.facebook.com/shakira'
-  SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY
-
-class FacebookMobileStory(_InfiniteScrollStory):
-  NAME = 'facebook'
-  URL = 'https://m.facebook.com/shakira'
-  SUPPORTED_PLATFORMS = platforms.MOBILE_ONLY
-  def RunNavigateSteps(self, action_runner):
-    facebook_login.LoginWithMobileSite(
-        action_runner, 'facebook3', self.credentials_path)
-    super(FacebookMobileStory, self).RunNavigateSteps(action_runner)
-
-class FlickrDesktopStory(_InfiniteScrollStory):
-  NAME = 'flickr'
-  URL = 'https://www.flickr.com/explore'
-  SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY
-
-class FlickrMobileStory(_InfiniteScrollStory):
-  NAME = 'flickr'
-  URL = 'https://www.flickr.com/explore'
-  SUPPORTED_PLATFORMS = platforms.MOBILE_ONLY
-  SCROLL_DISTANCE = 10000
-
-class PinterestMobileStory(_InfiniteScrollStory):
-  NAME = 'pinterest'
-  URL = 'https://www.pinterest.com/all'
-  SUPPORTED_PLATFORMS = platforms.MOBILE_ONLY
-
-class TumblrStory(_InfiniteScrollStory):
-  NAME = 'tumblr'
-  URL = 'http://techcrunch.tumblr.com/'
-
-class TwitterDesktopStory(_InfiniteScrollStory):
-  NAME = 'twitter'
-  URL = 'https://twitter.com/taylorswift13'
-  SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY
-
-class InfiniteScrollStorySet(story.StorySet):
-  """ Desktop story set. """
-  def __init__(self):
-    super(InfiniteScrollStorySet, self).__init__(
-        archive_data_file='data/infinite_scroll.json',
-        cloud_storage_bucket=story.PARTNER_BUCKET)
-    for story_class in _FindInfiniteScrollStoryClasses(platforms.DESKTOP):
-      self.AddStory(story_class(self))
-
-class MobileInfiniteScrollStorySet(story.StorySet):
-  """ Mobile story set. """
-  def __init__(self):
-    super(MobileInfiniteScrollStorySet, self).__init__(
-        archive_data_file='data/mobile_infinite_scroll.json',
-        cloud_storage_bucket=story.PARTNER_BUCKET)
-    for story_class in _FindInfiniteScrollStoryClasses(platforms.MOBILE):
-      self.AddStory(story_class(self))
-
-def _FindInfiniteScrollStoryClasses(platform):
-  # Sort the classes by their names so that their order is stable and
-  # deterministic.
-  for unused_cls_name, cls in sorted(discover.DiscoverClassesInModule(
-      module=sys.modules[__name__], base_class=_InfiniteScrollStory,
-      index_by_class_name=True).iteritems()):
-    if platform in cls.SUPPORTED_PLATFORMS:
-      yield cls
diff --git a/tools/perf/page_sets/system_health/browsing_stories.py b/tools/perf/page_sets/system_health/browsing_stories.py
index c9bd4c67..8667896 100644
--- a/tools/perf/page_sets/system_health/browsing_stories.py
+++ b/tools/perf/page_sets/system_health/browsing_stories.py
@@ -893,7 +893,7 @@
 class TumblrStory(_InfiniteScrollStory):
   NAME = 'browse:social:tumblr_infinite_scroll'
   URL = 'http://techcrunch.tumblr.com/'  # This page doesn't support HTTPS.
-  TAGS = [story_tags.INFINITE_SCROLL]
+  TAGS = [story_tags.INFINITE_SCROLL, story_tags.JAVASCRIPT_HEAVY]
 
 
 class TwitterScrollDesktopStory(_InfiniteScrollStory):
diff --git a/tools/perf/page_sets/system_health/loading_stories.py b/tools/perf/page_sets/system_health/loading_stories.py
index 828af12..1000951 100644
--- a/tools/perf/page_sets/system_health/loading_stories.py
+++ b/tools/perf/page_sets/system_health/loading_stories.py
@@ -79,16 +79,14 @@
 ################################################################################
 
 
-class LoadFacebookStory(_LoadingStory):
-  # Using Facebook login often causes "404 Not Found" with WPR.
-  NAME = 'load:social:facebook'
-  URL = 'https://www.facebook.com/rihanna'
-
-
 class LoadTwitterStory(_LoadingStory):
   NAME = 'load:social:twitter'
   URL = 'https://www.twitter.com/nasa'
 
+  # Desktop version is already covered by
+  # 'browse:social:twitter_infinite_scroll'
+  SUPPORTED_PLATFORMS = platforms.MOBILE_ONLY
+
 
 class LoadVkStory(_LoadingStory):
   NAME = 'load:social:vk'
@@ -111,13 +109,9 @@
   NAME = 'load:social:pinterest'
   URL = 'https://uk.pinterest.com/categories/popular/'
   TAGS = [story_tags.JAVASCRIPT_HEAVY]
-
-
-class LoadTumblrStory(_LoadingStory):
-  NAME = 'load:social:tumblr'
-  # Redirects to the "http://" version.
-  URL = 'https://50thousand.tumblr.com/'
-  TAGS = [story_tags.JAVASCRIPT_HEAVY]
+  # Mobile story is already covered by
+  # 'browse:social:pinterest_infinite_scroll'.
+  SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY
 
 
 ################################################################################
@@ -252,19 +246,6 @@
   SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY
 
 
-class LoadFlickrDesktopStory(_LoadingStory):
-  NAME = 'load:media:flickr'
-  URL = 'https://www.flickr.com/photos/tags/farm'
-  SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY
-
-  def _DidLoadDocument(self, action_runner):
-    # Wait until the 'Recently tagged' view loads.
-    action_runner.WaitForJavaScriptCondition('''
-        document.querySelector(
-            '.search-photos-everyone-trending-view .photo-list-view')
-                !== null''')
-
-
 class LoadImgurStory(_LoadingStory):
   NAME = 'load:media:imgur'
   URL = 'http://imgur.com/gallery/5UlBN'
diff --git a/tools/resources/OWNERS b/tools/resources/OWNERS
index cf28eeea..fb33baa 100644
--- a/tools/resources/OWNERS
+++ b/tools/resources/OWNERS
@@ -1,2 +1,4 @@
 per-file generate_resource_whitelist.*=agrieve@chromium.org
 per-file generate_resource_whitelist.*=estevenson@chromium.org
+per-file filter_resource_whitelist.*=agrieve@chromium.org
+per-file filter_resource_whitelist.*=zpeng@chromium.org
diff --git a/tools/resources/filter_resource_whitelist.py b/tools/resources/filter_resource_whitelist.py
new file mode 100755
index 0000000..415444e
--- /dev/null
+++ b/tools/resources/filter_resource_whitelist.py
@@ -0,0 +1,50 @@
+#!/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.
+
+__doc__ = """filter_resource_whitelist.py [-h] [--input INPUT]
+[--filter FILTER] [--output OUTPUT]
+
+INPUT specifies a resource whitelist file containing resource IDs that should
+be whitelisted, where each line of INPUT contains a single resource ID.
+
+FILTER specifies a resource whitelist file containing resource IDs that should
+not be whitelisted, where each line of FILTER contains a single resource ID.
+
+Filters a resource whitelist by removing resource IDs that are contained in a
+another resource whitelist.
+
+This script is used to generate Monochrome's locale paks.
+"""
+
+import argparse
+import sys
+
+
+def main():
+  parser = argparse.ArgumentParser(usage=__doc__)
+  parser.add_argument(
+      '--input', type=argparse.FileType('r'), required=True,
+      help='A resource whitelist where each line contains one resource ID. '
+           'These IDs, excluding the ones in FILTER, are to be included.')
+  parser.add_argument(
+      '--filter', type=argparse.FileType('r'), required=True,
+      help='A resource whitelist where each line contains one resource ID. '
+           'These IDs are to be excluded.')
+  parser.add_argument(
+      '--output', type=argparse.FileType('w'), default=sys.stdout,
+      help='The resource list path to write (default stdout)')
+
+  args = parser.parse_args()
+
+  input_resources = list(int(resource_id) for resource_id in args.input)
+  filter_resources = set(int(resource_id) for resource_id in args.filter)
+  output_resources = [resource_id for resource_id in input_resources
+                      if resource_id not in filter_resources]
+
+  for resource_id in sorted(output_resources):
+    args.output.write('%d\n' % resource_id)
+
+if __name__ == '__main__':
+  main()
diff --git a/ui/base/resource/resource_bundle.cc b/ui/base/resource/resource_bundle.cc
index 7e66615..a3c31f07 100644
--- a/ui/base/resource/resource_bundle.cc
+++ b/ui/base/resource/resource_bundle.cc
@@ -211,7 +211,7 @@
     base::File pak_file,
     const base::MemoryMappedFile::Region& region) {
   InitSharedInstance(NULL);
-  std::unique_ptr<DataPack> data_pack(new DataPack(SCALE_FACTOR_100P));
+  auto data_pack = base::MakeUnique<DataPack>(SCALE_FACTOR_100P);
   if (!data_pack->LoadFromFileRegion(std::move(pak_file), region)) {
     NOTREACHED() << "failed to load pak file";
     return;
@@ -248,6 +248,17 @@
   return *g_shared_instance_;
 }
 
+void ResourceBundle::LoadSecondaryLocaleDataWithPakFileRegion(
+    base::File pak_file,
+    const base::MemoryMappedFile::Region& region) {
+  auto data_pack = base::MakeUnique<DataPack>(SCALE_FACTOR_100P);
+  if (!data_pack->LoadFromFileRegion(std::move(pak_file), region)) {
+    NOTREACHED() << "failed to load secondary pak file";
+    return;
+  }
+  secondary_locale_resources_data_ = std::move(data_pack);
+}
+
 #if !defined(OS_ANDROID)
 bool ResourceBundle::LocaleDataPakExists(const std::string& locale) {
   return !GetLocaleFilePath(locale, true).empty();
@@ -389,6 +400,7 @@
 
 void ResourceBundle::UnloadLocaleResources() {
   locale_resources_data_.reset();
+  secondary_locale_resources_data_.reset();
 }
 
 void ResourceBundle::OverrideLocalePakForTest(const base::FilePath& pak_path) {
@@ -551,20 +563,27 @@
   }
 
   base::StringPiece data;
+  ResourceHandle::TextEncodingType encoding =
+      locale_resources_data_->GetTextEncodingType();
   if (!locale_resources_data_->GetStringPiece(static_cast<uint16_t>(message_id),
                                               &data)) {
-    // Fall back on the main data pack (shouldn't be any strings here except in
-    // unittests).
-    data = GetRawDataResource(message_id);
-    if (data.empty()) {
-      NOTREACHED() << "unable to find resource: " << message_id;
-      return base::string16();
+    if (secondary_locale_resources_data_.get() &&
+        secondary_locale_resources_data_->GetStringPiece(
+            static_cast<uint16_t>(message_id), &data)) {
+      // Fall back on the secondary locale pak if it exists.
+      encoding = secondary_locale_resources_data_->GetTextEncodingType();
+    } else {
+      // Fall back on the main data pack (shouldn't be any strings here except
+      // in unittests).
+      data = GetRawDataResource(message_id);
+      if (data.empty()) {
+        NOTREACHED() << "unable to find resource: " << message_id;
+        return base::string16();
+      }
     }
   }
 
   // Strings should not be loaded from a data pack that contains binary data.
-  ResourceHandle::TextEncodingType encoding =
-      locale_resources_data_->GetTextEncodingType();
   DCHECK(encoding == ResourceHandle::UTF16 || encoding == ResourceHandle::UTF8)
       << "requested localized string from binary pack file";
 
@@ -584,12 +603,20 @@
   {
     base::AutoLock lock_scope(*locale_resources_data_lock_);
     base::StringPiece data;
+
     if (locale_resources_data_.get() &&
         locale_resources_data_->GetStringPiece(
             static_cast<uint16_t>(resource_id), &data) &&
         !data.empty()) {
       return new base::RefCountedStaticMemory(data.data(), data.length());
     }
+
+    if (secondary_locale_resources_data_.get() &&
+        secondary_locale_resources_data_->GetStringPiece(
+            static_cast<uint16_t>(resource_id), &data) &&
+        !data.empty()) {
+      return new base::RefCountedStaticMemory(data.data(), data.length());
+    }
   }
   // Release lock_scope and fall back to main data pack.
   return LoadDataResourceBytes(resource_id);
diff --git a/ui/base/resource/resource_bundle.h b/ui/base/resource/resource_bundle.h
index d0401d9..47112f6 100644
--- a/ui/base/resource/resource_bundle.h
+++ b/ui/base/resource/resource_bundle.h
@@ -151,6 +151,11 @@
   // Return the global resource loader instance.
   static ResourceBundle& GetSharedInstance();
 
+  // Loads a secondary locale data pack using the given file region.
+  void LoadSecondaryLocaleDataWithPakFileRegion(
+      base::File pak_file,
+      const base::MemoryMappedFile::Region& region);
+
   // Check if the .pak for the given locale exists.
   bool LocaleDataPakExists(const std::string& locale);
 
@@ -399,6 +404,7 @@
 
   // Handles for data sources.
   std::unique_ptr<ResourceHandle> locale_resources_data_;
+  std::unique_ptr<ResourceHandle> secondary_locale_resources_data_;
   std::vector<std::unique_ptr<ResourceHandle>> data_packs_;
 
   // The maximum scale factor currently loaded.
diff --git a/ui/base/resource/resource_bundle_android.cc b/ui/base/resource/resource_bundle_android.cc
index 9b0ae24..68c8c47 100644
--- a/ui/base/resource/resource_bundle_android.cc
+++ b/ui/base/resource/resource_bundle_android.cc
@@ -8,6 +8,7 @@
 #include "base/android/jni_android.h"
 #include "base/android/jni_string.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/path_service.h"
 #include "jni/ResourceBundle_jni.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -20,36 +21,63 @@
 namespace {
 
 bool g_locale_paks_in_apk = false;
+bool g_load_secondary_locale_paks = false;
 // It is okay to cache and share these file descriptors since the
 // ResourceBundle singleton never closes the handles.
 int g_chrome_100_percent_fd = -1;
 int g_resources_pack_fd = -1;
 int g_locale_pack_fd = -1;
+int g_secondary_locale_pack_fd = -1;
 base::MemoryMappedFile::Region g_chrome_100_percent_region;
 base::MemoryMappedFile::Region g_resources_pack_region;
 base::MemoryMappedFile::Region g_locale_pack_region;
+base::MemoryMappedFile::Region g_secondary_locale_pack_region;
 
 bool LoadFromApkOrFile(const char* apk_path,
                        const base::FilePath* disk_path,
-                       int* fd_out,
-                       base::MemoryMappedFile::Region* region_out) {
-  DCHECK_EQ(*fd_out, -1) << "Attempt to load " << apk_path << " twice.";
+                       int* out_fd,
+                       base::MemoryMappedFile::Region* out_region) {
+  DCHECK_EQ(*out_fd, -1) << "Attempt to load " << apk_path << " twice.";
   if (apk_path != nullptr) {
-    *fd_out = base::android::OpenApkAsset(apk_path, region_out);
+    *out_fd = base::android::OpenApkAsset(apk_path, out_region);
   }
   // For unit tests, the file exists on disk.
-  if (*fd_out < 0 && disk_path != nullptr) {
+  if (*out_fd < 0 && disk_path != nullptr) {
     int flags = base::File::FLAG_OPEN | base::File::FLAG_READ;
-    *fd_out = base::File(*disk_path, flags).TakePlatformFile();
-    *region_out = base::MemoryMappedFile::Region::kWholeFile;
+    *out_fd = base::File(*disk_path, flags).TakePlatformFile();
+    *out_region = base::MemoryMappedFile::Region::kWholeFile;
   }
-  bool success = *fd_out >= 0;
+  bool success = *out_fd >= 0;
   if (!success) {
     LOG(ERROR) << "Failed to open pak file: " << apk_path;
   }
   return success;
 }
 
+int LoadLocalePakFromApk(const std::string& app_locale,
+                         base::MemoryMappedFile::Region* out_region) {
+  std::string locale_path_within_apk =
+      GetPathForAndroidLocalePakWithinApk(app_locale);
+  if (locale_path_within_apk.empty()) {
+    LOG(ERROR) << "locale_path_within_apk.empty() for locale "
+                 << app_locale;
+    return -1;
+  }
+  return base::android::OpenApkAsset(locale_path_within_apk, out_region);
+}
+
+std::unique_ptr<DataPack> LoadDataPackFromLocalePak(
+    int locale_pack_fd,
+    const base::MemoryMappedFile::Region& region) {
+  auto data_pack = base::MakeUnique<DataPack>(SCALE_FACTOR_100P);
+  if (!data_pack->LoadFromFileRegion(base::File(locale_pack_fd), region)) {
+    LOG(ERROR) << "failed to load locale.pak";
+    NOTREACHED();
+    return nullptr;
+  }
+  return data_pack;
+}
+
 }  // namespace
 
 void ResourceBundle::LoadCommonResources() {
@@ -74,22 +102,18 @@
 
 std::string ResourceBundle::LoadLocaleResources(
     const std::string& pref_locale) {
-  DCHECK(!locale_resources_data_.get()) << "locale.pak already loaded";
+  DCHECK(!locale_resources_data_.get() &&
+         !secondary_locale_resources_data_.get())
+             << "locale.pak already loaded";
   if (g_locale_pack_fd != -1) {
     LOG(WARNING)
         << "Unexpected (outside of tests): Loading a second locale pak file.";
   }
   std::string app_locale = l10n_util::GetApplicationLocale(pref_locale);
+
+  // Load primary locale .pak file.
   if (g_locale_paks_in_apk) {
-    std::string locale_path_within_apk =
-        GetPathForAndroidLocalePakWithinApk(app_locale);
-    if (locale_path_within_apk.empty()) {
-      LOG(WARNING) << "locale_path_within_apk.empty() for locale "
-                   << app_locale;
-      return std::string();
-    }
-    g_locale_pack_fd = base::android::OpenApkAsset(locale_path_within_apk,
-                                                   &g_locale_pack_region);
+    g_locale_pack_fd = LoadLocalePakFromApk(app_locale, &g_locale_pack_region);
   } else {
     base::FilePath locale_file_path = GetOverriddenPakPath();
     if (locale_file_path.empty())
@@ -105,15 +129,27 @@
     g_locale_pack_region = base::MemoryMappedFile::Region::kWholeFile;
   }
 
-  std::unique_ptr<DataPack> data_pack(new DataPack(SCALE_FACTOR_100P));
-  if (!data_pack->LoadFromFileRegion(base::File(g_locale_pack_fd),
-                                     g_locale_pack_region)) {
-    LOG(ERROR) << "failed to load locale.pak";
-    NOTREACHED();
+  locale_resources_data_ = LoadDataPackFromLocalePak(
+      g_locale_pack_fd, g_locale_pack_region);
+
+  if (!locale_resources_data_.get())
     return std::string();
+
+  // Load secondary locale .pak file if it exists. For debug build monochrome,
+  // a secondary locale pak will always be loaded; however, it should be
+  // unnecessary for loading locale resources because the primary locale pak
+  // would have a copy of all the resources in the secondary locale pak.
+  if (g_load_secondary_locale_paks) {
+    g_secondary_locale_pack_fd = LoadLocalePakFromApk(
+        app_locale, &g_secondary_locale_pack_region);
+
+    secondary_locale_resources_data_ = LoadDataPackFromLocalePak(
+        g_secondary_locale_pack_fd, g_secondary_locale_pack_region);
+
+    if (!secondary_locale_resources_data_.get())
+      return std::string();
   }
 
-  locale_resources_data_ = std::move(data_pack);
   return app_locale;
 }
 
@@ -125,6 +161,10 @@
   g_locale_paks_in_apk = value;
 }
 
+void SetLoadSecondaryLocalePaks(bool value) {
+  g_load_secondary_locale_paks = value;
+}
+
 void LoadMainAndroidPackFile(const char* path_within_apk,
                              const base::FilePath& disk_file_path) {
   if (LoadFromApkOrFile(path_within_apk,
@@ -155,6 +195,11 @@
   return g_locale_pack_fd;
 }
 
+int GetSecondaryLocalePackFd(base::MemoryMappedFile::Region* out_region) {
+  *out_region = g_secondary_locale_pack_region;
+  return g_secondary_locale_pack_fd;
+}
+
 std::string GetPathForAndroidLocalePakWithinApk(const std::string& locale) {
   JNIEnv* env = base::android::AttachCurrentThread();
   base::android::ScopedJavaLocalRef<jstring> ret =
diff --git a/ui/base/resource/resource_bundle_android.h b/ui/base/resource/resource_bundle_android.h
index 2123eb0..57059b0 100644
--- a/ui/base/resource/resource_bundle_android.h
+++ b/ui/base/resource/resource_bundle_android.h
@@ -31,10 +31,17 @@
 UI_BASE_EXPORT int GetLocalePackFd(
     base::MemoryMappedFile::Region* out_region);
 
+// Returns the file descriptor and region for the secondary locale .pak file.
+UI_BASE_EXPORT int GetSecondaryLocalePackFd(
+    base::MemoryMappedFile::Region* out_region);
+
 // Tell ResourceBundle to locate locale pak files via
 // GetPathForAndroidLocalePakWithinApk rather than looking for them on disk.
 UI_BASE_EXPORT void SetLocalePaksStoredInApk(bool value);
 
+// Tell ResourceBundle to load secondary locale .pak files.
+UI_BASE_EXPORT void SetLoadSecondaryLocalePaks(bool value);
+
 // Returns the path within the apk for the given locale's .pak file, or an
 // empty string if it doesn't exist.
 // Only locale paks for the active Android language can be retrieved.