diff --git a/.gitattributes b/.gitattributes
index 74328c4..dfb4ad1 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,2 +1,5 @@
 # Stop Windows python license check presubmit errors by forcing LF checkout.
 *.py  text eol=lf
+
+# Force LF checkout of the pins files to avoid transport_security_state_generator errors.
+/net/http/*.pins  text eol=lf
diff --git a/DEPS b/DEPS
index 60b1c085..4d43ae3 100644
--- a/DEPS
+++ b/DEPS
@@ -40,7 +40,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': 'ec045b431211082563a4352ccf2c9d5b3765048e',
+  'skia_revision': '8fe24272fa6d2fa9eb2458221ed9852d6ec16f56',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -64,7 +64,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': 'f6f68c75ce54a5865fb19dcb075e7734f1639663',
+  'pdfium_revision': 'b46ce4172ee8282a39997c175dff2bd8f187208f',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling openmax_dl
   # and whatever else without interference from each other.
@@ -96,7 +96,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '1e3b1949cdcde84079ef3f0fa3f31610e2d1687d',
+  'catapult_revision': '00b0c16c97088f5c06df9d3b27eaeb41f06173e5',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
diff --git a/android_webview/browser/cookie_manager.cc b/android_webview/browser/cookie_manager.cc
index cc09e6e..ae33e5a 100644
--- a/android_webview/browser/cookie_manager.cc
+++ b/android_webview/browser/cookie_manager.cc
@@ -4,6 +4,8 @@
 
 #include "android_webview/browser/cookie_manager.h"
 
+#include <stdint.h>
+
 #include <memory>
 #include <utility>
 #include <vector>
@@ -206,7 +208,7 @@
 
   void RemoveSessionCookiesHelper(BoolCallback callback);
   void RemoveAllCookiesHelper(BoolCallback callback);
-  void RemoveCookiesCompleted(BoolCallback callback, int num_deleted);
+  void RemoveCookiesCompleted(BoolCallback callback, uint32_t num_deleted);
 
   void FlushCookieStoreAsyncHelper(base::Closure complete);
 
@@ -448,8 +450,8 @@
 }
 
 void CookieManager::RemoveCookiesCompleted(BoolCallback callback,
-                                           int num_deleted) {
-  callback.Run(num_deleted > 0);
+                                           uint32_t num_deleted) {
+  callback.Run(num_deleted > 0u);
 }
 
 void CookieManager::RemoveAllCookies(
diff --git a/android_webview/browser/net/aw_cookie_store_wrapper.cc b/android_webview/browser/net/aw_cookie_store_wrapper.cc
index 88b8a60..7a671e88 100644
--- a/android_webview/browser/net/aw_cookie_store_wrapper.cc
+++ b/android_webview/browser/net/aw_cookie_store_wrapper.cc
@@ -294,7 +294,7 @@
   DCHECK(client_task_runner_->RunsTasksInCurrentSequence());
   PostTaskToCookieStoreTaskRunner(
       base::BindOnce(&DeleteCanonicalCookieAsyncOnCookieThread, cookie,
-                     CreateWrappedCallback<int>(std::move(callback))));
+                     CreateWrappedCallback<uint32_t>(std::move(callback))));
 }
 
 void AwCookieStoreWrapper::DeleteAllCreatedBetweenAsync(
@@ -304,7 +304,7 @@
   DCHECK(client_task_runner_->RunsTasksInCurrentSequence());
   PostTaskToCookieStoreTaskRunner(base::BindOnce(
       &DeleteAllCreatedBetweenAsyncOnCookieThread, delete_begin, delete_end,
-      CreateWrappedCallback<int>(std::move(callback))));
+      CreateWrappedCallback<uint32_t>(std::move(callback))));
 }
 
 void AwCookieStoreWrapper::DeleteAllCreatedBetweenWithPredicateAsync(
@@ -313,16 +313,17 @@
     const CookiePredicate& predicate,
     DeleteCallback callback) {
   DCHECK(client_task_runner_->RunsTasksInCurrentSequence());
-  PostTaskToCookieStoreTaskRunner(base::BindOnce(
-      &DeleteAllCreatedBetweenWithPredicateAsyncOnCookieThread, delete_begin,
-      delete_end, predicate, CreateWrappedCallback<int>(std::move(callback))));
+  PostTaskToCookieStoreTaskRunner(
+      base::BindOnce(&DeleteAllCreatedBetweenWithPredicateAsyncOnCookieThread,
+                     delete_begin, delete_end, predicate,
+                     CreateWrappedCallback<uint32_t>(std::move(callback))));
 }
 
 void AwCookieStoreWrapper::DeleteSessionCookiesAsync(DeleteCallback callback) {
   DCHECK(client_task_runner_->RunsTasksInCurrentSequence());
   PostTaskToCookieStoreTaskRunner(
       base::BindOnce(&DeleteSessionCookiesAsyncOnCookieThread,
-                     CreateWrappedCallback<int>(std::move(callback))));
+                     CreateWrappedCallback<uint32_t>(std::move(callback))));
 }
 
 void AwCookieStoreWrapper::FlushStore(base::OnceClosure callback) {
diff --git a/android_webview/browser/net/aw_cookie_store_wrapper_unittest.cc b/android_webview/browser/net/aw_cookie_store_wrapper_unittest.cc
index d856d24..a80d03b9 100644
--- a/android_webview/browser/net/aw_cookie_store_wrapper_unittest.cc
+++ b/android_webview/browser/net/aw_cookie_store_wrapper_unittest.cc
@@ -4,6 +4,8 @@
 
 #include "android_webview/browser/net/aw_cookie_store_wrapper.h"
 
+#include <stdint.h>
+
 #include <memory>
 
 #include "net/cookies/cookie_store.h"
@@ -20,9 +22,9 @@
     // Android Webview can run multiple tests without restarting the binary,
     // so have to delete any cookies the global store may have from an earlier
     // test.
-    net::ResultSavingCookieCallback<int> callback;
+    net::ResultSavingCookieCallback<uint32_t> callback;
     cookie_store->DeleteAllAsync(
-        base::Bind(&net::ResultSavingCookieCallback<int>::Run,
+        base::Bind(&net::ResultSavingCookieCallback<uint32_t>::Run,
                    base::Unretained(&callback)));
     callback.WaitUntilDone();
 
diff --git a/ash/accelerators/accelerator_controller.cc b/ash/accelerators/accelerator_controller.cc
index b5145db4..452df17 100644
--- a/ash/accelerators/accelerator_controller.cc
+++ b/ash/accelerators/accelerator_controller.cc
@@ -378,7 +378,8 @@
     // Search key.
     if (previous_accelerator.key_state() !=
             ui::Accelerator::KeyState::PRESSED ||
-        previous_accelerator.key_code() != ui::VKEY_LWIN) {
+        previous_accelerator.key_code() != ui::VKEY_LWIN ||
+        previous_accelerator.interrupted_by_mouse_event()) {
       return false;
     }
 
diff --git a/ash/accelerators/accelerator_controller_unittest.cc b/ash/accelerators/accelerator_controller_unittest.cc
index 6519ab0..dd96cae 100644
--- a/ash/accelerators/accelerator_controller_unittest.cc
+++ b/ash/accelerators/accelerator_controller_unittest.cc
@@ -862,6 +862,15 @@
       CreateReleaseAccelerator(ui::VKEY_BROWSER_SEARCH, ui::EF_NONE)));
   RunAllPendingInMessageLoop();
   EXPECT_EQ(3u, test_app_list_presenter.toggle_count());
+
+  // When pressed key is interrupted by mouse, the AppList should not toggle.
+  EXPECT_FALSE(
+      ProcessInController(ui::Accelerator(ui::VKEY_LWIN, ui::EF_NONE)));
+  GetController()->accelerator_history()->InterruptCurrentAccelerator();
+  EXPECT_FALSE(ProcessInController(
+      CreateReleaseAccelerator(ui::VKEY_LWIN, ui::EF_NONE)));
+  RunAllPendingInMessageLoop();
+  EXPECT_EQ(3u, test_app_list_presenter.toggle_count());
 }
 
 TEST_F(AcceleratorControllerTest, ImeGlobalAccelerators) {
diff --git a/ash/accelerators/accelerator_filter_unittest.cc b/ash/accelerators/accelerator_filter_unittest.cc
index 603bbef..3b1897cb 100644
--- a/ash/accelerators/accelerator_filter_unittest.cc
+++ b/ash/accelerators/accelerator_filter_unittest.cc
@@ -18,6 +18,8 @@
 #include "ash/wm/window_state.h"
 #include "ash/wm/window_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/app_list/presenter/app_list.h"
+#include "ui/app_list/presenter/test/test_app_list_presenter.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/test/aura_test_base.h"
 #include "ui/aura/test/test_windows.h"
@@ -185,5 +187,27 @@
   EXPECT_FALSE(session_controller->IsScreenLocked());
 }
 
+TEST_F(AcceleratorFilterTest, ToggleAppListInterruptedByMouseEvent) {
+  ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
+  app_list::test::TestAppListPresenter test_app_list_presenter;
+  Shell::Get()->app_list()->SetAppListPresenter(
+      test_app_list_presenter.CreateInterfacePtrAndBind());
+  EXPECT_EQ(0u, test_app_list_presenter.toggle_count());
+
+  // The AppList should toggle if no mouse event occurs between key press and
+  // key release.
+  generator.PressKey(ui::VKEY_LWIN, ui::EF_NONE);
+  generator.ReleaseKey(ui::VKEY_LWIN, ui::EF_NONE);
+  RunAllPendingInMessageLoop();
+  EXPECT_EQ(1u, test_app_list_presenter.toggle_count());
+
+  // When pressed key is interrupted by mouse, the AppList should not toggle.
+  generator.PressKey(ui::VKEY_LWIN, ui::EF_NONE);
+  generator.ClickLeftButton();
+  generator.ReleaseKey(ui::VKEY_LWIN, ui::EF_NONE);
+  RunAllPendingInMessageLoop();
+  EXPECT_EQ(1u, test_app_list_presenter.toggle_count());
+}
+
 }  // namespace test
 }  // namespace ash
diff --git a/ash/accelerators/accelerator_table.cc b/ash/accelerators/accelerator_table.cc
index e3fc4d98..6d025f2 100644
--- a/ash/accelerators/accelerator_table.cc
+++ b/ash/accelerators/accelerator_table.cc
@@ -161,6 +161,7 @@
 
     // Voice Interaction shortcuts.
     {true, ui::VKEY_A, ui::EF_COMMAND_DOWN, START_VOICE_INTERACTION},
+    {true, ui::VKEY_ASSISTANT, ui::EF_NONE, START_VOICE_INTERACTION},
     // Temporary shortcut added for UX/PM exploration.
     // TODO(updowndota): Remove the temporary shortcut.
     {true, ui::VKEY_SPACE, ui::EF_COMMAND_DOWN, START_VOICE_INTERACTION},
diff --git a/ash/accelerators/accelerator_table_unittest.cc b/ash/accelerators/accelerator_table_unittest.cc
index 2bee4f5..83c0de04 100644
--- a/ash/accelerators/accelerator_table_unittest.cc
+++ b/ash/accelerators/accelerator_table_unittest.cc
@@ -15,12 +15,12 @@
 
 namespace {
 
-// The number of non-Search-based accelerators as of 2017-06-26.
-constexpr int kNonSearchAcceleratorsNum = 92;
-// The hash of non-Search-based accelerators as of 2017-06-26.
+// The number of non-Search-based accelerators as of 2017-07-08.
+constexpr int kNonSearchAcceleratorsNum = 93;
+// The hash of non-Search-based accelerators as of 2017-07-08.
 // See HashAcceleratorData().
 constexpr char kNonSearchAcceleratorsHash[] =
-    "c45246c981cba1fe2c6d0d3c494e1117";
+    "b585642b182679454e0e924dffc92463";
 
 struct Cmp {
   bool operator()(const AcceleratorData& lhs, const AcceleratorData& rhs) {
diff --git a/ash/laser/DEPS b/ash/laser/DEPS
index 3ca145e0..89980df 100644
--- a/ash/laser/DEPS
+++ b/ash/laser/DEPS
@@ -1,4 +1,5 @@
 include_rules = [
   "+cc",
+  "+components/viz/common/quads",
   "+gpu/command_buffer/client",
 ]
diff --git a/ash/laser/laser_pointer_view.cc b/ash/laser/laser_pointer_view.cc
index 82ed189..73401bdd 100644
--- a/ash/laser/laser_pointer_view.cc
+++ b/ash/laser/laser_pointer_view.cc
@@ -28,6 +28,7 @@
 #include "cc/quads/texture_draw_quad.h"
 #include "cc/resources/texture_mailbox.h"
 #include "cc/resources/transferable_resource.h"
+#include "components/viz/common/quads/resource_format.h"
 #include "gpu/command_buffer/client/context_support.h"
 #include "gpu/command_buffer/client/gles2_interface.h"
 #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h"
@@ -685,7 +686,7 @@
 
   cc::TransferableResource transferable_resource;
   transferable_resource.id = next_resource_id_++;
-  transferable_resource.format = cc::RGBA_8888;
+  transferable_resource.format = viz::RGBA_8888;
   transferable_resource.filter = GL_LINEAR;
   transferable_resource.size = buffer_size;
   transferable_resource.mailbox_holder =
diff --git a/base/bind_unittest.nc b/base/bind_unittest.nc
index 61835be..cfdd9e7 100644
--- a/base/bind_unittest.nc
+++ b/base/bind_unittest.nc
@@ -194,6 +194,24 @@
       Bind(&VoidPolymorphic1<HasRef*>, for_raw_ptr);
 }
 
+#elif defined(NCTEST_NO_RVALUE_CONST_RAW_PTR_FOR_REFCOUNTED_TYPES)  // [r"fatal error: static_assert failed \"A parameter is a refcounted type and needs scoped_refptr.\""]
+
+// Refcounted types should not be bound as a raw pointer.
+void WontCompile() {
+  const HasRef for_raw_ptr;
+  Callback<void()> ref_count_as_raw_ptr =
+      Bind(&VoidPolymorphic1<const HasRef*>, &for_raw_ptr);
+}
+
+#elif defined(NCTEST_NO_LVALUE_CONST_RAW_PTR_FOR_REFCOUNTED_TYPES)  // [r"fatal error: static_assert failed \"A parameter is a refcounted type and needs scoped_refptr.\""]
+
+// Refcounted types should not be bound as a raw pointer.
+void WontCompile() {
+  const HasRef* for_raw_ptr = nullptr;
+  Callback<void()> ref_count_as_raw_ptr =
+      Bind(&VoidPolymorphic1<const HasRef*>, for_raw_ptr);
+}
+
 #elif defined(NCTEST_WEAKPTR_BIND_MUST_RETURN_VOID)  // [r"fatal error: static_assert failed \"weak_ptrs can only bind to methods without return values\""]
 
 // WeakPtrs cannot be bound to methods with return types.
diff --git a/base/memory/raw_scoped_refptr_mismatch_checker.h b/base/memory/raw_scoped_refptr_mismatch_checker.h
index f480e07..0e74cb0b 100644
--- a/base/memory/raw_scoped_refptr_mismatch_checker.h
+++ b/base/memory/raw_scoped_refptr_mismatch_checker.h
@@ -32,9 +32,11 @@
     // Human readable translation: you needed to be a scoped_refptr if you are a
     // raw pointer type and are convertible to a RefCounted(Base|ThreadSafeBase)
     // type.
-    value = (std::is_pointer<T>::value &&
-             (std::is_convertible<T, subtle::RefCountedBase*>::value ||
-              std::is_convertible<T, subtle::RefCountedThreadSafeBase*>::value))
+    value =
+        (std::is_pointer<T>::value &&
+         (std::is_convertible<T, const subtle::RefCountedBase*>::value ||
+          std::is_convertible<T,
+                              const subtle::RefCountedThreadSafeBase*>::value))
   };
 };
 
diff --git a/base/test/test_suite.cc b/base/test/test_suite.cc
index c9bfe9e..38f1f34 100644
--- a/base/test/test_suite.cc
+++ b/base/test/test_suite.cc
@@ -135,8 +135,7 @@
                          Bind(&TestSuite::Run, Unretained(&test_suite)));
 }
 
-TestSuite::TestSuite(int argc, char** argv)
-    : initialized_command_line_(false), created_feature_list_(false) {
+TestSuite::TestSuite(int argc, char** argv) : initialized_command_line_(false) {
   PreInitialize();
   InitializeFromCommandLine(argc, argv);
   // Logging must be initialized before any thread has a chance to call logging
@@ -146,7 +145,7 @@
 
 #if defined(OS_WIN)
 TestSuite::TestSuite(int argc, wchar_t** argv)
-    : initialized_command_line_(false), created_feature_list_(false) {
+    : initialized_command_line_(false) {
   PreInitialize();
   InitializeFromCommandLine(argc, argv);
   // Logging must be initialized before any thread has a chance to call logging
@@ -342,13 +341,10 @@
     debug::WaitForDebugger(60, true);
   }
 #endif
-
   // Set up a FeatureList instance, so that code using that API will not hit a
-  // an error that it's not set. If a FeatureList was created in this way (i.e.
-  // one didn't exist previously), it will be cleared in Shutdown() via
-  // ClearInstanceForTesting().
-  created_feature_list_ =
-      FeatureList::InitializeInstance(std::string(), std::string());
+  // an error that it's not set. It will be cleared automatically.
+  // TODO(chaopeng) Should load the actually features in command line here.
+  scoped_feature_list_.InitFromCommandLine(std::string(), std::string());
 
 #if defined(OS_IOS)
   InitIOSTestMessageLoop();
@@ -412,10 +408,6 @@
 
 void TestSuite::Shutdown() {
   base::debug::StopProfiling();
-
-  // Clear the FeatureList that was created by Initialize().
-  if (created_feature_list_)
-    FeatureList::ClearInstanceForTesting();
 }
 
 }  // namespace base
diff --git a/base/test/test_suite.h b/base/test/test_suite.h
index 82c746e..6d852baf 100644
--- a/base/test/test_suite.h
+++ b/base/test/test_suite.h
@@ -15,6 +15,7 @@
 #include "base/at_exit.h"
 #include "base/logging.h"
 #include "base/macros.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/trace_to_file.h"
 #include "build/build_config.h"
 
@@ -88,7 +89,7 @@
 
   bool initialized_command_line_;
 
-  bool created_feature_list_;
+  test::ScopedFeatureList scoped_feature_list_;
 
   XmlUnitTestResultPrinter* printer_ = nullptr;
 
diff --git a/build/toolchain/mac/BUILD.gn b/build/toolchain/mac/BUILD.gn
index b417e76a..f89dd0d 100644
--- a/build/toolchain/mac/BUILD.gn
+++ b/build/toolchain/mac/BUILD.gn
@@ -431,14 +431,17 @@
       if (is_ios) {
         _sdk_name = ios_sdk_name
         _min_deployment_target = ios_deployment_target
+        _compress_pngs = ""
       } else {
         _sdk_name = mac_sdk_name
         _min_deployment_target = mac_deployment_target
+        _compress_pngs = " -c "
       }
       command = "$env_wrapper rm -f {{output}} && " +
                 "TOOL_VERSION=${tool_versions.compile_xcassets} " +
                 "python $_tool -p $_sdk_name -t $_min_deployment_target " +
-                "-T {{bundle_product_type}} -o {{output}} {{inputs}}"
+                "$_compress_pngs -T {{bundle_product_type}} -o {{output}} " +
+                "{{inputs}}"
 
       description = "COMPILE_XCASSETS {{output}}"
       pool = ":bundle_pool($default_toolchain)"
diff --git a/build/toolchain/mac/compile_xcassets.py b/build/toolchain/mac/compile_xcassets.py
index 2c1a472..6b0f900 100644
--- a/build/toolchain/mac/compile_xcassets.py
+++ b/build/toolchain/mac/compile_xcassets.py
@@ -23,10 +23,7 @@
 """
 
 # Pattern matching a section header in the output of actool.
-SECTION_HEADER = re.compile('^/\\* ([a-z.]*) \\*/$')
-
-# Pattern matching an interesting message in the output of actool.
-MESSAGE_PATTERN = re.compile('^([^:]*\.xcassets):.* (error|warning): .*$')
+SECTION_HEADER = re.compile('^/\\* ([^ ]*) \\*/$')
 
 # Name of the section containing informational messages that can be ignored.
 NOTICE_SECTION = 'com.apple.actool.compilation-results'
@@ -41,9 +38,8 @@
   section.
 
   The function filter any lines that are not in com.apple.actool.errors or
-  com.apple.actool.document.warnings sections. For each messages, in those
-  sections, they are also filtered if they do not follow MESSAGE_PATTERN
-  pattern.
+  com.apple.actool.document.warnings sections (as spurious messages comes
+  before any section of the output).
 
   See crbug.com/730054 and crbug.com/739163 for some example messages that
   pollute the output of actool and cause flaky builds.
@@ -70,22 +66,18 @@
       if current_section != NOTICE_SECTION:
         filtered_output.append(line + '\n')
       continue
-    match = MESSAGE_PATTERN.search(line)
-    if match is not None:
-      if current_section == NOTICE_SECTION:
-        continue
-
-      absolute_path = match.group(1)
+    if current_section and current_section != NOTICE_SECTION:
+      absolute_path = line.split(':')[0]
       relative_path = relative_paths.get(absolute_path, absolute_path)
       if absolute_path != relative_path:
-        line = line[:match.span(1)[0]] + relative_path + line[match.span(1)[1]:]
+        line = relative_path + line[len(absolute_path):]
       filtered_output.append(line + '\n')
 
   return ''.join(filtered_output)
 
 
-def CompileAssetCatalog(
-    output, platform, product_type, min_deployment_target, inputs):
+def CompileAssetCatalog(output, platform, product_type, min_deployment_target,
+    inputs, compress_pngs):
   """Compile the .xcassets bundles to an asset catalog using actool.
 
   Args:
@@ -94,14 +86,17 @@
     product_type: the bundle type
     min_deployment_target: minimum deployment target
     inputs: list of absolute paths to .xcassets bundles
+    compress_pngs: whether to enable compression of pngs
   """
   command = [
       'xcrun', 'actool', '--output-format=human-readable-text',
-      '--compress-pngs', '--notices', '--warnings', '--errors',
-      '--platform', platform, '--minimum-deployment-target',
-      min_deployment_target,
+      '--notices', '--warnings', '--errors', '--platform', platform,
+      '--minimum-deployment-target', min_deployment_target,
   ]
 
+  if compress_pngs:
+    command.extend(['--compress-pngs'])
+
   if product_type != '':
     command.extend(['--product-type', product_type])
 
@@ -153,6 +148,9 @@
       '--output', '-o', required=True,
       help='path to the compiled assets catalog')
   parser.add_argument(
+      '--compress-pngs', '-c', action='store_true', default=False,
+      help='recompress PNGs while compiling assets catalog')
+  parser.add_argument(
       '--product-type', '-T',
       help='type of the containing bundle')
   parser.add_argument(
@@ -171,7 +169,8 @@
       args.platform,
       args.product_type,
       args.minimum_deployment_target,
-      args.inputs)
+      args.inputs,
+      args.compress_pngs)
 
 
 if __name__ == '__main__':
diff --git a/build/toolchain/mac/compile_xcassets_unittests.py b/build/toolchain/mac/compile_xcassets_unittests.py
index 530d0c9..6fa41ab 100644
--- a/build/toolchain/mac/compile_xcassets_unittests.py
+++ b/build/toolchain/mac/compile_xcassets_unittests.py
@@ -64,6 +64,63 @@
             '/* com.apple.actool.compilation-results */\n',
             self.relative_paths))
 
+  def testComplexError(self):
+    self.assertEquals(
+        '/* com.apple.actool.errors */\n'
+        ': error: Failed to find a suitable device for the type SimDeviceType '
+            ': com.apple.dt.Xcode.IBSimDeviceType.iPad-2x with runtime SimRunt'
+            'ime : 10.3.1 (14E8301) - com.apple.CoreSimulator.SimRuntime.iOS-1'
+            '0-3\n'
+        '    Failure Reason: Failed to create SimDeviceSet at path /Users/jane'
+            'doe/Library/Developer/Xcode/UserData/IB Support/Simulator Devices'
+            '. You\'ll want to check the logs in ~/Library/Logs/CoreSimulator '
+            'to see why creating the SimDeviceSet failed.\n'
+        '    Underlying Errors:\n'
+        '        Description: Failed to initialize simulator device set.\n'
+        '        Failure Reason: Failed to subscribe to notifications from Cor'
+            'eSimulatorService.\n'
+        '        Underlying Errors:\n'
+        '            Description: Error returned in reply to notification requ'
+            'est: Connection invalid\n'
+        '            Failure Reason: Software caused connection abort\n',
+        compile_xcassets.FilterCompilerOutput(
+            '2017-07-07 10:37:27.367 ibtoold[88538:12553239] CoreSimulator det'
+                'ected Xcode.app relocation or CoreSimulatorService version ch'
+                'ange.  Framework path (/Applications/Xcode.app/Contents/Devel'
+                'oper/Library/PrivateFrameworks/CoreSimulator.framework) and v'
+                'ersion (375.21) does not match existing job path (/Library/De'
+                'veloper/PrivateFrameworks/CoreSimulator.framework/Versions/A/'
+                'XPCServices/com.apple.CoreSimulator.CoreSimulatorService.xpc)'
+                ' and version (459.13).  Attempting to remove the stale servic'
+                'e in order to add the expected version.\n'
+            '2017-07-07 10:37:27.625 ibtoold[88538:12553256] CoreSimulatorServ'
+                'ice connection interrupted.  Resubscribing to notifications.\n'
+            '2017-07-07 10:37:27.632 ibtoold[88538:12553264] CoreSimulatorServ'
+                'ice connection became invalid.  Simulator services will no lo'
+                'nger be available.\n'
+            '2017-07-07 10:37:27.642 ibtoold[88538:12553274] CoreSimulatorServ'
+                'ice connection became invalid.  Simulator services will no lo'
+                'nger be available.\n'
+            '/* com.apple.actool.errors */\n'
+            ': error: Failed to find a suitable device for the type SimDeviceT'
+                'ype : com.apple.dt.Xcode.IBSimDeviceType.iPad-2x with runtime'
+                ' SimRuntime : 10.3.1 (14E8301) - com.apple.CoreSimulator.SimR'
+                'untime.iOS-10-3\n'
+            '    Failure Reason: Failed to create SimDeviceSet at path /Users/'
+                'janedoe/Library/Developer/Xcode/UserData/IB Support/Simulator'
+                ' Devices. You\'ll want to check the logs in ~/Library/Logs/Co'
+                'reSimulator to see why creating the SimDeviceSet failed.\n'
+            '    Underlying Errors:\n'
+            '        Description: Failed to initialize simulator device set.\n'
+            '        Failure Reason: Failed to subscribe to notifications from'
+                ' CoreSimulatorService.\n'
+            '        Underlying Errors:\n'
+            '            Description: Error returned in reply to notification '
+                'request: Connection invalid\n'
+            '            Failure Reason: Software caused connection abort\n'
+            '/* com.apple.actool.compilation-results */\n',
+            self.relative_paths))
+
 
 if __name__ == '__main__':
   unittest.main()
diff --git a/build/toolchain/toolchain.gni b/build/toolchain/toolchain.gni
index 9a31c361..9ce2ad9 100644
--- a/build/toolchain/toolchain.gni
+++ b/build/toolchain/toolchain.gni
@@ -42,6 +42,10 @@
   # Currently disabled on LLD because of a bug (fixed upstream).
   # See https://crbug.com/716209.
   generate_linker_map = is_android && is_official_build
+
+  # Use absolute file paths in the compiler diagnostics and __FILE__ macro
+  # if needed.
+  msvc_use_absolute_paths = false
 }
 
 if (generate_linker_map) {
diff --git a/build/toolchain/win/BUILD.gn b/build/toolchain/win/BUILD.gn
index 296f829..90777eb 100644
--- a/build/toolchain/win/BUILD.gn
+++ b/build/toolchain/win/BUILD.gn
@@ -135,6 +135,13 @@
       sys_include_flags = ""
     }
 
+    clflags = ""
+
+    # Pass /FC flag to the compiler if needed.
+    if (msvc_use_absolute_paths) {
+      clflags += "/FC "
+    }
+
     tool("cc") {
       rspfile = "{{output}}.rsp"
       precompiled_header_type = "msvc"
@@ -143,7 +150,7 @@
       # Label names may have spaces in them so the pdbname must be quoted. The
       # source and output don't need to be quoted because GN knows they're a
       # full file name and will quote automatically when necessary.
-      command = "$env_wrapper$cl /nologo /showIncludes /FC @$rspfile /c {{source}} /Fo{{output}} /Fd\"$pdbname\""
+      command = "$env_wrapper$cl /nologo /showIncludes ${clflags} @$rspfile /c {{source}} /Fo{{output}} /Fd\"$pdbname\""
       depsformat = "msvc"
       description = "CC {{output}}"
       outputs = [
@@ -160,7 +167,7 @@
       pdbname = "{{target_out_dir}}/{{label_name}}_cc.pdb"
 
       # See comment in CC tool about quoting.
-      command = "$env_wrapper$cl /nologo /showIncludes /FC @$rspfile /c {{source}} /Fo{{output}} /Fd\"$pdbname\""
+      command = "$env_wrapper$cl /nologo /showIncludes ${clflags} @$rspfile /c {{source}} /Fo{{output}} /Fd\"$pdbname\""
       depsformat = "msvc"
       description = "CXX {{output}}"
       outputs = [
diff --git a/cc/BUILD.gn b/cc/BUILD.gn
index 8b0d79f..2fe2405 100644
--- a/cc/BUILD.gn
+++ b/cc/BUILD.gn
@@ -289,13 +289,8 @@
     "raster/zero_copy_raster_buffer_provider.h",
     "resources/memory_history.cc",
     "resources/memory_history.h",
-    "resources/platform_color.h",
     "resources/release_callback.h",
     "resources/resource.h",
-    "resources/resource_format.cc",
-    "resources/resource_format.h",
-    "resources/resource_format_utils.cc",
-    "resources/resource_format_utils.h",
     "resources/resource_pool.cc",
     "resources/resource_pool.h",
     "resources/resource_provider.cc",
@@ -478,6 +473,7 @@
 
   public_deps = [
     "//cc/base",
+    "//components/viz/common",
     "//skia",
   ]
   deps = [
@@ -792,7 +788,6 @@
     "raster/synchronous_task_graph_runner_unittest.cc",
     "raster/task_graph_work_queue_unittest.cc",
     "raster/texture_compressor_etc1_unittest.cc",
-    "resources/platform_color_unittest.cc",
     "resources/resource_pool_unittest.cc",
     "resources/resource_provider_unittest.cc",
     "resources/resource_util_unittest.cc",
@@ -898,6 +893,7 @@
     "//cc/surfaces",
     "//cc/surfaces:surface_id",
     "//cc/surfaces:surfaces",
+    "//components/viz/common",
     "//gpu",
     "//gpu:test_support",
     "//gpu/command_buffer/client:gles2_interface",
diff --git a/cc/DEPS b/cc/DEPS
index 0701904..bf4ab29b 100644
--- a/cc/DEPS
+++ b/cc/DEPS
@@ -1,4 +1,6 @@
 include_rules = [
+  "+components/viz/common/quads",
+  "+components/viz/common/resources",
   "+gpu/GLES2",
   "+gpu/command_buffer/client/context_support.h",
   "+gpu/command_buffer/client/gles2_interface.h",
diff --git a/cc/ipc/cc_param_traits_macros.h b/cc/ipc/cc_param_traits_macros.h
index 019a16e1..7bb91782 100644
--- a/cc/ipc/cc_param_traits_macros.h
+++ b/cc/ipc/cc_param_traits_macros.h
@@ -18,12 +18,12 @@
 #include "cc/quads/texture_draw_quad.h"
 #include "cc/quads/tile_draw_quad.h"
 #include "cc/quads/yuv_video_draw_quad.h"
-#include "cc/resources/resource_format.h"
 #include "cc/resources/returned_resource.h"
 #include "cc/resources/transferable_resource.h"
 #include "cc/surfaces/surface_id.h"
 #include "cc/surfaces/surface_info.h"
 #include "cc/surfaces/surface_sequence.h"
+#include "components/viz/common/quads/resource_format.h"
 #include "ui/gfx/ipc/color/gfx_param_traits.h"
 #include "ui/gfx/ipc/gfx_param_traits.h"
 #include "ui/gfx/ipc/skia/gfx_skia_param_traits.h"
@@ -35,7 +35,7 @@
 IPC_ENUM_TRAITS_MAX_VALUE(cc::DrawQuad::Material, cc::DrawQuad::MATERIAL_LAST)
 IPC_ENUM_TRAITS_MAX_VALUE(cc::FilterOperation::FilterType,
                           cc::FilterOperation::FILTER_TYPE_LAST)
-IPC_ENUM_TRAITS_MAX_VALUE(cc::ResourceFormat, cc::RESOURCE_FORMAT_MAX)
+IPC_ENUM_TRAITS_MAX_VALUE(viz::ResourceFormat, viz::RESOURCE_FORMAT_MAX)
 
 // TODO(fsamuel): This trait belongs with skia code.
 IPC_ENUM_TRAITS_MAX_VALUE(SkBlendMode, SkBlendMode::kLastMode)
diff --git a/cc/ipc/cc_param_traits_unittest.cc b/cc/ipc/cc_param_traits_unittest.cc
index 41d6da45b..5da53a13 100644
--- a/cc/ipc/cc_param_traits_unittest.cc
+++ b/cc/ipc/cc_param_traits_unittest.cc
@@ -592,7 +592,7 @@
 
   TransferableResource arbitrary_resource1;
   arbitrary_resource1.id = 2178312;
-  arbitrary_resource1.format = cc::RGBA_8888;
+  arbitrary_resource1.format = viz::RGBA_8888;
   arbitrary_resource1.filter = 53;
   arbitrary_resource1.size = gfx::Size(37189, 123123);
   arbitrary_resource1.mailbox_holder.mailbox.SetName(arbitrary_mailbox1);
@@ -606,7 +606,7 @@
 
   TransferableResource arbitrary_resource2;
   arbitrary_resource2.id = 789132;
-  arbitrary_resource2.format = cc::RGBA_4444;
+  arbitrary_resource2.format = viz::RGBA_4444;
   arbitrary_resource2.filter = 47;
   arbitrary_resource2.size = gfx::Size(89123, 23789);
   arbitrary_resource2.mailbox_holder.mailbox.SetName(arbitrary_mailbox2);
diff --git a/cc/ipc/struct_traits_unittest.cc b/cc/ipc/struct_traits_unittest.cc
index dc5d9cb..48f7269 100644
--- a/cc/ipc/struct_traits_unittest.cc
+++ b/cc/ipc/struct_traits_unittest.cc
@@ -254,7 +254,7 @@
 
   // TransferableResource constants.
   const uint32_t tr_id = 1337;
-  const ResourceFormat tr_format = ALPHA_8;
+  const viz::ResourceFormat tr_format = viz::ALPHA_8;
   const gfx::BufferFormat tr_buffer_format = gfx::BufferFormat::R_8;
   const uint32_t tr_filter = 1234;
   const gfx::Size tr_size(1234, 5678);
@@ -1146,7 +1146,7 @@
 
 TEST_F(StructTraitsTest, TransferableResource) {
   const uint32_t id = 1337;
-  const ResourceFormat format = ALPHA_8;
+  const viz::ResourceFormat format = viz::ALPHA_8;
   const uint32_t filter = 1234;
   const gfx::Size size(1234, 5678);
   const int8_t mailbox_name[GL_MAILBOX_SIZE_CHROMIUM] = {
diff --git a/cc/ipc/transferable_resource_struct_traits.cc b/cc/ipc/transferable_resource_struct_traits.cc
index ea6c56d..60aedc8 100644
--- a/cc/ipc/transferable_resource_struct_traits.cc
+++ b/cc/ipc/transferable_resource_struct_traits.cc
@@ -20,7 +20,7 @@
       !data.ReadColorSpace(&out->color_space))
     return false;
   out->id = data.id();
-  out->format = static_cast<cc::ResourceFormat>(data.format());
+  out->format = static_cast<viz::ResourceFormat>(data.format());
   out->buffer_format = static_cast<gfx::BufferFormat>(data.buffer_format());
   out->filter = data.filter();
   out->read_lock_fences_enabled = data.read_lock_fences_enabled();
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc
index 856f47c9..29c27a93 100644
--- a/cc/layers/picture_layer_impl.cc
+++ b/cc/layers/picture_layer_impl.cc
@@ -256,7 +256,7 @@
         render_pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
     quad->SetNew(shared_quad_state, geometry_rect, opaque_rect,
                  visible_geometry_rect, texture_rect, texture_size,
-                 nearest_neighbor_, RGBA_8888, quad_content_rect,
+                 nearest_neighbor_, viz::RGBA_8888, quad_content_rect,
                  max_contents_scale, raster_source_);
     ValidateQuadResources(quad);
     return;
diff --git a/cc/layers/texture_layer_impl.cc b/cc/layers/texture_layer_impl.cc
index 4835c97d..a64b5e9 100644
--- a/cc/layers/texture_layer_impl.cc
+++ b/cc/layers/texture_layer_impl.cc
@@ -13,11 +13,11 @@
 #include "cc/output/output_surface.h"
 #include "cc/quads/solid_color_draw_quad.h"
 #include "cc/quads/texture_draw_quad.h"
-#include "cc/resources/platform_color.h"
 #include "cc/resources/scoped_resource.h"
 #include "cc/resources/single_release_callback_impl.h"
 #include "cc/trees/layer_tree_impl.h"
 #include "cc/trees/occlusion.h"
+#include "components/viz/common/resources/platform_color.h"
 
 namespace cc {
 
@@ -122,7 +122,7 @@
       std::vector<uint8_t> swizzled;
       uint8_t* pixels = texture_mailbox_.shared_bitmap()->pixels();
 
-      if (!PlatformColor::SameComponentOrder(texture_copy_->format())) {
+      if (!viz::PlatformColor::SameComponentOrder(texture_copy_->format())) {
         // Swizzle colors. This is slow, but should be really uncommon.
         size_t bytes = texture_mailbox_.SharedMemorySizeInBytes();
         swizzled.resize(bytes);
diff --git a/cc/output/direct_renderer.h b/cc/output/direct_renderer.h
index 0c46c05e..d265657 100644
--- a/cc/output/direct_renderer.h
+++ b/cc/output/direct_renderer.h
@@ -146,7 +146,7 @@
 
   // Private interface implemented by subclasses for use by DirectRenderer.
   virtual bool CanPartialSwap() = 0;
-  virtual ResourceFormat BackbufferFormat() const = 0;
+  virtual viz::ResourceFormat BackbufferFormat() const = 0;
   virtual void BindFramebufferToOutputSurface() = 0;
   virtual bool BindFramebufferToTexture(const ScopedResource* resource) = 0;
   virtual void SetScissorTestRect(const gfx::Rect& scissor_rect) = 0;
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
index f42dfdb..29b67dc 100644
--- a/cc/output/gl_renderer.cc
+++ b/cc/output/gl_renderer.cc
@@ -428,10 +428,10 @@
   return context_provider->ContextCapabilities().post_sub_buffer;
 }
 
-ResourceFormat GLRenderer::BackbufferFormat() const {
+viz::ResourceFormat GLRenderer::BackbufferFormat() const {
   if (current_frame()->current_render_pass->color_space.IsHDR() &&
-      resource_provider_->IsRenderBufferFormatSupported(RGBA_F16)) {
-    return RGBA_F16;
+      resource_provider_->IsRenderBufferFormatSupported(viz::RGBA_F16)) {
+    return viz::RGBA_F16;
   }
   return resource_provider_->best_texture_format();
 }
@@ -1057,7 +1057,7 @@
     TileDrawQuad* tile_quad = &bypass->second;
     // RGBA_8888 and the gfx::ColorSpace() here are arbitrary and unused.
     Resource tile_resource(tile_quad->resource_id(), tile_quad->texture_size,
-                           ResourceFormat::RGBA_8888, gfx::ColorSpace());
+                           viz::ResourceFormat::RGBA_8888, gfx::ColorSpace());
     // The projection matrix used by GLRenderer has a flip.  As tile texture
     // inputs are oriented opposite to framebuffer outputs, don't flip via
     // texture coords and let the projection matrix naturallyd o it.
@@ -3406,7 +3406,8 @@
       static_cast<uint32_t>(updated_dst_rect.height()), iosurface_multiple);
 
   *resource = overlay_resource_pool_->AcquireResource(
-      gfx::Size(iosurface_width, iosurface_height), ResourceFormat::RGBA_8888,
+      gfx::Size(iosurface_width, iosurface_height),
+      viz::ResourceFormat::RGBA_8888,
       current_frame()->current_render_pass->color_space);
   *new_bounds =
       gfx::RectF(updated_dst_rect.x(), updated_dst_rect.y(),
diff --git a/cc/output/gl_renderer.h b/cc/output/gl_renderer.h
index ca853e3..05cd04b 100644
--- a/cc/output/gl_renderer.h
+++ b/cc/output/gl_renderer.h
@@ -86,7 +86,7 @@
   bool blend_enabled() const { return blend_shadow_; }
 
   bool CanPartialSwap() override;
-  ResourceFormat BackbufferFormat() const override;
+  viz::ResourceFormat BackbufferFormat() const override;
   void BindFramebufferToOutputSurface() override;
   bool BindFramebufferToTexture(const ScopedResource* resource) override;
   void SetScissorTestRect(const gfx::Rect& scissor_rect) override;
@@ -187,8 +187,6 @@
                           const gfx::QuadF* clip_region);
   void DrawStreamVideoQuad(const StreamVideoDrawQuad* quad,
                            const gfx::QuadF* clip_region);
-  void DrawTextureQuad(const TextureDrawQuad* quad,
-                       const gfx::QuadF* clip_region);
   void EnqueueTextureQuad(const TextureDrawQuad* quad,
                           const gfx::QuadF* clip_region);
   void FlushTextureQuadCache(BoundGeometry flush_binding);
@@ -331,7 +329,7 @@
   std::unique_ptr<ResourceProvider::ScopedWriteLockGL>
       current_framebuffer_lock_;
   // This is valid when current_framebuffer_lock_ is not null.
-  ResourceFormat current_framebuffer_format_;
+  viz::ResourceFormat current_framebuffer_format_;
 
   class SyncQuery;
   std::deque<std::unique_ptr<SyncQuery>> pending_sync_queries_;
diff --git a/cc/output/in_process_context_provider.cc b/cc/output/in_process_context_provider.cc
index acadc43..cd53faa 100644
--- a/cc/output/in_process_context_provider.cc
+++ b/cc/output/in_process_context_provider.cc
@@ -11,7 +11,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/single_thread_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "cc/resources/platform_color.h"
+#include "components/viz/common/resources/platform_color.h"
 #include "gpu/GLES2/gl2extchromium.h"
 #include "gpu/command_buffer/client/gles2_implementation.h"
 #include "gpu/command_buffer/common/gles2_cmd_utils.h"
diff --git a/cc/output/renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc
index 583e138..e2ebf56 100644
--- a/cc/output/renderer_pixeltest.cc
+++ b/cc/output/renderer_pixeltest.cc
@@ -138,7 +138,7 @@
     }
   }
   ResourceId resource = resource_provider->CreateResource(
-      rect.size(), ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888,
+      rect.size(), ResourceProvider::TEXTURE_HINT_IMMUTABLE, viz::RGBA_8888,
       gfx::ColorSpace());
   resource_provider->CopyToResource(
       resource, reinterpret_cast<uint8_t*>(&pixels.front()), rect.size());
@@ -174,7 +174,7 @@
   std::vector<uint32_t> pixels(num_pixels, pixel_color);
 
   ResourceId resource = resource_provider->CreateResource(
-      rect.size(), ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888,
+      rect.size(), ResourceProvider::TEXTURE_HINT_IMMUTABLE, viz::RGBA_8888,
       gfx::ColorSpace());
   resource_provider->CopyToResource(
       resource, reinterpret_cast<uint8_t*>(&pixels.front()), rect.size());
@@ -553,7 +553,7 @@
       rect.size(), ResourceProvider::TEXTURE_HINT_DEFAULT,
       resource_provider->YuvResourceFormat(8), gfx::ColorSpace());
   ResourceId u_resource = resource_provider->CreateResource(
-      uv_tex_size, ResourceProvider::TEXTURE_HINT_DEFAULT, RGBA_8888,
+      uv_tex_size, ResourceProvider::TEXTURE_HINT_DEFAULT, viz::RGBA_8888,
       gfx::ColorSpace());
   ResourceId v_resource = u_resource;
   ResourceId a_resource = 0;
@@ -1056,8 +1056,8 @@
 
   blue_quad->SetNew(this->front_quad_state_, this->quad_rect_, gfx::Rect(),
                     this->quad_rect_, gfx::RectF(this->quad_rect_),
-                    this->quad_rect_.size(), false, RGBA_8888, this->quad_rect_,
-                    1.f, blue_raster_source);
+                    this->quad_rect_.size(), false, viz::RGBA_8888,
+                    this->quad_rect_, 1.f, blue_raster_source);
 
   std::unique_ptr<FakeRecordingSource> green_recording =
       FakeRecordingSource::CreateFilledRecordingSource(this->quad_rect_.size());
@@ -1071,7 +1071,7 @@
       this->render_pass_->template CreateAndAppendDrawQuad<PictureDrawQuad>();
   green_quad->SetNew(this->back_quad_state_, this->quad_rect_, gfx::Rect(),
                      this->quad_rect_, gfx::RectF(this->quad_rect_),
-                     this->quad_rect_.size(), false, RGBA_8888,
+                     this->quad_rect_.size(), false, viz::RGBA_8888,
                      this->quad_rect_, 1.f, green_raster_source);
   SCOPED_TRACE("IntersectingPictureQuadsPass");
   this->AppendBackgroundAndRunTest(
@@ -2018,8 +2018,8 @@
   }
 
   ResourceId mask_resource_id = this->resource_provider_->CreateResource(
-      mask_rect.size(), ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888,
-      gfx::ColorSpace());
+      mask_rect.size(), ResourceProvider::TEXTURE_HINT_IMMUTABLE,
+      viz::RGBA_8888, gfx::ColorSpace());
 
   this->resource_provider_->CopyToResource(
       mask_resource_id, reinterpret_cast<uint8_t*>(bitmap.getPixels()),
@@ -2111,8 +2111,8 @@
   }
 
   ResourceId mask_resource_id = this->resource_provider_->CreateResource(
-      mask_rect.size(), ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888,
-      gfx::ColorSpace());
+      mask_rect.size(), ResourceProvider::TEXTURE_HINT_IMMUTABLE,
+      viz::RGBA_8888, gfx::ColorSpace());
 
   this->resource_provider_->CopyToResource(
       mask_resource_id, reinterpret_cast<uint8_t*>(bitmap.getPixels()),
@@ -2574,7 +2574,7 @@
 TYPED_TEST(SoftwareRendererPixelTest, PictureDrawQuadIdentityScale) {
   gfx::Rect viewport(this->device_viewport_size_);
   // TODO(enne): the renderer should figure this out on its own.
-  ResourceFormat texture_format = RGBA_8888;
+  viz::ResourceFormat texture_format = viz::RGBA_8888;
   bool nearest_neighbor = false;
 
   int id = 1;
@@ -2650,7 +2650,7 @@
 // Not WithSkiaGPUBackend since that path currently requires tiles for opacity.
 TYPED_TEST(SoftwareRendererPixelTest, PictureDrawQuadOpacity) {
   gfx::Rect viewport(this->device_viewport_size_);
-  ResourceFormat texture_format = RGBA_8888;
+  viz::ResourceFormat texture_format = viz::RGBA_8888;
   bool nearest_neighbor = false;
 
   int id = 1;
@@ -2738,7 +2738,7 @@
     return;
 
   gfx::Rect viewport(this->device_viewport_size_);
-  ResourceFormat texture_format = RGBA_8888;
+  viz::ResourceFormat texture_format = viz::RGBA_8888;
   bool nearest_neighbor = false;
 
   int id = 1;
@@ -2787,7 +2787,7 @@
 // This disables filtering by setting |nearest_neighbor| on the PictureDrawQuad.
 TYPED_TEST(SoftwareRendererPixelTest, PictureDrawQuadNearestNeighbor) {
   gfx::Rect viewport(this->device_viewport_size_);
-  ResourceFormat texture_format = RGBA_8888;
+  viz::ResourceFormat texture_format = viz::RGBA_8888;
   bool nearest_neighbor = true;
 
   int id = 1;
@@ -2847,7 +2847,7 @@
 
   gfx::Size tile_size(2, 2);
   ResourceId resource = this->resource_provider_->CreateResource(
-      tile_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888,
+      tile_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, viz::RGBA_8888,
       gfx::ColorSpace());
 
   this->resource_provider_->CopyToResource(
@@ -2892,7 +2892,7 @@
 
   gfx::Size tile_size(2, 2);
   ResourceId resource = this->resource_provider_->CreateResource(
-      tile_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888,
+      tile_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, viz::RGBA_8888,
       gfx::ColorSpace());
 
   this->resource_provider_->CopyToResource(
@@ -2940,7 +2940,7 @@
 
   gfx::Size tile_size(2, 2);
   ResourceId resource = this->resource_provider_->CreateResource(
-      tile_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888,
+      tile_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, viz::RGBA_8888,
       gfx::ColorSpace());
 
   this->resource_provider_->CopyToResource(
@@ -2975,7 +2975,7 @@
 TYPED_TEST(SoftwareRendererPixelTest, PictureDrawQuadNonIdentityScale) {
   gfx::Rect viewport(this->device_viewport_size_);
   // TODO(enne): the renderer should figure this out on its own.
-  ResourceFormat texture_format = RGBA_8888;
+  viz::ResourceFormat texture_format = viz::RGBA_8888;
   bool nearest_neighbor = false;
 
   int id = 1;
@@ -3301,8 +3301,8 @@
   }
 
   ResourceId resource = this->resource_provider_->CreateResource(
-      mask_rect.size(), ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888,
-      gfx::ColorSpace());
+      mask_rect.size(), ResourceProvider::TEXTURE_HINT_IMMUTABLE,
+      viz::RGBA_8888, gfx::ColorSpace());
 
   this->resource_provider_->CopyToResource(
       resource, reinterpret_cast<uint8_t*>(bitmap.getPixels()),
@@ -3480,7 +3480,7 @@
         CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
 
     ResourceId resource = resource_provider_->CreateResource(
-        rect.size(), ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888,
+        rect.size(), ResourceProvider::TEXTURE_HINT_IMMUTABLE, viz::RGBA_8888,
         src_color_space_);
     resource_provider_->CopyToResource(resource, input_colors.data(),
                                        rect.size());
diff --git a/cc/output/software_renderer.cc b/cc/output/software_renderer.cc
index 6fc30a0..d6187b2 100644
--- a/cc/output/software_renderer.cc
+++ b/cc/output/software_renderer.cc
@@ -66,7 +66,7 @@
   return true;
 }
 
-ResourceFormat SoftwareRenderer::BackbufferFormat() const {
+viz::ResourceFormat SoftwareRenderer::BackbufferFormat() const {
   return resource_provider_->best_texture_format();
 }
 
diff --git a/cc/output/software_renderer.h b/cc/output/software_renderer.h
index 07e91027..3a077802 100644
--- a/cc/output/software_renderer.h
+++ b/cc/output/software_renderer.h
@@ -37,7 +37,7 @@
 
  protected:
   bool CanPartialSwap() override;
-  ResourceFormat BackbufferFormat() const override;
+  viz::ResourceFormat BackbufferFormat() const override;
   void BindFramebufferToOutputSurface() override;
   bool BindFramebufferToTexture(const ScopedResource* texture) override;
   void SetScissorTestRect(const gfx::Rect& scissor_rect) override;
diff --git a/cc/output/software_renderer_unittest.cc b/cc/output/software_renderer_unittest.cc
index 19a68ca6..ec53b2d 100644
--- a/cc/output/software_renderer_unittest.cc
+++ b/cc/output/software_renderer_unittest.cc
@@ -143,10 +143,10 @@
   InitializeRenderer(base::WrapUnique(new SoftwareOutputDevice));
 
   ResourceId resource_yellow = resource_provider()->CreateResource(
-      outer_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888,
+      outer_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, viz::RGBA_8888,
       gfx::ColorSpace());
   ResourceId resource_cyan = resource_provider()->CreateResource(
-      inner_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888,
+      inner_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, viz::RGBA_8888,
       gfx::ColorSpace());
 
   SkBitmap yellow_tile;
@@ -209,7 +209,7 @@
   InitializeRenderer(base::WrapUnique(new SoftwareOutputDevice));
 
   ResourceId resource_cyan = resource_provider()->CreateResource(
-      tile_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888,
+      tile_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, viz::RGBA_8888,
       gfx::ColorSpace());
 
   SkBitmap cyan_tile;  // The lowest five rows are yellow.
diff --git a/cc/paint/display_item_list.cc b/cc/paint/display_item_list.cc
index 8945e5a..3fb69bb 100644
--- a/cc/paint/display_item_list.cc
+++ b/cc/paint/display_item_list.cc
@@ -157,12 +157,7 @@
   gfx::Rect bounds = rtree_.GetBounds();
   DiscardableImageMap::ScopedMetadataGenerator generator(
       &image_map_, gfx::Size(bounds.right(), bounds.bottom()));
-  GatherDiscardableImages(generator.image_store());
-}
-
-void DisplayItemList::GatherDiscardableImages(
-    DiscardableImageStore* image_store) const {
-  image_store->GatherDiscardableImages(&paint_op_buffer_);
+  generator.image_store()->GatherDiscardableImages(&paint_op_buffer_);
 }
 
 void DisplayItemList::GetDiscardableImagesInRect(
@@ -190,7 +185,6 @@
   current_range_start_ = 0;
   in_paired_begin_count_ = 0;
   in_painting_ = false;
-  op_count_ = 0u;
 }
 
 sk_sp<PaintRecord> DisplayItemList::ReleaseAsRecord() {
diff --git a/cc/paint/display_item_list.h b/cc/paint/display_item_list.h
index 1381336..46cc329 100644
--- a/cc/paint/display_item_list.h
+++ b/cc/paint/display_item_list.h
@@ -126,7 +126,6 @@
 
   gfx::Rect VisualRectForTesting(int index) { return visual_rects_[index]; }
 
-  void GatherDiscardableImages(DiscardableImageStore* image_store) const;
   const DiscardableImageMap& discardable_image_map_for_testing() const {
     return image_map_;
   }
@@ -181,8 +180,6 @@
   // nesting.
   bool in_painting_ = false;
 
-  size_t op_count_ = 0u;
-
   friend class base::RefCountedThreadSafe<DisplayItemList>;
   FRIEND_TEST_ALL_PREFIXES(DisplayItemListTest, BytesUsed);
   DISALLOW_COPY_AND_ASSIGN(DisplayItemList);
diff --git a/cc/paint/paint_flags.h b/cc/paint/paint_flags.h
index 940751c..2101c1aa 100644
--- a/cc/paint/paint_flags.h
+++ b/cc/paint/paint_flags.h
@@ -176,7 +176,7 @@
     return paint_.getShader()->isOpaque();
   }
 
-  ALWAYS_INLINE void setShader(std::unique_ptr<PaintShader> shader) {
+  ALWAYS_INLINE void setShader(sk_sp<PaintShader> shader) {
     paint_.setShader(shader ? shader->sk_shader() : nullptr);
   }
   ALWAYS_INLINE SkPathEffect* getPathEffect() const {
diff --git a/cc/paint/paint_shader.cc b/cc/paint/paint_shader.cc
index fb8bb25..19cf600 100644
--- a/cc/paint/paint_shader.cc
+++ b/cc/paint/paint_shader.cc
@@ -10,42 +10,40 @@
 
 namespace cc {
 
-std::unique_ptr<PaintShader> PaintShader::MakeColor(SkColor color) {
-  return base::WrapUnique(new PaintShader(nullptr, color));
+sk_sp<PaintShader> PaintShader::MakeColor(SkColor color) {
+  return sk_sp<PaintShader>(new PaintShader(nullptr, color));
 }
 
-std::unique_ptr<PaintShader> PaintShader::MakeLinearGradient(
-    const SkPoint points[],
-    const SkColor colors[],
-    const SkScalar pos[],
-    int count,
-    SkShader::TileMode mode,
-    uint32_t flags,
-    const SkMatrix* local_matrix,
-    SkColor fallback_color) {
-  return base::WrapUnique(
+sk_sp<PaintShader> PaintShader::MakeLinearGradient(const SkPoint points[],
+                                                   const SkColor colors[],
+                                                   const SkScalar pos[],
+                                                   int count,
+                                                   SkShader::TileMode mode,
+                                                   uint32_t flags,
+                                                   const SkMatrix* local_matrix,
+                                                   SkColor fallback_color) {
+  return sk_sp<PaintShader>(
       new PaintShader(SkGradientShader::MakeLinear(points, colors, pos, count,
                                                    mode, flags, local_matrix),
                       fallback_color));
 }
 
-std::unique_ptr<PaintShader> PaintShader::MakeRadialGradient(
-    const SkPoint& center,
-    SkScalar radius,
-    const SkColor colors[],
-    const SkScalar pos[],
-    int color_count,
-    SkShader::TileMode mode,
-    uint32_t flags,
-    const SkMatrix* local_matrix,
-    SkColor fallback_color) {
-  return base::WrapUnique(new PaintShader(
+sk_sp<PaintShader> PaintShader::MakeRadialGradient(const SkPoint& center,
+                                                   SkScalar radius,
+                                                   const SkColor colors[],
+                                                   const SkScalar pos[],
+                                                   int color_count,
+                                                   SkShader::TileMode mode,
+                                                   uint32_t flags,
+                                                   const SkMatrix* local_matrix,
+                                                   SkColor fallback_color) {
+  return sk_sp<PaintShader>(new PaintShader(
       SkGradientShader::MakeRadial(center, radius, colors, pos, color_count,
                                    mode, flags, local_matrix),
       fallback_color));
 }
 
-std::unique_ptr<PaintShader> PaintShader::MakeTwoPointConicalGradient(
+sk_sp<PaintShader> PaintShader::MakeTwoPointConicalGradient(
     const SkPoint& start,
     SkScalar start_radius,
     const SkPoint& end,
@@ -57,44 +55,41 @@
     uint32_t flags,
     const SkMatrix* local_matrix,
     SkColor fallback_color) {
-  return base::WrapUnique(
+  return sk_sp<PaintShader>(
       new PaintShader(SkGradientShader::MakeTwoPointConical(
                           start, start_radius, end, end_radius, colors, pos,
                           color_count, mode, flags, local_matrix),
                       fallback_color));
 }
 
-std::unique_ptr<PaintShader> PaintShader::MakeSweepGradient(
-    SkScalar cx,
-    SkScalar cy,
-    const SkColor colors[],
-    const SkScalar pos[],
-    int color_count,
-    uint32_t flags,
-    const SkMatrix* local_matrix,
-    SkColor fallback_color) {
-  return base::WrapUnique(new PaintShader(
+sk_sp<PaintShader> PaintShader::MakeSweepGradient(SkScalar cx,
+                                                  SkScalar cy,
+                                                  const SkColor colors[],
+                                                  const SkScalar pos[],
+                                                  int color_count,
+                                                  uint32_t flags,
+                                                  const SkMatrix* local_matrix,
+                                                  SkColor fallback_color) {
+  return sk_sp<PaintShader>(new PaintShader(
       SkGradientShader::MakeSweep(cx, cy, colors, pos, color_count, flags,
                                   local_matrix),
       fallback_color));
 }
 
-std::unique_ptr<PaintShader> PaintShader::MakeImage(
-    sk_sp<const SkImage> image,
-    SkShader::TileMode tx,
-    SkShader::TileMode ty,
-    const SkMatrix* local_matrix) {
-  return base::WrapUnique(new PaintShader(
+sk_sp<PaintShader> PaintShader::MakeImage(sk_sp<const SkImage> image,
+                                          SkShader::TileMode tx,
+                                          SkShader::TileMode ty,
+                                          const SkMatrix* local_matrix) {
+  return sk_sp<PaintShader>(new PaintShader(
       image->makeShader(tx, ty, local_matrix), SK_ColorTRANSPARENT));
 }
 
-std::unique_ptr<PaintShader> PaintShader::MakePaintRecord(
-    sk_sp<PaintRecord> record,
-    const SkRect& tile,
-    SkShader::TileMode tx,
-    SkShader::TileMode ty,
-    const SkMatrix* local_matrix) {
-  return base::WrapUnique(new PaintShader(
+sk_sp<PaintShader> PaintShader::MakePaintRecord(sk_sp<PaintRecord> record,
+                                                const SkRect& tile,
+                                                SkShader::TileMode tx,
+                                                SkShader::TileMode ty,
+                                                const SkMatrix* local_matrix) {
+  return sk_sp<PaintShader>(new PaintShader(
       SkShader::MakePictureShader(ToSkPicture(std::move(record), tile), tx, ty,
                                   local_matrix, nullptr),
       SK_ColorTRANSPARENT));
@@ -105,11 +100,7 @@
                         : SkShader::MakeColorShader(fallback_color)) {
   DCHECK(sk_shader_);
 }
-PaintShader::PaintShader(const PaintShader& other) = default;
-PaintShader::PaintShader(PaintShader&& other) = default;
-PaintShader::~PaintShader() = default;
 
-PaintShader& PaintShader::operator=(const PaintShader& other) = default;
-PaintShader& PaintShader::operator=(PaintShader&& other) = default;
+PaintShader::~PaintShader() = default;
 
 }  // namespace cc
diff --git a/cc/paint/paint_shader.h b/cc/paint/paint_shader.h
index 6fc1a46..6dd468c 100644
--- a/cc/paint/paint_shader.h
+++ b/cc/paint/paint_shader.h
@@ -17,11 +17,11 @@
 class PaintOpBuffer;
 using PaintRecord = PaintOpBuffer;
 
-class CC_PAINT_EXPORT PaintShader {
+class CC_PAINT_EXPORT PaintShader : public SkRefCnt {
  public:
-  static std::unique_ptr<PaintShader> MakeColor(SkColor color);
+  static sk_sp<PaintShader> MakeColor(SkColor color);
 
-  static std::unique_ptr<PaintShader> MakeLinearGradient(
+  static sk_sp<PaintShader> MakeLinearGradient(
       const SkPoint points[],
       const SkColor colors[],
       const SkScalar pos[],
@@ -31,7 +31,7 @@
       const SkMatrix* local_matrix = nullptr,
       SkColor fallback_color = SK_ColorTRANSPARENT);
 
-  static std::unique_ptr<PaintShader> MakeRadialGradient(
+  static sk_sp<PaintShader> MakeRadialGradient(
       const SkPoint& center,
       SkScalar radius,
       const SkColor colors[],
@@ -42,7 +42,7 @@
       const SkMatrix* local_matrix = nullptr,
       SkColor fallback_color = SK_ColorTRANSPARENT);
 
-  static std::unique_ptr<PaintShader> MakeTwoPointConicalGradient(
+  static sk_sp<PaintShader> MakeTwoPointConicalGradient(
       const SkPoint& start,
       SkScalar start_radius,
       const SkPoint& end,
@@ -55,7 +55,7 @@
       const SkMatrix* local_matrix = nullptr,
       SkColor fallback_color = SK_ColorTRANSPARENT);
 
-  static std::unique_ptr<PaintShader> MakeSweepGradient(
+  static sk_sp<PaintShader> MakeSweepGradient(
       SkScalar cx,
       SkScalar cy,
       const SkColor colors[],
@@ -65,24 +65,18 @@
       const SkMatrix* local_matrix = nullptr,
       SkColor fallback_color = SK_ColorTRANSPARENT);
 
-  static std::unique_ptr<PaintShader> MakeImage(sk_sp<const SkImage> image,
-                                                SkShader::TileMode tx,
-                                                SkShader::TileMode ty,
-                                                const SkMatrix* local_matrix);
+  static sk_sp<PaintShader> MakeImage(sk_sp<const SkImage> image,
+                                      SkShader::TileMode tx,
+                                      SkShader::TileMode ty,
+                                      const SkMatrix* local_matrix);
 
-  static std::unique_ptr<PaintShader> MakePaintRecord(
-      sk_sp<PaintRecord> record,
-      const SkRect& tile,
-      SkShader::TileMode tx,
-      SkShader::TileMode ty,
-      const SkMatrix* local_matrix);
+  static sk_sp<PaintShader> MakePaintRecord(sk_sp<PaintRecord> record,
+                                            const SkRect& tile,
+                                            SkShader::TileMode tx,
+                                            SkShader::TileMode ty,
+                                            const SkMatrix* local_matrix);
 
-  PaintShader(const PaintShader& other);
-  PaintShader(PaintShader&& other);
-  ~PaintShader();
-
-  PaintShader& operator=(const PaintShader& other);
-  PaintShader& operator=(PaintShader&& other);
+  ~PaintShader() override;
 
   const sk_sp<SkShader>& sk_shader() const { return sk_shader_; }
 
diff --git a/cc/quads/draw_quad_unittest.cc b/cc/quads/draw_quad_unittest.cc
index b8f150b9..fafc1b2 100644
--- a/cc/quads/draw_quad_unittest.cc
+++ b/cc/quads/draw_quad_unittest.cc
@@ -426,7 +426,7 @@
   gfx::RectF tex_coord_rect(31.f, 12.f, 54.f, 20.f);
   gfx::Size texture_size(85, 32);
   bool nearest_neighbor = true;
-  ResourceFormat texture_format = RGBA_8888;
+  viz::ResourceFormat texture_format = viz::RGBA_8888;
   gfx::Rect content_rect(30, 40, 20, 30);
   float contents_scale = 3.141592f;
   scoped_refptr<RasterSource> raster_source =
@@ -633,7 +633,7 @@
   gfx::RectF tex_coord_rect(31.f, 12.f, 54.f, 20.f);
   gfx::Size texture_size(85, 32);
   bool nearest_neighbor = true;
-  ResourceFormat texture_format = RGBA_8888;
+  viz::ResourceFormat texture_format = viz::RGBA_8888;
   gfx::Rect content_rect(30, 40, 20, 30);
   float contents_scale = 3.141592f;
   scoped_refptr<RasterSource> raster_source =
diff --git a/cc/quads/picture_draw_quad.cc b/cc/quads/picture_draw_quad.cc
index 14c0123..b0f1af27 100644
--- a/cc/quads/picture_draw_quad.cc
+++ b/cc/quads/picture_draw_quad.cc
@@ -7,7 +7,7 @@
 #include "base/trace_event/trace_event_argument.h"
 #include "base/values.h"
 #include "cc/base/math_util.h"
-#include "cc/resources/platform_color.h"
+#include "components/viz/common/resources/platform_color.h"
 
 namespace cc {
 
@@ -26,19 +26,14 @@
                              const gfx::RectF& tex_coord_rect,
                              const gfx::Size& texture_size,
                              bool nearest_neighbor,
-                             ResourceFormat texture_format,
+                             viz::ResourceFormat texture_format,
                              const gfx::Rect& content_rect,
                              float contents_scale,
                              scoped_refptr<RasterSource> raster_source) {
   ContentDrawQuadBase::SetNew(
-      shared_quad_state,
-      DrawQuad::PICTURE_CONTENT,
-      rect,
-      opaque_rect,
-      visible_rect,
-      tex_coord_rect,
-      texture_size,
-      !PlatformColor::SameComponentOrder(texture_format),
+      shared_quad_state, DrawQuad::PICTURE_CONTENT, rect, opaque_rect,
+      visible_rect, tex_coord_rect, texture_size,
+      !viz::PlatformColor::SameComponentOrder(texture_format),
       nearest_neighbor);
   this->content_rect = content_rect;
   this->contents_scale = contents_scale;
@@ -54,21 +49,15 @@
                              const gfx::RectF& tex_coord_rect,
                              const gfx::Size& texture_size,
                              bool nearest_neighbor,
-                             ResourceFormat texture_format,
+                             viz::ResourceFormat texture_format,
                              const gfx::Rect& content_rect,
                              float contents_scale,
                              scoped_refptr<RasterSource> raster_source) {
-  ContentDrawQuadBase::SetAll(shared_quad_state,
-                              DrawQuad::PICTURE_CONTENT,
-                              rect,
-                              opaque_rect,
-                              visible_rect,
-                              needs_blending,
-                              tex_coord_rect,
-                              texture_size,
-                              !PlatformColor::SameComponentOrder(
-                                  texture_format),
-                              nearest_neighbor);
+  ContentDrawQuadBase::SetAll(
+      shared_quad_state, DrawQuad::PICTURE_CONTENT, rect, opaque_rect,
+      visible_rect, needs_blending, tex_coord_rect, texture_size,
+      !viz::PlatformColor::SameComponentOrder(texture_format),
+      nearest_neighbor);
   this->content_rect = content_rect;
   this->contents_scale = contents_scale;
   this->raster_source = raster_source;
diff --git a/cc/quads/picture_draw_quad.h b/cc/quads/picture_draw_quad.h
index cb9f5a79..eefc9fba 100644
--- a/cc/quads/picture_draw_quad.h
+++ b/cc/quads/picture_draw_quad.h
@@ -32,7 +32,7 @@
               const gfx::RectF& tex_coord_rect,
               const gfx::Size& texture_size,
               bool nearest_neighbor,
-              ResourceFormat texture_format,
+              viz::ResourceFormat texture_format,
               const gfx::Rect& content_rect,
               float contents_scale,
               scoped_refptr<RasterSource> raster_source);
@@ -45,7 +45,7 @@
               const gfx::RectF& tex_coord_rect,
               const gfx::Size& texture_size,
               bool nearest_neighbor,
-              ResourceFormat texture_format,
+              viz::ResourceFormat texture_format,
               const gfx::Rect& content_rect,
               float contents_scale,
               scoped_refptr<RasterSource> raster_source);
@@ -53,7 +53,7 @@
   gfx::Rect content_rect;
   float contents_scale;
   scoped_refptr<RasterSource> raster_source;
-  ResourceFormat texture_format;
+  viz::ResourceFormat texture_format;
 
   static const PictureDrawQuad* MaterialCast(const DrawQuad* quad);
 
diff --git a/cc/raster/bitmap_raster_buffer_provider.cc b/cc/raster/bitmap_raster_buffer_provider.cc
index b69531a..4abc5a7 100644
--- a/cc/raster/bitmap_raster_buffer_provider.cc
+++ b/cc/raster/bitmap_raster_buffer_provider.cc
@@ -16,8 +16,8 @@
 #include "base/trace_event/trace_event_argument.h"
 #include "cc/debug/traced_value.h"
 #include "cc/raster/raster_source.h"
-#include "cc/resources/platform_color.h"
 #include "cc/resources/resource.h"
+#include "components/viz/common/resources/platform_color.h"
 
 namespace cc {
 namespace {
@@ -100,7 +100,7 @@
 
 void BitmapRasterBufferProvider::Flush() {}
 
-ResourceFormat BitmapRasterBufferProvider::GetResourceFormat(
+viz::ResourceFormat BitmapRasterBufferProvider::GetResourceFormat(
     bool must_support_alpha) const {
   return resource_provider_->best_texture_format();
 }
diff --git a/cc/raster/bitmap_raster_buffer_provider.h b/cc/raster/bitmap_raster_buffer_provider.h
index 4f130136..267a079 100644
--- a/cc/raster/bitmap_raster_buffer_provider.h
+++ b/cc/raster/bitmap_raster_buffer_provider.h
@@ -35,7 +35,7 @@
   void ReleaseBufferForRaster(std::unique_ptr<RasterBuffer> buffer) override;
   void OrderingBarrier() override;
   void Flush() override;
-  ResourceFormat GetResourceFormat(bool must_support_alpha) const override;
+  viz::ResourceFormat GetResourceFormat(bool must_support_alpha) const override;
   bool IsResourceSwizzleRequired(bool must_support_alpha) const override;
   bool CanPartialRasterIntoProvidedResource() const override;
   bool IsResourceReadyToDraw(ResourceId id) const override;
diff --git a/cc/raster/gpu_raster_buffer_provider.cc b/cc/raster/gpu_raster_buffer_provider.cc
index 1f2e8802..24947cf 100644
--- a/cc/raster/gpu_raster_buffer_provider.cc
+++ b/cc/raster/gpu_raster_buffer_provider.cc
@@ -120,7 +120,7 @@
     ResourceProvider* resource_provider,
     bool use_distance_field_text,
     int gpu_rasterization_msaa_sample_count,
-    ResourceFormat preferred_tile_format,
+    viz::ResourceFormat preferred_tile_format,
     bool async_worker_context_enabled)
     : compositor_context_provider_(compositor_context_provider),
       worker_context_provider_(worker_context_provider),
@@ -185,7 +185,7 @@
   }
 }
 
-ResourceFormat GpuRasterBufferProvider::GetResourceFormat(
+viz::ResourceFormat GpuRasterBufferProvider::GetResourceFormat(
     bool must_support_alpha) const {
   if (resource_provider_->IsRenderBufferFormatSupported(
           preferred_tile_format_) &&
diff --git a/cc/raster/gpu_raster_buffer_provider.h b/cc/raster/gpu_raster_buffer_provider.h
index d699795..7c194d2 100644
--- a/cc/raster/gpu_raster_buffer_provider.h
+++ b/cc/raster/gpu_raster_buffer_provider.h
@@ -22,7 +22,7 @@
                           ResourceProvider* resource_provider,
                           bool use_distance_field_text,
                           int gpu_rasterization_msaa_sample_count,
-                          ResourceFormat preferred_tile_format,
+                          viz::ResourceFormat preferred_tile_format,
                           bool async_worker_context_enabled);
   ~GpuRasterBufferProvider() override;
 
@@ -34,7 +34,7 @@
   void ReleaseBufferForRaster(std::unique_ptr<RasterBuffer> buffer) override;
   void OrderingBarrier() override;
   void Flush() override;
-  ResourceFormat GetResourceFormat(bool must_support_alpha) const override;
+  viz::ResourceFormat GetResourceFormat(bool must_support_alpha) const override;
   bool IsResourceSwizzleRequired(bool must_support_alpha) const override;
   bool CanPartialRasterIntoProvidedResource() const override;
   bool IsResourceReadyToDraw(ResourceId id) const override;
@@ -93,7 +93,7 @@
   ResourceProvider* const resource_provider_;
   const bool use_distance_field_text_;
   const int msaa_sample_count_;
-  const ResourceFormat preferred_tile_format_;
+  const viz::ResourceFormat preferred_tile_format_;
   const bool async_worker_context_enabled_;
 
   std::set<RasterBufferImpl*> pending_raster_buffers_;
diff --git a/cc/raster/one_copy_raster_buffer_provider.cc b/cc/raster/one_copy_raster_buffer_provider.cc
index f662e6c..2ff956c 100644
--- a/cc/raster/one_copy_raster_buffer_provider.cc
+++ b/cc/raster/one_copy_raster_buffer_provider.cc
@@ -16,10 +16,10 @@
 #include "base/trace_event/trace_event.h"
 #include "cc/base/histograms.h"
 #include "cc/base/math_util.h"
-#include "cc/resources/platform_color.h"
-#include "cc/resources/resource_format.h"
 #include "cc/resources/resource_util.h"
 #include "cc/resources/scoped_resource.h"
+#include "components/viz/common/quads/resource_format.h"
+#include "components/viz/common/resources/platform_color.h"
 #include "gpu/GLES2/gl2extchromium.h"
 #include "gpu/command_buffer/client/context_support.h"
 #include "gpu/command_buffer/client/gles2_interface.h"
@@ -74,7 +74,7 @@
     int max_copy_texture_chromium_size,
     bool use_partial_raster,
     int max_staging_buffer_usage_in_bytes,
-    ResourceFormat preferred_tile_format,
+    viz::ResourceFormat preferred_tile_format,
     bool async_worker_context_enabled)
     : compositor_context_provider_(compositor_context_provider),
       worker_context_provider_(worker_context_provider),
@@ -150,7 +150,7 @@
   }
 }
 
-ResourceFormat OneCopyRasterBufferProvider::GetResourceFormat(
+viz::ResourceFormat OneCopyRasterBufferProvider::GetResourceFormat(
     bool must_support_alpha) const {
   if (resource_provider_->IsTextureFormatSupported(preferred_tile_format_) &&
       (DoesResourceFormatSupportAlpha(preferred_tile_format_) ||
diff --git a/cc/raster/one_copy_raster_buffer_provider.h b/cc/raster/one_copy_raster_buffer_provider.h
index 581bc49..0ed3bf2 100644
--- a/cc/raster/one_copy_raster_buffer_provider.h
+++ b/cc/raster/one_copy_raster_buffer_provider.h
@@ -27,7 +27,7 @@
                               int max_copy_texture_chromium_size,
                               bool use_partial_raster,
                               int max_staging_buffer_usage_in_bytes,
-                              ResourceFormat preferred_tile_format,
+                              viz::ResourceFormat preferred_tile_format,
                               bool async_worker_context_enabled);
   ~OneCopyRasterBufferProvider() override;
 
@@ -39,7 +39,7 @@
   void ReleaseBufferForRaster(std::unique_ptr<RasterBuffer> buffer) override;
   void OrderingBarrier() override;
   void Flush() override;
-  ResourceFormat GetResourceFormat(bool must_support_alpha) const override;
+  viz::ResourceFormat GetResourceFormat(bool must_support_alpha) const override;
   bool IsResourceSwizzleRequired(bool must_support_alpha) const override;
   bool CanPartialRasterIntoProvidedResource() const override;
   bool IsResourceReadyToDraw(ResourceId id) const override;
@@ -123,7 +123,7 @@
   // Context lock must be acquired when accessing this member.
   int bytes_scheduled_since_last_flush_;
 
-  const ResourceFormat preferred_tile_format_;
+  const viz::ResourceFormat preferred_tile_format_;
   StagingBufferPool staging_pool_;
 
   const bool async_worker_context_enabled_;
diff --git a/cc/raster/raster_buffer_provider.cc b/cc/raster/raster_buffer_provider.cc
index f3e2810..fc3ce57e 100644
--- a/cc/raster/raster_buffer_provider.cc
+++ b/cc/raster/raster_buffer_provider.cc
@@ -9,8 +9,8 @@
 #include "base/trace_event/trace_event.h"
 #include "cc/raster/raster_source.h"
 #include "cc/raster/texture_compressor.h"
-#include "cc/resources/platform_color.h"
-#include "cc/resources/resource_format_utils.h"
+#include "components/viz/common/resources/platform_color.h"
+#include "components/viz/common/resources/resource_format_utils.h"
 #include "third_party/skia/include/core/SkCanvas.h"
 #include "third_party/skia/include/core/SkMath.h"
 #include "third_party/skia/include/core/SkSurface.h"
@@ -76,19 +76,19 @@
   CHECK_LE(size, kMaxTotalSize);
 }
 
-bool IsSupportedPlaybackToMemoryFormat(ResourceFormat format) {
+bool IsSupportedPlaybackToMemoryFormat(viz::ResourceFormat format) {
   switch (format) {
-    case RGBA_4444:
-    case RGBA_8888:
-    case BGRA_8888:
-    case ETC1:
+    case viz::RGBA_4444:
+    case viz::RGBA_8888:
+    case viz::BGRA_8888:
+    case viz::ETC1:
       return true;
-    case ALPHA_8:
-    case LUMINANCE_8:
-    case RGB_565:
-    case RED_8:
-    case LUMINANCE_F16:
-    case RGBA_F16:
+    case viz::ALPHA_8:
+    case viz::LUMINANCE_8:
+    case viz::RGB_565:
+    case viz::RED_8:
+    case viz::LUMINANCE_F16:
+    case viz::RGBA_F16:
       return false;
   }
   NOTREACHED();
@@ -100,7 +100,7 @@
 // static
 void RasterBufferProvider::PlaybackToMemory(
     void* memory,
-    ResourceFormat format,
+    viz::ResourceFormat format,
     const gfx::Size& size,
     size_t stride,
     const RasterSource* raster_source,
@@ -130,9 +130,9 @@
   DCHECK_GT(stride, 0u);
 
   switch (format) {
-    case RGBA_8888:
-    case BGRA_8888:
-    case RGBA_F16: {
+    case viz::RGBA_8888:
+    case viz::BGRA_8888:
+    case viz::RGBA_F16: {
       CheckValidRasterInfo(info, memory, stride);
       sk_sp<SkSurface> surface =
           SkSurface::MakeRasterDirect(info, memory, stride, &surface_props);
@@ -142,8 +142,8 @@
                                       transform, playback_settings);
       return;
     }
-    case RGBA_4444:
-    case ETC1: {
+    case viz::RGBA_4444:
+    case viz::ETC1: {
       sk_sp<SkSurface> surface = SkSurface::MakeRaster(info, &surface_props);
       // TODO(reveman): Improve partial raster support by reducing the size of
       // playback rect passed to PlaybackToCanvas. crbug.com/519070
@@ -151,7 +151,7 @@
                                       canvas_bitmap_rect, canvas_bitmap_rect,
                                       transform, playback_settings);
 
-      if (format == ETC1) {
+      if (format == viz::ETC1) {
         TRACE_EVENT0("cc",
                      "RasterBufferProvider::PlaybackToMemory::CompressETC1");
         DCHECK_EQ(size.width() % 4, 0);
@@ -174,11 +174,11 @@
       }
       return;
     }
-    case ALPHA_8:
-    case LUMINANCE_8:
-    case RGB_565:
-    case RED_8:
-    case LUMINANCE_F16:
+    case viz::ALPHA_8:
+    case viz::LUMINANCE_8:
+    case viz::RGB_565:
+    case viz::RED_8:
+    case viz::LUMINANCE_F16:
       NOTREACHED();
       return;
   }
@@ -187,21 +187,21 @@
 }
 
 bool RasterBufferProvider::ResourceFormatRequiresSwizzle(
-    ResourceFormat format) {
+    viz::ResourceFormat format) {
   switch (format) {
-    case RGBA_8888:
-    case BGRA_8888:
-      // Initialize resource using the preferred PlatformColor component
+    case viz::RGBA_8888:
+    case viz::BGRA_8888:
+      // Initialize resource using the preferred viz::PlatformColor component
       // order and swizzle in the shader instead of in software.
-      return !PlatformColor::SameComponentOrder(format);
-    case RGBA_4444:
-    case ETC1:
-    case ALPHA_8:
-    case LUMINANCE_8:
-    case RGB_565:
-    case RED_8:
-    case LUMINANCE_F16:
-    case RGBA_F16:
+      return !viz::PlatformColor::SameComponentOrder(format);
+    case viz::RGBA_4444:
+    case viz::ETC1:
+    case viz::ALPHA_8:
+    case viz::LUMINANCE_8:
+    case viz::RGB_565:
+    case viz::RED_8:
+    case viz::LUMINANCE_F16:
+    case viz::RGBA_F16:
       return false;
   }
   NOTREACHED();
diff --git a/cc/raster/raster_buffer_provider.h b/cc/raster/raster_buffer_provider.h
index 6055ccd..31117c9 100644
--- a/cc/raster/raster_buffer_provider.h
+++ b/cc/raster/raster_buffer_provider.h
@@ -11,8 +11,8 @@
 #include "cc/raster/raster_source.h"
 #include "cc/raster/task_graph_runner.h"
 #include "cc/raster/tile_task.h"
-#include "cc/resources/resource_format.h"
 #include "cc/resources/resource_provider.h"
+#include "components/viz/common/quads/resource_format.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/size.h"
 
@@ -32,7 +32,7 @@
   // already partially complete, and only the subrect needs to be played back.
   static void PlaybackToMemory(
       void* memory,
-      ResourceFormat format,
+      viz::ResourceFormat format,
       const gfx::Size& size,
       size_t stride,
       const RasterSource* raster_source,
@@ -59,7 +59,8 @@
   virtual void Flush() = 0;
 
   // Returns the format to use for the tiles.
-  virtual ResourceFormat GetResourceFormat(bool must_support_alpha) const = 0;
+  virtual viz::ResourceFormat GetResourceFormat(
+      bool must_support_alpha) const = 0;
 
   // Determine if the resource requires swizzling.
   virtual bool IsResourceSwizzleRequired(bool must_support_alpha) const = 0;
@@ -87,7 +88,7 @@
 
  protected:
   // Check if resource format matches output format.
-  static bool ResourceFormatRequiresSwizzle(ResourceFormat format);
+  static bool ResourceFormatRequiresSwizzle(viz::ResourceFormat format);
 };
 
 }  // namespace cc
diff --git a/cc/raster/raster_buffer_provider_perftest.cc b/cc/raster/raster_buffer_provider_perftest.cc
index 4fdb265..7a6fc82 100644
--- a/cc/raster/raster_buffer_provider_perftest.cc
+++ b/cc/raster/raster_buffer_provider_perftest.cc
@@ -18,7 +18,6 @@
 #include "cc/raster/raster_buffer_provider.h"
 #include "cc/raster/synchronous_task_graph_runner.h"
 #include "cc/raster/zero_copy_raster_buffer_provider.h"
-#include "cc/resources/platform_color.h"
 #include "cc/resources/resource_pool.h"
 #include "cc/resources/resource_provider.h"
 #include "cc/resources/scoped_resource.h"
@@ -29,6 +28,7 @@
 #include "cc/test/test_shared_bitmap_manager.h"
 #include "cc/test/test_web_graphics_context_3d.h"
 #include "cc/tiles/tile_task_manager.h"
+#include "components/viz/common/resources/platform_color.h"
 #include "gpu/command_buffer/common/sync_token.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/perf/perf_test.h"
@@ -245,7 +245,7 @@
       auto resource =
           base::MakeUnique<ScopedResource>(resource_provider_.get());
       resource->Allocate(size, ResourceProvider::TEXTURE_HINT_IMMUTABLE,
-                         RGBA_8888, gfx::ColorSpace());
+                         viz::RGBA_8888, gfx::ColorSpace());
 
       // No tile ids are given to support partial updates.
       std::unique_ptr<RasterBuffer> raster_buffer;
@@ -326,7 +326,7 @@
       case RASTER_BUFFER_PROVIDER_TYPE_ZERO_COPY:
         Create3dResourceProvider();
         raster_buffer_provider_ = ZeroCopyRasterBufferProvider::Create(
-            resource_provider_.get(), PlatformColor::BestTextureFormat());
+            resource_provider_.get(), viz::PlatformColor::BestTextureFormat());
         break;
       case RASTER_BUFFER_PROVIDER_TYPE_ONE_COPY:
         Create3dResourceProvider();
@@ -334,15 +334,15 @@
             task_runner_.get(), compositor_context_provider_.get(),
             worker_context_provider_.get(), resource_provider_.get(),
             std::numeric_limits<int>::max(), false,
-            std::numeric_limits<int>::max(), PlatformColor::BestTextureFormat(),
-            false);
+            std::numeric_limits<int>::max(),
+            viz::PlatformColor::BestTextureFormat(), false);
         break;
       case RASTER_BUFFER_PROVIDER_TYPE_GPU:
         Create3dResourceProvider();
         raster_buffer_provider_ = base::MakeUnique<GpuRasterBufferProvider>(
             compositor_context_provider_.get(), worker_context_provider_.get(),
             resource_provider_.get(), false, 0,
-            PlatformColor::BestTextureFormat(), false);
+            viz::PlatformColor::BestTextureFormat(), false);
         break;
       case RASTER_BUFFER_PROVIDER_TYPE_BITMAP:
         CreateSoftwareResourceProvider();
diff --git a/cc/raster/raster_buffer_provider_unittest.cc b/cc/raster/raster_buffer_provider_unittest.cc
index ea4cdff..737016dd 100644
--- a/cc/raster/raster_buffer_provider_unittest.cc
+++ b/cc/raster/raster_buffer_provider_unittest.cc
@@ -25,7 +25,6 @@
 #include "cc/raster/one_copy_raster_buffer_provider.h"
 #include "cc/raster/synchronous_task_graph_runner.h"
 #include "cc/raster/zero_copy_raster_buffer_provider.h"
-#include "cc/resources/platform_color.h"
 #include "cc/resources/resource_pool.h"
 #include "cc/resources/resource_provider.h"
 #include "cc/resources/scoped_resource.h"
@@ -36,6 +35,7 @@
 #include "cc/test/test_shared_bitmap_manager.h"
 #include "cc/test/test_web_graphics_context_3d.h"
 #include "cc/tiles/tile_task_manager.h"
+#include "components/viz/common/resources/platform_color.h"
 #include "gpu/GLES2/gl2extchromium.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/gfx/geometry/axis_transform2d.h"
@@ -162,7 +162,7 @@
       case RASTER_BUFFER_PROVIDER_TYPE_ZERO_COPY:
         Create3dResourceProvider();
         raster_buffer_provider_ = ZeroCopyRasterBufferProvider::Create(
-            resource_provider_.get(), PlatformColor::BestTextureFormat());
+            resource_provider_.get(), viz::PlatformColor::BestTextureFormat());
         break;
       case RASTER_BUFFER_PROVIDER_TYPE_ONE_COPY:
         Create3dResourceProvider();
@@ -170,7 +170,7 @@
             base::ThreadTaskRunnerHandle::Get().get(), context_provider_.get(),
             worker_context_provider_.get(), resource_provider_.get(),
             kMaxBytesPerCopyOperation, false, kMaxStagingBuffers,
-            PlatformColor::BestTextureFormat(), false);
+            viz::PlatformColor::BestTextureFormat(), false);
         break;
       case RASTER_BUFFER_PROVIDER_TYPE_ASYNC_ONE_COPY:
         Create3dResourceProvider();
@@ -178,21 +178,21 @@
             base::ThreadTaskRunnerHandle::Get().get(), context_provider_.get(),
             worker_context_provider_.get(), resource_provider_.get(),
             kMaxBytesPerCopyOperation, false, kMaxStagingBuffers,
-            PlatformColor::BestTextureFormat(), true);
+            viz::PlatformColor::BestTextureFormat(), true);
         break;
       case RASTER_BUFFER_PROVIDER_TYPE_GPU:
         Create3dResourceProvider();
         raster_buffer_provider_ = base::MakeUnique<GpuRasterBufferProvider>(
             context_provider_.get(), worker_context_provider_.get(),
             resource_provider_.get(), false, 0,
-            PlatformColor::BestTextureFormat(), false);
+            viz::PlatformColor::BestTextureFormat(), false);
         break;
       case RASTER_BUFFER_PROVIDER_TYPE_ASYNC_GPU:
         Create3dResourceProvider();
         raster_buffer_provider_ = base::MakeUnique<GpuRasterBufferProvider>(
             context_provider_.get(), worker_context_provider_.get(),
             resource_provider_.get(), false, 0,
-            PlatformColor::BestTextureFormat(), true);
+            viz::PlatformColor::BestTextureFormat(), true);
         break;
       case RASTER_BUFFER_PROVIDER_TYPE_BITMAP:
         CreateSoftwareResourceProvider();
@@ -242,7 +242,7 @@
   void AppendTask(unsigned id, const gfx::Size& size) {
     auto resource = base::MakeUnique<ScopedResource>(resource_provider_.get());
     resource->Allocate(size, ResourceProvider::TEXTURE_HINT_IMMUTABLE,
-                       RGBA_8888, gfx::ColorSpace());
+                       viz::RGBA_8888, gfx::ColorSpace());
 
     // The raster buffer has no tile ids associated with it for partial update,
     // so doesn't need to provide a valid dirty rect.
@@ -261,7 +261,7 @@
 
     auto resource = base::MakeUnique<ScopedResource>(resource_provider_.get());
     resource->Allocate(size, ResourceProvider::TEXTURE_HINT_IMMUTABLE,
-                       RGBA_8888, gfx::ColorSpace());
+                       viz::RGBA_8888, gfx::ColorSpace());
 
     std::unique_ptr<RasterBuffer> raster_buffer =
         raster_buffer_provider_->AcquireBufferForRaster(resource.get(), 0, 0);
diff --git a/cc/raster/raster_source_unittest.cc b/cc/raster/raster_source_unittest.cc
index c75fcb8..d4c87821 100644
--- a/cc/raster/raster_source_unittest.cc
+++ b/cc/raster/raster_source_unittest.cc
@@ -509,7 +509,7 @@
   scoped_refptr<RasterSource> raster_source =
       recording_source->CreateRasterSource(can_use_lcd);
   SoftwareImageDecodeCache controller(
-      ResourceFormat::RGBA_8888,
+      viz::ResourceFormat::RGBA_8888,
       LayerTreeSettings().decoded_image_working_set_budget_bytes);
   raster_source->set_image_decode_cache(&controller);
 
diff --git a/cc/raster/staging_buffer_pool.cc b/cc/raster/staging_buffer_pool.cc
index 450c740..69cd406 100644
--- a/cc/raster/staging_buffer_pool.cc
+++ b/cc/raster/staging_buffer_pool.cc
@@ -61,7 +61,7 @@
 
 }  // namespace
 
-StagingBuffer::StagingBuffer(const gfx::Size& size, ResourceFormat format)
+StagingBuffer::StagingBuffer(const gfx::Size& size, viz::ResourceFormat format)
     : size(size),
       format(format),
       texture_id(0),
@@ -91,7 +91,7 @@
 }
 
 void StagingBuffer::OnMemoryDump(base::trace_event::ProcessMemoryDump* pmd,
-                                 ResourceFormat format,
+                                 viz::ResourceFormat format,
                                  bool in_free_list) const {
   if (!gpu_memory_buffer)
     return;
@@ -215,7 +215,7 @@
 }
 
 void StagingBufferPool::AddStagingBuffer(const StagingBuffer* staging_buffer,
-                                         ResourceFormat format) {
+                                         viz::ResourceFormat format) {
   lock_.AssertAcquired();
 
   DCHECK(buffers_.find(staging_buffer) == buffers_.end());
diff --git a/cc/raster/staging_buffer_pool.h b/cc/raster/staging_buffer_pool.h
index 32edc4f..0591cca 100644
--- a/cc/raster/staging_buffer_pool.h
+++ b/cc/raster/staging_buffer_pool.h
@@ -31,16 +31,16 @@
 class Resource;
 
 struct StagingBuffer {
-  StagingBuffer(const gfx::Size& size, ResourceFormat format);
+  StagingBuffer(const gfx::Size& size, viz::ResourceFormat format);
   ~StagingBuffer();
 
   void DestroyGLResources(gpu::gles2::GLES2Interface* gl);
   void OnMemoryDump(base::trace_event::ProcessMemoryDump* pmd,
-                    ResourceFormat format,
+                    viz::ResourceFormat format,
                     bool is_free) const;
 
   const gfx::Size size;
-  const ResourceFormat format;
+  const viz::ResourceFormat format;
   std::unique_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer;
   base::TimeTicks last_usage;
   unsigned texture_id;
@@ -74,7 +74,7 @@
 
  private:
   void AddStagingBuffer(const StagingBuffer* staging_buffer,
-                        ResourceFormat format);
+                        viz::ResourceFormat format);
   void RemoveStagingBuffer(const StagingBuffer* staging_buffer);
   void MarkStagingBufferAsFree(const StagingBuffer* staging_buffer);
   void MarkStagingBufferAsBusy(const StagingBuffer* staging_buffer);
diff --git a/cc/raster/zero_copy_raster_buffer_provider.cc b/cc/raster/zero_copy_raster_buffer_provider.cc
index 9542fe4a..acb6b52 100644
--- a/cc/raster/zero_copy_raster_buffer_provider.cc
+++ b/cc/raster/zero_copy_raster_buffer_provider.cc
@@ -14,8 +14,8 @@
 #include "base/trace_event/trace_event.h"
 #include "base/trace_event/trace_event_argument.h"
 #include "cc/debug/traced_value.h"
-#include "cc/resources/platform_color.h"
 #include "cc/resources/resource.h"
+#include "components/viz/common/resources/platform_color.h"
 #include "ui/gfx/buffer_format_util.h"
 #include "ui/gfx/gpu_memory_buffer.h"
 
@@ -68,7 +68,7 @@
 // static
 std::unique_ptr<RasterBufferProvider> ZeroCopyRasterBufferProvider::Create(
     ResourceProvider* resource_provider,
-    ResourceFormat preferred_tile_format) {
+    viz::ResourceFormat preferred_tile_format) {
   return base::WrapUnique<RasterBufferProvider>(
       new ZeroCopyRasterBufferProvider(resource_provider,
                                        preferred_tile_format));
@@ -76,7 +76,7 @@
 
 ZeroCopyRasterBufferProvider::ZeroCopyRasterBufferProvider(
     ResourceProvider* resource_provider,
-    ResourceFormat preferred_tile_format)
+    viz::ResourceFormat preferred_tile_format)
     : resource_provider_(resource_provider),
       preferred_tile_format_(preferred_tile_format) {}
 
@@ -102,7 +102,7 @@
 
 void ZeroCopyRasterBufferProvider::Flush() {}
 
-ResourceFormat ZeroCopyRasterBufferProvider::GetResourceFormat(
+viz::ResourceFormat ZeroCopyRasterBufferProvider::GetResourceFormat(
     bool must_support_alpha) const {
   if (resource_provider_->IsTextureFormatSupported(preferred_tile_format_) &&
       (DoesResourceFormatSupportAlpha(preferred_tile_format_) ||
diff --git a/cc/raster/zero_copy_raster_buffer_provider.h b/cc/raster/zero_copy_raster_buffer_provider.h
index 16f2c6bd..db6985d 100644
--- a/cc/raster/zero_copy_raster_buffer_provider.h
+++ b/cc/raster/zero_copy_raster_buffer_provider.h
@@ -27,7 +27,7 @@
 
   static std::unique_ptr<RasterBufferProvider> Create(
       ResourceProvider* resource_provider,
-      ResourceFormat preferred_tile_format);
+      viz::ResourceFormat preferred_tile_format);
 
   // Overridden from RasterBufferProvider:
   std::unique_ptr<RasterBuffer> AcquireBufferForRaster(
@@ -37,7 +37,7 @@
   void ReleaseBufferForRaster(std::unique_ptr<RasterBuffer> buffer) override;
   void OrderingBarrier() override;
   void Flush() override;
-  ResourceFormat GetResourceFormat(bool must_support_alpha) const override;
+  viz::ResourceFormat GetResourceFormat(bool must_support_alpha) const override;
   bool IsResourceSwizzleRequired(bool must_support_alpha) const override;
   bool CanPartialRasterIntoProvidedResource() const override;
   bool IsResourceReadyToDraw(ResourceId id) const override;
@@ -49,14 +49,14 @@
 
  protected:
   ZeroCopyRasterBufferProvider(ResourceProvider* resource_provider,
-                               ResourceFormat preferred_tile_format);
+                               viz::ResourceFormat preferred_tile_format);
 
  private:
   std::unique_ptr<base::trace_event::ConvertableToTraceFormat> StateAsValue()
       const;
 
   ResourceProvider* resource_provider_;
-  ResourceFormat preferred_tile_format_;
+  viz::ResourceFormat preferred_tile_format_;
 
   DISALLOW_COPY_AND_ASSIGN(ZeroCopyRasterBufferProvider);
 };
diff --git a/cc/resources/resource.h b/cc/resources/resource.h
index 4dd483e..edae0cc 100644
--- a/cc/resources/resource.h
+++ b/cc/resources/resource.h
@@ -16,21 +16,21 @@
 
 class CC_EXPORT Resource {
  public:
-  Resource() : id_(0), format_(RGBA_8888) {}
+  Resource() : id_(0), format_(viz::RGBA_8888) {}
   Resource(unsigned id,
            const gfx::Size& size,
-           ResourceFormat format,
+           viz::ResourceFormat format,
            const gfx::ColorSpace& color_space)
       : id_(id), size_(size), format_(format), color_space_(color_space) {}
 
   ResourceId id() const { return id_; }
   const gfx::Size& size() const { return size_; }
-  ResourceFormat format() const { return format_; }
+  viz::ResourceFormat format() const { return format_; }
   const gfx::ColorSpace& color_space() const { return color_space_; }
 
  protected:
   void set_id(ResourceId id) { id_ = id; }
-  void set_dimensions(const gfx::Size& size, ResourceFormat format) {
+  void set_dimensions(const gfx::Size& size, viz::ResourceFormat format) {
     size_ = size;
     format_ = format;
   }
@@ -41,7 +41,7 @@
  private:
   ResourceId id_;
   gfx::Size size_;
-  ResourceFormat format_;
+  viz::ResourceFormat format_;
   gfx::ColorSpace color_space_;
 
   DISALLOW_COPY_AND_ASSIGN(Resource);
diff --git a/cc/resources/resource_format.h b/cc/resources/resource_format.h
deleted file mode 100644
index 125a4ebf..0000000
--- a/cc/resources/resource_format.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2013 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 CC_RESOURCES_RESOURCE_FORMAT_H_
-#define CC_RESOURCES_RESOURCE_FORMAT_H_
-
-#include "base/logging.h"
-#include "cc/cc_export.h"
-#include "ui/gfx/buffer_types.h"
-
-// TODO(prashant.n): Including third_party/khronos/GLES2/gl2.h causes
-// redefinition errors as macros/functions defined in it conflict with
-// macros/functions defined in ui/gl/gl_bindings.h. (http://crbug.com/512833).
-typedef unsigned int GLenum;
-
-namespace cc {
-
-// Keep in sync with arrays below.
-enum ResourceFormat {
-  RGBA_8888,
-  RGBA_4444,
-  BGRA_8888,
-  ALPHA_8,
-  LUMINANCE_8,
-  RGB_565,
-  ETC1,
-  RED_8,
-  LUMINANCE_F16,
-  RGBA_F16,
-  RESOURCE_FORMAT_MAX = RGBA_F16,
-};
-
-CC_EXPORT int BitsPerPixel(ResourceFormat format);
-CC_EXPORT GLenum GLDataType(ResourceFormat format);
-CC_EXPORT GLenum GLDataFormat(ResourceFormat format);
-CC_EXPORT GLenum GLInternalFormat(ResourceFormat format);
-CC_EXPORT GLenum GLCopyTextureInternalFormat(ResourceFormat format);
-CC_EXPORT gfx::BufferFormat BufferFormat(ResourceFormat format);
-
-bool IsResourceFormatCompressed(ResourceFormat format);
-bool DoesResourceFormatSupportAlpha(ResourceFormat format);
-
-}  // namespace cc
-
-#endif  // CC_RESOURCES_RESOURCE_FORMAT_H_
diff --git a/cc/resources/resource_format_utils.cc b/cc/resources/resource_format_utils.cc
deleted file mode 100644
index 8118160..0000000
--- a/cc/resources/resource_format_utils.cc
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cc/resources/resource_format_utils.h"
-
-namespace cc {
-
-SkColorType ResourceFormatToClosestSkColorType(ResourceFormat format) {
-  // Use kN32_SkColorType if there is no corresponding SkColorType.
-  switch (format) {
-    case RGBA_4444:
-      return kARGB_4444_SkColorType;
-    case RGBA_8888:
-    case BGRA_8888:
-      return kN32_SkColorType;
-    case ALPHA_8:
-      return kAlpha_8_SkColorType;
-    case RGB_565:
-      return kRGB_565_SkColorType;
-    case LUMINANCE_8:
-      return kGray_8_SkColorType;
-    case ETC1:
-    case RED_8:
-    case LUMINANCE_F16:
-      return kN32_SkColorType;
-    case RGBA_F16:
-      return kRGBA_F16_SkColorType;
-  }
-  NOTREACHED();
-  return kN32_SkColorType;
-}
-
-}  // namespace cc
diff --git a/cc/resources/resource_format_utils.h b/cc/resources/resource_format_utils.h
deleted file mode 100644
index 200c33c9b..0000000
--- a/cc/resources/resource_format_utils.h
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CC_RESOURCES_RESOURCE_FORMAT_UTILS_H_
-#define CC_RESOURCES_RESOURCE_FORMAT_UTILS_H_
-
-#include "cc/resources/resource_format.h"
-#include "third_party/skia/include/core/SkImageInfo.h"
-
-namespace cc {
-
-SkColorType ResourceFormatToClosestSkColorType(ResourceFormat format);
-
-}  // namespace cc
-
-#endif  // CC_RESOURCES_RESOURCE_FORMAT_UTILS_H_
diff --git a/cc/resources/resource_pool.cc b/cc/resources/resource_pool.cc
index 5ad2f6a5..440af64 100644
--- a/cc/resources/resource_pool.cc
+++ b/cc/resources/resource_pool.cc
@@ -142,7 +142,7 @@
 }
 
 Resource* ResourcePool::ReuseResource(const gfx::Size& size,
-                                      ResourceFormat format,
+                                      viz::ResourceFormat format,
                                       const gfx::ColorSpace& color_space) {
   // Finding resources in |unused_resources_| from MRU to LRU direction, touches
   // LRU resources only if needed, which increases possibility of expiring more
@@ -171,7 +171,7 @@
 }
 
 Resource* ResourcePool::CreateResource(const gfx::Size& size,
-                                       ResourceFormat format,
+                                       viz::ResourceFormat format,
                                        const gfx::ColorSpace& color_space) {
   std::unique_ptr<PoolResource> pool_resource =
       PoolResource::Create(resource_provider_);
@@ -203,7 +203,7 @@
 }
 
 Resource* ResourcePool::AcquireResource(const gfx::Size& size,
-                                        ResourceFormat format,
+                                        viz::ResourceFormat format,
                                         const gfx::ColorSpace& color_space) {
   Resource* reused_resource = ReuseResource(size, format, color_space);
   if (reused_resource)
diff --git a/cc/resources/resource_pool.h b/cc/resources/resource_pool.h
index 33291874..f1de3eb 100644
--- a/cc/resources/resource_pool.h
+++ b/cc/resources/resource_pool.h
@@ -18,8 +18,8 @@
 #include "base/trace_event/memory_dump_provider.h"
 #include "cc/cc_export.h"
 #include "cc/resources/resource.h"
-#include "cc/resources/resource_format.h"
 #include "cc/resources/scoped_resource.h"
+#include "components/viz/common/quads/resource_format.h"
 
 namespace cc {
 
@@ -55,7 +55,7 @@
 
   // Tries to reuse a resource. If none are available, makes a new one.
   Resource* AcquireResource(const gfx::Size& size,
-                            ResourceFormat format,
+                            viz::ResourceFormat format,
                             const gfx::ColorSpace& color_space);
 
   // Tries to acquire the resource with |previous_content_id| for us in partial
@@ -150,12 +150,12 @@
 
   // Tries to reuse a resource. Returns |nullptr| if none are available.
   Resource* ReuseResource(const gfx::Size& size,
-                          ResourceFormat format,
+                          viz::ResourceFormat format,
                           const gfx::ColorSpace& color_space);
 
   // Creates a new resource without trying to reuse an old one.
   Resource* CreateResource(const gfx::Size& size,
-                           ResourceFormat format,
+                           viz::ResourceFormat format,
                            const gfx::ColorSpace& color_space);
 
   void DidFinishUsingResource(std::unique_ptr<PoolResource> resource);
diff --git a/cc/resources/resource_pool_unittest.cc b/cc/resources/resource_pool_unittest.cc
index 34f7aca..a25ab1f 100644
--- a/cc/resources/resource_pool_unittest.cc
+++ b/cc/resources/resource_pool_unittest.cc
@@ -49,7 +49,7 @@
 
 TEST_F(ResourcePoolTest, AcquireRelease) {
   gfx::Size size(100, 100);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB();
   Resource* resource =
       resource_pool_->AcquireResource(size, format, color_space);
@@ -67,7 +67,7 @@
   resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit);
 
   gfx::Size size(100, 100);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB();
   size_t resource_bytes =
       ResourceUtil::UncheckedSizeInBytes<size_t>(size, format);
@@ -108,7 +108,7 @@
   resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit);
 
   gfx::Size size(100, 100);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   gfx::ColorSpace color_space1;
   gfx::ColorSpace color_space2 = gfx::ColorSpace::CreateSRGB();
 
@@ -124,8 +124,8 @@
   EXPECT_EQ(1u, resource_provider_->num_resources());
 
   // Different size/format should allocate new resource.
-  resource = resource_pool_->AcquireResource(gfx::Size(50, 50), LUMINANCE_8,
-                                             color_space1);
+  resource = resource_pool_->AcquireResource(gfx::Size(50, 50),
+                                             viz::LUMINANCE_8, color_space1);
   EXPECT_EQ(2u, resource_provider_->num_resources());
   CheckAndReturnResource(resource);
   EXPECT_EQ(2u, resource_provider_->num_resources());
@@ -144,7 +144,7 @@
   resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit);
 
   gfx::Size size(100, 100);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB();
 
   Resource* resource =
@@ -171,7 +171,7 @@
   resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit);
 
   gfx::Size size(100, 100);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   gfx::ColorSpace color_space;
 
   Resource* resource =
@@ -212,7 +212,7 @@
   resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit);
 
   gfx::Size size(100, 100);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   gfx::ColorSpace color_space;
 
   Resource* resource =
@@ -249,7 +249,7 @@
 
 TEST_F(ResourcePoolTest, UpdateContentId) {
   gfx::Size size(100, 100);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   gfx::ColorSpace color_space;
   uint64_t content_id = 42;
   uint64_t new_content_id = 43;
@@ -273,7 +273,7 @@
 
 TEST_F(ResourcePoolTest, UpdateContentIdAndInvalidatedRect) {
   gfx::Size size(100, 100);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   gfx::ColorSpace color_space;
   uint64_t content_ids[] = {42, 43, 44};
   gfx::Rect invalidated_rect(20, 20, 10, 10);
@@ -317,7 +317,7 @@
 }
 
 TEST_F(ResourcePoolTest, ReuseResource) {
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB();
 
   // Create unused resource with size 100x100.
@@ -370,7 +370,7 @@
   resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit);
 
   gfx::Size size(100, 100);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB();
   Resource* resource =
       resource_pool_->AcquireResource(size, format, color_space);
@@ -399,7 +399,7 @@
 
 TEST_F(ResourcePoolTest, TextureHintRespected) {
   gfx::Size size(100, 100);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   gfx::ColorSpace color_space;
 
   resource_pool_ =
@@ -421,7 +421,7 @@
 }
 
 TEST_F(ResourcePoolTest, ExactRequestsRespected) {
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB();
 
   resource_pool_ =
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc
index 26975dab..d4feafe 100644
--- a/cc/resources/resource_provider.cc
+++ b/cc/resources/resource_provider.cc
@@ -22,11 +22,11 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/memory_dump_manager.h"
 #include "base/trace_event/trace_event.h"
-#include "cc/resources/platform_color.h"
 #include "cc/resources/resource_util.h"
 #include "cc/resources/returned_resource.h"
 #include "cc/resources/shared_bitmap_manager.h"
 #include "cc/resources/transferable_resource.h"
+#include "components/viz/common/resources/platform_color.h"
 #include "gpu/GLES2/gl2extchromium.h"
 #include "gpu/command_buffer/client/context_support.h"
 #include "gpu/command_buffer/client/gles2_interface.h"
@@ -90,24 +90,24 @@
   return type != ResourceProvider::RESOURCE_TYPE_BITMAP;
 }
 
-GLenum TextureToStorageFormat(ResourceFormat format) {
+GLenum TextureToStorageFormat(viz::ResourceFormat format) {
   GLenum storage_format = GL_RGBA8_OES;
   switch (format) {
-    case RGBA_8888:
+    case viz::RGBA_8888:
       break;
-    case BGRA_8888:
+    case viz::BGRA_8888:
       storage_format = GL_BGRA8_EXT;
       break;
-    case RGBA_F16:
+    case viz::RGBA_F16:
       storage_format = GL_RGBA16F_EXT;
       break;
-    case RGBA_4444:
-    case ALPHA_8:
-    case LUMINANCE_8:
-    case RGB_565:
-    case ETC1:
-    case RED_8:
-    case LUMINANCE_F16:
+    case viz::RGBA_4444:
+    case viz::ALPHA_8:
+    case viz::LUMINANCE_8:
+    case viz::RGB_565:
+    case viz::ETC1:
+    case viz::RED_8:
+    case viz::LUMINANCE_F16:
       NOTREACHED();
       break;
   }
@@ -115,34 +115,34 @@
   return storage_format;
 }
 
-bool IsFormatSupportedForStorage(ResourceFormat format, bool use_bgra) {
+bool IsFormatSupportedForStorage(viz::ResourceFormat format, bool use_bgra) {
   switch (format) {
-    case RGBA_8888:
-    case RGBA_F16:
+    case viz::RGBA_8888:
+    case viz::RGBA_F16:
       return true;
-    case BGRA_8888:
+    case viz::BGRA_8888:
       return use_bgra;
-    case RGBA_4444:
-    case ALPHA_8:
-    case LUMINANCE_8:
-    case RGB_565:
-    case ETC1:
-    case RED_8:
-    case LUMINANCE_F16:
+    case viz::RGBA_4444:
+    case viz::ALPHA_8:
+    case viz::LUMINANCE_8:
+    case viz::RGB_565:
+    case viz::ETC1:
+    case viz::RED_8:
+    case viz::LUMINANCE_F16:
       return false;
   }
   return false;
 }
 
-GrPixelConfig ToGrPixelConfig(ResourceFormat format) {
+GrPixelConfig ToGrPixelConfig(viz::ResourceFormat format) {
   switch (format) {
-    case RGBA_8888:
+    case viz::RGBA_8888:
       return kRGBA_8888_GrPixelConfig;
-    case BGRA_8888:
+    case viz::BGRA_8888:
       return kBGRA_8888_GrPixelConfig;
-    case RGBA_4444:
+    case viz::RGBA_4444:
       return kRGBA_4444_GrPixelConfig;
-    case RGBA_F16:
+    case viz::RGBA_F16:
       return kRGBA_half_GrPixelConfig;
     default:
       break;
@@ -187,7 +187,7 @@
                                      GLenum filter,
                                      TextureHint hint,
                                      ResourceType type,
-                                     ResourceFormat format)
+                                     viz::ResourceFormat format)
     : child_id(0),
       gl_id(texture_id),
       gl_pixel_buffer_id(0),
@@ -262,7 +262,7 @@
       hint(TEXTURE_HINT_IMMUTABLE),
       type(RESOURCE_TYPE_BITMAP),
       buffer_format(gfx::BufferFormat::RGBA_8888),
-      format(RGBA_8888),
+      format(viz::RGBA_8888),
       shared_bitmap(bitmap) {
   DCHECK(origin == DELEGATED || pixels);
   if (bitmap)
@@ -305,7 +305,7 @@
       hint(TEXTURE_HINT_IMMUTABLE),
       type(RESOURCE_TYPE_BITMAP),
       buffer_format(gfx::BufferFormat::RGBA_8888),
-      format(RGBA_8888),
+      format(viz::RGBA_8888),
       shared_bitmap_id(bitmap_id),
       shared_bitmap(nullptr) {
 }
@@ -379,7 +379,7 @@
     default_resource_type = RESOURCE_TYPE_BITMAP;
     // Pick an arbitrary limit here similar to what hardware might.
     max_texture_size = 16 * 1024;
-    best_texture_format = RGBA_8888;
+    best_texture_format = viz::RGBA_8888;
     return;
   }
 
@@ -392,19 +392,20 @@
   use_sync_query = caps.sync_query;
 
   if (caps.disable_one_component_textures) {
-    yuv_resource_format = yuv_highbit_resource_format = RGBA_8888;
+    yuv_resource_format = yuv_highbit_resource_format = viz::RGBA_8888;
   } else {
-    yuv_resource_format = caps.texture_rg ? RED_8 : LUMINANCE_8;
-    yuv_highbit_resource_format =
-        caps.texture_half_float_linear ? LUMINANCE_F16 : yuv_resource_format;
+    yuv_resource_format = caps.texture_rg ? viz::RED_8 : viz::LUMINANCE_8;
+    yuv_highbit_resource_format = caps.texture_half_float_linear
+                                      ? viz::LUMINANCE_F16
+                                      : yuv_resource_format;
   }
 
   GLES2Interface* gl = compositor_context_provider->ContextGL();
   gl->GetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size);
 
   best_texture_format =
-      PlatformColor::BestSupportedTextureFormat(use_texture_format_bgra);
-  best_render_buffer_format = PlatformColor::BestSupportedTextureFormat(
+      viz::PlatformColor::BestSupportedTextureFormat(use_texture_format_bgra);
+  best_render_buffer_format = viz::PlatformColor::BestSupportedTextureFormat(
       caps.render_buffer_format_bgra8888);
 }
 
@@ -479,26 +480,27 @@
   gl->Finish();
 }
 
-bool ResourceProvider::IsTextureFormatSupported(ResourceFormat format) const {
+bool ResourceProvider::IsTextureFormatSupported(
+    viz::ResourceFormat format) const {
   gpu::Capabilities caps;
   if (compositor_context_provider_)
     caps = compositor_context_provider_->ContextCapabilities();
 
   switch (format) {
-    case ALPHA_8:
-    case RGBA_4444:
-    case RGBA_8888:
-    case RGB_565:
-    case LUMINANCE_8:
+    case viz::ALPHA_8:
+    case viz::RGBA_4444:
+    case viz::RGBA_8888:
+    case viz::RGB_565:
+    case viz::LUMINANCE_8:
       return true;
-    case BGRA_8888:
+    case viz::BGRA_8888:
       return caps.texture_format_bgra8888;
-    case ETC1:
+    case viz::ETC1:
       return caps.texture_format_etc1;
-    case RED_8:
+    case viz::RED_8:
       return caps.texture_rg;
-    case LUMINANCE_F16:
-    case RGBA_F16:
+    case viz::LUMINANCE_F16:
+    case viz::RGBA_F16:
       return caps.texture_half_float_linear;
   }
 
@@ -507,29 +509,29 @@
 }
 
 bool ResourceProvider::IsRenderBufferFormatSupported(
-    ResourceFormat format) const {
+    viz::ResourceFormat format) const {
   gpu::Capabilities caps;
   if (compositor_context_provider_)
     caps = compositor_context_provider_->ContextCapabilities();
 
   switch (format) {
-    case RGBA_4444:
-    case RGBA_8888:
-    case RGB_565:
+    case viz::RGBA_4444:
+    case viz::RGBA_8888:
+    case viz::RGB_565:
       return true;
-    case BGRA_8888:
+    case viz::BGRA_8888:
       return caps.render_buffer_format_bgra8888;
-    case RGBA_F16:
+    case viz::RGBA_F16:
       // TODO(ccameron): This will always return false on pixel tests, which
       // makes it un-test-able until we upgrade Mesa.
       // https://crbug.com/687720
       return caps.texture_half_float_linear &&
              caps.color_buffer_half_float_rgba;
-    case LUMINANCE_8:
-    case ALPHA_8:
-    case RED_8:
-    case ETC1:
-    case LUMINANCE_F16:
+    case viz::LUMINANCE_8:
+    case viz::ALPHA_8:
+    case viz::RED_8:
+    case viz::ETC1:
+    case viz::LUMINANCE_F16:
       // We don't currently render into these formats. If we need to render into
       // these eventually, we should expand this logic.
       return false;
@@ -556,7 +558,7 @@
   resource->lost = true;
 }
 
-ResourceFormat ResourceProvider::YuvResourceFormat(int bits) const {
+viz::ResourceFormat ResourceProvider::YuvResourceFormat(int bits) const {
   if (bits > 8) {
     return settings_.yuv_highbit_resource_format;
   } else {
@@ -567,13 +569,13 @@
 ResourceId ResourceProvider::CreateResource(
     const gfx::Size& size,
     TextureHint hint,
-    ResourceFormat format,
+    viz::ResourceFormat format,
     const gfx::ColorSpace& color_space) {
   DCHECK(!size.IsEmpty());
   switch (settings_.default_resource_type) {
     case RESOURCE_TYPE_GPU_MEMORY_BUFFER:
-      // GPU memory buffers don't support LUMINANCE_F16 yet.
-      if (format != LUMINANCE_F16) {
+      // GPU memory buffers don't support viz::LUMINANCE_F16 yet.
+      if (format != viz::LUMINANCE_F16) {
         return CreateGLTexture(
             size, hint, RESOURCE_TYPE_GPU_MEMORY_BUFFER, format,
             gfx::BufferUsage::GPU_READ_CPU_READ_WRITE, color_space);
@@ -585,7 +587,7 @@
                              color_space);
 
     case RESOURCE_TYPE_BITMAP:
-      DCHECK_EQ(RGBA_8888, format);
+      DCHECK_EQ(viz::RGBA_8888, format);
       return CreateBitmap(size, color_space);
   }
 
@@ -596,7 +598,7 @@
 ResourceId ResourceProvider::CreateGpuMemoryBufferResource(
     const gfx::Size& size,
     TextureHint hint,
-    ResourceFormat format,
+    viz::ResourceFormat format,
     gfx::BufferUsage usage,
     const gfx::ColorSpace& color_space) {
   DCHECK(!size.IsEmpty());
@@ -607,7 +609,7 @@
                              format, usage, color_space);
     }
     case RESOURCE_TYPE_BITMAP:
-      DCHECK_EQ(RGBA_8888, format);
+      DCHECK_EQ(viz::RGBA_8888, format);
       return CreateBitmap(size, color_space);
   }
 
@@ -619,7 +621,7 @@
     const gfx::Size& size,
     TextureHint hint,
     ResourceType type,
-    ResourceFormat format,
+    viz::ResourceFormat format,
     gfx::BufferUsage usage,
     const gfx::ColorSpace& color_space) {
   DCHECK_LE(size.width(), settings_.max_texture_size);
@@ -672,11 +674,11 @@
   Resource* resource = nullptr;
   if (mailbox.IsTexture()) {
     resource = InsertResource(
-        id,
-        Resource(0, mailbox.size_in_pixels(), Resource::EXTERNAL,
-                 mailbox.target(),
-                 mailbox.nearest_neighbor() ? GL_NEAREST : GL_LINEAR,
-                 TEXTURE_HINT_IMMUTABLE, RESOURCE_TYPE_GL_TEXTURE, RGBA_8888));
+        id, Resource(0, mailbox.size_in_pixels(), Resource::EXTERNAL,
+                     mailbox.target(),
+                     mailbox.nearest_neighbor() ? GL_NEAREST : GL_LINEAR,
+                     TEXTURE_HINT_IMMUTABLE, RESOURCE_TYPE_GL_TEXTURE,
+                     viz::RGBA_8888));
   } else {
     DCHECK(mailbox.IsSharedMemory());
     SharedBitmap* shared_bitmap = mailbox.shared_bitmap();
@@ -889,7 +891,7 @@
   if (resource->type == RESOURCE_TYPE_BITMAP) {
     DCHECK_EQ(RESOURCE_TYPE_BITMAP, resource->type);
     DCHECK(resource->allocated);
-    DCHECK_EQ(RGBA_8888, resource->format);
+    DCHECK_EQ(viz::RGBA_8888, resource->format);
     SkImageInfo source_info =
         SkImageInfo::MakeN32Premul(image_size.width(), image_size.height());
     size_t image_stride = image_size.width() * 4;
@@ -906,10 +908,11 @@
     GLES2Interface* gl = ContextGL();
     DCHECK(gl);
     gl->BindTexture(resource->target, resource_texture_id);
-    if (resource->format == ETC1) {
+    if (resource->format == viz::ETC1) {
       DCHECK_EQ(resource->target, static_cast<GLenum>(GL_TEXTURE_2D));
-      int image_bytes = ResourceUtil::CheckedSizeInBytes<int>(image_size, ETC1);
-      gl->CompressedTexImage2D(resource->target, 0, GLInternalFormat(ETC1),
+      int image_bytes =
+          ResourceUtil::CheckedSizeInBytes<int>(image_size, viz::ETC1);
+      gl->CompressedTexImage2D(resource->target, 0, GLInternalFormat(viz::ETC1),
                                image_size.width(), image_size.height(), 0,
                                image_bytes, image);
     } else {
@@ -1208,7 +1211,7 @@
 
 void ResourceProvider::PopulateSkBitmapWithResource(SkBitmap* sk_bitmap,
                                                     const Resource* resource) {
-  DCHECK_EQ(RGBA_8888, resource->format);
+  DCHECK_EQ(viz::RGBA_8888, resource->format);
   SkImageInfo info = SkImageInfo::MakeN32Premul(resource->size.width(),
                                                 resource->size.height());
   sk_bitmap->installPixels(info, resource->pixels, info.minRowBytes());
@@ -1932,7 +1935,7 @@
   resource->allocated = true;
   GLES2Interface* gl = ContextGL();
   gfx::Size& size = resource->size;
-  ResourceFormat format = resource->format;
+  viz::ResourceFormat format = resource->format;
   gl->BindTexture(resource->target, resource->gl_id);
   if (resource->type == RESOURCE_TYPE_GPU_MEMORY_BUFFER) {
     resource->gpu_memory_buffer =
@@ -1961,8 +1964,8 @@
     gl->TexStorage2DEXT(resource->target, 1, storage_format, size.width(),
                         size.height());
   } else {
-    // ETC1 does not support preallocation.
-    if (format != ETC1) {
+    // viz::ETC1 does not support preallocation.
+    if (format != viz::ETC1) {
       gl->TexImage2D(resource->target, 0, GLInternalFormat(format),
                      size.width(), size.height(), 0, GLDataFormat(format),
                      GLDataType(format), nullptr);
@@ -2033,7 +2036,7 @@
 }
 
 GLenum ResourceProvider::GetImageTextureTarget(gfx::BufferUsage usage,
-                                               ResourceFormat format) {
+                                               viz::ResourceFormat format) {
   gfx::BufferFormat buffer_format = BufferFormat(format);
   auto found = buffer_to_texture_target_map_.find(
       BufferToTextureTargetKey(usage, buffer_format));
diff --git a/cc/resources/resource_provider.h b/cc/resources/resource_provider.h
index 6f9a5038..49b27250 100644
--- a/cc/resources/resource_provider.h
+++ b/cc/resources/resource_provider.h
@@ -30,13 +30,13 @@
 #include "cc/output/output_surface.h"
 #include "cc/output/renderer_settings.h"
 #include "cc/resources/release_callback_impl.h"
-#include "cc/resources/resource_format.h"
 #include "cc/resources/resource_settings.h"
 #include "cc/resources/return_callback.h"
 #include "cc/resources/shared_bitmap.h"
 #include "cc/resources/single_release_callback_impl.h"
 #include "cc/resources/texture_mailbox.h"
 #include "cc/resources/transferable_resource.h"
+#include "components/viz/common/quads/resource_format.h"
 #include "third_party/khronos/GLES2/gl2.h"
 #include "third_party/khronos/GLES2/gl2ext.h"
 #include "third_party/skia/include/core/SkBitmap.h"
@@ -95,24 +95,24 @@
   void DidLoseContextProvider() { lost_context_provider_ = true; }
 
   int max_texture_size() const { return settings_.max_texture_size; }
-  ResourceFormat best_texture_format() const {
+  viz::ResourceFormat best_texture_format() const {
     return settings_.best_texture_format;
   }
-  ResourceFormat best_render_buffer_format() const {
+  viz::ResourceFormat best_render_buffer_format() const {
     return settings_.best_render_buffer_format;
   }
-  ResourceFormat YuvResourceFormat(int bits) const;
+  viz::ResourceFormat YuvResourceFormat(int bits) const;
   bool use_sync_query() const { return settings_.use_sync_query; }
   gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager() {
     return gpu_memory_buffer_manager_;
   }
   size_t num_resources() const { return resources_.size(); }
 
-  bool IsTextureFormatSupported(ResourceFormat format) const;
+  bool IsTextureFormatSupported(viz::ResourceFormat format) const;
 
   // Returns true if the provided |format| can be used as a render buffer.
   // Note that render buffer support implies texture support.
-  bool IsRenderBufferFormatSupported(ResourceFormat format) const;
+  bool IsRenderBufferFormatSupported(viz::ResourceFormat format) const;
 
   // Checks whether a resource is in use by a consumer.
   bool InUseByConsumer(ResourceId id);
@@ -135,14 +135,14 @@
   // Creates a resource of the default resource type.
   ResourceId CreateResource(const gfx::Size& size,
                             TextureHint hint,
-                            ResourceFormat format,
+                            viz::ResourceFormat format,
                             const gfx::ColorSpace& color_space);
 
   // Creates a resource for a particular texture target (the distinction between
   // texture targets has no effect in software mode).
   ResourceId CreateGpuMemoryBufferResource(const gfx::Size& size,
                                            TextureHint hint,
-                                           ResourceFormat format,
+                                           viz::ResourceFormat format,
                                            gfx::BufferUsage usage,
                                            const gfx::ColorSpace& color_space);
 
@@ -287,7 +287,7 @@
 
     unsigned texture_id() const { return texture_id_; }
     GLenum target() const { return target_; }
-    ResourceFormat format() const { return format_; }
+    viz::ResourceFormat format() const { return format_; }
     const gfx::Size& size() const { return size_; }
     // Will return the invalid color space unless
     // |enable_color_correct_rasterization| is true.
@@ -309,7 +309,7 @@
     ResourceId resource_id_;
     unsigned texture_id_;
     GLenum target_;
-    ResourceFormat format_;
+    viz::ResourceFormat format_;
     gfx::Size size_;
     TextureMailbox mailbox_;
     gpu::SyncToken sync_token_;
@@ -435,7 +435,7 @@
    private:
     ResourceProvider* resource_provider_;
     ResourceId resource_id_;
-    ResourceFormat format_;
+    viz::ResourceFormat format_;
     gfx::BufferUsage usage_;
     gfx::Size size_;
     std::unique_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer_;
@@ -536,7 +536,8 @@
 
   void ValidateResource(ResourceId id) const;
 
-  GLenum GetImageTextureTarget(gfx::BufferUsage usage, ResourceFormat format);
+  GLenum GetImageTextureTarget(gfx::BufferUsage usage,
+                               viz::ResourceFormat format);
 
   // base::trace_event::MemoryDumpProvider implementation.
   bool OnMemoryDump(const base::trace_event::MemoryDumpArgs& args,
@@ -587,7 +588,7 @@
              GLenum filter,
              TextureHint hint,
              ResourceType type,
-             ResourceFormat format);
+             viz::ResourceFormat format);
     Resource(uint8_t* pixels,
              SharedBitmap* bitmap,
              const gfx::Size& size,
@@ -669,13 +670,13 @@
     // be used.
     gfx::BufferUsage usage;
     // This is the the actual format of the underlaying GpuMemoryBuffer, if any,
-    // and might not correspond to ResourceFormat. This format is needed to
+    // and might not correspond to viz::ResourceFormat. This format is needed to
     // scanout the buffer as HW overlay.
     gfx::BufferFormat buffer_format;
     // Resource format is the format as seen from the compositor and might not
     // correspond to buffer_format (e.g: A resouce that was created from a YUV
     // buffer could be seen as RGB from the compositor/GL.)
-    ResourceFormat format;
+    viz::ResourceFormat format;
     SharedBitmapId shared_bitmap_id;
     SharedBitmap* shared_bitmap;
     std::unique_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer;
@@ -709,7 +710,7 @@
   ResourceId CreateGLTexture(const gfx::Size& size,
                              TextureHint hint,
                              ResourceType type,
-                             ResourceFormat format,
+                             viz::ResourceFormat format,
                              gfx::BufferUsage usage,
                              const gfx::ColorSpace& color_space);
   ResourceId CreateBitmap(const gfx::Size& size,
@@ -773,10 +774,10 @@
     bool use_texture_usage_hint = false;
     bool use_sync_query = false;
     ResourceType default_resource_type = RESOURCE_TYPE_GL_TEXTURE;
-    ResourceFormat yuv_resource_format = LUMINANCE_8;
-    ResourceFormat yuv_highbit_resource_format = LUMINANCE_8;
-    ResourceFormat best_texture_format = RGBA_8888;
-    ResourceFormat best_render_buffer_format = RGBA_8888;
+    viz::ResourceFormat yuv_resource_format = viz::LUMINANCE_8;
+    viz::ResourceFormat yuv_highbit_resource_format = viz::LUMINANCE_8;
+    viz::ResourceFormat best_texture_format = viz::RGBA_8888;
+    viz::ResourceFormat best_render_buffer_format = viz::RGBA_8888;
     bool enable_color_correct_rasterization = false;
     bool delegated_sync_points_required = false;
   } const settings_;
diff --git a/cc/resources/resource_provider_unittest.cc b/cc/resources/resource_provider_unittest.cc
index 3ba950a..b8b9df6 100644
--- a/cc/resources/resource_provider_unittest.cc
+++ b/cc/resources/resource_provider_unittest.cc
@@ -28,6 +28,7 @@
 #include "cc/test/test_texture.h"
 #include "cc/test/test_web_graphics_context_3d.h"
 #include "cc/trees/blocking_task_runner.h"
+#include "components/viz/common/resources/resource_format_utils.h"
 #include "gpu/GLES2/gl2extchromium.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -336,7 +337,7 @@
   }
 
   void GetPixels(const gfx::Size& size,
-                 ResourceFormat format,
+                 viz::ResourceFormat format,
                  uint8_t* pixels) {
     CheckTextureIsBound(GL_TEXTURE_2D);
     base::AutoLock lock_for_texture_access(namespace_->lock);
@@ -353,13 +354,13 @@
  private:
   void AllocateTexture(const gfx::Size& size, GLenum format) {
     CheckTextureIsBound(GL_TEXTURE_2D);
-    ResourceFormat texture_format = RGBA_8888;
+    viz::ResourceFormat texture_format = viz::RGBA_8888;
     switch (format) {
       case GL_RGBA:
-        texture_format = RGBA_8888;
+        texture_format = viz::RGBA_8888;
         break;
       case GL_BGRA_EXT:
-        texture_format = BGRA_8888;
+        texture_format = viz::BGRA_8888;
         break;
     }
     base::AutoLock lock_for_texture_access(namespace_->lock);
@@ -404,7 +405,7 @@
                        ResourceProviderContext* context,
                        ResourceId id,
                        const gfx::Size& size,
-                       ResourceFormat format,
+                       viz::ResourceFormat format,
                        uint8_t* pixels) {
   resource_provider->WaitSyncTokenIfNeeded(id);
   switch (resource_provider->default_resource_type()) {
@@ -553,7 +554,7 @@
   DCHECK_EQ(expected_default_type, resource_provider->default_resource_type());
 
   gfx::Size size(1, 1);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   size_t pixel_size = TextureSizeBytes(size, format);
   ASSERT_EQ(4U, pixel_size);
 
@@ -585,7 +586,7 @@
 
 TEST_P(ResourceProviderTest, SimpleUpload) {
   gfx::Size size(2, 2);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   size_t pixel_size = TextureSizeBytes(size, format);
   ASSERT_EQ(16U, pixel_size);
 
@@ -620,7 +621,7 @@
   if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE)
     return;
   gfx::Size size(1, 1);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   size_t pixel_size = TextureSizeBytes(size, format);
   ASSERT_EQ(4U, pixel_size);
 
@@ -995,7 +996,7 @@
 
 TEST_P(ResourceProviderTestNoSyncToken, TransferGLResources) {
   gfx::Size size(1, 1);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   size_t pixel_size = TextureSizeBytes(size, format);
   ASSERT_EQ(4U, pixel_size);
 
@@ -1103,7 +1104,7 @@
   if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE)
     return;
   gfx::Size size(1, 1);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
 
   uint8_t data1[4] = {1, 2, 3, 4};
   std::vector<ReturnedResource> returned_to_child;
@@ -1161,7 +1162,7 @@
   if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE)
     return;
   gfx::Size size(1, 1);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
 
   ResourceId id1 = child_resource_provider_->CreateResource(
       size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format,
@@ -1228,7 +1229,7 @@
   if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE)
     return;
   gfx::Size size(1, 1);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
 
   ResourceId id1 = child_resource_provider_->CreateResource(
       size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format,
@@ -1280,7 +1281,7 @@
   if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE)
     return;
   gfx::Size size(1, 1);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
 
   ResourceId id1 = child_resource_provider_->CreateResource(
       size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format,
@@ -1345,7 +1346,7 @@
   if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE)
     return;
   gfx::Size size(1, 1);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
 
   ResourceId id1 = child_resource_provider_->CreateResource(
       size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format,
@@ -1404,7 +1405,7 @@
     return;
 
   gfx::Size size(1, 1);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   size_t pixel_size = TextureSizeBytes(size, format);
   ASSERT_EQ(4U, pixel_size);
 
@@ -1612,7 +1613,7 @@
           CreateResourceSettings()));
 
   gfx::Size size(1, 1);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   size_t pixel_size = TextureSizeBytes(size, format);
   ASSERT_EQ(4U, pixel_size);
 
@@ -1660,7 +1661,7 @@
     return;
 
   gfx::Size size(1, 1);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   size_t pixel_size = TextureSizeBytes(size, format);
   ASSERT_EQ(4U, pixel_size);
 
@@ -1709,7 +1710,7 @@
 
 TEST_P(ResourceProviderTest, DeleteExportedResources) {
   gfx::Size size(1, 1);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   size_t pixel_size = TextureSizeBytes(size, format);
   ASSERT_EQ(4U, pixel_size);
 
@@ -1809,7 +1810,7 @@
 
 TEST_P(ResourceProviderTest, DestroyChildWithExportedResources) {
   gfx::Size size(1, 1);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   size_t pixel_size = TextureSizeBytes(size, format);
   ASSERT_EQ(4U, pixel_size);
 
@@ -1926,7 +1927,7 @@
 
 TEST_P(ResourceProviderTest, DeleteTransferredResources) {
   gfx::Size size(1, 1);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   size_t pixel_size = TextureSizeBytes(size, format);
   ASSERT_EQ(4U, pixel_size);
 
@@ -1979,7 +1980,7 @@
 
 TEST_P(ResourceProviderTest, UnuseTransferredResources) {
   gfx::Size size(1, 1);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   size_t pixel_size = TextureSizeBytes(size, format);
   ASSERT_EQ(4U, pixel_size);
 
@@ -2126,7 +2127,7 @@
             resource_settings));
 
     gfx::Size size(1, 1);
-    ResourceFormat format = RGBA_8888;
+    viz::ResourceFormat format = viz::RGBA_8888;
     int child_texture_id = 1;
     int parent_texture_id = 2;
 
@@ -2317,8 +2318,7 @@
     unsigned other_texture =
         context()->createAndConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name);
     uint8_t test_data[4] = { 0 };
-    context()->GetPixels(
-        gfx::Size(1, 1), RGBA_8888, test_data);
+    context()->GetPixels(gfx::Size(1, 1), viz::RGBA_8888, test_data);
     EXPECT_EQ(0, memcmp(data, test_data, sizeof(data)));
 
     context()->produceTextureDirectCHROMIUM(other_texture, GL_TEXTURE_2D,
@@ -2372,8 +2372,7 @@
     unsigned other_texture =
         context()->createAndConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name);
     uint8_t test_data[4] = { 0 };
-    context()->GetPixels(
-        gfx::Size(1, 1), RGBA_8888, test_data);
+    context()->GetPixels(gfx::Size(1, 1), viz::RGBA_8888, test_data);
     EXPECT_EQ(0, memcmp(data, test_data, sizeof(data)));
 
     context()->produceTextureDirectCHROMIUM(other_texture, GL_TEXTURE_2D,
@@ -2407,7 +2406,7 @@
 
 TEST_P(ResourceProviderTest, LostResourceInParent) {
   gfx::Size size(1, 1);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   ResourceId resource = child_resource_provider_->CreateResource(
       size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format,
       gfx::ColorSpace());
@@ -2463,7 +2462,7 @@
 
 TEST_P(ResourceProviderTest, LostResourceInGrandParent) {
   gfx::Size size(1, 1);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   ResourceId resource = child_resource_provider_->CreateResource(
       size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format,
       gfx::ColorSpace());
@@ -2761,7 +2760,7 @@
           CreateResourceSettings()));
 
   gfx::Size size(1, 1);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   int texture_id = 1;
 
   ResourceId id = resource_provider->CreateResource(
@@ -2840,7 +2839,7 @@
           CreateResourceSettings()));
 
   gfx::Size size(1, 1);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   int texture_id = 1;
 
   // Check that the texture gets created with the right sampler settings.
@@ -2883,7 +2882,7 @@
           CreateResourceSettings()));
 
   gfx::Size size(1, 1);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
 
   for (int texture_id = 1; texture_id <= 2; ++texture_id) {
     // Check that the texture gets created with the right sampler settings.
@@ -2927,7 +2926,7 @@
           CreateResourceSettings()));
 
   gfx::Size size(1, 1);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
 
   const ResourceProvider::TextureHint hints[4] = {
       ResourceProvider::TEXTURE_HINT_DEFAULT,
@@ -3464,7 +3463,7 @@
 
   gfx::Size size(2, 2);
   gfx::Vector2d offset(0, 0);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   ResourceId id = 0;
   uint8_t pixels[16] = { 0 };
   int texture_id = 123;
@@ -3521,7 +3520,8 @@
 
   gfx::Size size(2, 2);
 
-  const ResourceFormat formats[3] = {RGBA_8888, BGRA_8888, RGBA_F16};
+  const viz::ResourceFormat formats[3] = {viz::RGBA_8888, viz::BGRA_8888,
+                                          viz::RGBA_F16};
   const ResourceProvider::TextureHint hints[4] = {
       ResourceProvider::TEXTURE_HINT_DEFAULT,
       ResourceProvider::TEXTURE_HINT_IMMUTABLE,
@@ -3539,7 +3539,7 @@
       bool is_immutable_hint =
           hints[texture_id - 1] & ResourceProvider::TEXTURE_HINT_IMMUTABLE;
       bool support_immutable_texture =
-          is_immutable_hint && formats[i] != BGRA_8888;
+          is_immutable_hint && formats[i] != viz::BGRA_8888;
       EXPECT_CALL(*context, texStorage2DEXT(_, _, _, 2, 2))
           .Times(support_immutable_texture ? 1 : 0);
       EXPECT_CALL(*context, texImage2D(_, _, _, 2, 2, _, _, _, _))
@@ -3575,7 +3575,7 @@
           CreateResourceSettings()));
 
   gfx::Size size(2, 2);
-  const ResourceFormat formats[2] = {RGBA_8888, BGRA_8888};
+  const viz::ResourceFormat formats[2] = {viz::RGBA_8888, viz::BGRA_8888};
 
   const ResourceProvider::TextureHint hints[4] = {
       ResourceProvider::TEXTURE_HINT_DEFAULT,
@@ -3620,7 +3620,7 @@
   const int kWidth = 2;
   const int kHeight = 2;
   gfx::Size size(kWidth, kHeight);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
   ResourceId id = 0;
   const unsigned kTextureId = 123u;
   const unsigned kImageId = 234u;
@@ -3712,7 +3712,8 @@
   int texture_id = 123;
 
   ResourceId id = resource_provider->CreateResource(
-      size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, ETC1, gfx::ColorSpace());
+      size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, viz::ETC1,
+      gfx::ColorSpace());
   EXPECT_NE(0u, id);
   EXPECT_CALL(*context, NextTextureId()).WillOnce(Return(texture_id));
   EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, texture_id)).Times(2);
@@ -3744,7 +3745,8 @@
   uint8_t pixels[8];
 
   ResourceId id = resource_provider->CreateResource(
-      size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, ETC1, gfx::ColorSpace());
+      size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, viz::ETC1,
+      gfx::ColorSpace());
   EXPECT_NE(0u, id);
   EXPECT_CALL(*context, NextTextureId()).WillOnce(Return(texture_id));
   EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, texture_id)).Times(3);
@@ -3785,7 +3787,7 @@
   auto shared_bitmap_manager = base::MakeUnique<TestSharedBitmapManager>();
 
   gfx::Size size(1, 1);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
 
   {
     size_t kTextureAllocationChunkSize = 1;
@@ -3829,7 +3831,7 @@
     return;
 
   gfx::Size size(1, 1);
-  ResourceFormat format = RGBA_8888;
+  viz::ResourceFormat format = viz::RGBA_8888;
 
   // ~Random set of |release_count|s to set on sync tokens.
   uint64_t release_counts[5] = {7, 3, 10, 2, 5};
diff --git a/cc/resources/resource_util.h b/cc/resources/resource_util.h
index 99fd2dc0..161b1aa 100644
--- a/cc/resources/resource_util.h
+++ b/cc/resources/resource_util.h
@@ -13,7 +13,8 @@
 #include "base/numerics/safe_math.h"
 #include "cc/base/math_util.h"
 #include "cc/cc_export.h"
-#include "cc/resources/resource_format.h"
+#include "components/viz/common/quads/resource_format.h"
+#include "components/viz/common/resources/resource_format_utils.h"
 #include "ui/gfx/geometry/size.h"
 
 namespace cc {
@@ -22,37 +23,40 @@
  public:
   // Returns true if the width is valid and fits in bytes, false otherwise.
   template <typename T>
-  static bool VerifyWidthInBytes(int width, ResourceFormat format);
+  static bool VerifyWidthInBytes(int width, viz::ResourceFormat format);
   // Returns true if the size is valid and fits in bytes, false otherwise.
   template <typename T>
-  static bool VerifySizeInBytes(const gfx::Size& size, ResourceFormat format);
+  static bool VerifySizeInBytes(const gfx::Size& size,
+                                viz::ResourceFormat format);
 
   // Dies with a CRASH() if the width can not be represented as a positive
   // number of bytes.
   template <typename T>
-  static T CheckedWidthInBytes(int width, ResourceFormat format);
+  static T CheckedWidthInBytes(int width, viz::ResourceFormat format);
   // Dies with a CRASH() if the size can not be represented as a positive
   // number of bytes.
   template <typename T>
-  static T CheckedSizeInBytes(const gfx::Size& size, ResourceFormat format);
+  static T CheckedSizeInBytes(const gfx::Size& size,
+                              viz::ResourceFormat format);
 
   // Returns the width in bytes but may overflow or return 0. Only do this for
   // computing widths for sizes that have already been checked.
   template <typename T>
-  static T UncheckedWidthInBytes(int width, ResourceFormat format);
+  static T UncheckedWidthInBytes(int width, viz::ResourceFormat format);
   // Returns the size in bytes but may overflow or return 0. Only do this for
   // sizes that have already been checked.
   template <typename T>
-  static T UncheckedSizeInBytes(const gfx::Size& size, ResourceFormat format);
+  static T UncheckedSizeInBytes(const gfx::Size& size,
+                                viz::ResourceFormat format);
   // Returns the width in bytes aligned but may overflow or return 0. Only do
   // this for computing widths for sizes that have already been checked.
   template <typename T>
-  static T UncheckedWidthInBytesAligned(int width, ResourceFormat format);
+  static T UncheckedWidthInBytesAligned(int width, viz::ResourceFormat format);
   // Returns the size in bytes aligned but may overflow or return 0. Only do
   // this for sizes that have already been checked.
   template <typename T>
   static T UncheckedSizeInBytesAligned(const gfx::Size& size,
-                                       ResourceFormat format);
+                                       viz::ResourceFormat format);
 
  private:
   template <typename T>
@@ -61,14 +65,14 @@
   template <typename T>
   static bool VerifyFitsInBytesInternal(int width,
                                         int height,
-                                        ResourceFormat format,
+                                        viz::ResourceFormat format,
                                         bool verify_size,
                                         bool aligned);
 
   template <typename T>
   static T BytesInternal(int width,
                          int height,
-                         ResourceFormat format,
+                         viz::ResourceFormat format,
                          bool verify_size,
                          bool aligned);
 
@@ -76,21 +80,21 @@
 };
 
 template <typename T>
-bool ResourceUtil::VerifyWidthInBytes(int width, ResourceFormat format) {
+bool ResourceUtil::VerifyWidthInBytes(int width, viz::ResourceFormat format) {
   VerifyType<T>();
   return VerifyFitsInBytesInternal<T>(width, 0, format, false, false);
 }
 
 template <typename T>
 bool ResourceUtil::VerifySizeInBytes(const gfx::Size& size,
-                                     ResourceFormat format) {
+                                     viz::ResourceFormat format) {
   VerifyType<T>();
   return VerifyFitsInBytesInternal<T>(size.width(), size.height(), format, true,
                                       false);
 }
 
 template <typename T>
-T ResourceUtil::CheckedWidthInBytes(int width, ResourceFormat format) {
+T ResourceUtil::CheckedWidthInBytes(int width, viz::ResourceFormat format) {
   VerifyType<T>();
   DCHECK(VerifyFitsInBytesInternal<T>(width, 0, format, false, false));
   base::CheckedNumeric<T> checked_value = BitsPerPixel(format);
@@ -102,7 +106,7 @@
 
 template <typename T>
 T ResourceUtil::CheckedSizeInBytes(const gfx::Size& size,
-                                   ResourceFormat format) {
+                                   viz::ResourceFormat format) {
   VerifyType<T>();
   DCHECK(VerifyFitsInBytesInternal<T>(size.width(), size.height(), format, true,
                                       false));
@@ -115,7 +119,7 @@
 }
 
 template <typename T>
-T ResourceUtil::UncheckedWidthInBytes(int width, ResourceFormat format) {
+T ResourceUtil::UncheckedWidthInBytes(int width, viz::ResourceFormat format) {
   VerifyType<T>();
   DCHECK(VerifyFitsInBytesInternal<T>(width, 0, format, false, false));
   return BytesInternal<T>(width, 0, format, false, false);
@@ -123,7 +127,7 @@
 
 template <typename T>
 T ResourceUtil::UncheckedSizeInBytes(const gfx::Size& size,
-                                     ResourceFormat format) {
+                                     viz::ResourceFormat format) {
   VerifyType<T>();
   DCHECK(VerifyFitsInBytesInternal<T>(size.width(), size.height(), format, true,
                                       false));
@@ -131,7 +135,8 @@
 }
 
 template <typename T>
-T ResourceUtil::UncheckedWidthInBytesAligned(int width, ResourceFormat format) {
+T ResourceUtil::UncheckedWidthInBytesAligned(int width,
+                                             viz::ResourceFormat format) {
   VerifyType<T>();
   DCHECK(VerifyFitsInBytesInternal<T>(width, 0, format, false, true));
   return BytesInternal<T>(width, 0, format, false, true);
@@ -139,7 +144,7 @@
 
 template <typename T>
 T ResourceUtil::UncheckedSizeInBytesAligned(const gfx::Size& size,
-                                            ResourceFormat format) {
+                                            viz::ResourceFormat format) {
   VerifyType<T>();
   DCHECK(VerifyFitsInBytesInternal<T>(size.width(), size.height(), format, true,
                                       true));
@@ -156,7 +161,7 @@
 template <typename T>
 bool ResourceUtil::VerifyFitsInBytesInternal(int width,
                                              int height,
-                                             ResourceFormat format,
+                                             viz::ResourceFormat format,
                                              bool verify_size,
                                              bool aligned) {
   base::CheckedNumeric<T> checked_value = BitsPerPixel(format);
@@ -193,7 +198,7 @@
 template <typename T>
 T ResourceUtil::BytesInternal(int width,
                               int height,
-                              ResourceFormat format,
+                              viz::ResourceFormat format,
                               bool verify_size,
                               bool aligned) {
   T bytes = BitsPerPixel(format);
diff --git a/cc/resources/resource_util_unittest.cc b/cc/resources/resource_util_unittest.cc
index b159d1d..8bffa6b 100644
--- a/cc/resources/resource_util_unittest.cc
+++ b/cc/resources/resource_util_unittest.cc
@@ -12,7 +12,7 @@
 namespace {
 
 struct TestFormat {
-  ResourceFormat format;
+  viz::ResourceFormat format;
   size_t expected_bytes;
   size_t expected_bytes_aligned;
 };
@@ -94,10 +94,10 @@
   // Check bytes for even width.
   int width = 10;
   TestFormat test_formats[] = {
-      {RGBA_8888, 40, 40},  // for 32 bits
-      {RGBA_4444, 20, 20},  // for 16 bits
-      {ALPHA_8, 10, 12},    // for 8 bits
-      {ETC1, 5, 8}          // for 4 bits
+      {viz::RGBA_8888, 40, 40},  // for 32 bits
+      {viz::RGBA_4444, 20, 20},  // for 16 bits
+      {viz::ALPHA_8, 10, 12},    // for 8 bits
+      {viz::ETC1, 5, 8}          // for 4 bits
   };
 
   TestVerifyWidthInBytes(width, test_formats);
@@ -108,10 +108,10 @@
   // Check bytes for odd width.
   int width_odd = 11;
   TestFormat test_formats_odd[] = {
-      {RGBA_8888, 44, 44},  // for 32 bits
-      {RGBA_4444, 22, 24},  // for 16 bits
-      {ALPHA_8, 11, 12},    // for 8 bits
-      {ETC1, 6, 8}          // for 4 bits
+      {viz::RGBA_8888, 44, 44},  // for 32 bits
+      {viz::RGBA_4444, 22, 24},  // for 16 bits
+      {viz::ALPHA_8, 11, 12},    // for 8 bits
+      {viz::ETC1, 6, 8}          // for 4 bits
   };
 
   TestVerifyWidthInBytes(width_odd, test_formats_odd);
@@ -124,10 +124,10 @@
   // Check bytes for even size.
   gfx::Size size(10, 10);
   TestFormat test_formats[] = {
-      {RGBA_8888, 400, 400},  // for 32 bits
-      {RGBA_4444, 200, 200},  // for 16 bits
-      {ALPHA_8, 100, 120},    // for 8 bits
-      {ETC1, 50, 80}          // for 4 bits
+      {viz::RGBA_8888, 400, 400},  // for 32 bits
+      {viz::RGBA_4444, 200, 200},  // for 16 bits
+      {viz::ALPHA_8, 100, 120},    // for 8 bits
+      {viz::ETC1, 50, 80}          // for 4 bits
   };
 
   TestVerifySizeInBytes(size, test_formats);
@@ -138,10 +138,10 @@
   // Check bytes for odd size.
   gfx::Size size_odd(11, 11);
   TestFormat test_formats_odd[] = {
-      {RGBA_8888, 484, 484},  // for 32 bits
-      {RGBA_4444, 242, 264},  // for 16 bits
-      {ALPHA_8, 121, 132},    // for 8 bits
-      {ETC1, 66, 88}          // for 4 bits
+      {viz::RGBA_8888, 484, 484},  // for 32 bits
+      {viz::RGBA_4444, 242, 264},  // for 16 bits
+      {viz::ALPHA_8, 121, 132},    // for 8 bits
+      {viz::ETC1, 66, 88}          // for 4 bits
   };
 
   TestVerifySizeInBytes(size_odd, test_formats_odd);
@@ -153,16 +153,18 @@
 TEST_F(ResourceUtilTest, WidthInBytesOverflow) {
   int width = 10;
   // 10 * 16 = 160 bits, overflows in char, but fits in unsigned char.
-  EXPECT_FALSE(ResourceUtil::VerifyWidthInBytes<signed char>(width, RGBA_4444));
+  EXPECT_FALSE(
+      ResourceUtil::VerifyWidthInBytes<signed char>(width, viz::RGBA_4444));
   EXPECT_TRUE(
-      ResourceUtil::VerifyWidthInBytes<unsigned char>(width, RGBA_4444));
+      ResourceUtil::VerifyWidthInBytes<unsigned char>(width, viz::RGBA_4444));
 }
 
 TEST_F(ResourceUtilTest, SizeInBytesOverflow) {
   gfx::Size size(10, 10);
   // 10 * 16 * 10 = 1600 bits, overflows in char, but fits in int.
-  EXPECT_FALSE(ResourceUtil::VerifySizeInBytes<signed char>(size, RGBA_4444));
-  EXPECT_TRUE(ResourceUtil::VerifySizeInBytes<int>(size, RGBA_4444));
+  EXPECT_FALSE(
+      ResourceUtil::VerifySizeInBytes<signed char>(size, viz::RGBA_4444));
+  EXPECT_TRUE(ResourceUtil::VerifySizeInBytes<int>(size, viz::RGBA_4444));
 }
 
 }  // namespace
diff --git a/cc/resources/scoped_resource.cc b/cc/resources/scoped_resource.cc
index d65150d..75fa38f7 100644
--- a/cc/resources/scoped_resource.cc
+++ b/cc/resources/scoped_resource.cc
@@ -17,7 +17,7 @@
 
 void ScopedResource::Allocate(const gfx::Size& size,
                               ResourceProvider::TextureHint hint,
-                              ResourceFormat format,
+                              viz::ResourceFormat format,
                               const gfx::ColorSpace& color_space) {
   DCHECK(!id());
   DCHECK(!size.IsEmpty());
@@ -33,7 +33,7 @@
 
 void ScopedResource::AllocateWithGpuMemoryBuffer(
     const gfx::Size& size,
-    ResourceFormat format,
+    viz::ResourceFormat format,
     gfx::BufferUsage usage,
     const gfx::ColorSpace& color_space) {
   DCHECK(!id());
diff --git a/cc/resources/scoped_resource.h b/cc/resources/scoped_resource.h
index 5fda730a..1e0b0eb 100644
--- a/cc/resources/scoped_resource.h
+++ b/cc/resources/scoped_resource.h
@@ -26,10 +26,10 @@
 
   void Allocate(const gfx::Size& size,
                 ResourceProvider::TextureHint hint,
-                ResourceFormat format,
+                viz::ResourceFormat format,
                 const gfx::ColorSpace& color_space);
   void AllocateWithGpuMemoryBuffer(const gfx::Size& size,
-                                   ResourceFormat format,
+                                   viz::ResourceFormat format,
                                    gfx::BufferUsage usage,
                                    const gfx::ColorSpace& color_space);
   void Free();
diff --git a/cc/resources/scoped_resource_unittest.cc b/cc/resources/scoped_resource_unittest.cc
index b3f71341..cbfbe68 100644
--- a/cc/resources/scoped_resource_unittest.cc
+++ b/cc/resources/scoped_resource_unittest.cc
@@ -47,7 +47,7 @@
                                    shared_bitmap_manager.get());
   auto texture = base::MakeUnique<ScopedResource>(resource_provider.get());
   texture->Allocate(gfx::Size(30, 30), ResourceProvider::TEXTURE_HINT_IMMUTABLE,
-                    RGBA_8888, gfx::ColorSpace());
+                    viz::RGBA_8888, gfx::ColorSpace());
 
   // The texture has an allocated byte-size now.
   size_t expected_bytes = 30 * 30 * 4;
@@ -55,7 +55,7 @@
                                 texture->size(), texture->format()));
 
   EXPECT_LT(0u, texture->id());
-  EXPECT_EQ(static_cast<unsigned>(RGBA_8888), texture->format());
+  EXPECT_EQ(static_cast<unsigned>(viz::RGBA_8888), texture->format());
   EXPECT_EQ(gfx::Size(30, 30), texture->size());
 }
 
@@ -74,7 +74,7 @@
 
     EXPECT_EQ(0u, resource_provider->num_resources());
     texture->Allocate(gfx::Size(30, 30),
-                      ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888,
+                      ResourceProvider::TEXTURE_HINT_IMMUTABLE, viz::RGBA_8888,
                       gfx::ColorSpace());
     EXPECT_LT(0u, texture->id());
     EXPECT_EQ(1u, resource_provider->num_resources());
@@ -85,7 +85,7 @@
     auto texture = base::MakeUnique<ScopedResource>(resource_provider.get());
     EXPECT_EQ(0u, resource_provider->num_resources());
     texture->Allocate(gfx::Size(30, 30),
-                      ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888,
+                      ResourceProvider::TEXTURE_HINT_IMMUTABLE, viz::RGBA_8888,
                       gfx::ColorSpace());
     EXPECT_LT(0u, texture->id());
     EXPECT_EQ(1u, resource_provider->num_resources());
diff --git a/cc/resources/transferable_resource.cc b/cc/resources/transferable_resource.cc
index bfe5652b..d64a0670 100644
--- a/cc/resources/transferable_resource.cc
+++ b/cc/resources/transferable_resource.cc
@@ -9,7 +9,7 @@
 
 TransferableResource::TransferableResource()
     : id(0),
-      format(RGBA_8888),
+      format(viz::RGBA_8888),
       buffer_format(gfx::BufferFormat::RGBA_8888),
       filter(0),
       read_lock_fences_enabled(false),
diff --git a/cc/resources/transferable_resource.h b/cc/resources/transferable_resource.h
index 9be21514..a4e497c 100644
--- a/cc/resources/transferable_resource.h
+++ b/cc/resources/transferable_resource.h
@@ -11,7 +11,7 @@
 
 #include "cc/base/resource_id.h"
 #include "cc/cc_export.h"
-#include "cc/resources/resource_format.h"
+#include "components/viz/common/quads/resource_format.h"
 #include "gpu/command_buffer/common/mailbox_holder.h"
 #include "ui/gfx/buffer_types.h"
 #include "ui/gfx/color_space.h"
@@ -31,7 +31,7 @@
 
   ResourceId id;
   // Refer to ResourceProvider::Resource for the meaning of the following data.
-  ResourceFormat format;
+  viz::ResourceFormat format;
   gfx::BufferFormat buffer_format;
   uint32_t filter;
   gfx::Size size;
diff --git a/cc/resources/video_resource_updater.cc b/cc/resources/video_resource_updater.cc
index 32ac2c6..d167201 100644
--- a/cc/resources/video_resource_updater.cc
+++ b/cc/resources/video_resource_updater.cc
@@ -32,7 +32,7 @@
 
 namespace {
 
-const ResourceFormat kRGBResourceFormat = RGBA_8888;
+const viz::ResourceFormat kRGBResourceFormat = viz::RGBA_8888;
 
 VideoFrameExternalResources::ResourceType ResourceTypeForVideoFrame(
     media::VideoFrame* video_frame,
@@ -144,7 +144,7 @@
 VideoResourceUpdater::PlaneResource::PlaneResource(
     unsigned int resource_id,
     const gfx::Size& resource_size,
-    ResourceFormat resource_format,
+    viz::ResourceFormat resource_format,
     gpu::Mailbox mailbox)
     : resource_id_(resource_id),
       resource_size_(resource_size),
@@ -196,7 +196,7 @@
 VideoResourceUpdater::ResourceList::iterator
 VideoResourceUpdater::RecycleOrAllocateResource(
     const gfx::Size& resource_size,
-    ResourceFormat resource_format,
+    viz::ResourceFormat resource_format,
     const gfx::ColorSpace& color_space,
     bool software_resource,
     bool immutable_hint,
@@ -245,7 +245,7 @@
 
 VideoResourceUpdater::ResourceList::iterator
 VideoResourceUpdater::AllocateResource(const gfx::Size& plane_size,
-                                       ResourceFormat format,
+                                       viz::ResourceFormat format,
                                        const gfx::ColorSpace& color_space,
                                        bool has_mailbox,
                                        bool immutable_hint) {
@@ -323,12 +323,12 @@
 
   const bool software_compositor = context_provider_ == NULL;
 
-  ResourceFormat output_resource_format;
+  viz::ResourceFormat output_resource_format;
   gfx::ColorSpace output_color_space = video_frame->ColorSpace();
   if (input_frame_format == media::PIXEL_FORMAT_Y16) {
     // Unable to display directly as yuv planes so convert it to RGBA for
     // compositing.
-    output_resource_format = RGBA_8888;
+    output_resource_format = viz::RGBA_8888;
     output_color_space = output_color_space.GetAsFullRangeRGB();
   } else {
     // Can be composited directly from yuv planes.
@@ -337,12 +337,12 @@
   }
 
   // If GPU compositing is enabled, but the output resource format
-  // returned by the resource provider is RGBA_8888, then a GPU driver
+  // returned by the resource provider is viz::RGBA_8888, then a GPU driver
   // bug workaround requires that YUV frames must be converted to RGB
   // before texture upload.
   bool texture_needs_rgb_conversion =
       !software_compositor &&
-      output_resource_format == ResourceFormat::RGBA_8888;
+      output_resource_format == viz::ResourceFormat::RGBA_8888;
   size_t output_plane_count = media::VideoFrame::NumPlanes(input_frame_format);
 
   // TODO(skaslev): If we're in software compositing mode, we do the YUV -> RGB
@@ -411,7 +411,7 @@
         video_renderer_->Copy(video_frame, &canvas, media::Context3D());
       } else {
         size_t bytes_per_row = ResourceUtil::CheckedWidthInBytes<size_t>(
-            video_frame->coded_size().width(), ResourceFormat::RGBA_8888);
+            video_frame->coded_size().width(), viz::ResourceFormat::RGBA_8888);
         size_t needed_size = bytes_per_row * video_frame->coded_size().height();
         if (upload_pixels_.size() < needed_size)
           upload_pixels_.resize(needed_size);
@@ -454,7 +454,7 @@
 
   std::unique_ptr<media::HalfFloatMaker> half_float_maker;
   if (resource_provider_->YuvResourceFormat(bits_per_channel) ==
-      LUMINANCE_F16) {
+      viz::LUMINANCE_F16) {
     half_float_maker =
         media::HalfFloatMaker::NewHalfFloatMaker(bits_per_channel);
     external_resources.offset = half_float_maker->Offset();
@@ -489,12 +489,13 @@
       bool needs_conversion = false;
       int shift = 0;
 
-      // LUMINANCE_F16 uses half-floats, so we always need a conversion step.
-      if (plane_resource.resource_format() == LUMINANCE_F16) {
+      // viz::LUMINANCE_F16 uses half-floats, so we always need a conversion
+      // step.
+      if (plane_resource.resource_format() == viz::LUMINANCE_F16) {
         needs_conversion = true;
       } else if (bits_per_channel > 8) {
-        // If bits_per_channel > 8 and we can't use LUMINANCE_F16, we need to
-        // shift the data down and create an 8-bit texture.
+        // If bits_per_channel > 8 and we can't use viz::LUMINANCE_F16, we need
+        // to shift the data down and create an 8-bit texture.
         needs_conversion = true;
         shift = bits_per_channel - 8;
       }
@@ -510,7 +511,7 @@
           upload_pixels_.resize(needed_size);
 
         for (int row = 0; row < resource_size_pixels.height(); ++row) {
-          if (plane_resource.resource_format() == LUMINANCE_F16) {
+          if (plane_resource.resource_format() == viz::LUMINANCE_F16) {
             uint16_t* dst = reinterpret_cast<uint16_t*>(
                 &upload_pixels_[upload_image_stride * row]);
             const uint16_t* src = reinterpret_cast<uint16_t*>(
@@ -596,7 +597,7 @@
   const gfx::Size output_plane_resource_size = video_frame->coded_size();
   // The copy needs to be a direct transfer of pixel data, so we use an RGBA8
   // target to avoid loss of precision or dropping any alpha component.
-  const ResourceFormat copy_target_format = ResourceFormat::RGBA_8888;
+  const viz::ResourceFormat copy_target_format = viz::ResourceFormat::RGBA_8888;
 
   const bool is_immutable = false;
   const int no_unique_id = 0;
diff --git a/cc/resources/video_resource_updater.h b/cc/resources/video_resource_updater.h
index 576e300..eab4122 100644
--- a/cc/resources/video_resource_updater.h
+++ b/cc/resources/video_resource_updater.h
@@ -18,8 +18,8 @@
 #include "base/time/time.h"
 #include "cc/cc_export.h"
 #include "cc/resources/release_callback_impl.h"
-#include "cc/resources/resource_format.h"
 #include "cc/resources/texture_mailbox.h"
+#include "components/viz/common/quads/resource_format.h"
 #include "ui/gfx/geometry/size.h"
 
 namespace media {
@@ -85,7 +85,7 @@
    public:
     PlaneResource(unsigned resource_id,
                   const gfx::Size& resource_size,
-                  ResourceFormat resource_format,
+                  viz::ResourceFormat resource_format,
                   gpu::Mailbox mailbox);
     PlaneResource(const PlaneResource& other);
 
@@ -100,7 +100,7 @@
     // Accessors for resource identifiers provided at construction time.
     unsigned resource_id() const { return resource_id_; }
     const gfx::Size& resource_size() const { return resource_size_; }
-    ResourceFormat resource_format() const { return resource_format_; }
+    viz::ResourceFormat resource_format() const { return resource_format_; }
     const gpu::Mailbox& mailbox() const { return mailbox_; }
 
     // Various methods for managing references. See |ref_count_| for details.
@@ -123,7 +123,7 @@
 
     const unsigned resource_id_;
     const gfx::Size resource_size_;
-    const ResourceFormat resource_format_;
+    const viz::ResourceFormat resource_format_;
     const gpu::Mailbox mailbox_;
   };
 
@@ -141,14 +141,14 @@
   // resources.
   ResourceList::iterator RecycleOrAllocateResource(
       const gfx::Size& resource_size,
-      ResourceFormat resource_format,
+      viz::ResourceFormat resource_format,
       const gfx::ColorSpace& color_space,
       bool software_resource,
       bool immutable_hint,
       int unique_id,
       int plane_index);
   ResourceList::iterator AllocateResource(const gfx::Size& plane_size,
-                                          ResourceFormat format,
+                                          viz::ResourceFormat format,
                                           const gfx::ColorSpace& color_space,
                                           bool has_mailbox,
                                           bool immutable_hint);
diff --git a/cc/surfaces/frame_sink_manager.cc b/cc/surfaces/frame_sink_manager.cc
index 5265448..079135c 100644
--- a/cc/surfaces/frame_sink_manager.cc
+++ b/cc/surfaces/frame_sink_manager.cc
@@ -67,8 +67,6 @@
   if (source_iter != frame_sink_source_map_.end()) {
     if (source_iter->second.source)
       client_iter->second->SetBeginFrameSource(nullptr);
-    if (!source_iter->second.has_children())
-      frame_sink_source_map_.erase(source_iter);
   }
   clients_.erase(client_iter);
 }
diff --git a/cc/surfaces/frame_sink_manager_unittest.cc b/cc/surfaces/frame_sink_manager_unittest.cc
index 8cd721f4..ea5c852 100644
--- a/cc/surfaces/frame_sink_manager_unittest.cc
+++ b/cc/surfaces/frame_sink_manager_unittest.cc
@@ -13,6 +13,11 @@
 
 namespace cc {
 
+namespace {
+
+constexpr FrameSinkId kArbitraryFrameSinkId(1, 1);
+}
+
 class FakeFrameSinkManagerClient : public FrameSinkManagerClient {
  public:
   explicit FakeFrameSinkManagerClient(const FrameSinkId& frame_sink_id)
@@ -115,6 +120,28 @@
   EXPECT_EQ(nullptr, client.source());
 }
 
+// This test verifies that a client is still connected to the BeginFrameSource
+// after restart.
+TEST_F(FrameSinkManagerTest, ClientRestart) {
+  FakeFrameSinkManagerClient client(kArbitraryFrameSinkId);
+  StubBeginFrameSource source;
+  client.Register(&manager_);
+
+  manager_.RegisterBeginFrameSource(&source, kArbitraryFrameSinkId);
+  EXPECT_EQ(&source, client.source());
+
+  // |client| is disconnect from |source| after Unregister.
+  client.Unregister();
+  EXPECT_EQ(nullptr, client.source());
+
+  // |client| is reconnected with |source| after re-Register.
+  client.Register(&manager_);
+  EXPECT_EQ(&source, client.source());
+
+  manager_.UnregisterBeginFrameSource(&source);
+  EXPECT_EQ(nullptr, client.source());
+}
+
 // This test verifies that a PrimaryBeginFrameSource will receive BeginFrames
 // from the first BeginFrameSource registered. If that BeginFrameSource goes
 // away then it will receive BeginFrames from the second BeginFrameSource.
diff --git a/cc/surfaces/surface_synchronization_unittest.cc b/cc/surfaces/surface_synchronization_unittest.cc
index dd7ee7d..12414a1 100644
--- a/cc/surfaces/surface_synchronization_unittest.cc
+++ b/cc/surfaces/surface_synchronization_unittest.cc
@@ -559,7 +559,7 @@
   // its resource list.
   TransferableResource resource;
   resource.id = 1337;
-  resource.format = ALPHA_8;
+  resource.format = viz::ALPHA_8;
   resource.filter = 1234;
   resource.size = gfx::Size(1234, 5678);
   std::vector<TransferableResource> resource_list = {resource};
@@ -1337,7 +1337,7 @@
   // for display.
   TransferableResource resource;
   resource.id = 1337;
-  resource.format = ALPHA_8;
+  resource.format = viz::ALPHA_8;
   resource.filter = 1234;
   resource.size = gfx::Size(1234, 5678);
   std::vector<ReturnedResource> returned_resources =
@@ -1367,7 +1367,7 @@
   // closed.
   TransferableResource resource2;
   resource2.id = 1246;
-  resource2.format = ALPHA_8;
+  resource2.format = viz::ALPHA_8;
   resource2.filter = 1357;
   resource2.size = gfx::Size(8765, 4321);
   std::vector<ReturnedResource> returned_resources2 =
diff --git a/cc/test/fake_raster_buffer_provider.cc b/cc/test/fake_raster_buffer_provider.cc
index 9f766913..ccc4142f 100644
--- a/cc/test/fake_raster_buffer_provider.cc
+++ b/cc/test/fake_raster_buffer_provider.cc
@@ -25,9 +25,9 @@
 
 void FakeRasterBufferProviderImpl::Flush() {}
 
-ResourceFormat FakeRasterBufferProviderImpl::GetResourceFormat(
+viz::ResourceFormat FakeRasterBufferProviderImpl::GetResourceFormat(
     bool must_support_alpha) const {
-  return ResourceFormat::RGBA_8888;
+  return viz::ResourceFormat::RGBA_8888;
 }
 
 bool FakeRasterBufferProviderImpl::IsResourceSwizzleRequired(
diff --git a/cc/test/fake_raster_buffer_provider.h b/cc/test/fake_raster_buffer_provider.h
index 29f8653b..7bf988f 100644
--- a/cc/test/fake_raster_buffer_provider.h
+++ b/cc/test/fake_raster_buffer_provider.h
@@ -23,7 +23,7 @@
   void ReleaseBufferForRaster(std::unique_ptr<RasterBuffer> buffer) override;
   void OrderingBarrier() override;
   void Flush() override;
-  ResourceFormat GetResourceFormat(bool must_support_alpha) const override;
+  viz::ResourceFormat GetResourceFormat(bool must_support_alpha) const override;
   bool IsResourceSwizzleRequired(bool must_support_alpha) const override;
   bool CanPartialRasterIntoProvidedResource() const override;
   bool IsResourceReadyToDraw(ResourceId id) const override;
diff --git a/cc/test/fake_tile_manager.cc b/cc/test/fake_tile_manager.cc
index e7b1bea..48623ae6 100644
--- a/cc/test/fake_tile_manager.cc
+++ b/cc/test/fake_tile_manager.cc
@@ -42,7 +42,7 @@
                   std::numeric_limits<size_t>::max(),
                   TileManagerSettings()),
       image_decode_cache_(
-          ResourceFormat::RGBA_8888,
+          viz::ResourceFormat::RGBA_8888,
           LayerTreeSettings().decoded_image_working_set_budget_bytes) {
   SetDecodedImageTracker(&decoded_image_tracker_);
   SetResources(resource_pool, &image_decode_cache_, GetGlobalTaskGraphRunner(),
diff --git a/cc/test/fake_ui_resource_layer_tree_host_impl.cc b/cc/test/fake_ui_resource_layer_tree_host_impl.cc
index 6530706a..6e0a29d9 100644
--- a/cc/test/fake_ui_resource_layer_tree_host_impl.cc
+++ b/cc/test/fake_ui_resource_layer_tree_host_impl.cc
@@ -24,8 +24,8 @@
 
   UIResourceData data;
   data.resource_id = resource_provider()->CreateResource(
-      bitmap.GetSize(), ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888,
-      gfx::ColorSpace());
+      bitmap.GetSize(), ResourceProvider::TEXTURE_HINT_IMMUTABLE,
+      viz::RGBA_8888, gfx::ColorSpace());
 
   data.opaque = bitmap.GetOpaque();
   fake_ui_resource_map_[uid] = data;
diff --git a/cc/test/layer_tree_pixel_resource_test.cc b/cc/test/layer_tree_pixel_resource_test.cc
index 1dd5db0e..0088515 100644
--- a/cc/test/layer_tree_pixel_resource_test.cc
+++ b/cc/test/layer_tree_pixel_resource_test.cc
@@ -156,7 +156,7 @@
 
       *raster_buffer_provider = base::MakeUnique<GpuRasterBufferProvider>(
           compositor_context_provider, worker_context_provider,
-          resource_provider, false, 0, PlatformColor::BestTextureFormat(),
+          resource_provider, false, 0, viz::PlatformColor::BestTextureFormat(),
           false);
       break;
     case RASTER_BUFFER_PROVIDER_TYPE_ZERO_COPY:
@@ -164,7 +164,7 @@
       EXPECT_EQ(PIXEL_TEST_GL, test_type_);
 
       *raster_buffer_provider = ZeroCopyRasterBufferProvider::Create(
-          resource_provider, PlatformColor::BestTextureFormat());
+          resource_provider, viz::PlatformColor::BestTextureFormat());
       break;
     case RASTER_BUFFER_PROVIDER_TYPE_ONE_COPY:
       EXPECT_TRUE(compositor_context_provider);
@@ -174,8 +174,8 @@
       *raster_buffer_provider = base::MakeUnique<OneCopyRasterBufferProvider>(
           task_runner, compositor_context_provider, worker_context_provider,
           resource_provider, max_bytes_per_copy_operation, false,
-          max_staging_buffer_usage_in_bytes, PlatformColor::BestTextureFormat(),
-          false);
+          max_staging_buffer_usage_in_bytes,
+          viz::PlatformColor::BestTextureFormat(), false);
       break;
   }
 }
diff --git a/cc/test/test_in_process_context_provider.cc b/cc/test/test_in_process_context_provider.cc
index 5047dc4..f70d68c 100644
--- a/cc/test/test_in_process_context_provider.cc
+++ b/cc/test/test_in_process_context_provider.cc
@@ -11,7 +11,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "cc/output/context_cache_controller.h"
-#include "cc/resources/platform_color.h"
+#include "components/viz/common/resources/platform_color.h"
 #include "gpu/GLES2/gl2extchromium.h"
 #include "gpu/command_buffer/client/gles2_implementation.h"
 #include "gpu/command_buffer/client/gles2_lib.h"
@@ -110,11 +110,11 @@
   gpu::Capabilities capabilities;
   capabilities.texture_rectangle = true;
   capabilities.sync_query = true;
-  switch (PlatformColor::Format()) {
-    case PlatformColor::SOURCE_FORMAT_RGBA8:
+  switch (viz::PlatformColor::Format()) {
+    case viz::PlatformColor::SOURCE_FORMAT_RGBA8:
       capabilities.texture_format_bgra8888 = false;
       break;
-    case PlatformColor::SOURCE_FORMAT_BGRA8:
+    case viz::PlatformColor::SOURCE_FORMAT_BGRA8:
       capabilities.texture_format_bgra8888 = true;
       break;
   }
diff --git a/cc/test/test_texture.cc b/cc/test/test_texture.cc
index fea16fbd..662692a 100644
--- a/cc/test/test_texture.cc
+++ b/cc/test/test_texture.cc
@@ -12,14 +12,14 @@
 
 namespace cc {
 
-size_t TextureSizeBytes(const gfx::Size& size, ResourceFormat format) {
+size_t TextureSizeBytes(const gfx::Size& size, viz::ResourceFormat format) {
   unsigned int components_per_pixel = 4;
   unsigned int bytes_per_component = 1;
   return size.width() * size.height() * components_per_pixel *
          bytes_per_component;
 }
 
-TestTexture::TestTexture() : format(RGBA_8888) {
+TestTexture::TestTexture() : format(viz::RGBA_8888) {
   // Initialize default parameter values.
   params[GL_TEXTURE_MAG_FILTER] = GL_LINEAR;
   params[GL_TEXTURE_MIN_FILTER] = GL_NEAREST_MIPMAP_LINEAR;
@@ -30,7 +30,8 @@
 
 TestTexture::~TestTexture() {}
 
-void TestTexture::Reallocate(const gfx::Size& size, ResourceFormat format) {
+void TestTexture::Reallocate(const gfx::Size& size,
+                             viz::ResourceFormat format) {
   this->size = size;
   this->format = format;
   this->data.reset(new uint8_t[TextureSizeBytes(size, format)]);
diff --git a/cc/test/test_texture.h b/cc/test/test_texture.h
index ae819ec..2389a9d 100644
--- a/cc/test/test_texture.h
+++ b/cc/test/test_texture.h
@@ -12,22 +12,22 @@
 #include <unordered_map>
 
 #include "base/memory/ref_counted.h"
-#include "cc/resources/resource_format.h"
+#include "components/viz/common/quads/resource_format.h"
 #include "third_party/khronos/GLES2/gl2.h"
 #include "ui/gfx/geometry/size.h"
 
 namespace cc {
 
-size_t TextureSizeBytes(const gfx::Size& size, ResourceFormat format);
+size_t TextureSizeBytes(const gfx::Size& size, viz::ResourceFormat format);
 
 struct TestTexture : public base::RefCounted<TestTexture> {
   TestTexture();
 
-  void Reallocate(const gfx::Size& size, ResourceFormat format);
+  void Reallocate(const gfx::Size& size, viz::ResourceFormat format);
   bool IsValidParameter(GLenum pname);
 
   gfx::Size size;
-  ResourceFormat format;
+  viz::ResourceFormat format;
   std::unique_ptr<uint8_t[]> data;
 
   using TextureParametersMap = std::unordered_map<GLenum, GLint>;
diff --git a/cc/tiles/gpu_image_decode_cache.cc b/cc/tiles/gpu_image_decode_cache.cc
index a6b9228a..b1e7400 100644
--- a/cc/tiles/gpu_image_decode_cache.cc
+++ b/cc/tiles/gpu_image_decode_cache.cc
@@ -20,8 +20,8 @@
 #include "cc/base/devtools_instrumentation.h"
 #include "cc/output/context_provider.h"
 #include "cc/raster/tile_task.h"
-#include "cc/resources/resource_format_utils.h"
 #include "cc/tiles/mipmap_util.h"
+#include "components/viz/common/resources/resource_format_utils.h"
 #include "gpu/command_buffer/client/context_support.h"
 #include "gpu/command_buffer/client/gles2_interface.h"
 #include "gpu_image_decode_cache.h"
@@ -393,7 +393,7 @@
 }
 
 GpuImageDecodeCache::GpuImageDecodeCache(ContextProvider* context,
-                                         ResourceFormat decode_format,
+                                         viz::ResourceFormat decode_format,
                                          size_t max_working_set_bytes,
                                          size_t max_cache_bytes)
     : format_(decode_format),
@@ -1180,7 +1180,7 @@
         if (!draw_image.image()->getDeferredTextureImageData(
                 *context_threadsafe_proxy_.get(), &image_data->upload_params, 1,
                 backing_memory->data(), nullptr,
-                ResourceFormatToClosestSkColorType(format_))) {
+                viz::ResourceFormatToClosestSkColorType(format_))) {
           DLOG(ERROR) << "getDeferredTextureImageData failed despite params "
                       << "having validated.";
           backing_memory->Unlock();
@@ -1282,7 +1282,7 @@
       upload_scale_mip_level);
   size_t data_size = draw_image.image()->getDeferredTextureImageData(
       *context_threadsafe_proxy_.get(), &params, 1, nullptr, nullptr,
-      ResourceFormatToClosestSkColorType(format_));
+      viz::ResourceFormatToClosestSkColorType(format_));
 
   if (data_size == 0) {
     // Can't upload image, too large or other failure. Try to use SW fallback.
@@ -1310,7 +1310,7 @@
   gfx::Size mip_size =
       CalculateSizeForMipLevel(draw_image, upload_scale_mip_level);
   return SkImageInfo::Make(mip_size.width(), mip_size.height(),
-                           ResourceFormatToClosestSkColorType(format_),
+                           viz::ResourceFormatToClosestSkColorType(format_),
                            kPremul_SkAlphaType,
                            draw_image.target_color_space().ToSkColorSpace());
 }
diff --git a/cc/tiles/gpu_image_decode_cache.h b/cc/tiles/gpu_image_decode_cache.h
index c2fc02e2..b290faf 100644
--- a/cc/tiles/gpu_image_decode_cache.h
+++ b/cc/tiles/gpu_image_decode_cache.h
@@ -15,8 +15,8 @@
 #include "base/synchronization/lock.h"
 #include "base/trace_event/memory_dump_provider.h"
 #include "cc/cc_export.h"
-#include "cc/resources/resource_format.h"
 #include "cc/tiles/image_decode_cache.h"
+#include "components/viz/common/quads/resource_format.h"
 #include "third_party/skia/include/core/SkRefCnt.h"
 
 namespace cc {
@@ -102,7 +102,7 @@
   enum class DecodeTaskType { PART_OF_UPLOAD_TASK, STAND_ALONE_DECODE_TASK };
 
   explicit GpuImageDecodeCache(ContextProvider* context,
-                               ResourceFormat decode_format,
+                               viz::ResourceFormat decode_format,
                                size_t max_working_set_bytes,
                                size_t max_cache_bytes);
   ~GpuImageDecodeCache() override;
@@ -347,7 +347,7 @@
                               ImageData* image_data);
   void DeletePendingImages();
 
-  const ResourceFormat format_;
+  const viz::ResourceFormat format_;
   ContextProvider* context_;
   sk_sp<GrContextThreadSafeProxy> context_threadsafe_proxy_;
 
diff --git a/cc/tiles/gpu_image_decode_cache_unittest.cc b/cc/tiles/gpu_image_decode_cache_unittest.cc
index 0257717..721f5b1 100644
--- a/cc/tiles/gpu_image_decode_cache_unittest.cc
+++ b/cc/tiles/gpu_image_decode_cache_unittest.cc
@@ -28,7 +28,7 @@
 class TestGpuImageDecodeCache : public GpuImageDecodeCache {
  public:
   explicit TestGpuImageDecodeCache(ContextProvider* context,
-                                   ResourceFormat format)
+                                   viz::ResourceFormat format)
       : GpuImageDecodeCache(context,
                             format,
                             kGpuMemoryLimitBytes,
@@ -74,7 +74,7 @@
   return matrix;
 }
 
-using GpuImageDecodeCacheTest = ::testing::TestWithParam<ResourceFormat>;
+using GpuImageDecodeCacheTest = ::testing::TestWithParam<viz::ResourceFormat>;
 
 TEST_P(GpuImageDecodeCacheTest, GetTaskForImageSameImage) {
   auto context_provider = TestContextProvider::Create();
@@ -1503,7 +1503,8 @@
   // Setup - Image cache has a normal working set, but zero cache size.
   auto context_provider = TestContextProvider::Create();
   context_provider->BindToCurrentThread();
-  GpuImageDecodeCache cache(context_provider.get(), ResourceFormat::RGBA_8888,
+  GpuImageDecodeCache cache(context_provider.get(),
+                            viz::ResourceFormat::RGBA_8888,
                             kGpuMemoryLimitBytes, 0);
   bool is_decomposable = true;
   SkFilterQuality quality = kHigh_SkFilterQuality;
@@ -1560,7 +1561,8 @@
 
   auto context_provider = TestContextProvider::Create();
   context_provider->BindToCurrentThread();
-  GpuImageDecodeCache cache(context_provider.get(), ResourceFormat::RGBA_8888,
+  GpuImageDecodeCache cache(context_provider.get(),
+                            viz::ResourceFormat::RGBA_8888,
                             kGpuMemoryLimitBytes, cache_size);
   bool is_decomposable = true;
   SkFilterQuality quality = kHigh_SkFilterQuality;
@@ -1813,8 +1815,8 @@
 
 INSTANTIATE_TEST_CASE_P(GpuImageDecodeCacheTests,
                         GpuImageDecodeCacheTest,
-                        ::testing::Values(ResourceFormat::RGBA_8888,
-                                          ResourceFormat::RGBA_4444));
+                        ::testing::Values(viz::ResourceFormat::RGBA_8888,
+                                          viz::ResourceFormat::RGBA_4444));
 
 }  // namespace
 }  // namespace cc
diff --git a/cc/tiles/software_image_decode_cache.cc b/cc/tiles/software_image_decode_cache.cc
index 83b7026..2cbb8cc 100644
--- a/cc/tiles/software_image_decode_cache.cc
+++ b/cc/tiles/software_image_decode_cache.cc
@@ -21,8 +21,8 @@
 #include "base/trace_event/memory_dump_manager.h"
 #include "cc/base/devtools_instrumentation.h"
 #include "cc/raster/tile_task.h"
-#include "cc/resources/resource_format_utils.h"
 #include "cc/tiles/mipmap_util.h"
+#include "components/viz/common/resources/resource_format_utils.h"
 #include "third_party/skia/include/core/SkCanvas.h"
 #include "third_party/skia/include/core/SkImage.h"
 #include "third_party/skia/include/core/SkPixmap.h"
@@ -159,9 +159,9 @@
 
 SkImageInfo CreateImageInfo(size_t width,
                             size_t height,
-                            ResourceFormat format) {
+                            viz::ResourceFormat format) {
   return SkImageInfo::Make(width, height,
-                           ResourceFormatToClosestSkColorType(format),
+                           viz::ResourceFormatToClosestSkColorType(format),
                            kPremul_SkAlphaType);
 }
 
@@ -194,7 +194,7 @@
 }  // namespace
 
 SoftwareImageDecodeCache::SoftwareImageDecodeCache(
-    ResourceFormat format,
+    viz::ResourceFormat format,
     size_t locked_memory_limit_bytes)
     : decoded_images_(ImageMRUCache::NO_AUTO_EVICT),
       at_raster_decoded_images_(ImageMRUCache::NO_AUTO_EVICT),
@@ -919,8 +919,9 @@
 }
 
 // SoftwareImageDecodeCacheKey
-ImageDecodeCacheKey ImageDecodeCacheKey::FromDrawImage(const DrawImage& image,
-                                                       ResourceFormat format) {
+ImageDecodeCacheKey ImageDecodeCacheKey::FromDrawImage(
+    const DrawImage& image,
+    viz::ResourceFormat format) {
   const SkSize& scale = image.scale();
   // If the src_rect falls outside of the image, we need to clip it since
   // otherwise we might end up with uninitialized memory in the decode process.
@@ -949,8 +950,9 @@
     quality = kMedium_SkFilterQuality;
   }
 
-  // Skia doesn't scale an RGBA_4444 format, so always use the original decode.
-  if (format == RGBA_4444)
+  // Skia doesn't scale an viz::RGBA_4444 format, so always use the original
+  // decode.
+  if (format == viz::RGBA_4444)
     quality = std::min(quality, kLow_SkFilterQuality);
 
   // Drop from high to medium if the the matrix we applied wasn't decomposable,
diff --git a/cc/tiles/software_image_decode_cache.h b/cc/tiles/software_image_decode_cache.h
index a81c5f6..78777894 100644
--- a/cc/tiles/software_image_decode_cache.h
+++ b/cc/tiles/software_image_decode_cache.h
@@ -22,9 +22,9 @@
 #include "base/trace_event/memory_dump_provider.h"
 #include "cc/cc_export.h"
 #include "cc/paint/draw_image.h"
-#include "cc/resources/resource_format.h"
 #include "cc/tiles/decoded_draw_image.h"
 #include "cc/tiles/image_decode_cache.h"
+#include "components/viz/common/quads/resource_format.h"
 #include "third_party/skia/include/core/SkRefCnt.h"
 #include "ui/gfx/geometry/rect.h"
 
@@ -37,7 +37,7 @@
 class CC_EXPORT ImageDecodeCacheKey {
  public:
   static ImageDecodeCacheKey FromDrawImage(const DrawImage& image,
-                                           ResourceFormat format);
+                                           viz::ResourceFormat format);
 
   ImageDecodeCacheKey(const ImageDecodeCacheKey& other);
 
@@ -121,7 +121,7 @@
 
   enum class DecodeTaskType { USE_IN_RASTER_TASKS, USE_OUT_OF_RASTER_TASKS };
 
-  SoftwareImageDecodeCache(ResourceFormat format,
+  SoftwareImageDecodeCache(viz::ResourceFormat format,
                            size_t locked_memory_limit_bytes);
   ~SoftwareImageDecodeCache() override;
 
@@ -324,7 +324,7 @@
 
   MemoryBudget locked_images_budget_;
 
-  ResourceFormat format_;
+  viz::ResourceFormat format_;
   size_t max_items_in_cache_;
 
   // Used to uniquely identify DecodedImages for memory traces.
diff --git a/cc/tiles/software_image_decode_cache_perftest.cc b/cc/tiles/software_image_decode_cache_perftest.cc
index 3a4b93ff..fb9ed0df 100644
--- a/cc/tiles/software_image_decode_cache_perftest.cc
+++ b/cc/tiles/software_image_decode_cache_perftest.cc
@@ -68,7 +68,7 @@
     timer_.Reset();
     do {
       for (auto& image : images)
-        ImageDecodeCacheKey::FromDrawImage(image, RGBA_8888);
+        ImageDecodeCacheKey::FromDrawImage(image, viz::RGBA_8888);
       timer_.NextLap();
     } while (!timer_.HasTimeLimitExpired());
 
diff --git a/cc/tiles/software_image_decode_cache_unittest.cc b/cc/tiles/software_image_decode_cache_unittest.cc
index 90aa66e4..9d3560e 100644
--- a/cc/tiles/software_image_decode_cache_unittest.cc
+++ b/cc/tiles/software_image_decode_cache_unittest.cc
@@ -5,8 +5,8 @@
 #include "cc/tiles/software_image_decode_cache.h"
 
 #include "cc/paint/draw_image.h"
-#include "cc/resources/resource_format.h"
 #include "cc/test/test_tile_task_runner.h"
+#include "components/viz/common/quads/resource_format.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/skia/include/core/SkRefCnt.h"
 
@@ -21,7 +21,7 @@
 class TestSoftwareImageDecodeCache : public SoftwareImageDecodeCache {
  public:
   TestSoftwareImageDecodeCache()
-      : SoftwareImageDecodeCache(ResourceFormat::RGBA_8888,
+      : SoftwareImageDecodeCache(viz::ResourceFormat::RGBA_8888,
                                  kLockedMemoryLimitBytes) {}
 };
 
@@ -65,7 +65,7 @@
                        CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable),
                        DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(kNone_SkFilterQuality, key.filter_quality());
   EXPECT_EQ(100, key.target_size().width());
@@ -86,7 +86,7 @@
                        CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable),
                        DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(kMedium_SkFilterQuality, key.filter_quality());
   EXPECT_EQ(100, key.target_size().width());
@@ -104,7 +104,7 @@
                        CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable),
                        DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_4444);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_4444);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
   EXPECT_EQ(100, key.target_size().width());
@@ -122,7 +122,7 @@
                        CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable),
                        DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_4444);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_4444);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
   EXPECT_EQ(100, key.target_size().width());
@@ -140,7 +140,7 @@
                        CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable),
                        DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
   EXPECT_EQ(100, key.target_size().width());
@@ -159,7 +159,7 @@
       quality, CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable),
       DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(quality, key.filter_quality());
   EXPECT_EQ(100, key.target_size().width());
@@ -178,7 +178,7 @@
       quality, CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable),
       DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
   EXPECT_EQ(100, key.target_size().width());
@@ -197,7 +197,7 @@
       quality, CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable),
       DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
   EXPECT_EQ(100, key.target_size().width());
@@ -217,7 +217,7 @@
       quality, CreateMatrix(SkSize::Make(1.001f, 1.001f), is_decomposable),
       DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
   EXPECT_EQ(100, key.target_size().width());
@@ -237,7 +237,7 @@
       quality, CreateMatrix(SkSize::Make(0.999f, 0.999f), is_decomposable),
       DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
   EXPECT_EQ(100, key.target_size().width());
@@ -257,7 +257,7 @@
       quality, CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable),
       DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
   EXPECT_EQ(100, key.target_size().width());
@@ -276,7 +276,7 @@
       quality, CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable),
       DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
   EXPECT_EQ(500, key.target_size().width());
@@ -295,7 +295,7 @@
       quality, CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable),
       DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
   EXPECT_EQ(500, key.target_size().width());
@@ -314,7 +314,7 @@
       quality, CreateMatrix(SkSize::Make(0.75f, 0.75f), is_decomposable),
       DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(quality, key.filter_quality());
   EXPECT_EQ(500, key.target_size().width());
@@ -333,7 +333,7 @@
       quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable),
       DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(quality, key.filter_quality());
   EXPECT_EQ(250, key.target_size().width());
@@ -352,7 +352,7 @@
       quality, CreateMatrix(SkSize::Make(0.49f, 0.49f), is_decomposable),
       DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(quality, key.filter_quality());
   EXPECT_EQ(250, key.target_size().width());
@@ -371,7 +371,7 @@
       quality, CreateMatrix(SkSize::Make(0.1f, 0.1f), is_decomposable),
       DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(quality, key.filter_quality());
   EXPECT_EQ(62, key.target_size().width());
@@ -390,7 +390,7 @@
       quality, CreateMatrix(SkSize::Make(0.01f, 0.01f), is_decomposable),
       DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(quality, key.filter_quality());
   EXPECT_EQ(7, key.target_size().width());
@@ -410,7 +410,7 @@
       quality, CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable),
       DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(kMedium_SkFilterQuality, key.filter_quality());
   EXPECT_EQ(100, key.target_size().width());
@@ -430,7 +430,7 @@
       quality, CreateMatrix(SkSize::Make(0.5f, 0.2f), is_decomposable),
       DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(kMedium_SkFilterQuality, key.filter_quality());
   EXPECT_EQ(50, key.target_size().width());
@@ -449,7 +449,7 @@
       quality, CreateMatrix(SkSize::Make(2.5f, 1.5f), is_decomposable),
       DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(quality, key.filter_quality());
   EXPECT_EQ(250, key.target_size().width());
@@ -471,7 +471,7 @@
       quality, CreateMatrix(SkSize::Make(0.9f, 2.f), is_decomposable),
       DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(kMedium_SkFilterQuality, key.filter_quality());
   EXPECT_EQ(4555, key.target_size().width());
@@ -491,7 +491,7 @@
       quality, CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable),
       DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
   EXPECT_EQ(100, key.target_size().width());
@@ -510,7 +510,7 @@
       quality, CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable),
       DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
   EXPECT_EQ(100, key.target_size().width());
@@ -530,7 +530,7 @@
       quality, CreateMatrix(SkSize::Make(1.001f, 1.001f), is_decomposable),
       DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
   EXPECT_EQ(100, key.target_size().width());
@@ -550,7 +550,7 @@
       quality, CreateMatrix(SkSize::Make(0.999f, 0.999f), is_decomposable),
       DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
   EXPECT_EQ(100, key.target_size().width());
@@ -569,7 +569,7 @@
       quality, CreateMatrix(SkSize::Make(0.5f, 0.5), is_decomposable),
       DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(kNone_SkFilterQuality, key.filter_quality());
   EXPECT_EQ(100, key.target_size().width());
@@ -583,7 +583,7 @@
       DefaultColorSpace());
 
   auto another_key =
-      ImageDecodeCacheKey::FromDrawImage(another_draw_image, RGBA_8888);
+      ImageDecodeCacheKey::FromDrawImage(another_draw_image, viz::RGBA_8888);
   EXPECT_EQ(image->uniqueID(), another_key.image_id());
   EXPECT_EQ(kNone_SkFilterQuality, another_key.filter_quality());
   EXPECT_EQ(100, another_key.target_size().width());
@@ -605,7 +605,7 @@
       CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable),
       DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
   EXPECT_EQ(100, key.target_size().width());
@@ -625,7 +625,7 @@
       CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable),
       DefaultColorSpace());
 
-  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, RGBA_8888);
+  auto key = ImageDecodeCacheKey::FromDrawImage(draw_image, viz::RGBA_8888);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(kMedium_SkFilterQuality, key.filter_quality());
   EXPECT_EQ(40, key.target_size().width());
diff --git a/cc/tiles/tile_draw_info.h b/cc/tiles/tile_draw_info.h
index dc1a8855..390b4346 100644
--- a/cc/tiles/tile_draw_info.h
+++ b/cc/tiles/tile_draw_info.h
@@ -8,9 +8,9 @@
 #include <memory>
 
 #include "base/trace_event/trace_event_argument.h"
-#include "cc/resources/platform_color.h"
 #include "cc/resources/resource_provider.h"
 #include "cc/resources/scoped_resource.h"
+#include "components/viz/common/resources/platform_color.h"
 
 namespace cc {
 
diff --git a/cc/tiles/tile_manager.cc b/cc/tiles/tile_manager.cc
index d9a680d6..94addce 100644
--- a/cc/tiles/tile_manager.cc
+++ b/cc/tiles/tile_manager.cc
@@ -1445,7 +1445,8 @@
   client_->RequestImplSideInvalidation();
 }
 
-ResourceFormat TileManager::DetermineResourceFormat(const Tile* tile) const {
+viz::ResourceFormat TileManager::DetermineResourceFormat(
+    const Tile* tile) const {
   return raster_buffer_provider_->GetResourceFormat(!tile->is_opaque());
 }
 
@@ -1636,7 +1637,7 @@
 // static
 TileManager::MemoryUsage TileManager::MemoryUsage::FromConfig(
     const gfx::Size& size,
-    ResourceFormat format) {
+    viz::ResourceFormat format) {
   // We can use UncheckedSizeInBytes here since this is used with a tile
   // size which is determined by the compositor (it's at most max texture
   // size).
diff --git a/cc/tiles/tile_manager.h b/cc/tiles/tile_manager.h
index 1b08ae0e..91388826 100644
--- a/cc/tiles/tile_manager.h
+++ b/cc/tiles/tile_manager.h
@@ -279,7 +279,8 @@
     MemoryUsage();
     MemoryUsage(size_t memory_bytes, size_t resource_count);
 
-    static MemoryUsage FromConfig(const gfx::Size& size, ResourceFormat format);
+    static MemoryUsage FromConfig(const gfx::Size& size,
+                                  viz::ResourceFormat format);
     static MemoryUsage FromTile(const Tile* tile);
 
     MemoryUsage& operator+=(const MemoryUsage& other);
@@ -342,7 +343,7 @@
   void MarkTilesOutOfMemory(
       std::unique_ptr<RasterTilePriorityQueue> queue) const;
 
-  ResourceFormat DetermineResourceFormat(const Tile* tile) const;
+  viz::ResourceFormat DetermineResourceFormat(const Tile* tile) const;
   bool DetermineResourceRequiresSwizzle(const Tile* tile) const;
 
   void DidFinishRunningTileTasksRequiredForActivation();
diff --git a/cc/tiles/tile_manager_unittest.cc b/cc/tiles/tile_manager_unittest.cc
index d497d963f..6497489 100644
--- a/cc/tiles/tile_manager_unittest.cc
+++ b/cc/tiles/tile_manager_unittest.cc
@@ -1369,11 +1369,12 @@
   EXPECT_FALSE(queue->IsEmpty());
   EXPECT_TRUE(queue->Top().tile()->required_for_draw());
   EXPECT_EQ(gfx::Size(256, 256), queue->Top().tile()->desired_texture_size());
-  EXPECT_EQ(RGBA_8888, host_impl()->resource_provider()->best_texture_format());
+  EXPECT_EQ(viz::RGBA_8888,
+            host_impl()->resource_provider()->best_texture_format());
 
   ManagedMemoryPolicy policy = host_impl()->ActualManagedMemoryPolicy();
   policy.bytes_limit_when_visible = ResourceUtil::UncheckedSizeInBytes<size_t>(
-      gfx::Size(256, 256), RGBA_8888);
+      gfx::Size(256, 256), viz::RGBA_8888);
   host_impl()->SetMemoryPolicy(policy);
 
   EXPECT_FALSE(host_impl()->is_likely_to_require_a_draw());
@@ -1381,7 +1382,7 @@
   EXPECT_TRUE(host_impl()->is_likely_to_require_a_draw());
 
   Resource* resource = host_impl()->resource_pool()->AcquireResource(
-      gfx::Size(256, 256), RGBA_8888, gfx::ColorSpace());
+      gfx::Size(256, 256), viz::RGBA_8888, gfx::ColorSpace());
 
   host_impl()->tile_manager()->CheckIfMoreTilesNeedToBePreparedForTesting();
   EXPECT_FALSE(host_impl()->is_likely_to_require_a_draw());
@@ -1929,7 +1930,7 @@
 
   // Ensure there's a resource with our |kInvalidatedId| in the resource pool.
   auto* resource = host_impl->resource_pool()->AcquireResource(
-      kTileSize, RGBA_8888, gfx::ColorSpace());
+      kTileSize, viz::RGBA_8888, gfx::ColorSpace());
   host_impl->resource_pool()->OnContentReplaced(resource->id(), kInvalidatedId);
   host_impl->resource_pool()->ReleaseResource(resource);
   host_impl->resource_pool()->CheckBusyResources();
diff --git a/cc/trees/layer_tree_host.h b/cc/trees/layer_tree_host.h
index 6b742a01..1ef7a20 100644
--- a/cc/trees/layer_tree_host.h
+++ b/cc/trees/layer_tree_host.h
@@ -35,7 +35,6 @@
 #include "cc/layers/layer_list_iterator.h"
 #include "cc/output/layer_tree_frame_sink.h"
 #include "cc/output/swap_promise.h"
-#include "cc/resources/resource_format.h"
 #include "cc/surfaces/surface_reference_owner.h"
 #include "cc/surfaces/surface_sequence_generator.h"
 #include "cc/trees/compositor_mode.h"
@@ -45,6 +44,7 @@
 #include "cc/trees/proxy.h"
 #include "cc/trees/swap_promise_manager.h"
 #include "cc/trees/target_property.h"
+#include "components/viz/common/quads/resource_format.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/gfx/geometry/rect.h"
 
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index 99f22caa..63d133c 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -4050,15 +4050,15 @@
     return;
   }
 
-  ResourceFormat format = resource_provider_->best_texture_format();
+  viz::ResourceFormat format = resource_provider_->best_texture_format();
   switch (bitmap.GetFormat()) {
     case UIResourceBitmap::RGBA8:
       break;
     case UIResourceBitmap::ALPHA_8:
-      format = ALPHA_8;
+      format = viz::ALPHA_8;
       break;
     case UIResourceBitmap::ETC1:
-      format = ETC1;
+      format = viz::ETC1;
       break;
   }
 
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index ea14f33..850284f 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -7423,7 +7423,7 @@
         resource_id_(resource_provider->CreateResource(
             gfx::Size(1, 1),
             ResourceProvider::TEXTURE_HINT_IMMUTABLE,
-            RGBA_8888,
+            viz::RGBA_8888,
             gfx::ColorSpace())) {
     resource_provider->AllocateForTesting(resource_id_);
     SetBounds(gfx::Size(10, 10));
diff --git a/cc/trees/layer_tree_host_unittest_context.cc b/cc/trees/layer_tree_host_unittest_context.cc
index e7429b2..55b84af 100644
--- a/cc/trees/layer_tree_host_unittest_context.cc
+++ b/cc/trees/layer_tree_host_unittest_context.cc
@@ -888,8 +888,8 @@
     gpu::gles2::GLES2Interface* gl = child_context_provider_->ContextGL();
 
     ResourceId resource = child_resource_provider_->CreateResource(
-        gfx::Size(4, 4), ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888,
-        gfx::ColorSpace());
+        gfx::Size(4, 4), ResourceProvider::TEXTURE_HINT_IMMUTABLE,
+        viz::RGBA_8888, gfx::ColorSpace());
     ResourceProvider::ScopedWriteLockGL lock(child_resource_provider_.get(),
                                              resource, false);
 
diff --git a/cc/trees/layer_tree_settings.cc b/cc/trees/layer_tree_settings.cc
index b11b107..5586f35 100644
--- a/cc/trees/layer_tree_settings.cc
+++ b/cc/trees/layer_tree_settings.cc
@@ -4,7 +4,7 @@
 
 #include "cc/trees/layer_tree_settings.h"
 
-#include "cc/resources/platform_color.h"
+#include "components/viz/common/resources/platform_color.h"
 #include "third_party/khronos/GLES2/gl2.h"
 
 namespace cc {
@@ -19,7 +19,7 @@
       software_memory_policy(128 * 1024 * 1024,
                              gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE,
                              ManagedMemoryPolicy::kDefaultNumResourcesLimit),
-      preferred_tile_format(PlatformColor::BestTextureFormat()) {}
+      preferred_tile_format(viz::PlatformColor::BestTextureFormat()) {}
 
 LayerTreeSettings::LayerTreeSettings(const LayerTreeSettings& other) = default;
 LayerTreeSettings::~LayerTreeSettings() = default;
diff --git a/cc/trees/layer_tree_settings.h b/cc/trees/layer_tree_settings.h
index 7010581..a154d9b 100644
--- a/cc/trees/layer_tree_settings.h
+++ b/cc/trees/layer_tree_settings.h
@@ -14,10 +14,10 @@
 #include "cc/debug/layer_tree_debug_state.h"
 #include "cc/output/managed_memory_policy.h"
 #include "cc/output/renderer_settings.h"
-#include "cc/resources/resource_format.h"
 #include "cc/resources/resource_settings.h"
 #include "cc/scheduler/scheduler_settings.h"
 #include "cc/tiles/tile_manager_settings.h"
+#include "components/viz/common/quads/resource_format.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/gfx/geometry/size.h"
 
@@ -88,7 +88,7 @@
   size_t decoded_image_cache_budget_bytes = 128 * 1024 * 1024;
   size_t decoded_image_working_set_budget_bytes = 128 * 1024 * 1024;
   int max_preraster_distance_in_screen_pixels = 1000;
-  ResourceFormat preferred_tile_format;
+  viz::ResourceFormat preferred_tile_format;
 
   bool enable_color_correct_rasterization = false;
 
diff --git a/chrome/VERSION b/chrome/VERSION
index c1e4964..1bb73ad 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=61
 MINOR=0
-BUILD=3152
+BUILD=3154
 PATCH=0
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarContainerLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarContainerLayout.java
index fd259f0..82c333b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarContainerLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarContainerLayout.java
@@ -15,8 +15,6 @@
 import android.view.Gravity;
 import android.view.MotionEvent;
 import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewGroup.LayoutParams;
 import android.widget.FrameLayout;
 
 import org.chromium.base.ObserverList;
@@ -24,7 +22,6 @@
 import org.chromium.chrome.browser.infobar.InfoBarContainer.InfoBarAnimationListener;
 
 import java.util.ArrayList;
-import java.util.List;
 
 /**
  * Layout that displays infobars in a stack. Handles all the animations when adding or removing
@@ -115,15 +112,6 @@
         Resources res = context.getResources();
         mBackInfobarHeight = res.getDimensionPixelSize(R.dimen.infobar_peeking_height);
         mFloatingBehavior = new FloatingBehavior(this);
-        mBackgroundPeekSize = getResources().getDimensionPixelSize(R.dimen.infobar_compact_size);
-        mInfoBarShadowHeight = getResources().getDimensionPixelSize(R.dimen.infobar_shadow_height);
-    }
-
-    @Override
-    public void onAttachedToWindow() {
-        super.onAttachedToWindow();
-
-        mBottomContainer = (ViewGroup) getRootView().findViewById(R.id.bottom_container);
     }
 
     /**
@@ -187,20 +175,10 @@
 
     // Animation durations.
     private static final int DURATION_SLIDE_UP_MS = 250;
-    private static final int DURATION_PEEK_MS = 500;
     private static final int DURATION_SLIDE_DOWN_MS = 250;
     private static final int DURATION_FADE_MS = 100;
     private static final int DURATION_FADE_OUT_MS = 200;
 
-    /** The height that an infobar will peek when being added behind another one. */
-    private final int mBackgroundPeekSize;
-
-    /** The height of the shadow that sits above the infobar. */
-    private final int mInfoBarShadowHeight;
-
-    /** The bottom container that the infobar container sits inside of. */
-    private ViewGroup mBottomContainer;
-
     /**
      * Base class for animations inside the InfoBarContainerLayout.
      *
@@ -237,10 +215,11 @@
          * value to endValue and updates the side shadow positions on each frame.
          */
         ValueAnimator createTranslationYAnimator(final InfoBarWrapper wrapper, float endValue) {
-            ValueAnimator animator = ObjectAnimator.ofFloat(wrapper, View.TRANSLATION_Y, endValue);
+            ValueAnimator animator = ValueAnimator.ofFloat(wrapper.getTranslationY(), endValue);
             animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                 @Override
                 public void onAnimationUpdate(ValueAnimator animation) {
+                    wrapper.setTranslationY((float) animation.getAnimatedValue());
                     mFloatingBehavior.updateShadowPosition();
                 }
             });
@@ -428,39 +407,14 @@
 
         @Override
         Animator createAnimator() {
-            AnimatorSet set = new AnimatorSet();
-            List<Animator> animators = new ArrayList<>();
-
             mAppearingWrapper.setTranslationY(mAppearingWrapper.getHeight());
-            mAppearingWrapper.setRestrictHeightForAnimation(true);
-            mAppearingWrapper.setHeightForAnimation(mInfoBarShadowHeight + mBackgroundPeekSize);
-            mAppearingWrapper.addView(mAppearingWrapper.getItem().getView());
-            ValueAnimator animator = createTranslationYAnimator(
-                    mAppearingWrapper, mBackInfobarHeight - mBackgroundPeekSize);
-            animators.add(animator);
-
-            animators.add(createTranslationYAnimator(mAppearingWrapper, 0));
-
-            // When the infobar container is running this specific animation, do not clip the
-            // children so the infobars can animate outside their container.
-            set.addListener(new AnimatorListenerAdapter() {
-                @Override
-                public void onAnimationStart(Animator animation) {
-                    setHierarchyClipsChildren(false);
-                }
-            });
-
-            set.playSequentially(animators);
-            set.setDuration(DURATION_PEEK_MS);
-
-            return set;
+            return createTranslationYAnimator(mAppearingWrapper, 0f)
+                    .setDuration(DURATION_SLIDE_UP_MS);
         }
 
         @Override
         public void onAnimationEnd() {
-            mAppearingWrapper.setRestrictHeightForAnimation(false);
             mAppearingWrapper.removeView(mAppearingWrapper.getItem().getView());
-            setHierarchyClipsChildren(true);
         }
 
         @Override
@@ -470,17 +424,6 @@
     }
 
     /**
-     * Used to set the relevant view hierarchy to not clip its children. This is used during
-     * animation so views can draw outside the normal bounds.
-     * @param clip Whether or not to clip child views.
-     */
-    private void setHierarchyClipsChildren(boolean clip) {
-        setClipChildren(clip);
-        ((ViewGroup) getParent()).setClipChildren(clip);
-        mBottomContainer.setClipChildren(clip);
-    }
-
-    /**
      * The animation to hide the front infobar and reveal the second-to-front infobar. The front
      * infobar slides down and off the screen. The back infobar(s) will adjust to the size of the
      * new front infobar, and then the new front infobar's contents will fade in.
@@ -899,10 +842,7 @@
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
         widthMeasureSpec = mFloatingBehavior.beforeOnMeasure(widthMeasureSpec);
         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-
-        // Make sure the shadow is tall enough to compensate for the peek animation of other
-        // infboars.
-        mFloatingBehavior.afterOnMeasure(getMeasuredHeight() + mBackgroundPeekSize);
+        mFloatingBehavior.afterOnMeasure(getMeasuredHeight());
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarWrapper.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarWrapper.java
index c64ded9e..f0c5e8c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarWrapper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarWrapper.java
@@ -19,15 +19,6 @@
 
     private final InfoBarContainerLayout.Item mItem;
 
-    /** Whether or not the height of the layout should be restricted for animations. */
-    private boolean mRestrictHeightForAnimation;
-
-    /**
-     * The height in px that this view will be restricted to if
-     * {@link #mRestrictHeightForAnimation} is set.
-     */
-    private int mHeightForAnimationPx;
-
     /**
      * Constructor for inflating from Java.
      */
@@ -42,22 +33,6 @@
         // setBackgroundResource() changes the padding, so call setPadding() second.
         setBackgroundResource(R.drawable.infobar_wrapper_bg);
         setPadding(0, shadowHeight, 0, 0);
-        setClipChildren(true);
-    }
-
-    /**
-     * @param restrict Whether or not the height of this view should be restricted for animations.
-     */
-    public void setRestrictHeightForAnimation(boolean restrict) {
-        mRestrictHeightForAnimation = restrict;
-    }
-
-    /**
-     * @param heightPx The restricted height in px that will be used if
-     *                 {@link #mRestrictHeightForAnimation} is set.
-     */
-    public void setHeightForAnimation(int heightPx) {
-        mHeightForAnimationPx = heightPx;
     }
 
     InfoBarContainerLayout.Item getItem() {
@@ -65,16 +40,6 @@
     }
 
     @Override
-    public void onMeasure(int widthSpec, int heightSpec) {
-        if (mRestrictHeightForAnimation) {
-            int heightPx = Math.min(mHeightForAnimationPx, MeasureSpec.getSize(heightSpec));
-            heightSpec = MeasureSpec.makeMeasureSpec(heightPx, MeasureSpec.getMode(heightSpec));
-        }
-
-        super.onMeasure(widthSpec, heightSpec);
-    }
-
-    @Override
     public void onViewAdded(View child) {
         child.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT,
                 Gravity.TOP));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java
index 5786caf..fdc2049 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java
@@ -980,6 +980,8 @@
         unregisterDaydreamIntent(mVrDaydreamApi);
         if (mVrSupportLevel == VR_NOT_AVAILABLE) return;
 
+        if (mInVr) mVSyncEstimator.pause();
+
         cancelPendingVrEntry();
 
         // When the active web page has a vrdisplayactivate event handler,
@@ -1000,10 +1002,7 @@
         cancelPendingVrEntry();
         // We defer pausing of VrShell until the app is stopped to keep head tracking working for
         // as long as possible while going to daydream home.
-        if (mInVr) {
-            mVrShell.pause();
-            mVSyncEstimator.pause();
-        }
+        if (mInVr) mVrShell.pause();
         if (mShowingDaydreamDoff || mProbablyInDon) return;
 
         // TODO(mthiesse): When the user resumes Chrome in a 2D context, we don't want to tear down
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDirectoryManager.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDirectoryManager.java
index a811afa..5d7631d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDirectoryManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDirectoryManager.java
@@ -111,28 +111,24 @@
             }
         }
 
-        if (webappBaseDirectory != null) {
-            // Delete all web app directories in the main directory, which were for pre-L web apps.
-            File appDirectory = new File(context.getApplicationInfo().dataDir);
-            String webappDirectoryAppBaseName = webappBaseDirectory.getName();
-            File[] files = appDirectory.listFiles();
-            if (files != null) {
-                for (File file : files) {
-                    String filename = file.getName();
-                    if (!filename.startsWith(webappDirectoryAppBaseName)) continue;
-                    if (filename.length() == webappDirectoryAppBaseName.length()) continue;
-                    directoriesToDelete.add(file);
-                }
+        // Delete all web app directories in the main directory, which were for pre-L web apps.
+        File appDirectory = new File(context.getApplicationInfo().dataDir);
+        String webappDirectoryAppBaseName = webappBaseDirectory.getName();
+        File[] files = appDirectory.listFiles();
+        if (files != null) {
+            for (File file : files) {
+                String filename = file.getName();
+                if (!filename.startsWith(webappDirectoryAppBaseName)) continue;
+                if (filename.length() == webappDirectoryAppBaseName.length()) continue;
+                directoriesToDelete.add(file);
             }
+        }
 
-            // Clean out web app directories no longer corresponding to tasks in Recents.
-            if (webappBaseDirectory.exists()) {
-                files = webappBaseDirectory.listFiles();
-                if (files != null) {
-                    for (File file : files) {
-                        if (!liveWebapps.contains(file.getName())) directoriesToDelete.add(file);
-                    }
-                }
+        // Clean out web app directories no longer corresponding to tasks in Recents.
+        files = webappBaseDirectory.listFiles();
+        if (files != null) {
+            for (File file : files) {
+                if (!liveWebapps.contains(file.getName())) directoriesToDelete.add(file);
             }
         }
     }
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index 54baa96..1991bbc3 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -1636,6 +1636,15 @@
   <message name="IDS_SETTINGS_ON_STARTUP" desc="Name of the on startup page.">
     On startup
   </message>
+  <message name="IDS_SETTINGS_ON_STARTUP_DESCRIPTION" desc="Secondary line for IDS_SETTINGS_ON_STARTUP_MANAGE describing the OnStartup features.">
+    Restore tabs or open specific pages
+  </message>
+  <message name="IDS_SETTINGS_ON_STARTUP_MANAGE" desc="Button label to open subpage for OnStartup URLs and heading for that subpage.">
+    Manage on startup pages
+  </message>
+  <message name="IDS_SETTINGS_ON_STARTUP_PAGES" desc="Label for list of OnStartup URLs.">
+    Pages to open on startup
+  </message>
   <message name="IDS_SETTINGS_ON_STARTUP_OPEN_NEW_TAB" desc="Radio button option to open the new tab page.">
     Open the New Tab page
   </message>
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 0e45042..d2ad4bf2 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -64,6 +64,7 @@
 #include "components/password_manager/core/common/password_manager_features.h"
 #include "components/previews/core/previews_features.h"
 #include "components/proximity_auth/switches.h"
+#include "components/search_provider_logos/features.h"
 #include "components/security_state/core/security_state.h"
 #include "components/security_state/core/switches.h"
 #include "components/signin/core/common/signin_features.h"
@@ -1081,6 +1082,15 @@
     {"14px vertical margin", kOmniboxUIVerticalMargin14px,
      arraysize(kOmniboxUIVerticalMargin14px), nullptr}};
 
+const FeatureEntry::FeatureParam kClientPlaceholdersForServerLoFiEnabled[] = {
+    {"replace_server_placeholders", "true"}};
+
+const FeatureEntry::FeatureVariation
+    kClientPlaceholdersForServerLoFiFeatureVariations[] = {
+        {"(replace Server Lo-Fi placeholders)",
+         kClientPlaceholdersForServerLoFiEnabled,
+         arraysize(kClientPlaceholdersForServerLoFiEnabled), nullptr}};
+
 // RECORDING USER METRICS FOR FLAGS:
 // -----------------------------------------------------------------------------
 // The first line of the entry is the internal name.
@@ -1994,10 +2004,13 @@
     {"enable-offline-previews", flag_descriptions::kEnableOfflinePreviewsName,
      flag_descriptions::kEnableOfflinePreviewsDescription, kOsAndroid,
      FEATURE_VALUE_TYPE(previews::features::kOfflinePreviews)},
-    {"enable-client-lo-fi", flag_descriptions::kEnableClientLoFiName,
-     flag_descriptions::kEnableClientLoFiDescription, kOsAndroid,
-     FEATURE_VALUE_TYPE(previews::features::kClientLoFi)},
 #endif  // OS_ANDROID
+    {"enable-client-lo-fi", flag_descriptions::kEnableClientLoFiName,
+     flag_descriptions::kEnableClientLoFiDescription, kOsAll,
+     FEATURE_WITH_PARAMS_VALUE_TYPE(
+         previews::features::kClientLoFi,
+         kClientPlaceholdersForServerLoFiFeatureVariations,
+         "PreviewsClientLoFi")},
     {"allow-insecure-localhost", flag_descriptions::kAllowInsecureLocalhostName,
      flag_descriptions::kAllowInsecureLocalhostDescription, kOsAll,
      SINGLE_VALUE_TYPE(switches::kAllowInsecureLocalhost)},
@@ -3131,6 +3144,12 @@
      flag_descriptions::kEnableNetworkServiceDescription, kOsAll,
      FEATURE_VALUE_TYPE(features::kNetworkService)},
 
+#if defined(OS_ANDROID)
+    {"use-ddljson-api", flag_descriptions::kUseDdljsonApiName,
+     flag_descriptions::kUseDdljsonApiDescription, kOsAndroid,
+     FEATURE_VALUE_TYPE(search_provider_logos::features::kUseDdljsonApi)},
+#endif  // defined(OS_ANDROID)
+
     // NOTE: Adding new command-line switches requires adding corresponding
     // entries to enum "LoginCustomFlags" in histograms/enums.xml. See note in
     // enums.xml and don't forget to run AboutFlagsHistogramTest unit test.
diff --git a/chrome/browser/android/logo_service.cc b/chrome/browser/android/logo_service.cc
index c2fd971e..feb9ddc 100644
--- a/chrome/browser/android/logo_service.cc
+++ b/chrome/browser/android/logo_service.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/android/logo_service.h"
 
 #include "base/command_line.h"
+#include "base/feature_list.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "chrome/browser/android/chrome_feature_list.h"
@@ -30,17 +31,6 @@
 const char kCachedLogoDirectory[] = "Search Logo";
 const int kDecodeLogoTimeoutSeconds = 30;
 
-// Returns the URL where the doodle can be downloaded, e.g.
-// https://www.google.com/async/newtab_mobile. This depends on the user's
-// Google domain.
-GURL GetGoogleDoodleURL(Profile* profile) {
-  GURL google_base_url(UIThreadSearchTermsData(profile).GoogleBaseURLValue());
-  const char kGoogleDoodleURLPath[] = "async/newtab_mobile";
-  GURL::Replacements replacements;
-  replacements.SetPathStr(kGoogleDoodleURLPath);
-  return google_base_url.ReplaceComponents(replacements);
-}
-
 class LogoDecoderDelegate : public ImageDecoder::ImageRequest {
  public:
   LogoDecoderDelegate(
@@ -139,22 +129,25 @@
         profile_->GetRequestContext(), base::MakeUnique<ChromeLogoDelegate>());
   }
 
-  GURL url = use_fixed_logo ? logo_url : GetGoogleDoodleURL(profile_);
-  auto parse_logo_response_callback =
-      use_fixed_logo
-          ? base::Bind(&search_provider_logos::ParseFixedLogoResponse)
-          : base::Bind(&search_provider_logos::GoogleParseLogoResponse);
+  if (use_fixed_logo) {
+    logo_tracker_->SetServerAPI(
+        logo_url, base::Bind(&search_provider_logos::ParseFixedLogoResponse),
+        base::Bind(&search_provider_logos::UseFixedLogoUrl));
+  } else {
+    GURL google_base_url =
+        GURL(UIThreadSearchTermsData(profile_).GoogleBaseURLValue());
 
-  bool use_gray_background =
-      !base::FeatureList::IsEnabled(chrome::android::kChromeHomeFeature);
-  auto append_query_params_callback =
-      use_fixed_logo
-          ? base::Bind(&search_provider_logos::UseFixedLogoUrl)
-          : base::Bind(&search_provider_logos::GoogleAppendQueryparamsToLogoURL,
-                       use_gray_background);
+    bool use_gray_background =
+        !base::FeatureList::IsEnabled(chrome::android::kChromeHomeFeature);
 
-  logo_tracker_->SetServerAPI(url, parse_logo_response_callback,
-                              append_query_params_callback);
+    logo_tracker_->SetServerAPI(
+        search_provider_logos::GetGoogleDoodleURL(google_base_url),
+        search_provider_logos::GetGoogleParseLogoResponseCallback(
+            google_base_url),
+        search_provider_logos::GetGoogleAppendQueryparamsCallback(
+            use_gray_background));
+  }
+
   logo_tracker_->GetLogo(observer);
 }
 
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
index c1ffa1c3b..0cdfbea 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
@@ -4,6 +4,8 @@
 
 #include "chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h"
 
+#include <stdint.h>
+
 #include <set>
 #include <string>
 #include <utility>
@@ -193,8 +195,8 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   net::CookieStore* cookie_store =
       rq_context->GetURLRequestContext()->cookie_store();
-  cookie_store->DeleteAllCreatedBetweenAsync(delete_begin, delete_end,
-                                             IgnoreArgument<int>(callback));
+  cookie_store->DeleteAllCreatedBetweenAsync(
+      delete_begin, delete_end, IgnoreArgument<uint32_t>(callback));
 }
 
 void ClearCookiesWithPredicateOnIOThread(
@@ -207,7 +209,7 @@
   net::CookieStore* cookie_store =
       rq_context->GetURLRequestContext()->cookie_store();
   cookie_store->DeleteAllCreatedBetweenWithPredicateAsync(
-      delete_begin, delete_end, predicate, IgnoreArgument<int>(callback));
+      delete_begin, delete_end, predicate, IgnoreArgument<uint32_t>(callback));
 }
 
 void ClearNetworkPredictorOnIOThread(chrome_browser_net::Predictor* predictor) {
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc
index 05c1b04e..3fe46b93 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc
@@ -4,6 +4,8 @@
 
 #include "chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h"
 
+#include <stdint.h>
+
 #include "base/guid.h"
 #include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
@@ -233,7 +235,7 @@
 };
 
 void RunClosureAfterCookiesCleared(const base::Closure& task,
-                                   int cookies_deleted) {
+                                   uint32_t cookies_deleted) {
   task.Run();
 }
 
diff --git a/chrome/browser/chrome_content_gpu_manifest_overlay.json b/chrome/browser/chrome_content_gpu_manifest_overlay.json
index 7e275bf..6f9513d 100644
--- a/chrome/browser/chrome_content_gpu_manifest_overlay.json
+++ b/chrome/browser/chrome_content_gpu_manifest_overlay.json
@@ -6,6 +6,8 @@
         "browser": [
           "arc::mojom::VideoDecodeAccelerator",
           "arc::mojom::VideoDecodeClient",
+          "arc::mojom::VideoEncodeAccelerator",
+          "arc::mojom::VideoEncodeClient",
           "chrome::mojom::ResourceUsageReporter"
         ]
       }
diff --git a/chrome/browser/chromeos/arc/video/gpu_arc_video_service_host.cc b/chrome/browser/chromeos/arc/video/gpu_arc_video_service_host.cc
index 75b859203..70b43767 100644
--- a/chrome/browser/chromeos/arc/video/gpu_arc_video_service_host.cc
+++ b/chrome/browser/chromeos/arc/video/gpu_arc_video_service_host.cc
@@ -31,6 +31,11 @@
   content::BindInterfaceInGpuProcess(std::move(request));
 }
 
+void ConnectToVideoEncodeAcceleratorOnIOThread(
+    mojom::VideoEncodeAcceleratorRequest request) {
+  content::BindInterfaceInGpuProcess(std::move(request));
+}
+
 }  // namespace
 
 class VideoAcceleratorFactoryService : public mojom::VideoAcceleratorFactory {
@@ -47,7 +52,10 @@
 
   void CreateEncodeAccelerator(
       mojom::VideoEncodeAcceleratorRequest request) override {
-    // TODO(owenlin): Implement this function.
+    content::BrowserThread::PostTask(
+        content::BrowserThread::IO, FROM_HERE,
+        base::BindOnce(&ConnectToVideoEncodeAcceleratorOnIOThread,
+                       base::Passed(&request)));
   }
 
  private:
diff --git a/chrome/browser/chromeos/attestation/platform_verification_impl.cc b/chrome/browser/chromeos/attestation/platform_verification_impl.cc
index 13640901..f6aee0b4 100644
--- a/chrome/browser/chromeos/attestation/platform_verification_impl.cc
+++ b/chrome/browser/chromeos/attestation/platform_verification_impl.cc
@@ -41,7 +41,7 @@
 void PlatformVerificationImpl::ChallengePlatform(
     const std::string& service_id,
     const std::string& challenge,
-    const ChallengePlatformCallback& callback) {
+    ChallengePlatformCallback callback) {
   DVLOG(2) << __FUNCTION__;
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
@@ -50,12 +50,13 @@
 
   platform_verification_flow_->ChallengePlatformKey(
       content::WebContents::FromRenderFrameHost(render_frame_host_), service_id,
-      challenge, base::Bind(&PlatformVerificationImpl::OnPlatformChallenged,
-                            weak_factory_.GetWeakPtr(), callback));
+      challenge,
+      base::Bind(&PlatformVerificationImpl::OnPlatformChallenged,
+                 weak_factory_.GetWeakPtr(), base::Passed(&callback)));
 }
 
 void PlatformVerificationImpl::OnPlatformChallenged(
-    const ChallengePlatformCallback& callback,
+    ChallengePlatformCallback callback,
     Result result,
     const std::string& signed_data,
     const std::string& signature,
@@ -68,14 +69,15 @@
     DCHECK(signature.empty());
     DCHECK(platform_key_certificate.empty());
     LOG(ERROR) << "Platform verification failed.";
-    callback.Run(false, "", "", "");
+    std::move(callback).Run(false, "", "", "");
     return;
   }
 
   DCHECK(!signed_data.empty());
   DCHECK(!signature.empty());
   DCHECK(!platform_key_certificate.empty());
-  callback.Run(true, signed_data, signature, platform_key_certificate);
+  std::move(callback).Run(true, signed_data, signature,
+                          platform_key_certificate);
 }
 
 }  // namespace attestation
diff --git a/chrome/browser/chromeos/attestation/platform_verification_impl.h b/chrome/browser/chromeos/attestation/platform_verification_impl.h
index fe9032b..f0bb6c9 100644
--- a/chrome/browser/chromeos/attestation/platform_verification_impl.h
+++ b/chrome/browser/chromeos/attestation/platform_verification_impl.h
@@ -33,12 +33,12 @@
   // mojo::InterfaceImpl<PlatformVerification> implementation.
   void ChallengePlatform(const std::string& service_id,
                          const std::string& challenge,
-                         const ChallengePlatformCallback& callback) override;
+                         ChallengePlatformCallback callback) override;
 
  private:
   using Result = PlatformVerificationFlow::Result;
 
-  void OnPlatformChallenged(const ChallengePlatformCallback& callback,
+  void OnPlatformChallenged(ChallengePlatformCallback callback,
                             Result result,
                             const std::string& signed_data,
                             const std::string& signature,
diff --git a/chrome/browser/chromeos/login/lock/webui_screen_locker.cc b/chrome/browser/chromeos/login/lock/webui_screen_locker.cc
index 6e109bc..532b557e 100644
--- a/chrome/browser/chromeos/login/lock/webui_screen_locker.cc
+++ b/chrome/browser/chromeos/login/lock/webui_screen_locker.cc
@@ -40,6 +40,7 @@
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_ui.h"
 #include "ui/aura/client/capture_client.h"
+#include "ui/aura/window.h"
 #include "ui/aura/window_event_dispatcher.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/x/x11_util.h"
diff --git a/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc b/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc
index 05ca164..93df4fd4 100644
--- a/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc
+++ b/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc
@@ -20,6 +20,7 @@
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/grit/chromium_strings.h"
+#include "content/public/browser/desktop_capture.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/web_contents.h"
@@ -119,12 +120,10 @@
           screen_list = base::MakeUnique<DesktopMediaListAsh>(
               DesktopMediaID::TYPE_SCREEN);
 #else   // !defined(USE_ASH)
-          webrtc::DesktopCaptureOptions capture_options =
-              webrtc::DesktopCaptureOptions::CreateDefault();
-          capture_options.set_disable_effects(false);
           screen_list = base::MakeUnique<NativeDesktopMediaList>(
-              DesktopMediaID::TYPE_SCREEN,
-              webrtc::DesktopCapturer::CreateScreenCapturer(capture_options));
+              content::DesktopMediaID::TYPE_SCREEN,
+              webrtc::DesktopCapturer::CreateScreenCapturer(
+                  content::CreateDesktopCaptureOptions()));
 #endif  // !defined(USE_ASH)
         }
         have_screen_list = true;
@@ -149,12 +148,10 @@
           // windows) created here cannot share the same DesktopCaptureOptions
           // instance. DesktopCaptureOptions owns X connection, which cannot be
           // used on multiple threads concurrently.
-          webrtc::DesktopCaptureOptions capture_options =
-              webrtc::DesktopCaptureOptions::CreateDefault();
-          capture_options.set_disable_effects(false);
           window_list = base::MakeUnique<NativeDesktopMediaList>(
-              DesktopMediaID::TYPE_WINDOW,
-              webrtc::DesktopCapturer::CreateWindowCapturer(capture_options));
+              content::DesktopMediaID::TYPE_WINDOW,
+              webrtc::DesktopCapturer::CreateWindowCapturer(
+                  content::CreateDesktopCaptureOptions()));
 #endif  // !defined(USE_ASH)
         }
         have_window_list = true;
diff --git a/chrome/browser/favicon/content_favicon_driver_browsertest.cc b/chrome/browser/favicon/content_favicon_driver_browsertest.cc
index b0182bf..957545e6 100644
--- a/chrome/browser/favicon/content_favicon_driver_browsertest.cc
+++ b/chrome/browser/favicon/content_favicon_driver_browsertest.cc
@@ -54,13 +54,6 @@
 
  private:
   // content::ResourceDispatcherHostDelegate:
-  bool ShouldBeginRequest(const std::string& method,
-                          const GURL& url,
-                          content::ResourceType resource_type,
-                          content::ResourceContext* resource_context) override {
-    return true;
-  }
-
   void RequestBeginning(net::URLRequest* request,
                         content::ResourceContext* resource_context,
                         content::AppCacheService* appcache_service,
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 912f646ce..672ffc3 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -6,52 +6,511 @@
 
 namespace flag_descriptions {
 
-const char kBrowserSideNavigationName[] = "Enable browser side navigation";
+const char kAccelerated2dCanvasName[] = "Accelerated 2D canvas";
+const char kAccelerated2dCanvasDescription[] =
+    "Enables the use of the GPU to perform 2d canvas rendering instead of "
+    "using software rendering.";
 
+const char kAcceleratedVideoDecodeName[] = "Hardware-accelerated video decode";
+const char kAcceleratedVideoDecodeDescription[] =
+    "Hardware-accelerated video decode where available.";
+
+const char kAffiliationBasedMatchingName[] =
+    "Affiliation based matching in password manager";
+const char kAffiliationBasedMatchingDescription[] =
+    "Allow credentials stored for Android applications to be filled into "
+    "corresponding websites.";
+
+const char kAllowInsecureLocalhostName[] =
+    "Allow invalid certificates for resources loaded from localhost.";
+const char kAllowInsecureLocalhostDescription[] =
+    "Allows requests to localhost over HTTPS even when an invalid certificate "
+    "is presented.";
+
+const char kAllowNaclSocketApiName[] = "NaCl Socket API.";
+const char kAllowNaclSocketApiDescription[] =
+    "Allows applications to use NaCl Socket API. Use only to test NaCl "
+    "plugins.";
+
+const char kAppBannersName[] = "App Banners";
+const char kAppBannersDescription[] =
+    "Enable the display of Progressive Web App banners, which prompt a user to "
+    "add a web app to their shelf, or other platform-specific equivalent.";
+
+const char kAutoplayPolicyName[] = "Autoplay policy";
+const char kAutoplayPolicyDescription[] =
+    "Policy used when deciding if audio or video is allowed to autoplay.";
+
+const char kAutoplayPolicyUserGestureRequiredForCrossOrigin[] =
+    "User gesture is required for cross-origin iframes.";
+const char kAutoplayPolicyNoUserGestureRequired[] =
+    "No user gesture is required.";
+const char kAutoplayPolicyUserGestureRequired[] = "User gesture is required.";
+const char kAutoplayPolicyDocumentUserActivation[] =
+    "Document user activation is required.";
+
+const char kBackgroundVideoTrackOptimizationName[] =
+    "Optimize background video playback.";
+const char kBackgroundVideoTrackOptimizationDescription[] =
+    "Disable video tracks when the video is played in the background to "
+    "optimize performance.";
+
+const char kBleAdvertisingInExtensionsName[] = "BLE Advertising in Chrome Apps";
+const char kBleAdvertisingInExtensionsDescription[] =
+    "Enables BLE Advertising in Chrome Apps. BLE Advertising might interfere "
+    "with regular use of Bluetooth Low Energy features.";
+
+const char kBrowserSideNavigationName[] = "Enable browser side navigation";
 const char kBrowserSideNavigationDescription[] =
     "Enable browser side navigation (aka PlzNavigate).";
 
-//  Material Design version of chrome://bookmarks
+const char kBrowserTaskSchedulerName[] = "Task Scheduler";
+const char kBrowserTaskSchedulerDescription[] =
+    "Enables redirection of some task posting APIs to the task scheduler.";
+
+const char kBypassAppBannerEngagementChecksName[] =
+    "Bypass user engagement checks";
+const char kBypassAppBannerEngagementChecksDescription[] =
+    "Bypasses user engagement checks for displaying app banners, such as "
+    "requiring that users have visited the site before and that the banner "
+    "hasn't been shown recently. This allows developers to test that other "
+    "eligibility requirements for showing app banners, such as having a "
+    "manifest, are met.";
+
+const char kCaptureThumbnailOnLoadFinishedName[] =
+    "Capture page thumbnail on load finished";
+const char kCaptureThumbnailOnLoadFinishedDescription[] =
+    "Capture a page thumbnail (for use on the New Tab page) when the page load "
+    "finishes, in addition to other times a thumbnail may be captured.";
+
+const char kCastStreamingHwEncodingName[] =
+    "Cast Streaming hardware video encoding";
+const char kCastStreamingHwEncodingDescription[] =
+    "This option enables support in Cast Streaming for encoding video streams "
+    "using platform hardware.";
+
+const char kCloudImportName[] = "Cloud Import";
+const char kCloudImportDescription[] = "Allows the cloud-import feature.";
+
+const char kColorCorrectRenderingName[] = "Color correct rendering";
+const char kColorCorrectRenderingDescription[] =
+    "Enables color correct rendering of web content.";
+
+const char kCompositedLayerBordersName[] = "Composited render layer borders";
+const char kCompositedLayerBordersDescription[] =
+    "Renders a border around composited Render Layers to help debug and study "
+    "layer compositing.";
+
+const char kContextualSuggestionsCarouselName[] =
+    "Enable Contextual Suggestions";
+const char kContextualSuggestionsCarouselDescription[] =
+    "If enabled, shows contextual suggestions in a horizontal carousel in "
+    "bottom sheet content.";
+
+const char kCreditCardAssistName[] = "Credit Card Assisted Filling";
+const char kCreditCardAssistDescription[] =
+    "Enable assisted credit card filling on certain sites.";
+
+const char kCrossProcessGuestViewIsolationName[] =
+    "Cross process frames for guests";
+const char kCrossProcessGuestViewIsolationDescription[] =
+    "Highly experimental where guests such as &lt;webview> are implemented on "
+    "the out-of-process iframe infrastructure.";
+
+const char kDataReductionProxyCarrierTestName[] =
+    "Enable a carrier-specific Data Reduction Proxy for testing.";
+const char kDataReductionProxyCarrierTestDescription[] =
+    "Use a carrier-specific Data Reduction Proxy for testing.";
+
+const char kDataReductionProxyLoFiName[] = "Data Saver Lo-Fi mode";
+const char kDataReductionProxyLoFiDescription[] =
+    "Forces Data Saver Lo-Fi mode to be always enabled, enabled only on "
+    "cellular connections, or disabled. Data Saver must be enabled for Lo-Fi "
+    "mode to be used.";
+const char kDataReductionProxyLoFiAlwaysOn[] = "Always on";
+const char kDataReductionProxyLoFiCellularOnly[] = "Cellular only";
+const char kDataReductionProxyLoFiDisabled[] = "Disable";
+const char kDataReductionProxyLoFiSlowConnectionsOnly[] =
+    "Slow connections only";
+
+const char kDatasaverPromptName[] = "Cellular Data Saver Prompt";
+const char kDatasaverPromptDescription[] =
+    "Enables a prompt, which appears when a cellular network connection is "
+    "detected, to take the user to the Data Saver extension page on Chrome Web "
+    "Store.";
+const char kDatasaverPromptDemoMode[] = "Demo mode";
+
+const char kDebugPackedAppName[] = "Debugging for packed apps";
+const char kDebugPackedAppDescription[] =
+    "Enables debugging context menu options such as Inspect Element for packed "
+    "applications.";
+
+const char kDefaultTileHeightName[] = "Default tile height";
+const char kDefaultTileHeightDescription[] = "Specify the default tile height.";
+const char kDefaultTileHeightShort[] = "128";
+const char kDefaultTileHeightTall[] = "256";
+const char kDefaultTileHeightGrande[] = "512";
+const char kDefaultTileHeightVenti[] = "1024";
+
+const char kDefaultTileWidthName[] = "Default tile width";
+const char kDefaultTileWidthDescription[] = "Specify the default tile width.";
+const char kDefaultTileWidthShort[] = "128";
+const char kDefaultTileWidthTall[] = "256";
+const char kDefaultTileWidthGrande[] = "512";
+const char kDefaultTileWidthVenti[] = "1024";
+
+const char kDebugShortcutsName[] = "Debugging keyboard shortcuts";
+const char kDebugShortcutsDescription[] =
+    "Enables additional keyboard shortcuts that are useful for debugging Ash.";
+
+const char kDeviceDiscoveryNotificationsName[] =
+    "Device Discovery Notifications";
+const char kDeviceDiscoveryNotificationsDescription[] =
+    "Device discovery notifications on local network.";
+
+const char kDevtoolsExperimentsName[] = "Developer Tools experiments";
+const char kDevtoolsExperimentsDescription[] =
+    "Enables Developer Tools experiments. Use Settings panel in Developer "
+    "Tools to toggle individual experiments.";
+
+const char kDisableAudioForDesktopShareName[] =
+    "Disable Audio For Desktop Share";
+const char kDisableAudioForDesktopShareDescription[] =
+    "With this flag on, desktop share picker window will not let the user "
+    "choose whether to share audio.";
+
+const char kDisableNightLightName[] = "Disable Night Light";
+const char kDisableNightLightDescription[] =
+    "Disable the Night Light feature which controls the color temperature of "
+    "the screen.";
+
+const char kDisableTabForDesktopShareName[] =
+    "Disable Desktop Share with tab source";
+const char kDisableTabForDesktopShareDescription[] =
+    "This flag controls whether users can choose a tab for desktop share.";
+
+const char kDisallowDocWrittenScriptsUiName[] =
+    "Block scripts loaded via document.write";
+const char kDisallowDocWrittenScriptsUiDescription[] =
+    "Disallows fetches for third-party parser-blocking scripts inserted into "
+    "the main frame via document.write.";
+
+const char kDisplayList2dCanvasName[] = "Display list 2D canvas";
+const char kDisplayList2dCanvasDescription[] =
+    "Enables the use of display lists to record 2D canvas commands. This "
+    "allows 2D canvas rasterization to be performed on separate thread.";
+
+const char kDistanceFieldTextName[] = "Distance field text";
+const char kDistanceFieldTextDescription[] =
+    "Text is rendered with signed distance fields rather than bitmap alpha "
+    "masks.";
+
+const char kDriveSearchInChromeLauncherName[] =
+    "Drive Search in Chrome App Launcher";
+const char kDriveSearchInChromeLauncherDescription[] =
+    "Files from Drive will show up when searching the Chrome App Launcher.";
+
+const char kDropSyncCredentialName[] =
+    "Drop sync credentials from password manager";
+const char kDropSyncCredentialDescription[] =
+    "The password manager will not offer to save the credential used to sync.";
+
+const char kEasyUnlockBluetoothLowEnergyDiscoveryName[] =
+    "Smart Lock Bluetooth Low Energy Discovery";
+const char kEasyUnlockBluetoothLowEnergyDiscoveryDescription[] =
+    "Enables a Smart Lock setting that allows Chromebook to discover phones "
+    "over Bluetooth Low Energy in order to unlock the Chromebook when the "
+    "phone is in its proximity.";
+
+const char kEasyUnlockProximityDetectionName[] =
+    "Smart Lock proximity detection";
+const char kEasyUnlockProximityDetectionDescription[] =
+    "Enables a Smart Lock setting that restricts unlocking to only work when "
+    "your phone is very close to (roughly, within an arm's length of) the "
+    "Chrome device.";
+
+const char kEmbeddedExtensionOptionsName[] = "Embedded extension options";
+const char kEmbeddedExtensionOptionsDescription[] =
+    "Display extension options as an embedded element in chrome://extensions "
+    "rather than opening a new tab.";
+
+const char kEnableAsmWasmName[] =
+    "Experimental Validate Asm.js and convert to WebAssembly when valid.";
+const char kEnableAsmWasmDescription[] =
+    R"*(Validate Asm.js when "use asm" is present and then convert to )*"
+    R"*(WebAssembly.)*";
+
+const char kEnableAutofillCreditCardBankNameDisplayName[] =
+    "Display the issuer bank name of a credit card in autofill.";
+const char kEnableAutofillCreditCardBankNameDisplayDescription[] =
+    "If enabled, displays the issuer bank name of a credit card in autofill.";
+
+const char kEnableAutofillCreditCardLastUsedDateDisplayName[] =
+    "Display the last used date of a credit card in autofill.";
+const char kEnableAutofillCreditCardLastUsedDateDisplayDescription[] =
+    "If enabled, display the last used date of a credit card in autofill.";
+
+const char kEnableAutofillCreditCardUploadCvcPromptName[] =
+    "Enable requesting missing CVC during Autofill credit card upload";
+const char kEnableAutofillCreditCardUploadCvcPromptDescription[] =
+    "If enabled, requests missing CVC when offering to upload credit cards to "
+    "Google Payments.";
+
+const char kEnableBrotliName[] = "Brotli Content-Encoding.";
+const char kEnableBrotliDescription[] =
+    "Enable Brotli Content-Encoding support.";
+
+const char kEnableClearBrowsingDataCountersName[] =
+    "Enable Clear browsing data counters.";
+const char kEnableClearBrowsingDataCountersDescription[] =
+    "Shows data volume counters in the Clear browsing data dialog.";
+
+const char kEnableClientLoFiName[] = "Client-side Lo-Fi previews";
+
+const char kEnableClientLoFiDescription[] =
+    "Enable showing low fidelity images on some pages on slow networks.";
+
+const char kEnableDataReductionProxyLitePageName[] =
+    "Lite pages for Data Saver Lo-Fi mode";
+const char kEnableDataReductionProxyLitePageDescription[] =
+    "Enable lite pages in Data Saver Lo-Fi mode. Previews of pages will be "
+    "shown instead of image placeholders when Lo-Fi is on. Data Saver and "
+    "Lo-Fi must be enabled for lite pages to be shown.";
+
+const char kDataReductionProxyServerAlternative[] =
+    "Use alternative server configuration";
+const char kEnableDataReductionProxyServerExperimentName[] =
+    "Use an alternative Data Saver back end configuration.";
+const char kEnableDataReductionProxyServerExperimentDescription[] =
+    "Enable a different approach to saving data by configuring the back end "
+    "server";
+
+const char kEnableDataReductionProxySavingsPromoName[] =
+    "Data Saver 1 MB Savings Promo";
+const char kEnableDataReductionProxySavingsPromoDescription[] =
+    "Enable a Data Saver promo for 1 MB of savings. If Data Saver has already "
+    "saved 1 MB of data, then the promo will not be shown. Data Saver must be "
+    "enabled for the promo to be shown.";
+
+const char kEnableEnumeratingAudioDevicesName[] =
+    "Experimentally enable enumerating audio devices.";
+const char kEnableEnumeratingAudioDevicesDescription[] =
+    "Experimentally enable the use of enumerating audio devices.";
+
+const char kEnableGenericSensorName[] = "Generic Sensor";
+const char kEnableGenericSensorDescription[] =
+    "Enable sensor APIs based on Generic Sensor API.";
+
+const char kEnableGroupedHistoryName[] = "Group history by domain";
+const char kEnableGroupedHistoryDescription[] =
+    "Group history by website domain (i.e. google.com) on chrome://history.";
+
+const char kEnableHDRName[] = "HDR mode";
+const char kEnableHDRDescription[] =
+    "Enables HDR support on compatible displays.";
+
+const char kEnableHeapProfilingName[] = "Heap profiling";
+const char kEnableHeapProfilingDescription[] = "Enables heap profiling.";
+const char kEnableHeapProfilingModePseudo[] = "Enabled (pseudo mode)";
+const char kEnableHeapProfilingModeNative[] = "Enabled (native mode)";
+const char kEnableHeapProfilingTaskProfiler[] = "Enabled (task mode)";
+
+const char kEnableHttpFormWarningName[] =
+    "Show in-form warnings for sensitive fields when the top-level page is not "
+    "not HTTPS";
+const char kEnableHttpFormWarningDescription[] =
+    "Attaches a warning UI to any password or credit card fields detected when "
+    "the top-level page is not HTTPS";
+
+const char kEnableIdleTimeSpellCheckingName[] =
+    "Enable idle time spell checker";
+const char kEnableIdleTimeSpellCheckingDescription[] =
+    "Make spell-checking code run only when the browser is idle, so that input "
+    "latency is reduced, especially when editing long articles, emails, etc.";
 
 const char kEnableMaterialDesignBookmarksName[] =
     "Enable Material Design bookmarks";
-
 const char kEnableMaterialDesignBookmarksDescription[] =
     "If enabled, the chrome://bookmarks/ URL loads the Material Design "
     "bookmarks page.";
 
-//  Material Design version of chrome://policy
-
-const char kEnableMaterialDesignPolicyPageName[] =
-    "Enable Material Design policy page";
-
-const char kEnableMaterialDesignPolicyPageDescription[] =
-    "If enabled, the chrome://md-policy URL loads the Material Design policy "
-    "page.";
-
-//  Material Design version of chrome://extensions
-
 const char kEnableMaterialDesignExtensionsName[] =
     "Enable Material Design extensions";
-
 const char kEnableMaterialDesignExtensionsDescription[] =
     "If enabled, the chrome://extensions/ URL loads the Material Design "
     "extensions page.";
 
-//  Material Design version of feedback form
-
 const char kEnableMaterialDesignFeedbackName[] =
     "Enable Material Design feedback";
-
 const char kEnableMaterialDesignFeedbackDescription[] =
     "If enabled, reporting an issue will load the Material Design feedback UI.";
 
-const char kContextualSuggestionsCarouselName[] =
-    "Enable Contextual Suggestions";
+const char kEnableMaterialDesignPolicyPageName[] =
+    "Enable Material Design policy page";
+const char kEnableMaterialDesignPolicyPageDescription[] =
+    "If enabled, the chrome://md-policy URL loads the Material Design policy "
+    "page.";
 
-const char kContextualSuggestionsCarouselDescription[] =
-    "If enabled, shows contextual suggestions in a horizontal carousel in "
-    "bottom sheet content.";
+const char kEnableMidiManagerDynamicInstantiationName[] =
+    "MIDIManager dynamic instantiation for Web MIDI.";
+const char kEnableMidiManagerDynamicInstantiationDescription[] =
+    "Enable MIDIManager dynamic instantiation for Web MIDI.";
+
+const char kEnableNavigationTracingName[] = "Enable navigation tracing";
+const char kEnableNavigationTracingDescription[] =
+    "This is to be used in conjunction with the trace-upload-url flag. "
+    "WARNING: When enabled, Chrome will record performance data for every "
+    "navigation and upload it to the URL specified by the trace-upload-url "
+    "flag. The trace may include personally identifiable information (PII) "
+    "such as the titles and URLs of websites you visit.";
+
+const char kEnableNetworkServiceName[] = "Enable network service";
+const char kEnableNetworkServiceDescription[] =
+    "Enables the network service, which makes network requests through a "
+    "separate service. Note: most features don't work with this yet.";
+
+const char kEnablePictureInPictureName[] = "Enable picture in picture.";
+const char kEnablePictureInPictureDescription[] =
+    "Enable the picture in picture feature for videos.";
+
+const char kEnableTokenBindingName[] = "Token Binding.";
+const char kEnableTokenBindingDescription[] = "Enable Token Binding support.";
+
+const char kEnableUseZoomForDsfName[] =
+    "Use Blink's zoom for device scale factor.";
+const char kEnableUseZoomForDsfDescription[] =
+    "If enabled, Blink uses its zooming mechanism to scale content for device "
+    "scale factor.";
+const char kEnableUseZoomForDsfChoiceDefault[] = "Default";
+const char kEnableUseZoomForDsfChoiceEnabled[] = "Enabled";
+const char kEnableUseZoomForDsfChoiceDisabled[] = "Disabled";
+
+const char kEnableScrollAnchoringName[] = "Scroll Anchoring";
+const char kEnableScrollAnchoringDescription[] =
+    "Adjusts scroll position to prevent visible jumps when offscreen content "
+    "changes.";
+
+const char kEnableSharedArrayBufferName[] =
+    "Experimental enabled SharedArrayBuffer support in JavaScript.";
+const char kEnableSharedArrayBufferDescription[] =
+    "Enable SharedArrayBuffer support in JavaScript.";
+
+const char kEnableWasmName[] = "WebAssembly structured cloning support.";
+const char kEnableWasmDescription[] =
+    "Enable web pages to use WebAssembly structured cloning.";
+
+const char kEnableWebUsbName[] = "WebUSB";
+const char kEnableWebUsbDescription[] = "Enable WebUSB support.";
+
+const char kEnableImageCaptureAPIName[] = "Image Capture API";
+const char kEnableImageCaptureAPIDescription[] =
+    "Enables the Web Platform Image Capture API: takePhoto(), "
+    "getPhotoCapabilities(), etc.";
+
+const char kEnableZeroSuggestRedirectToChromeName[] =
+    "Experimental contextual omnibox suggestion";
+const char kEnableZeroSuggestRedirectToChromeDescription[] =
+    "Change omnibox contextual suggestions to an experimental source. Note "
+    "that this is not an on/off switch for contextual omnibox and it only "
+    "applies to suggestions provided before the user starts typing a URL or a "
+    "search query (i.e. zero suggest).";
+
+const char kEnableWasmStreamingName[] =
+    "WebAssembly streaming compile/instantiate support.";
+const char kEnableWasmStreamingDescription[] =
+    "WebAssembly.{compile|instantiate} taking a Response as parameter.";
+
+const char kEnableWebfontsInterventionName[] =
+    "New version of User Agent Intervention for WebFonts loading.";
+const char kEnableWebfontsInterventionDescription[] =
+    "Enable New version of User Agent Intervention for WebFonts loading.";
+const char kEnableWebfontsInterventionV2ChoiceDefault[] = "Default";
+const char kEnableWebfontsInterventionV2ChoiceEnabledWith2g[] = "Enabled: 2G";
+const char kEnableWebfontsInterventionV2ChoiceEnabledWith3g[] = "Enabled: 3G";
+const char kEnableWebfontsInterventionV2ChoiceEnabledWithSlow2g[] =
+    "Enabled: Slow 2G";
+const char kEnableWebfontsInterventionV2ChoiceDisabled[] = "Disabled";
+
+const char kEnableWebfontsInterventionTriggerName[] =
+    "Trigger User Agent Intervention for WebFonts loading always.";
+const char kEnableWebfontsInterventionTriggerDescription[] =
+    "Enable to trigger User Agent Intervention for WebFonts loading always. "
+    "This flag affects only when the intervention is enabled.";
+
+const char kEnableWebNotificationCustomLayoutsName[] =
+    "Enable custom layouts for Web Notifications.";
+const char kEnableWebNotificationCustomLayoutsDescription[] =
+    "Enable custom layouts for Web Notifications. They will have subtle layout "
+    "improvements that are otherwise not possible.";
+
+const char kExpensiveBackgroundTimerThrottlingName[] =
+    "Throttle expensive background timers";
+const char kExpensiveBackgroundTimerThrottlingDescription[] =
+    "Enables intervention to limit CPU usage of background timers to 1%.";
+
+const char kExperimentalAppBannersName[] = "Experimental app banners";
+const char kExperimentalAppBannersDescription[] =
+    "Enables a new experimental app banner flow and UI";
+
+const char kExperimentalCanvasFeaturesName[] = "Experimental canvas features";
+const char kExperimentalCanvasFeaturesDescription[] =
+    "Enables the use of experimental canvas features which are still in "
+    "development.";
+
+const char kExperimentalExtensionApisName[] = "Experimental Extension APIs";
+const char kExperimentalExtensionApisDescription[] =
+    "Enables experimental extension APIs. Note that the extension gallery "
+    "doesn't allow you to upload extensions that use experimental APIs.";
+
+const char kExperimentalFullscreenExitUIName[] =
+    "Experimental fullscreen exit UI";
+const char kExperimentalFullscreenExitUIDescription[] =
+    "Displays experimental UI to allow mouse and touch input methods to exit "
+    "fullscreen mode.";
+
+const char kExperimentalHotwordHardwareName[] =
+    "Simulated hardware 'Ok Google' features";
+const char kExperimentalHotwordHardwareDescription[] =
+    "Enables an experimental version of 'Ok Google' hotword detection features "
+    "that have a hardware dependency.";
+
+const char kExperimentalKeyboardLockUiName[] = "Experimental keyboard lock UI.";
+const char kExperimentalKeyboardLockUiDescription[] =
+    "An experimental full screen with keyboard lock mode requiring users to "
+    "hold Esc to exit.";
+
+const char kExperimentalSecurityFeaturesName[] =
+    "Potentially annoying security features";
+const char kExperimentalSecurityFeaturesDescription[] =
+    "Enables several security features that will likely break one or more "
+    "pages that you visit on a daily basis. Strict mixed content checking, for "
+    "example. And locking powerful features to secure contexts. This flag will "
+    "probably annoy you.";
+
+const char kExperimentalWebPlatformFeaturesName[] =
+    "Experimental Web Platform features";
+const char kExperimentalWebPlatformFeaturesDescription[] =
+    "Enables experimental Web Platform features that are in development.";
+
+const char kExtensionContentVerificationName[] =
+    "Extension Content Verification";
+const char kExtensionContentVerificationDescription[] =
+    "This flag can be used to turn on verification that the contents of the "
+    "files on disk for extensions from the webstore match what they're "
+    "expected to be. This can be used to turn on this feature if it would not "
+    "otherwise have been turned on, but cannot be used to turn it off (because "
+    "this setting can be tampered with by malware).";
+const char kExtensionContentVerificationBootstrap[] =
+    "Bootstrap (get expected hashes, but do not enforce them)";
+const char kExtensionContentVerificationEnforce[] =
+    "Enforce (try to get hashes, and enforce them if successful)";
+const char kExtensionContentVerificationEnforceStrict[] =
+    "Enforce strict (hard fail if we can't get hashes)";
+
+const char kExtensionsOnChromeUrlsName[] = "Extensions on chrome:// URLs";
+const char kExtensionsOnChromeUrlsDescription[] =
+    "Enables running extensions on chrome:// URLs, where extensions explicitly "
+    "request this permission.";
 
 //  Report URL to SafeSearch
 
@@ -60,21 +519,6 @@
 const char kSafeSearchUrlReportingDescription[] =
     "If enabled, inappropriate URLs can be reported back to SafeSearch.";
 
-//  Device scale factor change in content crbug.com/485650.
-
-const char kEnableUseZoomForDsfName[] =
-    "Use Blink's zoom for device scale factor.";
-
-const char kEnableUseZoomForDsfDescription[] =
-    "If enabled, Blink uses its zooming mechanism to scale content for device "
-    "scale factor.";
-
-const char kEnableUseZoomForDsfChoiceDefault[] = "Default";
-
-const char kEnableUseZoomForDsfChoiceEnabled[] = "Enabled";
-
-const char kEnableUseZoomForDsfChoiceDisabled[] = "Disabled";
-
 const char kNostatePrefetchName[] = "No-State Prefetch";
 
 const char kNostatePrefetchDescription[] =
@@ -163,14 +607,6 @@
 
 #endif
 
-const char kEnableHttpFormWarningName[] =
-    "Show in-form warnings for sensitive fields when the top-level page is not "
-    "HTTPS";
-
-const char kEnableHttpFormWarningDescription[] =
-    "Attaches a warning UI to any password or credit card fields detected when "
-    "the top-level page is not HTTPS";
-
 const char kMarkHttpAsName[] = "Mark non-secure origins as non-secure";
 
 const char kMarkHttpAsDescription[] = "Change the UI treatment for HTTP pages";
@@ -208,12 +644,6 @@
 
 const char kMhtmlSkipNostoreAll[] = "Skips all no-store resources.";
 
-const char kDeviceDiscoveryNotificationsName[] =
-    "Device Discovery Notifications";
-
-const char kDeviceDiscoveryNotificationsDescription[] =
-    "Device discovery notifications on local network.";
-
 #if defined(OS_WIN)
 
 const char kCloudPrintXpsName[] = "XPS in Google Cloud Print";
@@ -271,22 +701,6 @@
     "Predicts the finger's future position during scrolls allowing time to "
     "render the frame before the finger is there.";
 
-const char kAppBannersName[] = "App Banners";
-
-const char kAppBannersDescription[] =
-    "Enable the display of Progressive Web App banners, which prompt a user to "
-    "add a web app to their shelf, or other platform-specific equivalent.";
-
-const char kBypassAppBannerEngagementChecksName[] =
-    "Bypass user engagement checks";
-
-const char kBypassAppBannerEngagementChecksDescription[] =
-    "Bypasses user engagement checks for displaying app banners, such as "
-    "requiring that users have visited the site before and that the banner "
-    "hasn't been shown recently. This allows developers to test that other "
-    "eligibility requirements for showing app banners, such as having a "
-    "manifest, are met.";
-
 #if defined(OS_ANDROID)
 
 const char kAccessibilityTabSwitcherName[] = "Accessibility Tab Switcher";
@@ -319,12 +733,6 @@
     "Refine the position of a touch gesture in order to compensate for touches "
     "having poor resolution compared to a mouse.";
 
-const char kCompositedLayerBordersName[] = "Composited render layer borders";
-
-const char kCompositedLayerBordersDescription[] =
-    "Renders a border around composited Render Layers to help debug and study "
-    "layer compositing.";
-
 const char kGlCompositedTextureQuadBordersName[] =
     "GL composited texture quad borders";
 
@@ -342,8 +750,6 @@
 
 const char kUiPartialSwapDescription[] = "Sets partial swap behavior.";
 
-const char kDebugShortcutsName[] = "Debugging keyboard shortcuts";
-
 const char kIgnoreGpuBlacklistName[] = "Override software rendering list";
 
 const char kIgnoreGpuBlacklistDescription[] =
@@ -361,53 +767,6 @@
 const char kInProductHelpDemoModeChoiceDescription[] =
     "Selects the In-Product Help demo mode.";
 
-const char kColorCorrectRenderingName[] = "Color correct rendering";
-
-const char kColorCorrectRenderingDescription[] =
-    "Enables color correct rendering of web content.";
-
-const char kExperimentalAppBannersName[] = "Experimental app banners";
-
-const char kExperimentalAppBannersDescription[] =
-    "Enables a new experimental app banner flow and UI";
-
-const char kExperimentalCanvasFeaturesName[] = "Experimental canvas features";
-
-const char kExperimentalCanvasFeaturesDescription[] =
-    "Enables the use of experimental canvas features which are still in "
-    "development.";
-
-const char kAccelerated2dCanvasName[] = "Accelerated 2D canvas";
-
-const char kAccelerated2dCanvasDescription[] =
-    "Enables the use of the GPU to perform 2d canvas rendering instead of "
-    "using software rendering.";
-
-const char kDisplayList2dCanvasName[] = "Display list 2D canvas";
-
-const char kDisplayList2dCanvasDescription[] =
-    "Enables the use of display lists to record 2D canvas commands. This "
-    "allows 2D canvas rasterization to be performed on separate thread.";
-
-const char kExperimentalExtensionApisName[] = "Experimental Extension APIs";
-
-const char kExperimentalExtensionApisDescription[] =
-    "Enables experimental extension APIs. Note that the extension gallery "
-    "doesn't allow you to upload extensions that use experimental APIs.";
-
-const char kExtensionsOnChromeUrlsName[] = "Extensions on chrome:// URLs";
-
-const char kExtensionsOnChromeUrlsDescription[] =
-    "Enables running extensions on chrome:// URLs, where extensions explicitly "
-    "request this permission.";
-
-const char kExperimentalFullscreenExitUIName[] =
-    "Experimental fullscreen exit UI";
-
-const char kExperimentalFullscreenExitUIDescription[] =
-    "Displays experimental UI to allow mouse and touch input methods to exit "
-    "fullscreen mode.";
-
 const char kFastUnloadName[] = "Fast tab/window close";
 
 const char kFastUnloadDescription[] =
@@ -659,10 +1018,6 @@
 
 const char kSslVersionMaxTls13[] = "TLS 1.3";
 
-const char kEnableTokenBindingName[] = "Token Binding.";
-
-const char kEnableTokenBindingDescription[] = "Enable Token Binding support.";
-
 const char kPassiveDocumentEventListenersDescription[] =
     "Forces touchstart, and touchmove event listeners on document level "
     "targets (which haven't requested otherwise) to be treated as passive.";
@@ -779,28 +1134,6 @@
 const char kJavascriptHarmonyDescription[] =
     "Enable web pages to use experimental JavaScript features.";
 
-const char kEnableAsmWasmName[] =
-    "Experimental Validate Asm.js and convert to WebAssembly when valid.";
-
-const char kEnableAsmWasmDescription[] =
-    R"*(Validate Asm.js when "use asm" is present and then convert to )*"
-    R"*(WebAssembly.)*";
-
-const char kEnableSharedArrayBufferName[] =
-    "Experimental enabled SharedArrayBuffer support in JavaScript.";
-
-const char kEnableSharedArrayBufferDescription[] =
-    "Enable SharedArrayBuffer support in JavaScript.";
-
-const char kEnableWasmName[] = "WebAssembly structured cloning support.";
-const char kEnableWasmDescription[] =
-    "Enable web pages to use WebAssembly structured cloning.";
-
-const char kEnableWasmStreamingName[] =
-    "WebAssembly streaming compile/instantiate support.";
-const char kEnableWasmStreamingDescription[] =
-    "WebAssembly.{compile|instantiate} taking a Response as parameter.";
-
 #if defined(OS_ANDROID)
 
 const char kMediaDocumentDownloadButtonName[] =
@@ -844,38 +1177,11 @@
 const char kSlimmingPaintInvalidationDescription[] =
     "Whether to enable a new paint invalidation system.";
 
-const char kExperimentalSecurityFeaturesName[] =
-    "Potentially annoying security features";
-
-const char kExperimentalSecurityFeaturesDescription[] =
-    "Enables several security features that will likely break one or more "
-    "pages that you visit on a daily basis. Strict mixed content checking, for "
-    "example. And locking powerful features to secure contexts. This flag will "
-    "probably annoy you.";
-
-const char kExperimentalWebPlatformFeaturesName[] =
-    "Experimental Web Platform features";
-
-const char kExperimentalWebPlatformFeaturesDescription[] =
-    "Enables experimental Web Platform features that are in development.";
-
 const char kOriginTrialsName[] = "Origin Trials";
 
 const char kOriginTrialsDescription[] =
     "Enables origin trials for controlling access to feature/API experiments.";
 
-const char kBleAdvertisingInExtensionsName[] = "BLE Advertising in Chrome Apps";
-
-const char kBleAdvertisingInExtensionsDescription[] =
-    "Enables BLE Advertising in Chrome Apps. BLE Advertising might interfere "
-    "with regular use of Bluetooth Low Energy features.";
-
-const char kDevtoolsExperimentsName[] = "Developer Tools experiments";
-
-const char kDevtoolsExperimentsDescription[] =
-    "Enables Developer Tools experiments. Use Settings panel in Developer "
-    "Tools to toggle individual experiments.";
-
 const char kSilentDebuggerExtensionApiName[] = "Silent Debugging";
 
 const char kSilentDebuggerExtensionApiDescription[] =
@@ -894,12 +1200,6 @@
 const char kPreferHtmlOverPluginsDescription[] =
     "Prefer HTML content by hiding Flash from the list of plugins.";
 
-const char kAllowNaclSocketApiName[] = "NaCl Socket API.";
-
-const char kAllowNaclSocketApiDescription[] =
-    "Allows applications to use NaCl Socket API. Use only to test NaCl "
-    "plugins.";
-
 const char kRunAllFlashInAllowModeName[] =
     R"*(Run all Flash content when Flash setting is set to "allow")*";
 
@@ -956,20 +1256,6 @@
 
 #endif  // defined(OS_CHROMEOS)
 
-const char kAcceleratedVideoDecodeName[] = "Hardware-accelerated video decode";
-
-const char kAcceleratedVideoDecodeDescription[] =
-    "Hardware-accelerated video decode where available.";
-
-const char kEnableHDRName[] = "HDR mode";
-
-const char kEnableHDRDescription[] =
-    "Enables HDR support on compatible displays.";
-
-const char kCloudImportName[] = "Cloud Import";
-
-const char kCloudImportDescription[] = "Allows the cloud-import feature.";
-
 const char kRequestTabletSiteName[] =
     "Request tablet site option in the settings menu";
 
@@ -979,18 +1265,6 @@
     "changed to indicate a tablet device. Web content optimized for tablets is "
     "received there after for the current tab.";
 
-const char kDebugPackedAppName[] = "Debugging for packed apps";
-
-const char kDebugPackedAppDescription[] =
-    "Enables debugging context menu options such as Inspect Element for packed "
-    "applications.";
-
-const char kDropSyncCredentialName[] =
-    "Drop sync credentials from password manager";
-
-const char kDropSyncCredentialDescription[] =
-    "The password manager will not offer to save the credential used to sync.";
-
 const char kPasswordGenerationName[] = "Password generation";
 
 const char kPasswordGenerationDescription[] =
@@ -1021,13 +1295,6 @@
     "Match Autofill suggestions based on substrings (token prefixes) rather "
     "than just prefixes.";
 
-const char kAffiliationBasedMatchingName[] =
-    "Affiliation based matching in password manager";
-
-const char kAffiliationBasedMatchingDescription[] =
-    "Allow credentials stored for Android applications to be filled into "
-    "corresponding websites.";
-
 const char kProtectSyncCredentialName[] = "Autofill sync credential";
 
 const char kProtectSyncCredentialDescription[] =
@@ -1057,26 +1324,6 @@
     "running after the last window is closed, and to launch at OS startup, if "
     "the Push API needs it.";
 
-const char kEnableNavigationTracingName[] = "Enable navigation tracing";
-
-const char kEnableNavigationTracingDescription[] =
-    "This is to be used in conjunction with the trace-upload-url flag. "
-    "WARNING: When enabled, Chrome will record performance data for every "
-    "navigation and upload it to the URL specified by the trace-upload-url "
-    "flag. The trace may include personally identifiable information (PII) "
-    "such as the titles and URLs of websites you visit.";
-
-const char kEnableNetworkServiceName[] = "Enable network service";
-
-const char kEnableNetworkServiceDescription[] =
-    "Enables the network service, which makes network requests through a "
-    "separate service. Note: most features don't work with this yet.";
-
-const char kEnablePictureInPictureName[] = "Enable picture in picture.";
-
-const char kEnablePictureInPictureDescription[] =
-    "Enable the picture in picture feature for videos.";
-
 const char kTraceUploadUrlName[] = "Trace label for navigation tracing";
 
 const char kTraceUploadUrlDescription[] =
@@ -1085,24 +1332,6 @@
     "This will choose the destination the traces are uploaded to. If you are "
     "not sure, select other. If left empty, no traces will be uploaded.";
 
-const char kDisableAudioForDesktopShareName[] =
-    "Disable Audio For Desktop Share";
-
-const char kDisableAudioForDesktopShareDescription[] =
-    "With this flag on, desktop share picker window will not let the user "
-    "choose whether to share audio.";
-
-const char kDisableNightLightName[] = "Disable Night Light";
-const char kDisableNightLightDescription[] =
-    "Disable the Night Light feature which controls the color temperature of "
-    "the screen.";
-
-const char kDisableTabForDesktopShareName[] =
-    "Disable Desktop Share with tab source";
-
-const char kDisableTabForDesktopShareDescription[] =
-    "This flag controls whether users can choose a tab for desktop share.";
-
 const char kTraceUploadUrlChoiceOther[] = "Other";
 
 const char kTraceUploadUrlChoiceEmloading[] = "emloading";
@@ -1123,12 +1352,6 @@
     "Enable App Launcher sync. This also enables Folders where available (non "
     "OSX).";
 
-const char kDriveSearchInChromeLauncherName[] =
-    "Drive Search in Chrome App Launcher";
-
-const char kDriveSearchInChromeLauncherDescription[] =
-    "Files from Drive will show up when searching the Chrome App Launcher.";
-
 const char kV8CacheOptionsName[] = "V8 caching mode.";
 
 const char kV8CacheOptionsDescription[] =
@@ -1160,56 +1383,6 @@
     "Enable web pages to use the experimental service worker navigation "
     "preload API.";
 
-//  Data Reduction Proxy
-
-const char kDataReductionProxyLoFiName[] = "Data Saver Lo-Fi mode";
-
-const char kDataReductionProxyLoFiDescription[] =
-    "Forces Data Saver Lo-Fi mode to be always enabled, enabled only on "
-    "cellular connections, or disabled. Data Saver must be enabled for Lo-Fi "
-    "mode to be used.";
-
-const char kDataReductionProxyLoFiAlwaysOn[] = "Always on";
-
-const char kDataReductionProxyLoFiCellularOnly[] = "Cellular only";
-
-const char kDataReductionProxyLoFiDisabled[] = "Disable";
-
-const char kDataReductionProxyLoFiSlowConnectionsOnly[] =
-    "Slow connections only";
-
-const char kEnableDataReductionProxyLitePageName[] =
-    "Lite pages for Data Saver Lo-Fi mode";
-
-const char kEnableDataReductionProxyLitePageDescription[] =
-    "Enable lite pages in Data Saver Lo-Fi mode. Previews of pages will be "
-    "shown instead of image placeholders when Lo-Fi is on. Data Saver and "
-    "Lo-Fi must be enabled for lite pages to be shown.";
-
-const char kDataReductionProxyServerAlternative[] =
-    "Use alternative server configuration";
-
-const char kEnableDataReductionProxyServerExperimentName[] =
-    "Use an alternative Data Saver back end configuration.";
-
-const char kEnableDataReductionProxyServerExperimentDescription[] =
-    "Enable a different approach to saving data by configuring the back end "
-    "server";
-
-const char kDataReductionProxyCarrierTestName[] =
-    "Enable a carrier-specific Data Reduction Proxy for testing.";
-
-const char kDataReductionProxyCarrierTestDescription[] =
-    "Use a carrier-specific Data Reduction Proxy for testing.";
-
-const char kEnableDataReductionProxySavingsPromoName[] =
-    "Data Saver 1 MB Savings Promo";
-
-const char kEnableDataReductionProxySavingsPromoDescription[] =
-    "Enable a Data Saver promo for 1 MB of savings. If Data Saver has already "
-    "saved 1 MB of data, then the promo will not be shown. Data Saver must be "
-    "enabled for the promo to be shown.";
-
 #if defined(OS_ANDROID)
 
 const char kEnableDataReductionProxyMainMenuName[] =
@@ -1229,11 +1402,6 @@
 const char kEnableOfflinePreviewsDescription[] =
     "Enable showing offline page previews on slow networks.";
 
-const char kEnableClientLoFiName[] = "Client-side Lo-Fi previews";
-
-const char kEnableClientLoFiDescription[] =
-    "Enable showing low fidelity images on some pages on slow networks.";
-
 #endif  // defined(OS_ANDROID)
 
 const char kLcdTextName[] = "LCD text antialiasing";
@@ -1242,41 +1410,11 @@
     "If disabled, text is rendered with grayscale antialiasing instead of LCD "
     "(subpixel) when doing accelerated compositing.";
 
-const char kDistanceFieldTextName[] = "Distance field text";
-
-const char kDistanceFieldTextDescription[] =
-    "Text is rendered with signed distance fields rather than bitmap alpha "
-    "masks.";
-
 const char kZeroCopyName[] = "Zero-copy rasterizer";
 
 const char kZeroCopyDescription[] =
     "Raster threads write directly to GPU memory associated with tiles.";
 
-const char kDefaultTileWidthName[] = "Default tile width";
-
-const char kDefaultTileWidthDescription[] = "Specify the default tile width.";
-
-const char kDefaultTileWidthShort[] = "128";
-
-const char kDefaultTileWidthTall[] = "256";
-
-const char kDefaultTileWidthGrande[] = "512";
-
-const char kDefaultTileWidthVenti[] = "1024";
-
-const char kDefaultTileHeightName[] = "Default tile height";
-
-const char kDefaultTileHeightDescription[] = "Specify the default tile height.";
-
-const char kDefaultTileHeightShort[] = "128";
-
-const char kDefaultTileHeightTall[] = "256";
-
-const char kDefaultTileHeightGrande[] = "512";
-
-const char kDefaultTileHeightVenti[] = "1024";
-
 const char kNumRasterThreadsName[] = "Number of raster threads";
 
 const char kNumRasterThreadsDescription[] =
@@ -1415,12 +1553,6 @@
     "Enable cross-platform HarfBuzz layout engine for UI text. Doesn't affect "
     "web content.";
 
-const char kEmbeddedExtensionOptionsName[] = "Embedded extension options";
-
-const char kEmbeddedExtensionOptionsDescription[] =
-    "Display extension options as an embedded element in chrome://extensions "
-    "rather than opening a new tab.";
-
 const char kTabAudioMutingName[] = "Tab audio muting UI control";
 
 const char kTabAudioMutingDescription[] =
@@ -1428,22 +1560,6 @@
     "mute controls. This also adds commands in the tab context menu for "
     "quickly muting multiple selected tabs.";
 
-const char kEasyUnlockBluetoothLowEnergyDiscoveryName[] =
-    "Smart Lock Bluetooth Low Energy Discovery";
-
-const char kEasyUnlockBluetoothLowEnergyDiscoveryDescription[] =
-    "Enables a Smart Lock setting that allows Chromebook to discover phones "
-    "over Bluetooth Low Energy in order to unlock the Chromebook when the "
-    "phone is in its proximity.";
-
-const char kEasyUnlockProximityDetectionName[] =
-    "Smart Lock proximity detection";
-
-const char kEasyUnlockProximityDetectionDescription[] =
-    "Enables a Smart Lock setting that restricts unlocking to only work when "
-    "your phone is very close to (roughly, within an arm's length of) the "
-    "Chrome device.";
-
 const char kWifiCredentialSyncName[] = "WiFi credential sync";
 
 const char kWifiCredentialSyncDescription[] =
@@ -1457,15 +1573,6 @@
 const char kSyncSandboxDescription[] =
     "Connects to the testing server for Chrome Sync.";
 
-const char kDatasaverPromptName[] = "Cellular Data Saver Prompt";
-
-const char kDatasaverPromptDescription[] =
-    "Enables a prompt, which appears when a cellular network connection is "
-    "detected, to take the user to the Data Saver extension page on Chrome Web "
-    "Store.";
-
-const char kDatasaverPromptDemoMode[] = "Demo mode";
-
 const char kTrySupportedChannelLayoutsName[] =
     "Causes audio output streams to check if channel layouts other than the "
     "default hardware layout are available.";
@@ -1530,12 +1637,6 @@
     "A simplified new user experience when entering page-triggered full screen "
     "or mouse pointer lock states.";
 
-const char kExperimentalKeyboardLockUiName[] = "Experimental keyboard lock UI.";
-
-const char kExperimentalKeyboardLockUiDescription[] =
-    "An experimental full screen with keyboard lock mode requiring users to "
-    "hold Esc to exit.";
-
 #if defined(OS_ANDROID)
 
 extern const char kPayWithGoogleV1Name[] = "Pay with Google v1";
@@ -1581,13 +1682,6 @@
 
 #endif  // defined(OS_ANDROID)
 
-const char kDisallowDocWrittenScriptsUiName[] =
-    "Block scripts loaded via document.write";
-
-const char kDisallowDocWrittenScriptsUiDescription[] =
-    "Disallows fetches for third-party parser-blocking scripts inserted into "
-    "the main frame via document.write.";
-
 #if defined(OS_WIN)
 
 const char kEnableAppcontainerName[] = "Enable AppContainer Lockdown.";
@@ -1645,11 +1739,6 @@
 
 #endif  // defined(OS_WIN) || defined(OS_LINUX)
 
-const char kEnableGroupedHistoryName[] = "Group history by domain";
-
-const char kEnableGroupedHistoryDescription[] =
-    "Group history by website domain (i.e. google.com) on chrome://history.";
-
 const char kSaveasMenuLabelExperimentName[] =
     "Switch 'Save as' menu labels to 'Download'";
 
@@ -1657,12 +1746,6 @@
     "Enables an experiment to switch menu labels that use 'Save as...' to "
     "'Download'.";
 
-const char kEnableEnumeratingAudioDevicesName[] =
-    "Experimentally enable enumerating audio devices.";
-
-const char kEnableEnumeratingAudioDevicesDescription[] =
-    "Experimentally enable the use of enumerating audio devices.";
-
 const char kNewUsbBackendName[] = "Enable new USB backend";
 
 const char kNewUsbBackendDescription[] =
@@ -1676,27 +1759,12 @@
     "conversions, dictionary definitions, sports scores, translations, and "
     "when is.";
 
-const char kEnableZeroSuggestRedirectToChromeName[] =
-    "Experimental contextual omnibox suggestion";
-
-const char kEnableZeroSuggestRedirectToChromeDescription[] =
-    "Change omnibox contextual suggestions to an experimental source. Note "
-    "that this is not an on/off switch for contextual omnibox and it only "
-    "applies to suggestions provided before the user starts typing a URL or a "
-    "search query (i.e. zero suggest).";
-
 const char kFillOnAccountSelectName[] = "Fill passwords on account selection";
 
 const char kFillOnAccountSelectDescription[] =
     "Filling of passwords when an account is explicitly selected by the user "
     "rather than autofilling credentials on page load.";
 
-const char kEnableClearBrowsingDataCountersName[] =
-    "Enable Clear browsing data counters.";
-
-const char kEnableClearBrowsingDataCountersDescription[] =
-    "Shows data volume counters in the Clear browsing data dialog.";
-
 #if defined(OS_ANDROID)
 
 const char kTabsInCbdName[] = "Enable tabs for the Clear Browsing Data dialog.";
@@ -1721,13 +1789,6 @@
 
 #endif  // defined(OS_ANDROID)
 
-const char kEnableWebNotificationCustomLayoutsName[] =
-    "Enable custom layouts for Web Notifications.";
-
-const char kEnableWebNotificationCustomLayoutsDescription[] =
-    "Enable custom layouts for Web Notifications. They will have subtle layout "
-    "improvements that are otherwise not possible.";
-
 const char kGoogleProfileInfoName[] = "Google profile name and icon";
 
 const char kGoogleProfileInfoDescription[] =
@@ -1846,13 +1907,6 @@
 
 #endif  // defined(OS_CHROMEOS)
 
-//  Strings for controlling credit card assist feature in about:flags.
-
-const char kCreditCardAssistName[] = "Credit Card Assisted Filling";
-
-const char kCreditCardAssistDescription[] =
-    "Enable assisted credit card filling on certain sites.";
-
 //  Strings for controlling credit card scanning feature in about:flags.
 
 //  Simple Cache Backend experiment.
@@ -1894,22 +1948,6 @@
     "a separate process from the top document. In this mode, iframes from "
     "different third-party sites will be allowed to share a process.";
 
-//  Cross process guest frames isolation mode
-
-const char kCrossProcessGuestViewIsolationName[] =
-    "Cross process frames for guests";
-
-const char kCrossProcessGuestViewIsolationDescription[] =
-    "Highly experimental where guests such as &lt;webview> are implemented on "
-    "the out-of-process iframe infrastructure.";
-
-//  Task Scheduler
-
-const char kBrowserTaskSchedulerName[] = "Task Scheduler";
-
-const char kBrowserTaskSchedulerDescription[] =
-    "Enables redirection of some task posting APIs to the task scheduler.";
-
 //  Arc authorization
 
 #if defined(OS_CHROMEOS)
@@ -1992,36 +2030,6 @@
 const char kSettingsWindowDescription[] =
     "Settings will be shown in a dedicated window instead of as a browser tab.";
 
-//  Extension Content Verification
-
-const char kExtensionContentVerificationName[] =
-    "Extension Content Verification";
-
-const char kExtensionContentVerificationDescription[] =
-    "This flag can be used to turn on verification that the contents of the "
-    "files on disk for extensions from the webstore match what they're "
-    "expected to be. This can be used to turn on this feature if it would not "
-    "otherwise have been turned on, but cannot be used to turn it off (because "
-    "this setting can be tampered with by malware).";
-
-const char kExtensionContentVerificationBootstrap[] =
-    "Bootstrap (get expected hashes, but do not enforce them)";
-
-const char kExtensionContentVerificationEnforce[] =
-    "Enforce (try to get hashes, and enforce them if successful)";
-
-const char kExtensionContentVerificationEnforceStrict[] =
-    "Enforce strict (hard fail if we can't get hashes)";
-
-//  Built-in hotword detection display strings
-
-const char kExperimentalHotwordHardwareName[] =
-    "Simulated hardware 'Ok Google' features";
-
-const char kExperimentalHotwordHardwareDescription[] =
-    "Enables an experimental version of 'Ok Google' hotword detection features "
-    "that have a hardware dependency.";
-
 //  Message center strings
 
 const char kMessageCenterAlwaysScrollUpUponRemovalName[] =
@@ -2037,20 +2045,6 @@
 const char kMessageCenterNewStyleNotificationDescription[] =
     "Enables the experiment style of material-design notification";
 
-const char kCastStreamingHwEncodingName[] =
-    "Cast Streaming hardware video encoding";
-
-const char kCastStreamingHwEncodingDescription[] =
-    "This option enables support in Cast Streaming for encoding video streams "
-    "using platform hardware.";
-
-const char kAllowInsecureLocalhostName[] =
-    "Allow invalid certificates for resources loaded from localhost.";
-
-const char kAllowInsecureLocalhostDescription[] =
-    "Allows requests to localhost over HTTPS even when an invalid certificate "
-    "is presented.";
-
 #if defined(OS_WIN) || defined(OS_MACOSX)
 
 //  Tab discarding
@@ -2256,41 +2250,6 @@
 
 #endif  // defined(OS_ANDROID)
 
-const char kEnableBrotliName[] = "Brotli Content-Encoding.";
-
-const char kEnableBrotliDescription[] =
-    "Enable Brotli Content-Encoding support.";
-
-const char kEnableWebfontsInterventionName[] =
-    "New version of User Agent Intervention for WebFonts loading.";
-
-const char kEnableWebfontsInterventionDescription[] =
-    "Enable New version of User Agent Intervention for WebFonts loading.";
-
-const char kEnableWebfontsInterventionV2ChoiceDefault[] = "Default";
-
-const char kEnableWebfontsInterventionV2ChoiceEnabledWith2g[] = "Enabled: 2G";
-
-const char kEnableWebfontsInterventionV2ChoiceEnabledWith3g[] = "Enabled: 3G";
-
-const char kEnableWebfontsInterventionV2ChoiceEnabledWithSlow2g[] =
-    "Enabled: Slow 2G";
-
-const char kEnableWebfontsInterventionV2ChoiceDisabled[] = "Disabled";
-
-const char kEnableWebfontsInterventionTriggerName[] =
-    "Trigger User Agent Intervention for WebFonts loading always.";
-
-const char kEnableWebfontsInterventionTriggerDescription[] =
-    "Enable to trigger User Agent Intervention for WebFonts loading always. "
-    "This flag affects only when the intervention is enabled.";
-
-const char kEnableScrollAnchoringName[] = "Scroll Anchoring";
-
-const char kEnableScrollAnchoringDescription[] =
-    "Adjusts scroll position to prevent visible jumps when offscreen content "
-    "changes.";
-
 #if defined(OS_CHROMEOS)
 
 const char kDisableNativeCupsName[] = "Native CUPS";
@@ -2491,25 +2450,6 @@
 
 #endif  // defined(OS_ANDROID)
 
-const char kEnableAutofillCreditCardBankNameDisplayName[] =
-    "Display the issuer bank name of a credit card in autofill.";
-
-const char kEnableAutofillCreditCardBankNameDisplayDescription[] =
-    "If enabled, displays the issuer bank name of a credit card in autofill.";
-
-const char kEnableAutofillCreditCardLastUsedDateDisplayName[] =
-    "Display the last used date of a credit card in autofill.";
-
-const char kEnableAutofillCreditCardLastUsedDateDisplayDescription[] =
-    "If enabled, display the last used date of a credit card in autofill.";
-
-const char kEnableAutofillCreditCardUploadCvcPromptName[] =
-    "Enable requesting missing CVC during Autofill credit card upload";
-
-const char kEnableAutofillCreditCardUploadCvcPromptDescription[] =
-    "If enabled, requests missing CVC when offering to upload credit cards to "
-    "Google Payments.";
-
 #if !defined(OS_ANDROID) && defined(GOOGLE_CHROME_BUILD)
 
 const char kGoogleBrandedContextMenuName[] =
@@ -2521,21 +2461,6 @@
 
 #endif  // !defined(OS_ANDROID) && defined(GOOGLE_CHROME_BUILD)
 
-const char kEnableWebUsbName[] = "WebUSB";
-
-const char kEnableWebUsbDescription[] = "Enable WebUSB support.";
-
-const char kEnableImageCaptureAPIName[] = "Image Capture API";
-
-const char kEnableImageCaptureAPIDescription[] =
-    "Enables the Web Platform Image Capture API: takePhoto(), "
-    "getPhotoCapabilities(), etc.";
-
-const char kEnableGenericSensorName[] = "Generic Sensor";
-
-const char kEnableGenericSensorDescription[] =
-    "Enable sensor APIs based on Generic Sensor API.";
-
 const char kFontCacheScalingName[] = "FontCache scaling";
 
 const char kFontCacheScalingDescription[] =
@@ -2628,15 +2553,6 @@
 const char kNewAudioRenderingMixingStrategyDescription[] =
     "Use the new audio rendering mixing strategy.";
 
-//  Background video track disabling experiment strings.
-
-const char kBackgroundVideoTrackOptimizationName[] =
-    "Optimize background video playback.";
-
-const char kBackgroundVideoTrackOptimizationDescription[] =
-    "Disable video tracks when the video is played in the background to "
-    "optimize performance.";
-
 //  New remote playback pipeline experiment strings.
 
 const char kNewRemotePlaybackPipelineName[] =
@@ -2664,14 +2580,6 @@
     "Enter/exit fullscreen when device is rotated to/from the orientation of "
     "the video. Only on phones.";
 
-//  Expensive background timer throttling flag
-
-const char kExpensiveBackgroundTimerThrottlingName[] =
-    "Throttle expensive background timers";
-
-const char kExpensiveBackgroundTimerThrottlingDescription[] =
-    "Enables intervention to limit CPU usage of background timers to 1%.";
-
 //  Enable default MediaSession flag
 
 #if !defined(OS_ANDROID)
@@ -2795,14 +2703,6 @@
 
 #endif  // defined(OS_ANDROID)
 
-//  Web MIDI supports MIDIManager dynamic instantiation chrome://flags strings
-
-const char kEnableMidiManagerDynamicInstantiationName[] =
-    "MIDIManager dynamic instantiation for Web MIDI.";
-
-const char kEnableMidiManagerDynamicInstantiationDescription[] =
-    "Enable MIDIManager dynamic instantiation for Web MIDI.";
-
 //  Desktop iOS promotion chrome://flags strings
 
 #if defined(OS_WIN)
@@ -2870,16 +2770,13 @@
 
 #if defined(OS_ANDROID)
 
-const char kUseNewDoodleApiName[] = "Use new Doodle API";
+const char kUseDdljsonApiName[] = "Use new ddljson API for Doodles";
 
-const char kUseNewDoodleApiDescription[] =
-    "Enables the new API to fetch Doodles for the NTP.";
+const char kUseDdljsonApiDescription[] =
+    "Enables the new ddljson API to fetch Doodles for the NTP.";
 
 #endif  // defined(OS_ANDROID)
 
-const char kDebugShortcutsDescription[] =
-    "Enables additional keyboard shortcuts that are useful for debugging Ash.";
-
 const char kMemoryAblationName[] = "Memory ablation experiment";
 const char kMemoryAblationDescription[] =
     "Allocates extra memory in the browser process.";
@@ -3109,13 +3006,6 @@
 
 #endif  // defined(OS_ANDROID)
 
-const char kEnableIdleTimeSpellCheckingName[] =
-    "Enable idle time spell checker";
-
-const char kEnableIdleTimeSpellCheckingDescription[] =
-    "Make spell-checking code run only when the browser is idle, so that input "
-    "latency is reduced, especially when editing long articles, emails, etc.";
-
 #if defined(OS_ANDROID)
 
 const char kEnableOmniboxClipboardProviderName[] =
@@ -3127,22 +3017,6 @@
 
 #endif  // defined(OS_ANDROID)
 
-const char kAutoplayPolicyName[] = "Autoplay policy";
-
-const char kAutoplayPolicyDescription[] =
-    "Policy used when deciding if audio or video is allowed to autoplay.";
-
-const char kAutoplayPolicyNoUserGestureRequired[] =
-    "No user gesture is required.";
-
-const char kAutoplayPolicyUserGestureRequired[] = "User gesture is required.";
-
-const char kAutoplayPolicyUserGestureRequiredForCrossOrigin[] =
-    "User gesture is required for cross-origin iframes.";
-
-const char kAutoplayPolicyDocumentUserActivation[] =
-    "Document user activation is required.";
-
 const char kOmniboxDisplayTitleForCurrentUrlName[] =
     "Include title for the current URL in the omnibox";
 
@@ -3204,16 +3078,6 @@
 const char kEffectiveConnectionType3GDescription[] = "3G";
 const char kEffectiveConnectionType4GDescription[] = "4G";
 
-const char kEnableHeapProfilingName[] = "Heap profiling";
-
-const char kEnableHeapProfilingDescription[] = "Enables heap profiling.";
-
-const char kEnableHeapProfilingModePseudo[] = "Enabled (pseudo mode)";
-
-const char kEnableHeapProfilingModeNative[] = "Enabled (native mode)";
-
-const char kEnableHeapProfilingTaskProfiler[] = "Enabled (task mode)";
-
 const char kUseSuggestionsEvenIfFewFeatureName[] =
     "Disable minimum for server-side tile suggestions on NTP.";
 
@@ -3221,13 +3085,6 @@
     "Request server-side suggestions even if there are only very few of them "
     "and use them for tiles on the New Tab Page.";
 
-const char kCaptureThumbnailOnLoadFinishedName[] =
-    "Capture page thumbnail on load finished";
-
-const char kCaptureThumbnailOnLoadFinishedDescription[] =
-    "Capture a page thumbnail (for use on the New Tab page) when the page load "
-    "finishes, in addition to other times a thumbnail may be captured.";
-
 #if defined(OS_WIN)
 
 // Name and description of the flag that enables D3D v-sync.
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index b449e74..5b3fd7b 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -127,9 +127,6 @@
 extern const char kDebugShortcutsName[];
 extern const char kDebugShortcutsDescription[];
 
-extern const char kDelayNavigationName[];
-extern const char kDelayNavigationDescription[];
-
 extern const char kDeviceDiscoveryNotificationsName[];
 extern const char kDeviceDiscoveryNotificationsDescription[];
 
@@ -169,9 +166,6 @@
 extern const char kEmbeddedExtensionOptionsName[];
 extern const char kEmbeddedExtensionOptionsDescription[];
 
-extern const char kEnableAdjustableLargeCursorName[];
-extern const char kEnableAdjustableLargeCursorDescription[];
-
 extern const char kEnableAsmWasmName[];
 extern const char kEnableAsmWasmDescription[];
 
@@ -190,6 +184,9 @@
 extern const char kEnableClearBrowsingDataCountersName[];
 extern const char kEnableClearBrowsingDataCountersDescription[];
 
+extern const char kEnableClientLoFiName[];
+extern const char kEnableClientLoFiDescription[];
+
 extern const char kEnableDataReductionProxyLitePageName[];
 extern const char kEnableDataReductionProxyLitePageDescription[];
 
@@ -304,6 +301,9 @@
 extern const char kExperimentalExtensionApisName[];
 extern const char kExperimentalExtensionApisDescription[];
 
+extern const char kExperimentalFullscreenExitUIName[];
+extern const char kExperimentalFullscreenExitUIDescription[];
+
 extern const char kExperimentalHotwordHardwareName[];
 extern const char kExperimentalHotwordHardwareDescription[];
 
@@ -346,9 +346,6 @@
 extern const char kEffectiveConnectionType3GDescription[];
 extern const char kEffectiveConnectionType4GDescription[];
 
-extern const char kExperimentalFullscreenExitUIName[];
-extern const char kExperimentalFullscreenExitUIDescription[];
-
 extern const char kFillOnAccountSelectName[];
 extern const char kFillOnAccountSelectDescription[];
 
@@ -901,9 +898,6 @@
 extern const char kEnableAndroidSpellcheckerDescription[];
 extern const char kEnableAndroidSpellcheckerName[];
 
-extern const char kEnableClientLoFiName[];
-extern const char kEnableClientLoFiDescription[];
-
 extern const char kEnableConsistentOmniboxGeolocationName[];
 extern const char kEnableConsistentOmniboxGeolocationDescription[];
 
@@ -1138,8 +1132,8 @@
 extern const char kUseAndroidMidiApiName[];
 extern const char kUseAndroidMidiApiDescription[];
 
-extern const char kUseNewDoodleApiName[];
-extern const char kUseNewDoodleApiDescription[];
+extern const char kUseDdljsonApiName[];
+extern const char kUseDdljsonApiDescription[];
 
 extern const char kWebPaymentsModifiersName[];
 extern const char kWebPaymentsModifiersDescription[];
diff --git a/chrome/browser/io_thread.cc b/chrome/browser/io_thread.cc
index 4d9f63b..e5eeba76 100644
--- a/chrome/browser/io_thread.cc
+++ b/chrome/browser/io_thread.cc
@@ -642,6 +642,9 @@
   globals_ = NULL;
 
   base::debug::LeakTracker<SystemURLRequestContextGetter>::CheckForLeaks();
+
+  if (net_log_)
+    net_log_->ShutDownBeforeTaskScheduler();
 }
 
 // static
diff --git a/chrome/browser/media/output_protection_impl.cc b/chrome/browser/media/output_protection_impl.cc
index 80808f28dd..a4b33b7b 100644
--- a/chrome/browser/media/output_protection_impl.cc
+++ b/chrome/browser/media/output_protection_impl.cc
@@ -37,43 +37,42 @@
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 }
 
-void OutputProtectionImpl::QueryStatus(const QueryStatusCallback& callback) {
+void OutputProtectionImpl::QueryStatus(QueryStatusCallback callback) {
   DVLOG(2) << __func__;
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   GetProxy()->QueryStatus(base::Bind(&OutputProtectionImpl::OnQueryStatusResult,
-                                     weak_factory_.GetWeakPtr(), callback));
+                                     weak_factory_.GetWeakPtr(),
+                                     base::Passed(&callback)));
 }
 
-void OutputProtectionImpl::EnableProtection(
-    uint32_t desired_protection_mask,
-    const EnableProtectionCallback& callback) {
+void OutputProtectionImpl::EnableProtection(uint32_t desired_protection_mask,
+                                            EnableProtectionCallback callback) {
   DVLOG(2) << __func__;
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   GetProxy()->EnableProtection(
       desired_protection_mask,
       base::Bind(&OutputProtectionImpl::OnEnableProtectionResult,
-                 weak_factory_.GetWeakPtr(), callback));
+                 weak_factory_.GetWeakPtr(), base::Passed(&callback)));
 }
 
-void OutputProtectionImpl::OnQueryStatusResult(
-    const QueryStatusCallback& callback,
-    bool success,
-    uint32_t link_mask,
-    uint32_t protection_mask) {
+void OutputProtectionImpl::OnQueryStatusResult(QueryStatusCallback callback,
+                                               bool success,
+                                               uint32_t link_mask,
+                                               uint32_t protection_mask) {
   DVLOG(2) << __func__ << ": success=" << success << ", link_mask=" << link_mask
            << ", protection_mask=" << protection_mask;
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  callback.Run(success, link_mask, protection_mask);
+  std::move(callback).Run(success, link_mask, protection_mask);
 }
 
 void OutputProtectionImpl::OnEnableProtectionResult(
-    const EnableProtectionCallback& callback,
+    EnableProtectionCallback callback,
     bool success) {
   DVLOG(2) << __func__ << ": success=" << success;
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  callback.Run(success);
+  std::move(callback).Run(success);
 }
 
 // Helper function to lazily create the |proxy_| and return it.
diff --git a/chrome/browser/media/output_protection_impl.h b/chrome/browser/media/output_protection_impl.h
index dde26d9..b04ff25 100644
--- a/chrome/browser/media/output_protection_impl.h
+++ b/chrome/browser/media/output_protection_impl.h
@@ -26,19 +26,19 @@
   ~OutputProtectionImpl() final;
 
   // media::mojom::OutputProtection implementation.
-  void QueryStatus(const QueryStatusCallback& callback) final;
+  void QueryStatus(QueryStatusCallback callback) final;
   void EnableProtection(uint32_t desired_protection_mask,
-                        const EnableProtectionCallback& callback) final;
+                        EnableProtectionCallback callback) final;
 
  private:
   // Callbacks for QueryStatus and EnableProtection results.
   // Note: These are bound using weak pointers so that we won't fire |callback|
   // after the binding is destroyed.
-  void OnQueryStatusResult(const QueryStatusCallback& callback,
+  void OnQueryStatusResult(QueryStatusCallback callback,
                            bool success,
                            uint32_t link_mask,
                            uint32_t protection_mask);
-  void OnEnableProtectionResult(const EnableProtectionCallback& callback,
+  void OnEnableProtectionResult(EnableProtectionCallback callback,
                                 bool success);
 
   // Helper function to lazily create the |proxy_| and return it.
diff --git a/chrome/browser/media/router/discovery/BUILD.gn b/chrome/browser/media/router/discovery/BUILD.gn
index 34f1b5d8..79ad9c1 100644
--- a/chrome/browser/media/router/discovery/BUILD.gn
+++ b/chrome/browser/media/router/discovery/BUILD.gn
@@ -12,6 +12,7 @@
     "//base:i18n",
     "//chrome/app:generated_resources",
     "//chrome/common:constants",
+    "//components/cast_channel",
     "//content/public/browser",
     "//content/public/common",
   ]
@@ -34,6 +35,8 @@
     "dial/parsed_dial_device_description.h",
     "dial/safe_dial_device_description_parser.cc",
     "dial/safe_dial_device_description_parser.h",
+    "mdns/cast_media_sink_service.cc",
+    "mdns/cast_media_sink_service.h",
     "mdns/dns_sd_delegate.cc",
     "mdns/dns_sd_delegate.h",
     "mdns/dns_sd_device_lister.cc",
diff --git a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.cc b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.cc
new file mode 100644
index 0000000..1ad648b
--- /dev/null
+++ b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.cc
@@ -0,0 +1,245 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/media/router/discovery/mdns/cast_media_sink_service.h"
+
+#include "base/memory/ptr_util.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/common/media_router/discovery/media_sink_internal.h"
+#include "components/cast_channel/cast_socket_service.h"
+#include "components/cast_channel/cast_socket_service_factory.h"
+#include "components/net_log/chrome_net_log.h"
+#include "content/public/common/content_client.h"
+#include "net/base/host_port_pair.h"
+#include "net/base/ip_address.h"
+
+namespace {
+
+constexpr char kObserverId[] = "browser_observer_id";
+
+enum ErrorType {
+  NONE,
+  NOT_CAST_DEVICE,
+  MISSING_ID,
+  MISSING_FRIENDLY_NAME,
+  MISSING_OR_INVALID_IP_ADDRESS,
+  MISSING_OR_INVALID_PORT,
+};
+
+ErrorType CreateCastMediaSink(const media_router::DnsSdService& service,
+                              int channel_id,
+                              bool audio_only,
+                              media_router::MediaSinkInternal* cast_sink) {
+  DCHECK(cast_sink);
+  if (service.service_name.find(
+          media_router::CastMediaSinkService::kCastServiceType) ==
+      std::string::npos)
+    return ErrorType::NOT_CAST_DEVICE;
+
+  net::IPAddress ip_address;
+  if (!ip_address.AssignFromIPLiteral(service.ip_address))
+    return ErrorType::MISSING_OR_INVALID_IP_ADDRESS;
+
+  std::map<std::string, std::string> service_data;
+  for (const auto& item : service.service_data) {
+    // |item| format should be "id=xxxxxx", etc.
+    size_t split_idx = item.find('=');
+    if (split_idx == std::string::npos)
+      continue;
+
+    std::string key = item.substr(0, split_idx);
+    std::string val =
+        split_idx < item.length() ? item.substr(split_idx + 1) : "";
+    service_data[key] = val;
+  }
+
+  // When use this "sink" within browser, please note it will have a different
+  // ID when it is sent to the extension, because it derives a different sink ID
+  // using the given sink ID.
+  std::string unique_id = service_data["id"];
+  if (unique_id.empty())
+    return ErrorType::MISSING_ID;
+  std::string friendly_name = service_data["fn"];
+  if (friendly_name.empty())
+    return ErrorType::MISSING_FRIENDLY_NAME;
+  media_router::MediaSink sink(unique_id, friendly_name,
+                               media_router::MediaSink::IconType::CAST);
+
+  media_router::CastSinkExtraData extra_data;
+  extra_data.ip_address = ip_address;
+  extra_data.model_name = service_data["md"];
+  extra_data.capabilities = cast_channel::CastDeviceCapability::AUDIO_OUT;
+  if (!audio_only)
+    extra_data.capabilities |= cast_channel::CastDeviceCapability::VIDEO_OUT;
+  extra_data.cast_channel_id = channel_id;
+
+  cast_sink->set_sink(sink);
+  cast_sink->set_cast_data(extra_data);
+
+  return ErrorType::NONE;
+}
+
+}  // namespace
+
+namespace media_router {
+
+// static
+const char CastMediaSinkService::kCastServiceType[] = "_googlecast._tcp.local";
+
+CastMediaSinkService::CastMediaSinkService(
+    const OnSinksDiscoveredCallback& callback,
+    content::BrowserContext* browser_context)
+    : MediaSinkServiceBase(callback) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  cast_socket_service_ = cast_channel::CastSocketServiceFactory::GetInstance()
+                             ->GetForBrowserContext(browser_context);
+  DCHECK(cast_socket_service_);
+}
+
+CastMediaSinkService::CastMediaSinkService(
+    const OnSinksDiscoveredCallback& callback,
+    cast_channel::CastSocketService* cast_socket_service)
+    : MediaSinkServiceBase(callback),
+      cast_socket_service_(cast_socket_service) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  DCHECK(cast_socket_service_);
+}
+
+CastMediaSinkService::~CastMediaSinkService() {}
+
+void CastMediaSinkService::Start() {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  if (dns_sd_registry_)
+    return;
+
+  dns_sd_registry_ = DnsSdRegistry::GetInstance();
+  dns_sd_registry_->AddObserver(this);
+  dns_sd_registry_->RegisterDnsSdListener(kCastServiceType);
+  MediaSinkServiceBase::StartTimer();
+}
+
+void CastMediaSinkService::Stop() {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  if (!dns_sd_registry_)
+    return;
+
+  dns_sd_registry_->UnregisterDnsSdListener(kCastServiceType);
+  dns_sd_registry_->RemoveObserver(this);
+  dns_sd_registry_ = nullptr;
+  MediaSinkServiceBase::StopTimer();
+}
+
+void CastMediaSinkService::SetDnsSdRegistryForTest(DnsSdRegistry* registry) {
+  DCHECK(!dns_sd_registry_);
+  dns_sd_registry_ = registry;
+  dns_sd_registry_->AddObserver(this);
+  dns_sd_registry_->RegisterDnsSdListener(kCastServiceType);
+  MediaSinkServiceBase::StartTimer();
+}
+
+void CastMediaSinkService::OnDnsSdEvent(
+    const std::string& service_type,
+    const DnsSdRegistry::DnsSdServiceList& services) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  DVLOG(2) << "CastMediaSinkService::OnDnsSdEvent found " << services.size()
+           << " services";
+
+  current_sinks_.clear();
+  current_services_ = services;
+
+  for (const auto& service : services) {
+    net::IPAddress ip_address;
+    if (!ip_address.AssignFromIPLiteral(service.ip_address)) {
+      DVLOG(2) << "Invalid ip_addresss: " << service.ip_address;
+      continue;
+    }
+    net::HostPortPair host_port_pair =
+        net::HostPortPair::FromString(service.service_host_port);
+
+    content::BrowserThread::PostTask(
+        content::BrowserThread::IO, FROM_HERE,
+        base::Bind(&CastMediaSinkService::OpenChannelOnIOThread, this, service,
+                   net::IPEndPoint(ip_address, host_port_pair.port())));
+  }
+
+  MediaSinkServiceBase::RestartTimer();
+}
+
+void CastMediaSinkService::OpenChannelOnIOThread(
+    const DnsSdService& service,
+    const net::IPEndPoint& ip_endpoint) {
+  auto* observer = cast_socket_service_->GetObserver(kObserverId);
+  if (!observer) {
+    observer = new CastSocketObserver();
+    cast_socket_service_->AddObserver(kObserverId, base::WrapUnique(observer));
+  }
+
+  cast_socket_service_->OpenSocket(
+      ip_endpoint, g_browser_process->net_log(),
+      base::Bind(&CastMediaSinkService::OnChannelOpenedOnIOThread, this,
+                 service),
+      observer);
+}
+
+void CastMediaSinkService::OnChannelOpenedOnIOThread(
+    const DnsSdService& service,
+    int channel_id,
+    cast_channel::ChannelError channel_error) {
+  if (channel_error != cast_channel::ChannelError::NONE) {
+    DVLOG(2) << "Fail to open channel " << service.ip_address << ": "
+             << service.service_host_port
+             << " [ChannelError]: " << (int)channel_error;
+    return;
+  }
+
+  auto* socket = cast_socket_service_->GetSocket(channel_id);
+  if (!socket) {
+    DVLOG(2) << "Fail to find socket with [channel_id]: " << channel_id;
+    return;
+  }
+
+  content::BrowserThread::PostTask(
+      content::BrowserThread::UI, FROM_HERE,
+      base::Bind(&CastMediaSinkService::OnChannelOpenedOnUIThread, this,
+                 service, channel_id, socket->audio_only()));
+}
+
+void CastMediaSinkService::OnChannelOpenedOnUIThread(
+    const DnsSdService& service,
+    int channel_id,
+    bool audio_only) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  MediaSinkInternal sink;
+  ErrorType error = CreateCastMediaSink(service, channel_id, audio_only, &sink);
+  if (error != ErrorType::NONE) {
+    DVLOG(2) << "Fail to create Cast device [error]: " << error;
+    return;
+  }
+
+  if (!base::ContainsValue(current_services_, service)) {
+    DVLOG(2) << "Service data not found in current service data list...";
+    return;
+  }
+
+  DVLOG(2) << "Ading sink to current_sinks_ [id]: " << sink.sink().id();
+  current_sinks_.insert(sink);
+  MediaSinkServiceBase::RestartTimer();
+}
+
+CastMediaSinkService::CastSocketObserver::CastSocketObserver() {}
+CastMediaSinkService::CastSocketObserver::~CastSocketObserver() {}
+
+void CastMediaSinkService::CastSocketObserver::OnError(
+    const cast_channel::CastSocket& socket,
+    cast_channel::ChannelError error_state) {
+  DVLOG(1) << "OnError [ip_endpoint]: " << socket.ip_endpoint().ToString()
+           << " [error_state]: "
+           << cast_channel::ChannelErrorToString(error_state);
+}
+
+void CastMediaSinkService::CastSocketObserver::OnMessage(
+    const cast_channel::CastSocket& socket,
+    const cast_channel::CastMessage& message) {}
+
+}  // namespace media_router
diff --git a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.h b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.h
new file mode 100644
index 0000000..2030c05
--- /dev/null
+++ b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.h
@@ -0,0 +1,132 @@
+// 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_MEDIA_ROUTER_DISCOVERY_MDNS_CAST_MEDIA_SINK_SERVICE_H_
+#define CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_MDNS_CAST_MEDIA_SINK_SERVICE_H_
+
+#include <memory>
+#include <set>
+
+#include "base/gtest_prod_util.h"
+#include "base/memory/ref_counted.h"
+#include "base/threading/thread_checker.h"
+#include "chrome/browser/media/router/discovery/mdns/dns_sd_delegate.h"
+#include "chrome/browser/media/router/discovery/mdns/dns_sd_registry.h"
+#include "chrome/browser/media/router/discovery/media_sink_service_base.h"
+#include "components/cast_channel/cast_channel_enum.h"
+#include "components/cast_channel/cast_socket.h"
+#include "net/base/ip_endpoint.h"
+
+namespace cast_channel {
+class CastSocketService;
+}  // namespace cast_channel
+
+namespace content {
+class BrowserContext;
+}  // namespace content
+
+namespace media_router {
+
+// A service which can be used to start background discovery and resolution of
+// Cast devices.
+// Public APIs should be invoked on the UI thread.
+class CastMediaSinkService
+    : public MediaSinkServiceBase,
+      public DnsSdRegistry::DnsSdObserver,
+      public base::RefCountedThreadSafe<CastMediaSinkService> {
+ public:
+  CastMediaSinkService(const OnSinksDiscoveredCallback& callback,
+                       content::BrowserContext* browser_context);
+
+  // Used by unit tests.
+  CastMediaSinkService(const OnSinksDiscoveredCallback& callback,
+                       cast_channel::CastSocketService* cast_socket_service);
+
+  // mDNS service types.
+  static const char kCastServiceType[];
+
+  // MediaSinkService implementation
+  void Start() override;
+  void Stop() override;
+
+ protected:
+  // Used to mock out the DnsSdRegistry for testing.
+  void SetDnsSdRegistryForTest(DnsSdRegistry* registry);
+
+  ~CastMediaSinkService() override;
+
+ private:
+  // Receives incoming messages and errors and provides additional API context.
+  class CastSocketObserver : public cast_channel::CastSocket::Observer {
+   public:
+    CastSocketObserver();
+    ~CastSocketObserver() override;
+
+    // CastSocket::Observer implementation.
+    void OnError(const cast_channel::CastSocket& socket,
+                 cast_channel::ChannelError error_state) override;
+    void OnMessage(const cast_channel::CastSocket& socket,
+                   const cast_channel::CastMessage& message) override;
+
+   private:
+    DISALLOW_COPY_AND_ASSIGN(CastSocketObserver);
+  };
+
+  friend class base::RefCountedThreadSafe<CastMediaSinkService>;
+  friend class CastMediaSinkServiceTest;
+
+  FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceTest, TestReStartAfterStop);
+  FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceTest, TestMultipleStartAndStop);
+  FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceTest,
+                           TestOnChannelOpenedOnIOThread);
+  FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceTest,
+                           TestMultipleOnChannelOpenedOnIOThread);
+  FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceTest, TestOnDnsSdEvent);
+  FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceTest, TestMultipleOnDnsSdEvent);
+  FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceTest, TestTimer);
+
+  // DnsSdRegistry::DnsSdObserver implementation
+  void OnDnsSdEvent(const std::string& service_type,
+                    const DnsSdRegistry::DnsSdServiceList& services) override;
+
+  // Opens cast channel on IO thread.
+  // |service|: mDNS service description.
+  // |ip_endpoint|: cast channel's target IP endpoint.
+  void OpenChannelOnIOThread(const DnsSdService& service,
+                             const net::IPEndPoint& ip_endpoint);
+
+  // Invoked when opening cast channel on IO thread completes.
+  // |service|: mDNS service description.
+  // |channel_id|: channel id of newly created cast channel.
+  // |channel_error|: error encounted when opending cast channel.
+  void OnChannelOpenedOnIOThread(const DnsSdService& service,
+                                 int channel_id,
+                                 cast_channel::ChannelError channel_error);
+
+  // Invoked by |OnChannelOpenedOnIOThread| to post task on UI thread.
+  // |service|: mDNS service description.
+  // |channel_id|: channel id of newly created cast channel.
+  // |audio_only|: if cast channel is audio only or not.
+  void OnChannelOpenedOnUIThread(const DnsSdService& service,
+                                 int channel_id,
+                                 bool audio_only);
+
+  // Raw pointer to DnsSdRegistry instance, which is a global leaky singleton
+  // and lives as long as the browser process.
+  DnsSdRegistry* dns_sd_registry_ = nullptr;
+
+  // Service list from current round of discovery.
+  DnsSdRegistry::DnsSdServiceList current_services_;
+
+  // Service managing creating and removing cast channels.
+  scoped_refptr<cast_channel::CastSocketService> cast_socket_service_;
+
+  THREAD_CHECKER(thread_checker_);
+
+  DISALLOW_COPY_AND_ASSIGN(CastMediaSinkService);
+};
+
+}  // namespace media_router
+
+#endif  // CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_MDNS_CAST_MEDIA_SINK_SERVICE_H_
diff --git a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_unittest.cc b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_unittest.cc
new file mode 100644
index 0000000..7e12a975
--- /dev/null
+++ b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_unittest.cc
@@ -0,0 +1,309 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/media/router/discovery/mdns/cast_media_sink_service.h"
+#include "base/strings/stringprintf.h"
+#include "base/test/mock_callback.h"
+#include "base/timer/mock_timer.h"
+#include "chrome/browser/media/router/discovery/mdns/mock_dns_sd_registry.h"
+#include "chrome/browser/media/router/test_helper.h"
+#include "chrome/test/base/testing_profile.h"
+#include "components/cast_channel/cast_socket.h"
+#include "components/cast_channel/cast_socket_service.h"
+#include "components/cast_channel/cast_test_util.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using ::testing::_;
+using ::testing::Return;
+using ::testing::SaveArg;
+
+namespace {
+
+net::IPEndPoint CreateIPEndPoint(int num) {
+  net::IPAddress ip_address;
+  CHECK(ip_address.AssignFromIPLiteral(
+      base::StringPrintf("192.168.0.10%d", num)));
+  return net::IPEndPoint(ip_address, 8009 + num);
+}
+
+media_router::DnsSdService CreateDnsService(int num) {
+  net::IPEndPoint ip_endpoint = CreateIPEndPoint(num);
+  media_router::DnsSdService service;
+  service.service_name =
+      "_myDevice." +
+      std::string(media_router::CastMediaSinkService::kCastServiceType);
+  service.ip_address = ip_endpoint.address().ToString();
+  service.service_host_port = ip_endpoint.ToString();
+  service.service_data.push_back(base::StringPrintf("id=service %d", num));
+  service.service_data.push_back(
+      base::StringPrintf("fn=friendly name %d", num));
+  service.service_data.push_back(base::StringPrintf("md=model name %d", num));
+
+  return service;
+}
+
+void VerifyMediaSinkInternal(const media_router::MediaSinkInternal& cast_sink,
+                             const media_router::DnsSdService& service,
+                             int channel_id,
+                             bool audio_only) {
+  std::string id = base::StringPrintf("service %d", channel_id);
+  std::string name = base::StringPrintf("friendly name %d", channel_id);
+  std::string model_name = base::StringPrintf("model name %d", channel_id);
+  EXPECT_EQ(id, cast_sink.sink().id());
+  EXPECT_EQ(name, cast_sink.sink().name());
+  EXPECT_EQ(model_name, cast_sink.cast_data().model_name);
+  EXPECT_EQ(service.ip_address, cast_sink.cast_data().ip_address.ToString());
+
+  int capabilities = cast_channel::CastDeviceCapability::AUDIO_OUT;
+  if (!audio_only)
+    capabilities |= cast_channel::CastDeviceCapability::VIDEO_OUT;
+  EXPECT_EQ(capabilities, cast_sink.cast_data().capabilities);
+  EXPECT_EQ(channel_id, cast_sink.cast_data().cast_channel_id);
+}
+
+}  // namespace
+
+namespace media_router {
+
+class MockCastSocketService : public cast_channel::CastSocketService {
+ public:
+  MOCK_METHOD4(OpenSocket,
+               int(const net::IPEndPoint& ip_endpoint,
+                   net::NetLog* net_log,
+                   const cast_channel::CastSocket::OnOpenCallback& open_cb,
+                   cast_channel::CastSocket::Observer* observer));
+  MOCK_CONST_METHOD1(GetSocket, cast_channel::CastSocket*(int channel_id));
+
+ private:
+  ~MockCastSocketService() {}
+};
+
+class CastMediaSinkServiceTest : public ::testing::Test {
+ public:
+  CastMediaSinkServiceTest()
+      : mock_cast_socket_service_(new MockCastSocketService()),
+        media_sink_service_(
+            new CastMediaSinkService(mock_sink_discovered_cb_.Get(),
+                                     mock_cast_socket_service_.get())),
+        test_dns_sd_registry_(media_sink_service_.get()) {}
+
+  void SetUp() override {
+    auto mock_timer = base::MakeUnique<base::MockTimer>(
+        true /*retain_user_task*/, false /*is_repeating*/);
+    mock_timer_ = mock_timer.get();
+    media_sink_service_->SetTimerForTest(std::move(mock_timer));
+  }
+
+ protected:
+  const content::TestBrowserThreadBundle thread_bundle_;
+  TestingProfile profile_;
+
+  base::MockCallback<MediaSinkService::OnSinksDiscoveredCallback>
+      mock_sink_discovered_cb_;
+  scoped_refptr<MockCastSocketService> mock_cast_socket_service_;
+  scoped_refptr<CastMediaSinkService> media_sink_service_;
+  MockDnsSdRegistry test_dns_sd_registry_;
+  base::MockTimer* mock_timer_;
+
+  DISALLOW_COPY_AND_ASSIGN(CastMediaSinkServiceTest);
+};
+
+TEST_F(CastMediaSinkServiceTest, TestReStartAfterStop) {
+  EXPECT_CALL(test_dns_sd_registry_, AddObserver(media_sink_service_.get()))
+      .Times(2);
+  EXPECT_CALL(test_dns_sd_registry_, RegisterDnsSdListener(_)).Times(2);
+  EXPECT_FALSE(mock_timer_->IsRunning());
+  media_sink_service_->SetDnsSdRegistryForTest(&test_dns_sd_registry_);
+  media_sink_service_->Start();
+  EXPECT_TRUE(mock_timer_->IsRunning());
+
+  EXPECT_CALL(test_dns_sd_registry_, RemoveObserver(media_sink_service_.get()));
+  EXPECT_CALL(test_dns_sd_registry_, UnregisterDnsSdListener(_));
+  media_sink_service_->Stop();
+
+  mock_timer_ =
+      new base::MockTimer(true /*retain_user_task*/, false /*is_repeating*/);
+  media_sink_service_->SetTimerForTest(base::WrapUnique(mock_timer_));
+  media_sink_service_->SetDnsSdRegistryForTest(&test_dns_sd_registry_);
+  media_sink_service_->Start();
+  EXPECT_TRUE(mock_timer_->IsRunning());
+}
+
+TEST_F(CastMediaSinkServiceTest, TestMultipleStartAndStop) {
+  EXPECT_CALL(test_dns_sd_registry_, AddObserver(media_sink_service_.get()));
+  EXPECT_CALL(test_dns_sd_registry_, RegisterDnsSdListener(_));
+  media_sink_service_->SetDnsSdRegistryForTest(&test_dns_sd_registry_);
+  media_sink_service_->Start();
+  media_sink_service_->Start();
+  EXPECT_TRUE(mock_timer_->IsRunning());
+
+  EXPECT_CALL(test_dns_sd_registry_, RemoveObserver(media_sink_service_.get()));
+  EXPECT_CALL(test_dns_sd_registry_, UnregisterDnsSdListener(_));
+  media_sink_service_->Stop();
+  media_sink_service_->Stop();
+}
+
+TEST_F(CastMediaSinkServiceTest, TestOnChannelOpenedOnIOThread) {
+  DnsSdService service = CreateDnsService(1);
+  cast_channel::MockCastSocket socket;
+  EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1))
+      .WillOnce(Return(&socket));
+
+  media_sink_service_->current_services_.push_back(service);
+  media_sink_service_->OnChannelOpenedOnIOThread(
+      service, 1, cast_channel::ChannelError::NONE);
+  // Invoke CastMediaSinkService::OnChannelOpenedOnUIThread on the UI thread.
+  base::RunLoop().RunUntilIdle();
+
+  // Verify sink content
+  EXPECT_EQ(size_t(1), media_sink_service_->current_sinks_.size());
+  for (const auto& sink_it : media_sink_service_->current_sinks_)
+    VerifyMediaSinkInternal(sink_it, service, 1, false);
+}
+
+TEST_F(CastMediaSinkServiceTest, TestMultipleOnChannelOpenedOnIOThread) {
+  DnsSdService service1 = CreateDnsService(1);
+  DnsSdService service2 = CreateDnsService(2);
+  DnsSdService service3 = CreateDnsService(3);
+
+  cast_channel::MockCastSocket socket2;
+  cast_channel::MockCastSocket socket3;
+  // Fail to open channel 1.
+  EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1))
+      .WillOnce(Return(nullptr));
+  EXPECT_CALL(*mock_cast_socket_service_, GetSocket(2))
+      .WillOnce(Return(&socket2));
+  EXPECT_CALL(*mock_cast_socket_service_, GetSocket(3))
+      .WillOnce(Return(&socket2));
+
+  // Current round of Dns discovery finds service1 and service 2.
+  media_sink_service_->current_services_.push_back(service1);
+  media_sink_service_->current_services_.push_back(service2);
+  media_sink_service_->OnChannelOpenedOnIOThread(
+      service1, 1, cast_channel::ChannelError::NONE);
+  media_sink_service_->OnChannelOpenedOnIOThread(
+      service2, 2, cast_channel::ChannelError::NONE);
+  media_sink_service_->OnChannelOpenedOnIOThread(
+      service3, 3, cast_channel::ChannelError::NONE);
+  // Invoke CastMediaSinkService::OnChannelOpenedOnUIThread on the UI thread.
+  base::RunLoop().RunUntilIdle();
+
+  // Verify sink content
+  EXPECT_EQ(size_t(1), media_sink_service_->current_sinks_.size());
+  for (const auto& sink_it : media_sink_service_->current_sinks_)
+    VerifyMediaSinkInternal(sink_it, service2, 2, false);
+}
+
+TEST_F(CastMediaSinkServiceTest, TestOnDnsSdEvent) {
+  DnsSdService service1 = CreateDnsService(1);
+  DnsSdService service2 = CreateDnsService(2);
+  net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1);
+  net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2);
+
+  // Add dns services.
+  DnsSdRegistry::DnsSdServiceList service_list{service1, service2};
+
+  cast_channel::CastSocket::OnOpenCallback callback1;
+  cast_channel::CastSocket::OnOpenCallback callback2;
+  EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint1, _, _, _))
+      .WillOnce(DoAll(SaveArg<2>(&callback1), Return(1)));
+  EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint2, _, _, _))
+      .WillOnce(DoAll(SaveArg<2>(&callback2), Return(2)));
+
+  // Invoke CastSocketService::OpenSocket on the IO thread.
+  media_sink_service_->OnDnsSdEvent(CastMediaSinkService::kCastServiceType,
+                                    service_list);
+  base::RunLoop().RunUntilIdle();
+
+  cast_channel::MockCastSocket socket1;
+  cast_channel::MockCastSocket socket2;
+
+  EXPECT_CALL(*mock_cast_socket_service_, GetSocket(1))
+      .WillOnce(Return(&socket1));
+  EXPECT_CALL(*mock_cast_socket_service_, GetSocket(2))
+      .WillOnce(Return(&socket2));
+
+  callback1.Run(1, cast_channel::ChannelError::NONE);
+  callback2.Run(2, cast_channel::ChannelError::NONE);
+
+  // Invoke CastMediaSinkService::OnChannelOpenedOnUIThread on the UI thread.
+  base::RunLoop().RunUntilIdle();
+  // Verify sink content
+  EXPECT_EQ(size_t(2), media_sink_service_->current_sinks_.size());
+}
+
+TEST_F(CastMediaSinkServiceTest, TestMultipleOnDnsSdEvent) {
+  DnsSdService service1 = CreateDnsService(1);
+  DnsSdService service2 = CreateDnsService(2);
+  DnsSdService service3 = CreateDnsService(3);
+  net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1);
+  net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2);
+  net::IPEndPoint ip_endpoint3 = CreateIPEndPoint(3);
+
+  // 1st round finds service 1 & 2.
+  DnsSdRegistry::DnsSdServiceList service_list1{service1, service2};
+  media_sink_service_->OnDnsSdEvent(CastMediaSinkService::kCastServiceType,
+                                    service_list1);
+
+  EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint1, _, _, _));
+  EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint2, _, _, _));
+  base::RunLoop().RunUntilIdle();
+
+  // Channel 2 opened.
+  media_sink_service_->OnChannelOpenedOnUIThread(service2, 2, false);
+
+  // 2nd round finds service 2 & 3.
+  DnsSdRegistry::DnsSdServiceList service_list2{service2, service3};
+  media_sink_service_->OnDnsSdEvent(CastMediaSinkService::kCastServiceType,
+                                    service_list2);
+
+  EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint2, _, _, _));
+  EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint3, _, _, _));
+  base::RunLoop().RunUntilIdle();
+
+  // Channel 1 and 3 opened.
+  media_sink_service_->OnChannelOpenedOnUIThread(service1, 1, false);
+  media_sink_service_->OnChannelOpenedOnUIThread(service3, 3, false);
+
+  EXPECT_EQ(size_t(1), media_sink_service_->current_sinks_.size());
+  for (const auto& sink_it : media_sink_service_->current_sinks_)
+    VerifyMediaSinkInternal(sink_it, service3, 3, false);
+}
+
+TEST_F(CastMediaSinkServiceTest, TestTimer) {
+  DnsSdService service1 = CreateDnsService(1);
+  DnsSdService service2 = CreateDnsService(2);
+  net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1);
+  net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2);
+
+  EXPECT_FALSE(mock_timer_->IsRunning());
+  // finds service 1 & 2.
+  DnsSdRegistry::DnsSdServiceList service_list1{service1, service2};
+  media_sink_service_->OnDnsSdEvent(CastMediaSinkService::kCastServiceType,
+                                    service_list1);
+
+  EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint1, _, _, _));
+  EXPECT_CALL(*mock_cast_socket_service_, OpenSocket(ip_endpoint2, _, _, _));
+  base::RunLoop().RunUntilIdle();
+
+  // Channel 2 is opened.
+  media_sink_service_->OnChannelOpenedOnUIThread(service2, 2, false);
+
+  std::vector<MediaSinkInternal> sinks;
+  EXPECT_CALL(mock_sink_discovered_cb_, Run(_)).WillOnce(SaveArg<0>(&sinks));
+
+  // Fire timer.
+  mock_timer_->Fire();
+  EXPECT_EQ(size_t(1), sinks.size());
+  VerifyMediaSinkInternal(sinks[0], service2, 2, false);
+
+  EXPECT_FALSE(mock_timer_->IsRunning());
+  // Channel 1 is opened and timer is restarted.
+  media_sink_service_->OnChannelOpenedOnUIThread(service1, 1, false);
+  EXPECT_TRUE(mock_timer_->IsRunning());
+}
+
+}  // namespace media_router
diff --git a/chrome/browser/media/router/discovery/mdns/mock_dns_sd_registry.cc b/chrome/browser/media/router/discovery/mdns/mock_dns_sd_registry.cc
index 2e8f055a..dd32a7f 100644
--- a/chrome/browser/media/router/discovery/mdns/mock_dns_sd_registry.cc
+++ b/chrome/browser/media/router/discovery/mdns/mock_dns_sd_registry.cc
@@ -7,7 +7,7 @@
 namespace media_router {
 
 MockDnsSdRegistry::MockDnsSdRegistry(DnsSdRegistry::DnsSdObserver* observer)
-    : observer_(observer) {}
+    : DnsSdRegistry(nullptr), observer_(observer) {}
 
 MockDnsSdRegistry::~MockDnsSdRegistry() {}
 
diff --git a/chrome/browser/media/router/mojo/media_router_mojo_impl.cc b/chrome/browser/media/router/mojo/media_router_mojo_impl.cc
index ee3c4c6..3c7d8bf 100644
--- a/chrome/browser/media/router/mojo/media_router_mojo_impl.cc
+++ b/chrome/browser/media/router/mojo/media_router_mojo_impl.cc
@@ -16,6 +16,7 @@
 #include "base/stl_util.h"
 #include "base/strings/stringprintf.h"
 #include "chrome/browser/media/router/discovery/dial/dial_media_sink_service_proxy.h"
+#include "chrome/browser/media/router/discovery/mdns/cast_media_sink_service.h"
 #include "chrome/browser/media/router/event_page_request_manager.h"
 #include "chrome/browser/media/router/event_page_request_manager_factory.h"
 #include "chrome/browser/media/router/issues_observer.h"
@@ -429,8 +430,8 @@
 void MediaRouterMojoImpl::ProvideSinks(const std::string& provider_name,
                                        std::vector<MediaSinkInternal> sinks) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  DVLOG_WITH_INSTANCE(1) << "OnDialMediaSinkDiscovered found " << sinks.size()
-                         << " devices...";
+  DVLOG_WITH_INSTANCE(1) << "Provider [" << provider_name << "] found "
+                         << sinks.size() << " devices...";
 
   event_page_request_manager_->RunOrDefer(
       base::Bind(&MediaRouterMojoImpl::DoProvideSinks,
@@ -941,8 +942,7 @@
   }
 #endif
 
-  if (media_router::DialLocalDiscoveryEnabled())
-    StartDiscovery();
+  StartDiscovery();
 }
 
 #if defined(OS_WIN)
@@ -976,14 +976,25 @@
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DVLOG_WITH_INSTANCE(1) << "StartDiscovery";
 
-  if (!dial_media_sink_service_proxy_) {
-    dial_media_sink_service_proxy_ = new DialMediaSinkServiceProxy(
-        base::Bind(&MediaRouterMojoImpl::ProvideSinks,
-                   weak_factory_.GetWeakPtr(), "dial"),
-        context_);
+  if (media_router::DialLocalDiscoveryEnabled()) {
+    if (!dial_media_sink_service_proxy_) {
+      dial_media_sink_service_proxy_ = new DialMediaSinkServiceProxy(
+          base::Bind(&MediaRouterMojoImpl::ProvideSinks,
+                     weak_factory_.GetWeakPtr(), "dial"),
+          context_);
+    }
+    dial_media_sink_service_proxy_->Start();
   }
 
-  dial_media_sink_service_proxy_->Start();
+  if (media_router::CastDiscoveryEnabled()) {
+    if (!cast_media_sink_service_) {
+      cast_media_sink_service_ = new CastMediaSinkService(
+          base::Bind(&MediaRouterMojoImpl::ProvideSinks,
+                     weak_factory_.GetWeakPtr(), "cast"),
+          context_);
+    }
+    cast_media_sink_service_->Start();
+  }
 }
 
 void MediaRouterMojoImpl::UpdateMediaSinks(
diff --git a/chrome/browser/media/router/mojo/media_router_mojo_impl.h b/chrome/browser/media/router/mojo/media_router_mojo_impl.h
index 01cb711..3e9627c 100644
--- a/chrome/browser/media/router/mojo/media_router_mojo_impl.h
+++ b/chrome/browser/media/router/mojo/media_router_mojo_impl.h
@@ -44,6 +44,7 @@
 namespace media_router {
 
 enum class MediaRouteProviderWakeReason;
+class CastMediaSinkService;
 class DialMediaSinkServiceProxy;
 class EventPageRequestManager;
 
@@ -415,6 +416,9 @@
   // Media sink service for DIAL devices.
   scoped_refptr<DialMediaSinkServiceProxy> dial_media_sink_service_proxy_;
 
+  // Media sink service for CAST devices.
+  scoped_refptr<CastMediaSinkService> cast_media_sink_service_;
+
   content::BrowserContext* const context_;
 
   // Request manager responsible for waking the component extension and calling
diff --git a/chrome/browser/media/webrtc/webrtc_event_log_handler.cc b/chrome/browser/media/webrtc/webrtc_event_log_handler.cc
index 7ed5871..d8a3a6f 100644
--- a/chrome/browser/media/webrtc/webrtc_event_log_handler.cc
+++ b/chrome/browser/media/webrtc/webrtc_event_log_handler.cc
@@ -11,6 +11,7 @@
 #include "base/command_line.h"
 #include "base/files/file_util.h"
 #include "base/strings/string_number_conversions.h"
+#include "base/task_scheduler/post_task.h"
 #include "base/time/time.h"
 #include "chrome/browser/media/webrtc/webrtc_log_list.h"
 #include "chrome/browser/profiles/profile.h"
@@ -34,7 +35,10 @@
 
 WebRtcEventLogHandler::WebRtcEventLogHandler(int render_process_id,
                                              Profile* profile)
-    : render_process_id_(render_process_id),
+    : background_task_runner_(base::CreateSequencedTaskRunnerWithTraits(
+          {base::MayBlock(), base::WithBaseSyncPrimitives(),
+           base::TaskPriority::BACKGROUND})),
+      render_process_id_(render_process_id),
       profile_(profile),
       current_rtc_event_log_id_(0) {
   DCHECK(profile_);
@@ -48,8 +52,8 @@
     const RecordingErrorCallback& error_callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::FILE, FROM_HERE,
+  base::PostTaskAndReplyWithResult(
+      background_task_runner_.get(), FROM_HERE,
       base::Bind(&WebRtcEventLogHandler::GetLogDirectoryAndEnsureExists, this),
       base::Bind(&WebRtcEventLogHandler::DoStartWebRtcEventLogging, this,
                  duration, callback, error_callback));
@@ -61,8 +65,8 @@
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   const bool is_manual_stop = true;
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::FILE, FROM_HERE,
+  base::PostTaskAndReplyWithResult(
+      background_task_runner_.get(), FROM_HERE,
       base::Bind(&WebRtcEventLogHandler::GetLogDirectoryAndEnsureExists, this),
       base::Bind(&WebRtcEventLogHandler::DoStopWebRtcEventLogging, this,
                  is_manual_stop, current_rtc_event_log_id_, callback,
@@ -70,7 +74,7 @@
 }
 
 base::FilePath WebRtcEventLogHandler::GetLogDirectoryAndEnsureExists() {
-  DCHECK_CURRENTLY_ON(BrowserThread::FILE);
+  DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
   base::FilePath log_dir_path =
       WebRtcLogList::GetWebRtcLogDirectoryForProfile(profile_->GetPath());
   base::File::Error error;
diff --git a/chrome/browser/media/webrtc/webrtc_event_log_handler.h b/chrome/browser/media/webrtc/webrtc_event_log_handler.h
index b02b5e5..9f5c5cf6 100644
--- a/chrome/browser/media/webrtc/webrtc_event_log_handler.h
+++ b/chrome/browser/media/webrtc/webrtc_event_log_handler.h
@@ -13,6 +13,7 @@
 #include "base/callback.h"
 #include "base/files/file_path.h"
 #include "base/memory/ref_counted.h"
+#include "base/sequenced_task_runner.h"
 #include "base/threading/thread_checker.h"
 #include "base/time/time.h"
 
@@ -65,6 +66,8 @@
                                 const RecordingErrorCallback& error_callback,
                                 const base::FilePath& log_directory);
 
+  scoped_refptr<base::SequencedTaskRunner> background_task_runner_;
+
   // The ID of our render process.
   int render_process_id_;
 
diff --git a/chrome/browser/metrics/chrome_metrics_services_manager_client.cc b/chrome/browser/metrics/chrome_metrics_services_manager_client.cc
index 83594d47..d451a34 100644
--- a/chrome/browser/metrics/chrome_metrics_services_manager_client.cc
+++ b/chrome/browser/metrics/chrome_metrics_services_manager_client.cc
@@ -10,11 +10,13 @@
 #include "base/memory/ptr_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/task_scheduler/post_task.h"
+#include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
 #include "chrome/browser/metrics/chrome_metrics_service_client.h"
 #include "chrome/browser/metrics/variations/chrome_variations_service_client.h"
 #include "chrome/browser/metrics/variations/ui_string_overrider_factory.h"
+#include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_otr_state.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/installer/util/google_update_settings.h"
@@ -288,5 +290,15 @@
 }
 
 bool ChromeMetricsServicesManagerClient::IsIncognitoSessionActive() {
-  return chrome::IsIncognitoSessionActive();
+#if defined(OS_ANDROID)
+  // TODO(crbug/739971) On Android, we don't get notifications from TabModel
+  // when incognito tabs are opened, so this won't get re-evaluated reliably
+  // yet.  Assume there always an incognito tab open, which will keep UKM
+  // disabled.
+  return true;
+#else
+  // Depending directly on BrowserList, since that is the implementation
+  // that we get correct notifications for.
+  return BrowserList::IsIncognitoSessionActive();
+#endif
 }
diff --git a/chrome/browser/metrics/process_memory_metrics_emitter.cc b/chrome/browser/metrics/process_memory_metrics_emitter.cc
index e9098cca..b82634e2 100644
--- a/chrome/browser/metrics/process_memory_metrics_emitter.cc
+++ b/chrome/browser/metrics/process_memory_metrics_emitter.cc
@@ -8,6 +8,8 @@
 #include "base/trace_event/memory_dump_request_args.h"
 #include "content/public/common/service_manager_connection.h"
 #include "content/public/common/service_names.mojom.h"
+#include "services/metrics/public/cpp/ukm_entry_builder.h"
+#include "services/metrics/public/cpp/ukm_recorder.h"
 #include "services/service_manager/public/cpp/connector.h"
 
 using ProcessMemoryDumpPtr =
@@ -15,44 +17,87 @@
 
 namespace {
 
-void EmitBrowserMemoryMetrics(const ProcessMemoryDumpPtr& pmd) {
+void EmitBrowserMemoryMetrics(const ProcessMemoryDumpPtr& pmd,
+                              ukm::UkmEntryBuilder* builder) {
+  builder->AddMetric("ProcessType",
+                     static_cast<int64_t>(
+                         memory_instrumentation::mojom::ProcessType::BROWSER));
+
   UMA_HISTOGRAM_MEMORY_LARGE_MB("Memory.Experimental.Browser2.Resident",
                                 pmd->os_dump->resident_set_kb / 1024);
+  builder->AddMetric("Resident", pmd->os_dump->resident_set_kb / 1024);
+
   UMA_HISTOGRAM_MEMORY_LARGE_MB("Memory.Experimental.Browser2.Malloc",
                                 pmd->chrome_dump.malloc_total_kb / 1024);
+  builder->AddMetric("Malloc", pmd->chrome_dump.malloc_total_kb / 1024);
+
   UMA_HISTOGRAM_MEMORY_LARGE_MB(
       "Memory.Experimental.Browser2.PrivateMemoryFootprint",
       pmd->os_dump->private_footprint_kb / 1024);
+  builder->AddMetric("PrivateMemoryFootprint",
+                     pmd->os_dump->private_footprint_kb / 1024);
 }
 
-void EmitRendererMemoryMetrics(const ProcessMemoryDumpPtr& pmd) {
+void EmitRendererMemoryMetrics(const ProcessMemoryDumpPtr& pmd,
+                               ukm::UkmEntryBuilder* builder) {
+  builder->AddMetric("ProcessType",
+                     static_cast<int64_t>(
+                         memory_instrumentation::mojom::ProcessType::RENDERER));
+
   UMA_HISTOGRAM_MEMORY_LARGE_MB("Memory.Experimental.Renderer2.Resident",
                                 pmd->os_dump->resident_set_kb / 1024);
+  builder->AddMetric("Resident", pmd->os_dump->resident_set_kb / 1024);
+
+  UMA_HISTOGRAM_MEMORY_LARGE_MB("Memory.Experimental.Renderer2.Malloc",
+                                pmd->chrome_dump.malloc_total_kb / 1024);
+  builder->AddMetric("Malloc", pmd->chrome_dump.malloc_total_kb / 1024);
+
   UMA_HISTOGRAM_MEMORY_LARGE_MB(
       "Memory.Experimental.Renderer2.PrivateMemoryFootprint",
       pmd->os_dump->private_footprint_kb / 1024);
-  UMA_HISTOGRAM_MEMORY_LARGE_MB("Memory.Experimental.Renderer2.Malloc",
-                                pmd->chrome_dump.malloc_total_kb / 1024);
+  builder->AddMetric("PrivateMemoryFootprint",
+                     pmd->os_dump->private_footprint_kb / 1024);
+
   UMA_HISTOGRAM_MEMORY_LARGE_MB(
       "Memory.Experimental.Renderer2.PartitionAlloc",
       pmd->chrome_dump.partition_alloc_total_kb / 1024);
+  builder->AddMetric("PartitionAlloc",
+                     pmd->chrome_dump.partition_alloc_total_kb / 1024);
+
   UMA_HISTOGRAM_MEMORY_LARGE_MB("Memory.Experimental.Renderer2.BlinkGC",
                                 pmd->chrome_dump.blink_gc_total_kb / 1024);
+  builder->AddMetric("BlinkGC", pmd->chrome_dump.blink_gc_total_kb / 1024);
+
   UMA_HISTOGRAM_MEMORY_LARGE_MB("Memory.Experimental.Renderer2.V8",
                                 pmd->chrome_dump.v8_total_kb / 1024);
+  builder->AddMetric("V8", pmd->chrome_dump.v8_total_kb / 1024);
 }
 
-void EmitGpuMemoryMetrics(const ProcessMemoryDumpPtr& pmd) {
+void EmitGpuMemoryMetrics(const ProcessMemoryDumpPtr& pmd,
+                          ukm::UkmEntryBuilder* builder) {
+  builder->AddMetric(
+      "ProcessType",
+      static_cast<int64_t>(memory_instrumentation::mojom::ProcessType::GPU));
+
   UMA_HISTOGRAM_MEMORY_LARGE_MB("Memory.Experimental.Gpu2.Resident",
                                 pmd->os_dump->resident_set_kb / 1024);
+  builder->AddMetric("Resident", pmd->os_dump->resident_set_kb / 1024);
+
   UMA_HISTOGRAM_MEMORY_LARGE_MB("Memory.Experimental.Gpu2.Malloc",
                                 pmd->chrome_dump.malloc_total_kb / 1024);
+  builder->AddMetric("Malloc", pmd->chrome_dump.malloc_total_kb / 1024);
+
   UMA_HISTOGRAM_MEMORY_LARGE_MB(
       "Memory.Experimental.Gpu2.CommandBuffer",
       pmd->chrome_dump.command_buffer_total_kb / 1024);
+  builder->AddMetric("CommandBuffer",
+                     pmd->chrome_dump.command_buffer_total_kb / 1024);
+
   UMA_HISTOGRAM_MEMORY_LARGE_MB(
       "Memory.Experimental.Gpu2.PrivateMemoryFootprint",
       pmd->os_dump->private_footprint_kb / 1024);
+  builder->AddMetric("PrivateMemoryFootprint",
+                     pmd->os_dump->private_footprint_kb / 1024);
 }
 
 }  // namespace
@@ -77,6 +122,16 @@
 
 ProcessMemoryMetricsEmitter::~ProcessMemoryMetricsEmitter() {}
 
+std::unique_ptr<ukm::UkmEntryBuilder>
+ProcessMemoryMetricsEmitter::CreateUkmBuilder(const char* event_name) {
+  ukm::UkmRecorder* ukm_recorder = ukm::UkmRecorder::Get();
+  if (!ukm_recorder)
+    return nullptr;
+
+  const int32_t source_id = ukm_recorder->GetNewSourceID();
+  return ukm_recorder->GetEntryBuilder(source_id, event_name);
+}
+
 void ProcessMemoryMetricsEmitter::ReceivedMemoryDump(
     bool success,
     uint64_t dump_guid,
@@ -89,15 +144,23 @@
   uint32_t private_footprint_total_kb = 0;
   for (const ProcessMemoryDumpPtr& pmd : ptr->process_dumps) {
     private_footprint_total_kb += pmd->os_dump->private_footprint_kb;
+
+    // Populate a new entry for each ProcessMemoryDumpPtr in the global dump,
+    // annotating each entry with the dump GUID so that entries in the same
+    // global dump can be correlated with each other.
+    // TODO(jchinlee): Add URLs.
+    std::unique_ptr<ukm::UkmEntryBuilder> builder =
+        CreateUkmBuilder("Memory.Experimental");
+
     switch (pmd->process_type) {
       case memory_instrumentation::mojom::ProcessType::BROWSER:
-        EmitBrowserMemoryMetrics(pmd);
+        EmitBrowserMemoryMetrics(pmd, builder.get());
         break;
       case memory_instrumentation::mojom::ProcessType::RENDERER:
-        EmitRendererMemoryMetrics(pmd);
+        EmitRendererMemoryMetrics(pmd, builder.get());
         break;
       case memory_instrumentation::mojom::ProcessType::GPU:
-        EmitGpuMemoryMetrics(pmd);
+        EmitGpuMemoryMetrics(pmd, builder.get());
         break;
       case memory_instrumentation::mojom::ProcessType::UTILITY:
       case memory_instrumentation::mojom::ProcessType::PLUGIN:
@@ -108,4 +171,9 @@
   UMA_HISTOGRAM_MEMORY_LARGE_MB(
       "Memory.Experimental.Total2.PrivateMemoryFootprint",
       private_footprint_total_kb / 1024);
+
+  std::unique_ptr<ukm::UkmEntryBuilder> builder =
+      CreateUkmBuilder("Memory.Experimental");
+  builder->AddMetric("Total2.PrivateMemoryFootprint",
+                     private_footprint_total_kb / 1024);
 }
diff --git a/chrome/browser/metrics/process_memory_metrics_emitter.h b/chrome/browser/metrics/process_memory_metrics_emitter.h
index 0358a8f..fa91d276 100644
--- a/chrome/browser/metrics/process_memory_metrics_emitter.h
+++ b/chrome/browser/metrics/process_memory_metrics_emitter.h
@@ -8,6 +8,10 @@
 #include "base/memory/ref_counted.h"
 #include "services/resource_coordinator/public/interfaces/memory_instrumentation/memory_instrumentation.mojom.h"
 
+namespace ukm {
+class UkmEntryBuilder;
+}
+
 // This class asynchronously fetches memory metrics for each process, and then
 // emits UMA metrics from those metrics.
 // Each instance is self-owned, and will delete itself once it has finished
@@ -35,6 +39,9 @@
  private:
   friend class base::RefCountedThreadSafe<ProcessMemoryMetricsEmitter>;
 
+  std::unique_ptr<ukm::UkmEntryBuilder> CreateUkmBuilder(
+      const char* event_name);
+
   memory_instrumentation::mojom::CoordinatorPtr coordinator_;
 
   DISALLOW_COPY_AND_ASSIGN(ProcessMemoryMetricsEmitter);
diff --git a/chrome/browser/metrics/process_memory_metrics_emitter_unittest.cc b/chrome/browser/metrics/process_memory_metrics_emitter_unittest.cc
new file mode 100644
index 0000000..1b27d2c8
--- /dev/null
+++ b/chrome/browser/metrics/process_memory_metrics_emitter_unittest.cc
@@ -0,0 +1,265 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/metrics/process_memory_metrics_emitter.h"
+
+#include "base/containers/flat_map.h"
+#include "base/memory/ref_counted.h"
+#include "components/ukm/test_ukm_recorder.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using GlobalMemoryDumpPtr = memory_instrumentation::mojom::GlobalMemoryDumpPtr;
+using ProcessMemoryDumpPtr =
+    memory_instrumentation::mojom::ProcessMemoryDumpPtr;
+using OSMemDumpPtr = memory_instrumentation::mojom::OSMemDumpPtr;
+using ProcessType = memory_instrumentation::mojom::ProcessType;
+
+namespace {
+
+// Provide fake to surface ReceivedMemoryDump to public visibility.
+class ProcessMemoryMetricsEmitterFake : public ProcessMemoryMetricsEmitter {
+ public:
+  ProcessMemoryMetricsEmitterFake() {}
+
+  void ReceivedMemoryDump(
+      bool success,
+      uint64_t dump_guid,
+      memory_instrumentation::mojom::GlobalMemoryDumpPtr ptr) override {
+    ProcessMemoryMetricsEmitter::ReceivedMemoryDump(success, dump_guid,
+                                                    std::move(ptr));
+  }
+
+ private:
+  ~ProcessMemoryMetricsEmitterFake() override {}
+
+  DISALLOW_COPY_AND_ASSIGN(ProcessMemoryMetricsEmitterFake);
+};
+
+void PopulateBrowserMetrics(GlobalMemoryDumpPtr& global_dump,
+                            base::flat_map<const char*, int64_t>& metrics_mb) {
+  ProcessMemoryDumpPtr pmd(
+      memory_instrumentation::mojom::ProcessMemoryDump::New());
+  pmd->process_type = ProcessType::BROWSER;
+  pmd->chrome_dump.malloc_total_kb = metrics_mb["Malloc"] * 1024;
+  OSMemDumpPtr os_dump(memory_instrumentation::mojom::OSMemDump::New(
+      metrics_mb["Resident"] * 1024,
+      metrics_mb["PrivateMemoryFootprint"] * 1024));
+  pmd->os_dump = std::move(os_dump);
+  global_dump->process_dumps.push_back(std::move(pmd));
+}
+
+base::flat_map<const char*, int64_t> GetExpectedBrowserMetrics() {
+  return base::flat_map<const char*, int64_t>(
+      {
+          {"ProcessType", static_cast<int64_t>(ProcessType::BROWSER)},
+          {"Resident", 10},
+          {"Malloc", 20},
+          {"PrivateMemoryFootprint", 30},
+      },
+      base::KEEP_FIRST_OF_DUPES);
+}
+
+void PopulateRendererMetrics(GlobalMemoryDumpPtr& global_dump,
+                             base::flat_map<const char*, int64_t>& metrics_mb) {
+  ProcessMemoryDumpPtr pmd(
+      memory_instrumentation::mojom::ProcessMemoryDump::New());
+  pmd->process_type = ProcessType::RENDERER;
+  pmd->chrome_dump.malloc_total_kb = metrics_mb["Malloc"] * 1024;
+  pmd->chrome_dump.partition_alloc_total_kb =
+      metrics_mb["PartitionAlloc"] * 1024;
+  pmd->chrome_dump.blink_gc_total_kb = metrics_mb["BlinkGC"] * 1024;
+  pmd->chrome_dump.v8_total_kb = metrics_mb["V8"] * 1024;
+  OSMemDumpPtr os_dump(memory_instrumentation::mojom::OSMemDump::New(
+      metrics_mb["Resident"] * 1024,
+      metrics_mb["PrivateMemoryFootprint"] * 1024));
+  pmd->os_dump = std::move(os_dump);
+  global_dump->process_dumps.push_back(std::move(pmd));
+}
+
+base::flat_map<const char*, int64_t> GetExpectedRendererMetrics() {
+  return base::flat_map<const char*, int64_t>(
+      {
+          {"ProcessType", static_cast<int64_t>(ProcessType::RENDERER)},
+          {"Resident", 110},
+          {"Malloc", 120},
+          {"PrivateMemoryFootprint", 130},
+          {"PartitionAlloc", 140},
+          {"BlinkGC", 150},
+          {"V8", 160},
+      },
+      base::KEEP_FIRST_OF_DUPES);
+}
+
+void PopulateGpuMetrics(GlobalMemoryDumpPtr& global_dump,
+                        base::flat_map<const char*, int64_t>& metrics_mb) {
+  ProcessMemoryDumpPtr pmd(
+      memory_instrumentation::mojom::ProcessMemoryDump::New());
+  pmd->process_type = ProcessType::GPU;
+  pmd->chrome_dump.malloc_total_kb = metrics_mb["Malloc"] * 1024;
+  pmd->chrome_dump.command_buffer_total_kb = metrics_mb["CommandBuffer"] * 1024;
+  OSMemDumpPtr os_dump(memory_instrumentation::mojom::OSMemDump::New(
+      metrics_mb["Resident"] * 1024,
+      metrics_mb["PrivateMemoryFootprint"] * 1024));
+  pmd->os_dump = std::move(os_dump);
+  global_dump->process_dumps.push_back(std::move(pmd));
+}
+
+base::flat_map<const char*, int64_t> GetExpectedGpuMetrics() {
+  return base::flat_map<const char*, int64_t>(
+      {
+          {"ProcessType", static_cast<int64_t>(ProcessType::GPU)},
+          {"Resident", 210},
+          {"Malloc", 220},
+          {"PrivateMemoryFootprint", 230},
+          {"CommandBuffer", 240},
+      },
+      base::KEEP_FIRST_OF_DUPES);
+}
+
+void PopulateMetrics(GlobalMemoryDumpPtr& global_dump,
+                     ProcessType ptype,
+                     base::flat_map<const char*, int64_t>& metrics_mb) {
+  switch (ptype) {
+    case ProcessType::BROWSER:
+      PopulateBrowserMetrics(global_dump, metrics_mb);
+      return;
+    case ProcessType::RENDERER:
+      PopulateRendererMetrics(global_dump, metrics_mb);
+      return;
+    case ProcessType::GPU:
+      PopulateGpuMetrics(global_dump, metrics_mb);
+      return;
+    case ProcessType::UTILITY:
+    case ProcessType::PLUGIN:
+    case ProcessType::OTHER:
+      break;
+  }
+
+  // We shouldn't reach here.
+  FAIL() << "Unknown process type case " << ptype << ".";
+}
+
+base::flat_map<const char*, int64_t> GetExpectedProcessMetrics(
+    ProcessType ptype) {
+  switch (ptype) {
+    case ProcessType::BROWSER:
+      return GetExpectedBrowserMetrics();
+    case ProcessType::RENDERER:
+      return GetExpectedRendererMetrics();
+    case ProcessType::GPU:
+      return GetExpectedGpuMetrics();
+    case ProcessType::UTILITY:
+    case ProcessType::PLUGIN:
+    case ProcessType::OTHER:
+      break;
+  }
+
+  // We shouldn't reach here.
+  CHECK(false);
+  return base::flat_map<const char*, int64_t>();
+}
+
+}  // namespace
+
+class ProcessMemoryMetricsEmitterTest
+    : public testing::TestWithParam<ProcessType> {
+ public:
+  ProcessMemoryMetricsEmitterTest() {}
+  ~ProcessMemoryMetricsEmitterTest() override {}
+
+ protected:
+  void CheckMemoryUkmEntryMetrics(
+      size_t entry_num,
+      base::flat_map<const char*, int64_t> expected) {
+    const ukm::mojom::UkmEntry* entry = test_ukm_recorder_.GetEntry(entry_num);
+    CHECK(entry != nullptr);
+    EXPECT_EQ(expected.size(), entry->metrics.size());
+    for (auto it = expected.begin(); it != expected.end(); ++it) {
+      const ukm::mojom::UkmMetric* actual =
+          test_ukm_recorder_.FindMetric(entry, it->first);
+      CHECK(actual != nullptr);
+      EXPECT_EQ(it->second, actual->value);
+    }
+  }
+
+  ukm::TestUkmRecorder test_ukm_recorder_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ProcessMemoryMetricsEmitterTest);
+};
+
+TEST_P(ProcessMemoryMetricsEmitterTest, CollectsSingleProcessUKMs) {
+  base::flat_map<const char*, int64_t> expected_metrics =
+      GetExpectedProcessMetrics(GetParam());
+  uint64_t dump_guid = 333;
+
+  GlobalMemoryDumpPtr global_dump(
+      memory_instrumentation::mojom::GlobalMemoryDump::New());
+  PopulateMetrics(global_dump, GetParam(), expected_metrics);
+
+  scoped_refptr<ProcessMemoryMetricsEmitterFake> emitter(
+      new ProcessMemoryMetricsEmitterFake());
+  emitter->ReceivedMemoryDump(true, dump_guid, std::move(global_dump));
+
+  EXPECT_EQ(2u, test_ukm_recorder_.entries_count());
+  CheckMemoryUkmEntryMetrics(0, expected_metrics);
+}
+
+INSTANTIATE_TEST_CASE_P(SinglePtype,
+                        ProcessMemoryMetricsEmitterTest,
+                        testing::Values(ProcessType::BROWSER,
+                                        ProcessType::RENDERER,
+                                        ProcessType::GPU));
+
+TEST_F(ProcessMemoryMetricsEmitterTest, CollectsManyProcessUKMsSingleDump) {
+  std::vector<ProcessType> entries_ptypes = {
+      ProcessType::BROWSER, ProcessType::RENDERER, ProcessType::GPU,
+      ProcessType::GPU,     ProcessType::RENDERER, ProcessType::BROWSER,
+  };
+  uint64_t dump_guid = 333;
+
+  GlobalMemoryDumpPtr global_dump(
+      memory_instrumentation::mojom::GlobalMemoryDump::New());
+  std::vector<base::flat_map<const char*, int64_t>> entries_metrics;
+  for (const auto& ptype : entries_ptypes) {
+    auto expected_metrics = GetExpectedProcessMetrics(ptype);
+    PopulateMetrics(global_dump, ptype, expected_metrics);
+    entries_metrics.push_back(expected_metrics);
+  }
+
+  scoped_refptr<ProcessMemoryMetricsEmitterFake> emitter(
+      new ProcessMemoryMetricsEmitterFake());
+  emitter->ReceivedMemoryDump(true, dump_guid, std::move(global_dump));
+
+  EXPECT_EQ(7u, test_ukm_recorder_.entries_count());
+  for (size_t i = 0; i < entries_ptypes.size(); ++i) {
+    CheckMemoryUkmEntryMetrics(i, entries_metrics[i]);
+  }
+}
+
+TEST_F(ProcessMemoryMetricsEmitterTest, CollectsManyProcessUKMsManyDumps) {
+  std::vector<std::vector<ProcessType>> entries_ptypes = {
+      {ProcessType::BROWSER, ProcessType::RENDERER, ProcessType::GPU},
+      {ProcessType::GPU, ProcessType::RENDERER, ProcessType::BROWSER},
+  };
+
+  std::vector<base::flat_map<const char*, int64_t>> entries_metrics;
+  scoped_refptr<ProcessMemoryMetricsEmitterFake> emitter(
+      new ProcessMemoryMetricsEmitterFake());
+  for (int i = 0; i < 2; ++i) {
+    GlobalMemoryDumpPtr global_dump(
+        memory_instrumentation::mojom::GlobalMemoryDump::New());
+    for (const auto& ptype : entries_ptypes[i]) {
+      auto expected_metrics = GetExpectedProcessMetrics(ptype);
+      PopulateMetrics(global_dump, ptype, expected_metrics);
+      entries_metrics.push_back(expected_metrics);
+    }
+    emitter->ReceivedMemoryDump(true, i, std::move(global_dump));
+  }
+
+  EXPECT_EQ(8u, test_ukm_recorder_.entries_count());
+  for (size_t i = 0; i < entries_ptypes.size(); ++i) {
+    CheckMemoryUkmEntryMetrics(i, entries_metrics[i]);
+  }
+}
diff --git a/chrome/browser/net/predictor.cc b/chrome/browser/net/predictor.cc
index c1dc2d12..f99580da 100644
--- a/chrome/browser/net/predictor.cc
+++ b/chrome/browser/net/predictor.cc
@@ -33,6 +33,7 @@
 #include "chrome/browser/io_thread.h"
 #include "chrome/browser/prefs/session_startup_pref.h"
 #include "chrome/browser/profiles/profile_io_data.h"
+#include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/pref_names.h"
 #include "components/pref_registry/pref_registry_syncable.h"
@@ -59,9 +60,6 @@
 
 namespace {
 
-const base::Feature kNetworkPrediction{"NetworkPrediction",
-                                       base::FEATURE_ENABLED_BY_DEFAULT};
-
 #if defined(OS_ANDROID)
 // Disabled on Android, as there are no "pinned tabs", meaning that a startup
 // is unlikely to request the same URL, and hence to resolve the same domains
@@ -171,7 +169,8 @@
 
 // static
 Predictor* Predictor::CreatePredictor(bool simple_shutdown) {
-  bool predictor_enabled = base::FeatureList::IsEnabled(kNetworkPrediction);
+  bool predictor_enabled =
+      base::FeatureList::IsEnabled(features::kNetworkPrediction);
   if (simple_shutdown)
     return new SimplePredictor(predictor_enabled);
   return new Predictor(predictor_enabled);
diff --git a/chrome/browser/permissions/permission_request_manager.cc b/chrome/browser/permissions/permission_request_manager.cc
index 494b880..b5e45fb 100644
--- a/chrome/browser/permissions/permission_request_manager.cc
+++ b/chrome/browser/permissions/permission_request_manager.cc
@@ -121,15 +121,9 @@
 }
 
 PermissionRequestManager::~PermissionRequestManager() {
-  if (view_ != NULL)
-    view_->SetDelegate(NULL);
-
-  for (PermissionRequest* request : requests_)
-    request->RequestFinished();
-  for (PermissionRequest* request : queued_requests_)
-    request->RequestFinished();
-  for (const auto& entry : duplicate_requests_)
-    entry.second->RequestFinished();
+  DCHECK(requests_.empty());
+  DCHECK(duplicate_requests_.empty());
+  DCHECK(queued_requests_.empty());
 }
 
 void PermissionRequestManager::AddRequest(PermissionRequest* request) {
diff --git a/chrome/browser/permissions/permission_request_manager_unittest.cc b/chrome/browser/permissions/permission_request_manager_unittest.cc
index 559ea5e..0a3ba3f 100644
--- a/chrome/browser/permissions/permission_request_manager_unittest.cc
+++ b/chrome/browser/permissions/permission_request_manager_unittest.cc
@@ -51,13 +51,13 @@
     SetContents(CreateTestWebContents());
     NavigateAndCommit(GURL("http://www.google.com"));
 
-    manager_.reset(new PermissionRequestManager(web_contents()));
-    prompt_factory_.reset(new MockPermissionPromptFactory(manager_.get()));
+    PermissionRequestManager::CreateForWebContents(web_contents());
+    manager_ = PermissionRequestManager::FromWebContents(web_contents());
+    prompt_factory_.reset(new MockPermissionPromptFactory(manager_));
   }
 
   void TearDown() override {
     prompt_factory_.reset();
-    manager_.reset();
     ChromeRenderViewHostTestHarness::TearDown();
   }
 
@@ -101,7 +101,7 @@
   MockPermissionRequest iframe_request_same_domain_;
   MockPermissionRequest iframe_request_other_domain_;
   MockPermissionRequest iframe_request_mic_other_domain_;
-  std::unique_ptr<PermissionRequestManager> manager_;
+  PermissionRequestManager* manager_;
   std::unique_ptr<MockPermissionPromptFactory> prompt_factory_;
 };
 
diff --git a/chrome/browser/resources/extensions/extensions.css b/chrome/browser/resources/extensions/extensions.css
index 57468d4..a18931e 100644
--- a/chrome/browser/resources/extensions/extensions.css
+++ b/chrome/browser/resources/extensions/extensions.css
@@ -104,7 +104,6 @@
 }
 
 [dir='rtl'] #page-header {
-  left: auto;
   right: 0;
 }
 
diff --git a/chrome/browser/resources/options/autofill_edit_address_overlay.html b/chrome/browser/resources/options/autofill_edit_address_overlay.html
index 0deecad..980d9ba 100644
--- a/chrome/browser/resources/options/autofill_edit_address_overlay.html
+++ b/chrome/browser/resources/options/autofill_edit_address_overlay.html
@@ -7,7 +7,7 @@
 
     <div class="settings-row">
       <label>
-        <div i18n-content="autofillCountryLabel"></div>
+        <div>$i18n{autofillCountryLabel}</div>
         <select class="country" field="country"></select>
       </label>
     </div>
@@ -15,14 +15,14 @@
     <div class="input-group settings-row">
       <div>
         <label>
-          <div i18n-content="autofillPhoneLabel"></div>
+          <div>$i18n{autofillPhoneLabel}</div>
           <input class="short" field="phone"></input>
         </label>
       </div>
 
       <div>
         <label>
-          <div i18n-content="autofillEmailLabel"></div>
+          <div>$i18n{autofillEmailLabel}</div>
           <input class="short" field="email"></input>
         </label>
       </div>
@@ -31,9 +31,12 @@
   </div>
 
   <div class="action-area button-strip">
-    <button id="autofill-edit-address-cancel-button" type="reset"
-        i18n-content="cancel"></button>
+    <button id="autofill-edit-address-cancel-button" type="reset">
+      $i18n{cancel}
+    </button>
     <button id="autofill-edit-address-apply-button" type="submit"
-        class="default-button" i18n-content="ok" disabled></button>
+        class="default-button" disabled>
+      $i18n{ok}
+    </button>
   </div>
 </div>
diff --git a/chrome/browser/resources/options/autofill_edit_creditcard_overlay.html b/chrome/browser/resources/options/autofill_edit_creditcard_overlay.html
index 3c5b07f..9b2c5f8 100644
--- a/chrome/browser/resources/options/autofill_edit_creditcard_overlay.html
+++ b/chrome/browser/resources/options/autofill_edit_creditcard_overlay.html
@@ -3,18 +3,19 @@
   <h1 id="autofill-credit-card-title"></h1>
   <div class="content-area">
     <label class="settings-row">
-      <div i18n-content="nameOnCardLabel"></div>
+      <div>$i18n{nameOnCardLabel}</div>
       <input id="name-on-card" type="text">
     </label>
 
     <label class="settings-row">
-      <div i18n-content="creditCardNumberLabel"></div>
+      <div>$i18n{creditCardNumberLabel}</div>
       <input id="credit-card-number" type="text">
     </label>
 
     <div class="settings-row">
-      <div id="creditCardExpirationLabel"
-          i18n-content="creditCardExpirationDateLabel"></div>
+      <div id="creditCardExpirationLabel">
+        $i18n{creditCardExpirationDateLabel}
+      </div>
       <select id="expiration-month" aria-labelledby="creditCardExpirationLabel">
       </select>
       <select id="expiration-year" aria-labelledby="creditCardExpirationLabel">
@@ -23,9 +24,12 @@
   </div>
 
   <div class="action-area button-strip">
-    <button id="autofill-edit-credit-card-cancel-button" type="reset"
-        i18n-content="cancel"></button>
+    <button id="autofill-edit-credit-card-cancel-button" type="reset">
+      $i18n{cancel}
+    </button>
     <button id="autofill-edit-credit-card-apply-button" type="submit"
-        class="default-button" i18n-content="ok" disabled></button>
+        class="default-button" disabled>
+      $i18n{ok}
+    </button>
   </div>
 </div>
diff --git a/chrome/browser/resources/options/autofill_options.html b/chrome/browser/resources/options/autofill_options.html
index ab3931b..d820ebee 100644
--- a/chrome/browser/resources/options/autofill_options.html
+++ b/chrome/browser/resources/options/autofill_options.html
@@ -1,18 +1,18 @@
 <div id="autofill-options" class="page" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="autofillOptionsPage"></h1>
+  <h1>$i18n{autofillOptionsPage}</h1>
   <div class="content-area">
     <div class="autofill-section-header">
-      <h3 i18n-content="autofillAddresses"></h3>
-      <button id="autofill-add-address" i18n-content="autofillAddAddress">
-      </button>
+      <h3>$i18n{autofillAddresses}</h3>
+      <button id="autofill-add-address">$i18n{autofillAddAddress}</button>
     </div>
     <div class="settings-list">
       <list id="address-list"></list>
     </div>
     <div class="autofill-section-header">
-      <h3 i18n-content="autofillCreditCards"></h3>
-      <button id="autofill-add-creditcard" i18n-content="autofillAddCreditCard">
+      <h3>$i18n{autofillCreditCards}</h3>
+      <button id="autofill-add-creditcard">
+        $i18n{autofillAddCreditCard}
       </button>
     </div>
     <div class="settings-list">
@@ -21,13 +21,13 @@
   </div>
 
   <div class="action-area">
-    <a id="autofill-help" target="_blank" i18n-values="href:helpUrl"
-        i18n-content="helpButton">
-    </a>
+    <a id="autofill-help" target="_blank"
+        href="$i18nRaw{helpUrl}">$i18n{helpButton}</a>
     <div class="spacer-div"></div>
     <div class="button-strip">
-      <button id="autofill-options-confirm" class="default-button"
-          i18n-content="done"></button>
+      <button id="autofill-options-confirm" class="default-button">
+        $i18n{done}
+      </button>
     </div>
   </div>
 </div>
diff --git a/chrome/browser/resources/options/automatic_settings_reset_banner.html b/chrome/browser/resources/options/automatic_settings_reset_banner.html
index 4af723b..fcb16c40 100644
--- a/chrome/browser/resources/options/automatic_settings_reset_banner.html
+++ b/chrome/browser/resources/options/automatic_settings_reset_banner.html
@@ -4,16 +4,16 @@
     <div class="badge"></div>
     <div class="text">
       <p>
-        <span i18n-values=".innerHTML:automaticSettingsResetBannerText">
-        </span>
+        <span>$i18nRaw{automaticSettingsResetBannerText}</span>
         <a id="automatic-settings-reset-learn-more" class="nowrap"
-           i18n-values="href:automaticSettingsResetLearnMoreUrl"
-           i18n-content="learnMore" target="_blank"></a>
+            href="$i18nRaw{automaticSettingsResetLearnMoreUrl}"
+            target="_blank">$i18n{learnMore}</a>
       </p>
     </div>
     <div class="button-area">
-      <button id="automatic-settings-reset-banner-activate-reset"
-          i18n-content="automaticSettingsResetBannerResetButtonText"></button>
+      <button id="automatic-settings-reset-banner-activate-reset">
+        $i18n{automaticSettingsResetBannerResetButtonText}
+      </button>
     </div>
   </div>
 </div>
diff --git a/chrome/browser/resources/options/browser_options.html b/chrome/browser/resources/options/browser_options.html
index 3c1661d..94147eac 100644
--- a/chrome/browser/resources/options/browser_options.html
+++ b/chrome/browser/resources/options/browser_options.html
@@ -3,7 +3,7 @@
 </if>
 <div id="settings" class="page" hidden>
   <header>
-    <h1 i18n-content="settingsTitle"></h1>
+    <h1>$i18n{settingsTitle}</h1>
   </header>
   <include src="automatic_settings_reset_banner.html">
 <if expr="chromeos">
@@ -12,7 +12,7 @@
   <include src="secondary_user_banner.html">
   <section id="network-section-cros">
     <div id="network-section-header" class="section-header">
-      <h3 i18n-content="sectionTitleInternet"></h3>
+      <h3>$i18n{sectionTitleInternet}</h3>
       <span class="controlled-setting-indicator" plural></span>
     </div>
     <div id="network-settings">
@@ -22,7 +22,7 @@
           <input id="use-shared-proxies" type="checkbox"
               metric="Options_NetworkUseSharedProxies"
               pref="settings.use_shared_proxies">
-          <span i18n-content="useSharedProxies"></span>
+          <span>$i18n{useSharedProxies}</span>
         </label>
       </div>
       <div id="network-menus"></div>
@@ -34,29 +34,28 @@
   <include src="startup_section.html">
 </if>
   <section id="proxy-section" hidden>
-    <h3 i18n-content="sectionTitleProxy"></h3>
+    <h3>$i18n{sectionTitleProxy}</h3>
     <div id="proxy-section-content"></div>
   </section>
 
   <section id="appearance-section">
-    <h3 i18n-content="sectionTitleAppearance"></h3>
+    <h3>$i18n{sectionTitleAppearance}</h3>
     <div class="settings-row">
 <if expr="chromeos">
-      <button id="set-wallpaper" i18n-content="setWallpaper"
-          guest-visibility="disabled"></button>
+      <button id="set-wallpaper" guest-visibility="disabled">
+        $i18n{setWallpaper}
+      </button>
       <span id="wallpaper-indicator" class="controlled-setting-indicator">
       </span>
 </if>
 <if expr="not chromeos and is_posix and not is_macosx">
-      <button id="themes-gallery" i18n-content="themesGallery"></button>
-      <button id="themes-native-button"
-          i18n-content="themesNativeButton"></button>
-      <button id="themes-reset"
-          i18n-content="themesSetClassic"></button>
+      <button id="themes-gallery">$i18n{themesGallery}</button>
+      <button id="themes-native-button">$i18n{themesNativeButton}</button>
+      <button id="themes-reset">$i18n{themesSetClassic}</button>
 </if>
 <if expr="chromeos or is_win or is_macosx">
-      <button id="themes-gallery" i18n-content="themesGallery"></button>
-      <button id="themes-reset" i18n-content="themesReset"></button>
+      <button id="themes-gallery">$i18n{themesGallery}</button>
+      <button id="themes-reset">$i18n{themesReset}</button>
 </if>
     </div>
     <div class="checkbox controlled-setting-with-label"
@@ -66,7 +65,7 @@
             pref="browser.show_home_button"
             metric="Options_Homepage_HomeButton">
         <span>
-          <span i18n-content="homePageShowHomeButton"></span>
+          <span>$i18n{homePageShowHomeButton}</span>
           <span class="controlled-setting-indicator"
               pref="browser.show_home_button"></span>
         </span>
@@ -74,11 +73,11 @@
     </div>
     <div id="change-home-page-section" hidden>
       <div id="change-home-page-section-container" guest-visibility="disabled">
-        <span id="home-page-ntp" class="home-page-label"
-            i18n-content="homePageNtp"></span>
+        <span id="home-page-ntp" class="home-page-label">
+          $i18n{homePageNtp}
+        </span>
         <span id="home-page-url" class="home-page-label"></span>
-        <a is="action-link" id="change-home-page" i18n-content="changeHomePage">
-        </a>
+        <a is="action-link" id="change-home-page">$i18n{changeHomePage}</a>
         <div id="extension-controlled-container"></div>
       </div>
     </div>
@@ -89,7 +88,7 @@
             pref="bookmark_bar.show_on_all_tabs"
             metric="Options_ShowBookmarksBar">
         <span>
-          <span i18n-content="toolbarShowBookmarksBar"></span>
+          <span>$i18n{toolbarShowBookmarksBar}</span>
           <span class="controlled-setting-indicator"
               pref="bookmark_bar.show_on_all_tabs"></span>
         </span>
@@ -100,77 +99,81 @@
         <input id="show-window-decorations" type="checkbox"
             pref="browser.custom_chrome_frame" metric="Options_CustomFrame"
             inverted_pref>
-        <span i18n-content="showWindowDecorations"></span>
+        <span>$i18n{showWindowDecorations}</span>
     </label></div>
 </if>
   </section>
 <if expr="chromeos">
   <section id="device-section">
-    <h3 i18n-content="sectionTitleDevice"></h3>
+    <h3>$i18n{sectionTitleDevice}</h3>
     <div>
-      <span i18n-content="deviceGroupDescription"></span>
+      <span>$i18n{deviceGroupDescription}</span>
       <div id="touchpad-settings" class="settings-row" hidden>
-        <span id="touchpad-speed-label" class="option-name"
-            i18n-content="touchpadSpeed"></span>
+        <span id="touchpad-speed-label" class="option-name">
+          $i18n{touchpadSpeed}
+        </span>
         <input id="touchpad-sensitivity-range" type="range" min="1" max="5"
             pref="settings.touchpad.sensitivity2" class="touch-slider"
             aria-labelledby="touchpad-speed-label">
       </div>
       <div id="mouse-settings" class="settings-row" hidden>
-        <span id="mouse-speed-label" class="option-name"
-            i18n-content="mouseSpeed"></span>
+        <span id="mouse-speed-label" class="option-name">
+          $i18n{mouseSpeed}
+        </span>
         <input id="mouse-sensitivity-range" type="range" min="1" max="5"
             pref="settings.mouse.sensitivity2" class="touch-slider"
             aria-labelledby="mouse-speed-label">
       </div>
-      <div id="no-pointing-devices" i18n-content="noPointingDevices"
-          class="settings-row" hidden>
+      <div id="no-pointing-devices" class="settings-row" hidden>
+        $i18n{noPointingDevices}
       </div>
       <div class="settings-row">
         <button id="pointer-settings-button" hidden>
         </button>
-        <button id="keyboard-settings-button"
-            i18n-content="keyboardSettingsButtonTitle">
+        <button id="keyboard-settings-button">
+          $i18n{keyboardSettingsButtonTitle}
         </button>
         <span id="display-options-section">
-          <button id="display-options" i18n-content="displayOptions" disabled>
-          </button>
+          <button id="display-options" disabled>$i18n{displayOptions}</button>
         </span>
-        <button id="storage-manager-button"
-            i18n-content="storageManagerButtonTitle">
+        <button id="storage-manager-button">
+          $i18n{storageManagerButtonTitle}
         </button>
       </div>
       <div id="stylus-row" hidden>
-        <a is="action-link" id="stylus-settings-link"
-            i18n-content="stylusSettingsButtonTitle"></a>
+        <a is="action-link" id="stylus-settings-link">
+          $i18n{stylusSettingsButtonTitle}
+        </a>
       </div>
       <div id="power-row" hidden>
-        <a is="action-link" id="power-settings-link"
-            i18n-content="powerSettingsButton"></a>
+        <a is="action-link" id="power-settings-link">
+          $i18n{powerSettingsButton}
+        </a>
       </div>
     </div>
   </section>
 </if>
   <section id="search-section">
-    <h3 i18n-content="sectionTitleSearch"></h3>
+    <h3>$i18n{sectionTitleSearch}</h3>
       <div id="search-section-content">
-        <span id="default-search-engine-label"
-            i18n-values=".innerHTML:defaultSearchGroupLabel"></span>
+        <span id="default-search-engine-label">
+          $i18nRaw{defaultSearchGroupLabel}
+        </span>
         <div class="settings-row">
           <select id="default-search-engine" class="weakrtl"
               aria-labelledby="default-search-engine-label"></select>
           <span class="controlled-setting-indicator"
               pref="default_search_provider_data.template_url_data">
           </span>
-          <button id="manage-default-search-engines"
-              i18n-content="defaultSearchManageEngines">
+          <button id="manage-default-search-engines">
+            $i18n{defaultSearchManageEngines}
           </button>
         </div>
         <div id="google-now-launcher" hidden>
           <div class="checkbox">
             <label>
               <input pref="google_now_launcher.enabled" type="checkbox">
-              <span i18n-content="googleNowLauncherEnable"></span>
+              <span>$i18n{googleNowLauncherEnable}</span>
             </label>
           </div>
         </div>
@@ -179,20 +182,20 @@
             <label>
               <input id="hotword-always-on-search-checkbox"
                   pref="hotword.always_on_search_enabled" type="checkbox">
-              <span i18n-content="hotwordSearchEnable"></span>
+              <span>$i18n{hotwordSearchEnable}</span>
             </label>
             <a target="_blank" class="hotword-link"
-                i18n-content="learnMore"
-                i18n-values="href:hotwordLearnMoreURL">
+                href="$i18nRaw{hotwordLearnMoreURL}">
+              $i18n{learnMore}
             </a>
             <span id="hotword-always-on-search-setting-indicator"
                 pref="hotword.always_on_search_enabled" dialog-pref></span>
             <div>
-              <span class="setting-extra-description"
-                  i18n-content="hotwordAlwaysOnDesc">
+              <span class="setting-extra-description">
+                $i18n{hotwordAlwaysOnDesc}
               </span>
-              <a id="hotword-retrain-link" is="action-link"
-                  i18n-content="hotwordRetrainLink" hidden>
+              <a id="hotword-retrain-link" is="action-link" hidden>
+                $i18n{hotwordRetrainLink}
               </a>
             </div>
           </div>
@@ -202,17 +205,17 @@
             <label>
               <input id="hotword-no-dsp-search-checkbox"
                   pref="hotword.search_enabled_2" type="checkbox">
-              <span i18n-content="hotwordSearchEnable"></span>
+              <span>$i18n{hotwordSearchEnable}</span>
             </label>
             <a target="_blank" class="hotword-link"
-                i18n-content="learnMore"
-                i18n-values="href:hotwordLearnMoreURL">
+                href="$i18nRaw{hotwordLearnMoreURL}">
+              $i18n{learnMore}
             </a>
             <span id="hotword-no-dsp-search-setting-indicator"
                 pref="hotword.search_enabled_2" dialog-pref></span>
             <div>
-              <span class="setting-extra-description"
-                  i18n-content="hotwordNoDSPDesc">
+              <span class="setting-extra-description">
+                $i18n{hotwordNoDSPDesc}
               </span>
             </div>
           </div>
@@ -223,13 +226,13 @@
               <span id="audio-history-label"></span>
             </label>
             <a target="_blank" class="hotword-link"
-               i18n-content="hotwordAudioHistoryManage"
-               i18n-values="href:hotwordManageAudioHistoryURL">
+                href="$i18nRaw{hotwordManageAudioHistoryURL}">
+              $i18n{hotwordAudioHistoryManage}
             </a>
           </div>
           <div class="settings-row" id="audio-history-always-on-description">
-            <span class="setting-extra-description"
-                  i18n-content="hotwordAlwaysOnAudioHistoryDescription">
+            <span class="setting-extra-description">
+              $i18n{hotwordAlwaysOnAudioHistoryDescription}
             </span>
           </div>
         </div>
@@ -237,21 +240,23 @@
   </section>
 <if expr="chromeos">
   <section id="android-apps-section" hidden>
-    <h3 i18n-content="androidAppsTitle"></h3>
+    <h3>$i18n{androidAppsTitle}</h3>
     <div class="checkbox controlled-setting-with-label">
       <label>
         <input id="android-apps-enabled" pref="arc.enabled"
             metric="Options_AndroidApps" type="checkbox" dialog-pref>
         <span>
-          <span i18n-content="androidAppsEnabled"></span>
+          <span>$i18n{androidAppsEnabled}</span>
           <span class="controlled-setting-indicator"
                 pref="arc.enabled"></span>
         </span>
       </label>
-      <a target="_blank" i18n-content="learnMore"
-          href="http://support.google.com/chromebook?p=playapps"></a>
+      <a target="_blank" href="http://support.google.com/chromebook?p=playapps">
+        $i18n{learnMore}
+      </a>
     </div>
-    <div id="android-apps-settings" class="controlled-setting-with-label" hidden>
+    <div id="android-apps-settings" class="controlled-setting-with-label"
+        hidden>
       <label>
         <span id="android-apps-settings-label"></span>
       </label>
@@ -259,14 +264,14 @@
   </section>
 </if>
   <section id="sync-users-section" guest-visibility="hidden">
-    <h3 i18n-content="sectionTitleUsers"></h3>
+    <h3>$i18n{sectionTitleUsers}</h3>
 <if expr="chromeos">
     <include src="sync_section.html">
 </if>
     <div id="profiles-section" hidden>
       <list id="profiles-list" class="settings-list" hidden></list>
-      <div id="profiles-single-message" class="settings-row"
-          i18n-content="profilesSingleUser">
+      <div id="profiles-single-message" class="settings-row">
+        $i18n{profilesSingleUser}
       </div>
 <if expr="not chromeos">
       <div id="profiles-enable-guest" class="checkbox">
@@ -274,7 +279,7 @@
           <input pref="profile.browser_guest_enabled"
                  type="checkbox"
                  metric="Options_BrowserGuestEnabled">
-          <span i18n-content="profileBrowserGuestEnable"></span>
+          <span>$i18n{profileBrowserGuestEnable}</span>
         </label>
       </div>
       <div id="profiles-enable-add-person" class="checkbox">
@@ -282,33 +287,31 @@
           <input pref="profile.add_person_enabled"
                  type="checkbox"
                  metric="Options_AddPersonEnabled">
-          <span i18n-content="profileAddPersonEnable"></span>
+          <span>$i18n{profileAddPersonEnable}</span>
         </label>
       </div>
 </if>
       <div id="profiles-buttons">
-        <button id="profiles-create" i18n-content="profilesCreate"></button>
-        <button id="profiles-manage" i18n-content="profilesManage" disabled>
-        </button>
-        <button id="profiles-delete" i18n-content="profilesDelete"></button>
+        <button id="profiles-create">$i18n{profilesCreate}</button>
+        <button id="profiles-manage" disabled>$i18n{profilesManage}</button>
+        <button id="profiles-delete">$i18n{profilesDelete}</button>
 <if expr="not chromeos">
-        <button id="import-data" i18n-content="importData"></button>
+        <button id="import-data">$i18n{importData}</button>
 </if>
       </div>
     </div>
-    <div id="profiles-supervised-dashboard-tip"
-        i18n-values=".innerHTML:profilesSupervisedDashboardTip" hidden>
+    <div id="profiles-supervised-dashboard-tip" hidden>
+      $i18nRaw{profilesSupervisedDashboardTip}
     </div>
   </section>
 <if expr="not chromeos">
   <section id="set-default-browser-section">
-    <h3 i18n-content="sectionTitleDefaultBrowser"></h3>
+    <h3>$i18n{sectionTitleDefaultBrowser}</h3>
     <div>
-      <button id="set-as-default-browser"
-          i18n-content="defaultBrowserUseAsDefault" hidden>
+      <button id="set-as-default-browser" hidden>
+        $i18n{defaultBrowserUseAsDefault}
       </button>
-      <div id="default-browser-state" i18n-content="defaultBrowserUnknown">
-      </div>
+      <div id="default-browser-state">$i18n{defaultBrowserUnknown}</div>
     </div>
   </section>
 </if>  <!-- not chromeos -->
@@ -316,11 +319,12 @@
 <div id="advanced-settings-container">
 <if expr="chromeos">
   <section id="date-time-section">
-    <h3 i18n-content="datetimeTitle"></h3>
+    <h3>$i18n{datetimeTitle}</h3>
     <div class="option-control-table">
       <div guest-visibility="disabled">
-        <span id="timezone-value-label" class="option-name"
-            i18n-content="timezone"></span>
+        <span id="timezone-value-label" class="option-name">
+          $i18n{timezone}
+        </span>
         <div id="timezone-value">
           <select class="control"
               id="timezone-value-select"
@@ -336,36 +340,38 @@
             <input id="resolve-timezone-by-geolocation"
                 pref="settings.resolve_timezone_by_geolocation"
                 metric="Options_ResolveTimezoneByGeoLocation" type="checkbox">
-            <span i18n-content="resolveTimezoneByGeoLocation"></span>
+            <span>$i18n{resolveTimezoneByGeoLocation}</span>
           </label>
         </div>
         <label>
           <input id="use-24hour-clock" pref="settings.clock.use_24hour_clock"
               metric="Options_Use24HourClockCheckbox" type="checkbox">
-          <span i18n-content="use24HourClock"></span>
+          <span>$i18n{use24HourClock}</span>
         </label>
       </div>
       <div id="set-time" class="settings-row" hidden>
-        <button id="set-time-button"
-            i18n-content="setTimeButton"></button>
+        <button id="set-time-button">$i18n{setTimeButton}</button>
       </div>
     </div>
   </section>
 </if>
   <section id="privacy-section">
-    <h3 i18n-content="advancedSectionTitlePrivacy"></h3>
+    <h3>$i18n{advancedSectionTitlePrivacy}</h3>
     <div>
       <div class="settings-row">
-        <button id="privacyContentSettingsButton"
-            i18n-content="privacyContentSettingsButton"></button>
-        <button id="privacyClearDataButton"
-            i18n-content="privacyClearDataButton"></button>
+        <button id="privacyContentSettingsButton">
+          $i18n{privacyContentSettingsButton}
+        </button>
+        <button id="privacyClearDataButton">
+          $i18n{privacyClearDataButton}
+        </button>
       </div>
       <p id="privacy-explanation" class="settings-row">
-        <span i18n-content="improveBrowsingExperience"></span>
-        <span i18n-content="disableWebServices"></span>
-        <a target="_blank" i18n-content="learnMore"
-            i18n-values="href:privacyLearnMoreURL"></a>
+        <span>$i18n{improveBrowsingExperience}</span>
+        <span>$i18n{disableWebServices}</span>
+        <a target="_blank" href="$i18nRaw{privacyLearnMoreURL}">
+          $i18n{learnMore}
+        </a>
       </p>
       <div class="checkbox controlled-setting-with-label">
         <label>
@@ -373,7 +379,7 @@
               pref="alternate_error_pages.enabled"
               metric="Options_LinkDoctorCheckbox" type="checkbox">
           <span>
-            <span i18n-content="linkDoctorPref"></span>
+            <span>$i18n{linkDoctorPref}</span>
             <span class="controlled-setting-indicator"
                 pref="alternate_error_pages.enabled"></span>
           </span>
@@ -385,7 +391,7 @@
           <input pref="search.suggest_enabled"
               metric="Options_UseSuggestCheckbox" type="checkbox">
           <span>
-            <span i18n-content="suggestPref"></span>
+            <span>$i18n{suggestPref}</span>
             <span class="controlled-setting-indicator"
                 pref="search.suggest_enabled"></span>
           </span>
@@ -397,7 +403,7 @@
             <input id="networkPredictionOptions"
                 metric="Options_DnsPrefetchCheckbox" type="checkbox">
             <span>
-              <span i18n-content="networkPredictionEnabledDescription"></span>
+              <span>$i18n{networkPredictionEnabledDescription}</span>
               <span class="controlled-setting-indicator"
                   pref="net.network_prediction_options"></span>
             </span>
@@ -411,7 +417,7 @@
               metric="Options_SafeBrowsingExtendedReportingCheckbox"
               type="checkbox">
           <span>
-            <span i18n-content="safeBrowsingEnableExtendedReporting"></span>
+            <span>$i18n{safeBrowsingEnableExtendedReporting}</span>
             <span class="controlled-setting-indicator"></span>
           </span>
         </label>
@@ -421,7 +427,7 @@
           <input pref="safebrowsing.enabled"
               metric="Options_SafeBrowsingCheckbox" type="checkbox">
           <span>
-            <span i18n-content="safeBrowsingEnableProtection"></span>
+            <span>$i18n{safeBrowsingEnableProtection}</span>
             <span class="controlled-setting-indicator"
                 pref="safebrowsing.enabled"></span>
           </span>
@@ -434,7 +440,7 @@
               metric="Options_SpellingServiceCheckbox"
               pref="spellcheck.use_spelling_service" dialog-pref>
           <span>
-            <span i18n-content="spellingPref"></span>
+            <span>$i18n{spellingPref}</span>
             <span id="spelling-enabled-indicator"
                 class="controlled-setting-indicator"
                 pref="spellcheck.use_spelling_service" dialog-pref>
@@ -447,7 +453,7 @@
         <label>
           <input id="metrics-reporting-enabled" type="checkbox">
           <span>
-            <span i18n-content="enableLogging"></span>
+            <span>$i18n{enableLogging}</span>
             <span id="metrics-reporting-disabled-icon"
                 class="controlled-setting-indicator"></span>
           </span>
@@ -465,7 +471,7 @@
         <label>
           <input id="do-not-track-enabled" pref="enable_do_not_track"
               metric="Options_DoNotTrackCheckbox" type="checkbox" dialog-pref>
-          <span i18n-content="doNotTrack"></span>
+          <span>$i18n{doNotTrack}</span>
         </label>
       </div>
 <if expr="chromeos">
@@ -474,14 +480,15 @@
           <input id="content-protection-attestation-enabled" type="checkbox"
               pref="cros.device.attestation_for_content_protection_enabled">
           <span>
-            <span i18n-content="enableContentProtectionAttestation"></span>
+            <span>$i18n{enableContentProtectionAttestation}</span>
             <span class="controlled-setting-indicator"
                 pref="cros.device.attestation_for_content_protection_enabled">
             </span>
           </span>
         </label>
-        <a target="_blank" i18n-content="learnMore"
-            i18n-values="href:contentProtectionAttestationLearnMoreURL">
+        <a target="_blank"
+            href="$i18nRaw{contentProtectionAttestationLearnMoreURL}">
+          $i18n{learnMore}
         </a>
       </div>
 </if>
@@ -491,7 +498,7 @@
             <input id="hotword-search-enable" pref="hotword.search_enabled_2"
                 metric="Options_HotwordCheckbox" type="checkbox" dialog-pref>
             <span>
-              <span i18n-values=".innerHTML:hotwordSearchEnable"></span>
+              <span>$i18nRaw{hotwordSearchEnable}</span>
               <span id="hotword-search-setting-indicator"
                   pref="hotword.search_enabled_2" dialog-pref></span>
             </span>
@@ -506,7 +513,7 @@
               metric="Options_WakeOnWifiSsid"
               pref="settings.internet.wake_on_wifi_darkconnect">
           <span>
-            <span i18n-content="wakeOnWifiLabel"></span>
+            <span>$i18n{wakeOnWifiLabel}</span>
             <span id="wake-on-wifi-indicator"
                 class="controlled-setting-indicator"
                 pref="settings.internet.wake_on_wifi_darkconnect"></span>
@@ -520,14 +527,14 @@
   <!-- By default, the bluetooth section is hidden.  It is only visible if a
        bluetooth adapter is discovered -->
   <section id="bluetooth-devices" hidden>
-    <h3 i18n-content="bluetooth"></h3>
+    <h3>$i18n{bluetooth}</h3>
     <div id="bluetooth-options-div">
       <div class="checkbox controlled-setting-with-label">
         <label>
           <input type="checkbox" id="enable-bluetooth"
                  metric="Options_BluetoothEnabled">
           <span>
-            <span i18n-content="enableBluetooth"></span>
+            <span>$i18n{enableBluetooth}</span>
             <span id="bluetooth-controlled-setting-indicator"
                   class="controlled-setting-indicator"
                   pref="cros.device.allow_bluetooth"
@@ -540,32 +547,35 @@
         <list id="bluetooth-paired-devices-list"></list>
         <div id="bluetooth-paired-devices-list-empty-placeholder"
             class="bluetooth-empty-list-label" hidden>
-          <span i18n-content="bluetoothNoDevices"></span>
+          <span>$i18n{bluetoothNoDevices}</span>
         </div>
       </div>
       <div id="bluetooth-button-group">
-        <button id="bluetooth-add-device"
-            i18n-content="addBluetoothDevice" hidden></button>
-        <button id="bluetooth-reconnect-device"
-            i18n-content="bluetoothConnectDevice" disabled hidden></button>
+        <button id="bluetooth-add-device" hidden>
+          $i18n{addBluetoothDevice}
+        </button>
+        <button id="bluetooth-reconnect-device" disabled hidden>
+          $i18n{bluetoothConnectDevice}
+        </button>
       </div>
     </div>
   </section>
 </if>
   <section id="passwords-and-autofill-section">
-    <h3 i18n-content="passwordsAndAutofillGroupName"></h3>
+    <h3>$i18n{passwordsAndAutofillGroupName}</h3>
     <div class="checkbox controlled-setting-with-label">
       <label>
         <input id="autofill-enabled" pref="autofill.enabled"
             metric="Options_FormAutofill" type="checkbox">
         <span>
-          <span i18n-content="autofillEnabled"></span>
+          <span>$i18n{autofillEnabled}</span>
           <span class="controlled-setting-indicator" pref="autofill.enabled">
           </span>
         </span>
       </label>
-      <a is="action-link" id="autofill-settings"
-          i18n-content="manageAutofillSettings"></a>
+      <a is="action-link" id="autofill-settings">
+        $i18n{manageAutofillSettings}
+      </a>
     </div>
     <div class="checkbox controlled-setting-with-label">
       <label>
@@ -573,75 +583,76 @@
             pref="credentials_enable_service"
             metric="Options_PasswordManager" type="checkbox">
         <span>
-          <span i18n-content="passwordManagerEnabled"></span>
+          <span>$i18n{passwordManagerEnabled}</span>
           <span class="controlled-setting-indicator"
               pref="credentials_enable_service"></span>
         </span>
       </label>
-      <a is="action-link" id="manage-passwords" i18n-content="managePasswords">
-      </a>
+      <a is="action-link" id="manage-passwords">$i18n{managePasswords}</a>
     </div>
 <if expr="is_macosx">
-    <div id="mac-passwords-warning" i18n-content="macPasswordsWarning" hidden>
-    </div>
+    <div id="mac-passwords-warning" hidden>$i18n{macPasswordsWarning}</div>
 </if>
   </section>
   <section id="easy-unlock-section" guest-visibility="hidden" hidden>
-    <h3 i18n-content="easyUnlockSectionTitle"></h3>
+    <h3>$i18n{easyUnlockSectionTitle}</h3>
     <!-- Options shown when the user has not set up Easy Unlock -->
     <div id="easy-unlock-disabled" hidden>
       <div class="settings-row">
-        <span i18n-content="easyUnlockSetupIntro"></span>
-        <a target="_blank" i18n-content="learnMore"
-            i18n-values="href:easyUnlockLearnMoreURL"></a>
+        <span>$i18n{easyUnlockSetupIntro}</span>
+        <a target="_blank" href="$i18nRaw{easyUnlockLearnMoreURL}">
+          $i18n{learnMore}
+        </a>
       </div>
-      <button id="easy-unlock-setup-button"
-          i18n-content="easyUnlockSetupButton"></button>
+      <button id="easy-unlock-setup-button">
+        $i18n{easyUnlockSetupButton}
+      </button>
     </div>
     <!-- Options shown when the user has set up Easy Unlock -->
     <div id="easy-unlock-enabled" hidden>
       <div class="settings-row">
-        <span i18n-content="easyUnlockDescription"></span>
-        <a target="_blank" i18n-content="learnMore"
-            i18n-values="href:easyUnlockLearnMoreURL"></a>
+        <span>$i18n{easyUnlockDescription}</span>
+        <a target="_blank" href="$i18nRaw{easyUnlockLearnMoreURL}">
+          $i18n{learnMore}
+        </a>
         <div id="easy-unlock-enable-proximity-detection" class="checkbox"
             hidden>
           <label>
             <input type="checkbox"
                 metric="Options_EasyUnlockRequireProximity"
                 pref="easy_unlock.proximity_required">
-            <span i18n-content="easyUnlockRequireProximityLabel"></span>
+            <span>$i18n{easyUnlockRequireProximityLabel}</span>
           </label>
         </div>
       </div>
-      <button id="easy-unlock-turn-off-button"
-          i18n-content="easyUnlockTurnOffButton"></button>
+      <button id="easy-unlock-turn-off-button">
+        $i18n{easyUnlockTurnOffButton}
+      </button>
     </div>
   </section>
   <section id="web-content-section">
-    <h3 i18n-content="advancedSectionTitleContent"></h3>
+    <h3>$i18n{advancedSectionTitleContent}</h3>
     <div>
       <div class="settings-row">
         <label class="web-content-select-label">
-          <span i18n-content="defaultFontSizeLabel"></span>
+          <span>$i18n{defaultFontSizeLabel}</span>
           <select id="defaultFontSize">
-            <option value="9" i18n-content="fontSizeLabelVerySmall">
-            </option>
-            <option value="12" i18n-content="fontSizeLabelSmall"></option>
-            <option value="16" i18n-content="fontSizeLabelMedium"></option>
-            <option value="20" i18n-content="fontSizeLabelLarge"></option>
-            <option value="24" i18n-content="fontSizeLabelVeryLarge">
-            </option>
+            <option value="9">$i18n{fontSizeLabelVerySmall}</option>
+            <option value="12">$i18n{fontSizeLabelSmall}</option>
+            <option value="16">$i18n{fontSizeLabelMedium}</option>
+            <option value="20">$i18n{fontSizeLabelLarge}</option>
+            <option value="24">$i18n{fontSizeLabelVeryLarge}</option>
           </select>
         </label>
         <span id="font-size-indicator"
             class="controlled-setting-indicator"></span>
-        <button id="fontSettingsCustomizeFontsButton"
-            i18n-content="fontSettingsCustomizeFontsButton"></button>
+        <button id="fontSettingsCustomizeFontsButton">
+          $i18n{fontSettingsCustomizeFontsButton}
+        </button>
       </div>
       <div class="settings-row" guest-visibility="disabled">
         <label class="web-content-select-label">
-          <span i18n-content="defaultZoomFactorLabel"></span>
+          <span>$i18n{defaultZoomFactorLabel}</span>
           <select id="defaultZoomFactor" dataType="double"></select>
         </label>
       </div>
@@ -650,7 +661,7 @@
         <label>
           <input id="tabsToLinksPref" pref="webkit.webprefs.tabs_to_links"
               metric="Options_TabsToLinks" type="checkbox">
-          <span i18n-content="tabsToLinksPref"></span>
+          <span>$i18n{tabsToLinksPref}</span>
         </label>
       </div>
 </if>
@@ -658,57 +669,59 @@
   </section>
 <if expr="not chromeos">
   <section id="network-section">
-    <h3 i18n-content="advancedSectionTitleNetwork"></h3>
+    <h3>$i18n{advancedSectionTitleNetwork}</h3>
     <div>
-      <span id="proxiesLabel"
-            class="settings-row"
-            i18n-content="proxiesLabelSystem"></span>
+      <span id="proxiesLabel" class="settings-row">
+        $i18n{proxiesLabelSystem}
+      </span>
       <div class="settings-row">
-        <button id="proxiesConfigureButton"
-            i18n-content="proxiesConfigureButton"></button>
+        <button id="proxiesConfigureButton">
+          $i18n{proxiesConfigureButton}
+        </button>
         <span class="controlled-setting-indicator" pref="proxy" plural></span>
       </div>
     </div>
   </section>
 </if>
   <section id="languages-section">
-    <h3 i18n-content="advancedSectionTitleLanguages"></h3>
+    <h3>$i18n{advancedSectionTitleLanguages}</h3>
     <div class="settings-row">
-      <span i18n-content="languageSectionLabel"></span>
-      <a target="_blank" i18n-content="learnMore"
-          i18n-values="href:languagesLearnMoreURL"></a>
+      <span>$i18n{languageSectionLabel}</span>
+      <a target="_blank" href="$i18nRaw{languagesLearnMoreURL}">
+        $i18n{learnMore}
+      </a>
     </div>
     <div class="settings-row">
-      <button id="language-button"
-          i18n-content="languageAndSpellCheckSettingsButton"></button>
+      <button id="language-button">
+        $i18n{languageAndSpellCheckSettingsButton}
+      </button>
     </div>
     <div class="checkbox controlled-setting-with-label">
       <label>
         <input pref="translate.enabled"
             metric="Options_Translate" type="checkbox">
         <span>
-          <span i18n-content="translateEnableTranslate"></span>
+          <span>$i18n{translateEnableTranslate}</span>
           <span class="controlled-setting-indicator" pref="translate.enabled">
           </span>
         </span>
       </label>
-      <a is="action-link" id="manage-languages" i18n-content="manageLanguages">
-      </a>
+      <a is="action-link" id="manage-languages">$i18n{manageLanguages}</a>
     </div>
   </section>
   <section id="downloads-section">
-    <h3 i18n-content="downloadLocationGroupName"></h3>
+    <h3>$i18n{downloadLocationGroupName}</h3>
     <div>
       <div class="settings-row">
         <label>
-          <span id="download-location-label"
-              i18n-content="downloadLocationBrowseTitle">
+          <span id="download-location-label">
+            $i18n{downloadLocationBrowseTitle}
           </span>
           <input id="downloadLocationPath" class="weakrtl" type="text"
               size="36" readonly>
         </label>
-        <button id="downloadLocationChangeButton"
-            i18n-content="downloadLocationChangeButton">
+        <button id="downloadLocationChangeButton">
+          $i18n{downloadLocationChangeButton}
         </button>
         <span class="controlled-setting-indicator"
           pref="download.default_directory">
@@ -720,7 +733,7 @@
               pref="download.prompt_for_download"
               metric="Options_AskForSaveLocation">
           <span>
-            <span i18n-content="downloadLocationAskForSaveLocation"></span>
+            <span>$i18n{downloadLocationAskForSaveLocation}</span>
             <span class="controlled-setting-indicator"
                 pref="download.prompt_for_download"></span>
           </span>
@@ -734,7 +747,7 @@
               pref="gdata.disabled"
               metric="Options_DisableGData">
           <span>
-            <span i18n-content="disableGData"></span>
+            <span>$i18n{disableGData}</span>
             <span class="controlled-setting-indicator" pref="gdata.disabled">
             </span>
           </span>
@@ -743,53 +756,59 @@
 </if>
       <div id="auto-open-file-types-section" hidden>
         <div id="auto-open-file-types-container">
-          <div id="auto-open-file-types-label" class="settings-row"
-              i18n-content="autoOpenFileTypesInfo"></div>
+          <div id="auto-open-file-types-label" class="settings-row">
+            $i18n{autoOpenFileTypesInfo}
+          </div>
           <div class="settings-row">
-            <button id="autoOpenFileTypesResetToDefault"
-                i18n-content="autoOpenFileTypesResetToDefault"></button>
+            <button id="autoOpenFileTypesResetToDefault">
+              $i18n{autoOpenFileTypesResetToDefault}
+            </button>
             </div>
         </div>
       </div>
     </div>
   </section>
   <section id="certificates-section">
-      <h3 i18n-content="advancedSectionTitleCertificates"></h3>
+      <h3>$i18n{advancedSectionTitleCertificates}</h3>
       <div>
 <if expr="use_nss_certs or is_win or is_macosx">
         <div class="settings-row">
-          <button id="certificatesManageButton"
-              i18n-content="certificatesManageButton"></button>
+          <button id="certificatesManageButton">
+            $i18n{certificatesManageButton}
+          </button>
         </div>
 </if>
       </div>
   </section>
 <if expr="chromeos">
   <section id="cups-printers-section" hidden>
-    <h3 i18n-content="advancedSectionTitleCupsPrint"></h3>
+    <h3>$i18n{advancedSectionTitleCupsPrint}</h3>
     <div class="settings-row">
-      <span i18n-content="cupsPrintOptionLabel"></span>
-      <a target="_blank" i18n-content="learnMore"
-          i18n-values="href:cupsPrintLearnMoreURL">
+      <span>$i18n{cupsPrintOptionLabel}</span>
+      <a target="_blank" href="$i18nRaw{cupsPrintLearnMoreURL}">
+        $i18n{learnMore}
       </a>
     </div>
     <div class="settings-row">
-      <button id="cupsPrintersManageButton"
-          i18n-content="cupsPrintersManageButton"></button>
+      <button id="cupsPrintersManageButton">
+        $i18n{cupsPrintersManageButton}
+      </button>
     </div>
   </section>
 </if>
 <if expr="enable_service_discovery">
     <section id="cloudprint-options-mdns">
-      <h3 i18n-content="advancedSectionTitleCloudPrint"></h3>
+      <h3>$i18n{advancedSectionTitleCloudPrint}</h3>
       <div class="settings-row">
-        <span i18n-content="cloudPrintOptionLabel"></span>
-        <a target="_blank" i18n-content="learnMore"
-           i18n-values="href:cloudPrintLearnMoreURL"></a>
+        <span>$i18n{cloudPrintOptionLabel}</span>
+        <a target="_blank" href="$i18nRaw{cloudPrintLearnMoreURL}">
+          $i18n{learnMore}
+        </a>
       </div>
       <div class="settings-row">
-        <button id="cloudPrintDevicesPageButton"
-            i18n-content="cloudPrintDevicesPageButton"></button>
+        <button id="cloudPrintDevicesPageButton">
+          $i18n{cloudPrintDevicesPageButton}
+        </button>
       </div>
 
       <div class="settings-row checkbox controlled-setting-with-label"
@@ -800,7 +819,7 @@
               type="checkbox"
               metric="LocalDiscoveryNotificationsDisabled_Settings">
           <span>
-            <span i18n-content="cloudPrintEnableNotificationsLabel"></span>
+            <span>$i18n{cloudPrintEnableNotificationsLabel}</span>
             <span class="controlled-setting-indicator"
                   pref="local_discovery.notifications_enabled"></span>
           </span>
@@ -814,21 +833,23 @@
 </if>
 
 <section id="a11y-section">
-  <h3 i18n-content="accessibilityTitle"></h3>
+  <h3>$i18n{accessibilityTitle}</h3>
 
   <div>
     <a href="https://chrome.google.com/webstore/category/collection/accessibility"
-        id="accessibility-features" target="_blank"
-        i18n-content="accessibilityFeaturesLink"></a>
+        id="accessibility-features" target="_blank">
+      $i18n{accessibilityFeaturesLink}
+    </a>
   </div>
 
 <if expr="chromeos">
   <div class="option-control-table">
     <p id="accessibility-explanation" class="settings-row">
-      <span i18n-content="accessibilityExplanation"></span>
+      <span>$i18n{accessibilityExplanation}</span>
       <a id="accessibility-learn-more" target="_blank"
-          i18n-values="href:accessibilityLearnMoreURL"
-          i18n-content="learnMore"></a>
+          href="$i18nRaw{accessibilityLearnMoreURL}">
+        $i18n{learnMore}
+      </a>
     </p>
     <div class="option-name">
       <div class="checkbox controlled-setting-with-label">
@@ -837,7 +858,7 @@
               pref="settings.a11y.enable_menu" type="checkbox"
               metric="Options_AccessibilitySystemMenu">
           <span>
-            <span i18n-content="accessibilityAlwaysShowMenu"></span>
+            <span>$i18n{accessibilityAlwaysShowMenu}</span>
             <span class="controlled-setting-indicator"
                 pref="settings.a11y.enable_menu"></span>
           </span>
@@ -851,7 +872,7 @@
               pref="settings.a11y.large_cursor_enabled" type="checkbox"
               metric="Options_AccessibilityLargeMouseCursor">
           <span>
-            <span i18n-content="accessibilityLargeCursor"></span>
+            <span>$i18n{accessibilityLargeCursor}</span>
             <span class="controlled-setting-indicator"
                 pref="settings.a11y.large_cursor_enabled"></span>
           </span>
@@ -865,7 +886,7 @@
               pref="settings.a11y.high_contrast_enabled" type="checkbox"
               metric="Options_AccessibilityHighContrastMode">
           <span>
-            <span i18n-content="accessibilityHighContrast"></span>
+            <span>$i18n{accessibilityHighContrast}</span>
             <span class="controlled-setting-indicator"
                 pref="settings.a11y.high_contrast_enabled"></span>
           </span>
@@ -879,7 +900,7 @@
               pref="settings.a11y.sticky_keys_enabled" type="checkbox"
               metric="Options_AccessibilityStickyKeys">
           <span>
-            <span i18n-content="accessibilityStickyKeys"></span>
+            <span>$i18n{accessibilityStickyKeys}</span>
             <span class="controlled-setting-indicator"
                 pref="settings.a11y.sticky_keys_enabled"></span>
           </span>
@@ -893,16 +914,18 @@
               pref="settings.accessibility" type="checkbox"
               metric="Options_AccessibilitySpokenFeedback">
           <span>
-            <span i18n-content="accessibilitySpokenFeedback"></span>
+            <span>$i18n{accessibilitySpokenFeedback}</span>
             <span class="controlled-setting-indicator"
                 pref="settings.accessibility"></span>
           </span>
         </label>
         <div id="accessibility-settings" hidden>
-          <button id="accessibility-settings-button"
-            i18n-content="accessibilitySettings"></button>
-          <button id="talkback-settings-button"
-            i18n-content="accessibilityTalkBackSettings"></button>
+          <button id="accessibility-settings-button">
+            $i18n{accessibilitySettings}
+          </button>
+          <button id="talkback-settings-button">
+            $i18n{accessibilityTalkBackSettings}
+          </button>
         </div>
       </div>
     </div>
@@ -914,7 +937,7 @@
               pref="settings.a11y.screen_magnifier" type="checkbox"
               metric="Options_AccessibilityScreenMagnifier">
           <span>
-            <span i18n-content="accessibilityScreenMagnifier"></span>
+            <span>$i18n{accessibilityScreenMagnifier}</span>
             <span class="controlled-setting-indicator"
                 pref="settings.a11y.screen_magnifier"></span>
           </span>
@@ -929,7 +952,7 @@
               pref="settings.a11y.screen_magnifier_center_focus" type="checkbox"
               metric="Options_AccessibilityScreenMagnifierCenterFocus">
           <span>
-            <span i18n-content="accessibilityScreenMagnifierCenterFocus"></span>
+            <span>$i18n{accessibilityScreenMagnifierCenterFocus}</span>
             <span class="controlled-setting-indicator"
                 pref="settings.a11y.screen_magnifier_center_focus"></span>
           </span>
@@ -942,7 +965,7 @@
           <input id="accessibility-tap-dragging-check"
               pref="settings.touchpad.enable_tap_dragging" type="checkbox"
               metric="Options_AccessibilityTapDragging">
-          <span i18n-content="accessibilityTapDragging"></span>
+          <span>$i18n{accessibilityTapDragging}</span>
         </label>
       </div>
     </div>
@@ -952,7 +975,7 @@
           <input id="accessibility-autoclick-check"
               pref="settings.a11y.autoclick" type="checkbox">
           <span>
-            <span i18n-content="accessibilityAutoclick"></span>
+            <span>$i18n{accessibilityAutoclick}</span>
             <span class="controlled-setting-indicator"
                 pref="settings.a11y.autoclick"></span>
           </span>
@@ -960,26 +983,22 @@
       </div>
       <div class="checkbox">
         <!-- No whitespace between elements. -->
-        <input type="checkbox" class="spacer-checkbox"><span
-            id="accessibility-autoclick-label"
-            i18n-content="accessibilityAutoclickDropdown">
-        </span><select id="accessibility-autoclick-dropdown" class="control"
+        <input type="checkbox" class="spacer-checkbox">
+          <span id="accessibility-autoclick-label">
+            $i18n{accessibilityAutoclickDropdown}
+          </span>
+        <select id="accessibility-autoclick-dropdown" class="control"
             data-type="number"
             aria-labelledby="accessibility-autoclick-label"
             pref="settings.a11y.autoclick_delay_ms">
           <!-- i18n strings contain the autoclick duration; if the autoclick
                timing gets changed, then the i18n strings also needs to be
                updated. -->
-          <option value="600"
-              i18n-content="autoclickDelayExtremelyShort"></option>
-          <option value="800"
-              i18n-content="autoclickDelayVeryShort"></option>
-          <option value="1000" i18n-content="autoclickDelayShort">
-          </option>
-          <option value="2000" i18n-content="autoclickDelayLong">
-          </option>
-          <option value="4000"
-              i18n-content="autoclickDelayVeryLong"></option>
+          <option value="600">$i18n{autoclickDelayExtremelyShort}</option>
+          <option value="800">$i18n{autoclickDelayVeryShort}</option>
+          <option value="1000">$i18n{autoclickDelayShort}</option>
+          <option value="2000">$i18n{autoclickDelayLong}</option>
+          <option value="4000">$i18n{autoclickDelayVeryLong}</option>
         </select>
         <span class="controlled-setting-indicator"
             pref="settings.a11y.autoclick_delay_ms"></span>
@@ -991,7 +1010,7 @@
           <input pref="settings.a11y.virtual_keyboard" type="checkbox"
               metric="Options_AccessibilityOnScreenKeyboard">
           <span>
-            <span i18n-content="accessibilityVirtualKeyboard"></span>
+            <span>$i18n{accessibilityVirtualKeyboard}</span>
             <span class="controlled-setting-indicator"
                 pref="settings.a11y.virtual_keyboard"></span>
           </span>
@@ -1004,7 +1023,7 @@
           <input pref="settings.a11y.mono_audio" type="checkbox"
               metric="Options_AccessibilityMonoAudio">
           <span>
-            <span i18n-content="accessibilityMonoAudio"></span>
+            <span>$i18n{accessibilityMonoAudio}</span>
             <span class="controlled-setting-indicator"
                 pref="settings.a11y.mono_audio"></span>
           </span>
@@ -1017,7 +1036,7 @@
           <input pref="settings.a11y.caret_highlight" type="checkbox"
               metric="Options_AccessibilityCaretHighlight">
           <span>
-            <span i18n-content="accessibilityCaretHighlight"></span>
+            <span>$i18n{accessibilityCaretHighlight}</span>
             <span class="controlled-setting-indicator"
                 pref="settings.a11y.caret_highlight"></span>
           </span>
@@ -1030,7 +1049,7 @@
           <input pref="settings.a11y.cursor_highlight" type="checkbox"
               metric="Options_AccessibilityCursorHighlight">
           <span>
-            <span i18n-content="accessibilityCursorHighlight"></span>
+            <span>$i18n{accessibilityCursorHighlight}</span>
             <span class="controlled-setting-indicator"
                 pref="settings.a11y.cursor_highlight"></span>
           </span>
@@ -1043,7 +1062,7 @@
           <input pref="settings.a11y.focus_highlight" type="checkbox"
               metric="Options_AccessibilityFocusHighlight">
           <span>
-            <span i18n-content="accessibilityFocusHighlight"></span>
+            <span>$i18n{accessibilityFocusHighlight}</span>
             <span class="controlled-setting-indicator"
                 pref="settings.a11y.focus_highlight"></span>
           </span>
@@ -1057,7 +1076,7 @@
             <input pref="settings.a11y.select_to_speak" type="checkbox"
                 metric="Options_AccessibilitySelectToSpeak">
             <span>
-              <span i18n-content="accessibilitySelectToSpeak"></span>
+              <span>$i18n{accessibilitySelectToSpeak}</span>
               <span class="controlled-setting-indicator"
                   pref="settings.a11y.select_to_speak"></span>
             </span>
@@ -1070,7 +1089,7 @@
             <input pref="settings.a11y.switch_access" type="checkbox"
                 metric="Options_AccessibilitySwitchAccess">
             <span>
-              <span i18n-content="accessibilitySwitchAccess"></span>
+              <span>$i18n{accessibilitySwitchAccess}</span>
               <span class="controlled-setting-indicator"
                   pref="settings.a11y.switch_access"></span>
             </span>
@@ -1085,26 +1104,23 @@
 
 <if expr="chromeos">
   <section id="factory-reset-section" hidden>
-    <h3 i18n-content="factoryResetTitle"></h3>
+    <h3>$i18n{factoryResetTitle}</h3>
     <div>
-      <span class="settings-row" i18n-content="factoryResetDescription">
-      </span>
-      <button id="factory-reset-restart"
-          i18n-content="factoryResetRestart">
-      </button>
+      <span class="settings-row">$i18n{factoryResetDescription}</span>
+      <button id="factory-reset-restart">$i18n{factoryResetRestart}</button>
     </div>
   </section>
 </if>
 <if expr="not chromeos">
   <section id="system-section">
-    <h3 i18n-content="advancedSectionTitleSystem"></h3>
+    <h3>$i18n{advancedSectionTitleSystem}</h3>
 <if expr="not is_macosx">
     <div class="checkbox controlled-setting-with-label">
       <label>
         <input pref="background_mode.enabled"
             type="checkbox">
         <span>
-          <span i18n-content="backgroundModeCheckbox"></span>
+          <span>$i18n{backgroundModeCheckbox}</span>
           <span class="controlled-setting-indicator"
               pref="background_mode.enabled"></span>
         </span>
@@ -1116,29 +1132,27 @@
         <input id="gpu-mode-checkbox"
             pref="hardware_acceleration_mode.enabled" type="checkbox">
         <span>
-          <span i18n-content="gpuModeCheckbox"></span>
+          <span>$i18n{gpuModeCheckbox}</span>
           <span class="controlled-setting-indicator"
               pref="hardware_acceleration_mode.enabled"></span>
         </span>
       </label>
-      <span id="gpu-mode-reset-restart"
-          i18n-values=".innerHTML:gpuModeResetRestart"></span>
+      <span id="gpu-mode-reset-restart">$i18nRaw{gpuModeResetRestart}</span>
     </div>
   </section>
 </if>
   <section id="reset-profile-settings-section">
-    <h3 i18n-content="resetProfileSettingsSectionTitle"></h3>
+    <h3>$i18n{resetProfileSettingsSectionTitle}</h3>
     <div>
-      <span class="settings-row" i18n-content="resetProfileSettingsDescription">
-      </span>
-      <button id="reset-profile-settings" i18n-content="resetProfileSettings">
-      </button>
+      <span class="settings-row">$i18n{resetProfileSettingsDescription}</span>
+      <button id="reset-profile-settings">$i18n{resetProfileSettings}</button>
     </div>
   </section>
   </div>  <!-- advanced-settings-container -->
   </div>  <!-- advanced-settings -->
   <footer id="advanced-settings-footer">
-    <a is="action-link" id="advanced-settings-expander"
-        i18n-content="showAdvancedSettings"></a>
+    <a is="action-link" id="advanced-settings-expander">
+      $i18n{showAdvancedSettings}
+    </a>
   </footer>
 </div>
diff --git a/chrome/browser/resources/options/certificate_backup_overlay.html b/chrome/browser/resources/options/certificate_backup_overlay.html
index ded4f5e..92601ef 100644
--- a/chrome/browser/resources/options/certificate_backup_overlay.html
+++ b/chrome/browser/resources/options/certificate_backup_overlay.html
@@ -1,19 +1,21 @@
 <div id="certificateBackupOverlay" class="page" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="certificateExportPasswordDescription"></h1>
+  <h1>$i18n{certificateExportPasswordDescription}</h1>
   <div class="content-area">
     <table>
       <tr>
-        <td id="certificate-backup-password-label"
-            i18n-content="certificatePasswordLabel"></td>
+        <td id="certificate-backup-password-label">
+          $i18n{certificatePasswordLabel}
+        </td>
         <td>
           <input id="certificateBackupPassword" type="password"
               aria-labelledby="certificate-backup-password-label">
         </td>
       </tr>
       <tr>
-        <td id="certificate-backup-password-2-label"
-            i18n-content="certificateConfirmPasswordLabel"></td>
+        <td id="certificate-backup-password-2-label">
+          $i18n{certificateConfirmPasswordLabel}
+        </td>
         <td>
           <input id="certificateBackupPassword2" type="password"
               aria-labelledby="certificate-backup-password-2-label">
@@ -21,15 +23,17 @@
       </tr>
     </table>
     <p>
-      <span i18n-content="certificateExportPasswordHelp"></span>
+      <span>$i18n{certificateExportPasswordHelp}</span>
     </p>
   </div>
   <div class="action-area">
     <div class="button-strip">
-      <button id="certificateBackupCancelButton" type="reset"
-          i18n-content="cancel"></button>
+      <button id="certificateBackupCancelButton" type="reset">
+        $i18n{cancel}
+      </button>
       <button id="certificateBackupOkButton" class="default-button"
-          type="submit" i18n-content="ok" disabled>
+          type="submit" disabled>
+        $i18n{ok}
       </button>
     </div>
   </div>
diff --git a/chrome/browser/resources/options/certificate_edit_ca_trust_overlay.html b/chrome/browser/resources/options/certificate_edit_ca_trust_overlay.html
index 4dabea2..198002d 100644
--- a/chrome/browser/resources/options/certificate_edit_ca_trust_overlay.html
+++ b/chrome/browser/resources/options/certificate_edit_ca_trust_overlay.html
@@ -1,38 +1,40 @@
 <div id="certificateEditCaTrustOverlay" class="page" hidden>
-  <h1><span i18n-content="certificateEditCaTitle"></span></h1>
+  <h1><span>$i18n{certificateEditCaTitle}</span></h1>
   <div class="close-button"></div>
   <div class="content-area">
     <div>
       <span id="certificateEditCaTrustDescription"></span>
     </div>
     <section>
-      <h3><span i18n-content="certificateEditTrustLabel"></span></h3>
+      <h3><span>$i18n{certificateEditTrustLabel}</span></h3>
       <div class="checkbox">
         <label id="certificateCaTrustSSLLabel">
           <input id="certificateCaTrustSSLCheckbox" type="checkbox">
-          <span i18n-content="certificateCaTrustSSLLabel"></span>
+          <span>$i18n{certificateCaTrustSSLLabel}</span>
         </label>
       </div>
       <div class="checkbox">
         <label id="certificateCaTrustEmailLabel">
           <input id="certificateCaTrustEmailCheckbox" type="checkbox">
-          <span i18n-content="certificateCaTrustEmailLabel"></span>
+          <span>$i18n{certificateCaTrustEmailLabel}</span>
         </label>
       </div>
       <div class="checkbox">
         <label id="certificateCaTrustObjSignLabel">
           <input id="certificateCaTrustObjSignCheckbox" type="checkbox">
-          <span i18n-content="certificateCaTrustObjSignLabel"></span>
+          <span>$i18n{certificateCaTrustObjSignLabel}</span>
         </label>
       </div>
     </section>
   </div>
   <div class="action-area">
     <div class="button-strip">
-      <button id="certificateEditCaTrustCancelButton" type="reset"
-          i18n-content="cancel"></button>
+      <button id="certificateEditCaTrustCancelButton" type="reset">
+        $i18n{cancel}
+      </button>
       <button id="certificateEditCaTrustOkButton" class="default-button"
-          type="submit" i18n-content="ok">
+          type="submit">
+        $i18n{ok}
       </button>
     </div>
   </div>
diff --git a/chrome/browser/resources/options/certificate_import_error_overlay.html b/chrome/browser/resources/options/certificate_import_error_overlay.html
index b36d4db..c468b01 100644
--- a/chrome/browser/resources/options/certificate_import_error_overlay.html
+++ b/chrome/browser/resources/options/certificate_import_error_overlay.html
@@ -8,7 +8,8 @@
   <div class="action-area">
     <div class="button-strip">
       <button id="certificateImportErrorOverlayOk" class="default-button"
-          type="submit" i18n-content="done">
+          type="submit">
+        $i18n{done}
       </button>
     </div>
   </div>
diff --git a/chrome/browser/resources/options/certificate_manager.html b/chrome/browser/resources/options/certificate_manager.html
index 30fe9dc6..b619dd81 100644
--- a/chrome/browser/resources/options/certificate_manager.html
+++ b/chrome/browser/resources/options/certificate_manager.html
@@ -1,28 +1,25 @@
 <div id="certificateManagerPage" class="page" hidden>
   <div class="close-button"></div>
-  <h1 id='cert-manager-header' i18n-content="certificateManagerPage"></h1>
+  <h1 id='cert-manager-header'>$i18n{certificateManagerPage}</h1>
   <div id="certificate-manager-content-area" class="content-area">
     <!-- Navigation tabs -->
     <div class="subpages-nav-tabs">
       <span id="personal-certs-nav-tab" class="tab"
           tab-contents="personalCertsTab">
-        <span class="tab-label" i18n-content="personalCertsTabTitle"></span>
-        <span class="active-tab-label" i18n-content="personalCertsTabTitle">
-        </span>
+        <span class="tab-label">$i18n{personalCertsTabTitle}</span>
+        <span class="active-tab-label">$i18n{personalCertsTabTitle}</span>
       </span>
       <span id="server-certs-nav-tab" class="tab" tab-contents="serverCertsTab">
-        <span class="tab-label" i18n-content="serverCertsTabTitle"></span>
-        <span class="active-tab-label" i18n-content="serverCertsTabTitle">
-        </span>
+        <span class="tab-label">$i18n{serverCertsTabTitle}</span>
+        <span class="active-tab-label">$i18n{serverCertsTabTitle}</span>
       </span>
       <span id="ca-certs-nav-tab" class="tab" tab-contents="caCertsTab">
-        <span class="tab-label" i18n-content="caCertsTabTitle"></span>
-        <span class="active-tab-label" i18n-content="caCertsTabTitle"></span>
+        <span class="tab-label">$i18n{caCertsTabTitle}</span>
+        <span class="active-tab-label">$i18n{caCertsTabTitle}</span>
       </span>
       <span id="other-certs-nav-tab" class="tab" tab-contents="otherCertsTab">
-        <span class="tab-label" i18n-content="otherCertsTabTitle"></span>
-        <span class="active-tab-label" i18n-content="otherCertsTabTitle">
-        </span>
+        <span class="tab-label">$i18n{otherCertsTabTitle}</span>
+        <span class="active-tab-label">$i18n{otherCertsTabTitle}</span>
       </span>
     </div>
     <!-- TODO(mattm): get rid of use of tables -->
@@ -30,7 +27,7 @@
     <div id="personalCertsTab" class="subpages-tab-contents">
       <table class="certificate-tree-table">
         <tr><td>
-          <span i18n-content="personalCertsTabDescription"></span>
+          <span>$i18n{personalCertsTabDescription}</span>
         </td></tr>
         <tr><td>
           <tree id="personalCertsTab-tree" class="certificate-tree"
@@ -38,22 +35,22 @@
           </tree>
         </td></tr>
         <tr><td>
-          <button id="personalCertsTab-view" i18n-content="view_certificate"
-              disabled>
+          <button id="personalCertsTab-view" disabled>
+            $i18n{view_certificate}
           </button>
-          <button id="personalCertsTab-import"
-              i18n-content="import_certificate" disabled>
+          <button id="personalCertsTab-import" disabled>
+            $i18n{import_certificate}
           </button>
 <if expr="chromeos">
-          <button id="personalCertsTab-import-and-bind"
-              i18n-content="importAndBindCertificate" disabled>
+          <button id="personalCertsTab-import-and-bind" disabled>
+            $i18n{importAndBindCertificate}
           </button>
 </if>
-          <button id="personalCertsTab-backup" i18n-content="export_certificate"
-              disabled>
+          <button id="personalCertsTab-backup" disabled>
+            $i18n{export_certificate}
           </button>
-          <button id="personalCertsTab-delete" i18n-content="delete_certificate"
-              disabled>
+          <button id="personalCertsTab-delete" disabled>
+            $i18n{delete_certificate}
           </button>
         </td></tr>
       </table>
@@ -61,7 +58,7 @@
     <div id="serverCertsTab" class="subpages-tab-contents">
       <table class="certificate-tree-table">
         <tr><td>
-          <span i18n-content="serverCertsTabDescription"></span>
+          <span>$i18n{serverCertsTabDescription}</span>
         </td></tr>
         <tr><td>
           <tree id="serverCertsTab-tree" class="certificate-tree"
@@ -69,17 +66,17 @@
           </tree>
         </td></tr>
         <tr><td>
-          <button id="serverCertsTab-view" i18n-content="view_certificate"
-              disabled>
+          <button id="serverCertsTab-view" disabled>
+            $i18n{view_certificate}
           </button>
-          <button id="serverCertsTab-import" i18n-content="import_certificate"
-              disabled>
+          <button id="serverCertsTab-import" disabled>
+            $i18n{import_certificate}
           </button>
-          <button id="serverCertsTab-export" i18n-content="export_certificate"
-              disabled>
+          <button id="serverCertsTab-export" disabled>
+            $i18n{export_certificate}
           </button>
-          <button id="serverCertsTab-delete" i18n-content="delete_certificate"
-              disabled>
+          <button id="serverCertsTab-delete" disabled>
+            $i18n{delete_certificate}
           </button>
         </td></tr>
       </table>
@@ -87,7 +84,7 @@
     <div id="caCertsTab" class="subpages-tab-contents">
       <table class="certificate-tree-table">
         <tr><td>
-          <span i18n-content="caCertsTabDescription"></span>
+          <span>$i18n{caCertsTabDescription}</span>
         </td></tr>
         <tr><td>
           <tree id="caCertsTab-tree" class="certificate-tree"
@@ -95,19 +92,20 @@
           </tree>
         </td></tr>
         <tr><td>
-          <button id="caCertsTab-view" i18n-content="view_certificate"
-              disabled>
+          <button id="caCertsTab-view" disabled>
+            $i18n{view_certificate}
           </button>
-          <button id="caCertsTab-edit" i18n-content="edit_certificate"
-              disabled>
+          <button id="caCertsTab-edit" disabled>
+            $i18n{edit_certificate}
           </button>
-          <button id="caCertsTab-import" i18n-content="import_certificate"
-              disabled></button>
-          <button id="caCertsTab-export" i18n-content="export_certificate"
-              disabled>
+          <button id="caCertsTab-import" disabled>
+            $i18n{import_certificate}
           </button>
-          <button id="caCertsTab-delete" i18n-content="delete_certificate"
-              disabled>
+          <button id="caCertsTab-export" disabled>
+            $i18n{export_certificate}
+          </button>
+          <button id="caCertsTab-delete" disabled>
+            $i18n{delete_certificate}
           </button>
         </td></tr>
       </table>
@@ -115,21 +113,21 @@
     <div id="otherCertsTab" class="subpages-tab-contents">
       <table class="certificate-tree-table">
         <tr><td>
-          <span i18n-content="otherCertsTabDescription"></span>
+          <span>$i18n{otherCertsTabDescription}</span>
         </td></tr>
         <tr><td>
           <tree id="otherCertsTab-tree" class="certificate-tree"
               icon-visibility="parent"></tree>
         </td></tr>
         <tr><td>
-          <button id="otherCertsTab-view" i18n-content="view_certificate"
-              disabled>
+          <button id="otherCertsTab-view" disabled>
+            $i18n{view_certificate}
           </button>
-          <button id="otherCertsTab-export" i18n-content="export_certificate"
-              disabled>
+          <button id="otherCertsTab-export" disabled>
+            $i18n{export_certificate}
           </button>
-          <button id="otherCertsTab-delete" i18n-content="delete_certificate"
-              disabled>
+          <button id="otherCertsTab-delete" disabled>
+            $i18n{delete_certificate}
           </button>
         </td></tr>
       </table>
@@ -137,8 +135,8 @@
   </div>
   <div class="action-area">
     <div class="button-strip">
-      <button id="certificate-confirm" class="default-button"
-          i18n-content="done">
+      <button id="certificate-confirm" class="default-button">
+        $i18n{done}
       </button>
     </div>
   </div>
diff --git a/chrome/browser/resources/options/certificate_restore_overlay.html b/chrome/browser/resources/options/certificate_restore_overlay.html
index d68fafb..f238cbc 100644
--- a/chrome/browser/resources/options/certificate_restore_overlay.html
+++ b/chrome/browser/resources/options/certificate_restore_overlay.html
@@ -1,18 +1,20 @@
 <div id="certificateRestoreOverlay" class="page" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="certificateRestorePasswordDescription"></h1>
+  <h1>$i18n{certificateRestorePasswordDescription}</h1>
   <div class="content-area">
     <label id="certificateRestorePasswordLabel">
-      <span i18n-content="certificatePasswordLabel"></span>
+      <span>$i18n{certificatePasswordLabel}</span>
       <input id="certificateRestorePassword" type="password">
     </label>
   </div>
   <div class="action-area">
     <div class="button-strip">
-      <button id="certificateRestoreCancelButton" type="reset"
-          i18n-content="cancel"></button>
+      <button id="certificateRestoreCancelButton" type="reset">
+        $i18n{cancel}
+      </button>
       <button id="certificateRestoreOkButton" class="default-button"
-          type="submit" i18n-content="ok">
+          type="submit">
+        $i18n{ok}
       </button>
     </div>
   </div>
diff --git a/chrome/browser/resources/options/chromeos/accounts_options.html b/chrome/browser/resources/options/chromeos/accounts_options.html
index 2ddc846d..1cbfe32 100644
--- a/chrome/browser/resources/options/chromeos/accounts_options.html
+++ b/chrome/browser/resources/options/chromeos/accounts_options.html
@@ -1,11 +1,11 @@
 <div id="accountsPage" class="page" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="accountsPage"></h1>
+  <h1>$i18n{accountsPage}</h1>
   <div class="content-area">
     <div class="option">
       <div id="ownerOnlyWarning" hidden>
-        <span i18n-content="owner_only"></span>
-        <span i18n-content="ownerUserId"></span>
+        <span>$i18n{owner_only}</span>
+        <span>$i18n{ownerUserId}</span>
       </div>
       <table class="option-control-table">
       <tr>
@@ -15,7 +15,7 @@
               <input id="allowBwsiCheck" type="checkbox"
                      metric="Options_GuestBrowsing"
                      pref="cros.accounts.allowBWSI">
-              <span i18n-content="allow_BWSI"></span>
+              <span>$i18n{allow_BWSI}</span>
             </label>
           </div>
         </td>
@@ -27,7 +27,7 @@
               <input id="allowSupervisedCheck" type="checkbox"
                      metric="Options_SupervisedUsers"
                      pref="cros.accounts.supervisedUsersEnabled">
-              <span i18n-content="allow_supervised_users"></span>
+              <span>$i18n{allow_supervised_users}</span>
             </label>
           </div>
         </td>
@@ -39,7 +39,7 @@
               <input id="showUserNamesCheck" type="checkbox"
                      metric="Options_ShowUserNamesOnSignin"
                      pref="cros.accounts.showUserNamesOnSignIn">
-              <span i18n-content="show_user_on_signin"></span>
+              <span>$i18n{show_user_on_signin}</span>
             </label>
           </div>
         </td>
@@ -52,7 +52,7 @@
                      metric="Options_AllowAllUsers"
                      pref="cros.accounts.allowGuest"
                      inverted_pref>
-              <span i18n-content="use_whitelist"></span>
+              <span>$i18n{use_whitelist}</span>
             </label>
           </div>
         </td>
@@ -64,9 +64,9 @@
             <list id="userList"></list>
           </td></tr>
           <tr><td class="user-name-edit-row">
-            <label><span i18n-content="add_users"></span><br>
+            <label><span>$i18n{add_users}</span><br>
             <input id="userNameEdit" type="text"
-                i18n-values="placeholder:username_edit_hint">
+                placeholder="$i18n{username_edit_hint}">
             </span>
             </label>
           </td></tr>
@@ -77,8 +77,8 @@
   </div>
   <div class="action-area">
     <div class="button-strip">
-      <button id="accounts-options-overlay-confirm" class="default-button"
-          i18n-content="done">
+      <button id="accounts-options-overlay-confirm" class="default-button">
+        $i18n{done}
       </button>
     </div>
   </div>
diff --git a/chrome/browser/resources/options/chromeos/arc_opt_out_confirm_overlay.html b/chrome/browser/resources/options/chromeos/arc_opt_out_confirm_overlay.html
index 3105453..6e6575d 100644
--- a/chrome/browser/resources/options/chromeos/arc_opt_out_confirm_overlay.html
+++ b/chrome/browser/resources/options/chromeos/arc_opt_out_confirm_overlay.html
@@ -1,19 +1,19 @@
 <div id="arc-opt-out-confirm-overlay" class="page" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="arcOptOutDialogHeader"></h1>
+  <h1>$i18n{arcOptOutDialogHeader}</h1>
   <div class="content-area">
-    <span id="arc-opt-out-confirm-text"
-          i18n-values=".innerHTML:arcOptOutDialogDescription">
+    <span id="arc-opt-out-confirm-text">
+      $i18nRaw{arcOptOutDialogDescription}
     </span>
   </div>
   <div class="action-area">
     <div class="action-area-right">
       <div class="button-strip">
-        <button id="arc-opt-out-confirm-cancel"
-            i18n-content="arcOptOutDialogButtonCancel">
+        <button id="arc-opt-out-confirm-cancel">
+          $i18n{arcOptOutDialogButtonCancel}
         </button>
-        <button id="arc-opt-out-confirm-ok"
-            i18n-content="arcOptOutDialogButtonConfirmDisable">
+        <button id="arc-opt-out-confirm-ok">
+          $i18n{arcOptOutDialogButtonConfirmDisable}
         </button>
       </div>
     </div>
diff --git a/chrome/browser/resources/options/chromeos/bluetooth_add_device_overlay.html b/chrome/browser/resources/options/chromeos/bluetooth_add_device_overlay.html
index dcb87ab..99cafad2 100644
--- a/chrome/browser/resources/options/chromeos/bluetooth_add_device_overlay.html
+++ b/chrome/browser/resources/options/chromeos/bluetooth_add_device_overlay.html
@@ -1,26 +1,23 @@
 <div id="bluetooth-options" class="page" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="bluetoothAddDeviceTitle"></h1>
+  <h1>$i18n{bluetoothAddDeviceTitle}</h1>
   <div class="settings-list bluetooth-device-list content-area">
     <list id="bluetooth-unpaired-devices-list"></list>
     <div id="bluetooth-unpaired-devices-list-empty-placeholder"
         class="bluetooth-empty-list-label" hidden>
-      <span i18n-content="bluetoothNoDevicesFound"></span>
+      <span>$i18n{bluetoothNoDevicesFound}</span>
     </div>
   </div>
   <div class="action-area button-strip">
-    <button id="bluetooth-add-device-cancel-button" type="reset"
-        i18n-content="cancel">
+    <button id="bluetooth-add-device-cancel-button" type="reset">
+      $i18n{cancel}
     </button>
     <button id="bluetooth-add-device-apply-button" type="submit"
-        class="default-button" i18n-content="bluetoothConnectDevice" disabled>
+        class="default-button" disabled>
+      $i18n{bluetoothConnectDevice}
     </button>
-    <span id="bluetooth-scanning-label"
-        i18n-content="bluetoothScanning">
-    </span>
-    <span id="bluetooth-scan-stopped-label"
-        i18n-content="bluetoothScanStopped">
-    </span>
+    <span id="bluetooth-scanning-label">$i18n{bluetoothScanning}</span>
+    <span id="bluetooth-scan-stopped-label">$i18n{bluetoothScanStopped}</span>
     <div id="bluetooth-scanning-icon" class="inline-spinner"></div>
   </div>
 </div>
diff --git a/chrome/browser/resources/options/chromeos/bluetooth_pair_device_overlay.html b/chrome/browser/resources/options/chromeos/bluetooth_pair_device_overlay.html
index 255dec0..cc37aa1 100644
--- a/chrome/browser/resources/options/chromeos/bluetooth_pair_device_overlay.html
+++ b/chrome/browser/resources/options/chromeos/bluetooth_pair_device_overlay.html
@@ -1,6 +1,6 @@
 <div id="bluetooth-pairing" class="page" hidden>
   <div id="bluetooth-pairing-close-button" class="close-button"></div>
-  <h1 i18n-content="bluetoothAddDeviceTitle"></h1>
+  <h1>$i18n{bluetoothAddDeviceTitle}</h1>
   <div id="bluetooth-pairing-message-area" class="content-area">
     <div id="bluetooth-pairing-message-contents">
       <div id="bluetooth-pairing-instructions"></div>
@@ -14,15 +14,20 @@
     </div>
   </div>
   <div class="action-area button-strip">
-    <button id="bluetooth-pair-device-cancel-button" type="reset"
-        i18n-content="cancel" hidden></button>
-    <button id="bluetooth-pair-device-connect-button" type="reset"
-        i18n-content="bluetoothConnectDevice" hidden></button>
-    <button id="bluetooth-pair-device-reject-button" type="reset"
-        i18n-content="bluetoothRejectPasskey" hidden></button>
-    <button id="bluetooth-pair-device-accept-button" type="reset"
-        i18n-content="bluetoothAcceptPasskey" hidden></button>
-    <button id="bluetooth-pair-device-dismiss-button" type="reset"
-        i18n-content="bluetoothDismissError" hidden></button>
+    <button id="bluetooth-pair-device-cancel-button" type="reset" hidden>
+      $i18n{cancel}
+    </button>
+    <button id="bluetooth-pair-device-connect-button" type="reset" hidden>
+      $i18n{bluetoothConnectDevice}
+    </button>
+    <button id="bluetooth-pair-device-reject-button" type="reset" hidden>
+      $i18n{bluetoothRejectPasskey}
+    </button>
+    <button id="bluetooth-pair-device-accept-button" type="reset" hidden>
+      $i18n{bluetoothAcceptPasskey}
+    </button>
+    <button id="bluetooth-pair-device-dismiss-button" type="reset" hidden>
+      $i18n{bluetoothDismissError}
+    </button>
   </div>
 </div>
diff --git a/chrome/browser/resources/options/chromeos/change_picture_options.html b/chrome/browser/resources/options/chromeos/change_picture_options.html
index 146585d..55f4bcb 100644
--- a/chrome/browser/resources/options/chromeos/change_picture_options.html
+++ b/chrome/browser/resources/options/chromeos/change_picture_options.html
@@ -1,12 +1,12 @@
 <div id="change-picture-page" class="page" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="changePicturePage"></h1>
+  <h1>$i18n{changePicturePage}</h1>
   <div class="content-area">
-    <div i18n-content="changePicturePageDescription"></div>
+    <div>$i18n{changePicturePageDescription}</div>
     <div id="user-images-area">
       <grid id="user-image-grid" class="user-image-picker" tabindex="1"></grid>
       <div id="user-image-preview">
-        <img id="user-image-preview-img" i18n-values="alt:previewAltText">
+        <img id="user-image-preview-img" alt="$i18n{previewAltText}">
         <div class="user-image-stream-area">
           <div class="perspective-box">
             <div id="user-image-stream-crop">
@@ -15,24 +15,25 @@
           </div>
           <div class="spinner"></div>
         </div>
-        <button id="discard-photo" i18n-values="title:discardPhoto"
-            tabindex="2"></button>
-        <button id="take-photo" i18n-values="title:takePhoto" tabindex="2">
+        <button id="discard-photo" title="$i18n{discardPhoto}" tabindex="2">
+        </button>
+        <button id="take-photo" title="$i18n{takePhoto}" tabindex="2">
         </button>
         <button id="flip-photo" class="custom-appearance"
-            i18n-values="title:flipPhoto" tabindex="1"></button>
+            title="$i18n{flipPhoto}" tabindex="1"></button>
       </div>
     </div>
     <div id="user-image-attribution">
-      <span i18n-content="authorCredit"></span>
+      <span>$i18n{authorCredit}</span>
       <strong id="user-image-author-name"></strong>
       <a id="user-image-author-website" target="_blank"></a>
     </div>
   </div>
   <div class="action-area">
     <div class="button-strip">
-      <button id="change-picture-overlay-confirm" i18n-content="done"
-              tabindex="2"></button>
+      <button id="change-picture-overlay-confirm" tabindex="2">
+        $i18n{done}
+      </button>
     </div>
   </div>
 </div>
diff --git a/chrome/browser/resources/options/chromeos/display_options.html b/chrome/browser/resources/options/chromeos/display_options.html
index d915ec7b..13be28d 100644
--- a/chrome/browser/resources/options/chromeos/display_options.html
+++ b/chrome/browser/resources/options/chromeos/display_options.html
@@ -1,6 +1,6 @@
 <div id="display-options-page" class="page" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="displayOptionsPage"></h1>
+  <h1>$i18n{displayOptionsPage}</h1>
   <div class="content-area" id="display-options-content-area">
     <div id="display-options-displays-view-host">
     </div>
@@ -8,16 +8,17 @@
       <div id="selected-display-data-container">
         <div id="selected-display-name"></div>
         <div class="selected-display-option-row">
-          <div class="selected-display-option-title"
-              i18n-content="selectedDisplayTitleOptions">
+          <div class="selected-display-option-title">
+            $i18n{selectedDisplayTitleOptions}
           </div>
           <select id="display-options-select-mirroring"
               class="display-options-button">
-            <option value="extended" i18n-content="extendedMode"></option>
-            <option value="mirroring" i18n-content="mirroringMode"></option>
+            <option value="extended">$i18n{extendedMode}</option>
+            <option value="mirroring">$i18n{mirroringMode}</option>
           </select>
           <button id="display-options-set-primary"
-              class="display-options-button2" i18n-content="setPrimary">
+              class="display-options-button2">
+            $i18n{setPrimary}
           </button>
         </div>
         <div id="display-options-unified-desktop"
@@ -27,43 +28,44 @@
           </div>
           <label>
             <input id="display-options-toggle-unified-desktop" type="checkbox">
-            <span class="controlled-setting-with-label"
-                i18n-content="enableUnifiedDesktop"></span>
+            <span class="controlled-setting-with-label">
+              $i18n{enableUnifiedDesktop}
+            </span>
           </label>
         </div>
         <div class="selected-display-option-row">
-          <div class="selected-display-option-title"
-              i18n-content="selectedDisplayTitleResolution">
+          <div class="selected-display-option-title">
+            $i18n{selectedDisplayTitleResolution}
           </div>
           <select id="display-options-resolution-selection"
               class="display-options-button">
           </select>
         </div>
         <div class="selected-display-option-row">
-          <div class="selected-display-option-title"
-              i18n-content="selectedDisplayTitleOrientation">
+          <div class="selected-display-option-title">
+            $i18n{selectedDisplayTitleOrientation}
           </div>
           <select id="display-options-orientation-selection"
               class="display-options-button">
-            <option value="0" i18n-content="orientation0"></option>
-            <option value="90" i18n-content="orientation90"></option>
-            <option value="180" i18n-content="orientation180"></option>
-            <option value="270" i18n-content="orientation270"></option>
+            <option value="0">$i18n{orientation0}</option>
+            <option value="90">$i18n{orientation90}</option>
+            <option value="180">$i18n{orientation180}</option>
+            <option value="270">$i18n{orientation270}</option>
           </select>
         </div>
         <div class="selected-display-option-row">
-          <div class="selected-display-option-title"
-              i18n-content="selectedDisplayTitleOverscan">
+          <div class="selected-display-option-title">
+            $i18n{selectedDisplayTitleOverscan}
           </div>
           <button id="selected-display-start-calibrating-overscan"
-              class="display-options-button"
-              i18n-content="startCalibratingOverscan">
+              class="display-options-button">
+            $i18n{startCalibratingOverscan}
           </button>
         </div>
         <div class="selected-display-option-row"
             id="selected-display-color-profile-row" hidden>
-          <div class="selected-display-option-title"
-              i18n-content="selectedDisplayColorProfile">
+          <div class="selected-display-option-title">
+            $i18n{selectedDisplayColorProfile}
           </div>
           <select id="display-options-color-profile-selection"
               class="display-options-button">
@@ -78,8 +80,9 @@
   </div>
   <div class="action-area">
     <div class="button-strip">
-      <button id="display-options-done" i18n-content="done"
-          class="default-button"></button>
+      <button id="display-options-done" class="default-button">
+        $i18n{done}
+      </button>
     </div>
   </div>
 </div>
diff --git a/chrome/browser/resources/options/chromeos/display_overscan.html b/chrome/browser/resources/options/chromeos/display_overscan.html
index 53c280a..ce5b97f 100644
--- a/chrome/browser/resources/options/chromeos/display_overscan.html
+++ b/chrome/browser/resources/options/chromeos/display_overscan.html
@@ -9,22 +9,20 @@
           <div id="display-overscan-operation-shift"></div></td>
       </tr>
       <tr>
-        <td><span i18n-content="shrinkAndExpand"></span></td>
-        <td><span i18n-content="move"></span></td>
+        <td><span>$i18n{shrinkAndExpand}</span></td>
+        <td><span>$i18n{move}</span></td>
       </tr>
     </table>
     <!-- Specify 'reversed' to prevernt re-reversing the button order by
          options_page. -->
     <div class="button-strip" id="display-overscan-button-strip" reversed>
-      <button id="display-overscan-operation-reset"
-          i18n-content="overscanReset">
+      <button id="display-overscan-operation-reset">
+        $i18n{overscanReset}
       </button>
       <div id="display-overscan-buttons-spacer"></div>
-      <button id="display-overscan-operation-ok"
-          i18n-content="overscanOK">
-      </button>
-      <button id="display-overscan-operation-cancel"
-          i18n-content="overscanCancel">
+      <button id="display-overscan-operation-ok">$i18n{overscanOK}</button>
+      <button id="display-overscan-operation-cancel">
+        $i18n{overscanCancel}
       </button>
     </div>
   </div>
diff --git a/chrome/browser/resources/options/chromeos/internet_detail.html b/chrome/browser/resources/options/chromeos/internet_detail.html
index 847a27fe..b3b07bb 100644
--- a/chrome/browser/resources/options/chromeos/internet_detail.html
+++ b/chrome/browser/resources/options/chromeos/internet_detail.html
@@ -14,52 +14,43 @@
     <div id="details-tab-strip" class="subpages-nav-tabs">
       <span id="wifi-network-nav-tab" class="tab wifi-details"
           tab-contents="wifi-network-tab">
-        <span class="tab-label"
-            i18n-content="wifiNetworkTabLabel"></span>
-        <span class="active-tab-label"
-            i18n-content="wifiNetworkTabLabel"></span>
+        <span class="tab-label">$i18n{wifiNetworkTabLabel}</span>
+        <span class="active-tab-label">$i18n{wifiNetworkTabLabel}</span>
       </span>
       <span id="vpn-nav-tab" class="tab vpn-details"
           tab-contents="vpn-tab">
-        <span class="tab-label"
-            i18n-content="vpnTabLabel"></span>
-        <span class="active-tab-label" i18n-content="vpnTabLabel"></span>
+        <span class="tab-label">$i18n{vpnTabLabel}</span>
+        <span class="active-tab-label">$i18n{vpnTabLabel}</span>
       </span>
       <span id="wimax-network-nav-tab" class="tab wimax-details"
           tab-contents="wimax-network-tab">
-        <span class="tab-label"
-            i18n-content="wimaxConnTabLabel"></span>
-        <span class="active-tab-label"
-            i18n-content="wimaxConnTabLabel"></span>
+        <span class="tab-label">$i18n{wimaxConnTabLabel}</span>
+        <span class="active-tab-label">$i18n{wimaxConnTabLabel}</span>
       </span>
       <span id="cellular-conn-nav-tab" class="tab cellular-details"
           tab-contents="cellular-conn-tab">
-        <span class="tab-label"
-            i18n-content="cellularConnTabLabel"></span>
-        <span class="active-tab-label"
-            i18n-content="cellularConnTabLabel"></span>
+        <span class="tab-label">$i18n{cellularConnTabLabel}</span>
+        <span class="active-tab-label">$i18n{cellularConnTabLabel}</span>
       </span>
       <span id="cellular-device-nav-tab" class="tab cellular-details"
           tab-contents="cellular-device-tab">
-        <span class="tab-label"
-            i18n-content="cellularDeviceTabLabel"></span>
-        <span class="active-tab-label"
-            i18n-content="cellularDeviceTabLabel"></span>
+        <span class="tab-label">$i18n{cellularDeviceTabLabel}</span>
+        <span class="active-tab-label">$i18n{cellularDeviceTabLabel}</span>
       </span>
       <span id="internet-nav-tab" class="tab network-details"
           tab-contents="internet-tab">
-        <span class="tab-label" i18n-content="networkTabLabel"></span>
-        <span class="active-tab-label" i18n-content="networkTabLabel"></span>
+        <span class="tab-label">$i18n{networkTabLabel}</span>
+        <span class="active-tab-label">$i18n{networkTabLabel}</span>
       </span>
       <span id="security-nav-tab" class="tab cellular-details gsm-only"
           tab-contents="security-tab">
-        <span class="tab-label" i18n-content="securityTabLabel"></span>
-        <span class="active-tab-label" i18n-content="securityTabLabel"></span>
+        <span class="tab-label">$i18n{securityTabLabel}</span>
+        <span class="active-tab-label">$i18n{securityTabLabel}</span>
       </span>
       <span id="internet-proxy-nav-tab" class="tab proxy-details"
           tab-contents="network-proxy-tab">
-        <span class="tab-label" i18n-content="proxyTabLabel"></span>
-        <span class="active-tab-label" i18n-content="proxyTabLabel"></span>
+        <span class="tab-label">$i18n{proxyTabLabel}</span>
+        <span class="active-tab-label">$i18n{proxyTabLabel}</span>
       </span>
     </div>
     <div id="wifi-network-tab" class="subpages-tab-contents wifi-details">
@@ -71,7 +62,7 @@
                 <label>
                   <input id="prefer-network-wifi" type="checkbox">
                   <span>
-                    <span i18n-content="inetPreferredNetwork"></span>
+                    <span>$i18n{inetPreferredNetwork}</span>
                     <span class="controlled-setting-indicator"
                           managed="Priority"
                           internet-detail-for="prefer-network-wifi"></span>
@@ -86,7 +77,7 @@
                 <label>
                   <input id="auto-connect-network-wifi" type="checkbox">
                   <span>
-                    <span i18n-content="inetAutoConnectNetwork"></span>
+                    <span>$i18n{inetAutoConnectNetwork}</span>
                     <span class="controlled-setting-indicator"
                           managed="WiFi.AutoConnect"
                           internet-detail-for="auto-connect-network-wifi">
@@ -101,35 +92,35 @@
       <section>
         <table id="wifi-settings-table">
           <tr>
-            <td class="option-name" i18n-content="connectionState"></td>
+            <td class="option-name">$i18n{connectionState}</td>
             <td id="wifi-connection-state" class="option-value"></td>
           </tr>
           <tr>
-            <td class="option-name" i18n-content="restrictedConnectivity"></td>
+            <td class="option-name">$i18n{restrictedConnectivity}</td>
             <td id="wifi-restricted-connectivity" class="option-value"></td>
           </tr>
           <tr>
-            <td class="option-name" i18n-content="inetSsid"></td>
+            <td class="option-name">$i18n{inetSsid}</td>
             <td id="wifi-ssid" class="option-value"></td>
           </tr>
           <tr id="wifi-bssid-entry">
-            <td class="option-name" i18n-content="inetBssid"></td>
+            <td class="option-name">$i18n{inetBssid}</td>
             <td id="wifi-bssid" class="option-value"></td>
           </tr>
           <tr id="wifi-security-entry">
-            <td class="options-name" i18n-content="inetEncryption"></td>
+            <td class="options-name">$i18n{inetEncryption}</td>
             <td id="wifi-security" class="option-value"></td>
           </tr>
           <tr>
-            <td class="options-name" i18n-content="inetFrequency"></td>
+            <td class="options-name">$i18n{inetFrequency}</td>
             <td id="wifi-frequency" class="option-value"></td>
           </tr>
           <tr>
-            <td class="options-name" i18n-content="inetSignalStrength"></td>
+            <td class="options-name">$i18n{inetSignalStrength}</td>
             <td id="wifi-signal-strength" class="option-value"></td>
           </tr>
           <tr id="wifi-hardware-address-entry">
-            <td class="option-name" i18n-content="hardwareAddress"></td>
+            <td class="option-name">$i18n{hardwareAddress}</td>
             <td id="wifi-hardware-address" class="option-value"></td>
           </tr>
         </table>
@@ -137,13 +128,13 @@
       <section>
         <table class="option-control-table">
           <tr>
-            <td id="password-details"  class="option-name"
-                i18n-content="inetPassProtected">
+            <td id="password-details" class="option-name">
+              $i18n{inetPassProtected}
             </td>
           </tr>
           <tr>
-            <td id="wifi-shared-network" class="option-name"
-                i18n-content="inetNetworkShared">
+            <td id="wifi-shared-network" class="option-name">
+              $i18n{inetNetworkShared}
             </td>
           </tr>
         </table>
@@ -158,7 +149,7 @@
                 <label>
                   <input id="auto-connect-network-wimax" type="checkbox">
                   <span>
-                    <span i18n-content="inetAutoConnectNetwork"></span>
+                    <span>$i18n{inetAutoConnectNetwork}</span>
                     <span class="controlled-setting-indicator"
                           managed="WiMAX.AutoConnect"
                           internet-detail-for="auto-connect-network-wimax">
@@ -173,19 +164,19 @@
       <section>
         <table id="wimax-settings-table">
           <tr>
-            <td class="option-name" i18n-content="connectionState"></td>
+            <td class="option-name">$i18n{connectionState}</td>
             <td id="wimax-connection-state" class="option-value"></td>
           </tr>
           <tr>
-            <td class="option-name" i18n-content="restrictedConnectivity"></td>
+            <td class="option-name">$i18n{restrictedConnectivity}</td>
             <td id="wimax-restricted-connectivity" class="option-value"></td>
           </tr>
           <tr id="wimax-eap-identity-entry">
-            <td class="option-name" i18n-content="inetUsername"></td>
+            <td class="option-name">$i18n{inetUsername}</td>
             <td id="wimax-eap-identity" class="option-value"></td>
           </tr>
           <tr>
-            <td class="options-name" i18n-content="inetSignalStrength"></td>
+            <td class="options-name">$i18n{inetSignalStrength}</td>
             <td id="wimax-signal-strength" class="option-value"></td>
           </tr>
         </table>
@@ -193,8 +184,8 @@
       <section>
         <table class="option-control-table">
           <tr>
-            <td id="wimax-shared-network" class="option-name"
-                i18n-content="inetNetworkShared">
+            <td id="wimax-shared-network" class="option-name">
+              $i18n{inetNetworkShared}
             </td>
           </tr>
         </table>
@@ -209,7 +200,7 @@
                 <label>
                   <input id="auto-connect-network-vpn" type="checkbox">
                   <span>
-                    <span i18n-content="inetAutoConnectNetwork"></span>
+                    <span>$i18n{inetAutoConnectNetwork}</span>
                     <span class="controlled-setting-indicator"
                           managed="VPN.AutoConnect"
                           internet-detail-for="auto-connect-network-vpn"></span>
@@ -219,11 +210,11 @@
             </td>
           </tr>
           <tr>
-            <td class="option-name" i18n-content="inetServiceName"></td>
+            <td class="option-name">$i18n{inetServiceName}</td>
             <td id="inet-service-name" class="option-value"></td>
           </tr>
           <tr class="built-in-vpn-provider-only">
-            <td class="option-name" i18n-content="inetServerHostname"></td>
+            <td class="option-name">$i18n{inetServerHostname}</td>
             <td>
               <input class="option-value" id="inet-server-hostname"></input>
               <span class="controlled-setting-indicator"
@@ -232,15 +223,15 @@
             </td>
           </tr>
           <tr>
-            <td class="option-name" i18n-content="inetProviderType"></td>
+            <td class="option-name">$i18n{inetProviderType}</td>
             <td id="inet-provider-type" class="option-value"></td>
           </tr>
           <tr class="third-party-vpn-provider-only">
-            <td class="option-name" i18n-content="inetProviderName"></td>
+            <td class="option-name">$i18n{inetProviderName}</td>
             <td id="inet-provider-name" class="option-value"></td>
           </tr>
           <tr class="built-in-vpn-provider-only">
-            <td class="option-name" i18n-content="inetUsername"></td>
+            <td class="option-name">$i18n{inetUsername}</td>
             <td id="inet-username" class="option-value"></td>
           </tr>
         </table>
@@ -250,43 +241,42 @@
       <section id="cellular-network-options">
         <table class="option-control-table">
           <tr>
-            <td class="option-name" i18n-content="serviceName"></td>
+            <td class="option-name">$i18n{serviceName}</td>
             <td id="service-name" class="option-value"></td>
           </tr>
           <tr>
-            <td class="option-name" i18n-content="networkTechnology"></td>
+            <td class="option-name">$i18n{networkTechnology}</td>
             <td id="network-technology" class="option-value"></td>
           </tr>
           <tr>
-            <td class="option-name" i18n-content="activationState"></td>
+            <td class="option-name">$i18n{activationState}</td>
             <td id="activation-state" class="option-value"></td>
           </tr>
           <tr>
-            <td class="option-name" i18n-content="roamingState"></td>
+            <td class="option-name">$i18n{roamingState}</td>
             <td id="roaming-state" class="option-value"></td>
           </tr>
           <tr>
-            <td class="option-name" i18n-content="restrictedConnectivity"></td>
+            <td class="option-name">$i18n{restrictedConnectivity}</td>
             <td id="cellular-restricted-connectivity" class="option-value"></td>
           </tr>
           <tr>
-            <td class="option-name" i18n-content="operatorName"></td>
+            <td class="option-name">$i18n{operatorName}</td>
             <td id="operator-name" class="option-value"></td>
           </tr>
           <tr>
-            <td class="option-name" i18n-content="operatorCode"></td>
+            <td class="option-name">$i18n{operatorCode}</td>
             <td id="operator-code" class="option-value"></td>
           </tr>
           <tr>
-            <td class="option-name" i18n-content="errorState"></td>
+            <td class="option-name">$i18n{errorState}</td>
             <td id="error-state" class="option-value"></td>
           </tr>
           <tr class="gsm-only apn-list-view">
-            <td class="option-name" i18n-content="cellularApnLabel"></td>
+            <td class="option-name">$i18n{cellularApnLabel}</td>
             <td id="cellular-apn-label" class="option-value">
               <select id="select-apn">
-                <option value="-1" i18n-content="cellularApnOther">
-                </option>
+                <option value="-1">$i18n{cellularApnOther}</option>
               </select>
               <span class="controlled-setting-indicator"
                     managed="Cellular.APN"
@@ -294,19 +284,19 @@
             </td>
           </tr>
           <tr class="gsm-only apn-details-view">
-            <td class="option-name" i18n-content="cellularApnLabel"></td>
+            <td class="option-name">$i18n{cellularApnLabel}</td>
             <td id="cellular-apn-label" class="option-value">
               <input id="cellular-apn" type="text">
             </td>
           </tr>
           <tr class="gsm-only apn-details-view">
-            <td class="option-name" i18n-content="cellularApnUsername"></td>
+            <td class="option-name">$i18n{cellularApnUsername}</td>
             <td id="cellular-apn-username-label" class="option-value">
               <input id="cellular-apn-username" type="text">
             </td>
           </tr>
           <tr class="gsm-only apn-details-view">
-            <td class="option-name" i18n-content="cellularApnPassword"></td>
+            <td class="option-name">$i18n{cellularApnPassword}</td>
             <td id="cellular-apn-password-label" class="option-value">
               <input id="cellular-apn-password" type="password">
             </td>
@@ -314,12 +304,13 @@
           <tr class="gsm-only apn-details-view">
             <td class="option-name"></td>
             <td class="option-value">
-              <button id="cellular-apn-use-default"
-                  i18n-content="cellularApnUseDefault"></button>
-              <button id="cellular-apn-set"
-                  i18n-content="cellularApnSet"></button>
-              <button id="cellular-apn-cancel"
-                  i18n-content="cellularApnCancel"></button>
+              <button id="cellular-apn-use-default">
+                $i18n{cellularApnUseDefault}
+              </button>
+              <button id="cellular-apn-set">$i18n{cellularApnSet}</button>
+              <button id="cellular-apn-cancel">
+                $i18n{cellularApnCancel}
+              </button>
             </td>
           </tr>
           <tr>
@@ -328,7 +319,7 @@
                 <label>
                   <input id="auto-connect-network-cellular" type="checkbox">
                   <span>
-                    <span i18n-content="inetAutoConnectNetwork"></span>
+                    <span>$i18n{inetAutoConnectNetwork}</span>
                     <span class="controlled-setting-indicator"
                           managed="Cellular.AutoConnect"
                           internet-detail-for="auto-connect-network-cellular">
@@ -346,23 +337,23 @@
       <section id="cellular-device-options">
         <table class="option-control-table">
           <tr>
-            <td class="option-name" i18n-content="cellularManufacturer"></td>
+            <td class="option-name">$i18n{cellularManufacturer}</td>
             <td id="manufacturer" class="option-value"></td>
           </tr>
           <tr>
-            <td class="option-name" i18n-content="modelId"></td>
+            <td class="option-name">$i18n{modelId}</td>
             <td id="model-id" class="option-value"></td>
           </tr>
           <tr>
-            <td class="option-name" i18n-content="firmwareRevision"></td>
+            <td class="option-name">$i18n{firmwareRevision}</td>
             <td id="firmware-revision" class="option-value"></td>
           </tr>
           <tr>
-            <td class="option-name" i18n-content="hardwareRevision"></td>
+            <td class="option-name">$i18n{hardwareRevision}</td>
             <td id="hardware-revision" class="option-value"></td>
           </tr>
           <tr class="cdma-only">
-            <td class="option-name" i18n-content="prlVersion"></td>
+            <td class="option-name">$i18n{prlVersion}</td>
             <td id="prl-version" class="option-value"></td>
           </tr>
           <tr>
@@ -400,11 +391,11 @@
       <section id="advanced-section">
         <table class="option-control-table">
           <tr>
-            <td class="option-name" i18n-content="connectionState"></td>
+            <td class="option-name">$i18n{connectionState}</td>
             <td id="connection-state" class="option-value"></td>
           </tr>
           <tr id="hardware-address-row">
-            <td class="option-name" i18n-content="hardwareAddress"></td>
+            <td class="option-name">$i18n{hardwareAddress}</td>
              <td id="hardware-address" class="option-value"></td>
           </tr>
         </table>
@@ -416,7 +407,7 @@
             <input id="ip-automatic-configuration-checkbox"
                 type="checkbox">
             <span>
-              <span i18n-content="ipAutomaticConfiguration"></span>
+              <span>$i18n{ipAutomaticConfiguration}</span>
               <span class="controlled-setting-indicator"
                     managed="IPAddressConfigType"></span>
             </span>
@@ -426,23 +417,24 @@
         <table id="ip-address-settings">
           <tr>
             <td class="spacer" width="14px"></td>
-            <td class="option-name" i18n-content="inetAddress"></td>
+            <td class="option-name">$i18n{inetAddress}</td>
             <td><div id="ip-address"></div></td>
           </tr>
           <tr>
             <td class="spacer" width="14px"></td>
-            <td class="option-name" id="ip-netmask-label"
-                i18n-content="inetNetmask"></td>
+            <td class="option-name" id="ip-netmask-label">
+              $i18n{inetNetmask}
+            </td>
             <td><div id="ip-netmask"></div></td>
           </tr>
           <tr>
             <td class="spacer" width="14px"></td>
-            <td class="option-name" i18n-content="inetGateway"></td>
+            <td class="option-name">$i18n{inetGateway}</td>
             <td><div id="ip-gateway"></div></td>
           </tr>
           <tr>
             <td class="spacer" width="14px"></td>
-            <td class="option-name" i18n-content="ipv6Address"></td>
+            <td class="option-name">$i18n{ipv6Address}</td>
             <td><div id="ipv6-address"></div></td>
           </tr>
         </table>
@@ -453,7 +445,7 @@
             <input id="automatic-dns-radio" type="radio" name="dnstype"
                 value="automatic">
             <span>
-              <span i18n-content="automaticNameServers"></span>
+              <span>$i18n{automaticNameServers}</span>
               <span class="controlled-setting-indicator"
                     managed="NameServersConfigType"></span>
             </span>
@@ -472,7 +464,7 @@
           <label>
             <input id="user-dns-radio" type="radio" name="dnstype"
                 value="user">
-            <span i18n-content="userNameServers"></span>
+            <span>$i18n{userNameServers}</span>
           </label>
         </div>
         <table id="user-dns-settings">
@@ -513,7 +505,7 @@
             <label>
               <input id="sim-card-lock-enabled" type="checkbox">
               <span>
-                <span i18n-content="lockSimCard"></span>
+                <span>$i18n{lockSimCard}</span>
                 <span class="controlled-setting-indicator"
                       managed="Cellular.SIMLockStatus.LockEnabled"
                       internet-detail-for="sim-card-lock-enabled"></span>
@@ -523,7 +515,7 @@
         </section>
         <section>
           <div id="change-pin-area">
-            <button id="change-pin" i18n-content="changePinButton"></button>
+            <button id="change-pin">$i18n{changePinButton}</button>
             <span class="controlled-setting-indicator"
                   managed="Cellular.SIMLockStatus.LockType"
                   internet-detail-for="change-pin"></span>
@@ -540,14 +532,14 @@
           <label>
             <input id="direct-proxy" type="radio" name="proxytype" value="1"
                 pref="cros.session.proxy.type">
-            <span i18n-content="proxyDirectInternetConnection"></span>
+            <span>$i18n{proxyDirectInternetConnection}</span>
           </label>
         </div>
         <div class="radio">
           <label>
             <input id="auto-proxy" type="radio" name="proxytype" value="3"
                 pref="cros.session.proxy.type">
-            <span i18n-content="proxyAutomatic"></span>
+            <span>$i18n{proxyAutomatic}</span>
           </label>
         </div>
         <div class="proxy-subsection" id="auto-proxy-parms">
@@ -555,7 +547,7 @@
             <label>
               <input id="proxy-use-pac-url" type="checkbox"
                   pref="cros.session.proxy.usepacurl">
-              <span i18n-content="proxyUseConfigUrl"></span>
+              <span>$i18n{proxyUseConfigUrl}</span>
             </label>
           </div>
           <div>
@@ -569,7 +561,7 @@
           <label>
             <input id="manual-proxy" type="radio" name="proxytype" value="2"
                 pref="cros.session.proxy.type">
-            <span i18n-content="proxyManual"></span>
+            <span>$i18n{proxyManual}</span>
           </label>
         </div>
         <div class="proxy-subsection" id="manual-proxy-parms">
@@ -577,19 +569,19 @@
             <label>
               <input id="proxy-all-protocols" type="checkbox"
                   pref="cros.session.proxy.single">
-              <span i18n-content="sameProxyProtocols"></span>
+              <span>$i18n{sameProxyProtocols}</span>
             </label>
           </div>
           <div id="single-proxy">
             <table>
               <tr>
                 <td>
-                  <span i18n-content="httpProxy"></span>
+                  <span>$i18n{httpProxy}</span>
                   <input id="proxy-host-single-name" type="text" size="25"
                       pref="cros.session.proxy.singlehttp" disabled>
                 </td>
                 <td>
-                  <span i18n-content="proxyPort"></span>
+                  <span>$i18n{proxyPort}</span>
                   <input id="proxy-host-single-port" size="4"
                       pref="cros.session.proxy.singlehttpport" disabled>
                 </td>
@@ -600,14 +592,14 @@
             <table>
               <tr>
                 <td>
-                  <span i18n-content="httpProxy"></span>
+                  <span>$i18n{httpProxy}</span>
                 </td>
                 <td>
                   <input id="proxy-host-name" type="text" size="25"
                       pref="cros.session.proxy.httpurl" disabled>
                 </td>
                 <td>
-                  <span i18n-content="proxyPort"></span>
+                  <span>$i18n{proxyPort}</span>
                 </td>
                 <td>
                   <input id="proxy-host-port" size="4"
@@ -616,14 +608,14 @@
               </tr>
               <tr>
                 <td>
-                  <span i18n-content="secureHttpProxy"></span>
+                  <span>$i18n{secureHttpProxy}</span>
                 </td>
                 <td>
                   <input id="secure-proxy-host-name" type="text" size="25"
                       pref="cros.session.proxy.httpsurl" disabled>
                 </td>
                 <td>
-                  <span i18n-content="proxyPort"></span>
+                  <span>$i18n{proxyPort}</span>
                 </td>
                 <td>
                   <input id="secure-proxy-port" size="4"
@@ -632,14 +624,14 @@
               </tr>
               <tr>
                 <td>
-                  <span i18n-content="ftpProxy"></span>
+                  <span>$i18n{ftpProxy}</span>
                 </td>
                 <td>
                   <input id="ftp-proxy" type="text" size="25"
                       pref="cros.session.proxy.ftpurl" disabled>
                 </td>
                 <td>
-                  <span i18n-content="proxyPort"></span>
+                  <span>$i18n{proxyPort}</span>
                   </td>
                 <td>
                   <input id="ftp-proxy-port" size="4"
@@ -648,14 +640,14 @@
               </tr>
               <tr>
                 <td>
-                  <span i18n-content="socksHost"></span>
+                  <span>$i18n{socksHost}</span>
                 </td>
                 <td>
                   <input id="socks-host" type="text" size="25"
                       pref="cros.session.proxy.socks" disabled>
                 </td>
                 <td>
-                  <span i18n-content="proxyPort"></span>
+                  <span>$i18n{proxyPort}</span>
                 </td>
                 <td>
                   <input id="socks-port" size="4"
@@ -666,16 +658,16 @@
           </div>
           <div id="advanced-config">
             <div class="option vbox flex">
-              <div i18n-content="proxyBypass"></div>
+              <div>$i18n{proxyBypass}</div>
               <list id="ignored-host-list"></list>
               <input id="new-host" type="url" size="30">
-              <button id="add-host" i18n-content="addHost"></button>
-              <button id="remove-host" i18n-content="removeHost"></button>
+              <button id="add-host">$i18n{addHost}</button>
+              <button id="remove-host">$i18n{removeHost}</button>
             </div>
           </div>
         </div>
         <div class="proxy-subsection" id="web-proxy-auto-discovery">
-          <span i18n-content="webProxyAutoDiscoveryUrl"></span>
+          <span>$i18n{webProxyAutoDiscoveryUrl}</span>
           <input id="web-proxy-auto-discovery-url" type="url" disabled>
         </div>
       </section>
@@ -684,18 +676,14 @@
   <div class="action-area">
     <div class="button-strip">
       <!-- TODO(dbeam): Clarify style guide regarding tag wrap. -->
-      <button id="details-internet-dismiss" class="default-button"
-          i18n-content="detailsInternetDismiss">
+      <button id="details-internet-dismiss" class="default-button">
+        $i18n{detailsInternetDismiss}
       </button>
-      <button id="details-internet-login" i18n-content="connectButton">
-      </button>
-      <button id="details-internet-disconnect" i18n-content="disconnectButton">
-      </button>
-      <button id="details-internet-configure" i18n-content="configureButton">
-      </button>
-      <button id="activate-details" i18n-content="activateButton"></button>
-      <button id="view-account-details" i18n-content="viewAccountButton">
-      </button>
+      <button id="details-internet-login">$i18n{connectButton}</button>
+      <button id="details-internet-disconnect">$i18n{disconnectButton}</button>
+      <button id="details-internet-configure">$i18n{configureButton}</button>
+      <button id="activate-details">$i18n{activateButton}</button>
+      <button id="view-account-details">$i18n{viewAccountButton}</button>
     </div>
   </div>
 </div>
diff --git a/chrome/browser/resources/options/chromeos/keyboard_overlay.html b/chrome/browser/resources/options/chromeos/keyboard_overlay.html
index 9e316ebc..b5a33c1 100644
--- a/chrome/browser/resources/options/chromeos/keyboard_overlay.html
+++ b/chrome/browser/resources/options/chromeos/keyboard_overlay.html
@@ -1,11 +1,11 @@
 <div id="keyboard-overlay" class="page" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="keyboardOverlay"></h1>
+  <h1>$i18n{keyboardOverlay}</h1>
   <div class="content-area">
     <table class="option-control-table">
        <tr>
-         <td class="option-name" id="remap-search-key-to-label"
-             i18n-content="remapSearchKeyToContent">
+         <td class="option-name" id="remap-search-key-to-label">
+           $i18n{remapSearchKeyToContent}
          </td>
          <td class="option-value">
            <select class="control"
@@ -17,8 +17,8 @@
          </td>
        </tr>
        <tr>
-         <td class="option-name" id="remap-control-key-to-label"
-             i18n-content="remapControlKeyToContent">
+         <td class="option-name" id="remap-control-key-to-label">
+           $i18n{remapControlKeyToContent}
          </td>
          <td class="option-value">
            <select class="control"
@@ -30,8 +30,8 @@
          </td>
        </tr>
        <tr>
-         <td class="option-name" id="remap-alt-key-to-label"
-             i18n-content="remapAltKeyToContent">
+         <td class="option-name" id="remap-alt-key-to-label">
+           $i18n{remapAltKeyToContent}
          </td>
          <td class="option-value">
            <select class="control" data-type="number"
@@ -44,8 +44,8 @@
        <!-- The caps lock section is hidden by default. This is only visible
             when --has-chromeos-keyboard flag is not passed. -->
        <tr id="caps-lock-remapping-section" hidden>
-         <td class="option-name" id="remap-caps-lock-key-to-label"
-               i18n-content="remapCapsLockKeyToContent">
+         <td class="option-name" id="remap-caps-lock-key-to-label">
+           $i18n{remapCapsLockKeyToContent}
          </td>
          <td class="option-value">
            <select class="control"
@@ -60,8 +60,8 @@
        <!-- The diamond key section is hidden by default. This is only visible
             when --has-chromeos-diamond-key flag is passed. -->
        <tr id="diamond-key-remapping-section" hidden>
-         <td class="option-name" id="remap-diamond-key-to-label"
-             i18n-content="remapDiamondKeyToContent">
+         <td class="option-name" id="remap-diamond-key-to-label">
+           $i18n{remapDiamondKeyToContent}
          </td>
          <td class="option-value">
            <select class="control"
@@ -74,8 +74,8 @@
          </td>
        </tr>
        <tr>
-         <td class="option-name" id="remap-backspace-key-to-label"
-             i18n-content="remapBackspaceKeyToContent">
+         <td class="option-name" id="remap-backspace-key-to-label">
+           $i18n{remapBackspaceKeyToContent}
          </td>
          <td class="option-value">
            <select class="control" data-type="number"
@@ -87,8 +87,8 @@
          </td>
        </tr>
        <tr>
-         <td class="option-name" id="remap-escape-key-to-label"
-             i18n-content="remapEscapeKeyToContent">
+         <td class="option-name" id="remap-escape-key-to-label">
+           $i18n{remapEscapeKeyToContent}
          </td>
          <td class="option-value">
            <select class="control" data-type="number"
@@ -106,14 +106,15 @@
               pref="settings.language.send_function_keys"
               aria-describedby="send-function-keys-description" dialog-pref>
           <span>
-            <span i18n-content="sendFunctionKeys"></span>
+            <span>$i18n{sendFunctionKeys}</span>
             <span class="bubble-button controlled-setting-indicator"
                 pref="settings.language.send_function_keys"></span>
           </span>
         </label>
       </div>
-      <span id="send-function-keys-description"
-          i18n-content="sendFunctionKeysDescription"></span>
+      <span id="send-function-keys-description">
+        $i18n{sendFunctionKeysDescription}
+      </span>
     </div>
     <div class="settings-row">
       <div class="checkbox">
@@ -121,39 +122,41 @@
           <input id="enable-auto-repeat" type="checkbox"
               pref="settings.language.xkb_auto_repeat_enabled_r2"
               metric="Options_KeyboardAutoRepeat" dialog-pref>
-          <span i18n-content="enableAutoRepeat"></span>
+          <span>$i18n{enableAutoRepeat}</span>
         </label>
       </div>
       <div id="auto-repeat-settings-section">
         <div class="row">
-          <span class="option-name" i18n-content="autoRepeatDelay"></span>
-            <span i18n-content="autoRepeatDelayLong"></span>
+          <span class="option-name">$i18n{autoRepeatDelay}</span>
+            <span>$i18n{autoRepeatDelayLong}</span>
             <input id="auto-repeat-delay-range" type="range"
                 class="touch-slider" metric="Options_KeyboardAutoRepeat_Delay"
                 pref="settings.language.xkb_auto_repeat_delay_r2" dialog-pref>
-            <span i18n-content="autoRepeatDelayShort"></span>
+            <span>$i18n{autoRepeatDelayShort}</span>
           </div>
           <div class="row">
-            <span class="option-name" i18n-content="autoRepeatRate"></span>
-            <span i18n-content="autoRepeatRateSlow"></span>
+            <span class="option-name">$i18n{autoRepeatRate}</span>
+            <span>$i18n{autoRepeatRateSlow}</span>
             <input id="auto-repeat-interval-range" type="range"
                 class="touch-slider"
                 pref="settings.language.xkb_auto_repeat_interval_r2"
                 metric="Options_KeyboardAutoRepeat_Interval" dialog-pref>
-            <span i18n-content="autoRepeatRateFast"></span>
+            <span>$i18n{autoRepeatRateFast}</span>
           </div>
       </div>
     </div>
-    <a is="action-link" id="keyboard-shortcuts" class="settings-row"
-        i18n-content="showKeyboardShortcuts"></a>
-    <a is="action-link" id="languages-and-input-settings" class="settings-row"
-        i18n-content="changeLanguageAndInputSettings"></a>
+    <a is="action-link" id="keyboard-shortcuts" class="settings-row">
+      $i18n{showKeyboardShortcuts}
+    </a>
+    <a is="action-link" id="languages-and-input-settings" class="settings-row">
+      $i18n{changeLanguageAndInputSettings}
+    </a>
   </div>
   <div class="action-area">
     <div class="button-strip">
-      <button id="keyboard-cancel" type="reset" i18n-content="cancel"></button>
-      <button id="keyboard-confirm" class="default-button" type="submit"
-          i18n-content="ok">
+      <button id="keyboard-cancel" type="reset">$i18n{cancel}</button>
+      <button id="keyboard-confirm" class="default-button" type="submit">
+        $i18n{ok}
       </button>
     </div>
   </div>
diff --git a/chrome/browser/resources/options/chromeos/pointer_overlay.html b/chrome/browser/resources/options/chromeos/pointer_overlay.html
index 562522e..1462249 100644
--- a/chrome/browser/resources/options/chromeos/pointer_overlay.html
+++ b/chrome/browser/resources/options/chromeos/pointer_overlay.html
@@ -2,12 +2,12 @@
   <div class="close-button"></div>
   <div class="content-area">
     <section id="pointer-section-touchpad" hidden>
-      <h3 i18n-content="pointerOverlaySectionTitleTouchpad"></h3>
+      <h3>$i18n{pointerOverlaySectionTitleTouchpad}</h3>
       <div class="checkbox">
         <label>
           <input type="checkbox" metric="Options_TouchpadTapToClick"
               pref="settings.touchpad.enable_tap_to_click" dialog-pref>
-          <span i18n-content="enableTapToClick"></span>
+          <span>$i18n{enableTapToClick}</span>
         </label>
       </div>
       <div class="radio" id="touchpad-scroll-direction">
@@ -15,7 +15,7 @@
           <input type="radio" name="touchpad-scroll-direction" value="false"
               metric="Options_TouchpadNaturalScroll"
               pref="settings.touchpad.natural_scroll" dialog-pref>
-          <span i18n-content="traditionalScroll"></span>
+          <span>$i18n{traditionalScroll}</span>
         </label>
       </div>
       <div class="radio">
@@ -23,27 +23,26 @@
           <input type="radio" name="touchpad-scroll-direction" value="true" 
               metric="Options_TouchpadNaturalScroll"
               pref="settings.touchpad.natural_scroll" dialog-pref>
-          <span i18n-values=".innerHTML:naturalScroll"></span>
+          <span>$i18nRaw{naturalScroll}</span>
         </label>
       </div>
     </section>
     <section id="pointer-section-mouse" hidden>
-      <h3 i18n-content="pointerOverlaySectionTitleMouse"></h3>
+      <h3>$i18n{pointerOverlaySectionTitleMouse}</h3>
       <div class="checkbox">
         <label>
           <input type="checkbox" metric="Options_MousePrimaryRight"
               pref="settings.mouse.primary_right" dialog-pref>
-          <span i18n-content="primaryMouseRight"></span>
+          <span>$i18n{primaryMouseRight}</span>
         </label>
       </div>
     </section>
   </div>
   <div class="action-area">
     <div class="button-strip">
-      <button id="pointer-overlay-cancel" type="reset" i18n-content="cancel">
-      </button>
-      <button id="pointer-overlay-confirm" class="default-button" type="submit"
-          i18n-content="ok">
+      <button id="pointer-overlay-cancel" type="reset">$i18n{cancel}</button>
+      <button id="pointer-overlay-confirm" class="default-button" type="submit">
+        $i18n{ok}
       </button>
     </div>
   </div>
diff --git a/chrome/browser/resources/options/chromeos/power_overlay.html b/chrome/browser/resources/options/chromeos/power_overlay.html
index d6c628a..f4b637c 100644
--- a/chrome/browser/resources/options/chromeos/power_overlay.html
+++ b/chrome/browser/resources/options/chromeos/power_overlay.html
@@ -1,18 +1,16 @@
 <div id="power-overlay" class="page" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="powerOverlay"></h1>
+  <h1>$i18n{powerOverlay}</h1>
   <div class="content-area">
     <table>
       <tr>
-        <td class="option-name" i18n-content="batteryStatusLabel">
-        </td>
+        <td class="option-name">$i18n{batteryStatusLabel}</td>
         <td id="battery-status-value" class="option-value">
         </td>
       </tr>
       <tr id="power-sources" hidden>
         <td class="option-name">
-          <label id="power-source-label" i18n-content="powerSourceLabel">
-          </label>
+          <label id="power-source-label">$i18n{powerSourceLabel}</label>
         </td>
         <td class="option-value">
           <select id="power-source-dropdown"
@@ -20,8 +18,7 @@
         </td>
       </tr>
       <tr id="power-source-charger" hidden>
-        <td class="option-name" i18n-content="powerSourceLabel">
-        </td>
+        <td class="option-name">$i18n{powerSourceLabel}</td>
         <td id="power-source-charger-type" class="option-value">
         </td>
       </tr>
@@ -29,8 +26,8 @@
   </div>
   <div class="action-area">
     <div class="button-strip">
-      <button id="power-confirm" class="default-button" type="submit"
-          i18n-content="done">
+      <button id="power-confirm" class="default-button" type="submit">
+        $i18n{done}
       </button>
     </div>
   </div>
diff --git a/chrome/browser/resources/options/chromeos/preferred_networks.html b/chrome/browser/resources/options/chromeos/preferred_networks.html
index 47b0d120..75b373e 100644
--- a/chrome/browser/resources/options/chromeos/preferred_networks.html
+++ b/chrome/browser/resources/options/chromeos/preferred_networks.html
@@ -1,7 +1,6 @@
 <div id="preferredNetworksPage" class="page" hidden>
   <div class="close-button"></div>
-  <h1 id="preferred-networks-page-title" 
-      i18n-content="preferredNetworksPage"></h1>
+  <h1 id="preferred-networks-page-title" >$i18n{preferredNetworksPage}</h1>
   <div class="content-area">
     <div class="settings-list">
       <list id="remembered-network-list"></list>
@@ -9,8 +8,8 @@
   </div>
   <div class="action-area">
     <div class="button-strip">
-      <button id="preferred-networks-confirm" class="default-button"
-          i18n-content="done">
+      <button id="preferred-networks-confirm" class="default-button">
+        $i18n{done}
       </button>
     </div>
   </div>
diff --git a/chrome/browser/resources/options/chromeos/quick_unlock_configure_overlay.html b/chrome/browser/resources/options/chromeos/quick_unlock_configure_overlay.html
index 07904cc..f0c54b1 100644
--- a/chrome/browser/resources/options/chromeos/quick_unlock_configure_overlay.html
+++ b/chrome/browser/resources/options/chromeos/quick_unlock_configure_overlay.html
@@ -1,6 +1,6 @@
 <div id="quick-unlock-configure-overlay" class="page" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="lockScreenTitle"></h1>
+  <h1>$i18n{lockScreenTitle}</h1>
   <settings-lock-screen prefs="{{prefs}}" tabindex=0>
   </settings-lock-screen>
 
diff --git a/chrome/browser/resources/options/chromeos/storage_clear_drive_cache_overlay.html b/chrome/browser/resources/options/chromeos/storage_clear_drive_cache_overlay.html
index adc2fa5..3ef1c80 100644
--- a/chrome/browser/resources/options/chromeos/storage_clear_drive_cache_overlay.html
+++ b/chrome/browser/resources/options/chromeos/storage_clear_drive_cache_overlay.html
@@ -1,14 +1,13 @@
 <div id="clear-drive-cache-overlay-page" class="page" role="dialog" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="storageClearDriveCacheDialogTitle"></h1>
+  <h1>$i18n{storageClearDriveCacheDialogTitle}</h1>
   <div class="content-area">
-    <div i18n-content="storageClearDriveCacheDescription"></div>
+    <div>$i18n{storageClearDriveCacheDescription}</div>
   </div>
   <div class="action-area button-strip">
-    <button id="clear-drive-cache-overlay-cancel-button" i18n-content="cancel">
-    </button>
-    <button id="clear-drive-cache-overlay-delete-button" class="default-button"
-        i18n-content="storageDeleteAllButtonTitle">
+    <button id="clear-drive-cache-overlay-cancel-button">$i18n{cancel}</button>
+    <button id="clear-drive-cache-overlay-delete-button" class="default-button">
+      $i18n{storageDeleteAllButtonTitle}
     </button>
   </div>
 </div>
diff --git a/chrome/browser/resources/options/chromeos/storage_manager.html b/chrome/browser/resources/options/chromeos/storage_manager.html
index 8ca8fa5..faca73db 100644
--- a/chrome/browser/resources/options/chromeos/storage_manager.html
+++ b/chrome/browser/resources/options/chromeos/storage_manager.html
@@ -1,31 +1,32 @@
 <div id="storageManagerPage" class="page" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="storageManagerPage"></h1>
+  <h1>$i18n{storageManagerPage}</h1>
 
   <div id="storage-manager-message-low-space"
        class="storage-manager-message-area">
     <div class="storage-manager-message-title">
       <img src="space_low.svg"></img>
-      <span i18n-content="storageLowMessageTitle"></span>
+      <span>$i18n{storageLowMessageTitle}</span>
     </div>
-    <p i18n-content="storageLowMessageLine1"></p>
-    <p i18n-content="storageLowMessageLine2"></p>
+    <p>$i18n{storageLowMessageLine1}</p>
+    <p>$i18n{storageLowMessageLine2}</p>
   </div>
   <div id="storage-manager-message-critically-low-space"
        class="storage-manager-message-area">
     <div class="storage-manager-message-title">
       <img src="space_critically_low.svg"></img>
-      <span i18n-content="storageCriticallyLowMessageTitle"></span>
+      <span>$i18n{storageCriticallyLowMessageTitle}</span>
     </div>
-    <p i18n-content="storageCriticallyLowMessageLine1"></p>
-    <p i18n-content="storageCriticallyLowMessageLine2"></p>
+    <p>$i18n{storageCriticallyLowMessageLine1}</p>
+    <p>$i18n{storageCriticallyLowMessageLine2}</p>
   </div>
 
   <div class="content-area">
     <div id="storage-manager-section-capacity" class="storage-manager-section">
       <div class="storage-manager-item">
-        <span i18n-content="storageItemLabelCapacity"
-              class="storage-manager-item-label"></span>
+        <span class="storage-manager-item-label">
+          $i18n{storageItemLabelCapacity}
+        </span>
         <span id="storage-manager-size-capacity"
               class="storage-manager-item-size"></span>
       </div>
@@ -33,58 +34,64 @@
     </div>
     <div id="storage-manager-section-in-use" class="storage-manager-section">
       <div class="storage-manager-item">
-        <span i18n-content="storageItemLabelInUse"
-              class="storage-manager-item-label"></span>
+        <span class="storage-manager-item-label">
+          $i18n{storageItemLabelInUse}
+        </span>
         <span id="storage-manager-size-in-use"
               class="storage-manager-item-size"></span>
       </div>
       <div class="storage-manager-subitem">
-        <a is="action-link"
-           id="storage-manager-label-downloads"
-           i18n-content="storageSubitemLabelDownloads"></a>
+        <a is="action-link" id="storage-manager-label-downloads">
+          $i18n{storageSubitemLabelDownloads}
+        </a>
         <span id="storage-manager-size-downloads"
-              class="storage-manager-item-size"
-              i18n-content="storageSizeCalculating"></span>
+            class="storage-manager-item-size">
+          $i18n{storageSizeCalculating}
+        </span>
       </div>
       <div id="storage-manager-item-drive-cache"
            class="storage-manager-subitem" hidden>
-        <a is="action-link"
-           id="storage-manager-label-drive-cache"
-           i18n-content="storageSubitemLabelDriveCache"></a>
+        <a is="action-link" id="storage-manager-label-drive-cache">
+          $i18n{storageSubitemLabelDriveCache}
+        </a>
         <span id="storage-manager-size-drive-cache"
-              class="storage-manager-item-size"
-              i18n-content="storageSizeCalculating"></span>
+            class="storage-manager-item-size">
+          $i18n{storageSizeCalculating}
+        </span>
       </div>
       <div class="storage-manager-subitem">
-        <a is="action-link"
-           id="storage-manager-label-browsing-data"
-           i18n-content="storageSubitemLabelBrowsingData"></a>
+        <a is="action-link" id="storage-manager-label-browsing-data">
+          $i18n{storageSubitemLabelBrowsingData}
+        </a>
         <span id="storage-manager-size-browsing-data"
-              class="storage-manager-item-size"
-              i18n-content="storageSizeCalculating"></span>
+            class="storage-manager-item-size">
+          $i18n{storageSizeCalculating}
+        </span>
       </div>
       <div id="storage-manager-item-arc"
            class="storage-manager-subitem" hidden>
-        <a is="action-link"
-           id="storage-manager-label-arc"
-           i18n-content="storageSubitemLabelArc"></a>
-        <span id="storage-manager-size-arc"
-              class="storage-manager-item-size"
-              i18n-content="storageSizeCalculating"></span>
+        <a is="action-link" id="storage-manager-label-arc">
+          $i18n{storageSubitemLabelArc}
+        </a>
+        <span id="storage-manager-size-arc" class="storage-manager-item-size">
+          $i18n{storageSizeCalculating}
+        </span>
       </div>
       <div class="storage-manager-subitem">
-        <a is="action-link"
-           id="storage-manager-label-other-users"
-           i18n-content="storageSubitemLabelOtherUsers"></a>
+        <a is="action-link" id="storage-manager-label-other-users">
+          $i18n{storageSubitemLabelOtherUsers}
+        </a>
         <span id="storage-manager-size-other-users"
-              class="storage-manager-item-size"
-              i18n-content="storageSizeCalculating"></span>
+            class="storage-manager-item-size">
+          $i18n{storageSizeCalculating}
+        </span>
       </div>
     </div>
     <div id="storage-manager-section-available" class="storage-manager-section">
       <div class="storage-manager-item">
-        <span i18n-content="storageItemLabelAvailable"
-              class="storage-manager-item-label"></span>
+        <span class="storage-manager-item-label">
+          $i18n{storageItemLabelAvailable}
+        </span>
         <span id="storage-manager-size-available"
               class="storage-manager-item-size"></span>
       </div>
@@ -93,9 +100,7 @@
 
   <div class="action-area">
     <div class="button-strip">
-      <button id="storage-confirm" class="default-button"
-          i18n-content="done">
-      </button>
+      <button id="storage-confirm" class="default-button">$i18n{done}</button>
     </div>
   </div>
 </div>
diff --git a/chrome/browser/resources/options/chromeos/stylus_overlay.html b/chrome/browser/resources/options/chromeos/stylus_overlay.html
index bc955bbe..af93cc6 100644
--- a/chrome/browser/resources/options/chromeos/stylus_overlay.html
+++ b/chrome/browser/resources/options/chromeos/stylus_overlay.html
@@ -1,6 +1,6 @@
 <div id="stylus-overlay" class="page" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="stylusOverlay"></h1>
+  <h1>$i18n{stylusOverlay}</h1>
   <div class="content-area">
     <div class="option-control-table">
       <div class="option-name">
@@ -8,7 +8,7 @@
           <label>
             <input pref="settings.enable_stylus_tools" type="checkbox"
                 dialog-pref>
-            <span i18n-content="stylusEnableStylusTools"></span>
+            <span>$i18n{stylusEnableStylusTools}</span>
           </label>
         </div>
         <div class="checkbox controlled-setting-with-label">
@@ -16,15 +16,14 @@
             <input id="launch-palette-on-eject-input"
                    pref="settings.launch_palette_on_eject_event"
                    type="checkbox" dialog-pref>
-            <span i18n-content="stylusAutoOpenStylusTools"></span>
+            <span>$i18n{stylusAutoOpenStylusTools}</span>
           </label>
         </div>
       </div>
       <div class="settings-row">
         <div class="controlled-setting-with-label">
           <label>
-            <span class="option-name"
-                i18n-content="stylusNoteTakingApp"></span>
+            <span class="option-name">$i18n{stylusNoteTakingApp}</span>
             <select id="stylus-note-taking-app-select" class="option-value">
             </select>
           </label>
@@ -32,16 +31,17 @@
       </div>
     </div>
     <div class="settings-row">
-      <a is="action-link" i18n-content="stylusFindMoreApps"
-         id='stylus-find-more-link'></a>
+      <a is="action-link" id='stylus-find-more-link'>
+        $i18n{stylusFindMoreApps}
+      </a>
     </div>
   </div>
 
   <div class="action-area">
     <div class="button-strip">
-      <button id="stylus-cancel" type="reset" i18n-content="cancel"></button>
-      <button id="stylus-confirm" class="default-button" type="submit"
-          i18n-content="ok">
+      <button id="stylus-cancel" type="reset">$i18n{cancel}</button>
+      <button id="stylus-confirm" class="default-button" type="submit">
+        $i18n{ok}
       </button>
     </div>
   </div>
diff --git a/chrome/browser/resources/options/chromeos/third_party_ime_confirm_overlay.html b/chrome/browser/resources/options/chromeos/third_party_ime_confirm_overlay.html
index 6308443..4664e52 100644
--- a/chrome/browser/resources/options/chromeos/third_party_ime_confirm_overlay.html
+++ b/chrome/browser/resources/options/chromeos/third_party_ime_confirm_overlay.html
@@ -1,19 +1,19 @@
 <div id="third-party-ime-confirm-overlay" class="page" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="thirdPartyImeConfirmOverlay"></h1>
+  <h1>$i18n{thirdPartyImeConfirmOverlay}</h1>
   <div class="content-area">
-    <span id="third-party-ime-confirm-text"
-        i18n-content="thirdPartyImeConfirmMessage">
+    <span id="third-party-ime-confirm-text">
+      $i18n{thirdPartyImeConfirmMessage}
     </span>
   </div>
   <div class="action-area">
     <div class="action-area-right">
       <div class="button-strip">
-        <button id="third-party-ime-confirm-cancel"
-            i18n-content="thirdPartyImeConfirmDisable">
+        <button id="third-party-ime-confirm-cancel">
+          $i18n{thirdPartyImeConfirmDisable}
         </button>
-        <button id="third-party-ime-confirm-ok" class="default-button"
-            i18n-content="thirdPartyImeConfirmEnable">
+        <button id="third-party-ime-confirm-ok" class="default-button">
+          $i18n{thirdPartyImeConfirmEnable}
         </button>
       </div>
     </div>
diff --git a/chrome/browser/resources/options/clear_browser_data_history_notice_overlay.html b/chrome/browser/resources/options/clear_browser_data_history_notice_overlay.html
index 5de4a32..f77e4b5 100644
--- a/chrome/browser/resources/options/clear_browser_data_history_notice_overlay.html
+++ b/chrome/browser/resources/options/clear_browser_data_history_notice_overlay.html
@@ -1,12 +1,12 @@
 <div id="clear-browser-data-history-notice" class="page" hidden>
-  <h1 i18n-content="clearBrowserDataHistoryNoticeTitle"></h1>
+  <h1>$i18n{clearBrowserDataHistoryNoticeTitle}</h1>
   <div class="content-area">
-    <p i18n-values=".innerHTML:clearBrowserDataHistoryNotice"></p>
+    <p>$i18nRaw{clearBrowserDataHistoryNotice}</p>
   </div>
   <div class="action-area">
     <div class="button-strip">
-      <button id="clear-browser-data-history-notice-ok" class="default-button"
-          i18n-content="clearBrowserDataHistoryNoticeOk">
+      <button id="clear-browser-data-history-notice-ok" class="default-button">
+        $i18n{clearBrowserDataHistoryNoticeOk}
       </button>
     </div>
   </div>
diff --git a/chrome/browser/resources/options/clear_browser_data_overlay.html b/chrome/browser/resources/options/clear_browser_data_overlay.html
index a36ef906..ec5faef 100644
--- a/chrome/browser/resources/options/clear_browser_data_overlay.html
+++ b/chrome/browser/resources/options/clear_browser_data_overlay.html
@@ -1,11 +1,11 @@
 <div id="clear-browser-data-overlay" class="page not-resizable" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="clearBrowserDataOverlay"></h1>
+  <h1>$i18n{clearBrowserDataOverlay}</h1>
   <!-- NOTE: Make sure there's not whitespace between <div></div> for
        #clear-browser-data-info-banner as it's styled with :empty. -->
   <div id="clear-browser-data-info-banner"></div>
   <div id="cbd-content-area" class="content-area">
-    <span i18n-content="clearBrowserDataLabel"></span>
+    <span>$i18n{clearBrowserDataLabel}</span>
     <select id="clear-browser-data-time-period"
         i18n-options="clearBrowserDataTimeList"
         pref="browser.clear_data.time_period"
@@ -18,7 +18,7 @@
               pref="browser.clear_data.browsing_history" type="checkbox"
               aria-controls="delete-browsing-history-counter">
           <span>
-            <span i18n-content="deleteBrowsingHistoryCheckbox"></span>
+            <span>$i18n{deleteBrowsingHistoryCheckbox}</span>
             <span class="controlled-setting-indicator"
                 pref="history.deleting_enabled">
             </span>
@@ -31,7 +31,7 @@
         <label>
           <input id="delete-download-history-checkbox"
               pref="browser.clear_data.download_history" type="checkbox">
-          <span i18n-content="deleteDownloadHistoryCheckbox"></span>
+          <span>$i18n{deleteDownloadHistoryCheckbox}</span>
           <span class="controlled-setting-indicator"
               pref="history.deleting_enabled">
           </span>
@@ -41,10 +41,12 @@
         <label>
           <input id="delete-cookies-checkbox"
               pref="browser.clear_data.cookies" type="checkbox">
-          <span i18n-content="deleteCookiesFlashCheckbox"
-              class="clear-plugin-lso-data-enabled"></span>
-          <span i18n-content="deleteCookiesCheckbox"
-              class="clear-plugin-lso-data-disabled"></span>
+          <span class="clear-plugin-lso-data-enabled">
+            $i18n{deleteCookiesFlashCheckbox}
+          </span>
+          <span class="clear-plugin-lso-data-disabled">
+            $i18n{deleteCookiesCheckbox}
+          </span>
         </label>
       </div>
       <div id="delete-cache-container" class="checkbox">
@@ -53,7 +55,7 @@
               pref="browser.clear_data.cache" type="checkbox"
               aria-controls="delete-cache-counter">
           <span>
-            <span i18n-content="deleteCacheCheckbox"></span>
+            <span>$i18n{deleteCacheCheckbox}</span>
             <span class="clear-browser-data-counter" role="note"
                 aria-live="polite" id="delete-cache-counter"></span>
           </span>
@@ -65,7 +67,7 @@
               pref="browser.clear_data.passwords" type="checkbox"
               aria-controls="delete-passwords-counter">
           <span>
-            <span i18n-content="deletePasswordsCheckbox"></span>
+            <span>$i18n{deletePasswordsCheckbox}</span>
             <span class="clear-browser-data-counter" role="note"
                 aria-live="polite" id="delete-passwords-counter"></span>
           </span>
@@ -77,7 +79,7 @@
               pref="browser.clear_data.form_data" type="checkbox"
               aria-controls="delete-form-data-counter">
           <span>
-            <span i18n-content="deleteFormDataCheckbox"></span>
+            <span>$i18n{deleteFormDataCheckbox}</span>
             <span class="clear-browser-data-counter" role="note"
                 aria-live="polite" id="delete-form-data-counter"></span>
           </span>
@@ -87,7 +89,7 @@
         <label>
           <input id="delete-hosted-apps-data-checkbox"
               pref="browser.clear_data.hosted_apps_data" type="checkbox">
-          <span i18n-content="deleteHostedAppsDataCheckbox"></span>
+          <span>$i18n{deleteHostedAppsDataCheckbox}</span>
         </label>
       </div>
       <div id="delete-media-licenses-container" class="checkbox">
@@ -96,7 +98,7 @@
               pref="browser.clear_data.media_licenses" type="checkbox"
               aria-controls="delete-media-licenses-counter">
           <span>
-            <span i18n-content="deleteMediaLicensesCheckbox"></span>
+            <span>$i18n{deleteMediaLicensesCheckbox}</span>
             <span class="clear-browser-data-counter" role="note"
                 aria-live="polite" id="delete-media-licenses-counter"></span>
           </span>
@@ -104,34 +106,33 @@
       </div>
     </div>
     <div id="flash-storage-settings" class="flash-plugin-area">
-      <a target="_blank" i18n-content="flashStorageSettings"
-          i18n-values="href:flashStorageUrl"></a>
+      <a target="_blank"
+          href="$i18nRaw{flashStorageUrl}">$i18n{flashStorageSettings}</a>
     </div>
   </div>
   <div class="action-area">
     <div class="hbox stretch">
-      <a id="clear-browser-data-old-learn-more-link" hidden
-          target="_blank" i18n-content="learnMore"
-          i18n-values="href:clearBrowsingDataLearnMoreUrl"></a>
+      <a id="clear-browser-data-old-learn-more-link" hidden target="_blank"
+          href="$i18nRaw{clearBrowsingDataLearnMoreUrl}">$i18n{learnMore}</a>
     </div>
     <div class="action-area-right">
       <div id="cbd-throbber" class="throbber"></div>
       <div class="button-strip">
-        <button id="clear-browser-data-dismiss" i18n-content="cancel"></button>
-        <button id="clear-browser-data-commit" class="default-button"
-            i18n-content="clearBrowserDataCommit">
+        <button id="clear-browser-data-dismiss">$i18n{cancel}</button>
+        <button id="clear-browser-data-commit" class="default-button">
+          $i18n{clearBrowserDataCommit}
         </button>
       </div>
     </div>
   </div>
   <div id="some-stuff-remains-footer" class="gray-bottom-bar">
-    <p id="clear-browser-data-history-footer"
-        i18n-values=".innerHTML:clearBrowserDataHistoryFooter" hidden></p>
+    <p id="clear-browser-data-history-footer" hidden>
+      $i18nRaw{clearBrowserDataHistoryFooter}
+    </p>
     <p id="clear-browser-data-general-footer">
       <span><!--This is filled by JavaScript--></span>
-      <a id="clear-browser-data-footer-learn-more-link" hidden
-          target="_blank" i18n-content="learnMore"
-          i18n-values="href:clearBrowsingDataLearnMoreUrl"></a>
+      <a id="clear-browser-data-footer-learn-more-link" hidden target="_blank"
+          href="$i18nRaw{clearBrowsingDataLearnMoreUrl}">$i18n{learnMore}</a>
     </p>
   </div>
 </div>
diff --git a/chrome/browser/resources/options/content_settings.html b/chrome/browser/resources/options/content_settings.html
index c66fc23e..db50994 100644
--- a/chrome/browser/resources/options/content_settings.html
+++ b/chrome/browser/resources/options/content_settings.html
@@ -1,16 +1,16 @@
 <div id="content-settings-page" class="page" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="contentSettingsPage"></h1>
+  <h1>$i18n{contentSettingsPage}</h1>
   <div class="content-area">
     <!-- Cookie filter tab contents -->
     <section>
-      <h3 i18n-content="cookiesTabLabel"></h3>
+      <h3>$i18n{cookiesTabLabel}</h3>
       <div>
         <div class="radio controlled-setting-with-label">
           <label>
             <input type="radio" name="cookies" value="allow">
             <span>
-              <span i18n-content="cookiesAllow"></span>
+              <span>$i18n{cookiesAllow}</span>
               <span class="controlled-setting-indicator"
                   content-setting="cookies" value="allow"></span>
             </span>
@@ -20,7 +20,7 @@
           <label>
             <input type="radio" name="cookies" value="session_only">
             <span>
-              <span i18n-content="cookiesSessionOnly"></span>
+              <span>$i18n{cookiesSessionOnly}</span>
               <span class="controlled-setting-indicator"
                   content-setting="cookies" value="session_only"></span>
             </span>
@@ -30,7 +30,7 @@
           <label>
             <input type="radio" name="cookies" value="block">
             <span>
-              <span i18n-content="cookiesBlock"></span>
+              <span>$i18n{cookiesBlock}</span>
               <span class="controlled-setting-indicator"
                   content-setting="cookies" value="block"></span>
             </span>
@@ -40,28 +40,28 @@
           <label>
             <input pref="profile.block_third_party_cookies" type="checkbox">
             <span>
-              <span i18n-content="cookiesBlock3rdParty"></span>
+              <span>$i18n{cookiesBlock3rdParty}</span>
               <span class="controlled-setting-indicator"
                   pref="profile.block_third_party_cookies"></span>
           </label>
         </div>
         <div class="settings-row">
-          <button class="exceptions-list-button" contentType="cookies"
-              i18n-content="manageExceptions"></button>
-          <button id="show-cookies-button"
-              i18n-content="cookiesShowCookies"></button>
+          <button class="exceptions-list-button" contentType="cookies">
+            $i18n{manageExceptions}
+          </button>
+          <button id="show-cookies-button">$i18n{cookiesShowCookies}</button>
         </div>
      </div>
     </section>
     <!-- Image filter -->
     <section>
-      <h3 i18n-content="imagesTabLabel"></h3>
+      <h3>$i18n{imagesTabLabel}</h3>
       <div>
         <div class="radio controlled-setting-with-label">
           <label>
             <input type="radio" name="images" value="allow">
             <span>
-              <span i18n-content="imagesAllow"></span>
+              <span>$i18n{imagesAllow}</span>
               <span class="controlled-setting-indicator"
                   content-setting="images" value="allow"></span>
             </span>
@@ -71,27 +71,28 @@
           <label>
             <input type="radio" name="images" value="block">
             <span>
-              <span i18n-content="imagesBlock"></span>
+              <span>$i18n{imagesBlock}</span>
               <span class="controlled-setting-indicator"
                   content-setting="images" value="block"></span>
             </span>
           </label>
         </div>
         <div class="settings-row">
-          <button class="exceptions-list-button" contentType="images"
-              i18n-content="manageExceptions"></button>
+          <button class="exceptions-list-button" contentType="images">
+            $i18n{manageExceptions}
+          </button>
         </div>
       </div>
     </section>
     <!-- JavaScript filter -->
     <section>
-      <h3 i18n-content="javascriptTabLabel"></h3>
+      <h3>$i18n{javascriptTabLabel}</h3>
       <div>
         <div class="radio controlled-setting-with-label">
           <label>
             <input type="radio" name="javascript" value="allow">
             <span>
-              <span i18n-content="javascriptAllow"></span>
+              <span>$i18n{javascriptAllow}</span>
               <span class="controlled-setting-indicator"
                   content-setting="javascript" value="allow"></span>
             </span>
@@ -101,52 +102,54 @@
           <label>
             <input type="radio" name="javascript" value="block">
             <span>
-              <span i18n-content="javascriptBlock"></span>
+              <span>$i18n{javascriptBlock}</span>
               <span class="controlled-setting-indicator"
                   content-setting="javascript" value="block"></span>
             </span>
           </label>
         </div>
         <div class="settings-row">
-          <button class="exceptions-list-button" contentType="javascript"
-              i18n-content="manageExceptions"></button>
+          <button class="exceptions-list-button" contentType="javascript">
+            $i18n{manageExceptions}
+          </button>
         </div>
       </div>
     </section>
     <!-- Handlers settings -->
     <section id="handlers-section">
-      <h3 i18n-content="handlersTabLabel"></h3>
+      <h3>$i18n{handlersTabLabel}</h3>
       <div>
         <div class="radio">
           <label>
             <input type="radio" name="handlers" value="allow"
                 class="handler-radio">
-            <span i18n-content="handlersAllow"></span>
+            <span>$i18n{handlersAllow}</span>
           </label>
         </div>
         <div class="radio">
           <label>
             <input type="radio" name="handlers" value="block"
                 class="handler-radio">
-            <span i18n-content="handlersBlock"></span>
+            <span>$i18n{handlersBlock}</span>
           </label>
         </div>
         <div class="settings-row">
-          <button id="manage-handlers-button" contentType="handlers"
-              i18n-content="manageHandlers"></button>
+          <button id="manage-handlers-button" contentType="handlers">
+            $i18n{manageHandlers}
+          </button>
         </div>
       </div>
     </section>
     <!-- Plugins filter -->
     <section>
-      <h3 i18n-content="pluginsTabLabel"></h3>
+      <h3>$i18n{pluginsTabLabel}</h3>
       <div>
         <div class="radio controlled-setting-with-label">
           <label>
             <input id="plugins-allow-radio" type="radio" name="plugins"
                    value="allow">
             <span>
-              <span i18n-content="pluginsAllow"></span>
+              <span>$i18n{pluginsAllow}</span>
               <span class="controlled-setting-indicator"
                   content-setting="plugins" value="allow"></span>
             </span>
@@ -156,9 +159,10 @@
           <label>
             <input type="radio" name="plugins" value="detect_important_content">
             <span>
-              <span i18n-content="pluginsDetectImportantContent"></span>
+              <span>$i18n{pluginsDetectImportantContent}</span>
               <span class="controlled-setting-indicator"
-                  content-setting="plugins" value="detect_important_content"></span>
+                  content-setting="plugins" value="detect_important_content">
+              </span>
             </span>
           </label>
         </div>
@@ -166,27 +170,28 @@
           <label>
             <input type="radio" name="plugins" value="block">
             <span>
-              <span i18n-content="pluginsBlock"></span>
+              <span>$i18n{pluginsBlock}</span>
               <span class="controlled-setting-indicator"
                   content-setting="plugins" value="block"></span>
             </span>
           </label>
         </div>
         <div class="settings-row">
-          <button class="exceptions-list-button" contentType="plugins"
-              i18n-content="manageExceptions"></button>
+          <button class="exceptions-list-button" contentType="plugins">
+            $i18n{manageExceptions}
+          </button>
         </div>
       </div>
     </section>
     <!-- Pop-ups filter -->
     <section>
-      <h3 i18n-content="popupsTabLabel" class="content-settings-header"></h3>
+      <h3 class="content-settings-header">$i18n{popupsTabLabel}</h3>
       <div>
         <div class="radio controlled-setting-with-label">
           <label>
             <input type="radio" name="popups" value="allow">
             <span>
-              <span i18n-content="popupsAllow"></span>
+              <span>$i18n{popupsAllow}</span>
               <span class="controlled-setting-indicator"
                   content-setting="popups" value="allow"></span>
             </span>
@@ -196,27 +201,28 @@
           <label>
             <input type="radio" name="popups" value="block">
             <span>
-              <span i18n-content="popupsBlock"></span>
+              <span>$i18n{popupsBlock}</span>
               <span class="controlled-setting-indicator"
                   content-setting="popups" value="block"></span>
             </span>
           </label>
         </div>
         <div class="settings-row">
-          <button class="exceptions-list-button" contentType="popups"
-              i18n-content="manageExceptions"></button>
+          <button class="exceptions-list-button" contentType="popups">
+            $i18n{manageExceptions}
+          </button>
         </div>
       </div>
     </section>
     <!-- Location filter -->
     <section>
-      <h3 i18n-content="locationTabLabel"></h3>
+      <h3>$i18n{locationTabLabel}</h3>
       <div>
         <div class="radio controlled-setting-with-label">
           <label>
             <input type="radio" name="location" value="allow">
             <span>
-              <span i18n-content="locationAllow"></span>
+              <span>$i18n{locationAllow}</span>
               <span class="controlled-setting-indicator"
                   content-setting="location" value="allow"></span>
             </span>
@@ -226,7 +232,7 @@
           <label>
             <input type="radio" name="location" value="ask">
             <span>
-              <span i18n-content="locationAsk"></span>
+              <span>$i18n{locationAsk}</span>
               <span class="controlled-setting-indicator"
                   content-setting="location" value="ask"></span>
             </span>
@@ -237,7 +243,7 @@
             <input type="radio" name="location"
                 value="block">
             <span>
-              <span i18n-content="locationBlock"></span>
+              <span>$i18n{locationBlock}</span>
               <span class="controlled-setting-indicator"
                   content-setting="location" value="block"></span>
             </span>
@@ -251,7 +257,7 @@
                 metric="Options_GoogleGeolocationAccessCheckbox"
                 type="checkbox">
             <span>
-              <span i18n-content="googleGeolocationAccessEnable"></span>
+              <span>$i18n{googleGeolocationAccessEnable}</span>
               <span class="controlled-setting-indicator"
                   pref="googlegeolocationaccess.enabled"></span>
             </span>
@@ -259,20 +265,21 @@
         </div>
 </if>
         <div class="settings-row">
-          <button class="exceptions-list-button" contentType="location"
-              i18n-content="manageExceptions"></button>
+          <button class="exceptions-list-button" contentType="location">
+            $i18n{manageExceptions}
+          </button>
         </div>
       </div>
     </section>
     <!-- Notifications filter tab contents -->
     <section id="notifications-section">
-      <h3 i18n-content="notificationsTabLabel"></h3>
+      <h3>$i18n{notificationsTabLabel}</h3>
       <div>
         <div class="radio controlled-setting-with-label">
           <label>
             <input type="radio" name="notifications" value="allow">
             <span>
-              <span i18n-content="notificationsAllow"></span>
+              <span>$i18n{notificationsAllow}</span>
               <span class="controlled-setting-indicator"
                   content-setting="notifications" value="allow"></span>
             </span>
@@ -282,7 +289,7 @@
           <label>
             <input type="radio" name="notifications" value="ask">
             <span>
-              <span i18n-content="notificationsAsk"></span>
+              <span>$i18n{notificationsAsk}</span>
               <span class="controlled-setting-indicator"
                   content-setting="notifications" value="ask"></span>
             </span>
@@ -292,64 +299,65 @@
           <label>
             <input type="radio" name="notifications" value="block">
             <span>
-              <span i18n-content="notificationsBlock"></span>
+              <span>$i18n{notificationsBlock}</span>
               <span class="controlled-setting-indicator"
                   content-setting="notifications" value="block"></span>
             </span>
           </label>
         </div>
         <div class="settings-row">
-          <button class="exceptions-list-button" contentType="notifications"
-              i18n-content="manageExceptions"></button>
+          <button class="exceptions-list-button" contentType="notifications">
+            $i18n{manageExceptions}
+          </button>
         </div>
       </div>
     </section>
     <!-- Protected Content filter -->
     <section guest-visibility="disabled">
-      <h3 i18n-content="protectedContentTabLabel"
-          class="content-settings-header"></h3>
+      <h3 class="content-settings-header">$i18n{protectedContentTabLabel}</h3>
       <div>
         <div class="checkbox">
           <label>
             <input pref="webkit.webprefs.encrypted_media_enabled"
                 type="checkbox">
-            <span i18n-content="protectedContentEnableCheckbox"></span>
+            <span>$i18n{protectedContentEnableCheckbox}</span>
           </label>
         </div>
 <if expr="chromeos or is_win">
         <div class="settings-row">
-          <p i18n-content="protectedContentInfo"></p>
+          <p>$i18n{protectedContentInfo}</p>
         </div>
         <div class="checkbox">
           <label>
             <input pref="settings.privacy.drm_enabled" type="checkbox">
-            <span i18n-content="protectedContentEnableIdentifiersCheckbox">
-            </span>
+            <span>$i18n{protectedContentEnableIdentifiersCheckbox}</span>
           </label>
         </div>
 </if>
 <if expr="chromeos">
         <div class="settings-row">
           <button id="protected-content-exceptions"
-              class="exceptions-list-button" contentType="protectedContent"
-              i18n-content="manageExceptions"></button>
+              class="exceptions-list-button" contentType="protectedContent">
+            $i18n{manageExceptions}
+          </button>
         </div>
 </if>
       </div>
     </section>
     <!-- Microphone filter -->
     <section id="media-stream-mic">
-      <h3 i18n-content="mediaStreamMicTabLabel"></h3>
+      <h3>$i18n{mediaStreamMicTabLabel}</h3>
       <div>
-        <span id="media-select-mic-label"
-            i18n-content="mediaSelectMicLabel" hidden></span>
+        <span id="media-select-mic-label" hidden>
+          $i18n{mediaSelectMicLabel}
+        </span>
         <select id="media-select-mic" class="weakrtl media-device-control"
             aria-labelledby="media-select-mic-label"></select>
         <div class="radio controlled-setting-with-label">
           <label>
             <input type="radio" name="media-stream-mic" value="ask">
             <span>
-              <span i18n-content="mediaStreamMicAsk"></span>
+              <span>$i18n{mediaStreamMicAsk}</span>
               <span class="controlled-setting-indicator"
                   content-setting="media-stream-mic" value="ask"></span>
             </span>
@@ -359,36 +367,39 @@
           <label>
             <input type="radio" name="media-stream-mic" value="block">
             <span>
-              <span i18n-content="mediaStreamMicBlock"></span>
+              <span>$i18n{mediaStreamMicBlock}</span>
               <span class="controlled-setting-indicator"
                   content-setting="media-stream-mic" value="block"></span>
             </span>
           </label>
         </div>
         <div class="settings-row">
-          <button class="exceptions-list-button" contentType="media-stream-mic"
-              i18n-content="manageExceptions"></button>
+          <button class="exceptions-list-button" contentType="media-stream-mic">
+            $i18n{manageExceptions}
+          </button>
         </div>
         <div id="media-pepper-flash-default-mic" class="pepper-flash-settings">
-          <span i18n-content="mediaPepperFlashMicDefaultDivergedLabel"></span>
-          <a target="_blank" i18n-content="mediaPepperFlashChangeLink"
-              i18n-values="href:mediaPepperFlashGlobalPrivacyURL"></a>
+          <span>$i18n{mediaPepperFlashMicDefaultDivergedLabel}</span>
+          <a target="_blank" href="$i18nRaw{mediaPepperFlashGlobalPrivacyURL}">
+            $i18n{mediaPepperFlashChangeLink}
+          </a>
         </div>
       </div>
     </section>
     <!-- Camera filter -->
     <section id="media-stream-camera">
-      <h3 i18n-content="mediaStreamCameraTabLabel"></h3>
+      <h3>$i18n{mediaStreamCameraTabLabel}</h3>
       <div>
-        <span id="media-select-camera-label"
-            i18n-content="mediaSelectCameraLabel" hidden></span>
+        <span id="media-select-camera-label" hidden>
+          $i18n{mediaSelectCameraLabel}
+        </span>
         <select id="media-select-camera" class="weakrtl media-device-control"
             aria-labelledby="media-select-camera-label"></select>
         <div class="radio controlled-setting-with-label">
           <label>
             <input type="radio" name="media-stream-camera" value="ask">
             <span>
-              <span i18n-content="mediaStreamCameraAsk"></span>
+              <span>$i18n{mediaStreamCameraAsk}</span>
               <span class="controlled-setting-indicator"
                   content-setting="media-stream-camera" value="ask"></span>
             </span>
@@ -398,7 +409,7 @@
           <label>
             <input type="radio" name="media-stream-camera" value="block">
             <span>
-              <span i18n-content="mediaStreamCameraBlock"></span>
+              <span>$i18n{mediaStreamCameraBlock}</span>
               <span class="controlled-setting-indicator"
                   content-setting="media-stream-camera" value="block"></span>
             </span>
@@ -406,27 +417,28 @@
         </div>
         <div class="settings-row">
           <button class="exceptions-list-button"
-              contentType="media-stream-camera" i18n-content="manageExceptions">
+              contentType="media-stream-camera">
+            $i18n{manageExceptions}
           </button>
         </div>
         <div id="media-pepper-flash-default-camera"
             class="pepper-flash-settings">
-          <span i18n-content="mediaPepperFlashCameraDefaultDivergedLabel">
-          </span>
-          <a target="_blank" i18n-content="mediaPepperFlashChangeLink"
-              i18n-values="href:mediaPepperFlashGlobalPrivacyURL"></a>
+          <span>$i18n{mediaPepperFlashCameraDefaultDivergedLabel}</span>
+          <a target="_blank" href="$i18nRaw{mediaPepperFlashGlobalPrivacyURL}">
+            $i18n{mediaPepperFlashChangeLink}
+          </a>
         </div>
       </div>
     </section>
     <!-- PPAPI broker -->
     <section>
-      <h3 i18n-content="ppapiBrokerTabLabel"></h3>
+      <h3>$i18n{ppapiBrokerTabLabel}</h3>
       <div>
         <div class="radio">
           <label>
             <input type="radio" name="ppapi-broker" value="allow">
             <span>
-              <span i18n-content="ppapiBrokerAllow"></span>
+              <span>$i18n{ppapiBrokerAllow}</span>
               <span class="controlled-setting-indicator"
                   content-setting="ppapi-broker" value="allow"></span>
             </span>
@@ -436,7 +448,7 @@
           <label>
             <input type="radio" name="ppapi-broker" value="ask">
             <span>
-              <span i18n-content="ppapiBrokerAsk"></span>
+              <span>$i18n{ppapiBrokerAsk}</span>
               <span class="controlled-setting-indicator"
                   content-setting="ppapi-broker" value="ask"></span>
             </span>
@@ -446,28 +458,29 @@
           <label>
             <input type="radio" name="ppapi-broker" value="block">
             <span>
-              <span i18n-content="ppapiBrokerBlock"></span>
+              <span>$i18n{ppapiBrokerBlock}</span>
               <span class="controlled-setting-indicator"
                   content-setting="ppapi-broker" value="block"></span>
             </span>
           </label>
         </div>
         <div class="settings-row">
-          <button class="exceptions-list-button" contentType="ppapi-broker"
-              i18n-content="manageExceptions"></button>
+          <button class="exceptions-list-button" contentType="ppapi-broker">
+            $i18n{manageExceptions}
+          </button>
         </div>
       </div>
     </section>
     <!-- Automatic Downloads filter -->
     <section>
-      <h3 i18n-content="multipleAutomaticDownloadsTabLabel"></h3>
+      <h3>$i18n{multipleAutomaticDownloadsTabLabel}</h3>
       <div>
         <div class="radio controlled-setting-with-label">
           <label>
             <input type="radio" name="multiple-automatic-downloads"
                 value="allow">
             <span>
-              <span i18n-content="multipleAutomaticDownloadsAllow"></span>
+              <span>$i18n{multipleAutomaticDownloadsAllow}</span>
               <span class="controlled-setting-indicator"
                   content-setting="multiple-automatic-downloads" value="allow">
               </span>
@@ -478,7 +491,7 @@
           <label>
             <input type="radio" name="multiple-automatic-downloads" value="ask">
             <span>
-              <span i18n-content="multipleAutomaticDownloadsAsk"></span>
+              <span>$i18n{multipleAutomaticDownloadsAsk}</span>
               <span class="controlled-setting-indicator"
                   content-setting="multiple-automatic-downloads" value="ask">
               </span>
@@ -490,7 +503,7 @@
             <input type="radio" name="multiple-automatic-downloads"
                 value="block">
             <span>
-              <span i18n-content="multipleAutomaticDownloadsBlock"></span>
+              <span>$i18n{multipleAutomaticDownloadsBlock}</span>
               <span class="controlled-setting-indicator"
                   content-setting="multiple-automatic-downloads" value="block">
               </span>
@@ -499,118 +512,124 @@
         </div>
         <div class="settings-row">
           <button class="exceptions-list-button"
-              contentType="multiple-automatic-downloads"
-              i18n-content="manageExceptions"></button>
+              contentType="multiple-automatic-downloads">
+            $i18n{manageExceptions}
+          </button>
         </div>
       </div>
     </section>
     <!-- MIDI system exclusive messages filter -->
     <section>
-      <h3 i18n-content="midiSysexHeader"></h3>
+      <h3>$i18n{midiSysexHeader}</h3>
       <div>
         <div class="radio">
           <label>
             <input type="radio" name="midi-sysex" value="allow">
-            <span i18n-content="midiSysExAllow"></span>
+            <span>$i18n{midiSysExAllow}</span>
           </label>
         </div>
         <div class="radio">
           <label>
             <input type="radio" name="midi-sysex" value="ask">
-            <span i18n-content="midiSysExAsk"></span>
+            <span>$i18n{midiSysExAsk}</span>
           </label>
         </div>
         <div class="radio">
           <label>
             <input type="radio" name="midi-sysex" value="block">
-            <span i18n-content="midiSysExBlock"></span>
+            <span>$i18n{midiSysExBlock}</span>
           </label>
         </div>
         <div class="settings-row">
-          <button class="exceptions-list-button" contentType="midi-sysex"
-              i18n-content="manageExceptions"></button>
+          <button class="exceptions-list-button" contentType="midi-sysex">
+            $i18n{manageExceptions}
+          </button>
         </div>
       </div>
     </section>
     <!-- Push messaging filter -->
     <section id="experimental-push-messaging-settings" hidden="true">
-      <h3 i18n-content="pushMessagingHeader"></h3>
+      <h3>$i18n{pushMessagingHeader}</h3>
       <div>
         <div class="radio">
           <label>
             <input type="radio" name="push-messaging" value="allow">
-            <span i18n-content="pushMessagingAllow"></span>
+            <span>$i18n{pushMessagingAllow}</span>
           </label>
         </div>
         <div class="radio">
           <label>
             <input type="radio" name="push-messaging" value="ask">
-            <span i18n-content="pushMessagingAsk"></span>
+            <span>$i18n{pushMessagingAsk}</span>
           </label>
         </div>
         <div class="radio">
           <label>
             <input type="radio" name="push-messaging" value="block">
-            <span i18n-content="pushMessagingBlock"></span>
+            <span>$i18n{pushMessagingBlock}</span>
           </label>
         </div>
         <div class="settings-row">
-          <button class="exceptions-list-button" contentType="push-messaging"
-              i18n-content="manageExceptions"></button>
+          <button class="exceptions-list-button" contentType="push-messaging">
+            $i18n{manageExceptions}
+          </button>
         </div>
       </div>
     </section>
     <!-- USB devices -->
     <section>
-      <h3 i18n-content="usbDevicesHeader"></h3>
+      <h3>$i18n{usbDevicesHeader}</h3>
       <div>
         <div class="settings-row">
-          <button class="exceptions-list-button" contentType="usb-devices"
-              i18n-content="usbDevicesManage"></button>
+          <button class="exceptions-list-button" contentType="usb-devices">
+            $i18n{usbDevicesManage}
+          </button>
         </div>
       </div>
     </section>
     <!-- Background sync -->
     <section>
-      <h3 i18n-content="backgroundSyncHeader"></h3>
+      <h3>$i18n{backgroundSyncHeader}</h3>
       <div>
         <div class="radio">
           <label>
             <input type="radio" name="background-sync" value="allow">
-            <span i18n-content="backgroundSyncAllow"></span>
+            <span>$i18n{backgroundSyncAllow}</span>
           </label>
         </div>
         <div class="radio">
           <label>
             <input type="radio" name="background-sync" value="block">
-            <span i18n-content="backgroundSyncBlock"></span>
+            <span>$i18n{backgroundSyncBlock}</span>
           </label>
         </div>
         <div class="settings-row">
-          <button class="exceptions-list-button" contentType="background-sync"
-              i18n-content="manageExceptions"></button>
+          <button class="exceptions-list-button" contentType="background-sync">
+            $i18n{manageExceptions}
+          </button>
         </div>
       </div>
     </section>
     <!-- Page zoom levels -->
     <section id="page-zoom-levels">
-      <h3 i18n-content="zoomlevelsHeader"></h3>
+      <h3>$i18n{zoomlevelsHeader}</h3>
       <div>
         <div class="settings-row">
-          <button class="exceptions-list-button" contentType="zoomlevels"
-              i18n-content="zoomLevelsManage"></button>
+          <button class="exceptions-list-button" contentType="zoomlevels">
+            $i18n{zoomLevelsManage}
+          </button>
         </div>
       </div>
     </section>
     <!-- PDF Plugin filter -->
     <section id="pdf-section">
-      <h3 i18n-content="pdfTabLabel" class="content-settings-header"></h3>
+      <h3 class="content-settings-header">$i18n{pdfTabLabel}</h3>
       <div>
         <div class="checkbox">
           <label>
             <input pref="plugins.always_open_pdf_externally" type="checkbox">
             <span>
-              <span i18n-content="pdfEnable"></span>
+              <span>$i18n{pdfEnable}</span>
               <span class="controlled-setting-indicator"
                   pref="plugins.always_open_pdf_externally">
               </span>
@@ -622,8 +641,8 @@
   </div>
   <div class="action-area">
     <div class="button-strip">
-      <button id="content-settings-overlay-confirm" class="default-button"
-          i18n-content="done">
+      <button id="content-settings-overlay-confirm" class="default-button">
+        $i18n{done}
       </button>
     </div>
   </div>
diff --git a/chrome/browser/resources/options/content_settings_exceptions_area.html b/chrome/browser/resources/options/content_settings_exceptions_area.html
index 079080f..c6b5efd 100644
--- a/chrome/browser/resources/options/content_settings_exceptions_area.html
+++ b/chrome/browser/resources/options/content_settings_exceptions_area.html
@@ -3,63 +3,56 @@
   <h1></h1>
   <div class="content-area">
     <div id="exception-column-headers">
-      <div id="exception-pattern-column" i18n-content="exceptionPatternHeader">
+      <div id="exception-pattern-column">$i18n{exceptionPatternHeader}</div>
+      <div id="exception-behavior-column" class="exception-value-column-header">
+        $i18n{exceptionBehaviorHeader}
       </div>
-      <div id="exception-behavior-column"
-          i18n-content="exceptionBehaviorHeader"
-          class="exception-value-column-header">
-      </div>
-      <div id="exception-zoom-column"
-          i18n-content="exceptionZoomHeader"
-          class="exception-value-column-header" hidden>
+      <div id="exception-zoom-column" class="exception-value-column-header"
+          hidden>
+        $i18n{exceptionZoomHeader}
       </div>
       <div id="exception-usb-device-column"
-          i18n-content="exceptionUsbDeviceHeader"
           class="exception-value-column-header" hidden>
+        $i18n{exceptionUsbDeviceHeader}
       </div>
     </div>
     <div contentType="cookies">
       <list mode="normal"></list>
       <div>
-        <span class="otr-explanation" i18n-content="otrExceptionsExplanation">
-        </span>
+        <span class="otr-explanation">$i18n{otrExceptionsExplanation}</span>
         <list mode="otr"></list>
       </div>
       <div class="flash-plugin-area">
-        <a i18n-values="href:flashStorageUrl" target="_blank"
-            i18n-content="flashStorageSettings">
+        <a href="$i18nRaw{flashStorageUrl}" target="_blank">
+          $i18n{flashStorageSettings}
         </a>
       </div>
     </div>
     <div contentType="images">
       <list mode="normal"></list>
       <div>
-        <span class="otr-explanation" i18n-content="otrExceptionsExplanation">
-        </span>
+        <span class="otr-explanation">$i18n{otrExceptionsExplanation}</span>
         <list mode="otr"></list>
       </div>
     </div>
     <div contentType="javascript">
       <list mode="normal"></list>
       <div>
-        <span class="otr-explanation" i18n-content="otrExceptionsExplanation">
-        </span>
+        <span class="otr-explanation">$i18n{otrExceptionsExplanation}</span>
         <list mode="otr"></list>
       </div>
     </div>
     <div contentType="plugins">
       <list mode="normal"></list>
       <div>
-        <span class="otr-explanation" i18n-content="otrExceptionsExplanation">
-        </span>
+        <span class="otr-explanation">$i18n{otrExceptionsExplanation}</span>
         <list mode="otr"></list>
       </div>
     </div>
     <div contentType="popups">
       <list mode="normal"></list>
       <div>
-        <span class="otr-explanation" i18n-content="otrExceptionsExplanation">
-        </span>
+        <span class="otr-explanation">$i18n{otrExceptionsExplanation}</span>
         <list mode="otr"></list>
       </div>
     </div>
@@ -72,44 +65,41 @@
     <div contentType="protectedContent">
       <list mode="normal"></list>
       <div>
-        <span class="otr-explanation" i18n-content="otrExceptionsExplanation">
-        </span>
+        <span class="otr-explanation">$i18n{otrExceptionsExplanation}</span>
         <list mode="otr"></list>
       </div>
     </div>
     <div contentType="media-stream-mic">
       <list mode="normal"></list>
       <div>
-        <span class="otr-explanation" i18n-content="otrExceptionsExplanation">
-        </span>
+        <span class="otr-explanation">$i18n{otrExceptionsExplanation}</span>
         <list mode="otr"></list>
       </div>
       <div id="media-pepper-flash-exceptions-mic" class="pepper-flash-settings">
-        <span i18n-content="mediaPepperFlashMicExceptionsDivergedLabel"></span>
-        <a target="_blank" i18n-content="mediaPepperFlashChangeLink"
-            i18n-values="href:mediaPepperFlashWebsitePrivacyURL"></a>
+        <span>$i18n{mediaPepperFlashMicExceptionsDivergedLabel}</span>
+        <a target="_blank" href="$i18nRaw{mediaPepperFlashWebsitePrivacyURL}">
+          $i18n{mediaPepperFlashChangeLink}
+        </a>
       </div>
     </div>
     <div contentType="media-stream-camera">
       <list mode="normal"></list>
       <div>
-        <span class="otr-explanation" i18n-content="otrExceptionsExplanation">
-        </span>
+        <span class="otr-explanation">$i18n{otrExceptionsExplanation}</span>
         <list mode="otr"></list>
       </div>
       <div id="media-pepper-flash-exceptions-camera"
           class="pepper-flash-settings">
-        <span i18n-content="mediaPepperFlashCameraExceptionsDivergedLabel">
-        </span>
-        <a target="_blank" i18n-content="mediaPepperFlashChangeLink"
-            i18n-values="href:mediaPepperFlashWebsitePrivacyURL"></a>
+        <span>$i18n{mediaPepperFlashCameraExceptionsDivergedLabel}</span>
+        <a target="_blank" href="$i18nRaw{mediaPepperFlashWebsitePrivacyURL}">
+          $i18n{mediaPepperFlashChangeLink}
+        </a>
       </div>
     </div>
     <div contentType="ppapi-broker">
       <list mode="normal"></list>
       <div>
-        <span class="otr-explanation" i18n-content="otrExceptionsExplanation">
-        </span>
+        <span class="otr-explanation">$i18n{otrExceptionsExplanation}</span>
         <list mode="otr"></list>
       </div>
     </div>
@@ -119,24 +109,21 @@
     <div contentType="midi-sysex">
       <list mode="normal"></list>
       <div>
-        <span class="otr-explanation" i18n-content="otrExceptionsExplanation">
-        </span>
+        <span class="otr-explanation">$i18n{otrExceptionsExplanation}</span>
         <list mode="otr"></list>
       </div>
     </div>
     <div contentType="push-messaging">
       <list mode="normal"></list>
       <div>
-        <span class="otr-explanation" i18n-content="otrExceptionsExplanation">
-        </span>
+        <span class="otr-explanation">$i18n{otrExceptionsExplanation}</span>
         <list mode="otr"></list>
       </div>
     </div>
     <div contentType="usb-devices">
       <list mode="normal"></list>
       <div>
-        <span class="otr-explanation" i18n-content="otrExceptionsExplanation">
-        </span>
+        <span class="otr-explanation">$i18n{otrExceptionsExplanation}</span>
         <list mode="otr"></list>
       </div>
     </div>
@@ -146,21 +133,21 @@
     <div contentType="zoomlevels">
       <list mode="normal"></list>
       <div>
-        <span class="otr-explanation" i18n-content="otrExceptionsExplanation">
-        </span>
+        <span class="otr-explanation">$i18n{otrExceptionsExplanation}</span>
         <list mode="otr"></list>
       </div>
     </div>
   </div>
   <div class="action-area">
     <div class="hbox stretch">
-      <a target="_blank" i18n-content="learnMore"
-          i18n-values="href:exceptionsLearnMoreUrl"></a>
+      <a target="_blank"
+          href="$i18nRaw{exceptionsLearnMoreUrl}">$i18n{learnMore}</a>
     </div>
     <div class="action-area-right">
       <div class="button-strip">
         <button id="content-settings-exceptions-overlay-confirm"
-            class="default-button" i18n-content="done">
+            class="default-button">
+          $i18n{done}
         </button>
       </div>
     </div>
diff --git a/chrome/browser/resources/options/cookies_view.html b/chrome/browser/resources/options/cookies_view.html
index 0cc136b..8176c3b 100644
--- a/chrome/browser/resources/options/cookies_view.html
+++ b/chrome/browser/resources/options/cookies_view.html
@@ -1,27 +1,28 @@
 <div id="cookies-view-page" class="page cookies-view-page" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="cookiesViewPage"></h1>
+  <h1>$i18n{cookiesViewPage}</h1>
   <div class="content-area cookies-list-content-area">
     <div class="cookies-column-headers">
       <div class="cookies-site-column">
-        <h3 i18n-content="cookie_domain"></h3>
+        <h3>$i18n{cookie_domain}</h3>
       </div>
       <div class="cookies-data-column">
-        <h3 i18n-content="cookie_local_data"></h3>
+        <h3>$i18n{cookie_local_data}</h3>
       </div>
       <div class="cookies-header-controls">
-        <button class="remove-all-cookies-button"
-            i18n-content="remove_all_cookie"></button>
+        <button class="remove-all-cookies-button">
+          $i18n{remove_all_cookie}
+        </button>
         <input type="search" class="cookies-search-box"
-            i18n-values="placeholder:search_cookies" incremental>
+            placeholder="$i18n{search_cookies}" incremental>
       </div>
     </div>
     <list id="cookies-list" class="cookies-list"></list>
   </div>
   <div class="action-area">
     <div class="button-strip">
-      <button class="cookies-view-overlay-confirm default-button"
-          i18n-content="done">
+      <button class="cookies-view-overlay-confirm default-button">
+        $i18n{done}
       </button>
     </div>
   </div>
diff --git a/chrome/browser/resources/options/do_not_track_confirm_overlay.html b/chrome/browser/resources/options/do_not_track_confirm_overlay.html
index 666865f..3116968 100644
--- a/chrome/browser/resources/options/do_not_track_confirm_overlay.html
+++ b/chrome/browser/resources/options/do_not_track_confirm_overlay.html
@@ -1,24 +1,21 @@
 <div id="do-not-track-confirm-overlay" class="page" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="doNotTrackConfirmOverlay"></h1>
+  <h1>$i18n{doNotTrackConfirmOverlay}</h1>
   <div class="content-area">
-    <span id="do-not-track-confirm-text"
-        i18n-content="doNotTrackConfirmMessage">
-    </span>
+    <span id="do-not-track-confirm-text">$i18n{doNotTrackConfirmMessage}</span>
   </div>
   <div class="action-area">
     <div class="hbox stretch">
-      <a target="_blank" i18n-content="learnMore"
-          i18n-values="href:doNotTrackLearnMoreURL">
-      </a>
+      <a target="_blank"
+          href="$i18nRaw{doNotTrackLearnMoreURL}">$i18n{learnMore}</a>
     </div>
     <div class="action-area-right">
       <div class="button-strip">
-        <button id="do-not-track-confirm-cancel"
-            i18n-content="doNotTrackConfirmDisable">
+        <button id="do-not-track-confirm-cancel">
+          $i18n{doNotTrackConfirmDisable}
         </button>
-        <button id="do-not-track-confirm-ok" class="default-button"
-            i18n-content="doNotTrackConfirmEnable">
+        <button id="do-not-track-confirm-ok" class="default-button">
+          $i18n{doNotTrackConfirmEnable}
         </button>
       </div>
     </div>
diff --git a/chrome/browser/resources/options/easy_unlock_turn_off_overlay.html b/chrome/browser/resources/options/easy_unlock_turn_off_overlay.html
index 84d9218..8a2db2e 100644
--- a/chrome/browser/resources/options/easy_unlock_turn_off_overlay.html
+++ b/chrome/browser/resources/options/easy_unlock_turn_off_overlay.html
@@ -1,16 +1,15 @@
 <div id="easy-unlock-turn-off-overlay" class="page" hidden>
   <div class="close-button"></div>
-  <h1 id="easy-unlock-turn-off-title"
-      i18n-content="easyUnlockTurnOffTitle"></h1>
+  <h1 id="easy-unlock-turn-off-title">$i18n{easyUnlockTurnOffTitle}</h1>
   <div class="content-area">
-    <p id="easy-unlock-turn-off-messagee" class="settings-row"
-        i18n-content="easyUnlockTurnOffDescription"></p>
+    <p id="easy-unlock-turn-off-messagee" class="settings-row">
+      $i18n{easyUnlockTurnOffDescription}
+    </p>
   </div>
   <div class="action-area button-strip">
-    <button id="easy-unlock-turn-off-dismiss" i18n-content="cancel">
-    </button>
-    <button id="easy-unlock-turn-off-confirm" class="default-button"
-        i18n-content="easyUnlockTurnOffButton">
+    <button id="easy-unlock-turn-off-dismiss">$i18n{cancel}</button>
+    <button id="easy-unlock-turn-off-confirm" class="default-button">
+      $i18n{easyUnlockTurnOffButton}
     </button>
     <div class="stretch"></div>
     <div id="easy-unlock-turn-off-spinner" class="spinner" hidden></div>
diff --git a/chrome/browser/resources/options/factory_reset_overlay.html b/chrome/browser/resources/options/factory_reset_overlay.html
index 21df28f9..3c0a0f0 100644
--- a/chrome/browser/resources/options/factory_reset_overlay.html
+++ b/chrome/browser/resources/options/factory_reset_overlay.html
@@ -1,16 +1,15 @@
 <div id="factory-reset-overlay" class="page" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="factoryResetHeading"></h1>
+  <h1>$i18n{factoryResetHeading}</h1>
   <div class="content-area">
-    <span i18n-content="factoryResetWarning"></span>
-    <a i18n-values="href:factoryResetHelpUrl"
-        i18n-content="errorLearnMore" target="_blank"></a>
+    <span>$i18n{factoryResetWarning}</span>
+    <a href="$i18nRaw{factoryResetHelpUrl}"
+        target="_blank">$i18n{errorLearnMore}</a>
   </div>
   <div class="action-area button-strip">
-    <button id="factory-reset-data-dismiss" i18n-content="cancel">
-    </button>
-    <button id="factory-reset-data-restart" class="default-button"
-        i18n-content="factoryResetDataRestart">
+    <button id="factory-reset-data-dismiss">$i18n{cancel}</button>
+    <button id="factory-reset-data-restart" class="default-button">
+      $i18n{factoryResetDataRestart}
     </button>
   </div>
 </div>
diff --git a/chrome/browser/resources/options/font_settings.html b/chrome/browser/resources/options/font_settings.html
index 6da0cef..f22c3dc 100644
--- a/chrome/browser/resources/options/font_settings.html
+++ b/chrome/browser/resources/options/font_settings.html
@@ -1,9 +1,9 @@
 <div id="font-settings" class="page" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="fontSettingsPage"></h1>
+  <h1>$i18n{fontSettingsPage}</h1>
   <div class="content-area">
     <section>
-      <h3 i18n-content="fontSettingsStandard"></h3>
+      <h3>$i18n{fontSettingsStandard}</h3>
       <div class="font-setting-container">
         <div class="font-input-div">
           <div>
@@ -16,9 +16,9 @@
             <input id="standard-font-size" type="range" min="0" max="24"
                 pref="webkit.webprefs.default_font_size">
             <div>
-              <span i18n-content="fontSettingsSizeTiny"></span>
-              <span i18n-content="fontSettingsSizeHuge"
-                  class="font-settings-huge">
+              <span>$i18n{fontSettingsSizeTiny}</span>
+              <span class="font-settings-huge">
+                $i18n{fontSettingsSizeHuge}
               </span>
             </div>
           </div>
@@ -27,7 +27,7 @@
       </div>
     </section>
     <section>
-      <h3 i18n-content="fontSettingsSerif"></h3>
+      <h3>$i18n{fontSettingsSerif}</h3>
       <div class="font-setting-container">
         <div class="font-input-div">
           <div>
@@ -41,7 +41,7 @@
       </div>
     </section>
     <section>
-      <h3 i18n-content="fontSettingsSansSerif"></h3>
+      <h3>$i18n{fontSettingsSansSerif}</h3>
       <div class="font-setting-container">
         <div class="font-input-div">
           <div>
@@ -55,7 +55,7 @@
       </div>
     </section>
     <section>
-      <h3 i18n-content="fontSettingsFixedWidth"></h3>
+      <h3>$i18n{fontSettingsFixedWidth}</h3>
       <div class="font-setting-container">
         <div class="font-input-div">
           <div>
@@ -69,16 +69,16 @@
       </div>
     </section>
     <section>
-      <h3 i18n-content="fontSettingsMinimumSize"></h3>
+      <h3>$i18n{fontSettingsMinimumSize}</h3>
       <div class="font-setting-container">
         <div class="font-input-div">
           <div>
             <input id="minimum-font-size" type="range" min="0" max="15"
                 pref="webkit.webprefs.minimum_font_size">
             <div>
-              <span i18n-content="fontSettingsSizeTiny"></span>
-              <span i18n-content="fontSettingsSizeHuge"
-                  class="font-settings-huge">
+              <span>$i18n{fontSettingsSizeTiny}</span>
+              <span class="font-settings-huge">
+                $i18n{fontSettingsSizeHuge}
               </span>
             </div>
           </div>
@@ -89,13 +89,15 @@
   </div>
   <div class="action-area">
     <div class="button-strip">
-      <span id="advanced-font-settings-install" hidden
-          i18n-values=".innerHTML:advancedFontSettingsInstall"></span>
-      <a is="action-link" id="advanced-font-settings-options"
-          i18n-content="advancedFontSettingsOptions" hidden></a>
+      <span id="advanced-font-settings-install" hidden>
+        $i18nRaw{advancedFontSettingsInstall}
+      </span>
+      <a is="action-link" id="advanced-font-settings-options" hidden>
+        $i18n{advancedFontSettingsOptions}
+      </a>
       <span class="spacer"></span>
-      <button id="font-settings-confirm" class="default-button"
-          i18n-content="done">
+      <button id="font-settings-confirm" class="default-button">
+        $i18n{done}
       </button>
     </div>
   </div>
diff --git a/chrome/browser/resources/options/handler_options.html b/chrome/browser/resources/options/handler_options.html
index bfe856b..fb4f576 100644
--- a/chrome/browser/resources/options/handler_options.html
+++ b/chrome/browser/resources/options/handler_options.html
@@ -1,27 +1,27 @@
 <div id="handler-options" class="page" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="handlersPage"></h1>
+  <h1>$i18n{handlersPage}</h1>
   <div class="content-area">
-    <h3 i18n-content="handlersActiveHeading"></h3>
+    <h3>$i18n{handlersActiveHeading}</h3>
     <div class="handlers-column-headers">
       <div class="handlers-type-column">
-        <div i18n-content="handlersTypeColumnHeader"></div>
+        <div>$i18n{handlersTypeColumnHeader}</div>
       </div>
       <div class="handlers-site-column">
-        <div i18n-content="handlersSiteColumnHeader"></div>
+        <div>$i18n{handlersSiteColumnHeader}</div>
       </div>
       <div class="handlers-remove-column"></div>
     </div>
     <list id="handlers-list"></list>
 
     <div id="ignored-handlers-section">
-      <h3 i18n-content="handlersIgnoredHeading"></h3>
+      <h3>$i18n{handlersIgnoredHeading}</h3>
       <div class="handlers-column-headers">
         <div class="handlers-type-column">
-          <h3 i18n-content="handlersTypeColumnHeader"></h3>
+          <h3>$i18n{handlersTypeColumnHeader}</h3>
         </div>
         <div class="handlers-site-column">
-          <h3 i18n-content="handlersSiteColumnHeader"></h3>
+          <h3>$i18n{handlersSiteColumnHeader}</h3>
         </div>
         <div class="handlers-remove-column"></div>
       </div>
@@ -30,13 +30,13 @@
   </div>
   <div class="action-area">
     <div class="hbox stretch">
-      <a target="_blank" i18n-content="learnMore"
-          i18n-values="href:handlersLearnMoreUrl"></a>
+      <a target="_blank"
+          href="$i18nRaw{handlersLearnMoreUrl}">$i18n{learnMore}</a>
     </div>
     <div class="action-area-right">
       <div class="button-strip">
-        <button id="handler-options-overlay-confirm" class="default-button"
-            i18n-content="done">
+        <button id="handler-options-overlay-confirm" class="default-button">
+          $i18n{done}
         </button>
       </div>
     </div>
diff --git a/chrome/browser/resources/options/home_page_overlay.html b/chrome/browser/resources/options/home_page_overlay.html
index b1b6edd..d73b0f5 100644
--- a/chrome/browser/resources/options/home_page_overlay.html
+++ b/chrome/browser/resources/options/home_page_overlay.html
@@ -1,6 +1,6 @@
 <div id="home-page-overlay" class="page" role="dialog" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="homePageOverlay"></h1>
+  <h1>$i18n{homePageOverlay}</h1>
   <div class="content-area">
     <div class="radio controlled-setting-with-label">
       <label>
@@ -8,7 +8,7 @@
             pref="homepage_is_newtabpage" value="true"
             metric="Options_Homepage_IsNewTabPage" dialog-pref>
         <span>
-          <span i18n-content="homePageUseNewTab"></span>
+          <span>$i18n{homePageUseNewTab}</span>
           <span class="controlled-setting-indicator"
               pref="homepage_is_newtabpage" value="true" dialog-pref></span>
         </span>
@@ -20,8 +20,7 @@
             pref="homepage_is_newtabpage" value="false"
             metric="Options_Homepage_IsNewTabPage" dialog-pref>
         <span>
-          <span id="homepage-use-url-label" i18n-content="homePageUseURL">
-          </span>
+          <span id="homepage-use-url-label">$i18n{homePageUseURL}</span>
           <span class="controlled-setting-indicator"
               pref="homepage_is_newtabpage" value="false" dialog-pref></span>
         </span>
@@ -39,11 +38,8 @@
   </div>
   <div class="action-area">
     <div class="button-strip">
-      <button id="home-page-cancel" type="reset" i18n-content="cancel">
-      </button>
-      <button id="home-page-confirm" class="default-button"
-          i18n-content="ok">
-      </button>
+      <button id="home-page-cancel" type="reset">$i18n{cancel}</button>
+      <button id="home-page-confirm" class="default-button">$i18n{ok}</button>
     </div>
   </div>
 </div>
diff --git a/chrome/browser/resources/options/hotword_confirm_overlay.html b/chrome/browser/resources/options/hotword_confirm_overlay.html
index 11103ef..5733921 100644
--- a/chrome/browser/resources/options/hotword_confirm_overlay.html
+++ b/chrome/browser/resources/options/hotword_confirm_overlay.html
@@ -1,23 +1,21 @@
 <div id="hotword-confirm-overlay" class="page" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="hotwordConfirmOverlay"></h1>
+  <h1>$i18n{hotwordConfirmOverlay}</h1>
   <div class="content-area">
-    <span id="hotword-confirm-text" i18n-content="hotwordConfirmMessage">
-    </span>
+    <span id="hotword-confirm-text">$i18n{hotwordConfirmMessage}</span>
   </div>
   <div class="action-area">
     <div class="hbox stretch">
-      <a target="_blank" i18n-content="learnMore"
-          i18n-values="href:hotwordLearnMoreURL">
-      </a>
+      <a target="_blank"
+          href="$i18nRaw{hotwordLearnMoreURL}">$i18n{learnMore}</a>
     </div>
     <div class="action-area-right">
       <div class="button-strip">
-        <button id="hotword-confirm-cancel"
-            i18n-content="hotwordConfirmDisable">
+        <button id="hotword-confirm-cancel">
+          $i18n{hotwordConfirmDisable}
         </button>
-        <button id="hotword-confirm-ok" class="default-button"
-            i18n-content="hotwordConfirmEnable">
+        <button id="hotword-confirm-ok" class="default-button">
+          $i18n{hotwordConfirmEnable}
         </button>
       </div>
     </div>
@@ -28,7 +26,7 @@
           pref="hotword.audio_logging_enabled"
           metric="Options_Hotword_AudioLogging_Checkbox"
           type="checkbox" dialog-pref checked>
-      <span i18n-content="hotwordAudioLoggingEnable"></span>
+      <span>$i18n{hotwordAudioLoggingEnable}</span>
     </label>
   </div>
 </div>
diff --git a/chrome/browser/resources/options/import_data_overlay.html b/chrome/browser/resources/options/import_data_overlay.html
index 7524577..7d604146 100644
--- a/chrome/browser/resources/options/import_data_overlay.html
+++ b/chrome/browser/resources/options/import_data_overlay.html
@@ -1,23 +1,23 @@
 <div id="import-data-overlay" class="page" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="importDataOverlay"></h1>
+  <h1>$i18n{importDataOverlay}</h1>
   <div class="content-area">
     <div class="import-data-configure">
       <div id="import-from-div">
-        <span i18n-content="importFromLabel"></span>
+        <span>$i18n{importFromLabel}</span>
         <select id="import-browsers">
-          <option i18n-content="importLoading"></option>
+          <option>$i18n{importLoading}</option>
         </select>
       </div>
       <div id="import-checkboxes">
-        <div i18n-content="importDescription"></div>
+        <div>$i18n{importDescription}</div>
         <div class="checkbox controlled-setting-with-label"
               id="import-history-with-label">
           <label>
             <input id="import-history" type="checkbox"
                 pref="import_dialog_history">
             <span>
-              <span i18n-content="importHistory"></span>
+              <span>$i18n{importHistory}</span>
               <span class="controlled-setting-indicator"
                   pref="import_dialog_history">
               </span>
@@ -30,7 +30,7 @@
             <input id="import-favorites" type="checkbox"
                 pref="import_dialog_bookmarks">
             <span>
-              <span i18n-content="importFavorites"></span>
+              <span>$i18n{importFavorites}</span>
               <span class="controlled-setting-indicator"
                   pref="import_dialog_bookmarks"></span>
             </span>
@@ -42,7 +42,7 @@
             <input id="import-passwords" type="checkbox"
                 pref="import_dialog_saved_passwords">
             <span>
-              <span i18n-content="importPasswords"></span>
+              <span>$i18n{importPasswords}</span>
               <span class="controlled-setting-indicator"
                   pref="import_dialog_saved_passwords"></span>
             </span>
@@ -54,7 +54,7 @@
             <input id="import-search" type="checkbox"
                 pref="import_dialog_search_engine">
             <span>
-              <span i18n-content="importSearch"></span>
+              <span>$i18n{importSearch}</span>
               <span class="controlled-setting-indicator"
                   pref="import_dialog_search_engine"></span>
             </span>
@@ -65,7 +65,7 @@
           <label>
             <input id="import-autofill-form-data" type="checkbox"
                 pref="import_dialog_autofill_form_data">
-            <span i18n-content="importAutofillFormData"></span>
+            <span>$i18n{importAutofillFormData}</span>
           </label>
           <span class="controlled-setting-indicator"
               pref="import_dialog_autofill_form_data"></span>
@@ -74,18 +74,18 @@
     </div>
     <div class="import-data-success" hidden>
       <div id="import-success-header">
-        <strong i18n-content="importSucceeded"></strong>
+        <strong>$i18n{importSucceeded}</strong>
       </div>
       <div id="import-success-image"></div>
       <div id="import-find-your-bookmarks">
-        <span i18n-content="findYourImportedBookmarks"></span>
+        <span>$i18n{findYourImportedBookmarks}</span>
         <div class="checkbox controlled-setting-with-label">
           <label>
             <input id="import-data-show-bookmarks-bar"
                 pref="bookmark_bar.show_on_all_tabs"
                 metric="Options_ShowBookmarksBar" type="checkbox">
             <span>
-              <span i18n-content="toolbarShowBookmarksBar"></span>
+              <span>$i18n{toolbarShowBookmarksBar}</span>
               <span class="controlled-setting-indicator"
                   pref="bookmark_bar.show_on_all_tabs"></span>
             </span>
@@ -99,11 +99,10 @@
       <div class="action-area-right">
         <div id="import-throbber" class="throbber"></div>
         <div class="button-strip">
-          <button id="import-data-cancel" i18n-content="cancel"></button>
-          <button id="import-choose-file" i18n-content="importChooseFile">
-          </button>
-          <button id="import-data-commit" class="default-button"
-              i18n-content="importCommit">
+          <button id="import-data-cancel">$i18n{cancel}</button>
+          <button id="import-choose-file">$i18n{importChooseFile}</button>
+          <button id="import-data-commit" class="default-button">
+            $i18n{importCommit}
           </button>
         </div>
       </div>
@@ -111,8 +110,8 @@
     <div class="import-data-success" hidden>
       <div class="action-area-right">
         <div class="button-strip">
-          <button id="import-data-confirm" class="default-button"
-              i18n-content="done">
+          <button id="import-data-confirm" class="default-button">
+            $i18n{done}
           </button>
         </div>
       </div>
diff --git a/chrome/browser/resources/options/language_add_language_overlay.html b/chrome/browser/resources/options/language_add_language_overlay.html
index 0cbf1b60..c95a56a 100644
--- a/chrome/browser/resources/options/language_add_language_overlay.html
+++ b/chrome/browser/resources/options/language_add_language_overlay.html
@@ -1,17 +1,17 @@
 <div id="add-language-overlay-page" class="page" role="dialog" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="addLanguageTitle"></h1>
+  <h1>$i18n{addLanguageTitle}</h1>
   <div class="content-area">
-    <label id="add-language-overlay-language-list-label"
-        i18n-content="addLanguageSelectLabel"></label>
+    <label id="add-language-overlay-language-list-label">
+      $i18n{addLanguageSelectLabel}
+    </label>
     <select id="add-language-overlay-language-list"
         aria-labelledby="add-language-overlay-language-list-label"></select>
   </div>
   <div class="action-area button-strip">
-    <button id="add-language-overlay-cancel-button" i18n-content="cancel">
-    </button>
-    <button id="add-language-overlay-ok-button" class="default-button"
-        i18n-content="ok">
+    <button id="add-language-overlay-cancel-button">$i18n{cancel}</button>
+    <button id="add-language-overlay-ok-button" class="default-button">
+      $i18n{ok}
     </button>
   </div>
 </div>
diff --git a/chrome/browser/resources/options/language_dictionary_overlay.html b/chrome/browser/resources/options/language_dictionary_overlay.html
index 34b6405..9e1a67f 100644
--- a/chrome/browser/resources/options/language_dictionary_overlay.html
+++ b/chrome/browser/resources/options/language_dictionary_overlay.html
@@ -1,20 +1,21 @@
 <div id="language-dictionary-overlay-page" class="page" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="languageDictionaryOverlayTitle"></h1>
+  <h1>$i18n{languageDictionaryOverlayTitle}</h1>
   <input id="language-dictionary-overlay-search-field" type="search"
-      i18n-values="placeholder:languageDictionaryOverlaySearchPlaceholder;
-                   aria-label:languageDictionaryOverlaySearchPlaceholder"
+      placeholder="$i18n{languageDictionaryOverlaySearchPlaceholder}"
+      aria-label="$i18n{languageDictionaryOverlaySearchPlaceholder}"
       incremental>
   <div class="content-area">
     <div class="settings-list">
-      <p id="language-dictionary-overlay-no-matches"
-          i18n-content="languageDictionaryOverlayNoMatches" hidden></p>
+      <p id="language-dictionary-overlay-no-matches" hidden>
+        $i18n{languageDictionaryOverlayNoMatches}
+      </p>
       <list id="language-dictionary-overlay-word-list"></list>
     </div>
   </div>
   <div class="action-area button-strip">
-    <button id="language-dictionary-overlay-done-button" class="default-button"
-        i18n-content="done">
+    <button id="language-dictionary-overlay-done-button" class="default-button">
+      $i18n{done}
     </button>
   </div>
 </div>
diff --git a/chrome/browser/resources/options/language_options.html b/chrome/browser/resources/options/language_options.html
index 83ede8f..7f9f33a 100644
--- a/chrome/browser/resources/options/language_options.html
+++ b/chrome/browser/resources/options/language_options.html
@@ -1,27 +1,25 @@
 <div id="languagePage" class="page" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="languagePage"></h1>
+  <h1>$i18n{languagePage}</h1>
   <div class="content-area">
     <div id="notification">
       <span>&nbsp;</span>
       <span class="link"><span class="link-color"></span></span>
     </div>
     <div class="language-options-header">
-      <span i18n-content="addLanguageInstructions"></span>
+      <span>$i18n{addLanguageInstructions}</span>
 <if expr="chromeos">
-      <span i18n-content="inputMethodInstructions"></span>
+      <span>$i18n{inputMethodInstructions}</span>
 </if>
-      <a target="_blank" i18n-content="learnMore"
-          i18n-values="href:languagesLearnMoreURL"></a>
+      <a target="_blank"
+          href="$i18nRaw{languagesLearnMoreURL}">$i18n{learnMore}</a>
     </div>
     <div class="language-options">
       <div id="language-options-languages">
-        <h3 i18n-content="languages"></h3>
+        <h3>$i18n{languages}</h3>
         <list id="language-options-list"></list>
         <div class="language-options-lower-left">
-          <button id="language-options-add-button"
-            i18n-content="addButton">
-          </button>
+          <button id="language-options-add-button">$i18n{addButton}</button>
         </div>
         <div id="language-options-list-dropmarker"></div>
       </div>
@@ -30,8 +28,8 @@
 <if expr="os == 'win32' or chromeos">
         <div id="language-options-ui-language-section"
              class="language-options-contents">
-          <button id="language-options-ui-language-button"
-              i18n-content="displayInThisLanguage">
+          <button id="language-options-ui-language-button">
+            $i18n{displayInThisLanguage}
           </button>
           <span class="controlled-setting-indicator"></span>
           <span id="language-options-ui-language-message" hidden></span>
@@ -44,30 +42,31 @@
           <div class="checkbox" id="spellcheck-language-checkbox-container">
             <label>
               <input type="checkbox" id="spellcheck-language-checkbox">
-              <span i18n-content="useThisForSpellChecking"></span>
+              <span>$i18n{useThisForSpellChecking}</span>
             </label>
           </div>
           <span id="spellcheck-language-message" hidden></span>
-          <span id="language-options-dictionary-downloading-message"
-              i18n-content="downloadingDictionary" hidden>
+          <span id="language-options-dictionary-downloading-message" hidden>
+            $i18n{downloadingDictionary}
           </span>
         </div>
         <div id="language-options-dictionary-download-failed-message"
             class="language-options-notification" hidden>
-          <div i18n-content="downloadFailed"></div>
+          <div>$i18n{downloadFailed}</div>
           <div id="language-options-dictionary-download-fail-help-message"
-              i18n-content="downloadFailHelp" hidden>
+              hidden>
+            $i18n{downloadFailHelp}
           </div>
-          <button id="dictionary-download-retry-button"
-              i18n-content="retryButton">
+          <button id="dictionary-download-retry-button">
+            $i18n{retryButton}
           </button>
         </div>
         <div id="language-options-ui-notification-bar"
             class="language-options-notification" hidden>
-          <div i18n-content="restartRequired"></div>
+          <div>$i18n{restartRequired}</div>
 <if expr="chromeos">
-          <button id="language-options-ui-restart-button"
-              i18n-content="restartButton">
+          <button id="language-options-ui-restart-button">
+            $i18n{restartButton}
           </button>
 </if>
         </div>
@@ -77,15 +76,17 @@
           <div class="checkbox">
             <label>
               <input type="checkbox" id="offer-to-translate-in-this-language">
-              <span class="offer-to-translate-label"
-                  i18n-content="offerToTranslateInThisLanguage"></span>
+              <span class="offer-to-translate-label">
+                $i18n{offerToTranslateInThisLanguage}
+              </span>
             </label>
           </div>
-          <span id="cannot-translate-in-this-language"
-               i18n-content="cannotTranslateInThisLanguage" hidden></span>
+          <span id="cannot-translate-in-this-language" hidden>
+            $i18n{cannotTranslateInThisLanguage}
+          </span>
         </div>
 <if expr="chromeos">
-        <h3 i18n-content="inputMethod"></h3>
+        <h3>$i18n{inputMethod}</h3>
         <div id="language-options-input-method-template" class="input-method"
             hidden>
           <div class="checkbox">
@@ -97,8 +98,8 @@
         </div>
         <div id="language-options-input-method-list"
              class="language-options-contents">
-          <span id="language-options-input-method-none"
-              i18n-content="noInputMethods" hidden>
+          <span id="language-options-input-method-none" hidden>
+            $i18n{noInputMethods}
           </span>
         </div>
 </if>
@@ -106,15 +107,16 @@
     </div>
     <div class="language-options-footer">
 <if expr="chromeos">
-      <div i18n-content="switchInputMethodsHint"></div>
-      <div i18n-content="selectPreviousInputMethodHint"></div>
+      <div>$i18n{switchInputMethodsHint}</div>
+      <div>$i18n{selectPreviousInputMethodHint}</div>
       <a is="action-link" id="edit-custom-dictionary-button"
-          class="standalone-action-link"
-          i18n-content="languageDictionaryOverlayTitle"></a>
+          class="standalone-action-link">
+        $i18n{languageDictionaryOverlayTitle}
+      </a>
       <div id="language-options-ime-menu-template" class="checkbox" hidden>
         <label>
           <input type="checkbox" id="activate-ime-menu">
-          <span i18n-content="activateImeMenu"></span>
+          <span>$i18n{activateImeMenu}</span>
         </label>
       </div>
 </if>
@@ -123,18 +125,18 @@
         <label id="enable-spellcheck-container">
           <input id="enable-spellcheck" pref="browser.enable_spellchecking"
               metric="Options_SpellCheck" type="checkbox">
-          <span i18n-content="enableSpellCheck"></span>
+          <span>$i18n{enableSpellCheck}</span>
         </label>
-        <a is="action-link" id="edit-custom-dictionary-button"
-            i18n-content="languageDictionaryOverlayTitle" hidden></a>
+        <a is="action-link" id="edit-custom-dictionary-button" hidden>
+          $i18n{languageDictionaryOverlayTitle}
+        </a>
       </div>
 </if>
     </div>
   </div>
   <div class="action-area">
     <div class="button-strip">
-      <button id="language-confirm" class="default-button" i18n-content="done">
-      </button>
+      <button id="language-confirm" class="default-button">$i18n{done}</button>
     </div>
   </div>
 </div>
diff --git a/chrome/browser/resources/options/manage_profile_overlay.html b/chrome/browser/resources/options/manage_profile_overlay.html
index 688d2496..f72093c0 100644
--- a/chrome/browser/resources/options/manage_profile_overlay.html
+++ b/chrome/browser/resources/options/manage_profile_overlay.html
@@ -2,15 +2,13 @@
   <div class="close-button"></div>
   <!-- Dialog for managing profiles. -->
   <div id="manage-profile-overlay-manage" hidden>
-    <h1 i18n-content="manageProfile"></h1>
+    <h1>$i18n{manageProfile}</h1>
     <div id="manage-profile-content" class="content-area">
-      <div id="manage-profile-icon-label"
-          i18n-content="manageProfilesIconLabel">
-      </div>
+      <div id="manage-profile-icon-label">$i18n{manageProfilesIconLabel}</div>
       <grid id="manage-profile-icon-grid"></grid>
       <div id="manage-profile-name-input-container">
         <label>
-          <span i18n-content="manageProfilesNameLabel"></span>
+          <span>$i18n{manageProfilesNameLabel}</span>
           <input id="manage-profile-name" type="text" pattern=".*\S.*" required>
         </label>
       </div>
@@ -18,71 +16,75 @@
     </div>
     <div class="action-area">
       <div class="action-area-shortcut-container">
-        <button id="remove-shortcut-button"
-            i18n-content="removeProfileShortcutButton" hidden>
+        <button id="remove-shortcut-button" hidden>
+          $i18n{removeProfileShortcutButton}
         </button>
-        <button id="add-shortcut-button"
-            i18n-content="createProfileShortcutButton" hidden>
+        <button id="add-shortcut-button" hidden>
+          $i18n{createProfileShortcutButton}
         </button>
       </div>
       <div class="button-strip">
-        <button id="manage-profile-cancel" i18n-content="cancel"></button>
-        <button id="manage-profile-ok" i18n-content="manageProfilesConfirm"
-            class="default-button"></button>
+        <button id="manage-profile-cancel">$i18n{cancel}</button>
+        <button id="manage-profile-ok" class="default-button">
+          $i18n{manageProfilesConfirm}
+        </button>
       </div>
     </div>
   </div>
   <!-- Dialog for deleting profiles. -->
   <div id="manage-profile-overlay-delete" hidden>
-    <h1 i18n-content="deleteProfileTitle"></h1>
+    <h1>$i18n{deleteProfileTitle}</h1>
     <div class="content-area">
       <div id="delete-profile-message">
         <img id="delete-profile-icon" class="profile-icon">
         <div id="delete-profile-text"></div>
       </div>
-      <div id="delete-supervised-profile-addendum"
-          i18n-values=".innerHTML:deleteSupervisedProfileAddendum" hidden>
+      <div id="delete-supervised-profile-addendum" hidden>
+        $i18nRaw{deleteSupervisedProfileAddendum}
       </div>
     </div>
     <div class="action-area button-strip">
-      <button id="delete-profile-ok" i18n-content="deleteProfileOK"></button>
-      <button id="delete-profile-cancel" i18n-content="cancel"
-          class="default-button"></button>
+      <button id="delete-profile-ok">$i18n{deleteProfileOK}</button>
+      <button id="delete-profile-cancel" class="default-button">
+        $i18n{cancel}
+      </button>
     </div>
   </div>
   <!-- Dialog for disconnecting enterprise managed profiles. -->
   <div id="manage-profile-overlay-disconnect-managed" hidden>
-    <h1 i18n-content="disconnectManagedProfileTitle"></h1>
+    <h1>$i18n{disconnectManagedProfileTitle}</h1>
     <div class="content-area"
-        id="disconnect-managed-profile-domain-information"
-        i18n-values=".innerHTML:disconnectManagedProfileDomainInformation">
+        id="disconnect-managed-profile-domain-information">
+      $i18nRaw{disconnectManagedProfileDomainInformation}
     </div>
     <div class="content-area">
       <div id="disconnect-managed-profile-message">
-        <div id="disconnect-managed-profile-text"
-            i18n-values=".innerHTML:disconnectManagedProfileText">
+        <div id="disconnect-managed-profile-text">
+          $i18nRaw{disconnectManagedProfileText}
         </div>
       </div>
     </div>
     <div class="action-area">
       <div class="button-strip">
-        <button id="disconnect-managed-profile-ok"
-            i18n-content="disconnectManagedProfileOK"></button>
-        <button id="disconnect-managed-profile-cancel" class="default-button"
-            i18n-content="cancel"></button>
+        <button id="disconnect-managed-profile-ok">
+          $i18n{disconnectManagedProfileOK}
+        </button>
+        <button id="disconnect-managed-profile-cancel" class="default-button">
+          $i18n{cancel}
+        </button>
       </div>
     </div>
   </div>
   <!-- Dialog for creating profiles. -->
   <div id="manage-profile-overlay-create" hidden>
-    <h1 i18n-content="createProfileTitle"></h1>
+    <h1>$i18n{createProfileTitle}</h1>
     <div id="create-profile-content" class="content-area">
       <div id="create-profile-instructions"></div>
       <grid id="create-profile-icon-grid"></grid>
       <div id="create-profile-name-input-container">
         <label>
-          <span id="create-profile-name-label"
-              i18n-content="manageProfilesNameLabel">
+          <span id="create-profile-name-label">
+            $i18n{manageProfilesNameLabel}
           </span>
           <input id="create-profile-name" type="text" pattern=".*\S.*" required>
         </label>
@@ -92,7 +94,7 @@
       <div id="create-shortcut-container" class="checkbox" hidden>
         <label>
           <input id="create-shortcut" type="checkbox">
-          <span i18n-content="createProfileShortcutCheckbox"></span>
+          <span>$i18n{createProfileShortcutCheckbox}</span>
         </label>
       </div>
       <div id="create-profile-supervised-container" class="checkbox">
@@ -100,19 +102,21 @@
           <input id="create-profile-supervised" type="checkbox">
           <span id="create-profile-supervised-signed-in">
             <span id="create-profile-supervised-signed-in-label"></span>
-            <span id="create-profile-supervised-account-details-out-of-date-label"
+            <span
+                id="create-profile-supervised-account-details-out-of-date-label"
                 hidden>
             </span>
             <a id="create-profile-supervised-signed-in-learn-more-link"
-                is="action-link" i18n-content="learnMore"></a>
+                is="action-link">
+              $i18n{learnMore}
+            </a>
             <a id="create-profile-supervised-sign-in-again-link"
-                is="action-link"
-                i18n-content="manageProfilesSupervisedSignInAgainLink"
-                hidden></a>
+                is="action-link" hidden>
+              $i18n{manageProfilesSupervisedSignInAgainLink}
+            </a>
           </span>
-          <span id="create-profile-supervised-not-signed-in"
-              i18n-values=".innerHTML:manageProfilesSupervisedNotSignedIn"
-              hidden>
+          <span id="create-profile-supervised-not-signed-in" hidden>
+            $i18nRaw{manageProfilesSupervisedNotSignedIn}
           </span>
         </label>
         <span id="create-profile-supervised-indicator"
@@ -123,12 +127,13 @@
     </div>
     <div class="action-area">
       <div id="create-profile-throbber" class="throbber"></div>
-      <a is="action-link" id="import-existing-supervised-user-link"
-          i18n-content="importExistingSupervisedUserLink" hidden></a>
+      <a is="action-link" id="import-existing-supervised-user-link" hidden>
+        $i18n{importExistingSupervisedUserLink}
+      </a>
       <div class="button-strip">
-        <button id="create-profile-cancel" i18n-content="cancel"></button>
-        <button id="create-profile-ok" i18n-content="createProfileConfirm"
-            class="default-button">
+        <button id="create-profile-cancel">$i18n{cancel}</button>
+        <button id="create-profile-ok" class="default-button">
+          $i18n{createProfileConfirm}
         </button>
       </div>
     </div>
diff --git a/chrome/browser/resources/options/options.html b/chrome/browser/resources/options/options.html
index 948096d..95936d5 100644
--- a/chrome/browser/resources/options/options.html
+++ b/chrome/browser/resources/options/options.html
@@ -1,8 +1,8 @@
 <!doctype html>
-<html id="t" i18n-values="dir:textdirection;lang:language">
+<html id="t" dir="$i18n{textdirection}" lang="$i18n{language}">
 <head>
 <meta charset="utf-8">
-<title i18n-content="optionsPageTitle"></title>
+<title>$i18n{optionsPageTitle}</title>
 <link rel="stylesheet" href="chrome://resources/css/bubble.css">
 <link rel="stylesheet" href="chrome://resources/css/bubble_button.css">
 <link rel="stylesheet" href="chrome://resources/css/chrome_shared.css">
@@ -183,17 +183,19 @@
     <div class="controlled-setting-bubble-extension-name"></div>
   </div>
   <div class="controlled-setting-bubble-content-row">
-    <a is="action-link" class="controlled-setting-bubble-extension-manage-link"
-        i18n-content="controlledSettingManageExtension"></a>
-    <button class='controlled-setting-bubble-extension-disable-button'
-        i18n-content="controlledSettingDisableExtension"></button>
+    <a is="action-link" class="controlled-setting-bubble-extension-manage-link">
+      $i18n{controlledSettingManageExtension}
+    </a>
+    <button class='controlled-setting-bubble-extension-disable-button'>
+      $i18n{controlledSettingDisableExtension}
+    </button>
   </div>
 </div>
 
 <div id="extension-controlled-warning-template"
      class="extension-controlled-warning-box settings-row" hidden>
   <div class="extension-controlled-warning"></div>
-  <button i18n-content="extensionDisable"></button>
+  <button>$i18n{extensionDisable}</button>
 </div>
 
 <div id="main-content"
diff --git a/chrome/browser/resources/options/password_manager.html b/chrome/browser/resources/options/password_manager.html
index 6bc11a6..c128a3b 100644
--- a/chrome/browser/resources/options/password_manager.html
+++ b/chrome/browser/resources/options/password_manager.html
@@ -1,65 +1,67 @@
 <div id="password-manager" class="page" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="passwordsPage"></h1>
+  <h1>$i18n{passwordsPage}</h1>
   <div class="content-area">
     <div class="password-manager-home">
       <div id="auto-signin-block" class="checkbox">
         <label>
           <input pref="credentials_enable_autosignin" type="checkbox">
-          <span i18n-content="autoSigninTitle"></span>
+          <span>$i18n{autoSigninTitle}</span>
         </label>
         <div class="setting-extra-description">
-          <span i18n-content="autoSigninDescription"></span>
+          <span>$i18n{autoSigninDescription}</span>
         </div>
       </div>
       <div id="password-list-headers">
         <div id="passwords-title">
-          <h3 i18n-content="savedPasswordsTitle"></h3>
+          <h3>$i18n{savedPasswordsTitle}</h3>
         </div>
         <div id="password-search-column">
           <input id="password-search-box" type="search"
-              i18n-values="placeholder:passwordSearchPlaceholder" incremental>
+              placeholder="$i18n{passwordSearchPlaceholder}" incremental>
         </div>
       </div>
       <list id="saved-passwords-list" class="settings-list"></list>
       <div id="saved-passwords-list-empty-placeholder"
            class="settings-list-empty" hidden>
-        <span i18n-content="passwordsNoPasswordsDescription"></span>
-        <a target="_blank" i18n-content="learnMore"
-           i18n-values="href:passwordManagerLearnMoreURL"></a>
+        <span>$i18n{passwordsNoPasswordsDescription}</span>
+        <a target="_blank"
+            href="$i18nRaw{passwordManagerLearnMoreURL}">$i18n{learnMore}</a>
       </div>
       <div id="password-manager-import-export" class="action-area" hidden>
         <div class="button-strip">
-          <button id="password-manager-import" class="password-manager-home"
-              i18n-content="passwordManagerImportPasswordButtonText">
+          <button id="password-manager-import" class="password-manager-home">
+            $i18n{passwordManagerImportPasswordButtonText}
           </button>
-          <button id="password-manager-export" class="password-manager-home"
-              i18n-content="passwordManagerExportPasswordButtonText">
+          <button id="password-manager-export" class="password-manager-home">
+            $i18n{passwordManagerExportPasswordButtonText}
           </button>
         </div>
       </div>
-      <h3 i18n-content="passwordExceptionsTitle"></h3>
+      <h3>$i18n{passwordExceptionsTitle}</h3>
       <list id="password-exceptions-list" class="settings-list"></list>
       <div id="password-exceptions-list-empty-placeholder" hidden
            class="settings-list-empty">
-        <span i18n-content="passwordsNoExceptionsDescription"></span>
-        <a id="exceptions-learn-more" target="_blank" i18n-content="learnMore"
-           i18n-values="href:passwordManagerLearnMoreURL"></a>
+        <span>$i18n{passwordsNoExceptionsDescription}</span>
+        <a id="exceptions-learn-more" target="_blank"
+            href="$i18nRaw{passwordManagerLearnMoreURL}">$i18n{learnMore}</a>
       </div>
     </div>
   </div>
   <div class="action-area">
     <span id="manage-passwords-span">
-      <span i18n-content="passwordsManagePasswordsBeforeLinkText"></span>
+      <span>$i18n{passwordsManagePasswordsBeforeLinkText}</span>
       <a id="manage-passwords-link" target="_blank"
-         i18n-content="passwordsManagePasswordsLinkText"
-         i18n-values="href:passwordsManagePasswordsLink"></a>
-      <span i18n-content="passwordsManagePasswordsAfterLinkText"></span>
+          href="$i18nRaw{passwordsManagePasswordsLink}">
+        $i18n{passwordsManagePasswordsLinkText}
+      </a>
+      <span>$i18n{passwordsManagePasswordsAfterLinkText}</span>
     </span>
     <div class="spacer-div"></div>
     <div class="button-strip">
-      <button id="password-manager-confirm" class="password-manager-home"
-          i18n-content="done"></button>
+      <button id="password-manager-confirm" class="password-manager-home">
+        $i18n{done}
+      </button>
     </div>
   </div>
 </div>
diff --git a/chrome/browser/resources/options/reset_profile_settings_overlay.html b/chrome/browser/resources/options/reset_profile_settings_overlay.html
index 504661f..07ba372 100644
--- a/chrome/browser/resources/options/reset_profile_settings_overlay.html
+++ b/chrome/browser/resources/options/reset_profile_settings_overlay.html
@@ -8,17 +8,15 @@
   </div>
   <div class="action-area">
     <div class="hbox stretch">
-      <a target="_blank" i18n-content="learnMore"
-          i18n-values="href:resetProfileSettingsLearnMoreUrl">
-      </a>
+      <a target="_blank"
+          href="$i18nRaw{resetProfileSettingsLearnMoreUrl}">$i18n{learnMore}</a>
     </div>
     <div class="action-area-right">
       <div id="reset-profile-settings-throbber" class="throbber"></div>
       <div class="button-strip">
-        <button id="reset-profile-settings-dismiss" i18n-content="cancel">
-        </button>
-        <button id="reset-profile-settings-commit"
-            i18n-content="resetProfileSettingsCommit">
+        <button id="reset-profile-settings-dismiss">$i18n{cancel}</button>
+        <button id="reset-profile-settings-commit">
+          $i18n{resetProfileSettingsCommit}
         </button>
       </div>
     </div>
@@ -28,7 +26,7 @@
     <label>
       <input id="send-settings" type="checkbox" checked>
       <span>
-        <span i18n-content="resetProfileSettingsFeedback"></span>
+        <span>$i18n{resetProfileSettingsFeedback}</span>
         <span id="expand-feedback"></span>
       </span>
     </label>
diff --git a/chrome/browser/resources/options/search_box.html b/chrome/browser/resources/options/search_box.html
index d723885..854538e5 100644
--- a/chrome/browser/resources/options/search_box.html
+++ b/chrome/browser/resources/options/search_box.html
@@ -2,11 +2,10 @@
   <header >
     <span id="browser-options-search-field-container"
         class="search-field-container">
-      <a is="action-link" id="about-button" i18n-content="aboutButton"
-          hidden></a>
+      <a is="action-link" id="about-button" hidden>$i18n{aboutButton}</a>
       <input id="search-field" type="search"
-          i18n-values="placeholder:searchPlaceholder;
-                       aria-label:searchPlaceholder" incremental>
+          placeholder="$i18n{searchPlaceholder}"
+          aria-label="$i18n{searchPlaceholder}" incremental>
     </span>
   </header>
 </div>
diff --git a/chrome/browser/resources/options/search_engine_manager.html b/chrome/browser/resources/options/search_engine_manager.html
index 0f9d8566..9d76000 100644
--- a/chrome/browser/resources/options/search_engine_manager.html
+++ b/chrome/browser/resources/options/search_engine_manager.html
@@ -1,16 +1,17 @@
 <div id="search-engine-manager-page" class="page" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="searchEngineManagerPage"></h1>
+  <h1>$i18n{searchEngineManagerPage}</h1>
   <div class="content-area">
-    <h3 i18n-content="defaultSearchEngineListTitle"></h3>
+    <h3>$i18n{defaultSearchEngineListTitle}</h3>
     <list id="default-search-engine-list"
         class="search-engine-list settings-list"></list>
-    <h3 i18n-content="otherSearchEngineListTitle"></h3>
+    <h3>$i18n{otherSearchEngineListTitle}</h3>
     <list id="other-search-engine-list"
         class="search-engine-list settings-list"></list>
     <div id="extension-keyword-div" hidden>
-      <h3 id="extension-keyword-list-title"
-          i18n-content="extensionKeywordsListTitle"></h3>
+      <h3 id="extension-keyword-list-title">
+        $i18n{extensionKeywordsListTitle}
+      </h3>
       <list id="extension-keyword-list"
           class="search-engine-list settings-list"></list>
     </div>
@@ -18,7 +19,8 @@
   <div class="action-area">
     <div class="button-strip">
       <button id="search-engine-manager-confirm" type="submit"
-          class="default-button" i18n-content="done">
+          class="default-button">
+        $i18n{done}
       </button>
     </div>
   </div>
diff --git a/chrome/browser/resources/options/search_page.html b/chrome/browser/resources/options/search_page.html
index 073c505..dcc9ed70 100644
--- a/chrome/browser/resources/options/search_page.html
+++ b/chrome/browser/resources/options/search_page.html
@@ -1,12 +1,12 @@
 <div id="searchPage" class="page" hidden>
   <header>
-    <h1 i18n-content="searchPage"></h1>
+    <h1>$i18n{searchPage}</h1>
   </header>
   <div id="searchPageNoMatches" hidden>
-    <p i18n-content="searchPageNoMatches"></p>
-    <p><span i18n-content="searchPageHelpLabel"></span>
-      <a target="_blank" i18n-content="searchPageHelpTitle"
-          i18n-values="href:searchPageHelpURL"></a>
+    <p>$i18n{searchPageNoMatches}</p>
+    <p><span>$i18n{searchPageHelpLabel}</span>
+      <a target="_blank"
+          href="$i18nRaw{searchPageHelpURL}">$i18n{searchPageHelpTitle}</a>
     </p>
   </div>
 </div>
diff --git a/chrome/browser/resources/options/secondary_user_banner.html b/chrome/browser/resources/options/secondary_user_banner.html
index 84da427..f609d07 100644
--- a/chrome/browser/resources/options/secondary_user_banner.html
+++ b/chrome/browser/resources/options/secondary_user_banner.html
@@ -3,8 +3,7 @@
     <div class="badge"></div>
     <div class="text">
       <p>
-        <span i18n-values=".innerHTML:secondaryUserBannerText">
-        </span>
+        <span>$i18nRaw{secondaryUserBannerText}</span>
       </p>
     </div>
   </div>
diff --git a/chrome/browser/resources/options/spelling_confirm_overlay.html b/chrome/browser/resources/options/spelling_confirm_overlay.html
index b4070df..a8c977a 100644
--- a/chrome/browser/resources/options/spelling_confirm_overlay.html
+++ b/chrome/browser/resources/options/spelling_confirm_overlay.html
@@ -1,18 +1,18 @@
 <div id="spelling-confirm-overlay" class="page" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="spellingConfirmOverlay"></h1>
+  <h1>$i18n{spellingConfirmOverlay}</h1>
   <div class="content-area">
-    <span id="spelling-confirm-text" i18n-content="spellingConfirmMessage">
-    </span>
-    <a id="spelling-confirm-learn-more" target="_blank" i18n-content="learnMore"
-        i18n-values="href:privacyLearnMoreURL"></a>
+    <span id="spelling-confirm-text">$i18n{spellingConfirmMessage}</span>
+    <a id="spelling-confirm-learn-more" target="_blank"
+        href="$i18nRaw{privacyLearnMoreURL}">$i18n{learnMore}</a>
   </div>
   <div class="action-area">
     <div class="button-strip">
-      <button id="spelling-confirm-cancel"
-          i18n-content="spellingConfirmDisable"></button>
-      <button id="spelling-confirm-ok" class="default-button"
-          i18n-content="spellingConfirmEnable">
+      <button id="spelling-confirm-cancel">
+        $i18n{spellingConfirmDisable}
+      </button>
+      <button id="spelling-confirm-ok" class="default-button">
+        $i18n{spellingConfirmEnable}
       </button>
     </div>
   </div>
diff --git a/chrome/browser/resources/options/startup_overlay.html b/chrome/browser/resources/options/startup_overlay.html
index 645bb7c..7864b70 100644
--- a/chrome/browser/resources/options/startup_overlay.html
+++ b/chrome/browser/resources/options/startup_overlay.html
@@ -1,6 +1,6 @@
 <div id="startup-overlay" class="page" hidden>
   <div class="close-button"></div>
-  <h1 i18n-content="startupPagesOverlay"></h1>
+  <h1>$i18n{startupPagesOverlay}</h1>
   <!-- This <input> element is always hidden. It needs to be here so that
        its 'controlled-by' attribute will get set when the urls preference is
        managed by a policy, so that the managed prefs bar will show up.
@@ -11,13 +11,12 @@
   </div>
   <div class="action-area">
     <span class="hbox stretch">
-      <button id="startupUseCurrentButton"
-          i18n-content="startupUseCurrent"></button>
+      <button id="startupUseCurrentButton">$i18n{startupUseCurrent}</button>
     </span>
     <div class="button-strip">
-      <button id="startup-overlay-cancel" i18n-content="cancel"></button>
-      <button id="startup-overlay-confirm" class="default-button"
-          i18n-content="ok">
+      <button id="startup-overlay-cancel">$i18n{cancel}</button>
+      <button id="startup-overlay-confirm" class="default-button">
+        $i18n{ok}
       </button>
     </div>
   </div>
diff --git a/chrome/browser/resources/options/startup_section.html b/chrome/browser/resources/options/startup_section.html
index 0d429a8..764f63a 100644
--- a/chrome/browser/resources/options/startup_section.html
+++ b/chrome/browser/resources/options/startup_section.html
@@ -1,5 +1,5 @@
 <section id="startup-section" guest-visibility="hidden">
-  <h3 i18n-content="sectionTitleStartup"></h3>
+  <h3>$i18n{sectionTitleStartup}</h3>
   <div id="startup-section-content">
     <div class="radio controlled-setting-with-label"
         id="newtab-section-content">
@@ -8,7 +8,7 @@
             pref="session.restore_on_startup"
             metric="Options_Startup_NewTab">
         <span>
-          <span i18n-content="startupShowNewTab"></span>
+          <span>$i18n{startupShowNewTab}</span>
           <span class="controlled-setting-indicator"
               pref="session.restore_on_startup" value="5"></span>
         </span>
@@ -20,7 +20,7 @@
             value="1" pref="session.restore_on_startup"
             metric="Options_Startup_LastSession">
         <span>
-          <span i18n-content="startupRestoreLastSession"></span>
+          <span>$i18n{startupRestoreLastSession}</span>
           <span class="controlled-setting-indicator"
               pref="session.restore_on_startup" value="1"></span>
         </span>
@@ -32,13 +32,12 @@
             pref="session.restore_on_startup"
             value="4" metric="Options_Startup_Custom">
         <span>
-          <span i18n-content="startupShowPages"></span>
+          <span>$i18n{startupShowPages}</span>
           <span class="controlled-setting-indicator"
               pref="session.restore_on_startup" value="4"></span>
         </span>
       </label>
-      <a is="action-link" id="startup-set-pages"
-          i18n-content="startupSetPages"></a>
+      <a is="action-link" id="startup-set-pages">$i18n{startupSetPages}</a>
       <span class="controlled-setting-indicator"
           pref="session.startup_urls"></span>
     </div>
diff --git a/chrome/browser/resources/options/supervised_user_create_confirm.html b/chrome/browser/resources/options/supervised_user_create_confirm.html
index 3ccd8c7..ae4076a 100644
--- a/chrome/browser/resources/options/supervised_user_create_confirm.html
+++ b/chrome/browser/resources/options/supervised_user_create_confirm.html
@@ -4,9 +4,10 @@
   <div id="supervised-user-created-image"></div>
   <h1 id="supervised-user-created-title"></h1>
   <div id="supervised-user-created-text" class="content-area"></div>
-  <div id="supervised-user-created-action-area" class="action-area button-strip">
-    <button id="supervised-user-created-done"
-        i18n-content="supervisedUserCreatedDone">
+  <div id="supervised-user-created-action-area"
+      class="action-area button-strip">
+    <button id="supervised-user-created-done">
+      $i18n{supervisedUserCreatedDone}
     </button>
     <button id="supervised-user-created-switch"></button>
   </div>
diff --git a/chrome/browser/resources/options/supervised_user_import.html b/chrome/browser/resources/options/supervised_user_import.html
index 72cd4c3a..9fd806d 100644
--- a/chrome/browser/resources/options/supervised_user_import.html
+++ b/chrome/browser/resources/options/supervised_user_import.html
@@ -1,19 +1,19 @@
 <div id="supervised-user-import" class="page" hidden>
   <div class="close-button"></div>
   <!-- Overlay to import an existing supervised user during user creation -->
-  <h1 id="supervised-user-import-title" i18n-content="supervisedUserImportTitle"
-      class="supervised-user-import">
+  <h1 id="supervised-user-import-title" class="supervised-user-import">
+    $i18n{supervisedUserImportTitle}
   </h1>
   <h1 id="supervised-user-select-avatar-title"
-      i18n-content="supervisedUserSelectAvatarTitle"
       class="supervised-user-select-avatar" hidden>
+    $i18n{supervisedUserSelectAvatarTitle}
   </h1>
-  <div id="supervised-user-import-text" i18n-content="supervisedUserImportText"
-      class="supervised-user-import">
+  <div id="supervised-user-import-text" class="supervised-user-import">
+    $i18n{supervisedUserImportText}
   </div>
   <div id="supervised-user-select-avatar-text"
-      i18n-content="supervisedUserSelectAvatarText"
       class="supervised-user-select-avatar" hidden>
+    $i18n{supervisedUserSelectAvatarText}
   </div>
   <div id="supervised-user-import-content-area" class="content-area">
     <list id="supervised-user-list"
@@ -26,15 +26,14 @@
   <div id="supervised-user-import-action-area" class="action-area">
     <div class="button-strip">
       <div id="supervised-user-import-throbber" class="throbber"></div>
-      <button id="supervised-user-import-cancel" i18n-content="cancel">
-      </button>
+      <button id="supervised-user-import-cancel">$i18n{cancel}</button>
       <button id="supervised-user-import-ok"
-          i18n-content="supervisedUserImportOk"
           class="default-button supervised-user-import">
+        $i18n{supervisedUserImportOk}
       </button>
       <button id="supervised-user-select-avatar-ok"
-          i18n-content="supervisedUserSelectAvatarOk"
           class="default-button supervised-user-select-avatar" hidden>
+        $i18n{supervisedUserSelectAvatarOk}
       </button>
     </div>
   </div>
diff --git a/chrome/browser/resources/options/sync_section.html b/chrome/browser/resources/options/sync_section.html
index f43b440a5..375601e2 100644
--- a/chrome/browser/resources/options/sync_section.html
+++ b/chrome/browser/resources/options/sync_section.html
@@ -1,23 +1,22 @@
 <if expr="not chromeos">
 <section id="sync-section">
-  <h3 i18n-content="sectionTitleSync"></h3>
+  <h3>$i18n{sectionTitleSync}</h3>
 </if>
 <if expr="chromeos">
 <div id="sync-section">
 </if>
 
   <div id="sync-overview" class="settings-row" hidden>
-    <p i18n-content="syncOverview"></p>
-    <a i18n-values="href:syncLearnMoreURL" i18n-content="learnMore"
-        target="_blank"></a>
+    <p>$i18n{syncOverview}</p>
+    <a href="$i18nRaw{syncLearnMoreURL}" target="_blank">$i18n{learnMore}</a>
   </div>
 
 <if expr="chromeos">
   <div id="account-picture-wrapper">
     <div id="account-picture-control">
-      <input type="image" id="account-picture" tabindex="0"
-          alt="" i18n-values="aria-label:changePicture">
-      <div id="change-picture-caption" i18n-content="changePicture"></div>
+      <input type="image" id="account-picture" tabindex="0" alt=""
+          aria-label="$i18n{changePicture}">
+      <div id="change-picture-caption">$i18n{changePicture}</div>
     </div>
     <span id="account-picture-indicator" class="controlled-setting-indicator">
     </span>
@@ -39,14 +38,14 @@
             metric="Options_ScreenLock"
             pref="settings.enable_screen_lock">
        <span>
-         <span i18n-content="enableScreenlock"></span>
+         <span>$i18n{enableScreenlock}</span>
          <span class="controlled-setting-indicator"
-            i18n-values="textshared:screenLockShared"
-            pref="settings.enable_screen_lock"></span>
+             textshared="$i18n{screenLockShared}"
+             pref="settings.enable_screen_lock"></span>
        </span>
       </label>
-      <a is="action-link" id="manage-screenlock"
-        i18n-content="manageScreenlock" hidden>
+      <a is="action-link" id="manage-screenlock" hidden>
+        $i18n{manageScreenlock}
       </a>
     </div>
   </div>
@@ -57,13 +56,12 @@
     <span id="start-stop-sync-indicator"
         class="controlled-setting-indicator" hidden>
     </span>
-    <button id="customize-sync" i18n-content="customizeSync"
-        pref="sync.managed" hidden>
+    <button id="customize-sync" pref="sync.managed" hidden>
+      $i18n{customizeSync}
     </button>
 <if expr="chromeos">
-    <button id="manage-accounts-button"
-        public-account-visibility="hidden"
-        i18n-content="manageAccountsButtonTitle">
+    <button id="manage-accounts-button" public-account-visibility="hidden">
+      $i18n{manageAccountsButtonTitle}
     </button>
 </if>  <!-- chromeos -->
   </div>
diff --git a/chrome/browser/resources/settings/internet_page/internet_detail_page.js b/chrome/browser/resources/settings/internet_page/internet_detail_page.js
index 6acf65d..81b3add 100644
--- a/chrome/browser/resources/settings/internet_page/internet_detail_page.js
+++ b/chrome/browser/resources/settings/internet_page/internet_detail_page.js
@@ -143,7 +143,7 @@
    * network properties have been fetched in networkPropertiesChanged_().
    * @private {boolean}
    */
-  shoudlShowConfigureWhenNetworkLoaded_: false,
+  shouldShowConfigureWhenNetworkLoaded_: false,
 
   /**
    * Whether the previous route was also the network detail page.
@@ -182,7 +182,7 @@
     var type = /** @type {!chrome.networkingPrivate.NetworkType} */ (
                    queryParams.get('type')) ||
         CrOnc.Type.WI_FI;
-    this.shoudlShowConfigureWhenNetworkLoaded_ =
+    this.shouldShowConfigureWhenNetworkLoaded_ =
         queryParams.get('showConfigure') == 'true';
     this.wasPreviousRouteNetworkDetailPage_ =
         oldRoute == settings.Route.NETWORK_DETAIL;
@@ -242,7 +242,7 @@
       button.focus();
     }
 
-    if (this.shoudlShowConfigureWhenNetworkLoaded_ &&
+    if (this.shouldShowConfigureWhenNetworkLoaded_ &&
         this.networkProperties.Tether) {
       this.showTetherDialog_();
     }
diff --git a/chrome/browser/resources/settings/internet_page/internet_page.html b/chrome/browser/resources/settings/internet_page/internet_page.html
index 839f12b..a213bc6 100644
--- a/chrome/browser/resources/settings/internet_page/internet_page.html
+++ b/chrome/browser/resources/settings/internet_page/internet_page.html
@@ -65,9 +65,9 @@
               <template is="dom-repeat" items="[[thirdPartyVpnProviders_]]">
                 <div actionable class="list-item"
                     on-tap="onAddThirdPartyVpnTap_" provider="[[item]]">
-                  <div class="start">[[getAddThirdParrtyVpnLabel_(item)]]</div>
+                  <div class="start">[[getAddThirdPartyVpnLabel_(item)]]</div>
                   <button class="icon-external" is="paper-icon-button-light"
-                      aria-label$="[[getAddThirdParrtyVpnLabel_(item)]]">
+                      aria-label$="[[getAddThirdPartyVpnLabel_(item)]]">
                   </button>
                 </div>
               </template>
@@ -88,7 +88,7 @@
           </settings-internet-config>
         </settings-subpage>
       </template>
-      
+
       <template is="dom-if" route-path="/networkDetail" no-search>
         <settings-subpage page-title="$i18n{internetDetailPageTitle}">
           <settings-internet-detail-page prefs="{{prefs}}"
@@ -98,7 +98,7 @@
           </settings-internet-detail-page>
         </settings-subpage>
       </template>
-      
+
       <template is="dom-if" route-path="/knownNetworks" no-search>
         <settings-subpage page-title="$i18n{internetKnownNetworksPageTitle}">
           <settings-internet-known-networks-page
@@ -111,7 +111,7 @@
       <template is="dom-if" route-path="/networks" no-search>
         <settings-subpage page-title="[[getNetworksPageTitle_(subpageType_)]]"
             show-spinner="[[showSpinner_]]">
-          <settings-internet-subpage 
+          <settings-internet-subpage
               default-network="[[defaultNetwork]]"
               device-state="[[getDeviceState_(subpageType_, deviceStates)]]"
               tether-device-state="[[get('Tether', deviceStates)]]"
diff --git a/chrome/browser/resources/settings/internet_page/internet_page.js b/chrome/browser/resources/settings/internet_page/internet_page.js
index c4a809e..a4d148e3 100644
--- a/chrome/browser/resources/settings/internet_page/internet_page.js
+++ b/chrome/browser/resources/settings/internet_page/internet_page.js
@@ -428,7 +428,7 @@
    * @param {!chrome.networkingPrivate.ThirdPartyVPNProperties} provider
    * @return {string}
    */
-  getAddThirdParrtyVpnLabel_: function(provider) {
+  getAddThirdPartyVpnLabel_: function(provider) {
     return this.i18n('internetAddThirdPartyVPN', provider.ProviderName);
   },
 
diff --git a/chrome/browser/resources/settings/internet_page/network_property_list.html b/chrome/browser/resources/settings/internet_page/network_property_list.html
index 01a09c9..b3778cf 100644
--- a/chrome/browser/resources/settings/internet_page/network_property_list.html
+++ b/chrome/browser/resources/settings/internet_page/network_property_list.html
@@ -33,7 +33,7 @@
     <template is="dom-repeat" items="[[fields]]"
         filter="[[computeFilter_(prefix, propertyDict, editFieldTypes)]]">
       <div class="settings-box single-column two-line">
-        <!-- Propety label -->
+        <!-- Property label -->
         <div>[[getPropertyLabel_(item, prefix)]]</div>
         <!-- Uneditable property value -->
         <div class="layout horizontal"
diff --git a/chrome/browser/resources/settings/internet_page/network_proxy.js b/chrome/browser/resources/settings/internet_page/network_proxy.js
index 0812388..1579b0b 100644
--- a/chrome/browser/resources/settings/internet_page/network_proxy.js
+++ b/chrome/browser/resources/settings/internet_page/network_proxy.js
@@ -199,7 +199,7 @@
       proxy.PAC = /** @type {string|undefined} */ (
           CrOnc.getActiveValue(proxySettings.PAC));
     }
-    // Use saved ExcludeDomanains and Manual if not defined.
+    // Use saved ExcludeDomains and Manual if not defined.
     proxy.ExcludeDomains = proxy.ExcludeDomains || this.savedExcludeDomains_;
     proxy.Manual = proxy.Manual || this.savedManual_;
 
diff --git a/chrome/browser/resources/settings/internet_page/network_summary.js b/chrome/browser/resources/settings/internet_page/network_summary.js
index b1e607f..3f83c7af 100644
--- a/chrome/browser/resources/settings/internet_page/network_summary.js
+++ b/chrome/browser/resources/settings/internet_page/network_summary.js
@@ -312,7 +312,7 @@
       if (!device)
         continue;  // The technology for this device type is unavailable.
 
-      // If both 'Tether' and 'Cellular' technoligies exist, merge the network
+      // If both 'Tether' and 'Cellular' technologies exist, merge the network
       // lists and do not add an active network for 'Tether' so that there is
       // only one 'Mobile data' section / subpage.
       if (type == CrOnc.Type.TETHER && newDeviceStates[CrOnc.Type.CELLULAR]) {
diff --git a/chrome/browser/resources/settings/on_startup_page/compiled_resources2.gyp b/chrome/browser/resources/settings/on_startup_page/compiled_resources2.gyp
index d29ed565..725d084 100644
--- a/chrome/browser/resources/settings/on_startup_page/compiled_resources2.gyp
+++ b/chrome/browser/resources/settings/on_startup_page/compiled_resources2.gyp
@@ -14,7 +14,7 @@
     {
       'target_name': 'on_startup_page',
       'dependencies': [
-        'on_startup_browser_proxy',
+        '../compiled_resources2.gyp:route',
       ],
       'includes': ['../../../../../third_party/closure_compiler/compile_js2.gypi'],
     },
@@ -27,6 +27,7 @@
         '<(DEPTH)/ui/webui/resources/js/cr/ui/compiled_resources2.gyp:focus_without_ink',
         '<(DEPTH)/ui/webui/resources/cr_elements/compiled_resources2.gyp:cr_scrollable_behavior',
         '<(EXTERNS_GYP):settings_private',
+        'on_startup_browser_proxy',
         'startup_urls_page_browser_proxy',
         'startup_url_entry',
       ],
diff --git a/chrome/browser/resources/settings/on_startup_page/on_startup_page.html b/chrome/browser/resources/settings/on_startup_page/on_startup_page.html
index e0ce1da9..e5cac20 100644
--- a/chrome/browser/resources/settings/on_startup_page/on_startup_page.html
+++ b/chrome/browser/resources/settings/on_startup_page/on_startup_page.html
@@ -1,51 +1,34 @@
 <link rel="import" href="chrome://resources/html/polymer.html">
 
-<link rel="import" href="../controls/controlled_radio_button.html">
-<link rel="import" href="../controls/extension_controlled_indicator.html">
-<link rel="import" href="../controls/settings_radio_group.html">
-<link rel="import" href="on_startup_browser_proxy.html">
-<link rel="import" href="startup_urls_page.html">
 <link rel="import" href="../settings_shared_css.html">
+<link rel="import" href="startup_urls_page.html">
 
 <dom-module id="settings-on-startup-page">
   <template>
-    <style include="settings-shared">
-      .block {
-        display: block;
-      }
-    </style>
-    <div class="settings-box block first">
-      <settings-radio-group id="onStartupRadioGroup"
-          pref="{{prefs.session.restore_on_startup}}">
-        <controlled-radio-button name="[[prefValues_.OPEN_NEW_TAB]]"
-            pref="[[prefs.session.restore_on_startup]]"
-            label="$i18n{onStartupOpenNewTab}"
-            no-extension-indicator>
-        </controlled-radio-button>
-        <template is="dom-if" if="[[showIndicator_(
-            ntpExtension_, prefs.session.restore_on_startup.value)]]">
-          <extension-controlled-indicator
-              extension-id="[[ntpExtension_.id]]"
-              extension-name="[[ntpExtension_.name]]"
-              extension-can-be-disabled="[[ntpExtension_.canBeDisabled]]"
-              on-extension-disable="getNtpExtension_">
-          </extension-controlled-indicator>
-        </template>
-        <controlled-radio-button name="[[prefValues_.CONTINUE]]"
-            pref="[[prefs.session.restore_on_startup]]"
-            label="$i18n{onStartupContinue}">
-        </controlled-radio-button>
-        <controlled-radio-button name="[[prefValues_.OPEN_SPECIFIC]]"
-            pref="[[prefs.session.restore_on_startup]]"
-            label="$i18n{onStartupOpenSpecific}">
-        </controlled-radio-button>
-      </settings-radio-group>
-    </div>
-    <template is="dom-if"
-        if="[[showStartupUrls_(prefs.session.restore_on_startup.value)]]">
-      <settings-startup-urls-page prefs="[[prefs]]">
-      </settings-startup-urls-page>
-    </template>
+    <style include="settings-shared"></style>
+    <settings-animated-pages id="pages" section="onStartup"
+        focus-config="[[focusConfig_]]">
+      <neon-animatable route-path="default">
+        <div class="settings-box first two-line"
+            id="manage-startup-urls-subpage-trigger"
+            on-tap="onManageStartupUrls_" actionable>
+          <div class="start">
+            $i18n{onStartupManage}
+            <div class="secondary">$i18n{onStartupDescription}</div>
+          </div>
+          <button class="subpage-arrow" is="paper-icon-button-light"
+              aria-label="$i18n{onStartupManage}"></button>
+        </div>
+      </neon-animatable>
+      <template is="dom-if" route-path="/startupUrls">
+        <settings-subpage
+            associated-control="[[$$('#manage-startup-urls-subpage-trigger')]]"
+            page-title="$i18n{onStartupManage}">
+          <settings-startup-urls-page prefs="{{prefs}}">
+          </settings-startup-urls-page>
+        </settings-subpage>
+      </template>
+    </settings-animated-pages>
   </template>
   <script src="on_startup_page.js"></script>
 </dom-module>
diff --git a/chrome/browser/resources/settings/on_startup_page/on_startup_page.js b/chrome/browser/resources/settings/on_startup_page/on_startup_page.js
index c02d05c..70445ed2 100644
--- a/chrome/browser/resources/settings/on_startup_page/on_startup_page.js
+++ b/chrome/browser/resources/settings/on_startup_page/on_startup_page.js
@@ -5,72 +5,16 @@
 /**
  * @fileoverview
  * 'settings-on-startup-page' is a settings page.
- *
- * Example:
- *
- *    <neon-animated-pages>
- *      <settings-on-startup-page prefs="{{prefs}}">
- *      </settings-on-startup-page>
- *      ... other pages ...
- *    </neon-animated-pages>
  */
 Polymer({
   is: 'settings-on-startup-page',
 
   properties: {
-    prefs: {
-      type: Object,
-      notify: true,
-    },
-
-    /** @private {?NtpExtension} */
-    ntpExtension_: Object,
-
-    /**
-     * Enum values for the 'session.restore_on_startup' preference.
-     * @private {!Object<string, number>}
-     */
-    prefValues_: {
-      readOnly: true,
-      type: Object,
-      value: {
-        CONTINUE: 1,
-        OPEN_NEW_TAB: 5,
-        OPEN_SPECIFIC: 4,
-      },
-    },
-  },
-
-  /** @override */
-  attached: function() {
-    this.getNtpExtension_();
+    prefs: Object,
   },
 
   /** @private */
-  getNtpExtension_: function() {
-    settings.OnStartupBrowserProxyImpl.getInstance().getNtpExtension().then(
-        function(ntpExtension) {
-          this.ntpExtension_ = ntpExtension;
-        }.bind(this));
-  },
-
-  /**
-   * @param {?NtpExtension} ntpExtension
-   * @param {number} restoreOnStartup Value of prefs.session.restore_on_startup.
-   * @return {boolean}
-   * @private
-   */
-  showIndicator_: function(ntpExtension, restoreOnStartup) {
-    return !!ntpExtension && restoreOnStartup == this.prefValues_.OPEN_NEW_TAB;
-  },
-
-  /**
-   * Determine whether to show the user defined startup pages.
-   * @param {number} restoreOnStartup Enum value from prefValues_.
-   * @return {boolean} Whether the open specific pages is selected.
-   * @private
-   */
-  showStartupUrls_: function(restoreOnStartup) {
-    return restoreOnStartup == this.prefValues_.OPEN_SPECIFIC;
+  onManageStartupUrls_: function() {
+    settings.navigateTo(settings.Route.STARTUP_URLS);
   },
 });
diff --git a/chrome/browser/resources/settings/on_startup_page/startup_urls_page.html b/chrome/browser/resources/settings/on_startup_page/startup_urls_page.html
index e66cbb3d..d1f8e9a3 100644
--- a/chrome/browser/resources/settings/on_startup_page/startup_urls_page.html
+++ b/chrome/browser/resources/settings/on_startup_page/startup_urls_page.html
@@ -8,8 +8,11 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/iron-list/iron-list.html">
 <link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html">
 <link rel="import" href="chrome://resources/cr_elements/cr_scrollable_behavior.html">
+<link rel="import" href="../controls/controlled_radio_button.html">
 <link rel="import" href="../controls/extension_controlled_indicator.html">
+<link rel="import" href="../controls/settings_radio_group.html">
 <link rel="import" href="../settings_shared_css.html">
+<link rel="import" href="on_startup_browser_proxy.html">
 <link rel="import" href="startup_url_dialog.html">
 <link rel="import" href="startup_url_entry.html">
 <link rel="import" href="startup_urls_page_browser_proxy.html">
@@ -30,44 +33,79 @@
         cursor: default;
       }
     </style>
-    <div id="outer" class="layout vertical flex vertical-list">
-      <div id="container" class="scroll-container" scrollable>
-        <iron-list items="[[startupPages_]]" scroll-target="container"
-            preserve-focus>
-          <template>
-            <settings-startup-url-entry model="[[item]]"
-                tabindex$="[[tabIndex]]" iron-list-tab-index="[[tabIndex]]"
-                last-focused="{{lastFocused_}}"
-                editable="[[shouldAllowUrlsEdit_(
-                    prefs.session.startup_urls.enforcement)]]">
-            </settings-startup-url-entry>
-          </template>
-        </iron-list>
-      </div>
-      <template is="dom-if" if="[[shouldAllowUrlsEdit_(
-          prefs.session.startup_urls.enforcement)]]" restamp>
-        <div class="list-item" id="addPage">
-          <a is="action-link" class="list-button" on-tap="onAddPageTap_">
-            $i18n{onStartupAddNewPage}
-          </a>
-        </div>
-        <div class="list-item" id="useCurrentPages">
-          <a is="action-link" class="list-button"
-              on-tap="onUseCurrentPagesTap_">
-            $i18n{onStartupUseCurrent}
-          </a>
-        </div>
-      </template>
-      <template is="dom-if" if="[[prefs.session.startup_urls.extensionId]]"
-          restamp>
-        <extension-controlled-indicator
-            extension-id="[[prefs.session.startup_urls.extensionId]]"
-            extension-name="[[prefs.session.startup_urls.controlledByName]]"
-            extension-can-be-disabled="[[
-                prefs.session.startup_urls.extensionCanBeDisabled]]">
-        </extension-controlled-indicator>
-      </template>
+    <div class="settings-box first">
+      <h2>$i18n{onStartupPages}</h2>
     </div>
+    <div class="settings-box first">
+      <div class="start">
+        <settings-radio-group id="onStartupRadioGroup"
+            pref="{{prefs.session.restore_on_startup}}">
+          <controlled-radio-button name="[[prefValues_.OPEN_NEW_TAB]]"
+              pref="[[prefs.session.restore_on_startup]]"
+              label="$i18n{onStartupOpenNewTab}"
+              no-extension-indicator>
+          </controlled-radio-button>
+          <template is="dom-if" if="[[showIndicator_(
+              ntpExtension_, prefs.session.restore_on_startup.value)]]">
+            <extension-controlled-indicator
+                extension-id="[[ntpExtension_.id]]"
+                extension-name="[[ntpExtension_.name]]"
+                extension-can-be-disabled="[[ntpExtension_.canBeDisabled]]"
+                on-extension-disable="getNtpExtension_">
+            </extension-controlled-indicator>
+          </template>
+          <controlled-radio-button name="[[prefValues_.CONTINUE]]"
+              pref="[[prefs.session.restore_on_startup]]"
+              label="$i18n{onStartupContinue}">
+          </controlled-radio-button>
+          <controlled-radio-button name="[[prefValues_.OPEN_SPECIFIC]]"
+              pref="[[prefs.session.restore_on_startup]]"
+              label="$i18n{onStartupOpenSpecific}">
+          </controlled-radio-button>
+        </settings-radio-group>
+      </div>
+    </div>
+    <template is="dom-if"
+        if="[[showStartupUrls_(prefs.session.restore_on_startup.value)]]">
+      <div id="outer" class="layout vertical flex vertical-list">
+        <div id="container" class="scroll-container" scrollable>
+          <iron-list items="[[startupPages_]]" scroll-target="container"
+              preserve-focus>
+            <template>
+              <settings-startup-url-entry model="[[item]]"
+                  tabindex$="[[tabIndex]]" iron-list-tab-index="[[tabIndex]]"
+                  last-focused="{{lastFocused_}}"
+                  editable="[[shouldAllowUrlsEdit_(
+                      prefs.session.startup_urls.enforcement)]]">
+              </settings-startup-url-entry>
+            </template>
+          </iron-list>
+        </div>
+        <template is="dom-if" if="[[shouldAllowUrlsEdit_(
+            prefs.session.startup_urls.enforcement)]]" restamp>
+          <div class="list-item" id="addPage">
+            <a is="action-link" class="list-button" on-tap="onAddPageTap_">
+              $i18n{onStartupAddNewPage}
+            </a>
+          </div>
+          <div class="list-item" id="useCurrentPages">
+            <a is="action-link" class="list-button"
+                on-tap="onUseCurrentPagesTap_">
+              $i18n{onStartupUseCurrent}
+            </a>
+          </div>
+        </template>
+        <template is="dom-if" if="[[prefs.session.startup_urls.extensionId]]"
+            restamp>
+          <extension-controlled-indicator
+              extension-id="[[prefs.session.startup_urls.extensionId]]"
+              extension-name="[[prefs.session.startup_urls.controlledByName]]"
+              extension-can-be-disabled="[[
+                  prefs.session.startup_urls.extensionCanBeDisabled]]">
+          </extension-controlled-indicator>
+        </template>
+      </div>
+    </template>
     <template is="dom-if" if="[[showStartupUrlDialog_]]" restamp>
       <settings-startup-url-dialog model="[[startupUrlDialogModel_]]"
           on-close="destroyUrlDialog_">
diff --git a/chrome/browser/resources/settings/on_startup_page/startup_urls_page.js b/chrome/browser/resources/settings/on_startup_page/startup_urls_page.js
index 38451be..02ab24e 100644
--- a/chrome/browser/resources/settings/on_startup_page/startup_urls_page.js
+++ b/chrome/browser/resources/settings/on_startup_page/startup_urls_page.js
@@ -13,7 +13,10 @@
   behaviors: [CrScrollableBehavior, WebUIListenerBehavior],
 
   properties: {
-    prefs: Object,
+    prefs: {
+      type: Object,
+      notify: true,
+    },
 
     /**
      * Pages to load upon browser startup.
@@ -29,6 +32,23 @@
 
     /** @private {Object}*/
     lastFocused_: Object,
+
+    /** @private {?NtpExtension} */
+    ntpExtension_: Object,
+
+    /**
+     * Enum values for the 'session.restore_on_startup' preference.
+     * @private {!Object<string, number>}
+     */
+    prefValues_: {
+      readOnly: true,
+      type: Object,
+      value: {
+        CONTINUE: 1,
+        OPEN_NEW_TAB: 5,
+        OPEN_SPECIFIC: 4,
+      },
+    },
   },
 
   /** @private {?settings.StartupUrlsPageBrowserProxy} */
@@ -42,6 +62,11 @@
 
   /** @override */
   attached: function() {
+    settings.OnStartupBrowserProxyImpl.getInstance().getNtpExtension().then(
+        function(ntpExtension) {
+          this.ntpExtension_ = ntpExtension;
+        }.bind(this));
+
     this.browserProxy_ = settings.StartupUrlsPageBrowserProxyImpl.getInstance();
     this.addWebUIListener('update-startup-pages', function(startupPages) {
       // If an "edit" URL dialog was open, close it, because the underlying page
@@ -96,4 +121,24 @@
     return this.get('prefs.session.startup_urls.enforcement') !=
         chrome.settingsPrivate.Enforcement.ENFORCED;
   },
+
+  /**
+   * @param {?NtpExtension} ntpExtension
+   * @param {number} restoreOnStartup Value of prefs.session.restore_on_startup.
+   * @return {boolean}
+   * @private
+   */
+  showIndicator_: function(ntpExtension, restoreOnStartup) {
+    return !!ntpExtension && restoreOnStartup == this.prefValues_.OPEN_NEW_TAB;
+  },
+
+  /**
+   * Determine whether to show the user defined startup pages.
+   * @param {number} restoreOnStartup Enum value from prefValues_.
+   * @return {boolean} Whether the open specific pages is selected.
+   * @private
+   */
+  showStartupUrls_: function(restoreOnStartup) {
+    return restoreOnStartup == this.prefValues_.OPEN_SPECIFIC;
+  },
 });
diff --git a/chrome/browser/resources/settings/route.js b/chrome/browser/resources/settings/route.js
index 1d3496b..ed960c6 100644
--- a/chrome/browser/resources/settings/route.js
+++ b/chrome/browser/resources/settings/route.js
@@ -138,6 +138,7 @@
   // </if>
 
   r.ON_STARTUP = r.BASIC.createSection('/onStartup', 'onStartup');
+  r.STARTUP_URLS = r.ON_STARTUP.createChild('/startupUrls');
 
   r.PEOPLE = r.BASIC.createSection('/people', 'people');
   r.SYNC = r.PEOPLE.createChild('/syncSetup');
diff --git a/chrome/browser/safe_browsing/download_protection_service.cc b/chrome/browser/safe_browsing/download_protection_service.cc
index d2764d21..822e3353 100644
--- a/chrome/browser/safe_browsing/download_protection_service.cc
+++ b/chrome/browser/safe_browsing/download_protection_service.cc
@@ -157,6 +157,19 @@
   DOWNLOAD_CHECKS_MAX
 };
 
+void AddEventUrlToReferrerChain(const content::DownloadItem& item,
+                                ReferrerChain* out_referrer_chain) {
+  ReferrerChainEntry* event_url_entry = out_referrer_chain->Add();
+  event_url_entry->set_url(item.GetURL().spec());
+  event_url_entry->set_type(ReferrerChainEntry::EVENT_URL);
+  event_url_entry->set_referrer_url(
+      item.GetWebContents()->GetLastCommittedURL().spec());
+  event_url_entry->set_is_retargeting(false);
+  event_url_entry->set_navigation_time_msec(base::Time::Now().ToJavaTime());
+  for (const GURL& url : item.GetUrlChain())
+    event_url_entry->add_server_redirect_chain()->set_url(url.spec());
+}
+
 }  // namespace
 
 const char DownloadProtectionService::kDownloadRequestUrl[] =
@@ -298,10 +311,9 @@
     if (!item_)
       return;
 
-    item_->SetUserData(
-        kDownloadReferrerChainDataKey,
-        base::MakeUnique<ReferrerChainData>(service_->IdentifyReferrerChain(
-            item_->GetURL(), item_->GetWebContents())));
+    item_->SetUserData(kDownloadReferrerChainDataKey,
+                       base::MakeUnique<ReferrerChainData>(
+                           service_->IdentifyReferrerChain(*item_)));
   }
 
   void UpdateDownloadCheckStats(SBStatsType stat_type) {
@@ -1958,8 +1970,7 @@
 }
 
 std::unique_ptr<ReferrerChain> DownloadProtectionService::IdentifyReferrerChain(
-    const GURL& download_url,
-    content::WebContents* web_contents) {
+    const content::DownloadItem& item) {
   // If navigation_observer_manager_ is null, return immediately. This could
   // happen in tests.
   if (!navigation_observer_manager_)
@@ -1967,6 +1978,7 @@
 
   std::unique_ptr<ReferrerChain> referrer_chain =
       base::MakeUnique<ReferrerChain>();
+  content::WebContents* web_contents = item.GetWebContents();
   int download_tab_id = SessionTabHelper::IdForTab(web_contents);
   UMA_HISTOGRAM_BOOLEAN(
       "SafeBrowsing.ReferrerHasInvalidTabID.DownloadAttribution",
@@ -1974,7 +1986,7 @@
   // We look for the referrer chain that leads to the download url first.
   SafeBrowsingNavigationObserverManager::AttributionResult result =
       navigation_observer_manager_->IdentifyReferrerChainByEventURL(
-          download_url, download_tab_id, kDownloadAttributionUserGestureLimit,
+          item.GetURL(), download_tab_id, kDownloadAttributionUserGestureLimit,
           referrer_chain.get());
 
   // If no navigation event is found, this download is not triggered by regular
@@ -1983,6 +1995,7 @@
   if (result ==
           SafeBrowsingNavigationObserverManager::NAVIGATION_EVENT_NOT_FOUND &&
       web_contents && web_contents->GetLastCommittedURL().is_valid()) {
+    AddEventUrlToReferrerChain(item, referrer_chain.get());
     result = navigation_observer_manager_->IdentifyReferrerChainByWebContents(
         web_contents, kDownloadAttributionUserGestureLimit,
         referrer_chain.get());
diff --git a/chrome/browser/safe_browsing/download_protection_service.h b/chrome/browser/safe_browsing/download_protection_service.h
index a0c6e51..7acc56ef 100644
--- a/chrome/browser/safe_browsing/download_protection_service.h
+++ b/chrome/browser/safe_browsing/download_protection_service.h
@@ -253,6 +253,8 @@
                            PPAPIDownloadRequest_InvalidResponse);
   FRIEND_TEST_ALL_PREFIXES(DownloadProtectionServiceTest,
                            PPAPIDownloadRequest_Timeout);
+  FRIEND_TEST_ALL_PREFIXES(DownloadProtectionServiceTest,
+                           VerifyReferrerChainWithEmptyNavigationHistory);
   FRIEND_TEST_ALL_PREFIXES(DownloadProtectionServiceFlagTest,
                            CheckClientDownloadOverridenByFlag);
 
@@ -300,8 +302,7 @@
   // a download. This function also records UMA stats of download attribution
   // result.
   std::unique_ptr<ReferrerChain> IdentifyReferrerChain(
-    const GURL& download_url,
-    content::WebContents* web_contents);
+      const content::DownloadItem& item);
 
   // If kDownloadAttribution feature is enabled, identify referrer chain of the
   // PPAPI download based on the frame URL where the download is initiated.
diff --git a/chrome/browser/safe_browsing/download_protection_service_unittest.cc b/chrome/browser/safe_browsing/download_protection_service_unittest.cc
index d42213e..0976d6e 100644
--- a/chrome/browser/safe_browsing/download_protection_service_unittest.cc
+++ b/chrome/browser/safe_browsing/download_protection_service_unittest.cc
@@ -50,6 +50,7 @@
 #include "content/public/test/mock_download_item.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "content/public/test/test_utils.h"
+#include "content/public/test/web_contents_tester.h"
 #include "net/base/url_util.h"
 #include "net/cert/x509_certificate.h"
 #include "net/http/http_status_code.h"
@@ -2386,6 +2387,37 @@
   EXPECT_EQ(".sdF", request.alternate_extensions(2));
 }
 
+TEST_F(DownloadProtectionServiceTest,
+       VerifyReferrerChainWithEmptyNavigationHistory) {
+  // Setup a web_contents with "http://example.com" as its last committed url.
+  content::WebContents* web_contents =
+      content::WebContentsTester::CreateTestWebContents(profile_.get(),
+                                                        nullptr);
+  content::WebContentsTester* web_contents_tester =
+      content::WebContentsTester::For(web_contents);
+  web_contents_tester->SetLastCommittedURL(GURL("http://example.com"));
+
+  NiceMockDownloadItem item;
+  PrepareBasicDownloadItem(
+      &item, {"http://referrer.com", "http://www.evil.com/a.exe"},  // url_chain
+      "http://example.com/",                                        // referrer
+      FILE_PATH_LITERAL("a.tmp"),                                   // tmp_path
+      FILE_PATH_LITERAL("a.exe"));  // final_path
+  ON_CALL(item, GetWebContents()).WillByDefault(Return(web_contents));
+
+  std::unique_ptr<ReferrerChain> referrer_chain =
+      download_service_->IdentifyReferrerChain(item);
+
+  ASSERT_EQ(1, referrer_chain->size());
+  EXPECT_EQ(item.GetUrlChain().back(), referrer_chain->Get(0).url());
+  EXPECT_EQ(web_contents->GetLastCommittedURL().spec(),
+            referrer_chain->Get(0).referrer_url());
+  EXPECT_EQ(ReferrerChainEntry::EVENT_URL, referrer_chain->Get(0).type());
+  EXPECT_EQ(static_cast<int>(item.GetUrlChain().size()),
+            referrer_chain->Get(0).server_redirect_chain_size());
+  EXPECT_FALSE(referrer_chain->Get(0).is_retargeting());
+}
+
 // ------------ class DownloadProtectionServiceFlagTest ----------------
 class DownloadProtectionServiceFlagTest : public DownloadProtectionServiceTest {
  protected:
diff --git a/chrome/browser/safe_browsing/safe_browsing_navigation_observer.cc b/chrome/browser/safe_browsing/safe_browsing_navigation_observer.cc
index 1be3c994..d2c47cb 100644
--- a/chrome/browser/safe_browsing/safe_browsing_navigation_observer.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_navigation_observer.cc
@@ -7,10 +7,13 @@
 #include "base/memory/ptr_util.h"
 #include "base/time/time.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.h"
 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
 #include "chrome/browser/sessions/session_tab_helper.h"
+#include "chrome/browser/ui/page_info/page_info_ui.h"
+#include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
@@ -98,7 +101,11 @@
     : content::WebContentsObserver(contents),
       manager_(manager),
       has_user_gesture_(false),
-      last_user_gesture_timestamp_(base::Time()) {}
+      last_user_gesture_timestamp_(base::Time()),
+      content_settings_observer_(this) {
+  content_settings_observer_.Add(HostContentSettingsMapFactory::GetForProfile(
+      Profile::FromBrowserContext(web_contents()->GetBrowserContext())));
+}
 
 SafeBrowsingNavigationObserver::~SafeBrowsingNavigationObserver() {}
 
@@ -256,4 +263,17 @@
       renderer_initiated);
 }
 
+void SafeBrowsingNavigationObserver::OnContentSettingChanged(
+    const ContentSettingsPattern& primary_pattern,
+    const ContentSettingsPattern& secondary_pattern,
+    ContentSettingsType content_type,
+    std::string resource_identifier) {
+  // For all the content settings that can be changed via page info UI, we
+  // assume there is a user gesture associated with the content setting change.
+  if (primary_pattern.Matches(web_contents()->GetLastCommittedURL()) &&
+      PageInfoUI::ContentSettingsTypeInPageInfo(content_type)) {
+    DidGetUserInteraction(blink::WebInputEvent::kMouseDown);
+  }
+}
+
 }  // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/safe_browsing_navigation_observer.h b/chrome/browser/safe_browsing/safe_browsing_navigation_observer.h
index 15030a6..0f80f5e 100644
--- a/chrome/browser/safe_browsing/safe_browsing_navigation_observer.h
+++ b/chrome/browser/safe_browsing/safe_browsing_navigation_observer.h
@@ -5,7 +5,10 @@
 #ifndef CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_NAVIGATION_OBSERVER_H_
 #define CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_NAVIGATION_OBSERVER_H_
 
+#include "base/scoped_observer.h"
 #include "base/supports_user_data.h"
+#include "components/content_settings/core/browser/content_settings_observer.h"
+#include "components/content_settings/core/common/content_settings.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "url/gurl.h"
 
@@ -13,6 +16,8 @@
 class NavigationHandle;
 }
 
+class HostContentSettingsMap;
+
 namespace safe_browsing {
 class SafeBrowsingNavigationObserverManager;
 
@@ -68,7 +73,8 @@
 // Observes the navigation events for a single WebContents (both main-frame
 // and sub-frame navigations).
 class SafeBrowsingNavigationObserver : public base::SupportsUserData::Data,
-                                       public content::WebContentsObserver {
+                                       public content::WebContentsObserver,
+                                       public content_settings::Observer {
  public:
   static void MaybeCreateForWebContents(
       content::WebContents* web_contents);
@@ -83,6 +89,7 @@
   ~SafeBrowsingNavigationObserver() override;
 
  private:
+  FRIEND_TEST_ALL_PREFIXES(SBNavigationObserverTest, TestContentSettingChange);
   typedef std::unordered_map<content::NavigationHandle*,
                              std::unique_ptr<NavigationEvent>>
       NavigationHandleMap;
@@ -107,6 +114,12 @@
                            bool started_from_context_menu,
                            bool renderer_initiated) override;
 
+  // content_settings::Observer overrides.
+  void OnContentSettingChanged(const ContentSettingsPattern& primary_pattern,
+                               const ContentSettingsPattern& secondary_pattern,
+                               ContentSettingsType content_type,
+                               std::string resource_identifier) override;
+
   // Map keyed on NavigationHandle* to keep track of all the ongoing navigation
   // events. NavigationHandle pointers are owned by RenderFrameHost. Since a
   // NavigationHandle object will be destructed after navigation is done,
@@ -121,6 +134,8 @@
   bool has_user_gesture_;
 
   base::Time last_user_gesture_timestamp_;
+  ScopedObserver<HostContentSettingsMap, content_settings::Observer>
+      content_settings_observer_;
 
   DISALLOW_COPY_AND_ASSIGN(SafeBrowsingNavigationObserver);
 };
diff --git a/chrome/browser/safe_browsing/safe_browsing_navigation_observer_unittest.cc b/chrome/browser/safe_browsing/safe_browsing_navigation_observer_unittest.cc
index 1a51004c..ef5f3ab 100644
--- a/chrome/browser/safe_browsing/safe_browsing_navigation_observer_unittest.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_navigation_observer_unittest.cc
@@ -347,4 +347,33 @@
   EXPECT_EQ("9.9.9.9", host_to_ip_map()->at(host_1).at(0).ip);
 }
 
+TEST_F(SBNavigationObserverTest, TestContentSettingChange) {
+  user_gesture_map()->clear();
+  ASSERT_EQ(0U, user_gesture_map()->size());
+
+  content::WebContents* web_content =
+      browser()->tab_strip_model()->GetWebContentsAt(0);
+
+  // Simulate content setting change via page info UI.
+  navigation_observer_->OnContentSettingChanged(
+      ContentSettingsPattern::FromURL(web_content->GetLastCommittedURL()),
+      ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
+      std::string());
+
+  // A user gesture should be recorded.
+  ASSERT_EQ(1U, user_gesture_map()->size());
+  EXPECT_NE(user_gesture_map()->end(), user_gesture_map()->find(web_content));
+
+  user_gesture_map()->clear();
+  ASSERT_EQ(0U, user_gesture_map()->size());
+
+  // Simulate content setting change that cannot be changed via page info UI.
+  navigation_observer_->OnContentSettingChanged(
+      ContentSettingsPattern::FromURL(web_content->GetLastCommittedURL()),
+      ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_SITE_ENGAGEMENT,
+      std::string());
+  // No user gesture should be recorded.
+  EXPECT_EQ(0U, user_gesture_map()->size());
+}
+
 }  // namespace safe_browsing
diff --git a/chrome/browser/sessions/session_data_deleter.cc b/chrome/browser/sessions/session_data_deleter.cc
index 72af6aa..e4b2d263 100644
--- a/chrome/browser/sessions/session_data_deleter.cc
+++ b/chrome/browser/sessions/session_data_deleter.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include <stddef.h>
+#include <stdint.h>
 
 #include "base/bind.h"
 #include "base/command_line.h"
@@ -26,8 +27,8 @@
 
 namespace {
 
-void CookieDeleted(int num_cookies_deleted) {
-  DCHECK_EQ(1, num_cookies_deleted);
+void CookieDeleted(uint32_t num_cookies_deleted) {
+  DCHECK_EQ(1u, num_cookies_deleted);
 }
 
 class SessionDataDeleter
@@ -59,7 +60,7 @@
 
   // Called when all session-only cookies have been deleted.
   void DeleteSessionCookiesDone(net::CookieStore* cookie_store,
-                                int num_deleted);
+                                uint32_t num_deleted);
 
   // Deletes the cookies in |cookies| that are for origins which are
   // session-only.
@@ -134,7 +135,7 @@
 
 void SessionDataDeleter::DeleteSessionCookiesDone(
     net::CookieStore* cookie_store,
-    int num_deleted) {
+    uint32_t num_deleted) {
   // If these callbacks are invoked, |cookie_store| is gauranteed to still
   // exist, since deleting the CookieStore will cancel pending callbacks.
   cookie_store->GetAllCookiesAsync(
diff --git a/chrome/browser/subresource_filter/subresource_filter_browsertest.cc b/chrome/browser/subresource_filter/subresource_filter_browsertest.cc
index bbd058e..0e3c700 100644
--- a/chrome/browser/subresource_filter/subresource_filter_browsertest.cc
+++ b/chrome/browser/subresource_filter/subresource_filter_browsertest.cc
@@ -16,9 +16,11 @@
 #include "base/memory/ptr_util.h"
 #include "base/path_service.h"
 #include "base/strings/pattern.h"
+#include "base/strings/string16.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
+#include "base/strings/utf_string_conversions.h"
 #include "base/test/histogram_tester.h"
 #include "base/test/simple_test_clock.h"
 #include "chrome/browser/browser_process.h"
@@ -69,6 +71,7 @@
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/browser_side_navigation_policy.h"
+#include "content/public/common/content_features.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/common/referrer.h"
 #include "content/public/test/browser_test_utils.h"
@@ -212,12 +215,13 @@
 
  protected:
   void SetUpCommandLine(base::CommandLine* command_line) override {
-    command_line->AppendSwitchASCII(
-        switches::kEnableFeatures,
-        base::JoinString(
-            {kSafeBrowsingSubresourceFilter.name, "SafeBrowsingV4OnlyEnabled",
-             kSafeBrowsingSubresourceFilterExperimentalUI.name},
-            ","));
+    command_line->AppendSwitchASCII(switches::kEnableFeatures,
+                                    base::JoinString(RequiredFeatures(), ","));
+  }
+
+  std::vector<base::StringPiece> RequiredFeatures() const {
+    return {kSafeBrowsingSubresourceFilter.name, "SafeBrowsingV4OnlyEnabled",
+            kSafeBrowsingSubresourceFilterExperimentalUI.name};
   }
 
   void SetUp() override {
@@ -469,6 +473,41 @@
   std::unique_ptr<net::SpawnedTestServer> websocket_test_server_;
 };
 
+enum class OffMainThreadFetchPolicy {
+  kEnabled,
+  kDisabled,
+};
+
+class SubresourceFilterWorkerFetchBrowserTest
+    : public SubresourceFilterBrowserTest,
+      public ::testing::WithParamInterface<OffMainThreadFetchPolicy> {
+ public:
+  SubresourceFilterWorkerFetchBrowserTest() {}
+  ~SubresourceFilterWorkerFetchBrowserTest() override {}
+
+ protected:
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    std::vector<base::StringPiece> features =
+        SubresourceFilterBrowserTest::RequiredFeatures();
+    if (GetParam() == OffMainThreadFetchPolicy::kEnabled) {
+      features.push_back(features::kOffMainThreadFetch.name);
+    } else {
+      command_line->AppendSwitchASCII(switches::kDisableFeatures,
+                                      features::kOffMainThreadFetch.name);
+    }
+    command_line->AppendSwitchASCII(switches::kEnableFeatures,
+                                    base::JoinString(features, ","));
+  }
+
+  void ClearTitle() {
+    ASSERT_TRUE(content::ExecuteScript(web_contents()->GetMainFrame(),
+                                       "document.title = \"\";"));
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(SubresourceFilterWorkerFetchBrowserTest);
+};
+
 // Tests -----------------------------------------------------------------------
 
 IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest, MainFrameActivation) {
@@ -1401,6 +1440,52 @@
     ::testing::Values(WebSocketCreationPolicy::IN_WORKER,
                       WebSocketCreationPolicy::IN_MAIN_FRAME));
 
+IN_PROC_BROWSER_TEST_P(SubresourceFilterWorkerFetchBrowserTest, WorkerFetch) {
+  const base::string16 fetch_succeeded_title =
+      base::ASCIIToUTF16("FetchSucceeded");
+  const base::string16 fetch_failed_title = base::ASCIIToUTF16("FetchFailed");
+  GURL url(GetTestUrl("subresource_filter/worker_fetch.html"));
+  ConfigureAsPhishingURL(url);
+
+  ASSERT_NO_FATAL_FAILURE(SetRulesetToDisallowURLsWithPathSuffix(
+      "suffix-that-does-not-match-anything"));
+  {
+    content::TitleWatcher title_watcher(
+        browser()->tab_strip_model()->GetActiveWebContents(),
+        fetch_succeeded_title);
+    title_watcher.AlsoWaitForTitle(fetch_failed_title);
+    ui_test_utils::NavigateToURL(browser(), url);
+    EXPECT_EQ(fetch_succeeded_title, title_watcher.WaitAndGetTitle());
+  }
+  ClearTitle();
+  ASSERT_NO_FATAL_FAILURE(
+      SetRulesetToDisallowURLsWithPathSuffix("worker_fetch_data.txt"));
+  {
+    content::TitleWatcher title_watcher(
+        browser()->tab_strip_model()->GetActiveWebContents(),
+        fetch_succeeded_title);
+    title_watcher.AlsoWaitForTitle(fetch_failed_title);
+    ui_test_utils::NavigateToURL(browser(), url);
+    EXPECT_EQ(fetch_failed_title, title_watcher.WaitAndGetTitle());
+  }
+  ClearTitle();
+  // The main frame document should never be filtered.
+  SetRulesetToDisallowURLsWithPathSuffix("worker_fetch.html");
+  {
+    content::TitleWatcher title_watcher(
+        browser()->tab_strip_model()->GetActiveWebContents(),
+        fetch_succeeded_title);
+    title_watcher.AlsoWaitForTitle(fetch_failed_title);
+    ui_test_utils::NavigateToURL(browser(), url);
+    EXPECT_EQ(fetch_succeeded_title, title_watcher.WaitAndGetTitle());
+  }
+}
+
+INSTANTIATE_TEST_CASE_P(/* no prefix */,
+                        SubresourceFilterWorkerFetchBrowserTest,
+                        ::testing::Values(OffMainThreadFetchPolicy::kEnabled,
+                                          OffMainThreadFetchPolicy::kDisabled));
+
 // Tests checking how histograms are recorded. ---------------------------------
 
 namespace {
diff --git a/chrome/browser/task_manager/providers/arc/arc_process_filter.cc b/chrome/browser/task_manager/providers/arc/arc_process_filter.cc
index c7e3bc72..0d0202ba 100644
--- a/chrome/browser/task_manager/providers/arc/arc_process_filter.cc
+++ b/chrome/browser/task_manager/providers/arc/arc_process_filter.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "base/logging.h"
 #include "components/arc/common/process.mojom.h"
 
 namespace task_manager {
@@ -35,14 +36,32 @@
   // ProcessState::TOP: Process is hosting the current top activities
   // ProcessState::IMPORTANT_FOREGROUND: Process is important to the user
   // ProcessState::TOP_SLEEPING: Same as TOP, but while the device is sleeping
+  // ProcessState::LAST_ACTIVITY: The last activity - see crbug.com/738651.
+  // ProcessState::FOREGROUND_SERVICE: Foreground service - in Android, the user
+  //   is made aware of these via a notification.
   switch (process.process_state()) {
     case arc::mojom::ProcessState::TOP:  // Fallthrough.
     case arc::mojom::ProcessState::IMPORTANT_FOREGROUND:
     case arc::mojom::ProcessState::TOP_SLEEPING:
+    case arc::mojom::ProcessState::LAST_ACTIVITY:
+    case arc::mojom::ProcessState::FOREGROUND_SERVICE:
       return true;
-    default:
-      break;
+    case arc::mojom::ProcessState::NONEXISTENT:  // Fallthrough.
+    case arc::mojom::ProcessState::PERSISTENT:
+    case arc::mojom::ProcessState::PERSISTENT_UI:
+    case arc::mojom::ProcessState::BOUND_FOREGROUND_SERVICE:
+    case arc::mojom::ProcessState::IMPORTANT_BACKGROUND:
+    case arc::mojom::ProcessState::BACKUP:
+    case arc::mojom::ProcessState::HEAVY_WEIGHT:
+    case arc::mojom::ProcessState::SERVICE:
+    case arc::mojom::ProcessState::RECEIVER:
+    case arc::mojom::ProcessState::HOME:
+    case arc::mojom::ProcessState::CACHED_ACTIVITY:
+    case arc::mojom::ProcessState::CACHED_ACTIVITY_CLIENT:
+    case arc::mojom::ProcessState::CACHED_EMPTY:
+      return false;
   }
+  NOTREACHED();
   return false;
 }
 
diff --git a/chrome/browser/task_manager/providers/arc/arc_process_filter.h b/chrome/browser/task_manager/providers/arc/arc_process_filter.h
index d1f1d89..8b0b9932 100644
--- a/chrome/browser/task_manager/providers/arc/arc_process_filter.h
+++ b/chrome/browser/task_manager/providers/arc/arc_process_filter.h
@@ -8,6 +8,7 @@
 #include <set>
 #include <string>
 
+#include "base/macros.h"
 #include "chrome/browser/chromeos/arc/process/arc_process.h"
 
 namespace task_manager {
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index f535d5c9e..c137a8fd 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -2374,8 +2374,6 @@
       "webui/offline/offline_internals_ui.h",
       "webui/offline/offline_internals_ui_message_handler.cc",
       "webui/offline/offline_internals_ui_message_handler.h",
-      "webui/popular_sites_internals_ui.cc",
-      "webui/popular_sites_internals_ui.h",
       "webui/snippets_internals_message_handler.cc",
       "webui/snippets_internals_message_handler.h",
       "webui/snippets_internals_ui.cc",
diff --git a/chrome/browser/ui/page_info/page_info_ui.cc b/chrome/browser/ui/page_info/page_info_ui.cc
index 524be75..ac53c088 100644
--- a/chrome/browser/ui/page_info/page_info_ui.cc
+++ b/chrome/browser/ui/page_info/page_info_ui.cc
@@ -451,3 +451,12 @@
   return base::CommandLine::ForCurrentProcess()->HasSwitch(
       switches::kShowCertLink);
 }
+
+// static
+bool PageInfoUI::ContentSettingsTypeInPageInfo(ContentSettingsType type) {
+  for (const PermissionsUIInfo& info : kPermissionsUIInfo) {
+    if (info.type == type)
+      return true;
+  }
+  return false;
+}
diff --git a/chrome/browser/ui/page_info/page_info_ui.h b/chrome/browser/ui/page_info/page_info_ui.h
index 8e69da1e..4c85e88 100644
--- a/chrome/browser/ui/page_info/page_info_ui.h
+++ b/chrome/browser/ui/page_info/page_info_ui.h
@@ -195,6 +195,9 @@
   // Returns true if the Certificate Viewer link should be shown.
   static bool ShouldShowCertificateLink();
 
+  // Return true if the given ContentSettingsType is in PageInfoUI.
+  static bool ContentSettingsTypeInPageInfo(ContentSettingsType type);
+
   // Sets cookie information.
   virtual void SetCookieInfo(const CookieInfoList& cookie_info_list) = 0;
 
diff --git a/chrome/browser/ui/views/frame/browser_window_property_manager_browsertest_win.cc b/chrome/browser/ui/views/frame/browser_window_property_manager_browsertest_win.cc
index 79aa8d6..8a6bfcfb 100644
--- a/chrome/browser/ui/views/frame/browser_window_property_manager_browsertest_win.cc
+++ b/chrome/browser/ui/views/frame/browser_window_property_manager_browsertest_win.cc
@@ -248,5 +248,6 @@
   ASSERT_TRUE(app_browser != browser());
 
   WaitAndValidateBrowserWindowProperties(
-      base::Bind(&ValidateHostedAppWindowProperties, app_browser, extension));
+      base::Bind(&ValidateHostedAppWindowProperties, app_browser,
+                 base::RetainedRef(extension)));
 }
diff --git a/chrome/browser/ui/webui/OWNERS b/chrome/browser/ui/webui/OWNERS
index 731bdc43..909e06d 100644
--- a/chrome/browser/ui/webui/OWNERS
+++ b/chrome/browser/ui/webui/OWNERS
@@ -12,7 +12,6 @@
 
 per-file snippets_internals*=file://components/ntp_snippets/OWNERS
 per-file ntp_tiles_internals_ui.*=file://components/ntp_tiles/OWNERS
-per-file popular_sites_internals_ui.*=file://components/ntp_tiles/OWNERS
 per-file net_export_ui.*=file://net/OWNERS
 
 # Maintaining ownership from this file's original Chrome OS location.
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
index baced5d..2e1dd19 100644
--- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
+++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -112,7 +112,6 @@
 
 #if defined(OS_ANDROID)
 #include "chrome/browser/ui/webui/offline/offline_internals_ui.h"
-#include "chrome/browser/ui/webui/popular_sites_internals_ui.h"
 #include "chrome/browser/ui/webui/snippets_internals_ui.h"
 #include "chrome/browser/ui/webui/webapks_ui.h"
 #else
@@ -495,8 +494,6 @@
 #if defined(OS_ANDROID)
   if (url.host_piece() == chrome::kChromeUIOfflineInternalsHost)
     return &NewWebUI<OfflineInternalsUI>;
-  if (url.host_piece() == chrome::kChromeUIPopularSitesInternalsHost)
-    return &NewWebUI<PopularSitesInternalsUI>;
   if (url.host_piece() == chrome::kChromeUISnippetsInternalsHost &&
       !profile->IsOffTheRecord())
     return &NewWebUI<SnippetsInternalsUI>;
diff --git a/chrome/browser/ui/webui/popular_sites_internals_ui.cc b/chrome/browser/ui/webui/popular_sites_internals_ui.cc
deleted file mode 100644
index 88e0779..0000000
--- a/chrome/browser/ui/webui/popular_sites_internals_ui.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/webui/popular_sites_internals_ui.h"
-
-#include "base/memory/ptr_util.h"
-#include "chrome/browser/ntp_tiles/chrome_popular_sites_factory.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/common/url_constants.h"
-#include "components/grit/components_resources.h"
-#include "components/ntp_tiles/popular_sites.h"
-#include "components/ntp_tiles/webui/popular_sites_internals_message_handler.h"
-#include "components/ntp_tiles/webui/popular_sites_internals_message_handler_client.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/web_ui.h"
-#include "content/public/browser/web_ui_data_source.h"
-#include "content/public/browser/web_ui_message_handler.h"
-
-namespace {
-
-// The implementation for the chrome://popular-sites-internals page.
-class ChromePopularSitesInternalsMessageHandlerBridge
-    : public content::WebUIMessageHandler,
-      public ntp_tiles::PopularSitesInternalsMessageHandlerClient {
- public:
-  ChromePopularSitesInternalsMessageHandlerBridge() : handler_(this) {}
-
- private:
-  // content::WebUIMessageHandler:
-  void RegisterMessages() override;
-
-  // ntp_tiles::PopularSitesInternalsMessageHandlerClient
-  std::unique_ptr<ntp_tiles::PopularSites> MakePopularSites() override;
-  PrefService* GetPrefs() override;
-  void RegisterMessageCallback(
-      const std::string& message,
-      const base::Callback<void(const base::ListValue*)>& callback) override;
-  void CallJavascriptFunctionVector(
-      const std::string& name,
-      const std::vector<const base::Value*>& values) override;
-
-  ntp_tiles::PopularSitesInternalsMessageHandler handler_;
-
-  DISALLOW_COPY_AND_ASSIGN(ChromePopularSitesInternalsMessageHandlerBridge);
-};
-
-void ChromePopularSitesInternalsMessageHandlerBridge::RegisterMessages() {
-  handler_.RegisterMessages();
-}
-
-std::unique_ptr<ntp_tiles::PopularSites>
-ChromePopularSitesInternalsMessageHandlerBridge::MakePopularSites() {
-  return ChromePopularSitesFactory::NewForProfile(Profile::FromWebUI(web_ui()));
-}
-
-PrefService* ChromePopularSitesInternalsMessageHandlerBridge::GetPrefs() {
-  return Profile::FromWebUI(web_ui())->GetPrefs();
-}
-
-void ChromePopularSitesInternalsMessageHandlerBridge::RegisterMessageCallback(
-    const std::string& message,
-    const base::Callback<void(const base::ListValue*)>& callback) {
-  web_ui()->RegisterMessageCallback(message, callback);
-}
-
-void ChromePopularSitesInternalsMessageHandlerBridge::
-    CallJavascriptFunctionVector(
-        const std::string& name,
-        const std::vector<const base::Value*>& values) {
-  web_ui()->CallJavascriptFunctionUnsafe(name, values);
-}
-
-}  // namespace
-
-content::WebUIDataSource* CreatePopularSitesInternalsHTMLSource() {
-  content::WebUIDataSource* source = content::WebUIDataSource::Create(
-      chrome::kChromeUIPopularSitesInternalsHost);
-
-  source->AddResourcePath("popular_sites_internals.js",
-                          IDR_POPULAR_SITES_INTERNALS_JS);
-  source->AddResourcePath("popular_sites_internals.css",
-                          IDR_POPULAR_SITES_INTERNALS_CSS);
-  source->SetDefaultResource(IDR_POPULAR_SITES_INTERNALS_HTML);
-  return source;
-}
-
-PopularSitesInternalsUI::PopularSitesInternalsUI(content::WebUI* web_ui)
-    : WebUIController(web_ui) {
-  content::WebUIDataSource::Add(Profile::FromWebUI(web_ui),
-                                CreatePopularSitesInternalsHTMLSource());
-  web_ui->AddMessageHandler(
-      base::MakeUnique<ChromePopularSitesInternalsMessageHandlerBridge>());
-}
-
-PopularSitesInternalsUI::~PopularSitesInternalsUI() {}
diff --git a/chrome/browser/ui/webui/popular_sites_internals_ui.h b/chrome/browser/ui/webui/popular_sites_internals_ui.h
deleted file mode 100644
index 89955366..0000000
--- a/chrome/browser/ui/webui/popular_sites_internals_ui.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_WEBUI_POPULAR_SITES_INTERNALS_UI_H_
-#define CHROME_BROWSER_UI_WEBUI_POPULAR_SITES_INTERNALS_UI_H_
-
-#include "base/macros.h"
-#include "content/public/browser/web_ui_controller.h"
-
-// The implementation for the chrome://popular-sites-internals page.
-class PopularSitesInternalsUI : public content::WebUIController {
- public:
-  explicit PopularSitesInternalsUI(content::WebUI* web_ui);
-  ~PopularSitesInternalsUI() override;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(PopularSitesInternalsUI);
-};
-
-#endif  // CHROME_BROWSER_UI_WEBUI_POPULAR_SITES_INTERNALS_UI_H_
diff --git a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
index 5c9dce3..d43ee64 100644
--- a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
@@ -1186,6 +1186,9 @@
 void AddOnStartupStrings(content::WebUIDataSource* html_source) {
   LocalizedString localized_strings[] = {
       {"onStartup", IDS_SETTINGS_ON_STARTUP},
+      {"onStartupDescription", IDS_SETTINGS_ON_STARTUP_DESCRIPTION},
+      {"onStartupManage", IDS_SETTINGS_ON_STARTUP_MANAGE},
+      {"onStartupPages", IDS_SETTINGS_ON_STARTUP_PAGES},
       {"onStartupOpenNewTab", IDS_SETTINGS_ON_STARTUP_OPEN_NEW_TAB},
       {"onStartupContinue", IDS_SETTINGS_ON_STARTUP_CONTINUE},
       {"onStartupOpenSpecific", IDS_SETTINGS_ON_STARTUP_OPEN_SPECIFIC},
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index 1b66b34..5c046f4 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -270,6 +270,9 @@
 #endif
 #endif  // BUILDFLAG(ENABLE_NATIVE_NOTIFICATIONS)
 
+const base::Feature kNetworkPrediction{"NetworkPrediction",
+                                       base::FEATURE_ENABLED_BY_DEFAULT};
+
 // If enabled, the list of content suggestions on the New Tab page will contain
 // pages that the user downloaded for later use.
 const base::Feature kOfflinePageDownloadSuggestionsFeature{
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
index f96568db..2c1caeea 100644
--- a/chrome/common/chrome_features.h
+++ b/chrome/common/chrome_features.h
@@ -137,6 +137,8 @@
 extern const base::Feature kNativeNotifications;
 #endif
 
+extern const base::Feature kNetworkPrediction;
+
 extern const base::Feature kOfflinePageDownloadSuggestionsFeature;
 
 #if !defined(OS_ANDROID)
diff --git a/chrome/common/url_constants.cc b/chrome/common/url_constants.cc
index 5303894..56aad7b3 100644
--- a/chrome/common/url_constants.cc
+++ b/chrome/common/url_constants.cc
@@ -294,7 +294,6 @@
 const char kChromeUIContextualSearchPromoHost[] = "contextual-search-promo";
 const char kChromeUIOfflineInternalsHost[] = "offline-internals";
 const char kChromeUIPhysicalWebDiagnosticsHost[] = "physical-web-diagnostics";
-const char kChromeUIPopularSitesInternalsHost[] = "popular-sites-internals";
 const char kChromeUISnippetsInternalsHost[] = "snippets-internals";
 const char kChromeUIWebApksHost[] = "webapks";
 #endif
@@ -715,7 +714,6 @@
 #if defined(OS_ANDROID)
     kChromeUINetExportHost,
     kChromeUIOfflineInternalsHost,
-    kChromeUIPopularSitesInternalsHost,
     kChromeUISnippetsInternalsHost,
     kChromeUIWebApksHost,
 #endif
diff --git a/chrome/common/url_constants.h b/chrome/common/url_constants.h
index 38e1188..9ba18fdc 100644
--- a/chrome/common/url_constants.h
+++ b/chrome/common/url_constants.h
@@ -278,7 +278,6 @@
 extern const char kChromeUIContextualSearchPromoHost[];
 extern const char kChromeUIOfflineInternalsURL[];
 extern const char kChromeUIPhysicalWebDiagnosticsHost[];
-extern const char kChromeUIPopularSitesInternalsHost[];
 extern const char kChromeUISnippetsInternalsHost[];
 extern const char kChromeUIWebApksHost[];
 #endif
diff --git a/chrome/gpu/BUILD.gn b/chrome/gpu/BUILD.gn
index ee90a75..93bdd8a 100644
--- a/chrome/gpu/BUILD.gn
+++ b/chrome/gpu/BUILD.gn
@@ -25,6 +25,8 @@
       "chrome_arc_video_decode_accelerator.h",
       "gpu_arc_video_decode_accelerator.cc",
       "gpu_arc_video_decode_accelerator.h",
+      "gpu_arc_video_encode_accelerator.cc",
+      "gpu_arc_video_encode_accelerator.h",
     ]
   }
 }
diff --git a/chrome/gpu/DEPS b/chrome/gpu/DEPS
index c076b70..094dd23 100644
--- a/chrome/gpu/DEPS
+++ b/chrome/gpu/DEPS
@@ -7,6 +7,7 @@
   "+content/public/gpu",
   "+media/video",
   "+media/base/video_frame.h",
+  "+media/base/video_types.h",
   "+media/gpu",
   "+mojo/edk/embedder",
   "+services/service_manager/public/cpp",
diff --git a/chrome/gpu/chrome_content_gpu_client.cc b/chrome/gpu/chrome_content_gpu_client.cc
index 05cfc43f..e5815dd 100644
--- a/chrome/gpu/chrome_content_gpu_client.cc
+++ b/chrome/gpu/chrome_content_gpu_client.cc
@@ -21,6 +21,7 @@
 
 #if defined(OS_CHROMEOS)
 #include "chrome/gpu/gpu_arc_video_decode_accelerator.h"
+#include "chrome/gpu/gpu_arc_video_encode_accelerator.h"
 #include "content/public/common/service_manager_connection.h"
 #include "services/service_manager/public/cpp/binder_registry.h"
 #endif
@@ -68,6 +69,10 @@
       base::Bind(&ChromeContentGpuClient::CreateArcVideoDecodeAccelerator,
                  base::Unretained(this)),
       base::ThreadTaskRunnerHandle::Get());
+  registry->AddInterface(
+      base::Bind(&ChromeContentGpuClient::CreateArcVideoEncodeAccelerator,
+                 base::Unretained(this)),
+      base::ThreadTaskRunnerHandle::Get());
 #endif
 }
 
@@ -95,4 +100,12 @@
       std::move(request));
 }
 
+void ChromeContentGpuClient::CreateArcVideoEncodeAccelerator(
+    const service_manager::BindSourceInfo& source_info,
+    ::arc::mojom::VideoEncodeAcceleratorRequest request) {
+  mojo::MakeStrongBinding(
+      base::MakeUnique<chromeos::arc::GpuArcVideoEncodeAccelerator>(
+          gpu_preferences_),
+      std::move(request));
+}
 #endif
diff --git a/chrome/gpu/chrome_content_gpu_client.h b/chrome/gpu/chrome_content_gpu_client.h
index 768f3a7..f3e9e89d 100644
--- a/chrome/gpu/chrome_content_gpu_client.h
+++ b/chrome/gpu/chrome_content_gpu_client.h
@@ -13,7 +13,9 @@
 #include "content/public/gpu/content_gpu_client.h"
 
 #if defined(OS_CHROMEOS)
-#include "chrome/gpu/gpu_arc_video_decode_accelerator.h"
+#include "components/arc/common/video_decode_accelerator.mojom.h"
+#include "components/arc/common/video_encode_accelerator.mojom.h"
+#include "gpu/command_buffer/service/gpu_preferences.h"
 
 namespace service_manager {
 struct BindSourceInfo;
@@ -37,6 +39,10 @@
   void CreateArcVideoDecodeAccelerator(
       const service_manager::BindSourceInfo& source_info,
       ::arc::mojom::VideoDecodeAcceleratorRequest request);
+
+  void CreateArcVideoEncodeAccelerator(
+      const service_manager::BindSourceInfo& source_info,
+      ::arc::mojom::VideoEncodeAcceleratorRequest request);
 #endif
 
   std::unique_ptr<variations::ChildProcessFieldTrialSyncer> field_trial_syncer_;
diff --git a/chrome/gpu/gpu_arc_video_encode_accelerator.cc b/chrome/gpu/gpu_arc_video_encode_accelerator.cc
new file mode 100644
index 0000000..192f5942a
--- /dev/null
+++ b/chrome/gpu/gpu_arc_video_encode_accelerator.cc
@@ -0,0 +1,218 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/gpu/gpu_arc_video_encode_accelerator.h"
+
+#include <utility>
+
+#include "base/logging.h"
+#include "base/sys_info.h"
+#include "media/base/video_types.h"
+#include "media/gpu/gpu_video_encode_accelerator_factory.h"
+#include "mojo/public/cpp/bindings/strong_binding.h"
+#include "mojo/public/cpp/bindings/type_converter.h"
+#include "mojo/public/cpp/system/platform_handle.h"
+
+#define DVLOGF(x) DVLOG(x) << __func__ << "(): "
+
+namespace chromeos {
+namespace arc {
+
+GpuArcVideoEncodeAccelerator::GpuArcVideoEncodeAccelerator(
+    const gpu::GpuPreferences& gpu_preferences)
+    : gpu_preferences_(gpu_preferences) {}
+
+GpuArcVideoEncodeAccelerator::~GpuArcVideoEncodeAccelerator() = default;
+
+// VideoEncodeAccelerator::Client implementation.
+void GpuArcVideoEncodeAccelerator::RequireBitstreamBuffers(
+    unsigned int input_count,
+    const gfx::Size& coded_size,
+    size_t output_buffer_size) {
+  DVLOGF(2) << "input_count=" << input_count
+            << ", coded_size=" << coded_size.ToString()
+            << ", output_buffer_size=" << output_buffer_size;
+  DCHECK(client_);
+  coded_size_ = coded_size;
+  client_->RequireBitstreamBuffers(input_count, coded_size, output_buffer_size);
+}
+
+void GpuArcVideoEncodeAccelerator::BitstreamBufferReady(
+    int32_t bitstream_buffer_id,
+    size_t payload_size,
+    bool key_frame,
+    base::TimeDelta timestamp) {
+  DVLOGF(2) << "id=" << bitstream_buffer_id;
+  DCHECK(client_);
+  client_->BitstreamBufferReady(bitstream_buffer_id, payload_size, key_frame,
+                                timestamp.InMicroseconds());
+}
+
+void GpuArcVideoEncodeAccelerator::NotifyError(Error error) {
+  DVLOGF(2) << "error=" << error;
+  DCHECK(client_);
+  client_->NotifyError(error);
+}
+
+// ::arc::mojom::VideoEncodeAccelerator implementation.
+void GpuArcVideoEncodeAccelerator::GetSupportedProfiles(
+    const GetSupportedProfilesCallback& callback) {
+  callback.Run(media::GpuVideoEncodeAcceleratorFactory::GetSupportedProfiles(
+      gpu_preferences_));
+}
+
+void GpuArcVideoEncodeAccelerator::Initialize(
+    VideoPixelFormat input_format,
+    const gfx::Size& visible_size,
+    VideoEncodeAccelerator::StorageType input_storage,
+    VideoCodecProfile output_profile,
+    uint32_t initial_bitrate,
+    VideoEncodeClientPtr client,
+    const InitializeCallback& callback) {
+  DVLOGF(2) << "visible_size=" << visible_size.ToString()
+            << ", profile=" << output_profile;
+
+  input_pixel_format_ = input_format;
+  visible_size_ = visible_size;
+  accelerator_ = media::GpuVideoEncodeAcceleratorFactory::CreateVEA(
+      input_pixel_format_, visible_size_, output_profile, initial_bitrate, this,
+      gpu_preferences_);
+  if (accelerator_ == nullptr) {
+    DLOG(ERROR) << "Failed to create a VideoEncodeAccelerator.";
+    callback.Run(false);
+    return;
+  }
+  client_ = std::move(client);
+  callback.Run(true);
+}
+
+static void DropSharedMemory(std::unique_ptr<base::SharedMemory> shm) {
+  // Just let |shm| fall out of scope.
+}
+
+void GpuArcVideoEncodeAccelerator::Encode(
+    mojo::ScopedHandle handle,
+    std::vector<::arc::VideoFramePlane> planes,
+    int64_t timestamp,
+    bool force_keyframe) {
+  DVLOGF(2) << "timestamp=" << timestamp;
+  if (!accelerator_) {
+    DLOG(ERROR) << "Accelerator is not initialized.";
+    return;
+  }
+
+  if (planes.empty()) {  // EOS
+    accelerator_->Encode(media::VideoFrame::CreateEOSFrame(), force_keyframe);
+    return;
+  }
+
+  base::ScopedFD fd = UnwrapFdFromMojoHandle(std::move(handle));
+  if (!fd.is_valid())
+    return;
+
+  size_t allocation_size =
+      media::VideoFrame::AllocationSize(input_pixel_format_, coded_size_);
+
+  // TODO(rockot): Pass GUIDs through Mojo. https://crbug.com/713763.
+  // TODO(rockot): This fd comes from a mojo::ScopedHandle in
+  // GpuArcVideoService::BindSharedMemory. That should be passed through,
+  // rather than pulling out the fd. https://crbug.com/713763.
+  // TODO(rockot): Pass through a real size rather than |0|.
+  base::UnguessableToken guid = base::UnguessableToken::Create();
+  base::SharedMemoryHandle shm_handle(base::FileDescriptor(fd.release(), true),
+                                      0u, guid);
+  auto shm = base::MakeUnique<base::SharedMemory>(shm_handle, true);
+
+  base::CheckedNumeric<off_t> map_offset = planes[0].offset;
+  base::CheckedNumeric<size_t> map_size = allocation_size;
+  const uint32_t aligned_offset =
+      planes[0].offset % base::SysInfo::VMAllocationGranularity();
+  map_offset -= aligned_offset;
+  map_size += aligned_offset;
+
+  if (!map_offset.IsValid() || !map_size.IsValid()) {
+    DLOG(ERROR) << "Invalid map_offset or map_size";
+    client_->NotifyError(Error::kInvalidArgumentError);
+    return;
+  }
+  if (!shm->MapAt(map_offset.ValueOrDie(), map_size.ValueOrDie())) {
+    DLOG(ERROR) << "Failed to map memory.";
+    client_->NotifyError(Error::kPlatformFailureError);
+    return;
+  }
+
+  uint8_t* shm_memory = reinterpret_cast<uint8_t*>(shm->memory());
+  auto frame = media::VideoFrame::WrapExternalSharedMemory(
+      input_pixel_format_, coded_size_, gfx::Rect(visible_size_), visible_size_,
+      shm_memory + aligned_offset, allocation_size, shm_handle,
+      planes[0].offset, base::TimeDelta::FromMicroseconds(timestamp));
+
+  // Wrap |shm| in a callback and add it as a destruction observer, so it
+  // stays alive and mapped until |frame| goes out of scope.
+  frame->AddDestructionObserver(
+      base::Bind(&DropSharedMemory, base::Passed(&shm)));
+  accelerator_->Encode(frame, force_keyframe);
+}
+
+void GpuArcVideoEncodeAccelerator::UseOutputBitstreamBuffer(
+    int32_t bitstream_buffer_id,
+    mojo::ScopedHandle shmem_fd,
+    uint32_t offset,
+    uint32_t size) {
+  DVLOGF(2) << "id=" << bitstream_buffer_id;
+  if (!accelerator_) {
+    DLOG(ERROR) << "Accelerator is not initialized.";
+    return;
+  }
+
+  base::ScopedFD fd = UnwrapFdFromMojoHandle(std::move(shmem_fd));
+  if (!fd.is_valid())
+    return;
+
+  // TODO(rockot): Pass GUIDs through Mojo. https://crbug.com/713763.
+  // TODO(rockot): This fd comes from a mojo::ScopedHandle in
+  // GpuArcVideoService::BindSharedMemory. That should be passed through,
+  // rather than pulling out the fd. https://crbug.com/713763.
+  // TODO(rockot): Pass through a real size rather than |0|.
+  base::UnguessableToken guid = base::UnguessableToken::Create();
+  base::SharedMemoryHandle shm_handle(base::FileDescriptor(fd.release(), true),
+                                      0u, guid);
+  accelerator_->UseOutputBitstreamBuffer(
+      media::BitstreamBuffer(bitstream_buffer_id, shm_handle, size, offset));
+}
+
+void GpuArcVideoEncodeAccelerator::RequestEncodingParametersChange(
+    uint32_t bitrate,
+    uint32_t framerate) {
+  DVLOGF(2) << "bitrate=" << bitrate << ", framerate=" << framerate;
+  if (!accelerator_) {
+    DLOG(ERROR) << "Accelerator is not initialized.";
+    return;
+  }
+  accelerator_->RequestEncodingParametersChange(bitrate, framerate);
+}
+
+base::ScopedFD GpuArcVideoEncodeAccelerator::UnwrapFdFromMojoHandle(
+    mojo::ScopedHandle handle) {
+  DCHECK(client_);
+  if (!handle.is_valid()) {
+    DLOG(ERROR) << "handle is invalid.";
+    client_->NotifyError(Error::kInvalidArgumentError);
+    return base::ScopedFD();
+  }
+
+  base::PlatformFile platform_file;
+  MojoResult mojo_result =
+      mojo::UnwrapPlatformFile(std::move(handle), &platform_file);
+  if (mojo_result != MOJO_RESULT_OK) {
+    DLOG(ERROR) << "UnwrapPlatformFile failed: " << mojo_result;
+    client_->NotifyError(Error::kPlatformFailureError);
+    return base::ScopedFD();
+  }
+
+  return base::ScopedFD(platform_file);
+}
+
+}  // namespace arc
+}  // namespace chromeos
diff --git a/chrome/gpu/gpu_arc_video_encode_accelerator.h b/chrome/gpu/gpu_arc_video_encode_accelerator.h
new file mode 100644
index 0000000..f388d94
--- /dev/null
+++ b/chrome/gpu/gpu_arc_video_encode_accelerator.h
@@ -0,0 +1,86 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_GPU_GPU_ARC_VIDEO_ENCODE_ACCELERATOR_H_
+#define CHROME_GPU_GPU_ARC_VIDEO_ENCODE_ACCELERATOR_H_
+
+#include <memory>
+#include <vector>
+
+#include "base/files/scoped_file.h"
+#include "base/macros.h"
+#include "components/arc/common/video_encode_accelerator.mojom.h"
+#include "components/arc/video_accelerator/video_accelerator.h"
+#include "gpu/command_buffer/service/gpu_preferences.h"
+#include "media/video/video_encode_accelerator.h"
+
+namespace chromeos {
+namespace arc {
+
+// GpuArcVideoEncodeAccelerator manages life-cycle and IPC message translation
+// for media::VideoEncodeAccelerator.
+class GpuArcVideoEncodeAccelerator
+    : public ::arc::mojom::VideoEncodeAccelerator,
+      public media::VideoEncodeAccelerator::Client {
+ public:
+  explicit GpuArcVideoEncodeAccelerator(
+      const gpu::GpuPreferences& gpu_preferences);
+  ~GpuArcVideoEncodeAccelerator() override;
+
+ private:
+  using VideoPixelFormat = media::VideoPixelFormat;
+  using VideoCodecProfile = media::VideoCodecProfile;
+  using Error = media::VideoEncodeAccelerator::Error;
+  using VideoEncodeClientPtr = ::arc::mojom::VideoEncodeClientPtr;
+
+  // VideoEncodeAccelerator::Client implementation.
+  void RequireBitstreamBuffers(unsigned int input_count,
+                               const gfx::Size& input_coded_size,
+                               size_t output_buffer_size) override;
+  void BitstreamBufferReady(int32_t bitstream_buffer_id,
+                            size_t payload_size,
+                            bool key_frame,
+                            base::TimeDelta timestamp) override;
+  void NotifyError(Error error) override;
+
+  // ::arc::mojom::VideoEncodeAccelerator implementation.
+  void GetSupportedProfiles(
+      const GetSupportedProfilesCallback& callback) override;
+  void Initialize(VideoPixelFormat input_format,
+                  const gfx::Size& visible_size,
+                  VideoEncodeAccelerator::StorageType input_storage,
+                  VideoCodecProfile output_profile,
+                  uint32_t initial_bitrate,
+                  VideoEncodeClientPtr client,
+                  const InitializeCallback& callback) override;
+  void Encode(mojo::ScopedHandle fd,
+              std::vector<::arc::VideoFramePlane> planes,
+              int64_t timestamp,
+              bool force_keyframe) override;
+  void UseOutputBitstreamBuffer(int32_t bitstream_buffer_id,
+                                mojo::ScopedHandle shmem_fd,
+                                uint32_t offset,
+                                uint32_t size) override;
+  void RequestEncodingParametersChange(uint32_t bitrate,
+                                       uint32_t framerate) override;
+
+  // Unwraps a file descriptor from the given mojo::ScopedHandle.
+  // If an error is encountered, it returns an invalid base::ScopedFD and
+  // notifies client about the error via VideoEncodeClient::NotifyError.
+  base::ScopedFD UnwrapFdFromMojoHandle(mojo::ScopedHandle handle);
+
+  gpu::GpuPreferences gpu_preferences_;
+  std::unique_ptr<media::VideoEncodeAccelerator> accelerator_;
+  ::arc::mojom::VideoEncodeClientPtr client_;
+  gfx::Size coded_size_;
+  gfx::Size visible_size_;
+  VideoPixelFormat input_pixel_format_;
+
+  DISALLOW_COPY_AND_ASSIGN(GpuArcVideoEncodeAccelerator);
+};
+
+}  // namespace arc
+}  // namespace chromeos
+
+#endif  // CHROME_GPU_GPU_ARC_VIDEO_ENCODE_ACCELERATOR_H_
diff --git a/chrome/installer/linux/BUILD.gn b/chrome/installer/linux/BUILD.gn
index 292e1e4d..315f8b6 100644
--- a/chrome/installer/linux/BUILD.gn
+++ b/chrome/installer/linux/BUILD.gn
@@ -190,6 +190,14 @@
   if (!is_chromeos) {
     public_deps += [ ":rpm_packaging_files" ]
   }
+
+  # TODO(thomasanderson): Move this variable into a .gni file
+  # somewhere.  It is currently copied from
+  # buildtools/third_party/libc++/BUILD.gn.
+  libcpp_is_static = !is_component_build && !using_sanitizer
+  if (!libcpp_is_static && use_custom_libcxx) {
+    public_deps += [ "//buildtools/third_party/libc++:libc++" ]
+  }
 }
 
 # Creates .deb and .rpm (RPM for non-ChromeOS only) installer packages.
diff --git a/chrome/renderer/resources/extensions/browser_action_custom_bindings.js b/chrome/renderer/resources/extensions/browser_action_custom_bindings.js
index 4b6ce09a..e844f734 100644
--- a/chrome/renderer/resources/extensions/browser_action_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/browser_action_custom_bindings.js
@@ -11,7 +11,12 @@
 var sendRequest = bindingUtil ?
     $Function.bind(bindingUtil.sendRequest, bindingUtil) :
     require('sendRequest').sendRequest;
-var lastError = require('lastError');
+
+var jsLastError = bindingUtil ? undefined : require('lastError');
+function hasLastError() {
+  return bindingUtil ?
+      bindingUtil.hasLastError() : jsLastError.hasError(chrome);
+}
 
 binding.registerCustomHook(function(bindingsAPI) {
   var apiFunctions = bindingsAPI.apiFunctions;
@@ -30,7 +35,7 @@
     if (!callback)
       return;
 
-    if (lastError.hasError(chrome)) {
+    if (hasLastError()) {
       callback();
     } else {
       var views = getExtensionViews(-1, -1, 'POPUP');
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 22226b8..3a190b1a 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -3151,6 +3151,7 @@
     "../browser/metrics/chrome_browser_main_extra_parts_metrics_unittest.cc",
     "../browser/metrics/chrome_metrics_service_accessor_unittest.cc",
     "../browser/metrics/perf/perf_provider_chromeos_unittest.cc",
+    "../browser/metrics/process_memory_metrics_emitter_unittest.cc",
     "../browser/metrics/subprocess_metrics_provider_unittest.cc",
     "../browser/metrics/thread_watcher_android_unittest.cc",
     "../browser/metrics/thread_watcher_unittest.cc",
@@ -3775,6 +3776,7 @@
       "../browser/media/router/discovery/dial/dial_media_sink_service_proxy_unittest.cc",
       "../browser/media/router/discovery/dial/dial_registry_unittest.cc",
       "../browser/media/router/discovery/dial/dial_service_unittest.cc",
+      "../browser/media/router/discovery/mdns/cast_media_sink_service_unittest.cc",
       "../browser/media/router/discovery/mdns/dns_sd_registry_unittest.cc",
       "../browser/media/router/discovery/media_sink_service_base_unittest.cc",
       "../browser/media/router/event_page_request_manager_unittest.cc",
diff --git a/chrome/test/base/in_process_browser_test.cc b/chrome/test/base/in_process_browser_test.cc
index 27328e5..7f4fc2a 100644
--- a/chrome/test/base/in_process_browser_test.cc
+++ b/chrome/test/base/in_process_browser_test.cc
@@ -41,6 +41,7 @@
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/common/chrome_constants.h"
+#include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/features.h"
@@ -192,11 +193,6 @@
   // Browser tests will create their own g_browser_process later.
   DCHECK(!g_browser_process);
 
-  // Clear the FeatureList instance from base/test/test_suite.cc. Since this is
-  // a browser test, a FeatureList will be registered as part of normal browser
-  // start up in ChromeBrowserMainParts::SetupMetricsAndFieldTrials().
-  base::FeatureList::ClearInstanceForTesting();
-
   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
 
   // Auto-reload breaks many browser tests, which assume error pages won't be
@@ -205,6 +201,10 @@
   // here.
   command_line->AppendSwitch(switches::kDisableOfflineAutoReload);
 
+  // Turn off preconnects because they break the brittle python webserver;
+  // see http://crbug.com/60035.
+  scoped_feature_list_.InitAndDisableFeature(features::kNetworkPrediction);
+
   // Allow subclasses to change the command line before running any tests.
   SetUpCommandLine(command_line);
   // Add command line arguments that are used by all InProcessBrowserTests.
diff --git a/chrome/test/base/in_process_browser_test.h b/chrome/test/base/in_process_browser_test.h
index 69cf984..5a59a27 100644
--- a/chrome/test/base/in_process_browser_test.h
+++ b/chrome/test/base/in_process_browser_test.h
@@ -10,6 +10,7 @@
 #include "base/compiler_specific.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/memory/ref_counted.h"
+#include "base/test/scoped_feature_list.h"
 #include "build/build_config.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/browser_test.h"
@@ -266,6 +267,8 @@
   // We use hardcoded quota settings to have a consistent testing environment.
   storage::QuotaSettings quota_settings_;
 
+  base::test::ScopedFeatureList scoped_feature_list_;
+
 #if defined(OS_MACOSX)
   base::mac::ScopedNSAutoreleasePool* autorelease_pool_;
   std::unique_ptr<ScopedBundleSwizzlerMac> bundle_swizzler_;
diff --git a/chrome/test/base/test_launcher_utils.cc b/chrome/test/base/test_launcher_utils.cc
index 7dd5f92..ea6d614 100644
--- a/chrome/test/base/test_launcher_utils.cc
+++ b/chrome/test/base/test_launcher_utils.cc
@@ -26,11 +26,6 @@
 namespace test_launcher_utils {
 
 void PrepareBrowserCommandLineForTests(base::CommandLine* command_line) {
-  // Turn off preconnects because they break the brittle python webserver;
-  // see http://crbug.com/60035.
-  command_line->AppendSwitchASCII(switches::kDisableFeatures,
-                                  "NetworkPrediction");
-
   // Don't show the first run ui.
   command_line->AppendSwitch(switches::kNoFirstRun);
 
diff --git a/chrome/test/base/tracing_browsertest.cc b/chrome/test/base/tracing_browsertest.cc
index eae1cd38..5347d14 100644
--- a/chrome/test/base/tracing_browsertest.cc
+++ b/chrome/test/base/tracing_browsertest.cc
@@ -101,7 +101,13 @@
   }
 };
 
-IN_PROC_BROWSER_TEST_F(TracingBrowserTest, TestMemoryInfra) {
+// crbug.com/708487.
+#if defined(OS_MACOSX) && defined(ADDRESS_SANITIZER)
+#define MAYBE_TestMemoryInfra DISABLED_TestMemoryInfra
+#else
+#define MAYBE_TestMemoryInfra TestMemoryInfra
+#endif  // defined(OS_MACOSX) && defined(ADDRESS_SANITIZER)
+IN_PROC_BROWSER_TEST_F(TracingBrowserTest, MAYBE_TestMemoryInfra) {
   PerformDumpMemoryTestActions(
       base::trace_event::TraceConfig(
           base::trace_event::TraceConfigMemoryTestUtil::
diff --git a/chrome/test/data/subresource_filter/worker_fetch.html b/chrome/test/data/subresource_filter/worker_fetch.html
new file mode 100644
index 0000000..4560a02
--- /dev/null
+++ b/chrome/test/data/subresource_filter/worker_fetch.html
@@ -0,0 +1,4 @@
+<script>
+var worker = new Worker('./worker_fetch.js');
+worker.onmessage = event => { document.title = event.data; };
+</script>
diff --git a/chrome/test/data/subresource_filter/worker_fetch.js b/chrome/test/data/subresource_filter/worker_fetch.js
new file mode 100644
index 0000000..31c6d39
--- /dev/null
+++ b/chrome/test/data/subresource_filter/worker_fetch.js
@@ -0,0 +1,7 @@
+// 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.
+
+fetch('./worker_fetch_data.txt')
+  .then(_ => postMessage('FetchSucceeded'),
+        _ => postMessage('FetchFailed'));
diff --git a/chrome/test/data/subresource_filter/worker_fetch_data.txt b/chrome/test/data/subresource_filter/worker_fetch_data.txt
new file mode 100644
index 0000000..d424ff1
--- /dev/null
+++ b/chrome/test/data/subresource_filter/worker_fetch_data.txt
@@ -0,0 +1 @@
+dummy data
diff --git a/chrome/test/data/webui/settings/android_apps_page_test.js b/chrome/test/data/webui/settings/android_apps_page_test.js
index 53ef87f..84dab47 100644
--- a/chrome/test/data/webui/settings/android_apps_page_test.js
+++ b/chrome/test/data/webui/settings/android_apps_page_test.js
@@ -98,7 +98,7 @@
       assertTrue(!subpage.$$('settings-android-settings-element'));
     });
 
-    test('ManageAppsOpenReqest', function() {
+    test('ManageAppsOpenRequest', function() {
       setAndroidAppsState(true, true);
       var button = subpage.$$('settings-android-settings-element').
           $$('#manageApps');
@@ -178,7 +178,7 @@
           $$("#manageApps"));
     });
 
-    test('ManageAppsOpenReqest', function() {
+    test('ManageAppsOpenRequest', function() {
       var button = androidAppsPage.$$('settings-android-settings-element').
           $$('#manageApps');
       assertTrue(!!button);
diff --git a/chrome/test/data/webui/settings/on_startup_browsertest.js b/chrome/test/data/webui/settings/on_startup_browsertest.js
index f026de8a0..b9cb0c4 100644
--- a/chrome/test/data/webui/settings/on_startup_browsertest.js
+++ b/chrome/test/data/webui/settings/on_startup_browsertest.js
@@ -7,16 +7,6 @@
 GEN_INCLUDE(['settings_page_browsertest.js']);
 
 /**
-  * Radio button enum values for restore on startup.
-  * @enum
-  */
-var RestoreOnStartupEnum = {
-  CONTINUE: 1,
-  OPEN_NEW_TAB: 5,
-  OPEN_SPECIFIC: 4,
-};
-
-/**
  * Test Polymer On Startup Settings elements.
  * @constructor
  * @extends {SettingsPageBrowserTest}
@@ -39,45 +29,19 @@
 };
 
 TEST_F('OnStartupSettingsBrowserTest', 'uiTests', function() {
-  /**
-   * The prefs API that will get a fake implementation.
-   * @type {!SettingsPrivate}
-   */
-  var settingsPrefs;
   var self = this;
 
-  var restoreOnStartup = function() {
-    return self.getPageElement('#onStartupRadioGroup').querySelector(
-        '.iron-selected').label;
-  };
-
   suite('OnStartupHandler', function() {
     suiteSetup(function() {
       self.basicPage.set('pageVisibility.onStartup', true);
-      Polymer.dom.flush();
-
-      settingsPrefs = document.querySelector('settings-ui').$$(
-          'settings-prefs');
-      assertTrue(!!settingsPrefs);
-      return CrSettingsPrefs.initialized;
     });
 
-    test('open-continue', function() {
-      settingsPrefs.set('prefs.session.restore_on_startup.value',
-          RestoreOnStartupEnum.CONTINUE);
-      assertEquals('Continue where you left off', restoreOnStartup());
-    });
-
-    test('open-ntp', function() {
-      settingsPrefs.set('prefs.session.restore_on_startup.value',
-          RestoreOnStartupEnum.OPEN_NEW_TAB);
-      assertEquals('Open the New Tab page', restoreOnStartup());
-    });
-
-    test('open-specific', function() {
-      settingsPrefs.set('prefs.session.restore_on_startup.value',
-          RestoreOnStartupEnum.OPEN_SPECIFIC);
-      assertEquals('Open a specific page or set of pages', restoreOnStartup());
+    test('ManageStartupUrls', function() {
+      /* Test that the manage startup urls button is present on the basic page.
+       */
+      var manageButton =
+          self.getPageElement('#manage-startup-urls-subpage-trigger');
+      assertTrue(!!manageButton);
     });
   });
   mocha.run();
diff --git a/chrome/test/data/webui/settings/search_engines_page_test.js b/chrome/test/data/webui/settings/search_engines_page_test.js
index 5eb5020..ef05e5c1 100644
--- a/chrome/test/data/webui/settings/search_engines_page_test.js
+++ b/chrome/test/data/webui/settings/search_engines_page_test.js
@@ -104,7 +104,7 @@
           browserProxy.resetResolver('validateSearchEngineInput');
           inputElement.fire('input');
           return inputElement.value != '' ?
-              // Expeting validation only on non-empty values.
+              // Expecting validation only on non-empty values.
               browserProxy.whenCalled('validateSearchEngineInput') :
               Promise.resolve();
         };
diff --git a/chrome/test/data/webui/settings/startup_urls_page_test.js b/chrome/test/data/webui/settings/startup_urls_page_test.js
index fa2aec6..df53358 100644
--- a/chrome/test/data/webui/settings/startup_urls_page_test.js
+++ b/chrome/test/data/webui/settings/startup_urls_page_test.js
@@ -148,7 +148,7 @@
     });
 
     /**
-     * Tests that the appropritae browser proxy method is called when the action
+     * Tests that the appropriate browser proxy method is called when the action
      * button is tapped.
      * @param {string} proxyMethodName
      */
@@ -202,6 +202,16 @@
   });
 
   suite('StartupUrlsPage', function() {
+    /**
+     * Radio button enum values for restore on startup.
+     * @enum
+     */
+    var RestoreOnStartupEnum = {
+      CONTINUE: 1,
+      OPEN_NEW_TAB: 5,
+      OPEN_SPECIFIC: 4,
+    };
+
     /** @type {?SettingsStartupUrlsPageElement} */
     var page = null;
 
@@ -231,7 +241,39 @@
       return browserProxy.whenCalled('loadStartupPages');
     });
 
+    function restoreOnStartupLabel() {
+      return page.$$('#onStartupRadioGroup')
+          .querySelector('.iron-selected')
+          .label;
+    }
+
+    test('open-continue', function() {
+      page.set(
+          'prefs.session.restore_on_startup.value',
+          RestoreOnStartupEnum.CONTINUE);
+      assertEquals('Continue where you left off', restoreOnStartupLabel());
+    });
+
+    test('open-ntp', function() {
+      page.set(
+          'prefs.session.restore_on_startup.value',
+          RestoreOnStartupEnum.OPEN_NEW_TAB);
+      assertEquals('Open the New Tab page', restoreOnStartupLabel());
+    });
+
+    test('open-specific', function() {
+      page.set(
+          'prefs.session.restore_on_startup.value',
+          RestoreOnStartupEnum.OPEN_SPECIFIC);
+      assertEquals(
+          'Open a specific page or set of pages', restoreOnStartupLabel());
+    });
+
     test('UseCurrentPages', function() {
+      page.set(
+          'prefs.session.restore_on_startup.value',
+          RestoreOnStartupEnum.OPEN_SPECIFIC);
+      Polymer.dom.flush();
       var useCurrentPagesButton = page.$$('#useCurrentPages > a');
       assertTrue(!!useCurrentPagesButton);
       MockInteractions.tap(useCurrentPagesButton);
@@ -239,6 +281,10 @@
     });
 
     test('AddPage_OpensDialog', function() {
+      page.set(
+          'prefs.session.restore_on_startup.value',
+          RestoreOnStartupEnum.OPEN_SPECIFIC);
+      Polymer.dom.flush();
       var addPageButton = page.$$('#addPage > a');
       assertTrue(!!addPageButton);
       assertFalse(!!page.$$('settings-startup-url-dialog'));
@@ -284,7 +330,11 @@
       assertFalse(!!page.$$('settings-startup-url-dialog'));
     });
 
-    test('StarupPages_WhenExtensionControlled', function() {
+    test('StartupPages_WhenExtensionControlled', function() {
+      page.set(
+          'prefs.session.restore_on_startup.value',
+          RestoreOnStartupEnum.OPEN_SPECIFIC);
+      Polymer.dom.flush();
       assertFalse(!!page.get('prefs.session.startup_urls.controlledBy'));
       assertFalse(!!page.$$('extension-controlled-indicator'));
       assertTrue(!!page.$$('#addPage'));
diff --git a/components/arc/arc_session_runner.cc b/components/arc/arc_session_runner.cc
index c9af993..e08cfa6 100644
--- a/components/arc/arc_session_runner.cc
+++ b/components/arc/arc_session_runner.cc
@@ -228,12 +228,10 @@
   // safe place to start the container for login screen.
   DCHECK(!arc_session_);
   DCHECK_EQ(state_, State::STOPPED);
-
-  // TODO(yusukes): Once Chrome OS side is ready, uncomment the following:
-  // arc_session_ = factory_.Run();
-  // arc_session_->AddObserver(this);
-  // state_ = State::STARTING_FOR_LOGIN_SCREEN;
-  // arc_session_->StartForLoginScreen();
+  arc_session_ = factory_.Run();
+  arc_session_->AddObserver(this);
+  state_ = State::STARTING_FOR_LOGIN_SCREEN;
+  arc_session_->StartForLoginScreen();
 }
 
 }  // namespace arc
diff --git a/components/arc/arc_session_runner_unittest.cc b/components/arc/arc_session_runner_unittest.cc
index 144d0b0b..f8f9cc4 100644
--- a/components/arc/arc_session_runner_unittest.cc
+++ b/components/arc/arc_session_runner_unittest.cc
@@ -189,7 +189,7 @@
 // Does the same with the mini instance for login screen.
 // TODO(yusukes): Enable the test once EmitLoginPromptVisibleCalled() is fully
 // enabled.
-TEST_F(ArcSessionRunnerTest, DISABLED_BootFailureForLoginScreen) {
+TEST_F(ArcSessionRunnerTest, BootFailureForLoginScreen) {
   ResetArcSessionFactory(
       base::Bind(&ArcSessionRunnerTest::CreateBootFailureArcSession,
                  ArcStopReason::CRASH));
@@ -214,7 +214,7 @@
 // is called.
 // TODO(yusukes): Enable the test once EmitLoginPromptVisibleCalled() is fully
 // enabled.
-TEST_F(ArcSessionRunnerTest, DISABLED_StartWithLoginScreenInstance) {
+TEST_F(ArcSessionRunnerTest, StartWithLoginScreenInstance) {
   EXPECT_TRUE(arc_session_runner()->IsStopped());
 
   chromeos::DBusThreadManager::Get()
diff --git a/components/arc/common/typemaps.gni b/components/arc/common/typemaps.gni
index f43f9fa..32ca073c 100644
--- a/components/arc/common/typemaps.gni
+++ b/components/arc/common/typemaps.gni
@@ -10,5 +10,6 @@
   "//components/arc/common/ime.typemap",
   "//components/arc/common/intent_helper.typemap",
   "//components/arc/common/video_common.typemap",
+  "//components/arc/common/video_encode_accelerator.typemap",
   "//components/arc/common/volume_mounter.typemap",
 ]
diff --git a/components/arc/common/video_encode_accelerator.typemap b/components/arc/common/video_encode_accelerator.typemap
new file mode 100644
index 0000000..61b8db22
--- /dev/null
+++ b/components/arc/common/video_encode_accelerator.typemap
@@ -0,0 +1,19 @@
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+mojom = "//components/arc/common/video_encode_accelerator.mojom"
+public_headers = [ "//media/video/video_encode_accelerator.h" ]
+public_deps = [
+  "//media",
+]
+traits_headers = [ "//components/arc/video_accelerator/video_encode_accelerator_struct_traits.h" ]
+sources = [
+  "//components/arc/video_accelerator/video_encode_accelerator_struct_traits.cc",
+]
+type_mappings = [
+  "arc.mojom.VideoEncodeAccelerator.Error=media::VideoEncodeAccelerator::Error",
+  "arc.mojom.VideoPixelFormat=media::VideoPixelFormat",
+  "arc.mojom.VideoCodecProfile=media::VideoCodecProfile",
+  "arc.mojom.VideoEncodeProfile=media::VideoEncodeAccelerator::SupportedProfile",
+]
diff --git a/components/arc/video_accelerator/DEPS b/components/arc/video_accelerator/DEPS
new file mode 100644
index 0000000..04dd5ab
--- /dev/null
+++ b/components/arc/video_accelerator/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+media/video/video_encode_accelerator.h",
+]
diff --git a/components/arc/video_accelerator/video_encode_accelerator_struct_traits.cc b/components/arc/video_accelerator/video_encode_accelerator_struct_traits.cc
new file mode 100644
index 0000000..32a5737
--- /dev/null
+++ b/components/arc/video_accelerator/video_encode_accelerator_struct_traits.cc
@@ -0,0 +1,163 @@
+// 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/arc/video_accelerator/video_encode_accelerator_struct_traits.h"
+
+namespace mojo {
+
+// Make sure values in arc::mojom::VideoEncodeAccelerator::Error and
+// media::VideoEncodeAccelerator::Error match.
+#define CHECK_ERROR_ENUM(value)                                             \
+  static_assert(                                                            \
+      static_cast<int>(arc::mojom::VideoEncodeAccelerator::Error::value) == \
+          media::VideoEncodeAccelerator::Error::value,                      \
+      "enum ##value mismatch")
+
+CHECK_ERROR_ENUM(kIllegalStateError);
+CHECK_ERROR_ENUM(kInvalidArgumentError);
+CHECK_ERROR_ENUM(kPlatformFailureError);
+CHECK_ERROR_ENUM(kErrorMax);
+
+#undef CHECK_ERROR_ENUM
+
+// static
+arc::mojom::VideoEncodeAccelerator::Error
+EnumTraits<arc::mojom::VideoEncodeAccelerator::Error,
+           media::VideoEncodeAccelerator::Error>::
+    ToMojom(media::VideoEncodeAccelerator::Error input) {
+  return static_cast<arc::mojom::VideoEncodeAccelerator::Error>(input);
+}
+
+// static
+bool EnumTraits<arc::mojom::VideoEncodeAccelerator::Error,
+                media::VideoEncodeAccelerator::Error>::
+    FromMojom(arc::mojom::VideoEncodeAccelerator::Error input,
+              media::VideoEncodeAccelerator::Error* output) {
+  NOTIMPLEMENTED();
+  return false;
+}
+
+// Make sure values in arc::mojom::VideoPixelFormat match to the values in
+// media::VideoPixelFormat. The former is a subset of the later.
+#define CHECK_PIXEL_FORMAT_ENUM(value)                                       \
+  static_assert(                                                             \
+      static_cast<int>(arc::mojom::VideoPixelFormat::value) == media::value, \
+      "enum ##value mismatch")
+
+CHECK_PIXEL_FORMAT_ENUM(PIXEL_FORMAT_I420);
+
+#undef CHECK_PXIEL_FORMAT_ENUM
+
+// static
+arc::mojom::VideoPixelFormat
+EnumTraits<arc::mojom::VideoPixelFormat, media::VideoPixelFormat>::ToMojom(
+    media::VideoPixelFormat input) {
+  NOTIMPLEMENTED();
+  return arc::mojom::VideoPixelFormat::PIXEL_FORMAT_I420;
+}
+
+// static
+bool EnumTraits<arc::mojom::VideoPixelFormat, media::VideoPixelFormat>::
+    FromMojom(arc::mojom::VideoPixelFormat input,
+              media::VideoPixelFormat* output) {
+  switch (input) {
+    case arc::mojom::VideoPixelFormat::PIXEL_FORMAT_I420:
+      *output = static_cast<media::VideoPixelFormat>(input);
+      return true;
+    default:
+      DLOG(ERROR) << "Unknown VideoPixelFormat: " << input;
+      return false;
+  }
+}
+
+// Make sure values in arc::mojom::VideoCodecProfile match to the values in
+// media::VideoCodecProfile.
+#define CHECK_PROFILE_ENUM(value)                                             \
+  static_assert(                                                              \
+      static_cast<int>(arc::mojom::VideoCodecProfile::value) == media::value, \
+      "enum ##value mismatch")
+
+CHECK_PROFILE_ENUM(VIDEO_CODEC_PROFILE_UNKNOWN);
+CHECK_PROFILE_ENUM(VIDEO_CODEC_PROFILE_MIN);
+CHECK_PROFILE_ENUM(H264PROFILE_MIN);
+CHECK_PROFILE_ENUM(H264PROFILE_BASELINE);
+CHECK_PROFILE_ENUM(H264PROFILE_MAIN);
+CHECK_PROFILE_ENUM(H264PROFILE_EXTENDED);
+CHECK_PROFILE_ENUM(H264PROFILE_HIGH);
+CHECK_PROFILE_ENUM(H264PROFILE_HIGH10PROFILE);
+CHECK_PROFILE_ENUM(H264PROFILE_HIGH422PROFILE);
+CHECK_PROFILE_ENUM(H264PROFILE_HIGH444PREDICTIVEPROFILE);
+CHECK_PROFILE_ENUM(H264PROFILE_SCALABLEBASELINE);
+CHECK_PROFILE_ENUM(H264PROFILE_SCALABLEHIGH);
+CHECK_PROFILE_ENUM(H264PROFILE_STEREOHIGH);
+CHECK_PROFILE_ENUM(H264PROFILE_MULTIVIEWHIGH);
+CHECK_PROFILE_ENUM(H264PROFILE_MAX);
+CHECK_PROFILE_ENUM(VP8PROFILE_MIN);
+CHECK_PROFILE_ENUM(VP8PROFILE_ANY);
+CHECK_PROFILE_ENUM(VP8PROFILE_MAX);
+CHECK_PROFILE_ENUM(VP9PROFILE_MIN);
+CHECK_PROFILE_ENUM(VP9PROFILE_PROFILE0);
+CHECK_PROFILE_ENUM(VP9PROFILE_PROFILE1);
+CHECK_PROFILE_ENUM(VP9PROFILE_PROFILE2);
+CHECK_PROFILE_ENUM(VP9PROFILE_PROFILE3);
+CHECK_PROFILE_ENUM(VP9PROFILE_MAX);
+CHECK_PROFILE_ENUM(HEVCPROFILE_MIN);
+CHECK_PROFILE_ENUM(HEVCPROFILE_MAIN);
+CHECK_PROFILE_ENUM(HEVCPROFILE_MAIN10);
+CHECK_PROFILE_ENUM(HEVCPROFILE_MAIN_STILL_PICTURE);
+CHECK_PROFILE_ENUM(HEVCPROFILE_MAX);
+CHECK_PROFILE_ENUM(DOLBYVISION_MIN);
+CHECK_PROFILE_ENUM(DOLBYVISION_PROFILE0);
+CHECK_PROFILE_ENUM(DOLBYVISION_PROFILE4);
+CHECK_PROFILE_ENUM(DOLBYVISION_PROFILE5);
+CHECK_PROFILE_ENUM(DOLBYVISION_PROFILE7);
+CHECK_PROFILE_ENUM(DOLBYVISION_MAX);
+CHECK_PROFILE_ENUM(VIDEO_CODEC_PROFILE_MAX);
+
+#undef CHECK_PROFILE_ENUM
+
+// static
+arc::mojom::VideoCodecProfile
+EnumTraits<arc::mojom::VideoCodecProfile, media::VideoCodecProfile>::ToMojom(
+    media::VideoCodecProfile input) {
+  return static_cast<arc::mojom::VideoCodecProfile>(input);
+}
+
+// static
+bool EnumTraits<arc::mojom::VideoCodecProfile, media::VideoCodecProfile>::
+    FromMojom(arc::mojom::VideoCodecProfile input,
+              media::VideoCodecProfile* output) {
+  switch (input) {
+    case arc::mojom::VideoCodecProfile::VIDEO_CODEC_PROFILE_UNKNOWN:
+    case arc::mojom::VideoCodecProfile::H264PROFILE_BASELINE:
+    case arc::mojom::VideoCodecProfile::H264PROFILE_MAIN:
+    case arc::mojom::VideoCodecProfile::H264PROFILE_EXTENDED:
+    case arc::mojom::VideoCodecProfile::H264PROFILE_HIGH:
+    case arc::mojom::VideoCodecProfile::H264PROFILE_HIGH10PROFILE:
+    case arc::mojom::VideoCodecProfile::H264PROFILE_HIGH422PROFILE:
+    case arc::mojom::VideoCodecProfile::H264PROFILE_HIGH444PREDICTIVEPROFILE:
+    case arc::mojom::VideoCodecProfile::H264PROFILE_SCALABLEBASELINE:
+    case arc::mojom::VideoCodecProfile::H264PROFILE_SCALABLEHIGH:
+    case arc::mojom::VideoCodecProfile::H264PROFILE_STEREOHIGH:
+    case arc::mojom::VideoCodecProfile::H264PROFILE_MULTIVIEWHIGH:
+    case arc::mojom::VideoCodecProfile::VP8PROFILE_ANY:
+    case arc::mojom::VideoCodecProfile::VP9PROFILE_PROFILE0:
+    case arc::mojom::VideoCodecProfile::VP9PROFILE_PROFILE1:
+    case arc::mojom::VideoCodecProfile::VP9PROFILE_PROFILE2:
+    case arc::mojom::VideoCodecProfile::VP9PROFILE_PROFILE3:
+    case arc::mojom::VideoCodecProfile::HEVCPROFILE_MAIN:
+    case arc::mojom::VideoCodecProfile::HEVCPROFILE_MAIN10:
+    case arc::mojom::VideoCodecProfile::HEVCPROFILE_MAIN_STILL_PICTURE:
+    case arc::mojom::VideoCodecProfile::DOLBYVISION_PROFILE0:
+    case arc::mojom::VideoCodecProfile::DOLBYVISION_PROFILE4:
+    case arc::mojom::VideoCodecProfile::DOLBYVISION_PROFILE5:
+    case arc::mojom::VideoCodecProfile::DOLBYVISION_PROFILE7:
+      *output = static_cast<media::VideoCodecProfile>(input);
+      return true;
+  }
+  DLOG(ERROR) << "unknown profile: " << input;
+  return false;
+}
+
+}  // namespace mojo
diff --git a/components/arc/video_accelerator/video_encode_accelerator_struct_traits.h b/components/arc/video_accelerator/video_encode_accelerator_struct_traits.h
new file mode 100644
index 0000000..c3b39e1
--- /dev/null
+++ b/components/arc/video_accelerator/video_encode_accelerator_struct_traits.h
@@ -0,0 +1,68 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_ARC_VIDEO_ACCELERATOR_VIDEO_ENCODE_ACCELERATOR_STRUCT_TRAITS_H_
+#define COMPONENTS_ARC_VIDEO_ACCELERATOR_VIDEO_ENCODE_ACCELERATOR_STRUCT_TRAITS_H_
+
+#include "components/arc/common/video_encode_accelerator.mojom.h"
+#include "media/video/video_encode_accelerator.h"
+
+namespace mojo {
+
+template <>
+struct EnumTraits<arc::mojom::VideoEncodeAccelerator::Error,
+                  media::VideoEncodeAccelerator::Error> {
+  static arc::mojom::VideoEncodeAccelerator::Error ToMojom(
+      media::VideoEncodeAccelerator::Error input);
+
+  static bool FromMojom(arc::mojom::VideoEncodeAccelerator::Error input,
+                        media::VideoEncodeAccelerator::Error* output);
+};
+
+template <>
+struct EnumTraits<arc::mojom::VideoPixelFormat, media::VideoPixelFormat> {
+  static arc::mojom::VideoPixelFormat ToMojom(media::VideoPixelFormat input);
+
+  static bool FromMojom(arc::mojom::VideoPixelFormat input,
+                        media::VideoPixelFormat* output);
+};
+
+template <>
+struct EnumTraits<arc::mojom::VideoCodecProfile, media::VideoCodecProfile> {
+  static arc::mojom::VideoCodecProfile ToMojom(media::VideoCodecProfile input);
+
+  static bool FromMojom(arc::mojom::VideoCodecProfile input,
+                        media::VideoCodecProfile* output);
+};
+
+template <>
+struct StructTraits<arc::mojom::VideoEncodeProfileDataView,
+                    media::VideoEncodeAccelerator::SupportedProfile> {
+  static media::VideoCodecProfile profile(
+      const media::VideoEncodeAccelerator::SupportedProfile& r) {
+    return r.profile;
+  }
+  static const gfx::Size& max_resolution(
+      const media::VideoEncodeAccelerator::SupportedProfile& r) {
+    return r.max_resolution;
+  }
+  static uint32_t max_framerate_numerator(
+      const media::VideoEncodeAccelerator::SupportedProfile& r) {
+    return r.max_framerate_numerator;
+  }
+  static uint32_t max_framerate_denominator(
+      const media::VideoEncodeAccelerator::SupportedProfile& r) {
+    return r.max_framerate_denominator;
+  }
+
+  static bool Read(arc::mojom::VideoEncodeProfileDataView data,
+                   media::VideoEncodeAccelerator::SupportedProfile* out) {
+    NOTIMPLEMENTED();
+    return false;
+  }
+};
+
+}  // namespace mojo
+
+#endif  // COMPONENTS_ARC_VIDEO_ACCELERATOR_VIDEO_ENCODE_ACCELERATOR_STRUCT_TRAITS_H_
diff --git a/components/autofill/content/renderer/form_autofill_util.cc b/components/autofill/content/renderer/form_autofill_util.cc
index 2a32103..bf662aa 100644
--- a/components/autofill/content/renderer/form_autofill_util.cc
+++ b/components/autofill/content/renderer/form_autofill_util.cc
@@ -111,9 +111,7 @@
     return false;
   const WebFormControlElement form_control_element =
       element.ToConst<WebFormControlElement>();
-  return std::find(control_elements.begin(),
-                   control_elements.end(),
-                   form_control_element) != control_elements.end();
+  return base::ContainsValue(control_elements, form_control_element);
 }
 
 bool IsElementInsideFormOrFieldSet(const WebElement& element) {
diff --git a/components/autofill/content/renderer/password_generation_agent.cc b/components/autofill/content/renderer/password_generation_agent.cc
index b4ab0cb2..3f833da 100644
--- a/components/autofill/content/renderer/password_generation_agent.cc
+++ b/components/autofill/content/renderer/password_generation_agent.cc
@@ -10,6 +10,7 @@
 
 #include "base/command_line.h"
 #include "base/logging.h"
+#include "base/stl_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/autofill/content/renderer/form_autofill_util.h"
 #include "components/autofill/content/renderer/form_classifier.h"
@@ -58,7 +59,7 @@
 }
 
 bool ContainsURL(const std::vector<GURL>& urls, const GURL& url) {
-  return std::find(urls.begin(), urls.end(), url) != urls.end();
+  return base::ContainsValue(urls, url);
 }
 
 // Calculates the signature of |form| and searches it in |forms|.
diff --git a/components/autofill/core/browser/address.cc b/components/autofill/core/browser/address.cc
index 3a44121..c950f69c 100644
--- a/components/autofill/core/browser/address.cc
+++ b/components/autofill/core/browser/address.cc
@@ -9,6 +9,7 @@
 
 #include "base/i18n/case_conversion.h"
 #include "base/logging.h"
+#include "base/stl_util.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
@@ -199,8 +200,7 @@
   // There's a good chance that this formatting is not intentional, but it's
   // also not obviously safe to just strip the newlines.
   if (storable_type == ADDRESS_HOME_STREET_ADDRESS &&
-      std::find(street_address_.begin(), street_address_.end(),
-                base::string16()) != street_address_.end()) {
+      base::ContainsValue(street_address_, base::string16())) {
     street_address_.clear();
     return false;
   }
diff --git a/components/autofill/core/browser/personal_data_manager.cc b/components/autofill/core/browser/personal_data_manager.cc
index 1ed3ce5..4f3bef1 100644
--- a/components/autofill/core/browser/personal_data_manager.cc
+++ b/components/autofill/core/browser/personal_data_manager.cc
@@ -16,6 +16,7 @@
 #include "base/i18n/timezone.h"
 #include "base/memory/ptr_util.h"
 #include "base/profiler/scoped_tracker.h"
+#include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
@@ -1115,8 +1116,7 @@
         AutofillCountry::CountryCodeForLocale(app_locale())));
   }
 
-  return std::find(country_codes.begin(), country_codes.end(),
-                   base::ToLowerASCII(country_code)) != country_codes.end();
+  return base::ContainsValue(country_codes, base::ToLowerASCII(country_code));
 }
 
 const std::string& PersonalDataManager::GetDefaultCountryCodeForNewAddress()
@@ -1384,8 +1384,7 @@
     std::string country_code = base::ToUpperASCII(base::UTF16ToASCII(
         profiles[i]->GetRawInfo(ADDRESS_HOME_COUNTRY)));
 
-    if (std::find(country_codes.begin(), country_codes.end(), country_code) !=
-            country_codes.end()) {
+    if (base::ContainsValue(country_codes, country_code)) {
       // Verified profiles count 100x more than unverified ones.
       votes[country_code] += profiles[i]->IsVerified() ? 100 : 1;
     }
diff --git a/components/cast_channel/cast_socket_service.h b/components/cast_channel/cast_socket_service.h
index eea0aee..bb465e9 100644
--- a/components/cast_channel/cast_socket_service.h
+++ b/components/cast_channel/cast_socket_service.h
@@ -37,7 +37,7 @@
 
   // Returns the socket corresponding to |channel_id| if one exists, or nullptr
   // otherwise.
-  CastSocket* GetSocket(int channel_id) const;
+  virtual CastSocket* GetSocket(int channel_id) const;
 
   CastSocket* GetSocket(const net::IPEndPoint& ip_endpoint) const;
 
@@ -72,10 +72,10 @@
   // |open_cb|: OnOpenCallback invoked when cast socket is opened.
   // |observer|: Observer handles messages and errors on newly opened socket.
   // Does not take ownership of |observer|.
-  int OpenSocket(const net::IPEndPoint& ip_endpoint,
-                 net::NetLog* net_log,
-                 const CastSocket::OnOpenCallback& open_cb,
-                 CastSocket::Observer* observer);
+  virtual int OpenSocket(const net::IPEndPoint& ip_endpoint,
+                         net::NetLog* net_log,
+                         const CastSocket::OnOpenCallback& open_cb,
+                         CastSocket::Observer* observer);
 
   // Returns an observer corresponding to |id|.
   CastSocket::Observer* GetObserver(const std::string& id);
@@ -89,9 +89,10 @@
   // Allow test to inject a mock cast socket.
   void SetSocketForTest(std::unique_ptr<CastSocket> socket_for_test);
 
- private:
+ protected:
   ~CastSocketService() override;
 
+ private:
   // RefcountedKeyedService implementation.
   void ShutdownOnUIThread() override;
 
diff --git a/components/cdm/browser/media_drm_storage_impl.cc b/components/cdm/browser/media_drm_storage_impl.cc
index 800c6275..2f9ee4f 100644
--- a/components/cdm/browser/media_drm_storage_impl.cc
+++ b/components/cdm/browser/media_drm_storage_impl.cc
@@ -123,13 +123,13 @@
   initialized_ = true;
 }
 
-void MediaDrmStorageImpl::OnProvisioned(const OnProvisionedCallback& callback) {
+void MediaDrmStorageImpl::OnProvisioned(OnProvisionedCallback callback) {
   DVLOG(1) << __func__;
   DCHECK(thread_checker_.CalledOnValidThread());
 
   if (!initialized_) {
     DVLOG(1) << __func__ << ": Not initialized.";
-    callback.Run(false);
+    std::move(callback).Run(false);
     return;
   }
 
@@ -144,19 +144,19 @@
 
   storage_dict->SetWithoutPathExpansion(origin_string_,
                                         CreateOriginDictionary());
-  callback.Run(true);
+  std::move(callback).Run(true);
 }
 
 void MediaDrmStorageImpl::SavePersistentSession(
     const std::string& session_id,
     media::mojom::SessionDataPtr session_data,
-    const SavePersistentSessionCallback& callback) {
+    SavePersistentSessionCallback callback) {
   DVLOG(2) << __func__;
   DCHECK(thread_checker_.CalledOnValidThread());
 
   if (!initialized_) {
     DVLOG(1) << __func__ << ": Not initialized.";
-    callback.Run(false);
+    std::move(callback).Run(false);
     return;
   }
 
@@ -196,18 +196,18 @@
       session_id, CreateSessionDictionary(session_data->key_set_id,
                                           session_data->mime_type));
 
-  callback.Run(true);
+  std::move(callback).Run(true);
 }
 
 void MediaDrmStorageImpl::LoadPersistentSession(
     const std::string& session_id,
-    const LoadPersistentSessionCallback& callback) {
+    LoadPersistentSessionCallback callback) {
   DVLOG(2) << __func__;
   DCHECK(thread_checker_.CalledOnValidThread());
 
   if (!initialized_) {
     DVLOG(1) << __func__ << ": Not initialized.";
-    callback.Run(nullptr);
+    std::move(callback).Run(nullptr);
     return;
   }
 
@@ -221,14 +221,14 @@
     DVLOG(1) << __func__
              << ": Failed to save persistent session data; entry for origin "
              << origin_ << " does not exist.";
-    callback.Run(nullptr);
+    std::move(callback).Run(nullptr);
     return;
   }
 
   const base::DictionaryValue* sessions_dict = nullptr;
   if (!origin_dict->GetDictionary(kSessions, &sessions_dict)) {
     DVLOG(2) << __func__ << ": Sessions dictionary does not exist.";
-    callback.Run(nullptr);
+    std::move(callback).Run(nullptr);
     return;
   }
 
@@ -236,7 +236,7 @@
   if (!sessions_dict->GetDictionaryWithoutPathExpansion(session_id,
                                                         &session_dict)) {
     DVLOG(2) << __func__ << ": Session dictionary does not exist.";
-    callback.Run(nullptr);
+    std::move(callback).Run(nullptr);
     return;
   }
 
@@ -244,22 +244,23 @@
   std::string mime_type;
   if (!GetSessionData(session_dict, &key_set_id, &mime_type)) {
     DVLOG(2) << __func__ << ": Failed to read session data.";
-    callback.Run(nullptr);
+    std::move(callback).Run(nullptr);
     return;
   }
 
-  callback.Run(media::mojom::SessionData::New(key_set_id, mime_type));
+  std::move(callback).Run(
+      media::mojom::SessionData::New(key_set_id, mime_type));
 }
 
 void MediaDrmStorageImpl::RemovePersistentSession(
     const std::string& session_id,
-    const RemovePersistentSessionCallback& callback) {
+    RemovePersistentSessionCallback callback) {
   DVLOG(2) << __func__;
   DCHECK(thread_checker_.CalledOnValidThread());
 
   if (!initialized_) {
     DVLOG(1) << __func__ << ": Not initialized.";
-    callback.Run(false);
+    std::move(callback).Run(false);
     return;
   }
 
@@ -273,19 +274,19 @@
   if (!origin_dict) {
     DVLOG(1) << __func__ << ": Entry for rigin " << origin_string_
              << " does not exist.";
-    callback.Run(true);
+    std::move(callback).Run(true);
     return;
   }
 
   base::DictionaryValue* sessions_dict = nullptr;
   if (!origin_dict->GetDictionary(kSessions, &sessions_dict)) {
     DVLOG(2) << __func__ << ": Sessions dictionary does not exist.";
-    callback.Run(true);
+    std::move(callback).Run(true);
     return;
   }
 
   sessions_dict->RemoveWithoutPathExpansion(session_id, nullptr);
-  callback.Run(true);
+  std::move(callback).Run(true);
 }
 
 void MediaDrmStorageImpl::RenderFrameDeleted(
diff --git a/components/cdm/browser/media_drm_storage_impl.h b/components/cdm/browser/media_drm_storage_impl.h
index a581cb6..f6970f6 100644
--- a/components/cdm/browser/media_drm_storage_impl.h
+++ b/components/cdm/browser/media_drm_storage_impl.h
@@ -37,17 +37,14 @@
 
   // media::mojom::MediaDrmStorage implementation.
   void Initialize(const url::Origin& origin) final;
-  void OnProvisioned(const OnProvisionedCallback& callback) final;
-  void SavePersistentSession(
-      const std::string& session_id,
-      media::mojom::SessionDataPtr session_data,
-      const SavePersistentSessionCallback& callback) final;
-  void LoadPersistentSession(
-      const std::string& session_id,
-      const LoadPersistentSessionCallback& callback) final;
-  void RemovePersistentSession(
-      const std::string& session_id,
-      const RemovePersistentSessionCallback& callback) final;
+  void OnProvisioned(OnProvisionedCallback callback) final;
+  void SavePersistentSession(const std::string& session_id,
+                             media::mojom::SessionDataPtr session_data,
+                             SavePersistentSessionCallback callback) final;
+  void LoadPersistentSession(const std::string& session_id,
+                             LoadPersistentSessionCallback callback) final;
+  void RemovePersistentSession(const std::string& session_id,
+                               RemovePersistentSessionCallback callback) final;
 
   // content::WebContentsObserver implementation.
   void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) final;
diff --git a/components/cronet/android/cronet_url_request_context_adapter.cc b/components/cronet/android/cronet_url_request_context_adapter.cc
index d62729b6..d9342555 100644
--- a/components/cronet/android/cronet_url_request_context_adapter.cc
+++ b/components/cronet/android/cronet_url_request_context_adapter.cc
@@ -1027,7 +1027,7 @@
   if (net_log_file_observer_)
     return;
   net_log_file_observer_ = net::FileNetLogObserver::CreateUnbounded(
-      GetFileThread()->task_runner(), file_path, /*constants=*/nullptr);
+      file_path, /*constants=*/nullptr);
   CreateNetLogEntriesForActiveObjects({context_.get()},
                                       net_log_file_observer_.get());
   net::NetLogCaptureMode capture_mode =
@@ -1052,8 +1052,7 @@
   DCHECK(base::PathIsWritable(file_path));
 
   net_log_file_observer_ = net::FileNetLogObserver::CreateBounded(
-      GetFileThread()->task_runner(), file_path, size, kNumNetLogEventFiles,
-      /*constants=*/nullptr);
+      file_path, size, kNumNetLogEventFiles, /*constants=*/nullptr);
 
   CreateNetLogEntriesForActiveObjects({context_.get()},
                                       net_log_file_observer_.get());
diff --git a/components/exo/DEPS b/components/exo/DEPS
index 6971866..c58c382 100644
--- a/components/exo/DEPS
+++ b/components/exo/DEPS
@@ -2,6 +2,7 @@
   "+ash",
   "+cc",
   "+chromeos/audio/chromeos_sounds.h",
+  "+components/viz/common/quads",
   "+device/gamepad",
   "+gpu",
   "+mojo/public/cpp",
diff --git a/components/exo/buffer.cc b/components/exo/buffer.cc
index 5e6b918..dc0977c 100644
--- a/components/exo/buffer.cc
+++ b/components/exo/buffer.cc
@@ -25,6 +25,7 @@
 #include "cc/resources/single_release_callback.h"
 #include "cc/resources/texture_mailbox.h"
 #include "components/exo/layer_tree_frame_sink_holder.h"
+#include "components/viz/common/quads/resource_format.h"
 #include "gpu/command_buffer/client/context_support.h"
 #include "gpu/command_buffer/client/gles2_interface.h"
 #include "ui/aura/env.h"
@@ -439,7 +440,7 @@
   }
 
   resource->id = resource_id;
-  resource->format = cc::RGBA_8888;
+  resource->format = viz::RGBA_8888;
   resource->filter = GL_LINEAR;
   resource->size = gpu_memory_buffer_->GetSize();
 
diff --git a/components/exo/surface_tree_host.cc b/components/exo/surface_tree_host.cc
index 8ca3a7c..36442f58 100644
--- a/components/exo/surface_tree_host.cc
+++ b/components/exo/surface_tree_host.cc
@@ -31,7 +31,7 @@
   bool EventLocationInsideBounds(aura::Window* window,
                                  const ui::LocatedEvent& event) const override {
     if (window != surface_tree_host_->host_window())
-      return false;
+      return aura::WindowTargeter::EventLocationInsideBounds(window, event);
 
     Surface* surface = surface_tree_host_->root_surface();
     if (!surface)
@@ -49,7 +49,8 @@
   ui::EventTarget* FindTargetForEvent(ui::EventTarget* root,
                                       ui::Event* event) override {
     aura::Window* window = static_cast<aura::Window*>(root);
-    DCHECK_EQ(window, surface_tree_host_->host_window());
+    if (window != surface_tree_host_->host_window())
+      return aura::WindowTargeter::FindTargetForEvent(root, event);
     ui::EventTarget* target =
         aura::WindowTargeter::FindTargetForEvent(root, event);
     // Do not accept events in SurfaceTreeHost window.
diff --git a/components/favicon/core/large_icon_service.cc b/components/favicon/core/large_icon_service.cc
index 043678a..bb99ce88 100644
--- a/components/favicon/core/large_icon_service.cc
+++ b/components/favicon/core/large_icon_service.cc
@@ -267,18 +267,31 @@
   UMA_HISTOGRAM_COUNTS_1000("Favicons.LargeIconService.DownloadedSize", size);
 }
 
+void OnSetOnDemandFaviconComplete(
+    const favicon_base::GoogleFaviconServerCallback& callback,
+    bool success) {
+  callback.Run(
+      success
+          ? favicon_base::GoogleFaviconServerRequestStatus::SUCCESS
+          : favicon_base::GoogleFaviconServerRequestStatus::FAILURE_ON_WRITE);
+}
+
 void OnFetchIconFromGoogleServerComplete(
     FaviconService* favicon_service,
     const GURL& page_url,
-    const base::Callback<void(bool success)>& callback,
+    const favicon_base::GoogleFaviconServerCallback& callback,
     const std::string& server_request_url,
     const gfx::Image& image,
     const image_fetcher::RequestMetadata& metadata) {
   if (image.IsEmpty()) {
     DLOG(WARNING) << "large icon server fetch empty " << server_request_url;
     favicon_service->UnableToDownloadFavicon(GURL(server_request_url));
-    base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                                  base::Bind(callback, false));
+    callback.Run(metadata.http_response_code ==
+                         net::URLFetcher::RESPONSE_CODE_INVALID
+                     ? favicon_base::GoogleFaviconServerRequestStatus::
+                           FAILURE_CONNECTION_ERROR
+                     : favicon_base::GoogleFaviconServerRequestStatus::
+                           FAILURE_HTTP_ERROR);
     ReportDownloadedSize(0);
     return;
   }
@@ -297,9 +310,9 @@
   // something else could've been written). By marking the icons initially
   // expired (out-of-date), they will be refetched when we visit the original
   // page any time in the future.
-  favicon_service->SetOnDemandFavicons(page_url, GURL(original_icon_url),
-                                       favicon_base::IconType::TOUCH_ICON,
-                                       image, callback);
+  favicon_service->SetOnDemandFavicons(
+      page_url, GURL(original_icon_url), favicon_base::IconType::TOUCH_ICON,
+      image, base::Bind(&OnSetOnDemandFaviconComplete, callback));
 }
 
 }  // namespace
@@ -351,7 +364,7 @@
         int desired_size_in_pixel,
         bool may_page_url_be_private,
         const net::NetworkTrafficAnnotationTag& traffic_annotation,
-        const base::Callback<void(bool success)>& callback) {
+        const favicon_base::GoogleFaviconServerCallback& callback) {
   DCHECK_LE(0, min_source_size_in_pixel);
 
   const GURL trimmed_page_url = TrimPageUrlForGoogleServer(page_url);
@@ -359,13 +372,23 @@
       trimmed_page_url, min_source_size_in_pixel, desired_size_in_pixel,
       may_page_url_be_private);
 
-  // Do not download if the URL is invalid after trimming, or there is a
-  // previous cache miss recorded for |server_request_url|.
   if (!server_request_url.is_valid() || !trimmed_page_url.is_valid() ||
-      !image_fetcher_ ||
-      favicon_service_->WasUnableToDownloadFavicon(server_request_url)) {
-    base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                                  base::Bind(callback, false));
+      !image_fetcher_) {
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE,
+        base::Bind(
+            callback,
+            favicon_base::GoogleFaviconServerRequestStatus::FAILURE_INVALID));
+    return;
+  }
+
+  // Do not download if there is a previous cache miss recorded for
+  // |server_request_url|.
+  if (favicon_service_->WasUnableToDownloadFavicon(server_request_url)) {
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE,
+        base::Bind(callback, favicon_base::GoogleFaviconServerRequestStatus::
+                                 FAILURE_HTTP_ERROR_CACHED));
     return;
   }
 
diff --git a/components/favicon/core/large_icon_service.h b/components/favicon/core/large_icon_service.h
index 0501625..d44ace6 100644
--- a/components/favicon/core/large_icon_service.h
+++ b/components/favicon/core/large_icon_service.h
@@ -100,7 +100,7 @@
       int desired_size_in_pixel,
       bool may_page_url_be_private,
       const net::NetworkTrafficAnnotationTag& traffic_annotation,
-      const base::Callback<void(bool success)>& callback);
+      const favicon_base::GoogleFaviconServerCallback& callback);
 
  private:
   base::CancelableTaskTracker::TaskId GetLargeIconOrFallbackStyleImpl(
diff --git a/components/favicon/core/large_icon_service_unittest.cc b/components/favicon/core/large_icon_service_unittest.cc
index 23a2a67..e048504 100644
--- a/components/favicon/core/large_icon_service_unittest.cc
+++ b/components/favicon/core/large_icon_service_unittest.cc
@@ -151,7 +151,7 @@
 
   EXPECT_CALL(mock_favicon_service_, UnableToDownloadFavicon(_)).Times(0);
 
-  base::MockCallback<base::Callback<void(bool success)>> callback;
+  base::MockCallback<favicon_base::GoogleFaviconServerCallback> callback;
   EXPECT_CALL(*mock_image_fetcher_,
               StartOrQueueNetworkRequest(_, kExpectedServerUrl, _, _))
       .WillOnce(PostFetchReply(gfx::Image::CreateFrom1xBitmap(
@@ -167,7 +167,8 @@
           /*desired_size_in_pixel=*/61, /*may_page_url_be_private=*/true,
           TRAFFIC_ANNOTATION_FOR_TESTS, callback.Get());
 
-  EXPECT_CALL(callback, Run(true));
+  EXPECT_CALL(callback,
+              Run(favicon_base::GoogleFaviconServerRequestStatus::SUCCESS));
   base::RunLoop().RunUntilIdle();
   histogram_tester_.ExpectUniqueSample(
       "Favicons.LargeIconService.DownloadedSize", 64, /*expected_count=*/1);
@@ -188,7 +189,7 @@
 
   EXPECT_CALL(mock_favicon_service_, UnableToDownloadFavicon(_)).Times(0);
 
-  base::MockCallback<base::Callback<void(bool success)>> callback;
+  base::MockCallback<favicon_base::GoogleFaviconServerCallback> callback;
   EXPECT_CALL(*mock_image_fetcher_,
               StartOrQueueNetworkRequest(_, kExpectedServerUrl, _, _))
       .WillOnce(PostFetchReply(gfx::Image::CreateFrom1xBitmap(
@@ -204,7 +205,8 @@
           /*desired_size_in_pixel=*/61, /*may_page_url_be_private=*/true,
           TRAFFIC_ANNOTATION_FOR_TESTS, callback.Get());
 
-  EXPECT_CALL(callback, Run(true));
+  EXPECT_CALL(callback,
+              Run(favicon_base::GoogleFaviconServerRequestStatus::SUCCESS));
   base::RunLoop().RunUntilIdle();
 }
 
@@ -228,14 +230,15 @@
                                   favicon_base::IconType::TOUCH_ICON, _, _))
       .WillOnce(PostBoolReply(true));
 
-  base::MockCallback<base::Callback<void(bool success)>> callback;
+  base::MockCallback<favicon_base::GoogleFaviconServerCallback> callback;
   large_icon_service_
       .GetLargeIconOrFallbackStyleFromGoogleServerSkippingLocalCache(
           GURL(kDummyUrl), /*min_source_size_in_pixel=*/42,
           /*desired_size_in_pixel=*/61, /*may_page_url_be_private=*/true,
           TRAFFIC_ANNOTATION_FOR_TESTS, callback.Get());
 
-  EXPECT_CALL(callback, Run(true));
+  EXPECT_CALL(callback,
+              Run(favicon_base::GoogleFaviconServerRequestStatus::SUCCESS));
   base::RunLoop().RunUntilIdle();
 }
 
@@ -258,7 +261,8 @@
       .GetLargeIconOrFallbackStyleFromGoogleServerSkippingLocalCache(
           GURL(kDummyUrlWithQuery), /*min_source_size_in_pixel=*/42,
           /*desired_size_in_pixel=*/61, /*may_page_url_be_private=*/true,
-          TRAFFIC_ANNOTATION_FOR_TESTS, base::Callback<void(bool success)>());
+          TRAFFIC_ANNOTATION_FOR_TESTS,
+          favicon_base::GoogleFaviconServerCallback());
 
   base::RunLoop().RunUntilIdle();
 }
@@ -271,7 +275,7 @@
           _, Property(&GURL::query, Not(HasSubstr("check_seen=true"))), _, _))
       .WillOnce(PostFetchReply(gfx::Image()));
 
-  base::MockCallback<base::Callback<void(bool success)>> callback;
+  base::MockCallback<favicon_base::GoogleFaviconServerCallback> callback;
 
   large_icon_service_
       .GetLargeIconOrFallbackStyleFromGoogleServerSkippingLocalCache(
@@ -279,7 +283,8 @@
           /*desired_size_in_pixel=*/61, /*may_page_url_be_private=*/false,
           TRAFFIC_ANNOTATION_FOR_TESTS, callback.Get());
 
-  EXPECT_CALL(callback, Run(false));
+  EXPECT_CALL(callback, Run(favicon_base::GoogleFaviconServerRequestStatus::
+                                FAILURE_CONNECTION_ERROR));
   base::RunLoop().RunUntilIdle();
 }
 
@@ -289,7 +294,7 @@
   EXPECT_CALL(*mock_image_fetcher_, StartOrQueueNetworkRequest(_, _, _, _))
       .Times(0);
 
-  base::MockCallback<base::Callback<void(bool success)>> callback;
+  base::MockCallback<favicon_base::GoogleFaviconServerCallback> callback;
 
   large_icon_service_
       .GetLargeIconOrFallbackStyleFromGoogleServerSkippingLocalCache(
@@ -297,7 +302,9 @@
           /*desired_size_in_pixel=*/61, /*may_page_url_be_private=*/true,
           TRAFFIC_ANNOTATION_FOR_TESTS, callback.Get());
 
-  EXPECT_CALL(callback, Run(false));
+  EXPECT_CALL(
+      callback,
+      Run(favicon_base::GoogleFaviconServerRequestStatus::FAILURE_INVALID));
   base::RunLoop().RunUntilIdle();
   EXPECT_THAT(histogram_tester_.GetAllSamples(
                   "Favicons.LargeIconService.DownloadedSize"),
@@ -314,7 +321,7 @@
   EXPECT_CALL(mock_favicon_service_, SetOnDemandFavicons(_, _, _, _, _))
       .Times(0);
 
-  base::MockCallback<base::Callback<void(bool success)>> callback;
+  base::MockCallback<favicon_base::GoogleFaviconServerCallback> callback;
   EXPECT_CALL(*mock_image_fetcher_,
               StartOrQueueNetworkRequest(_, kExpectedServerUrl, _, _))
       .WillOnce(PostFetchReply(gfx::Image()));
@@ -327,7 +334,8 @@
           /*desired_size_in_pixel=*/61, /*may_page_url_be_private=*/true,
           TRAFFIC_ANNOTATION_FOR_TESTS, callback.Get());
 
-  EXPECT_CALL(callback, Run(false));
+  EXPECT_CALL(callback, Run(favicon_base::GoogleFaviconServerRequestStatus::
+                                FAILURE_CONNECTION_ERROR));
   base::RunLoop().RunUntilIdle();
   // Verify that download failure gets recorded.
   histogram_tester_.ExpectUniqueSample(
@@ -349,14 +357,15 @@
   EXPECT_CALL(mock_favicon_service_, SetOnDemandFavicons(_, _, _, _, _))
       .Times(0);
 
-  base::MockCallback<base::Callback<void(bool success)>> callback;
+  base::MockCallback<favicon_base::GoogleFaviconServerCallback> callback;
   large_icon_service_
       .GetLargeIconOrFallbackStyleFromGoogleServerSkippingLocalCache(
           GURL(kDummyUrl), /*min_source_size_in_pixel=*/42,
           /*desired_size_in_pixel=*/61, /*may_page_url_be_private=*/true,
           TRAFFIC_ANNOTATION_FOR_TESTS, callback.Get());
 
-  EXPECT_CALL(callback, Run(false));
+  EXPECT_CALL(callback, Run(favicon_base::GoogleFaviconServerRequestStatus::
+                                FAILURE_HTTP_ERROR_CACHED));
   base::RunLoop().RunUntilIdle();
   EXPECT_THAT(histogram_tester_.GetAllSamples(
                   "Favicons.LargeIconService.DownloadedSize"),
diff --git a/components/favicon_base/favicon_callback.h b/components/favicon_base/favicon_callback.h
index 28ad5b3..318f64c 100644
--- a/components/favicon_base/favicon_callback.h
+++ b/components/favicon_base/favicon_callback.h
@@ -15,6 +15,7 @@
 struct FaviconImageResult;
 struct LargeIconResult;
 struct LargeIconImageResult;
+enum class GoogleFaviconServerRequestStatus;
 
 // Callback for functions that can be used to return a |gfx::Image| and the
 // |GURL| it is loaded from. They are returned as a |FaviconImageResult| object.
@@ -44,6 +45,9 @@
 typedef base::Callback<void(const LargeIconImageResult&)>
     LargeIconImageCallback;
 
+typedef base::Callback<void(GoogleFaviconServerRequestStatus)>
+    GoogleFaviconServerCallback;
+
 }  // namespace favicon_base
 
 #endif  // COMPONENTS_FAVICON_BASE_FAVICON_CALLBACK_H_
diff --git a/components/favicon_base/favicon_types.h b/components/favicon_base/favicon_types.h
index 7ad22ff..4afec6f 100644
--- a/components/favicon_base/favicon_types.h
+++ b/components/favicon_base/favicon_types.h
@@ -119,6 +119,28 @@
   std::unique_ptr<FallbackIconStyle> fallback_icon_style;
 };
 
+// Enumeration listing all possible outcomes for fetch attempts from Google
+// favicon server. Used for UMA enum GoogleFaviconServerRequestStatus, so do not
+// change existing values. Insert new values at the end, and update the
+// histogram definition.
+enum class GoogleFaviconServerRequestStatus {
+  // Request sent out and the favicon successfully fetched.
+  SUCCESS = 0,
+  // Request sent out and a connection error occurred (no valid HTTP response
+  // recevied).
+  FAILURE_CONNECTION_ERROR = 1,
+  // Request sent out and a HTTP error received.
+  FAILURE_HTTP_ERROR = 2,
+  // Request not sent out (previous HTTP error in cache).
+  FAILURE_HTTP_ERROR_CACHED = 3,
+  // Request sent out and favicon fetched but writing to database failed.
+  FAILURE_ON_WRITE = 4,
+  // Request not sent out (the request or the fetcher was invalid).
+  FAILURE_INVALID = 5,
+  // Insert new values here.
+  COUNT
+};
+
 }  // namespace favicon_base
 
 #endif  // COMPONENTS_FAVICON_BASE_FAVICON_TYPES_H_
diff --git a/components/gcm_driver/gcm_client_impl.cc b/components/gcm_driver/gcm_client_impl.cc
index 9cd3eb9..f18900d 100644
--- a/components/gcm_driver/gcm_client_impl.cc
+++ b/components/gcm_driver/gcm_client_impl.cc
@@ -80,7 +80,6 @@
   RESET_STORE_ERROR_COUNT
 };
 
-const char kGCMScope[] = "GCM";
 const int kMaxRegistrationRetries = 5;
 const int kMaxUnregistrationRetries = 5;
 const char kDeletedCountKey[] = "total_deleted";
@@ -1394,65 +1393,16 @@
     bool was_subtype,
     const mcs_proto::DataMessageStanza& data_message_stanza,
     MessageData& message_data) {
-  std::string sender = data_message_stanza.from();
+  UMA_HISTOGRAM_BOOLEAN("GCM.DataMessageReceived", true);
 
-  // Drop the message when the app is not registered for the sender of the
-  // message.
-  bool registered = false;
+  bool has_collapse_key =
+      data_message_stanza.has_token() && !data_message_stanza.token().empty();
+  UMA_HISTOGRAM_BOOLEAN("GCM.DataMessageReceivedHasCollapseKey",
+                        has_collapse_key);
 
-  // First, find among all GCM registrations.
-  std::unique_ptr<GCMRegistrationInfo> gcm_registration(
-      new GCMRegistrationInfo);
-  gcm_registration->app_id = app_id;
-  auto gcm_registration_iter = registrations_.find(
-      make_linked_ptr<RegistrationInfo>(gcm_registration.release()));
-  if (gcm_registration_iter != registrations_.end()) {
-    GCMRegistrationInfo* cached_gcm_registration =
-        GCMRegistrationInfo::FromRegistrationInfo(
-            gcm_registration_iter->first.get());
-    if (cached_gcm_registration &&
-        std::find(cached_gcm_registration->sender_ids.begin(),
-                  cached_gcm_registration->sender_ids.end(),
-                  sender) != cached_gcm_registration->sender_ids.end()) {
-      if (was_subtype)
-        DLOG(ERROR) << "GCM message for non-IID " << app_id << " used subtype";
-      else
-        registered = true;
-    }
-  }
-
-  // Then, find among all InstanceID registrations.
-  if (!registered) {
-    std::unique_ptr<InstanceIDTokenInfo> instance_id_token(
-        new InstanceIDTokenInfo);
-    instance_id_token->app_id = app_id;
-    instance_id_token->authorized_entity = sender;
-    instance_id_token->scope = kGCMScope;
-    auto instance_id_token_iter = registrations_.find(
-        make_linked_ptr<RegistrationInfo>(instance_id_token.release()));
-    if (instance_id_token_iter != registrations_.end()) {
-      if (was_subtype != InstanceIDUsesSubtypeForAppId(app_id)) {
-        DLOG(ERROR) << "GCM message for " << app_id
-                    << " incorrectly had was_subtype = " << was_subtype;
-      } else {
-        registered = true;
-      }
-    }
-  }
-
-  UMA_HISTOGRAM_BOOLEAN("GCM.DataMessageReceivedHasRegisteredApp", registered);
-  if (registered) {
-    UMA_HISTOGRAM_BOOLEAN("GCM.DataMessageReceived", true);
-    bool has_collapse_key =
-        data_message_stanza.has_token() && !data_message_stanza.token().empty();
-    UMA_HISTOGRAM_BOOLEAN("GCM.DataMessageReceivedHasCollapseKey",
-                          has_collapse_key);
-  }
-  recorder_.RecordDataMessageReceived(app_id, sender,
-      data_message_stanza.ByteSize(), registered,
-      GCMStatsRecorder::DATA_MESSAGE);
-  if (!registered)
-    return;
+  recorder_.RecordDataMessageReceived(app_id, data_message_stanza.from(),
+                                      data_message_stanza.ByteSize(),
+                                      GCMStatsRecorder::DATA_MESSAGE);
 
   IncomingMessage incoming_message;
   incoming_message.sender_id = data_message_stanza.from();
@@ -1478,7 +1428,6 @@
 
   recorder_.RecordDataMessageReceived(app_id, data_message_stanza.from(),
                                       data_message_stanza.ByteSize(),
-                                      true /* to_registered_app */,
                                       GCMStatsRecorder::DELETED_MESSAGES);
   delegate_->OnMessagesDeleted(app_id);
 }
diff --git a/components/gcm_driver/gcm_client_impl_unittest.cc b/components/gcm_driver/gcm_client_impl_unittest.cc
index 827a605..7486c1c 100644
--- a/components/gcm_driver/gcm_client_impl_unittest.cc
+++ b/components/gcm_driver/gcm_client_impl_unittest.cc
@@ -65,7 +65,6 @@
 const char kSubtypeAppId[] = "app_id";
 const char kSender[] = "project_id";
 const char kSender2[] = "project_id2";
-const char kSender3[] = "project_id3";
 const char kRegistrationResponsePrefix[] = "token=";
 const char kUnregistrationResponsePrefix[] = "deleted=";
 const char kRawData[] = "example raw data";
@@ -926,18 +925,6 @@
   EXPECT_EQ(expected_data.size(), last_message().data.size());
   EXPECT_EQ(expected_data, last_message().data);
   EXPECT_EQ(kSender2, last_message().sender_id);
-
-  reset_last_event();
-
-  // Message from kSender3 will be dropped.
-  MCSMessage message3(BuildDownstreamMessage(
-      kSender3, kExtensionAppId, std::string() /* subtype */, expected_data,
-      std::string() /* raw_data */));
-  EXPECT_TRUE(message3.IsValid());
-  ReceiveMessageFromMCS(message3);
-
-  EXPECT_NE(MESSAGE_RECEIVED, last_event());
-  EXPECT_NE(kExtensionAppId, last_app_id());
 }
 
 TEST_F(GCMClientImplTest, DispatchDownstreamMessageRawData) {
@@ -1775,122 +1762,40 @@
   AddInstanceID(kExtensionAppId, kInstanceID);
   GetToken(kExtensionAppId, kSender, kScope);
   ASSERT_NO_FATAL_FAILURE(CompleteRegistration("token1"));
-  GetToken(kExtensionAppId, kSender2, kScope);
-  ASSERT_NO_FATAL_FAILURE(CompleteRegistration("token2"));
 
   std::map<std::string, std::string> expected_data;
 
-  // Message for kSender with a subtype will be dropped.
-  MCSMessage message0(BuildDownstreamMessage(
-      kSender, kProductCategoryForSubtypes, kExtensionAppId /* subtype */,
-      expected_data, std::string() /* raw_data */));
-  EXPECT_TRUE(message0.IsValid());
-  ReceiveMessageFromMCS(message0);
-
-  EXPECT_NE(MESSAGE_RECEIVED, last_event());
-
-  reset_last_event();
-
-  // Message for kSender will be received.
-  MCSMessage message1(BuildDownstreamMessage(
+  MCSMessage message(BuildDownstreamMessage(
       kSender, kExtensionAppId, std::string() /* subtype */, expected_data,
       std::string() /* raw_data */));
-  EXPECT_TRUE(message1.IsValid());
-  ReceiveMessageFromMCS(message1);
+  EXPECT_TRUE(message.IsValid());
+  ReceiveMessageFromMCS(message);
 
   EXPECT_EQ(MESSAGE_RECEIVED, last_event());
   EXPECT_EQ(kExtensionAppId, last_app_id());
   EXPECT_EQ(expected_data.size(), last_message().data.size());
   EXPECT_EQ(expected_data, last_message().data);
   EXPECT_EQ(kSender, last_message().sender_id);
-
-  reset_last_event();
-
-  // Message for kSender2 will be received.
-  MCSMessage message2(BuildDownstreamMessage(
-      kSender2, kExtensionAppId, std::string() /* subtype */, expected_data,
-      std::string() /* raw_data */));
-  EXPECT_TRUE(message2.IsValid());
-  ReceiveMessageFromMCS(message2);
-
-  EXPECT_EQ(MESSAGE_RECEIVED, last_event());
-  EXPECT_EQ(kExtensionAppId, last_app_id());
-  EXPECT_EQ(expected_data.size(), last_message().data.size());
-  EXPECT_EQ(expected_data, last_message().data);
-  EXPECT_EQ(kSender2, last_message().sender_id);
-
-  reset_last_event();
-
-  // Message from kSender3 will be dropped.
-  MCSMessage message3(BuildDownstreamMessage(
-      kSender3, kExtensionAppId, std::string() /* subtype */, expected_data,
-      std::string() /* raw_data */));
-  EXPECT_TRUE(message3.IsValid());
-  ReceiveMessageFromMCS(message3);
-
-  EXPECT_NE(MESSAGE_RECEIVED, last_event());
-  EXPECT_NE(kExtensionAppId, last_app_id());
 }
 
 TEST_F(GCMClientInstanceIDTest, DispatchDownstreamMessageWithSubtype) {
   AddInstanceID(kSubtypeAppId, kInstanceID);
   GetToken(kSubtypeAppId, kSender, kScope);
   ASSERT_NO_FATAL_FAILURE(CompleteRegistration("token1"));
-  GetToken(kSubtypeAppId, kSender2, kScope);
-  ASSERT_NO_FATAL_FAILURE(CompleteRegistration("token2"));
 
   std::map<std::string, std::string> expected_data;
 
-  // Message for kSender without a subtype will be dropped.
-  MCSMessage message0(BuildDownstreamMessage(
-      kSender, kSubtypeAppId, std::string() /* subtype */, expected_data,
-      std::string() /* raw_data */));
-  EXPECT_TRUE(message0.IsValid());
-  ReceiveMessageFromMCS(message0);
-
-  EXPECT_NE(MESSAGE_RECEIVED, last_event());
-
-  reset_last_event();
-
-  // Message for kSender will be received.
-  MCSMessage message1(BuildDownstreamMessage(
+  MCSMessage message(BuildDownstreamMessage(
       kSender, kProductCategoryForSubtypes, kSubtypeAppId /* subtype */,
       expected_data, std::string() /* raw_data */));
-  EXPECT_TRUE(message1.IsValid());
-  ReceiveMessageFromMCS(message1);
+  EXPECT_TRUE(message.IsValid());
+  ReceiveMessageFromMCS(message);
 
   EXPECT_EQ(MESSAGE_RECEIVED, last_event());
   EXPECT_EQ(kSubtypeAppId, last_app_id());
   EXPECT_EQ(expected_data.size(), last_message().data.size());
   EXPECT_EQ(expected_data, last_message().data);
   EXPECT_EQ(kSender, last_message().sender_id);
-
-  reset_last_event();
-
-  // Message for kSender2 will be received.
-  MCSMessage message2(BuildDownstreamMessage(
-      kSender2, kProductCategoryForSubtypes, kSubtypeAppId /* subtype */,
-      expected_data, std::string() /* raw_data */));
-  EXPECT_TRUE(message2.IsValid());
-  ReceiveMessageFromMCS(message2);
-
-  EXPECT_EQ(MESSAGE_RECEIVED, last_event());
-  EXPECT_EQ(kSubtypeAppId, last_app_id());
-  EXPECT_EQ(expected_data.size(), last_message().data.size());
-  EXPECT_EQ(expected_data, last_message().data);
-  EXPECT_EQ(kSender2, last_message().sender_id);
-
-  reset_last_event();
-
-  // Message from kSender3 will be dropped.
-  MCSMessage message3(BuildDownstreamMessage(
-      kSender3, kProductCategoryForSubtypes, kSubtypeAppId /* subtype */,
-      expected_data, std::string() /* raw_data */));
-  EXPECT_TRUE(message3.IsValid());
-  ReceiveMessageFromMCS(message3);
-
-  EXPECT_NE(MESSAGE_RECEIVED, last_event());
-  EXPECT_NE(kSubtypeAppId, last_app_id());
 }
 
 TEST_F(GCMClientInstanceIDTest, DispatchDownstreamMessageWithFakeSubtype) {
diff --git a/components/gcm_driver/gcm_stats_recorder_impl.cc b/components/gcm_driver/gcm_stats_recorder_impl.cc
index cf511d8..e3a2711 100644
--- a/components/gcm_driver/gcm_stats_recorder_impl.cc
+++ b/components/gcm_driver/gcm_stats_recorder_impl.cc
@@ -415,7 +415,6 @@
     const std::string& app_id,
     const std::string& from,
     int message_byte_size,
-    bool to_registered_app,
     ReceivedMessageType message_type) {
   base::TimeTicks new_timestamp = base::TimeTicks::Now();
   if (last_received_data_message_burst_start_time_.is_null()) {
@@ -449,23 +448,16 @@
 
   if (!is_recording_)
     return;
-  if (!to_registered_app) {
-    RecordReceiving(app_id,
-                    from,
-                    message_byte_size,
-                    "Data msg received",
-                    "No such registered app found");
-  } else {
-    switch (message_type) {
-      case GCMStatsRecorderImpl::DATA_MESSAGE:
-        RecordReceiving(app_id, from, message_byte_size, "Data msg received",
-                        std::string());
-        break;
-      case GCMStatsRecorderImpl::DELETED_MESSAGES:
-        RecordReceiving(app_id, from, message_byte_size, "Data msg received",
-                        "Message has been deleted on server");
-        break;
-    }
+
+  switch (message_type) {
+    case GCMStatsRecorderImpl::DATA_MESSAGE:
+      RecordReceiving(app_id, from, message_byte_size, "Data msg received",
+                      std::string());
+      break;
+    case GCMStatsRecorderImpl::DELETED_MESSAGES:
+      RecordReceiving(app_id, from, message_byte_size, "Data msg received",
+                      "Message has been deleted on server");
+      break;
   }
 }
 
diff --git a/components/gcm_driver/gcm_stats_recorder_impl.h b/components/gcm_driver/gcm_stats_recorder_impl.h
index 77af2970..30f3e73 100644
--- a/components/gcm_driver/gcm_stats_recorder_impl.h
+++ b/components/gcm_driver/gcm_stats_recorder_impl.h
@@ -78,7 +78,6 @@
   void RecordDataMessageReceived(const std::string& app_id,
                                  const std::string& from,
                                  int message_byte_size,
-                                 bool to_registered_app,
                                  ReceivedMessageType message_type) override;
   void RecordDataSentToWire(const std::string& app_id,
                             const std::string& receiver_id,
diff --git a/components/gcm_driver/gcm_stats_recorder_impl_unittest.cc b/components/gcm_driver/gcm_stats_recorder_impl_unittest.cc
index a73a78b..03fe0963 100644
--- a/components/gcm_driver/gcm_stats_recorder_impl_unittest.cc
+++ b/components/gcm_driver/gcm_stats_recorder_impl_unittest.cc
@@ -86,9 +86,6 @@
 
 static const char kDataReceivedEvent[] = "Data msg received";
 static const char kDataReceivedDetails[] = "";
-static const char kDataReceivedNotRegisteredEvent[] = "Data msg received";
-static const char kDataReceivedNotRegisteredDetails[] =
-    "No such registered app found";
 static const char kDataDeletedMessageEvent[] = "Data msg received";
 static const char kDataDeletedMessageDetails[] =
     "Message has been deleted on server";
@@ -270,13 +267,6 @@
                         remark);
   }
 
-  void VerifyDataMessageReceivedNotRegistered(const std::string& remark) {
-    VerifyReceivingData(recorder_.receiving_activities(),
-                        kDataReceivedNotRegisteredEvent,
-                        kDataReceivedNotRegisteredDetails,
-                        remark);
-  }
-
   void VerifyDataSentToWire(const std::string& remark) {
     VerifySendingData(recorder_.sending_activities(),
                       kDataSentToWireEvent,
@@ -410,12 +400,10 @@
   recorder_.RecordUnregistrationRetryDelayed(kAppId, source_, kDelay, kRetries);
   VerifyAllActivityQueueEmpty("no unregistration");
 
-  recorder_.RecordDataMessageReceived(kAppId, kFrom, kByteSize, true,
+  recorder_.RecordDataMessageReceived(kAppId, kFrom, kByteSize,
                                       GCMStatsRecorder::DATA_MESSAGE);
-  recorder_.RecordDataMessageReceived(kAppId, kFrom, kByteSize, true,
+  recorder_.RecordDataMessageReceived(kAppId, kFrom, kByteSize,
                                       GCMStatsRecorder::DELETED_MESSAGES);
-  recorder_.RecordDataMessageReceived(kAppId, kFrom, kByteSize, false,
-                                      GCMStatsRecorder::DATA_MESSAGE);
   VerifyAllActivityQueueEmpty("no receiving");
 
   recorder_.RecordDataSentToWire(kAppId, kReceiverId, kMessageId, kQueuedSec);
@@ -511,20 +499,15 @@
 TEST_F(GCMStatsRecorderImplTest, RecordReceivingTest) {
   recorder_.RecordConnectionInitiated(std::string());
   recorder_.RecordConnectionSuccess();
-  recorder_.RecordDataMessageReceived(kAppId, kFrom, kByteSize, true,
+  recorder_.RecordDataMessageReceived(kAppId, kFrom, kByteSize,
                                       GCMStatsRecorder::DATA_MESSAGE);
   VerifyRecordedReceivingCount(1);
   VerifyDataMessageReceived("1st call");
 
-  recorder_.RecordDataMessageReceived(kAppId, kFrom, kByteSize, true,
+  recorder_.RecordDataMessageReceived(kAppId, kFrom, kByteSize,
                                       GCMStatsRecorder::DELETED_MESSAGES);
   VerifyRecordedReceivingCount(2);
   VerifyDataDeletedMessage("2nd call");
-
-  recorder_.RecordDataMessageReceived(kAppId, kFrom, kByteSize, false,
-                                      GCMStatsRecorder::DATA_MESSAGE);
-  VerifyRecordedReceivingCount(3);
-  VerifyDataMessageReceivedNotRegistered("3rd call");
 }
 
 TEST_F(GCMStatsRecorderImplTest, RecordSendingTest) {
diff --git a/components/metrics/file_metrics_provider.cc b/components/metrics/file_metrics_provider.cc
index c3745b1..d6165f2 100644
--- a/components/metrics/file_metrics_provider.cc
+++ b/components/metrics/file_metrics_provider.cc
@@ -579,14 +579,6 @@
       UMA_HISTOGRAM_COUNTS_10000(
           "UMA.FileMetricsProvider.EmbeddedProfile.DroppedHistogramCount",
           histogram_count);
-
-      base::File::Info info;
-      if (base::GetFileInfo(source->path, &info)) {
-        UMA_HISTOGRAM_CUSTOM_COUNTS(
-            "UMA.FileMetricsProvider.EmbeddedProfile.DroppedFileAge",
-            (base::Time::Now() - info.last_modified).InMinutes(), 1,
-            base::TimeDelta::FromDays(30).InMinutes(), 50);
-      }
     }
 
     // Regardless of whether this source was successfully recorded, it is never
diff --git a/components/metrics/proto/BUILD.gn b/components/metrics/proto/BUILD.gn
index d8f8c1fd..c224887b 100644
--- a/components/metrics/proto/BUILD.gn
+++ b/components/metrics/proto/BUILD.gn
@@ -16,6 +16,7 @@
     "omnibox_input_type.proto",
     "perf_data.proto",
     "perf_stat.proto",
+    "printer_event.proto",
     "profiler_event.proto",
     "sampled_profile.proto",
     "system_profile.proto",
diff --git a/components/metrics/proto/chrome_user_metrics_extension.proto b/components/metrics/proto/chrome_user_metrics_extension.proto
index 77950f9..aa930da5 100644
--- a/components/metrics/proto/chrome_user_metrics_extension.proto
+++ b/components/metrics/proto/chrome_user_metrics_extension.proto
@@ -19,11 +19,12 @@
 import "profiler_event.proto";
 import "system_profile.proto";
 import "translate_event.proto";
+import "printer_event.proto";
 import "user_action_event.proto";
 import "perf_data.proto";
 import "sampled_profile.proto";
 
-// Next tag: 16
+// Next tag: 17
 message ChromeUserMetricsExtension {
   // The product (i.e. end user application) for a given UMA log.
   enum Product {
@@ -70,6 +71,7 @@
   repeated HistogramEventProto histogram_event = 6;
   repeated ProfilerEventProto profiler_event = 7;
   repeated TranslateEventProto translate_event = 15;
+  repeated PrinterEventProto printer_event = 16;
 
   // This field is no longer used. Use |sampled_profile| instead.
   repeated PerfDataProto perf_data = 8 [deprecated=true];
diff --git a/components/metrics/proto/printer_event.proto b/components/metrics/proto/printer_event.proto
new file mode 100644
index 0000000..1c49a57
--- /dev/null
+++ b/components/metrics/proto/printer_event.proto
@@ -0,0 +1,64 @@
+// 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.
+//
+// Stores information about printer configuration attempts.
+
+syntax = "proto2";
+
+option optimize_for = LITE_RUNTIME;
+option java_outer_classname = "PrinterEventProtos";
+option java_package = "org.chromium.components.metrics";
+
+package metrics;
+
+// Stores information about a printer that a user is setting up/has attempted to
+// set up.
+// Next tag: 9
+message PrinterEventProto {
+  // The detected printer manufacuter name.
+  optional string usb_printer_manufacturer = 1;
+
+  // The detected printer model name.
+  optional string usb_printer_model = 2;
+
+  // The usb vendor id of the printer.
+  optional int32 usb_vendor_id = 3;
+
+  // The usb model id of the printer.
+  optional int32 usb_model_id = 4;
+
+  // The value reported as a printer's printer-make-and-model attribute.
+  optional string ipp_make_and_model = 5;
+
+  // A true value means that the user provided their own PPD.
+  optional bool user_ppd = 6;
+
+  // The identifier for PPDs from our serving system.
+  optional string ppd_identifier = 7;
+
+  // The action for which the printer was logged.
+  // Next tag: 5
+  enum EventType {
+    UNKNOWN = 0;
+
+    // Specified printer successfully installed using the detected
+    // configuration.
+    SETUP_AUTOMATIC = 1;
+
+    // Specified printer was installed when the user selected the appropriate
+    // configuration.
+    SETUP_MANUAL = 2;
+
+    // Setup was started but abandoned when user was prompted to choose a
+    // configuration.
+    SETUP_ABANDONED = 3;
+
+    // A printer, which had been successfully installed, was deleted from the
+    // user's preferences.
+    PRINTER_DELETED = 4;
+  }
+
+  // The event for which this was recorded.
+  optional EventType event_type = 8;
+}
diff --git a/components/net_log/chrome_net_log.cc b/components/net_log/chrome_net_log.cc
index 509de9d1..8c845413 100644
--- a/components/net_log/chrome_net_log.cc
+++ b/components/net_log/chrome_net_log.cc
@@ -4,12 +4,9 @@
 
 #include "components/net_log/chrome_net_log.h"
 
-#include <stdio.h>
 #include <utility>
 
 #include "base/command_line.h"
-#include "base/files/scoped_file.h"
-#include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/sys_info.h"
@@ -18,9 +15,9 @@
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_event_store.h"
 #include "components/net_log/net_export_file_writer.h"
 #include "components/version_info/version_info.h"
+#include "net/log/file_net_log_observer.h"
 #include "net/log/net_log_util.h"
 #include "net/log/trace_net_log_observer.h"
-#include "net/log/write_to_file_net_log_observer.h"
 
 namespace net_log {
 
@@ -31,48 +28,22 @@
 
 ChromeNetLog::~ChromeNetLog() {
   net_export_file_writer_.reset();
-  // Remove the observers we own before we're destroyed.
-  if (write_to_file_observer_)
-    write_to_file_observer_->StopObserving(nullptr);
-  if (trace_net_log_observer_)
-    trace_net_log_observer_->StopWatchForTraceStart();
+  ClearFileNetLogObserver();
+  trace_net_log_observer_->StopWatchForTraceStart();
 }
 
 void ChromeNetLog::StartWritingToFile(
-    const base::FilePath& log_file,
-    net::NetLogCaptureMode log_file_mode,
+    const base::FilePath& path,
+    net::NetLogCaptureMode capture_mode,
     const base::CommandLine::StringType& command_line_string,
     const std::string& channel_string) {
-  DCHECK(!log_file.empty());
+  DCHECK(!path.empty());
 
-  // TODO(716570): Use common code to write NetLog to file.
+  // TODO(739485): The log file does not contain about:flags data.
+  file_net_log_observer_ = net::FileNetLogObserver::CreateUnbounded(
+      path, GetConstants(command_line_string, channel_string));
 
-  // Much like logging.h, bypass threading restrictions by using fopen
-  // directly.  Have to write on a thread that's shutdown to handle events on
-  // shutdown properly, and posting events to another thread as they occur
-  // would result in an unbounded buffer size, so not much can be gained by
-  // doing this on another thread.  It's only used when debugging Chrome, so
-  // performance is not a big concern.
-  base::ScopedFILE file;
-#if defined(OS_WIN)
-  file.reset(_wfopen(log_file.value().c_str(), L"w"));
-#elif defined(OS_POSIX)
-  file.reset(fopen(log_file.value().c_str(), "w"));
-#endif
-
-  if (!file) {
-    LOG(ERROR) << "Could not open file " << log_file.value()
-               << " for net logging";
-  } else {
-    std::unique_ptr<base::Value> constants(
-        GetConstants(command_line_string, channel_string));
-    write_to_file_observer_.reset(new net::WriteToFileNetLogObserver());
-
-    write_to_file_observer_->set_capture_mode(log_file_mode);
-
-    write_to_file_observer_->StartObserving(this, std::move(file),
-                                            constants.get(), nullptr);
-  }
+  file_net_log_observer_->StartObserving(this, capture_mode);
 }
 
 NetExportFileWriter* ChromeNetLog::net_export_file_writer() {
@@ -115,4 +86,29 @@
   return std::move(constants_dict);
 }
 
+void ChromeNetLog::ShutDownBeforeTaskScheduler() {
+  // TODO(eroman): Stop in-progress net_export_file_writer_ or delete its files?
+
+  ClearFileNetLogObserver();
+}
+
+void ChromeNetLog::ClearFileNetLogObserver() {
+  if (!file_net_log_observer_)
+    return;
+
+  // TODO(739487): The log file does not contain any polled data.
+  //
+  // TODO(eroman): FileNetLogObserver::StopObserving() posts to the file task
+  // runner to finish writing the log file. Despite that sequenced task runner
+  // being marked BLOCK_SHUTDOWN, those tasks are not actually running.
+  //
+  // This isn't a big deal when using the unbounded logger since the log
+  // loading code can handle such truncated logs. But this will need fixing
+  // if switching to log formats that are not so versatile (also if adding
+  // polled data).
+  file_net_log_observer_->StopObserving(nullptr /*polled_data*/,
+                                        base::Closure());
+  file_net_log_observer_.reset();
+}
+
 }  // namespace net_log
diff --git a/components/net_log/chrome_net_log.h b/components/net_log/chrome_net_log.h
index 42c0c2a..cfa0298 100644
--- a/components/net_log/chrome_net_log.h
+++ b/components/net_log/chrome_net_log.h
@@ -18,7 +18,7 @@
 }
 
 namespace net {
-class WriteToFileNetLogObserver;
+class FileNetLogObserver;
 class TraceNetLogObserver;
 }
 
@@ -29,6 +29,10 @@
 // ChromeNetLog is an implementation of NetLog that manages common observers
 // (for --log-net-log, chrome://net-export/, tracing), as well as acting as the
 // entry point for other consumers.
+//
+// Threading:
+//   * The methods on net::NetLog are threadsafe
+//   * The methods defined by ChromeNetLog must be sequenced.
 class ChromeNetLog : public net::NetLog {
  public:
   ChromeNetLog();
@@ -36,11 +40,11 @@
 
   // Starts streaming the NetLog events to a file on disk. This will continue
   // until the application shuts down.
-  // * |log_file| - path to write the file.
-  // * |log_file_mode| - capture mode for event granularity.
+  // * |path| - destination file path of the log file.
+  // * |capture_mode| - capture mode for event granularity.
   void StartWritingToFile(
-      const base::FilePath& log_file,
-      net::NetLogCaptureMode log_file_mode,
+      const base::FilePath& path,
+      net::NetLogCaptureMode capture_mode,
       const base::CommandLine::StringType& command_line_string,
       const std::string& channel_string);
 
@@ -52,9 +56,31 @@
       const base::CommandLine::StringType& command_line_string,
       const std::string& channel_string);
 
+  // Notify the ChromeNetLog that things are shutting-down.
+  //
+  // If ChromeNetLog does not outlive the TaskScheduler, there is no need to
+  // call this.
+  //
+  // However, if it can outlive the TaskScheduler, this should be called
+  // before the TaskScheduler is shutdown. This allows for any file writers
+  // using BLOCK_SHUTDOWN to finish posting their writes.
+  //
+  // Not calling this is not a fatal error, however may result in an incomplete
+  // NetLog file being written to disk.
+  void ShutDownBeforeTaskScheduler();
+
  private:
-  std::unique_ptr<net::WriteToFileNetLogObserver> write_to_file_observer_;
+  // Deletes file_net_log_observer_.
+  void ClearFileNetLogObserver();
+
+  // This observer handles writing NetLogs specified via StartWritingToFile()
+  // (In Chrome this corresponds to the --log-net-log command line).
+  std::unique_ptr<net::FileNetLogObserver> file_net_log_observer_;
+
+  // This observer handles writing NetLogs started by chrome://net-export/
   std::unique_ptr<NetExportFileWriter> net_export_file_writer_;
+
+  // This observer forwards NetLog events to the chrome://tracing system.
   std::unique_ptr<net::TraceNetLogObserver> trace_net_log_observer_;
 
   DISALLOW_COPY_AND_ASSIGN(ChromeNetLog);
diff --git a/components/net_log/net_export_file_writer.cc b/components/net_log/net_export_file_writer.cc
index 07765ee..e20448d 100644
--- a/components/net_log/net_export_file_writer.cc
+++ b/components/net_log/net_export_file_writer.cc
@@ -120,7 +120,7 @@
 
 NetExportFileWriter::~NetExportFileWriter() {
   if (file_net_log_observer_)
-    file_net_log_observer_->StopObserving(nullptr, base::Bind([] {}));
+    file_net_log_observer_->StopObserving(nullptr, base::Closure());
 }
 
 void NetExportFileWriter::AddObserver(StateObserver* observer) {
@@ -184,9 +184,9 @@
 
   std::unique_ptr<base::Value> constants(
       ChromeNetLog::GetConstants(command_line_string, channel_string));
-  // Instantiate a FileNetLogObserver in unbounded mode.
-  file_net_log_observer_ = net::FileNetLogObserver::CreateUnbounded(
-      file_task_runner_, log_path_, std::move(constants));
+
+  file_net_log_observer_ =
+      net::FileNetLogObserver::CreateUnbounded(log_path_, std::move(constants));
 
   net_task_runner_->PostTaskAndReply(
       FROM_HERE,
diff --git a/components/net_log/net_export_file_writer_unittest.cc b/components/net_log/net_export_file_writer_unittest.cc
index 17f3b4b..cf61b07 100644
--- a/components/net_log/net_export_file_writer_unittest.cc
+++ b/components/net_log/net_export_file_writer_unittest.cc
@@ -16,8 +16,7 @@
 #include "base/files/scoped_temp_dir.h"
 #include "base/json/json_reader.h"
 #include "base/json/json_string_value_serializer.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
+#include "base/test/scoped_task_environment.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/values.h"
@@ -437,8 +436,7 @@
   TestStateObserver test_state_observer_;
 
  private:
-  // Allows tasks to be posted to the main thread.
-  base::MessageLoop message_loop_;
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
 };
 
 TEST_F(NetExportFileWriterTest, InitFail) {
diff --git a/components/ntp_snippets/content_suggestions_service.cc b/components/ntp_snippets/content_suggestions_service.cc
index e5a70bbe..1339cc1 100644
--- a/components/ntp_snippets/content_suggestions_service.cc
+++ b/components/ntp_snippets/content_suggestions_service.cc
@@ -285,8 +285,8 @@
     int minimum_size_in_pixel,
     int desired_size_in_pixel,
     const ImageFetchedCallback& callback,
-    bool success) {
-  if (!success) {
+    favicon_base::GoogleFaviconServerRequestStatus status) {
+  if (status != favicon_base::GoogleFaviconServerRequestStatus::SUCCESS) {
     callback.Run(gfx::Image());
     RecordFaviconFetchResult(FaviconFetchResult::FAILURE);
     return;
diff --git a/components/ntp_snippets/content_suggestions_service.h b/components/ntp_snippets/content_suggestions_service.h
index bf7b4ab..de03d6b 100644
--- a/components/ntp_snippets/content_suggestions_service.h
+++ b/components/ntp_snippets/content_suggestions_service.h
@@ -350,7 +350,7 @@
       int minimum_size_in_pixel,
       int desired_size_in_pixel,
       const ImageFetchedCallback& callback,
-      bool success);
+      favicon_base::GoogleFaviconServerRequestStatus status);
 
   // Whether the content suggestions feature is enabled.
   State state_;
diff --git a/components/ntp_snippets/remote/remote_suggestions_scheduler_impl.cc b/components/ntp_snippets/remote/remote_suggestions_scheduler_impl.cc
index c0922eb..8751a33 100644
--- a/components/ntp_snippets/remote/remote_suggestions_scheduler_impl.cc
+++ b/components/ntp_snippets/remote/remote_suggestions_scheduler_impl.cc
@@ -186,29 +186,62 @@
   return base::TimeDelta::FromSecondsD(value_hours * 3600.0);
 }
 
-void ReportTimeUntilFirstSoftTrigger(UserClassifier::UserClass user_class,
-                                     base::TimeDelta time_until_first_trigger) {
+void ReportTimeUntilFirstShownTrigger(
+    UserClassifier::UserClass user_class,
+    base::TimeDelta time_until_first_shown_trigger) {
   switch (user_class) {
     case UserClassifier::UserClass::RARE_NTP_USER:
       UMA_HISTOGRAM_CUSTOM_TIMES(
-          "NewTabPage.ContentSuggestions.TimeUntilFirstSoftTrigger.RareNTPUser",
-          time_until_first_trigger, base::TimeDelta::FromSeconds(1),
+          "NewTabPage.ContentSuggestions.TimeUntilFirstShownTrigger."
+          "RareNTPUser",
+          time_until_first_shown_trigger, base::TimeDelta::FromSeconds(1),
           base::TimeDelta::FromDays(7),
           /*bucket_count=*/50);
       break;
     case UserClassifier::UserClass::ACTIVE_NTP_USER:
       UMA_HISTOGRAM_CUSTOM_TIMES(
-          "NewTabPage.ContentSuggestions.TimeUntilFirstSoftTrigger."
+          "NewTabPage.ContentSuggestions.TimeUntilFirstShownTrigger."
           "ActiveNTPUser",
-          time_until_first_trigger, base::TimeDelta::FromSeconds(1),
+          time_until_first_shown_trigger, base::TimeDelta::FromSeconds(1),
           base::TimeDelta::FromDays(7),
           /*bucket_count=*/50);
       break;
     case UserClassifier::UserClass::ACTIVE_SUGGESTIONS_CONSUMER:
       UMA_HISTOGRAM_CUSTOM_TIMES(
-          "NewTabPage.ContentSuggestions.TimeUntilFirstSoftTrigger."
+          "NewTabPage.ContentSuggestions.TimeUntilFirstShownTrigger."
           "ActiveSuggestionsConsumer",
-          time_until_first_trigger, base::TimeDelta::FromSeconds(1),
+          time_until_first_shown_trigger, base::TimeDelta::FromSeconds(1),
+          base::TimeDelta::FromDays(7),
+          /*bucket_count=*/50);
+      break;
+  }
+}
+
+void ReportTimeUntilFirstStartupTrigger(
+    UserClassifier::UserClass user_class,
+    base::TimeDelta time_until_first_startup_trigger) {
+  switch (user_class) {
+    case UserClassifier::UserClass::RARE_NTP_USER:
+      UMA_HISTOGRAM_CUSTOM_TIMES(
+          "NewTabPage.ContentSuggestions.TimeUntilFirstStartupTrigger."
+          "RareNTPUser",
+          time_until_first_startup_trigger, base::TimeDelta::FromSeconds(1),
+          base::TimeDelta::FromDays(7),
+          /*bucket_count=*/50);
+      break;
+    case UserClassifier::UserClass::ACTIVE_NTP_USER:
+      UMA_HISTOGRAM_CUSTOM_TIMES(
+          "NewTabPage.ContentSuggestions.TimeUntilFirstStartupTrigger."
+          "ActiveNTPUser",
+          time_until_first_startup_trigger, base::TimeDelta::FromSeconds(1),
+          base::TimeDelta::FromDays(7),
+          /*bucket_count=*/50);
+      break;
+    case UserClassifier::UserClass::ACTIVE_SUGGESTIONS_CONSUMER:
+      UMA_HISTOGRAM_CUSTOM_TIMES(
+          "NewTabPage.ContentSuggestions.TimeUntilFirstStartupTrigger."
+          "ActiveSuggestionsConsumer",
+          time_until_first_startup_trigger, base::TimeDelta::FromSeconds(1),
           base::TimeDelta::FromDays(7),
           /*bucket_count=*/50);
       break;
@@ -413,7 +446,8 @@
           profile_prefs,
           RequestThrottler::RequestType::
               CONTENT_SUGGESTION_FETCHER_ACTIVE_SUGGESTIONS_CONSUMER),
-      time_until_first_trigger_reported_(false),
+      time_until_first_shown_trigger_reported_(false),
+      time_until_first_startup_trigger_reported_(false),
       eula_state_(base::MakeUnique<EulaState>(local_state_prefs, this)),
       profile_prefs_(profile_prefs),
       clock_(std::move(clock)),
@@ -622,17 +656,25 @@
     return;
   }
 
-  bool is_soft = trigger != TriggerType::PERSISTENT_SCHEDULER_WAKE_UP;
   const base::Time last_fetch_attempt_time = base::Time::FromInternalValue(
       profile_prefs_->GetInt64(prefs::kSnippetLastFetchAttempt));
 
-  if (is_soft && !time_until_first_trigger_reported_) {
-    time_until_first_trigger_reported_ = true;
-    ReportTimeUntilFirstSoftTrigger(user_classifier_->GetUserClass(),
-                                    clock_->Now() - last_fetch_attempt_time);
+  if (trigger == TriggerType::NTP_OPENED &&
+      !time_until_first_shown_trigger_reported_) {
+    time_until_first_shown_trigger_reported_ = true;
+    ReportTimeUntilFirstShownTrigger(user_classifier_->GetUserClass(),
+                                     clock_->Now() - last_fetch_attempt_time);
   }
 
-  if (is_soft &&
+  if ((trigger == TriggerType::BROWSER_FOREGROUNDED ||
+       trigger == TriggerType::BROWSER_COLD_START) &&
+      !time_until_first_startup_trigger_reported_) {
+    time_until_first_startup_trigger_reported_ = true;
+    ReportTimeUntilFirstStartupTrigger(user_classifier_->GetUserClass(),
+                                       clock_->Now() - last_fetch_attempt_time);
+  }
+
+  if (trigger != TriggerType::PERSISTENT_SCHEDULER_WAKE_UP &&
       !ShouldRefetchInTheBackgroundNow(last_fetch_attempt_time, trigger)) {
     return;
   }
@@ -736,7 +778,8 @@
 void RemoteSuggestionsSchedulerImpl::OnFetchCompleted(Status fetch_status) {
   profile_prefs_->SetInt64(prefs::kSnippetLastFetchAttempt,
                            clock_->Now().ToInternalValue());
-  time_until_first_trigger_reported_ = false;
+  time_until_first_shown_trigger_reported_ = false;
+  time_until_first_startup_trigger_reported_ = false;
 
   // Reschedule after a fetch. The persistent schedule is applied only after a
   // successful fetch. After a failed fetch, we want to keep the previous
diff --git a/components/ntp_snippets/remote/remote_suggestions_scheduler_impl.h b/components/ntp_snippets/remote/remote_suggestions_scheduler_impl.h
index 3e10362..8ded08f 100644
--- a/components/ntp_snippets/remote/remote_suggestions_scheduler_impl.h
+++ b/components/ntp_snippets/remote/remote_suggestions_scheduler_impl.h
@@ -147,8 +147,10 @@
   RequestThrottler request_throttler_active_ntp_user_;
   RequestThrottler request_throttler_active_suggestions_consumer_;
 
-  // To make sure we only report the first trigger to UMA.
-  bool time_until_first_trigger_reported_;
+  // Variables to make sure we only report the first trigger of each kind to
+  // UMA.
+  bool time_until_first_shown_trigger_reported_;
+  bool time_until_first_startup_trigger_reported_;
 
   // We should not fetch in background before EULA gets accepted.
   std::unique_ptr<EulaState> eula_state_;
diff --git a/components/ntp_tiles/BUILD.gn b/components/ntp_tiles/BUILD.gn
index b0784a80..d970418 100644
--- a/components/ntp_tiles/BUILD.gn
+++ b/components/ntp_tiles/BUILD.gn
@@ -36,9 +36,6 @@
     "webui/ntp_tiles_internals_message_handler.h",
     "webui/ntp_tiles_internals_message_handler_client.cc",
     "webui/ntp_tiles_internals_message_handler_client.h",
-    "webui/popular_sites_internals_message_handler.cc",
-    "webui/popular_sites_internals_message_handler.h",
-    "webui/popular_sites_internals_message_handler_client.h",
   ]
 
   public_deps = [
diff --git a/components/ntp_tiles/icon_cacher_impl.cc b/components/ntp_tiles/icon_cacher_impl.cc
index 0ae5160..48769f33 100644
--- a/components/ntp_tiles/icon_cacher_impl.cc
+++ b/components/ntp_tiles/icon_cacher_impl.cc
@@ -249,10 +249,15 @@
                      weak_ptr_factory_.GetWeakPtr(), page_url));
 }
 
-void IconCacherImpl::OnMostLikelyFaviconDownloaded(const GURL& request_url,
-                                                   bool success) {
-  UMA_HISTOGRAM_BOOLEAN("NewTabPage.TileFaviconFetchSuccess.Server", success);
-  FinishRequestAndNotifyIconAvailable(request_url, success);
+void IconCacherImpl::OnMostLikelyFaviconDownloaded(
+    const GURL& request_url,
+    favicon_base::GoogleFaviconServerRequestStatus status) {
+  UMA_HISTOGRAM_ENUMERATION(
+      "NewTabPage.TileFaviconFetchStatus.Server", status,
+      favicon_base::GoogleFaviconServerRequestStatus::COUNT);
+  FinishRequestAndNotifyIconAvailable(
+      request_url,
+      status == favicon_base::GoogleFaviconServerRequestStatus::SUCCESS);
 }
 
 bool IconCacherImpl::StartRequest(const GURL& request_url,
diff --git a/components/ntp_tiles/icon_cacher_impl.h b/components/ntp_tiles/icon_cacher_impl.h
index a124b2c..e15ceaf 100644
--- a/components/ntp_tiles/icon_cacher_impl.h
+++ b/components/ntp_tiles/icon_cacher_impl.h
@@ -25,6 +25,7 @@
 namespace favicon_base {
 struct FaviconImageResult;
 struct LargeIconResult;
+enum class GoogleFaviconServerRequestStatus;
 }  // namespace favicon_base
 
 namespace gfx {
@@ -83,7 +84,9 @@
       const GURL& page_url,
       const favicon_base::LargeIconResult& result);
 
-  void OnMostLikelyFaviconDownloaded(const GURL& request_url, bool success);
+  void OnMostLikelyFaviconDownloaded(
+      const GURL& request_url,
+      favicon_base::GoogleFaviconServerRequestStatus status);
 
   bool StartRequest(const GURL& request_url,
                     const base::Closure& icon_available);
diff --git a/components/ntp_tiles/icon_cacher_impl_unittest.cc b/components/ntp_tiles/icon_cacher_impl_unittest.cc
index 54f2fc2..2ce20e89 100644
--- a/components/ntp_tiles/icon_cacher_impl_unittest.cc
+++ b/components/ntp_tiles/icon_cacher_impl_unittest.cc
@@ -20,6 +20,7 @@
 #include "components/favicon/core/favicon_service_impl.h"
 #include "components/favicon/core/favicon_util.h"
 #include "components/favicon/core/large_icon_service.h"
+#include "components/favicon_base/favicon_types.h"
 #include "components/history/core/browser/history_database_params.h"
 #include "components/history/core/browser/history_service.h"
 #include "components/image_fetcher/core/image_decoder.h"
@@ -479,7 +480,7 @@
   EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::FAVICON));
   EXPECT_TRUE(IconIsCachedFor(page_url, favicon_base::TOUCH_ICON));
   EXPECT_THAT(histogram_tester.GetAllSamples(
-                  "NewTabPage.TileFaviconFetchSuccess.Server"),
+                  "NewTabPage.TileFaviconFetchStatus.Server"),
               IsEmpty());
 }
 
@@ -515,10 +516,12 @@
   loop.Run();
   EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::FAVICON));
   EXPECT_TRUE(IconIsCachedFor(page_url, favicon_base::TOUCH_ICON));
-  EXPECT_THAT(
-      histogram_tester.GetAllSamples(
-          "NewTabPage.TileFaviconFetchSuccess.Server"),
-      ElementsAre(Bucket(/*bucket=*/true, /*count=*/1)));
+  EXPECT_THAT(histogram_tester.GetAllSamples(
+                  "NewTabPage.TileFaviconFetchStatus.Server"),
+              ElementsAre(Bucket(
+                  /*bucket=*/static_cast<int>(
+                      favicon_base::GoogleFaviconServerRequestStatus::SUCCESS),
+                  /*count=*/1)));
 }
 
 TEST_F(IconCacherTestMostLikely, NotCachedAndFetchFailed) {
@@ -552,10 +555,13 @@
 
   EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::FAVICON));
   EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::TOUCH_ICON));
-  EXPECT_THAT(
-      histogram_tester.GetAllSamples(
-          "NewTabPage.TileFaviconFetchSuccess.Server"),
-      ElementsAre(Bucket(/*bucket=*/false, /*count=*/1)));
+  EXPECT_THAT(histogram_tester.GetAllSamples(
+                  "NewTabPage.TileFaviconFetchStatus.Server"),
+              ElementsAre(Bucket(
+                  /*bucket=*/static_cast<int>(
+                      favicon_base::GoogleFaviconServerRequestStatus::
+                          FAILURE_CONNECTION_ERROR),
+                  /*count=*/1)));
 }
 
 TEST_F(IconCacherTestMostLikely, HandlesEmptyCallbacksNicely) {
diff --git a/components/ntp_tiles/webui/popular_sites_internals_message_handler.cc b/components/ntp_tiles/webui/popular_sites_internals_message_handler.cc
deleted file mode 100644
index 68cc2228..0000000
--- a/components/ntp_tiles/webui/popular_sites_internals_message_handler.cc
+++ /dev/null
@@ -1,164 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/ntp_tiles/webui/popular_sites_internals_message_handler.h"
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/json/json_writer.h"
-#include "base/logging.h"
-#include "base/memory/ptr_util.h"
-#include "base/values.h"
-#include "components/ntp_tiles/popular_sites.h"
-#include "components/ntp_tiles/pref_names.h"
-#include "components/ntp_tiles/webui/popular_sites_internals_message_handler_client.h"
-#include "components/prefs/pref_service.h"
-#include "components/url_formatter/url_fixer.h"
-#include "url/gurl.h"
-
-namespace ntp_tiles {
-
-PopularSitesInternalsMessageHandlerClient::
-    PopularSitesInternalsMessageHandlerClient() = default;
-PopularSitesInternalsMessageHandlerClient::
-    ~PopularSitesInternalsMessageHandlerClient() = default;
-
-PopularSitesInternalsMessageHandler::PopularSitesInternalsMessageHandler(
-    PopularSitesInternalsMessageHandlerClient* web_ui)
-    : web_ui_(web_ui), weak_ptr_factory_(this) {}
-
-PopularSitesInternalsMessageHandler::~PopularSitesInternalsMessageHandler() =
-    default;
-
-void PopularSitesInternalsMessageHandler::RegisterMessages() {
-  web_ui_->RegisterMessageCallback(
-      "registerForEvents",
-      base::Bind(&PopularSitesInternalsMessageHandler::HandleRegisterForEvents,
-                 base::Unretained(this)));
-
-  web_ui_->RegisterMessageCallback(
-      "update", base::Bind(&PopularSitesInternalsMessageHandler::HandleUpdate,
-                           base::Unretained(this)));
-
-  web_ui_->RegisterMessageCallback(
-      "viewJson",
-      base::Bind(&PopularSitesInternalsMessageHandler::HandleViewJson,
-                 base::Unretained(this)));
-}
-
-void PopularSitesInternalsMessageHandler::HandleRegisterForEvents(
-    const base::ListValue* args) {
-  DCHECK(args->empty());
-
-  SendOverrides();
-
-  popular_sites_ = web_ui_->MakePopularSites();
-  SendSites();
-}
-
-void PopularSitesInternalsMessageHandler::HandleUpdate(
-    const base::ListValue* args) {
-  DCHECK_EQ(4u, args->GetSize());
-
-  PrefService* prefs = web_ui_->GetPrefs();
-
-  std::string url;
-  args->GetString(0, &url);
-  if (url.empty())
-    prefs->ClearPref(ntp_tiles::prefs::kPopularSitesOverrideURL);
-  else
-    prefs->SetString(ntp_tiles::prefs::kPopularSitesOverrideURL,
-                     url_formatter::FixupURL(url, std::string()).spec());
-
-  std::string directory;
-  args->GetString(1, &directory);
-  if (directory.empty())
-    prefs->ClearPref(ntp_tiles::prefs::kPopularSitesOverrideDirectory);
-  else
-    prefs->SetString(ntp_tiles::prefs::kPopularSitesOverrideDirectory,
-                     directory);
-
-  std::string country;
-  args->GetString(2, &country);
-  if (country.empty())
-    prefs->ClearPref(ntp_tiles::prefs::kPopularSitesOverrideCountry);
-  else
-    prefs->SetString(ntp_tiles::prefs::kPopularSitesOverrideCountry, country);
-
-  std::string version;
-  args->GetString(3, &version);
-  if (version.empty())
-    prefs->ClearPref(ntp_tiles::prefs::kPopularSitesOverrideVersion);
-  else
-    prefs->SetString(ntp_tiles::prefs::kPopularSitesOverrideVersion, version);
-
-  popular_sites_ = web_ui_->MakePopularSites();
-  popular_sites_->MaybeStartFetch(
-      true,
-      base::Bind(&PopularSitesInternalsMessageHandler::OnPopularSitesAvailable,
-                 base::Unretained(this)));
-}
-
-void PopularSitesInternalsMessageHandler::HandleViewJson(
-    const base::ListValue* args) {
-  DCHECK_EQ(0u, args->GetSize());
-
-  const base::ListValue* json = popular_sites_->GetCachedJson();
-  std::string json_string;
-  if (json) {
-    bool success = base::JSONWriter::Write(*json, &json_string);
-    DCHECK(success);
-  }
-  SendJson(json_string);
-}
-
-void PopularSitesInternalsMessageHandler::SendOverrides() {
-  PrefService* prefs = web_ui_->GetPrefs();
-  std::string url =
-      prefs->GetString(ntp_tiles::prefs::kPopularSitesOverrideURL);
-  std::string directory =
-      prefs->GetString(ntp_tiles::prefs::kPopularSitesOverrideDirectory);
-  std::string country =
-      prefs->GetString(ntp_tiles::prefs::kPopularSitesOverrideCountry);
-  std::string version =
-      prefs->GetString(ntp_tiles::prefs::kPopularSitesOverrideVersion);
-  web_ui_->CallJavascriptFunction(
-      "chrome.popular_sites_internals.receiveOverrides", base::Value(url),
-      base::Value(directory), base::Value(country), base::Value(version));
-}
-
-void PopularSitesInternalsMessageHandler::SendDownloadResult(bool success) {
-  base::Value result(success ? "Success" : "Fail");
-  web_ui_->CallJavascriptFunction(
-      "chrome.popular_sites_internals.receiveDownloadResult", result);
-}
-
-void PopularSitesInternalsMessageHandler::SendSites() {
-  auto sites_list = base::MakeUnique<base::ListValue>();
-  for (const PopularSites::Site& site : popular_sites_->sites()) {
-    auto entry = base::MakeUnique<base::DictionaryValue>();
-    entry->SetString("title", site.title);
-    entry->SetString("url", site.url.spec());
-    sites_list->Append(std::move(entry));
-  }
-
-  base::DictionaryValue result;
-  result.Set("sites", std::move(sites_list));
-  result.SetString("url", popular_sites_->GetLastURLFetched().spec());
-  web_ui_->CallJavascriptFunction("chrome.popular_sites_internals.receiveSites",
-                                  result);
-}
-
-void PopularSitesInternalsMessageHandler::SendJson(const std::string& json) {
-  web_ui_->CallJavascriptFunction("chrome.popular_sites_internals.receiveJson",
-                                  base::Value(json));
-}
-
-void PopularSitesInternalsMessageHandler::OnPopularSitesAvailable(
-    bool success) {
-  SendDownloadResult(success);
-  SendSites();
-}
-
-}  // namespace ntp_tiles
diff --git a/components/ntp_tiles/webui/popular_sites_internals_message_handler.h b/components/ntp_tiles/webui/popular_sites_internals_message_handler.h
deleted file mode 100644
index c0e05d0..0000000
--- a/components/ntp_tiles/webui/popular_sites_internals_message_handler.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_NTP_TILES_WEBUI_POPULAR_SITES_HANDLER_H_
-#define COMPONENTS_NTP_TILES_WEBUI_POPULAR_SITES_HANDLER_H_
-
-#include <memory>
-#include <string>
-
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-
-namespace base {
-class ListValue;
-}  // namespace base
-
-namespace ntp_tiles {
-
-class PopularSites;
-class PopularSitesInternalsMessageHandlerClient;
-
-// Implements the WebUI message handler for chrome://popular-sites-internals/
-//
-// Because content and iOS use different implementations of WebUI, this class
-// implements the generic portion and depends on the embedder to inject a bridge
-// to the embedder's API. It cannot itself implement either API directly.
-class PopularSitesInternalsMessageHandler {
- public:
-  explicit PopularSitesInternalsMessageHandler(
-      PopularSitesInternalsMessageHandlerClient* web_ui);
-  ~PopularSitesInternalsMessageHandler();
-
-  // Called when the WebUI page's JavaScript has loaded and it is ready to
-  // receive RegisterMessageCallback() calls.
-  void RegisterMessages();
-
- private:
-  // Callbacks registered in RegisterMessages().
-  void HandleRegisterForEvents(const base::ListValue* args);
-  void HandleUpdate(const base::ListValue* args);
-  void HandleViewJson(const base::ListValue* args);
-
-  void SendOverrides();
-  void SendDownloadResult(bool success);
-  void SendSites();
-  void SendJson(const std::string& json);
-
-  // Completion handler for popular_sites_->StartFetch().
-  void OnPopularSitesAvailable(bool success);
-
-  // Bridge to embedder's API.
-  PopularSitesInternalsMessageHandlerClient* web_ui_;
-
-  std::unique_ptr<PopularSites> popular_sites_;
-
-  base::WeakPtrFactory<PopularSitesInternalsMessageHandler> weak_ptr_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(PopularSitesInternalsMessageHandler);
-};
-
-}  // namespace ntp_tiles
-
-#endif  // COMPONENTS_NTP_TILES_WEBUI_POPULAR_SITES_HANDLER_H_
diff --git a/components/ntp_tiles/webui/popular_sites_internals_message_handler_client.h b/components/ntp_tiles/webui/popular_sites_internals_message_handler_client.h
deleted file mode 100644
index 43368f8..0000000
--- a/components/ntp_tiles/webui/popular_sites_internals_message_handler_client.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_NTP_TILES_WEBUI_POPULAR_SITES_HANDLER_CLIENT_H_
-#define COMPONENTS_NTP_TILES_WEBUI_POPULAR_SITES_HANDLER_CLIENT_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/callback_forward.h"
-#include "base/macros.h"
-
-class PrefService;
-
-namespace base {
-class Value;
-class ListValue;
-}  // namespace base
-
-namespace ntp_tiles {
-
-class PopularSites;
-
-// Implemented by embedders to hook up PopularSitesInternalsMessageHandler.
-class PopularSitesInternalsMessageHandlerClient {
- public:
-  // Returns the PrefService for the embedder and containing WebUI page.
-  virtual PrefService* GetPrefs() = 0;
-
-  // Creates a new PopularSites based on the context pf the WebUI page.
-  virtual std::unique_ptr<ntp_tiles::PopularSites> MakePopularSites() = 0;
-
-  // Registers a callback in Javascript. See content::WebUI and web::WebUIIOS.
-  virtual void RegisterMessageCallback(
-      const std::string& message,
-      const base::Callback<void(const base::ListValue*)>& callback) = 0;
-
-  // Invokes a function in Javascript. See content::WebUI and web::WebUIIOS.
-  virtual void CallJavascriptFunctionVector(
-      const std::string& name,
-      const std::vector<const base::Value*>& values) = 0;
-
-  // Helper function for CallJavascriptFunctionVector().
-  template <typename... Arg>
-  void CallJavascriptFunction(const std::string& name, const Arg&... arg) {
-    CallJavascriptFunctionVector(name, {&arg...});
-  }
-
- protected:
-  PopularSitesInternalsMessageHandlerClient();
-  virtual ~PopularSitesInternalsMessageHandlerClient();
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(PopularSitesInternalsMessageHandlerClient);
-};
-
-}  // namespace ntp_tiles
-
-#endif  // COMPONENTS_NTP_TILES_WEBUI_POPULAR_SITES_HANDLER_CLIENT_H_
diff --git a/components/ntp_tiles/webui/resources/popular_sites_internals.css b/components/ntp_tiles/webui/resources/popular_sites_internals.css
deleted file mode 100644
index ee4c1d4..0000000
--- a/components/ntp_tiles/webui/resources/popular_sites_internals.css
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Copyright 2015 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file. */
-
-html {
-  font-size: 20px;
-}
-
-#info > div {
-  width: 100%;
-}
-
-#info h2 {
-  color: rgb(74, 142, 230);
-  font-size: 100%;
-  margin-bottom: 0;
-}
-
-#info .err {
-  color: red;
-}
-
-#info .section {
-  display: inline-block;
-  margin-left: auto;
-  margin-right: auto;
-}
-
-#info .section.hidden {
-  display: none;
-}
-
-.section-details {
-  width: 100%;
-}
-
-.section-details .detail,
-.section-details .value {
-  width: 50%;
-}
-
-.section-details tr:nth-child(odd) {
-  background: rgb(239, 243, 255);
-}
-
-#json-value {
-  font-size: 75%;
-}
diff --git a/components/ntp_tiles/webui/resources/popular_sites_internals.html b/components/ntp_tiles/webui/resources/popular_sites_internals.html
deleted file mode 100644
index 5ce97bcf..0000000
--- a/components/ntp_tiles/webui/resources/popular_sites_internals.html
+++ /dev/null
@@ -1,86 +0,0 @@
-<!--
-Copyright 2015 The Chromium Authors. All rights reserved.
-Use of this source code is governed by a BSD-style license that can be
-found in the LICENSE file.
--->
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="utf-8">
-<if expr="is_android or is_ios">
-<meta name="viewport" content="width=device-width, initial-scale=1.0">
-</if>
-<title>Popular Sites Internals</title>
-<link rel="stylesheet" href="chrome://resources/css/text_defaults.css">
-<link rel="stylesheet" href="chrome://resources/css/list.css">
-<link rel="stylesheet" href="popular_sites_internals.css">
-<script src="chrome://resources/js/cr.js"></script>
-<script src="chrome://resources/js/jstemplate_compiled.js"></script>
-<script src="chrome://resources/js/load_time_data.js"></script>
-<script src="chrome://resources/js/util.js"></script>
-<if expr="is_ios">
-<!-- TODO(crbug.com/487000): Remove this once injected by web. -->
-<script src="chrome://resources/js/ios/web_ui.js"></script>
-</if>
-<script src="popular_sites_internals.js"></script>
-</head>
-
-<body>
-<div id="info">
-  <div class="section" jsskip="true">
-    <h2>Download</h2>
-    <table class="section-details">
-      <tr>
-        <td class="detail">URL (takes precedence over Directory, Country and Version)</td>
-        <td class="value"><input id="override-url" type="text"></td>
-      </tr>
-      <tr>
-        <td class="detail">Override Directory</td>
-        <td class="value"><input id="override-directory" type="text"></td>
-      </tr>
-      <tr>
-        <td class="detail">Override Country</td>
-        <td class="value"><input id="override-country" type="text"></td>
-      </tr>
-      <tr>
-        <td class="detail">Override Version</td>
-        <td class="value"><input id="override-version" type="text"></td>
-      </tr>
-      <tr>
-        <td class="detail">
-          <input id="submit-update" type="submit" value="Update">
-        </td>
-        <td id="download-result" class="value"></td>
-      </tr>
-    </table>
-  </div>
-
-  <div class="section">
-    <h2>Info</h2>
-    <table class="section-details">
-      <tr>
-        <td class="detail">URL</td>
-        <td class="value" jscontent="url"></td>
-      </tr>
-    </table>
-  </div>
-
-  <div class="section">
-    <h2>Sites</h2>
-    <table class="section-details">
-      <tr jsselect="sites">
-        <td class="detail" jscontent="title"></td>
-        <td class="value" jscontent="url"></td>
-      </tr>
-      <tr jsskip="true">
-        <td class="detail">
-          <input id="view-json" type="submit" value="View JSON">
-        </td>
-        <td class="value"><pre id="json-value"></pre></td>
-      </tr>
-    </table>
-  </div>
-</div>
-
-</body>
-</html>
diff --git a/components/ntp_tiles/webui/resources/popular_sites_internals.js b/components/ntp_tiles/webui/resources/popular_sites_internals.js
deleted file mode 100644
index 3bfcf8b..0000000
--- a/components/ntp_tiles/webui/resources/popular_sites_internals.js
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-cr.define('chrome.popular_sites_internals', function() {
-  'use strict';
-
-  function initialize() {
-    function submitUpdate(event) {
-      $('download-result').textContent = '';
-      chrome.send('update', [$('override-url').value,
-                             $('override-directory').value,
-                             $('override-country').value,
-                             $('override-version').value]);
-      event.preventDefault();
-    }
-
-    $('submit-update').addEventListener('click', submitUpdate);
-
-    function viewJson(event) {
-      $('json-value').textContent = '';
-      chrome.send('viewJson');
-      event.preventDefault();
-    }
-
-    $('view-json').addEventListener('click', viewJson);
-
-    chrome.send('registerForEvents');
-  }
-
-  function receiveOverrides(url, directory, country, version) {
-    $('override-url').value = url;
-    $('override-directory').value = directory;
-    $('override-country').value = country;
-    $('override-version').value = version;
-  }
-
-  function receiveDownloadResult(result) {
-    $('download-result').textContent = result;
-  }
-
-  function receiveSites(sites) {
-    jstProcess(new JsEvalContext(sites), $('info'));
-    // Also clear the json string, since it's likely stale now.
-    $('json-value').textContent = '';
-  }
-
-  function receiveJson(json) {
-    $('json-value').textContent = json;
-  }
-
-  // Return an object with all of the exports.
-  return {
-    initialize: initialize,
-    receiveOverrides: receiveOverrides,
-    receiveDownloadResult: receiveDownloadResult,
-    receiveSites: receiveSites,
-    receiveJson: receiveJson,
-  };
-});
-
-document.addEventListener('DOMContentLoaded',
-                          chrome.popular_sites_internals.initialize);
diff --git a/components/resources/ntp_tiles_resources.grdp b/components/resources/ntp_tiles_resources.grdp
index 7d8d6c0a..9367081 100644
--- a/components/resources/ntp_tiles_resources.grdp
+++ b/components/resources/ntp_tiles_resources.grdp
@@ -1,9 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <grit-part>
   <if expr="is_android or is_ios">
-    <include name="IDR_POPULAR_SITES_INTERNALS_HTML" file="../ntp_tiles/webui/resources/popular_sites_internals.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
-    <include name="IDR_POPULAR_SITES_INTERNALS_JS" file="../ntp_tiles/webui/resources/popular_sites_internals.js" type="BINDATA" />
-    <include name="IDR_POPULAR_SITES_INTERNALS_CSS" file="../ntp_tiles/webui/resources/popular_sites_internals.css" type="BINDATA" />
     <if expr="_google_chrome">
       <then>
         <include name="IDR_DEFAULT_POPULAR_SITES_JSON" file="../ntp_tiles/resources/internal/default_popular_sites.json" type="BINDATA" />
diff --git a/components/search_provider_logos/BUILD.gn b/components/search_provider_logos/BUILD.gn
index da7b796..7b9909e1 100644
--- a/components/search_provider_logos/BUILD.gn
+++ b/components/search_provider_logos/BUILD.gn
@@ -4,6 +4,8 @@
 
 static_library("search_provider_logos") {
   sources = [
+    "features.cc",
+    "features.h",
     "fixed_logo_api.cc",
     "fixed_logo_api.h",
     "google_logo_api.cc",
@@ -34,6 +36,7 @@
 source_set("unit_tests") {
   testonly = true
   sources = [
+    "google_logo_api_unittest.cc",
     "logo_cache_unittest.cc",
     "logo_tracker_unittest.cc",
   ]
diff --git a/components/search_provider_logos/features.cc b/components/search_provider_logos/features.cc
new file mode 100644
index 0000000..1326c7f
--- /dev/null
+++ b/components/search_provider_logos/features.cc
@@ -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.
+
+#include "components/search_provider_logos/features.h"
+
+namespace search_provider_logos {
+namespace features {
+
+const base::Feature kUseDdljsonApi{"UseDdljsonApi",
+                                   base::FEATURE_DISABLED_BY_DEFAULT};
+
+}  // namespace features
+}  // namespace search_provider_logos
diff --git a/components/search_provider_logos/features.h b/components/search_provider_logos/features.h
new file mode 100644
index 0000000..05c46e5e
--- /dev/null
+++ b/components/search_provider_logos/features.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 COMPONENTS_SEARCH_PROVIDER_LOGOS_FEATURES_H_
+#define COMPONENTS_SEARCH_PROVIDER_LOGOS_FEATURES_H_
+
+#include "base/feature_list.h"
+
+namespace search_provider_logos {
+namespace features {
+
+extern const base::Feature kUseDdljsonApi;
+
+}  // namespace features
+}  // namespace search_provider_logos
+
+#endif  // COMPONENTS_SEARCH_PROVIDER_LOGOS_FEATURES_H_
diff --git a/components/search_provider_logos/google_logo_api.cc b/components/search_provider_logos/google_logo_api.cc
index 91d8218d..2750c90 100644
--- a/components/search_provider_logos/google_logo_api.cc
+++ b/components/search_provider_logos/google_logo_api.cc
@@ -9,21 +9,51 @@
 #include <algorithm>
 
 #include "base/base64.h"
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/feature_list.h"
 #include "base/json/json_reader.h"
+#include "base/memory/ptr_util.h"
+#include "base/memory/ref_counted.h"
 #include "base/memory/ref_counted_memory.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
 #include "base/values.h"
+#include "components/search_provider_logos/features.h"
+#include "url/url_constants.h"
 
 namespace search_provider_logos {
 
+GURL GetGoogleDoodleURL(const GURL& google_base_url) {
+  GURL::Replacements replacements;
+  replacements.SetPathStr(base::FeatureList::IsEnabled(features::kUseDdljsonApi)
+                              ? "async/ddljson"
+                              : "async/newtab_mobile");
+  return google_base_url.ReplaceComponents(replacements);
+}
+
+AppendQueryparamsToLogoURL GetGoogleAppendQueryparamsCallback(
+    bool gray_background) {
+  if (base::FeatureList::IsEnabled(features::kUseDdljsonApi))
+    return base::Bind(&GoogleNewAppendQueryparamsToLogoURL, gray_background);
+
+  return base::Bind(&GoogleLegacyAppendQueryparamsToLogoURL, gray_background);
+}
+
+ParseLogoResponse GetGoogleParseLogoResponseCallback(const GURL& base_url) {
+  if (base::FeatureList::IsEnabled(features::kUseDdljsonApi))
+    return base::Bind(&GoogleNewParseLogoResponse, base_url);
+
+  return base::Bind(&GoogleLegacyParseLogoResponse);
+}
+
 namespace {
 const char kResponsePreamble[] = ")]}'";
 }
 
-GURL GoogleAppendQueryparamsToLogoURL(bool gray_background,
-                                      const GURL& logo_url,
-                                      const std::string& fingerprint) {
+GURL GoogleLegacyAppendQueryparamsToLogoURL(bool gray_background,
+                                            const GURL& logo_url,
+                                            const std::string& fingerprint) {
   // Note: we can't just use net::AppendQueryParameter() because it escapes
   // ":" to "%3A", but the server requires the colon not to be escaped.
   // See: http://crbug.com/413845
@@ -55,7 +85,7 @@
   return logo_url.ReplaceComponents(replacements);
 }
 
-std::unique_ptr<EncodedLogo> GoogleParseLogoResponse(
+std::unique_ptr<EncodedLogo> GoogleLegacyParseLogoResponse(
     std::unique_ptr<std::string> response,
     base::Time response_time,
     bool* parsing_failed) {
@@ -147,4 +177,158 @@
   return logo;
 }
 
+GURL GoogleNewAppendQueryparamsToLogoURL(bool gray_background,
+                                         const GURL& logo_url,
+                                         const std::string& fingerprint) {
+  // Note: we can't just use net::AppendQueryParameter() because it escapes
+  // ":" to "%3A", but the server requires the colon not to be escaped.
+  // See: http://crbug.com/413845
+
+  std::string query(logo_url.query());
+  if (!query.empty())
+    query += "&";
+
+  query += "async=";
+
+  std::vector<base::StringPiece> params;
+  params.push_back("ntp:1");
+  if (gray_background) {
+    params.push_back("graybg:1");
+  }
+  if (!fingerprint.empty()) {
+    params.push_back("es_dfp:" + fingerprint);
+  }
+  query += base::JoinString(params, ",");
+
+  GURL::Replacements replacements;
+  replacements.SetQueryStr(query);
+  return logo_url.ReplaceComponents(replacements);
+}
+
+namespace {
+
+GURL ParseUrl(const base::DictionaryValue& parent_dict,
+              const std::string& key,
+              const GURL& base_url) {
+  std::string url_str;
+  if (!parent_dict.GetString(key, &url_str) || url_str.empty()) {
+    return GURL();
+  }
+  return base_url.Resolve(url_str);
+}
+
+}  // namespace
+
+std::unique_ptr<EncodedLogo> GoogleNewParseLogoResponse(
+    const GURL& base_url,
+    std::unique_ptr<std::string> response,
+    base::Time response_time,
+    bool* parsing_failed) {
+  // The response may start with )]}'. Ignore this.
+  base::StringPiece response_sp(*response);
+  if (response_sp.starts_with(kResponsePreamble))
+    response_sp.remove_prefix(strlen(kResponsePreamble));
+
+  // Default parsing failure to be true.
+  *parsing_failed = true;
+
+  int error_code;
+  std::string error_string;
+  int error_line;
+  int error_col;
+  std::unique_ptr<base::Value> value = base::JSONReader::ReadAndReturnError(
+      response_sp, 0, &error_code, &error_string, &error_line, &error_col);
+  if (!value) {
+    LOG(WARNING) << error_string << " at " << error_line << ":" << error_col;
+    return nullptr;
+  }
+
+  std::unique_ptr<base::DictionaryValue> config =
+      base::DictionaryValue::From(std::move(value));
+  if (!config)
+    return nullptr;
+
+  const base::DictionaryValue* ddljson = nullptr;
+  if (!config->GetDictionary("ddljson", &ddljson))
+    return nullptr;
+
+  // If there is no logo today, the "ddljson" dictionary will be empty.
+  if (ddljson->empty()) {
+    *parsing_failed = false;
+    return nullptr;
+  }
+
+  auto logo = base::MakeUnique<EncodedLogo>();
+
+  // Check if the main image is animated.
+  bool is_animated = false;
+  const base::DictionaryValue* image = nullptr;
+  if (ddljson->GetDictionary("large_image", &image)) {
+    image->GetBoolean("is_animated", &is_animated);
+
+    // If animated, get the URL for the animated image.
+    if (is_animated) {
+      GURL animated_url = ParseUrl(*image, "url", base_url);
+      if (!animated_url.is_valid())
+        return nullptr;
+      logo->metadata.animated_url = animated_url.spec();
+    }
+  }
+
+  // Data is optional, since we may be revalidating a cached logo.
+  // If this is an animated doodle, get the CTA image data.
+  std::string encoded_image_data;
+  if (ddljson->GetString(is_animated ? "cta_data_uri" : "data_uri",
+                         &encoded_image_data)) {
+    GURL encoded_image_uri(encoded_image_data);
+    if (!encoded_image_uri.is_valid() ||
+        !encoded_image_uri.SchemeIs(url::kDataScheme)) {
+      return nullptr;
+    }
+    std::string content = encoded_image_uri.GetContent();
+    // The content should look like this: "image/png;base64,aaa..." (where
+    // "aaa..." is the base64-encoded image data).
+    size_t mime_type_end = content.find_first_of(';');
+    if (mime_type_end == std::string::npos)
+      return nullptr;
+    logo->metadata.mime_type = content.substr(0, mime_type_end);
+
+    size_t base64_begin = mime_type_end + 1;
+    size_t base64_end = content.find_first_of(',', base64_begin);
+    if (base64_end == std::string::npos)
+      return nullptr;
+    base::StringPiece base64(content.begin() + base64_begin,
+                             content.begin() + base64_end);
+    if (base64 != "base64")
+      return nullptr;
+
+    size_t data_begin = base64_end + 1;
+    base::StringPiece data(content.begin() + data_begin, content.end());
+    logo->encoded_image = base::MakeRefCounted<base::RefCountedString>();
+    if (!base::Base64Decode(data, &logo->encoded_image->data()))
+      return nullptr;
+  }
+
+  logo->metadata.on_click_url =
+      ParseUrl(*ddljson, "target_url", base_url).spec();
+  ddljson->GetString("alt_text", &logo->metadata.alt_text);
+
+  ddljson->GetString("fingerprint", &logo->metadata.fingerprint);
+
+  base::TimeDelta time_to_live;
+  // The JSON doesn't guarantee the number to fit into an int.
+  double ttl_ms = 0;  // Expires immediately if the parameter is missing.
+  if (ddljson->GetDouble("time_to_live_ms", &ttl_ms)) {
+    time_to_live = base::TimeDelta::FromMillisecondsD(ttl_ms);
+    logo->metadata.can_show_after_expiration = false;
+  } else {
+    time_to_live = base::TimeDelta::FromMilliseconds(kMaxTimeToLiveMS);
+    logo->metadata.can_show_after_expiration = true;
+  }
+  logo->metadata.expiration_time = response_time + time_to_live;
+
+  *parsing_failed = false;
+  return logo;
+}
+
 }  // namespace search_provider_logos
diff --git a/components/search_provider_logos/google_logo_api.h b/components/search_provider_logos/google_logo_api.h
index d5f85c7..3c3929e 100644
--- a/components/search_provider_logos/google_logo_api.h
+++ b/components/search_provider_logos/google_logo_api.h
@@ -14,14 +14,40 @@
 
 namespace search_provider_logos {
 
-// Implements AppendFingerprintToLogoURL, defined in logo_tracker.h, for Google
-// doodles.
-GURL GoogleAppendQueryparamsToLogoURL(bool gray_background,
-                                      const GURL& logo_url,
-                                      const std::string& fingerprint);
+// Returns the URL where the doodle can be downloaded, e.g.
+// https://www.google.com/async/newtab_mobile. This depends on the user's
+// Google domain.
+GURL GetGoogleDoodleURL(const GURL& google_base_url);
 
-// Implements ParseLogoResponse, defined in logo_tracker.h, for Google doodles.
-std::unique_ptr<EncodedLogo> GoogleParseLogoResponse(
+// These return the correct callbacks for appending queryparams and parsing the
+// response ("Legacy" or "New"), based on the value of features::kUseDdljsonApi.
+AppendQueryparamsToLogoURL GetGoogleAppendQueryparamsCallback(
+    bool gray_background);
+ParseLogoResponse GetGoogleParseLogoResponseCallback(const GURL& base_url);
+
+// Implements AppendQueryparamsToLogoURL, defined in logo_tracker.h, for Google
+// doodles (old newtab_mobile API).
+GURL GoogleLegacyAppendQueryparamsToLogoURL(bool gray_background,
+                                            const GURL& logo_url,
+                                            const std::string& fingerprint);
+
+// Implements ParseLogoResponse, defined in logo_tracker.h, for Google doodles
+// (old newtab_mobile API).
+std::unique_ptr<EncodedLogo> GoogleLegacyParseLogoResponse(
+    std::unique_ptr<std::string> response,
+    base::Time response_time,
+    bool* parsing_failed);
+
+// Implements AppendQueryparamsToLogoURL, defined in logo_tracker.h, for Google
+// doodles (new ddljson API).
+GURL GoogleNewAppendQueryparamsToLogoURL(bool gray_background,
+                                         const GURL& logo_url,
+                                         const std::string& fingerprint);
+
+// Implements ParseLogoResponse, defined in logo_tracker.h, for Google doodles
+// (new ddljson API).
+std::unique_ptr<EncodedLogo> GoogleNewParseLogoResponse(
+    const GURL& base_url,
     std::unique_ptr<std::string> response,
     base::Time response_time,
     bool* parsing_failed);
diff --git a/components/search_provider_logos/google_logo_api_unittest.cc b/components/search_provider_logos/google_logo_api_unittest.cc
new file mode 100644
index 0000000..221ee31
--- /dev/null
+++ b/components/search_provider_logos/google_logo_api_unittest.cc
@@ -0,0 +1,100 @@
+// 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/search_provider_logos/google_logo_api.h"
+
+#include <memory>
+#include <string>
+
+#include "base/memory/ptr_util.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+
+using testing::Eq;
+
+namespace search_provider_logos {
+
+TEST(GoogleNewLogoApiTest, ResolvesRelativeUrl) {
+  const GURL base_url("https://base.doo/");
+  const std::string json = R"json()]}'
+{
+  "ddljson": {
+    "target_url": "/target"
+  }
+})json";
+
+  bool failed = false;
+  std::unique_ptr<EncodedLogo> logo = GoogleNewParseLogoResponse(
+      base_url, base::MakeUnique<std::string>(json), base::Time(), &failed);
+
+  ASSERT_FALSE(failed);
+  ASSERT_TRUE(logo);
+  EXPECT_EQ("https://base.doo/target", logo->metadata.on_click_url);
+}
+
+TEST(GoogleNewLogoApiTest, DoesNotResolveAbsoluteUrl) {
+  const GURL base_url("https://base.doo/");
+  const std::string json = R"json()]}'
+{
+  "ddljson": {
+    "target_url": "https://www.doodle.com/target"
+  }
+})json";
+
+  bool failed = false;
+  std::unique_ptr<EncodedLogo> logo = GoogleNewParseLogoResponse(
+      base_url, base::MakeUnique<std::string>(json), base::Time(), &failed);
+
+  ASSERT_FALSE(failed);
+  ASSERT_TRUE(logo);
+  EXPECT_EQ("https://www.doodle.com/target", logo->metadata.on_click_url);
+}
+
+TEST(GoogleNewLogoApiTest, ParsesStaticImage) {
+  const GURL base_url("https://base.doo/");
+  // Note: The base64 encoding of "abc" is "YWJj".
+  const std::string json = R"json()]}'
+{
+  "ddljson": {
+    "target_url": "/target",
+    "data_uri": "data:image/png;base64,YWJj"
+  }
+})json";
+
+  bool failed = false;
+  std::unique_ptr<EncodedLogo> logo = GoogleNewParseLogoResponse(
+      base_url, base::MakeUnique<std::string>(json), base::Time(), &failed);
+
+  ASSERT_FALSE(failed);
+  ASSERT_TRUE(logo);
+  EXPECT_EQ("abc", logo->encoded_image->data());
+}
+
+TEST(GoogleNewLogoApiTest, ParsesAnimatedImage) {
+  const GURL base_url("https://base.doo/");
+  // Note: The base64 encoding of "abc" is "YWJj".
+  const std::string json = R"json()]}'
+{
+  "ddljson": {
+    "target_url": "/target",
+    "large_image": {
+      "is_animated": true,
+      "url": "https://www.doodle.com/image.gif"
+    },
+    "cta_data_uri": "data:image/png;base64,YWJj"
+  }
+})json";
+
+  bool failed = false;
+  std::unique_ptr<EncodedLogo> logo = GoogleNewParseLogoResponse(
+      base_url, base::MakeUnique<std::string>(json), base::Time(), &failed);
+
+  ASSERT_FALSE(failed);
+  ASSERT_TRUE(logo);
+  EXPECT_EQ("https://www.doodle.com/image.gif", logo->metadata.animated_url);
+  EXPECT_EQ("abc", logo->encoded_image->data());
+}
+
+}  // namespace search_provider_logos
diff --git a/components/search_provider_logos/logo_common.h b/components/search_provider_logos/logo_common.h
index ce94005f..fbb3a9c 100644
--- a/components/search_provider_logos/logo_common.h
+++ b/components/search_provider_logos/logo_common.h
@@ -7,13 +7,17 @@
 
 #include <stdint.h>
 
+#include <memory>
 #include <string>
 
+#include "base/callback_forward.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/ref_counted_memory.h"
 #include "base/time/time.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 
+class GURL;
+
 namespace search_provider_logos {
 
 // The maximum number of milliseconds that a logo can be cached.
@@ -73,6 +77,18 @@
   LogoMetadata metadata;
 };
 
+// Parses the response from the server and returns it as an EncodedLogo. Returns
+// null if the response is invalid.
+using ParseLogoResponse = base::Callback<std::unique_ptr<EncodedLogo>(
+    std::unique_ptr<std::string> response,
+    base::Time response_time,
+    bool* parsing_failed)>;
+
+// Encodes the fingerprint of the cached logo in the logo URL. This enables the
+// server to verify whether the cached logo is up to date.
+using AppendQueryparamsToLogoURL =
+    base::Callback<GURL(const GURL& logo_url, const std::string& fingerprint)>;
+
 }  // namespace search_provider_logos
 
 #endif  // COMPONENTS_SEARCH_PROVIDER_LOGOS_LOGO_COMMON_H_
diff --git a/components/search_provider_logos/logo_tracker.h b/components/search_provider_logos/logo_tracker.h
index 1362f75..7a05504 100644
--- a/components/search_provider_logos/logo_tracker.h
+++ b/components/search_provider_logos/logo_tracker.h
@@ -67,18 +67,6 @@
       base::Callback<void(const SkBitmap&)> image_decoded_callback) = 0;
 };
 
-// Parses the response from the server and returns it as an EncodedLogo. Returns
-// null if the response is invalid.
-using ParseLogoResponse = base::Callback<std::unique_ptr<EncodedLogo>(
-    std::unique_ptr<std::string> response,
-    base::Time response_time,
-    bool* parsing_failed)>;
-
-// Encodes the fingerprint of the cached logo in the logo URL. This enables the
-// server to verify whether the cached logo is up to date.
-using AppendQueryparamsToLogoURL =
-    base::Callback<GURL(const GURL& logo_url, const std::string& fingerprint)>;
-
 // This class provides the logo for a search provider. Logos are downloaded from
 // the search provider's logo URL and cached on disk.
 //
diff --git a/components/search_provider_logos/logo_tracker_unittest.cc b/components/search_provider_logos/logo_tracker_unittest.cc
index 346ee57..1b634c39 100644
--- a/components/search_provider_logos/logo_tracker_unittest.cc
+++ b/components/search_provider_logos/logo_tracker_unittest.cc
@@ -326,8 +326,8 @@
                                           base::ThreadTaskRunnerHandle::Get()),
                                       base::MakeUnique<TestLogoDelegate>());
     logo_tracker_->SetServerAPI(
-        logo_url_, base::Bind(&GoogleParseLogoResponse),
-        base::Bind(&GoogleAppendQueryparamsToLogoURL, false));
+        logo_url_, base::Bind(&GoogleLegacyParseLogoResponse),
+        base::Bind(&GoogleLegacyAppendQueryparamsToLogoURL, false));
     logo_tracker_->SetClockForTests(base::WrapUnique(test_clock_));
     logo_tracker_->SetLogoCacheForTests(base::WrapUnique(logo_cache_));
   }
@@ -392,7 +392,7 @@
     net::URLRequestStatus::Status request_status,
     net::HttpStatusCode response_code) {
   GURL url_with_fp =
-      GoogleAppendQueryparamsToLogoURL(false, logo_url_, fingerprint);
+      GoogleLegacyAppendQueryparamsToLogoURL(false, logo_url_, fingerprint);
   fake_url_fetcher_factory_.SetFakeResponse(
       url_with_fp, response_when_fingerprint, response_code, request_status);
 }
@@ -405,24 +405,24 @@
 // Tests -----------------------------------------------------------------------
 
 TEST_F(LogoTrackerTest, CTAURLHasComma) {
-  GURL url_with_fp = GoogleAppendQueryparamsToLogoURL(
+  GURL url_with_fp = GoogleLegacyAppendQueryparamsToLogoURL(
       false, GURL("http://logourl.com/path"), "abc123");
   EXPECT_EQ("http://logourl.com/path?async=es_dfp:abc123,cta:1",
             url_with_fp.spec());
 
-  url_with_fp = GoogleAppendQueryparamsToLogoURL(
+  url_with_fp = GoogleLegacyAppendQueryparamsToLogoURL(
       false, GURL("http://logourl.com/?a=b"), "");
   EXPECT_EQ("http://logourl.com/?a=b&async=cta:1", url_with_fp.spec());
 }
 
 TEST_F(LogoTrackerTest, CTAGrayBackgroundHasCommas) {
-  GURL url_with_fp = GoogleAppendQueryparamsToLogoURL(
+  GURL url_with_fp = GoogleLegacyAppendQueryparamsToLogoURL(
       true, GURL("http://logourl.com/path"), "abc123");
   EXPECT_EQ(
       "http://logourl.com/path?async=es_dfp:abc123,cta:1,transp:1,graybg:1",
       url_with_fp.spec());
 
-  url_with_fp = GoogleAppendQueryparamsToLogoURL(
+  url_with_fp = GoogleLegacyAppendQueryparamsToLogoURL(
       true, GURL("http://logourl.com/?a=b"), "");
   EXPECT_EQ("http://logourl.com/?a=b&async=cta:1,transp:1,graybg:1",
             url_with_fp.spec());
@@ -732,8 +732,8 @@
 
   logo_url_ = GURL("http://example.com/new-logo-url");
   logo_tracker_->SetServerAPI(
-      logo_url_, base::Bind(&GoogleParseLogoResponse),
-      base::Bind(&GoogleAppendQueryparamsToLogoURL, false));
+      logo_url_, base::Bind(&GoogleLegacyParseLogoResponse),
+      base::Bind(&GoogleLegacyAppendQueryparamsToLogoURL, false));
   Logo logo = GetSampleLogo(logo_url_, test_clock_->Now());
   SetServerResponse(ServerResponse(logo));
 
diff --git a/components/subresource_filter/content/common/ruleset_dealer.cc b/components/subresource_filter/content/common/ruleset_dealer.cc
index 5977350..04a6fd7 100644
--- a/components/subresource_filter/content/common/ruleset_dealer.cc
+++ b/components/subresource_filter/content/common/ruleset_dealer.cc
@@ -44,4 +44,8 @@
   return strong_ruleset_ref;
 }
 
+base::File RulesetDealer::DuplicateRulesetFile() {
+  return ruleset_file_.Duplicate();
+}
+
 }  // namespace subresource_filter
diff --git a/components/subresource_filter/content/common/ruleset_dealer.h b/components/subresource_filter/content/common/ruleset_dealer.h
index 14c1723fb..fe5db99 100644
--- a/components/subresource_filter/content/common/ruleset_dealer.h
+++ b/components/subresource_filter/content/common/ruleset_dealer.h
@@ -50,6 +50,10 @@
   // For testing only.
   bool has_cached_ruleset() const { return !!weak_cached_ruleset_.get(); }
 
+  // Duplicates the ruleset file. This is used to pass the file to another
+  // thread.
+  base::File DuplicateRulesetFile();
+
  protected:
   bool CalledOnValidSequence() const {
     return sequence_checker_.CalledOnValidSequence();
diff --git a/components/subresource_filter/content/renderer/subresource_filter_agent.cc b/components/subresource_filter/content/renderer/subresource_filter_agent.cc
index 6697771..c3685ee 100644
--- a/components/subresource_filter/content/renderer/subresource_filter_agent.cc
+++ b/components/subresource_filter/content/renderer/subresource_filter_agent.cc
@@ -6,6 +6,7 @@
 
 #include <vector>
 
+#include "base/feature_list.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
@@ -19,8 +20,10 @@
 #include "components/subresource_filter/core/common/memory_mapped_ruleset.h"
 #include "components/subresource_filter/core/common/scoped_timers.h"
 #include "components/subresource_filter/core/common/time_measurements.h"
+#include "content/public/common/content_features.h"
 #include "content/public/renderer/render_frame.h"
 #include "ipc/ipc_message.h"
+#include "third_party/WebKit/public/platform/WebWorkerFetchContext.h"
 #include "third_party/WebKit/public/web/WebDataSource.h"
 #include "third_party/WebKit/public/web/WebDocument.h"
 #include "third_party/WebKit/public/web/WebLocalFrame.h"
@@ -191,4 +194,24 @@
   return handled;
 }
 
+void SubresourceFilterAgent::WillCreateWorkerFetchContext(
+    blink::WebWorkerFetchContext* worker_fetch_context) {
+  DCHECK(base::FeatureList::IsEnabled(features::kOffMainThreadFetch));
+  if (!filter_for_last_committed_load_)
+    return;
+  if (!ruleset_dealer_->IsRulesetFileAvailable())
+    return;
+  base::File ruleset_file = ruleset_dealer_->DuplicateRulesetFile();
+  if (!ruleset_file.IsValid())
+    return;
+  worker_fetch_context->SetSubresourceFilterBuilder(
+      base::MakeUnique<WebDocumentSubresourceFilterImpl::BuilderImpl>(
+          url::Origin(GetDocumentURL()),
+          filter_for_last_committed_load_->filter().activation_state(),
+          std::move(ruleset_file),
+          base::BindOnce(&SubresourceFilterAgent::
+                             SignalFirstSubresourceDisallowedForCommittedLoad,
+                         AsWeakPtr())));
+}
+
 }  // namespace subresource_filter
diff --git a/components/subresource_filter/content/renderer/subresource_filter_agent.h b/components/subresource_filter/content/renderer/subresource_filter_agent.h
index 22bc3fc2..a990a1c 100644
--- a/components/subresource_filter/content/renderer/subresource_filter_agent.h
+++ b/components/subresource_filter/content/renderer/subresource_filter_agent.h
@@ -69,6 +69,7 @@
   void DidFailProvisionalLoad(const blink::WebURLError& error) override;
   void DidFinishLoad() override;
   bool OnMessageReceived(const IPC::Message& message) override;
+  void WillCreateWorkerFetchContext(blink::WebWorkerFetchContext*) override;
 
   // Owned by the ChromeContentRendererClient and outlives us.
   UnverifiedRulesetDealer* ruleset_dealer_;
diff --git a/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.cc b/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.cc
index 88d5f1c..0d1e297 100644
--- a/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.cc
+++ b/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.cc
@@ -6,7 +6,10 @@
 
 #include <utility>
 
+#include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
+#include "base/message_loop/message_loop.h"
 #include "components/subresource_filter/core/common/activation_state.h"
 #include "components/subresource_filter/core/common/load_policy.h"
 #include "components/subresource_filter/core/common/memory_mapped_ruleset.h"
@@ -90,6 +93,11 @@
   }
 }
 
+void ProxyToTaskRunner(scoped_refptr<base::SingleThreadTaskRunner> task_runner,
+                       base::OnceClosure callback) {
+  task_runner->PostTask(FROM_HERE, std::move(callback));
+}
+
 }  // namespace
 
 WebDocumentSubresourceFilterImpl::~WebDocumentSubresourceFilterImpl() = default;
@@ -138,4 +146,29 @@
   return ToWebLoadPolicy(filter_.GetLoadPolicy(GURL(url), element_type));
 }
 
+WebDocumentSubresourceFilterImpl::BuilderImpl::BuilderImpl(
+    url::Origin document_origin,
+    ActivationState activation_state,
+    base::File ruleset_file,
+    base::OnceClosure first_disallowed_load_callback)
+    : document_origin_(std::move(document_origin)),
+      activation_state_(std::move(activation_state)),
+      ruleset_file_(std::move(ruleset_file)),
+      first_disallowed_load_callback_(
+          std::move(first_disallowed_load_callback)),
+      main_task_runner_(base::MessageLoop::current()->task_runner()) {}
+
+WebDocumentSubresourceFilterImpl::BuilderImpl::~BuilderImpl() {}
+
+std::unique_ptr<blink::WebDocumentSubresourceFilter>
+WebDocumentSubresourceFilterImpl::BuilderImpl::Build() {
+  DCHECK(ruleset_file_.IsValid());
+  DCHECK(!main_task_runner_->BelongsToCurrentThread());
+  return base::MakeUnique<WebDocumentSubresourceFilterImpl>(
+      document_origin_, activation_state_,
+      base::MakeRefCounted<MemoryMappedRuleset>(std::move(ruleset_file_)),
+      base::BindOnce(&ProxyToTaskRunner, main_task_runner_,
+                     std::move(first_disallowed_load_callback_)));
+}
+
 }  // namespace subresource_filter
diff --git a/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.h b/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.h
index 179b0de6..606509b 100644
--- a/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.h
+++ b/components/subresource_filter/content/renderer/web_document_subresource_filter_impl.h
@@ -6,11 +6,14 @@
 #define COMPONENTS_SUBRESOURCE_FILTER_CONTENT_RENDERER_WEB_DOCUMENT_SUBRESOURCE_FILTER_IMPL_H_
 
 #include "base/callback.h"
+#include "base/files/file.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
+#include "base/single_thread_task_runner.h"
 #include "components/subresource_filter/core/common/document_subresource_filter.h"
 #include "components/url_pattern_index/proto/rules.pb.h"
 #include "third_party/WebKit/public/platform/WebDocumentSubresourceFilter.h"
+#include "url/origin.h"
 
 namespace subresource_filter {
 
@@ -21,6 +24,28 @@
     : public blink::WebDocumentSubresourceFilter,
       public base::SupportsWeakPtr<WebDocumentSubresourceFilterImpl> {
  public:
+  // This builder class is created on the main thread and passed to a worker
+  // thread to create the subresource filter for the worker thread.
+  class BuilderImpl : public blink::WebDocumentSubresourceFilter::Builder {
+   public:
+    BuilderImpl(url::Origin document_origin,
+                ActivationState activation_state,
+                base::File ruleset_file,
+                base::OnceClosure first_disallowed_load_callback);
+    ~BuilderImpl() override;
+
+    std::unique_ptr<blink::WebDocumentSubresourceFilter> Build() override;
+
+   private:
+    url::Origin document_origin_;
+    ActivationState activation_state_;
+    base::File ruleset_file_;
+    base::OnceClosure first_disallowed_load_callback_;
+    scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
+
+    DISALLOW_COPY_AND_ASSIGN(BuilderImpl);
+  };
+
   // See DocumentSubresourceFilter description.
   //
   // Invokes |first_disallowed_load_callback|, if it is non-null, on the first
diff --git a/components/update_client/background_downloader_win.cc b/components/update_client/background_downloader_win.cc
index fd391de..d383e1a1 100644
--- a/components/update_client/background_downloader_win.cc
+++ b/components/update_client/background_downloader_win.cc
@@ -7,8 +7,9 @@
 #include <atlbase.h>
 #include <atlcom.h>
 #include <objbase.h>
-#include <stddef.h>
+#include <winerror.h>
 
+#include <stddef.h>
 #include <stdint.h>
 #include <functional>
 #include <iomanip>
@@ -27,6 +28,7 @@
 #include "base/strings/string_piece.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/win/scoped_co_mem.h"
+#include "components/update_client/update_client_errors.h"
 #include "components/update_client/utils.h"
 #include "url/gurl.h"
 
@@ -129,9 +131,12 @@
 // system restarts, etc. Also, the check to purge stale jobs only happens
 // at most once a day. If the job clean up code is not running, the BITS
 // default policy is to cancel jobs after 90 days of inactivity.
-const int kPurgeStaleJobsAfterDays = 7;
+const int kPurgeStaleJobsAfterDays = 3;
 const int kPurgeStaleJobsIntervalBetweenChecksDays = 1;
 
+// Number of maximum BITS jobs this downloader can create and queue up.
+const int kMaxQueuedJobs = 10;
+
 // Retrieves the singleton instance of GIT for this process.
 HRESULT GetGit(ComPtr<IGlobalInterfaceTable>* git) {
   return ::CoCreateInstance(CLSID_StdGlobalInterfaceTable, NULL,
@@ -388,51 +393,6 @@
     DeleteFileAndEmptyParentDirectory(path);
 }
 
-// Cleans up incompleted jobs that are too old.
-HRESULT CleanupStaleJobs(const ComPtr<IBackgroundCopyManager>& bits_manager) {
-  if (!bits_manager.Get())
-    return E_FAIL;
-
-  static base::Time last_sweep;
-
-  const base::TimeDelta time_delta(
-      base::TimeDelta::FromDays(kPurgeStaleJobsIntervalBetweenChecksDays));
-  const base::Time current_time(base::Time::Now());
-  if (last_sweep + time_delta > current_time)
-    return S_OK;
-
-  last_sweep = current_time;
-
-  std::vector<ComPtr<IBackgroundCopyJob>> jobs;
-  HRESULT hr = FindBitsJobIf(
-      std::bind2nd(std::ptr_fun(JobCreationOlderThanDaysPredicate),
-                   kPurgeStaleJobsAfterDays),
-      bits_manager, &jobs);
-
-  if (FAILED(hr))
-    return hr;
-
-  for (const auto& job : jobs)
-    CleanupJob(job);
-
-  return S_OK;
-}
-
-// Returns the number of jobs in the BITS queue which were created by this
-// downloader.
-HRESULT GetBackgroundDownloaderJobCount(
-    const ComPtr<IBackgroundCopyManager>& bits_manager,
-    size_t* num_jobs) {
-  std::vector<ComPtr<IBackgroundCopyJob>> jobs;
-  const HRESULT hr =
-      FindBitsJobIf([](const ComPtr<IBackgroundCopyJob>&) { return true; },
-                    bits_manager, &jobs);
-  if (FAILED(hr))
-    return hr;
-  *num_jobs = jobs.size();
-  return S_OK;
-}
-
 }  // namespace
 
 BackgroundDownloader::BackgroundDownloader(
@@ -500,11 +460,11 @@
   if (FAILED(hr))
     return hr;
 
-  hr = RegisterInterfaceInGit(git, bits_manager_, &git_cookie_bits_manager_);
+  hr = QueueBitsJob(url, &job_);
   if (FAILED(hr))
     return hr;
 
-  hr = QueueBitsJob(url, &job_);
+  hr = RegisterInterfaceInGit(git, bits_manager_, &git_cookie_bits_manager_);
   if (FAILED(hr))
     return hr;
 
@@ -597,8 +557,6 @@
   if (FAILED(error))
     CleanupJob(job_);
 
-  CleanupStaleJobs(bits_manager_);
-
   ClearGit();
 
   // Consider the url handled if it has been successfully downloaded or a
@@ -724,9 +682,16 @@
   DCHECK(task_runner()->RunsTasksInCurrentSequence());
 
   size_t num_jobs = 0;
-  GetBackgroundDownloaderJobCount(bits_manager_, &num_jobs);
+  GetBackgroundDownloaderJobCount(&num_jobs);
   UMA_HISTOGRAM_COUNTS_100("UpdateClient.BackgroundDownloaderJobs", num_jobs);
 
+  // Remove some old jobs from the BITS queue before creating new jobs.
+  CleanupStaleJobs();
+
+  if (num_jobs >= kMaxQueuedJobs)
+    return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF,
+                        CrxDownloaderError::BITS_TOO_MANY_JOBS);
+
   ComPtr<IBackgroundCopyJob> local_job;
   HRESULT hr = CreateOrOpenJob(url, &local_job);
   if (FAILED(hr)) {
@@ -896,4 +861,43 @@
   return S_OK;
 }
 
+HRESULT BackgroundDownloader::GetBackgroundDownloaderJobCount(
+    size_t* num_jobs) {
+  DCHECK(task_runner()->RunsTasksInCurrentSequence());
+  DCHECK(bits_manager_);
+
+  std::vector<ComPtr<IBackgroundCopyJob>> jobs;
+  const HRESULT hr =
+      FindBitsJobIf([](const ComPtr<IBackgroundCopyJob>&) { return true; },
+                    bits_manager_, &jobs);
+  if (FAILED(hr))
+    return hr;
+
+  *num_jobs = jobs.size();
+  return S_OK;
+}
+
+void BackgroundDownloader::CleanupStaleJobs() {
+  DCHECK(task_runner()->RunsTasksInCurrentSequence());
+  DCHECK(bits_manager_);
+
+  static base::Time last_sweep;
+
+  const base::TimeDelta time_delta(
+      base::TimeDelta::FromDays(kPurgeStaleJobsIntervalBetweenChecksDays));
+  const base::Time current_time(base::Time::Now());
+  if (last_sweep + time_delta > current_time)
+    return;
+
+  last_sweep = current_time;
+
+  std::vector<ComPtr<IBackgroundCopyJob>> jobs;
+  FindBitsJobIf(std::bind2nd(std::ptr_fun(JobCreationOlderThanDaysPredicate),
+                             kPurgeStaleJobsAfterDays),
+                bits_manager_, &jobs);
+
+  for (const auto& job : jobs)
+    CleanupJob(job);
+}
+
 }  // namespace update_client
diff --git a/components/update_client/background_downloader_win.h b/components/update_client/background_downloader_win.h
index ca71df0a..be0f26cc 100644
--- a/components/update_client/background_downloader_win.h
+++ b/components/update_client/background_downloader_win.h
@@ -115,6 +115,13 @@
   // from the thread pool leaves the object to release the interface pointers.
   void ResetInterfacePointers();
 
+  // Returns the number of jobs in the BITS queue which were created by this
+  // downloader.
+  HRESULT GetBackgroundDownloaderJobCount(size_t* num_jobs);
+
+  // Cleans up incompleted jobs that are too old.
+  void CleanupStaleJobs();
+
   // Ensures that we are running on the same thread we created the object on.
   base::ThreadChecker thread_checker_;
 
diff --git a/components/update_client/update_client_errors.h b/components/update_client/update_client_errors.h
index 050ab3c..814f08a 100644
--- a/components/update_client/update_client_errors.h
+++ b/components/update_client/update_client_errors.h
@@ -37,6 +37,9 @@
   NO_URL = 10,
   NO_HASH = 11,
   BAD_HASH = 12,  // The downloaded file fails the hash verification.
+  // The Windows BITS queue contains to many update client jobs. The value is
+  // chosen so that it can be reported as a custom COM error on this platform.
+  BITS_TOO_MANY_JOBS = 0x0200,
   GENERIC_ERROR = -1
 };
 
diff --git a/components/viz/common/BUILD.gn b/components/viz/common/BUILD.gn
index fdefcb8..f60c6674 100644
--- a/components/viz/common/BUILD.gn
+++ b/components/viz/common/BUILD.gn
@@ -12,9 +12,14 @@
     "gl_helper_readback_support.h",
     "gl_helper_scaling.cc",
     "gl_helper_scaling.h",
+    "quads/resource_format.h",
+    "resources/platform_color.h",
+    "resources/resource_format_utils.cc",
+    "resources/resource_format_utils.h",
   ]
 
   deps = [
+    "//base",
     "//gpu/command_buffer/client:gles2_interface",
     "//skia",
     "//ui/gfx/geometry",
@@ -29,6 +34,7 @@
 source_set("unit_tests") {
   testonly = true
   sources = [
+    "resources/platform_color_unittest.cc",
     "yuv_readback_unittest.cc",
   ]
 
diff --git a/components/viz/common/quads/DEPS b/components/viz/common/quads/DEPS
new file mode 100644
index 0000000..b273ae3
--- /dev/null
+++ b/components/viz/common/quads/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+ui/gfx",
+]
diff --git a/components/viz/common/quads/resource_format.h b/components/viz/common/quads/resource_format.h
new file mode 100644
index 0000000..4ae7b06
--- /dev/null
+++ b/components/viz/common/quads/resource_format.h
@@ -0,0 +1,35 @@
+// Copyright 2013 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_VIZ_COMMON_QUADS_RESOURCE_FORMAT_H_
+#define COMPONENTS_VIZ_COMMON_QUADS_RESOURCE_FORMAT_H_
+
+#include "base/logging.h"
+#include "ui/gfx/buffer_types.h"
+
+// TODO(prashant.n): Including third_party/khronos/GLES2/gl2.h causes
+// redefinition errors as macros/functions defined in it conflict with
+// macros/functions defined in ui/gl/gl_bindings.h. (http://crbug.com/512833).
+typedef unsigned int GLenum;
+
+namespace viz {
+
+// Keep in sync with arrays below.
+enum ResourceFormat {
+  RGBA_8888,
+  RGBA_4444,
+  BGRA_8888,
+  ALPHA_8,
+  LUMINANCE_8,
+  RGB_565,
+  ETC1,
+  RED_8,
+  LUMINANCE_F16,
+  RGBA_F16,
+  RESOURCE_FORMAT_MAX = RGBA_F16,
+};
+
+}  // namespace viz
+
+#endif  // COMPONENTS_VIZ_COMMON_QUADS_RESOURCE_FORMAT_H_
diff --git a/components/viz/common/resources/DEPS b/components/viz/common/resources/DEPS
new file mode 100644
index 0000000..90a9806
--- /dev/null
+++ b/components/viz/common/resources/DEPS
@@ -0,0 +1,4 @@
+include_rules = [
+  "+third_party/khronos/GLES2",
+  "+ui/gfx",
+]
diff --git a/cc/resources/platform_color.h b/components/viz/common/resources/platform_color.h
similarity index 83%
rename from cc/resources/platform_color.h
rename to components/viz/common/resources/platform_color.h
index 91f249c..505b6d43 100644
--- a/cc/resources/platform_color.h
+++ b/components/viz/common/resources/platform_color.h
@@ -2,22 +2,19 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CC_RESOURCES_PLATFORM_COLOR_H_
-#define CC_RESOURCES_PLATFORM_COLOR_H_
+#ifndef COMPONENTS_VIZ_COMMON_RESOURCES_PLATFORM_COLOR_H_
+#define COMPONENTS_VIZ_COMMON_RESOURCES_PLATFORM_COLOR_H_
 
 #include "base/logging.h"
 #include "base/macros.h"
-#include "cc/resources/resource_format.h"
+#include "components/viz/common/quads/resource_format.h"
 #include "third_party/skia/include/core/SkTypes.h"
 
-namespace cc {
+namespace viz {
 
 class PlatformColor {
  public:
-  enum SourceDataFormat {
-    SOURCE_FORMAT_RGBA8,
-    SOURCE_FORMAT_BGRA8
-  };
+  enum SourceDataFormat { SOURCE_FORMAT_RGBA8, SOURCE_FORMAT_BGRA8 };
 
   static SourceDataFormat Format() {
     return SK_B32_SHIFT ? SOURCE_FORMAT_RGBA8 : SOURCE_FORMAT_BGRA8;
@@ -75,6 +72,6 @@
   DISALLOW_IMPLICIT_CONSTRUCTORS(PlatformColor);
 };
 
-}  // namespace cc
+}  // namespace viz
 
-#endif  // CC_RESOURCES_PLATFORM_COLOR_H_
+#endif  // COMPONENTS_VIZ_COMMON_RESOURCES_PLATFORM_COLOR_H_
diff --git a/cc/resources/platform_color_unittest.cc b/components/viz/common/resources/platform_color_unittest.cc
similarity index 90%
rename from cc/resources/platform_color_unittest.cc
rename to components/viz/common/resources/platform_color_unittest.cc
index d0d8036..f8012176 100644
--- a/cc/resources/platform_color_unittest.cc
+++ b/components/viz/common/resources/platform_color_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 "cc/resources/platform_color.h"
+#include "components/viz/common/resources/platform_color.h"
 
 #include <stddef.h>
 
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace cc {
+namespace viz {
 namespace {
 
 // Verify SameComponentOrder on this platform.
@@ -39,4 +39,4 @@
 }
 
 }  // namespace
-}  // namespace cc
+}  // namespace viz
diff --git a/cc/resources/resource_format.cc b/components/viz/common/resources/resource_format_utils.cc
similarity index 83%
rename from cc/resources/resource_format.cc
rename to components/viz/common/resources/resource_format_utils.cc
index e159f15e..f15ddc7 100644
--- a/cc/resources/resource_format.cc
+++ b/components/viz/common/resources/resource_format_utils.cc
@@ -1,14 +1,39 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
+// Copyright 2016 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "cc/resources/resource_format.h"
+#include "components/viz/common/resources/resource_format_utils.h"
 
 #include "third_party/khronos/GLES2/gl2.h"
 #include "third_party/khronos/GLES2/gl2ext.h"
 #include "ui/gfx/gpu_memory_buffer.h"
 
-namespace cc {
+namespace viz {
+
+SkColorType ResourceFormatToClosestSkColorType(ResourceFormat format) {
+  // Use kN32_SkColorType if there is no corresponding SkColorType.
+  switch (format) {
+    case RGBA_4444:
+      return kARGB_4444_SkColorType;
+    case RGBA_8888:
+    case BGRA_8888:
+      return kN32_SkColorType;
+    case ALPHA_8:
+      return kAlpha_8_SkColorType;
+    case RGB_565:
+      return kRGB_565_SkColorType;
+    case LUMINANCE_8:
+      return kGray_8_SkColorType;
+    case ETC1:
+    case RED_8:
+    case LUMINANCE_F16:
+      return kN32_SkColorType;
+    case RGBA_F16:
+      return kRGBA_F16_SkColorType;
+  }
+  NOTREACHED();
+  return kN32_SkColorType;
+}
 
 int BitsPerPixel(ResourceFormat format) {
   switch (format) {
@@ -149,4 +174,4 @@
   return false;
 }
 
-}  // namespace cc
+}  // namespace viz
diff --git a/components/viz/common/resources/resource_format_utils.h b/components/viz/common/resources/resource_format_utils.h
new file mode 100644
index 0000000..923357e
--- /dev/null
+++ b/components/viz/common/resources/resource_format_utils.h
@@ -0,0 +1,25 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_VIZ_COMMON_RESOURCES_RESOURCE_FORMAT_UTILS_H_
+#define COMPONENTS_VIZ_COMMON_RESOURCES_RESOURCE_FORMAT_UTILS_H_
+
+#include "components/viz/common/quads/resource_format.h"
+#include "third_party/skia/include/core/SkImageInfo.h"
+
+namespace viz {
+
+SkColorType ResourceFormatToClosestSkColorType(ResourceFormat format);
+int BitsPerPixel(ResourceFormat format);
+GLenum GLDataType(ResourceFormat format);
+GLenum GLDataFormat(ResourceFormat format);
+GLenum GLInternalFormat(ResourceFormat format);
+GLenum GLCopyTextureInternalFormat(ResourceFormat format);
+gfx::BufferFormat BufferFormat(ResourceFormat format);
+bool IsResourceFormatCompressed(ResourceFormat format);
+bool DoesResourceFormatSupportAlpha(ResourceFormat format);
+
+}  // namespace viz
+
+#endif  // COMPONENTS_VIZ_COMMON_RESOURCES_RESOURCE_FORMAT_UTILS_H_
diff --git a/components/viz/host/DEPS b/components/viz/host/DEPS
index b4d33612..18cdf15 100644
--- a/components/viz/host/DEPS
+++ b/components/viz/host/DEPS
@@ -8,10 +8,5 @@
   "+gpu/ipc/host",
   "+mojo/public/cpp/bindings",
   "+services/ui/gpu/interfaces",
+  "+ui/gfx",
 ]
-
-specific_include_rules = {
-  "server_gpu_memory_buffer_manager_unittest\.cc": [
-    "+ui/gfx",
-  ]
-}
diff --git a/components/viz/host/server_gpu_memory_buffer_manager.cc b/components/viz/host/server_gpu_memory_buffer_manager.cc
index 460cbf6..ac36c93 100644
--- a/components/viz/host/server_gpu_memory_buffer_manager.cc
+++ b/components/viz/host/server_gpu_memory_buffer_manager.cc
@@ -5,14 +5,22 @@
 #include "components/viz/host/server_gpu_memory_buffer_manager.h"
 
 #include "base/logging.h"
+#include "base/strings/stringprintf.h"
 #include "base/threading/sequenced_task_runner_handle.h"
+#include "base/trace_event/memory_dump_manager.h"
+#include "base/trace_event/process_memory_dump.h"
 #include "gpu/ipc/client/gpu_memory_buffer_impl.h"
 #include "gpu/ipc/client/gpu_memory_buffer_impl_shared_memory.h"
 #include "gpu/ipc/common/gpu_memory_buffer_support.h"
 #include "services/ui/gpu/interfaces/gpu_service.mojom.h"
+#include "ui/gfx/buffer_format_util.h"
+#include "ui/gfx/gpu_memory_buffer_tracing.h"
 
 namespace viz {
 
+ServerGpuMemoryBufferManager::BufferInfo::BufferInfo() = default;
+ServerGpuMemoryBufferManager::BufferInfo::~BufferInfo() = default;
+
 ServerGpuMemoryBufferManager::ServerGpuMemoryBufferManager(
     ui::mojom::GpuService* gpu_service,
     int client_id)
@@ -42,6 +50,7 @@
           id, size, format, usage, client_id, surface_handle,
           base::Bind(&ServerGpuMemoryBufferManager::OnGpuMemoryBufferAllocated,
                      weak_factory_.GetWeakPtr(), client_id,
+                     gfx::BufferSizeForBufferFormat(size, format),
                      base::Passed(std::move(callback))));
       return;
     }
@@ -55,6 +64,14 @@
                                                                  format)) {
     buffer_handle = gpu::GpuMemoryBufferImplSharedMemory::CreateGpuMemoryBuffer(
         id, size, format);
+    BufferInfo buffer_info;
+    DCHECK_EQ(gfx::SHARED_MEMORY_BUFFER, buffer_handle.type);
+    buffer_info.type = gfx::SHARED_MEMORY_BUFFER;
+    buffer_info.buffer_size_in_bytes =
+        gfx::BufferSizeForBufferFormat(size, format);
+    buffer_info.shared_memory_guid = buffer_handle.handle.GetGUID();
+    allocated_buffers_[client_id].insert(
+        std::make_pair(buffer_handle.id, buffer_info));
   }
 
   task_runner_->PostTask(FROM_HERE,
@@ -104,26 +121,92 @@
       sync_token);
 }
 
+bool ServerGpuMemoryBufferManager::OnMemoryDump(
+    const base::trace_event::MemoryDumpArgs& args,
+    base::trace_event::ProcessMemoryDump* pmd) {
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
+  for (const auto& pair : allocated_buffers_) {
+    int client_id = pair.first;
+    for (const auto& buffer_pair : pair.second) {
+      gfx::GpuMemoryBufferId buffer_id = buffer_pair.first;
+      const BufferInfo& buffer_info = buffer_pair.second;
+      base::trace_event::MemoryAllocatorDump* dump =
+          pmd->CreateAllocatorDump(base::StringPrintf(
+              "gpumemorybuffer/client_%d/buffer_%d", client_id, buffer_id.id));
+      if (!dump)
+        return false;
+      dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize,
+                      base::trace_event::MemoryAllocatorDump::kUnitsBytes,
+                      buffer_info.buffer_size_in_bytes);
+
+      // Create the cross-process ownership edge. If the client creates a
+      // corresponding dump for the same buffer, this will avoid to
+      // double-count them in tracing. If, instead, no other process will emit a
+      // dump with the same guid, the segment will be accounted to the browser.
+      uint64_t client_tracing_process_id = ClientIdToTracingId(client_id);
+
+      if (buffer_info.type == gfx::SHARED_MEMORY_BUFFER) {
+        auto shared_buffer_guid = gfx::GetSharedMemoryGUIDForTracing(
+            client_tracing_process_id, buffer_id);
+        pmd->CreateSharedMemoryOwnershipEdge(dump->guid(), shared_buffer_guid,
+                                             buffer_info.shared_memory_guid,
+                                             0 /* importance */);
+      } else {
+        auto shared_buffer_guid = gfx::GetGenericSharedGpuMemoryGUIDForTracing(
+            client_tracing_process_id, buffer_id);
+        pmd->CreateSharedGlobalAllocatorDump(shared_buffer_guid);
+        pmd->AddOwnershipEdge(dump->guid(), shared_buffer_guid);
+      }
+    }
+  }
+  return true;
+}
+
 void ServerGpuMemoryBufferManager::DestroyGpuMemoryBuffer(
     gfx::GpuMemoryBufferId id,
     int client_id,
     const gpu::SyncToken& sync_token) {
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
-  if (native_buffers_[client_id].erase(id))
+  auto iter = allocated_buffers_[client_id].find(id);
+  if (iter == allocated_buffers_[client_id].end())
+    return;
+  DCHECK_NE(gfx::EMPTY_BUFFER, iter->second.type);
+  allocated_buffers_[client_id].erase(id);
+  if (iter->second.type != gfx::SHARED_MEMORY_BUFFER)
     gpu_service_->DestroyGpuMemoryBuffer(id, client_id, sync_token);
 }
 
 void ServerGpuMemoryBufferManager::DestroyAllGpuMemoryBufferForClient(
     int client_id) {
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
-  for (gfx::GpuMemoryBufferId id : native_buffers_[client_id])
-    gpu_service_->DestroyGpuMemoryBuffer(id, client_id, gpu::SyncToken());
-  native_buffers_.erase(client_id);
+  for (auto pair : allocated_buffers_[client_id]) {
+    DCHECK_NE(gfx::EMPTY_BUFFER, pair.second.type);
+    if (pair.second.type != gfx::SHARED_MEMORY_BUFFER) {
+      gpu_service_->DestroyGpuMemoryBuffer(pair.first, client_id,
+                                           gpu::SyncToken());
+    }
+  }
+  allocated_buffers_.erase(client_id);
   pending_buffers_.erase(client_id);
 }
 
+uint64_t ServerGpuMemoryBufferManager::ClientIdToTracingId(
+    int client_id) const {
+  if (client_id == client_id_) {
+    return base::trace_event::MemoryDumpManager::GetInstance()
+        ->GetTracingProcessId();
+  }
+  // TODO(sad|ssid): Find a better way once crbug.com/661257 is resolved.
+  // The hash value is incremented so that the tracing id is never equal to
+  // MemoryDumpManager::kInvalidTracingProcessId.
+  return static_cast<uint64_t>(base::Hash(
+             reinterpret_cast<const char*>(&client_id), sizeof(client_id))) +
+         1;
+}
+
 void ServerGpuMemoryBufferManager::OnGpuMemoryBufferAllocated(
     int client_id,
+    size_t buffer_size_in_bytes,
     base::OnceCallback<void(const gfx::GpuMemoryBufferHandle&)> callback,
     const gfx::GpuMemoryBufferHandle& handle) {
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
@@ -136,8 +219,13 @@
     std::move(callback).Run(gfx::GpuMemoryBufferHandle());
     return;
   }
-  if (!handle.is_null())
-    native_buffers_[client_id].insert(handle.id);
+  if (!handle.is_null()) {
+    BufferInfo buffer_info;
+    buffer_info.type = handle.type;
+    buffer_info.buffer_size_in_bytes = buffer_size_in_bytes;
+    allocated_buffers_[client_id].insert(
+        std::make_pair(handle.id, buffer_info));
+  }
   std::move(callback).Run(handle);
 }
 
diff --git a/components/viz/host/server_gpu_memory_buffer_manager.h b/components/viz/host/server_gpu_memory_buffer_manager.h
index 2ee15b6..5ae16d95 100644
--- a/components/viz/host/server_gpu_memory_buffer_manager.h
+++ b/components/viz/host/server_gpu_memory_buffer_manager.h
@@ -11,6 +11,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/sequenced_task_runner.h"
 #include "base/synchronization/waitable_event.h"
+#include "base/trace_event/memory_dump_provider.h"
 #include "components/viz/host/viz_host_export.h"
 #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h"
 #include "gpu/ipc/host/gpu_memory_buffer_support.h"
@@ -28,7 +29,8 @@
 // Note that |CreateGpuMemoryBuffer()| can be called on any thread. All the rest
 // of the functions must be called on the thread this object is created on.
 class VIZ_HOST_EXPORT ServerGpuMemoryBufferManager
-    : public gpu::GpuMemoryBufferManager {
+    : public gpu::GpuMemoryBufferManager,
+      public base::trace_event::MemoryDumpProvider {
  public:
   ServerGpuMemoryBufferManager(ui::mojom::GpuService* gpu_service,
                                int client_id);
@@ -58,9 +60,15 @@
   void SetDestructionSyncToken(gfx::GpuMemoryBuffer* buffer,
                                const gpu::SyncToken& sync_token) override;
 
+  // Overridden from base::trace_event::MemoryDumpProvider:
+  bool OnMemoryDump(const base::trace_event::MemoryDumpArgs& args,
+                    base::trace_event::ProcessMemoryDump* pmd) override;
+
  private:
+  uint64_t ClientIdToTracingId(int client_id) const;
   void OnGpuMemoryBufferAllocated(
       int client_id,
+      size_t buffer_size_in_bytes,
       base::OnceCallback<void(const gfx::GpuMemoryBufferHandle&)> callback,
       const gfx::GpuMemoryBufferHandle& handle);
 
@@ -68,10 +76,19 @@
   const int client_id_;
   int next_gpu_memory_id_ = 1;
 
-  using NativeBuffers =
-      std::unordered_set<gfx::GpuMemoryBufferId,
+  struct BufferInfo {
+    BufferInfo();
+    ~BufferInfo();
+    gfx::GpuMemoryBufferType type = gfx::EMPTY_BUFFER;
+    size_t buffer_size_in_bytes = 0;
+    base::UnguessableToken shared_memory_guid;
+  };
+
+  using AllocatedBuffers =
+      std::unordered_map<gfx::GpuMemoryBufferId,
+                         BufferInfo,
                          BASE_HASH_NAMESPACE::hash<gfx::GpuMemoryBufferId>>;
-  std::unordered_map<int, NativeBuffers> native_buffers_;
+  std::unordered_map<int, AllocatedBuffers> allocated_buffers_;
   std::unordered_set<int> pending_buffers_;
 
   const gpu::GpuMemoryBufferConfigurationSet native_configurations_;
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 81f977c..b3c7fa7 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -47,6 +47,8 @@
     "//components/metrics:single_sample_metrics",
     "//components/mime_util",
     "//components/network_session_configurator/browser",
+    "//components/offline_pages/core/request_header",
+    "//components/offline_pages/features:features",
     "//components/rappor",
     "//components/tracing",
     "//components/tracing:startup_tracing",
@@ -1932,6 +1934,8 @@
       "renderer_host/compositor_impl_android.h",
       "renderer_host/input/synthetic_gesture_target_android.cc",
       "renderer_host/input/synthetic_gesture_target_android.h",
+      "renderer_host/input/touch_selection_controller_client_manager_android.cc",
+      "renderer_host/input/touch_selection_controller_client_manager_android.h",
       "renderer_host/native_web_keyboard_event_android.cc",
       "renderer_host/render_widget_host_view_android.cc",
       "renderer_host/render_widget_host_view_android.h",
diff --git a/content/browser/DEPS b/content/browser/DEPS
index 2aa59bb..13fb093d 100644
--- a/content/browser/DEPS
+++ b/content/browser/DEPS
@@ -10,6 +10,8 @@
   "+components/metrics:single_sample_metrics",
   "+components/mime_util",
   "+components/network_session_configurator/common",
+  "+components/offline_pages/features/features.h",
+  "+components/offline_pages/core/request_header",
   "+components/payments",
   "+components/profile_service",
   "+components/rappor/public",
diff --git a/content/browser/child_process_security_policy_impl.cc b/content/browser/child_process_security_policy_impl.cc
index e8af7514..779aa5b 100644
--- a/content/browser/child_process_security_policy_impl.cc
+++ b/content/browser/child_process_security_policy_impl.cc
@@ -443,10 +443,12 @@
   if (!url.is_valid())
     return;  // Can't grant the capability to request invalid URLs.
 
-  if (IsWebSafeScheme(url.scheme()))
+  const std::string& scheme = url.scheme();
+
+  if (IsWebSafeScheme(scheme))
     return;  // The scheme has already been whitelisted for every child process.
 
-  if (IsPseudoScheme(url.scheme())) {
+  if (IsPseudoScheme(scheme)) {
     return;  // Can't grant the capability to request pseudo schemes.
   }
 
@@ -462,7 +464,7 @@
 
     // When the child process has been commanded to request this scheme,
     // we grant it the capability to request all URLs of that scheme.
-    state->second->GrantScheme(url.scheme());
+    state->second->GrantScheme(scheme);
   }
 }
 
@@ -632,7 +634,9 @@
   if (!url.is_valid())
     return false;  // Can't request invalid URLs.
 
-  if (IsPseudoScheme(url.scheme())) {
+  const std::string& scheme = url.scheme();
+
+  if (IsPseudoScheme(scheme)) {
     // Every child process can request <about:blank>, <about:blank?foo>,
     // <about:blank/#foo> and <about:srcdoc>.
     if (url.IsAboutBlank() || url == kAboutSrcDocURL)
@@ -655,7 +659,7 @@
            CanCommitURL(child_id, GURL(origin.Serialize()));
   }
 
-  if (IsWebSafeScheme(url.scheme()))
+  if (IsWebSafeScheme(scheme))
     return true;
 
   // If the process can commit the URL, it can request it.
@@ -672,9 +676,11 @@
   if (!url.is_valid())
     return false;  // Can't commit invalid URLs.
 
+  const std::string& scheme = url.scheme();
+
   // Of all the pseudo schemes, only about:blank and about:srcdoc are allowed to
   // commit.
-  if (IsPseudoScheme(url.scheme()))
+  if (IsPseudoScheme(scheme))
     return url == url::kAboutBlankURL || url == kAboutSrcDocURL;
 
   // Blob and filesystem URLs require special treatment; validate the inner
@@ -701,7 +707,7 @@
     // site, so CanCommitURL will need to rely on explicit, per-process grants.
     // Note how today, even with extension isolation, the line below does not
     // enforce that http pages cannot commit in an extension process.
-    if (base::ContainsKey(schemes_okay_to_commit_in_any_process_, url.scheme()))
+    if (base::ContainsKey(schemes_okay_to_commit_in_any_process_, scheme))
       return true;
 
     SecurityStateMap::iterator state = security_state_.find(child_id);
@@ -719,10 +725,12 @@
   if (!url.is_valid())
     return false;  // Can't set invalid URLs as origin headers.
 
+  const std::string& scheme = url.scheme();
+
   // Suborigin URLs are a special case and are allowed to be an origin header.
-  if (url.scheme() == url::kHttpSuboriginScheme ||
-      url.scheme() == url::kHttpsSuboriginScheme) {
-    DCHECK(IsPseudoScheme(url.scheme()));
+  if (scheme == url::kHttpSuboriginScheme ||
+      scheme == url::kHttpsSuboriginScheme) {
+    DCHECK(IsPseudoScheme(scheme));
     return true;
   }
 
@@ -740,8 +748,7 @@
   // document origin.
   {
     base::AutoLock lock(lock_);
-    if (base::ContainsKey(schemes_okay_to_appear_as_origin_headers_,
-                          url.scheme()))
+    if (base::ContainsKey(schemes_okay_to_appear_as_origin_headers_, scheme))
       return true;
   }
   return false;
diff --git a/content/browser/cocoa/system_hotkey_helper_mac.mm b/content/browser/cocoa/system_hotkey_helper_mac.mm
index f2453404..cbac199 100644
--- a/content/browser/cocoa/system_hotkey_helper_mac.mm
+++ b/content/browser/cocoa/system_hotkey_helper_mac.mm
@@ -9,6 +9,9 @@
 #include "base/mac/foundation_util.h"
 #include "base/message_loop/message_loop.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/task_scheduler/post_task.h"
+#include "base/task_scheduler/task_traits.h"
+#include "base/threading/thread_restrictions.h"
 #include "content/browser/cocoa/system_hotkey_map.h"
 #include "content/public/browser/browser_thread.h"
 
@@ -30,9 +33,8 @@
 }
 
 void SystemHotkeyHelperMac::DeferredLoadSystemHotkeys() {
-  BrowserThread::PostDelayedTask(
-      BrowserThread::FILE,
-      FROM_HERE,
+  base::PostDelayedTaskWithTraits(
+      FROM_HERE, {base::MayBlock()},
       base::Bind(&SystemHotkeyHelperMac::LoadSystemHotkeys,
                  base::Unretained(this)),
       base::TimeDelta::FromSeconds(kLoadHotkeysDelaySeconds));
@@ -45,7 +47,7 @@
 }
 
 void SystemHotkeyHelperMac::LoadSystemHotkeys() {
-  DCHECK_CURRENTLY_ON(BrowserThread::FILE);
+  base::ThreadRestrictions::AssertIOAllowed();
 
   std::string library_path(base::mac::GetUserLibraryPath().value());
   NSString* expanded_file_path =
diff --git a/content/browser/compositor/offscreen_browser_compositor_output_surface.cc b/content/browser/compositor/offscreen_browser_compositor_output_surface.cc
index 866e8fbe..c2be00c 100644
--- a/content/browser/compositor/offscreen_browser_compositor_output_surface.cc
+++ b/content/browser/compositor/offscreen_browser_compositor_output_surface.cc
@@ -11,6 +11,7 @@
 #include "cc/output/output_surface_client.h"
 #include "cc/output/output_surface_frame.h"
 #include "cc/resources/resource_provider.h"
+#include "components/viz/common/resources/resource_format_utils.h"
 #include "components/viz/service/display_embedder/compositor_overlay_candidate_validator.h"
 #include "content/browser/compositor/reflector_impl.h"
 #include "content/browser/compositor/reflector_texture.h"
@@ -26,7 +27,7 @@
 
 namespace content {
 
-static cc::ResourceFormat kFboTextureFormat = cc::RGBA_8888;
+static viz::ResourceFormat kFboTextureFormat = viz::RGBA_8888;
 
 OffscreenBrowserCompositorOutputSurface::
     OffscreenBrowserCompositorOutputSurface(
diff --git a/content/browser/devtools/protocol/network_handler.cc b/content/browser/devtools/protocol/network_handler.cc
index 0891103..bff4f04c 100644
--- a/content/browser/devtools/protocol/network_handler.cc
+++ b/content/browser/devtools/protocol/network_handler.cc
@@ -5,6 +5,7 @@
 #include "content/browser/devtools/protocol/network_handler.h"
 
 #include <stddef.h>
+#include <stdint.h>
 
 #include "base/barrier_closure.h"
 #include "base/base64.h"
@@ -190,7 +191,7 @@
 };
 
 void ClearedCookiesOnIO(std::unique_ptr<ClearBrowserCookiesCallback> callback,
-                        int num_deleted) {
+                        uint32_t num_deleted) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
                           base::Bind(&ClearBrowserCookiesCallback::sendSuccess,
diff --git a/content/browser/loader/resource_dispatcher_host_impl.cc b/content/browser/loader/resource_dispatcher_host_impl.cc
index 4080c66..164e98b 100644
--- a/content/browser/loader/resource_dispatcher_host_impl.cc
+++ b/content/browser/loader/resource_dispatcher_host_impl.cc
@@ -142,7 +142,7 @@
             "chrome URLs, resources for installed extensions, as well as "
             "downloads."
           trigger:
-            "Navigating to a URL or downloading a file.  A webpage, "
+            "Navigating to a URL or downloading a file. A webpage, "
             "ServiceWorker, chrome:// page, or extension may also initiate "
             "requests in the background."
           data: "Anything the initiator wants to send."
@@ -883,9 +883,11 @@
     ResourceRequesterInfo* requester_info,
     int routing_id,
     int request_id,
-    const ResourceRequest& request_data) {
-  OnRequestResourceInternal(requester_info, routing_id, request_id,
-                            request_data, nullptr, nullptr);
+    const ResourceRequest& request_data,
+    net::MutableNetworkTrafficAnnotationTag traffic_annotation) {
+  OnRequestResourceInternal(
+      requester_info, routing_id, request_id, request_data, nullptr, nullptr,
+      net::NetworkTrafficAnnotationTag(traffic_annotation));
 }
 
 void ResourceDispatcherHostImpl::OnRequestResourceInternal(
@@ -894,7 +896,8 @@
     int request_id,
     const ResourceRequest& request_data,
     mojom::URLLoaderAssociatedRequest mojo_request,
-    mojom::URLLoaderClientPtr url_loader_client) {
+    mojom::URLLoaderClientPtr url_loader_client,
+    const net::NetworkTrafficAnnotationTag& traffic_annotation) {
   DCHECK(requester_info->IsRenderer() || requester_info->IsNavigationPreload());
   // TODO(pkasting): Remove ScopedTracker below once crbug.com/477117 is fixed.
   tracked_objects::ScopedTracker tracking_profile(
@@ -914,7 +917,7 @@
   }
   BeginRequest(requester_info, request_id, request_data,
                SyncLoadResultCallback(), routing_id, std::move(mojo_request),
-               std::move(url_loader_client));
+               std::move(url_loader_client), traffic_annotation);
 }
 
 // Begins a resource request with the given params on behalf of the specified
@@ -934,7 +937,7 @@
       base::Bind(&HandleSyncLoadResult, requester_info->filter()->GetWeakPtr(),
                  base::Passed(WrapUnique(sync_result)));
   BeginRequest(requester_info, request_id, request_data, callback,
-               sync_result->routing_id(), nullptr, nullptr);
+               sync_result->routing_id(), nullptr, nullptr, kTrafficAnnotation);
 }
 
 bool ResourceDispatcherHostImpl::IsRequestIDInUse(
@@ -1096,7 +1099,8 @@
     const SyncLoadResultCallback& sync_result_handler,  // only valid for sync
     int route_id,
     mojom::URLLoaderAssociatedRequest mojo_request,
-    mojom::URLLoaderClientPtr url_loader_client) {
+    mojom::URLLoaderClientPtr url_loader_client,
+    const net::NetworkTrafficAnnotationTag& traffic_annotation) {
   DCHECK(requester_info->IsRenderer() || requester_info->IsNavigationPreload());
   int child_id = requester_info->child_id();
 
@@ -1215,7 +1219,7 @@
                   request_id, request_data, sync_result_handler, route_id,
                   headers, base::Passed(std::move(mojo_request)),
                   base::Passed(std::move(url_loader_client)),
-                  base::Passed(std::move(blob_handles))));
+                  base::Passed(std::move(blob_handles)), traffic_annotation));
           return;
         }
       }
@@ -1224,7 +1228,8 @@
   ContinuePendingBeginRequest(
       requester_info, request_id, request_data, sync_result_handler, route_id,
       headers, std::move(mojo_request), std::move(url_loader_client),
-      std::move(blob_handles), HeaderInterceptorResult::CONTINUE);
+      std::move(blob_handles), traffic_annotation,
+      HeaderInterceptorResult::CONTINUE);
 }
 
 void ResourceDispatcherHostImpl::ContinuePendingBeginRequest(
@@ -1237,6 +1242,7 @@
     mojom::URLLoaderAssociatedRequest mojo_request,
     mojom::URLLoaderClientPtr url_loader_client,
     BlobHandles blob_handles,
+    const net::NetworkTrafficAnnotationTag& traffic_annotation,
     HeaderInterceptorResult interceptor_result) {
   DCHECK(requester_info->IsRenderer() || requester_info->IsNavigationPreload());
   if (interceptor_result != HeaderInterceptorResult::CONTINUE) {
@@ -1282,7 +1288,7 @@
   std::unique_ptr<net::URLRequest> new_request = request_context->CreateRequest(
       is_navigation_stream_request ? request_data.resource_body_stream_url
                                    : request_data.url,
-      request_data.priority, nullptr, kTrafficAnnotation);
+      request_data.priority, nullptr, traffic_annotation);
 
   if (is_navigation_stream_request) {
     // PlzNavigate: Always set the method to GET when gaining access to the
@@ -2255,10 +2261,11 @@
     int request_id,
     const ResourceRequest& request,
     mojom::URLLoaderAssociatedRequest mojo_request,
-    mojom::URLLoaderClientPtr url_loader_client) {
+    mojom::URLLoaderClientPtr url_loader_client,
+    const net::NetworkTrafficAnnotationTag& traffic_annotation) {
   OnRequestResourceInternal(requester_info, routing_id, request_id, request,
                             std::move(mojo_request),
-                            std::move(url_loader_client));
+                            std::move(url_loader_client), traffic_annotation);
 }
 
 void ResourceDispatcherHostImpl::OnSyncLoadWithMojo(
@@ -2268,7 +2275,7 @@
     const ResourceRequest& request_data,
     const SyncLoadResultCallback& result_handler) {
   BeginRequest(requester_info, request_id, request_data, result_handler,
-               routing_id, nullptr, nullptr);
+               routing_id, nullptr, nullptr, kTrafficAnnotation);
 }
 
 // static
diff --git a/content/browser/loader/resource_dispatcher_host_impl.h b/content/browser/loader/resource_dispatcher_host_impl.h
index 2b95db9..49645a1 100644
--- a/content/browser/loader/resource_dispatcher_host_impl.h
+++ b/content/browser/loader/resource_dispatcher_host_impl.h
@@ -41,6 +41,7 @@
 #include "ipc/ipc_message.h"
 #include "net/base/load_states.h"
 #include "net/base/request_priority.h"
+#include "net/traffic_annotation/network_traffic_annotation.h"
 #include "third_party/WebKit/public/platform/WebMixedContentContextType.h"
 #include "url/gurl.h"
 
@@ -279,12 +280,14 @@
   void OnRenderFrameDeleted(const GlobalFrameRoutingId& global_routing_id);
 
   // Called when loading a request with mojo.
-  void OnRequestResourceWithMojo(ResourceRequesterInfo* requester_info,
-                                 int routing_id,
-                                 int request_id,
-                                 const ResourceRequest& request,
-                                 mojom::URLLoaderAssociatedRequest mojo_request,
-                                 mojom::URLLoaderClientPtr url_loader_client);
+  void OnRequestResourceWithMojo(
+      ResourceRequesterInfo* requester_info,
+      int routing_id,
+      int request_id,
+      const ResourceRequest& request,
+      mojom::URLLoaderAssociatedRequest mojo_request,
+      mojom::URLLoaderClientPtr url_loader_client,
+      const net::NetworkTrafficAnnotationTag& traffic_annotation);
 
   void OnSyncLoadWithMojo(ResourceRequesterInfo* requester_info,
                           int routing_id,
@@ -530,17 +533,21 @@
       const GlobalFrameRoutingId& global_routing_id,
       bool cancel_requests);
 
-  void OnRequestResource(ResourceRequesterInfo* requester_info,
-                         int routing_id,
-                         int request_id,
-                         const ResourceRequest& request_data);
+  void OnRequestResource(
+      ResourceRequesterInfo* requester_info,
+      int routing_id,
+      int request_id,
+      const ResourceRequest& request_data,
+      net::MutableNetworkTrafficAnnotationTag traffic_annotation);
 
-  void OnRequestResourceInternal(ResourceRequesterInfo* requester_info,
-                                 int routing_id,
-                                 int request_id,
-                                 const ResourceRequest& request_data,
-                                 mojom::URLLoaderAssociatedRequest mojo_request,
-                                 mojom::URLLoaderClientPtr url_loader_client);
+  void OnRequestResourceInternal(
+      ResourceRequesterInfo* requester_info,
+      int routing_id,
+      int request_id,
+      const ResourceRequest& request_data,
+      mojom::URLLoaderAssociatedRequest mojo_request,
+      mojom::URLLoaderClientPtr url_loader_client,
+      const net::NetworkTrafficAnnotationTag& traffic_annotation);
 
   void OnSyncLoad(ResourceRequesterInfo* requester_info,
                   int request_id,
@@ -575,7 +582,8 @@
       const SyncLoadResultCallback& sync_result_handler,  // only valid for sync
       int route_id,
       mojom::URLLoaderAssociatedRequest mojo_request,
-      mojom::URLLoaderClientPtr url_loader_client);
+      mojom::URLLoaderClientPtr url_loader_client,
+      const net::NetworkTrafficAnnotationTag& traffic_annotation);
 
   // There are requests which need decisions to be made like the following:
   // Whether the presence of certain HTTP headers like the Origin header are
@@ -595,6 +603,7 @@
       mojom::URLLoaderAssociatedRequest mojo_request,
       mojom::URLLoaderClientPtr url_loader_client,
       BlobHandles blob_handles,
+      const net::NetworkTrafficAnnotationTag& traffic_annotation,
       HeaderInterceptorResult interceptor_result);
 
   // Creates a ResourceHandler to be used by BeginRequest() for normal resource
diff --git a/content/browser/loader/resource_dispatcher_host_unittest.cc b/content/browser/loader/resource_dispatcher_host_unittest.cc
index 35ea64c..6587135 100644
--- a/content/browser/loader/resource_dispatcher_host_unittest.cc
+++ b/content/browser/loader/resource_dispatcher_host_unittest.cc
@@ -1155,7 +1155,9 @@
     ResourceType type) {
   ResourceRequest request = CreateResourceRequest("GET", type, url);
   request.render_frame_id = render_frame_id;
-  ResourceHostMsg_RequestResource msg(render_view_id, request_id, request);
+  ResourceHostMsg_RequestResource msg(
+      render_view_id, request_id, request,
+      net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   OnMessageReceived(msg, filter_.get());
   KickOffRequest();
 }
@@ -1167,7 +1169,9 @@
     const GURL& url,
     ResourceType type) {
   ResourceRequest request = CreateResourceRequest("GET", type, url);
-  ResourceHostMsg_RequestResource msg(render_view_id, request_id, request);
+  ResourceHostMsg_RequestResource msg(
+      render_view_id, request_id, request,
+      net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   OnMessageReceived(msg, filter);
   KickOffRequest();
 }
@@ -1187,7 +1191,8 @@
   request.origin_pid = web_contents_->GetRenderProcessHost()->GetID();
   request.render_frame_id = web_contents_->GetMainFrame()->GetRoutingID();
   ResourceHostMsg_RequestResource msg(
-      web_contents_->GetRenderViewHost()->GetRoutingID(), request_id, request);
+      web_contents_->GetRenderViewHost()->GetRoutingID(), request_id, request,
+      net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   OnMessageReceived(msg, web_contents_filter_.get());
   KickOffRequest();
 }
@@ -1209,7 +1214,9 @@
       "GET", RESOURCE_TYPE_SUB_RESOURCE, GURL("http://example.com/priority"));
   request.render_frame_id = render_frame_id;
   request.priority = priority;
-  ResourceHostMsg_RequestResource msg(render_view_id, request_id, request);
+  ResourceHostMsg_RequestResource msg(
+      render_view_id, request_id, request,
+      net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   OnMessageReceived(msg, filter_.get());
 }
 
@@ -1435,7 +1442,9 @@
   ResourceRequest request_to_cache = CreateResourceRequest(
       "GET", RESOURCE_TYPE_IMAGE, net::URLRequestTestJob::test_url_3());
   request_to_cache.download_to_network_cache_only = true;
-  ResourceHostMsg_RequestResource msg_to_cache(0, 2, request_to_cache);
+  ResourceHostMsg_RequestResource msg_to_cache(
+      0, 2, request_to_cache,
+      net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   OnMessageReceived(msg_to_cache, filter_.get());
 
   KickOffRequest();
@@ -1578,9 +1587,13 @@
   ResourceRequest request_ping = CreateResourceRequest(
       "GET", RESOURCE_TYPE_PING, net::URLRequestTestJob::test_url_3());
 
-  ResourceHostMsg_RequestResource msg_prefetch(0, 1, request_prefetch);
+  ResourceHostMsg_RequestResource msg_prefetch(
+      0, 1, request_prefetch,
+      net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   OnMessageReceived(msg_prefetch, filter_.get());
-  ResourceHostMsg_RequestResource msg_ping(0, 2, request_ping);
+  ResourceHostMsg_RequestResource msg_ping(
+      0, 2, request_ping,
+      net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   OnMessageReceived(msg_ping, filter_.get());
 
   // Remove the filter before processing the requests by simulating channel
@@ -1626,7 +1639,9 @@
       "GET", RESOURCE_TYPE_PREFETCH,
       net::URLRequestTestJob::test_url_redirect_to_url_2());
 
-  ResourceHostMsg_RequestResource msg(0, 1, request);
+  ResourceHostMsg_RequestResource msg(
+      0, 1, request,
+      net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   OnMessageReceived(msg, filter_.get());
 
   // Remove the filter before processing the request by simulating channel
@@ -2736,7 +2751,8 @@
   request.transferred_request_request_id = request_id;
 
   ResourceHostMsg_RequestResource transfer_request_msg(
-      new_render_view_id, new_request_id, request);
+      new_render_view_id, new_request_id, request,
+      net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   OnMessageReceived(transfer_request_msg, second_filter.get());
   content::RunAllBlockingPoolTasksUntilIdle();
 
@@ -2805,7 +2821,8 @@
   request.transferred_request_request_id = request_id;
 
   ResourceHostMsg_RequestResource transfer_request_msg(
-      new_render_view_id, new_request_id, request);
+      new_render_view_id, new_request_id, request,
+      net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   OnMessageReceived(transfer_request_msg, second_filter.get());
   content::RunAllBlockingPoolTasksUntilIdle();
 
@@ -2817,7 +2834,8 @@
   request.transferred_request_request_id = second_request_id;
 
   ResourceHostMsg_RequestResource second_transfer_request_msg(
-      new_render_view_id, new_second_request_id, second_request);
+      new_render_view_id, new_second_request_id, second_request,
+      net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   OnMessageReceived(second_transfer_request_msg, second_filter.get());
   content::RunAllBlockingPoolTasksUntilIdle();
 
@@ -2887,7 +2905,8 @@
   request.transferred_request_request_id = request_id;
 
   ResourceHostMsg_RequestResource transfer_request_msg(
-      new_render_view_id, new_request_id, request);
+      new_render_view_id, new_request_id, request,
+      net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   OnMessageReceived(transfer_request_msg, second_filter.get());
   content::RunAllBlockingPoolTasksUntilIdle();
 
@@ -2933,7 +2952,8 @@
         "GET", RESOURCE_TYPE_MAIN_FRAME, GURL("http://example.com/blah"));
 
     ResourceHostMsg_RequestResource first_request_msg(
-        render_view_id, request_id, first_request);
+        render_view_id, request_id, first_request,
+        net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
     OnMessageReceived(first_request_msg, first_filter.get());
     content::RunAllBlockingPoolTasksUntilIdle();
 
@@ -2971,7 +2991,8 @@
   // For cleanup.
   child_ids_.insert(second_filter->child_id());
   ResourceHostMsg_RequestResource transfer_request_msg(
-      new_render_view_id, new_request_id, request);
+      new_render_view_id, new_request_id, request,
+      net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   OnMessageReceived(transfer_request_msg, second_filter.get());
   content::RunAllBlockingPoolTasksUntilIdle();
 
@@ -3048,7 +3069,8 @@
   // For cleanup.
   child_ids_.insert(second_filter->child_id());
   ResourceHostMsg_RequestResource transfer_request_msg(
-      new_render_view_id, new_request_id, request);
+      new_render_view_id, new_request_id, request,
+      net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   OnMessageReceived(transfer_request_msg, second_filter.get());
 
   // Verify that we update the ResourceRequestInfo.
@@ -3399,7 +3421,9 @@
   ResourceRequest request = CreateResourceRequest(
       "GET", RESOURCE_TYPE_SUB_RESOURCE, net::URLRequestTestJob::test_url_1());
   request.download_to_file = true;
-  ResourceHostMsg_RequestResource request_msg(0, 1, request);
+  ResourceHostMsg_RequestResource request_msg(
+      0, 1, request,
+      net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   OnMessageReceived(request_msg, filter_.get());
 
   // Running the message loop until idle does not work because
diff --git a/content/browser/loader/url_loader_factory_impl.cc b/content/browser/loader/url_loader_factory_impl.cc
index 2de2e1f..1c761e5 100644
--- a/content/browser/loader/url_loader_factory_impl.cc
+++ b/content/browser/loader/url_loader_factory_impl.cc
@@ -10,6 +10,7 @@
 #include "content/public/common/resource_request.h"
 #include "content/public/common/url_loader.mojom.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
+#include "net/traffic_annotation/network_traffic_annotation.h"
 
 namespace content {
 
@@ -85,7 +86,7 @@
   ResourceDispatcherHostImpl* rdh = ResourceDispatcherHostImpl::Get();
   rdh->OnRequestResourceWithMojo(requester_info, routing_id, request_id,
                                  url_request, std::move(request),
-                                 std::move(client));
+                                 std::move(client), traffic_annotation);
 }
 
 // static
diff --git a/content/browser/media/capture/desktop_capture_device.cc b/content/browser/media/capture/desktop_capture_device.cc
index a38923b..5c82401e 100644
--- a/content/browser/media/capture/desktop_capture_device.cc
+++ b/content/browser/media/capture/desktop_capture_device.cc
@@ -10,7 +10,6 @@
 #include <utility>
 
 #include "base/bind.h"
-#include "base/feature_list.h"
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/macros.h"
@@ -25,6 +24,7 @@
 #include "build/build_config.h"
 #include "content/browser/media/capture/desktop_capture_device_uma_types.h"
 #include "content/public/browser/browser_thread.h"
+#include "content/public/browser/desktop_capture.h"
 #include "content/public/browser/desktop_media_id.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/common/service_manager_connection.h"
@@ -79,11 +79,6 @@
 
 }  // namespace
 
-#if defined(OS_WIN)
-const base::Feature kDirectXCapturer{"DirectXCapturer",
-                                     base::FEATURE_ENABLED_BY_DEFAULT};
-#endif
-
 class DesktopCaptureDevice::Core : public webrtc::DesktopCapturer::Callback {
  public:
   Core(scoped_refptr<base::SingleThreadTaskRunner> task_runner,
@@ -401,20 +396,7 @@
 // static
 std::unique_ptr<media::VideoCaptureDevice> DesktopCaptureDevice::Create(
     const DesktopMediaID& source) {
-  webrtc::DesktopCaptureOptions options =
-      webrtc::DesktopCaptureOptions::CreateDefault();
-  // Leave desktop effects enabled during WebRTC captures.
-  options.set_disable_effects(false);
-
-#if defined(OS_WIN)
-  if (!base::FeatureList::IsEnabled(kDirectXCapturer)) {
-    options.set_allow_use_magnification_api(true);
-  } else {
-    options.set_allow_directx_capturer(true);
-    options.set_allow_use_magnification_api(false);
-  }
-#endif
-
+  auto options = CreateDesktopCaptureOptions();
   std::unique_ptr<webrtc::DesktopCapturer> capturer;
 
   switch (source.type) {
diff --git a/content/browser/renderer_host/input/touch_selection_controller_client_manager_android.cc b/content/browser/renderer_host/input/touch_selection_controller_client_manager_android.cc
new file mode 100644
index 0000000..c2b3251
--- /dev/null
+++ b/content/browser/renderer_host/input/touch_selection_controller_client_manager_android.cc
@@ -0,0 +1,143 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/renderer_host/input/touch_selection_controller_client_manager_android.h"
+
+#include "content/browser/renderer_host/render_widget_host_view_android.h"
+
+namespace content {
+
+TouchSelectionControllerClientManagerAndroid::
+    TouchSelectionControllerClientManagerAndroid(
+        RenderWidgetHostViewAndroid* rwhv)
+    : rwhv_(rwhv), active_client_(rwhv), page_scale_factor_(1.f) {
+  DCHECK(rwhv_);
+}
+
+TouchSelectionControllerClientManagerAndroid::
+    ~TouchSelectionControllerClientManagerAndroid() {
+  for (auto& observer : observers_)
+    observer.OnManagerWillDestroy(this);
+}
+
+void TouchSelectionControllerClientManagerAndroid::SetPageScaleFactor(
+    float page_scale_factor) {
+  page_scale_factor_ = page_scale_factor;
+}
+
+namespace {
+
+gfx::SelectionBound ScaleSelectionBound(const gfx::SelectionBound& bound,
+                                        float scale) {
+  gfx::SelectionBound scaled_bound;
+  gfx::PointF scaled_top = bound.edge_top();
+  scaled_top.Scale(scale);
+  gfx::PointF scaled_bottom = bound.edge_bottom();
+  scaled_bottom.Scale(scale);
+  scaled_bound.SetEdge(scaled_top, scaled_bottom);
+  scaled_bound.set_type(bound.type());
+  scaled_bound.set_visible(bound.visible());
+  return scaled_bound;
+}
+}  // namespace
+
+// TouchSelectionControllerClientManager implementation.
+void TouchSelectionControllerClientManagerAndroid::UpdateClientSelectionBounds(
+    const gfx::SelectionBound& start,
+    const gfx::SelectionBound& end,
+    ui::TouchSelectionControllerClient* client,
+    ui::TouchSelectionMenuClient* menu_client) {
+  if (client != active_client_ &&
+      (start.type() == gfx::SelectionBound::EMPTY || !start.visible()) &&
+      (end.type() == gfx::SelectionBound::EMPTY || !end.visible()) &&
+      (manager_selection_start_.type() != gfx::SelectionBound::EMPTY ||
+       manager_selection_end_.type() != gfx::SelectionBound::EMPTY)) {
+    return;
+  }
+
+  active_client_ = client;
+  if (active_client_ != rwhv_) {
+    manager_selection_start_ = ScaleSelectionBound(start, page_scale_factor_);
+    manager_selection_end_ = ScaleSelectionBound(end, page_scale_factor_);
+  } else {
+    manager_selection_start_ = start;
+    manager_selection_end_ = end;
+  }
+  // Notify TouchSelectionController if anything should change here. Only
+  // update if the client is different and not making a change to empty, or
+  // is the same client.
+  GetTouchSelectionController()->OnSelectionBoundsChanged(
+      manager_selection_start_, manager_selection_end_);
+}
+
+void TouchSelectionControllerClientManagerAndroid::InvalidateClient(
+    ui::TouchSelectionControllerClient* client) {
+  if (active_client_ == client)
+    active_client_ = rwhv_;
+}
+
+ui::TouchSelectionController*
+TouchSelectionControllerClientManagerAndroid::GetTouchSelectionController() {
+  return rwhv_->touch_selection_controller();
+}
+
+void TouchSelectionControllerClientManagerAndroid::AddObserver(
+    Observer* observer) {
+  observers_.AddObserver(observer);
+}
+
+void TouchSelectionControllerClientManagerAndroid::RemoveObserver(
+    Observer* observer) {
+  observers_.RemoveObserver(observer);
+}
+
+// TouchSelectionControllerClient implementation.
+bool TouchSelectionControllerClientManagerAndroid::SupportsAnimation() const {
+  return rwhv_->SupportsAnimation();
+}
+
+void TouchSelectionControllerClientManagerAndroid::SetNeedsAnimate() {
+  rwhv_->SetNeedsAnimate();
+}
+
+void TouchSelectionControllerClientManagerAndroid::MoveCaret(
+    const gfx::PointF& position) {
+  gfx::PointF scaled_position = position;
+  if (active_client_ != rwhv_)
+    scaled_position.Scale(1 / page_scale_factor_);
+  active_client_->MoveCaret(scaled_position);
+}
+
+void TouchSelectionControllerClientManagerAndroid::MoveRangeSelectionExtent(
+    const gfx::PointF& extent) {
+  gfx::PointF scaled_extent = extent;
+  if (active_client_ != rwhv_)
+    scaled_extent.Scale(1 / page_scale_factor_);
+  active_client_->MoveRangeSelectionExtent(scaled_extent);
+}
+
+void TouchSelectionControllerClientManagerAndroid::SelectBetweenCoordinates(
+    const gfx::PointF& base,
+    const gfx::PointF& extent) {
+  gfx::PointF scaled_extent = extent;
+  gfx::PointF scaled_base = base;
+  if (active_client_ != rwhv_) {
+    scaled_extent.Scale(1 / page_scale_factor_);
+    scaled_base.Scale(1 / page_scale_factor_);
+  }
+  active_client_->SelectBetweenCoordinates(scaled_base, scaled_extent);
+}
+
+void TouchSelectionControllerClientManagerAndroid::OnSelectionEvent(
+    ui::SelectionEventType event) {
+  // Always defer to the top-level RWHV TSC for this.
+  rwhv_->OnSelectionEvent(event);
+}
+
+std::unique_ptr<ui::TouchHandleDrawable>
+TouchSelectionControllerClientManagerAndroid::CreateDrawable() {
+  return rwhv_->CreateDrawable();
+}
+
+}  // namespace content
diff --git a/content/browser/renderer_host/input/touch_selection_controller_client_manager_android.h b/content/browser/renderer_host/input/touch_selection_controller_client_manager_android.h
new file mode 100644
index 0000000..ff406582
--- /dev/null
+++ b/content/browser/renderer_host/input/touch_selection_controller_client_manager_android.h
@@ -0,0 +1,63 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_RENDERER_HOST_INPUT_TOUCH_SELECTION_CONTROLLER_CLIENT_MANAGER_ANDROID_H_
+#define CONTENT_BROWSER_RENDERER_HOST_INPUT_TOUCH_SELECTION_CONTROLLER_CLIENT_MANAGER_ANDROID_H_
+
+#include "base/macros.h"
+#include "base/observer_list.h"
+#include "content/public/browser/touch_selection_controller_client_manager.h"
+#include "ui/touch_selection/touch_selection_controller.h"
+
+namespace content {
+
+class RenderWidgetHostViewAndroid;
+
+class TouchSelectionControllerClientManagerAndroid
+    : public TouchSelectionControllerClientManager,
+      public ui::TouchSelectionControllerClient {
+ public:
+  explicit TouchSelectionControllerClientManagerAndroid(
+      RenderWidgetHostViewAndroid* rwhv);
+  ~TouchSelectionControllerClientManagerAndroid() override;
+  void SetPageScaleFactor(float page_scale_factor);
+  float page_scale_factor() { return page_scale_factor_; }
+
+  // TouchSelectionControllerClientManager implementation.
+  void UpdateClientSelectionBounds(
+      const gfx::SelectionBound& start,
+      const gfx::SelectionBound& end,
+      ui::TouchSelectionControllerClient* client,
+      ui::TouchSelectionMenuClient* menu_client) override;
+  void InvalidateClient(ui::TouchSelectionControllerClient* client) override;
+  ui::TouchSelectionController* GetTouchSelectionController() override;
+
+  void AddObserver(Observer* observer) override;
+  void RemoveObserver(Observer* observer) override;
+
+  // TouchSelectionControllerClient implementation.
+  bool SupportsAnimation() const override;
+  void SetNeedsAnimate() override;
+  void MoveCaret(const gfx::PointF& position) override;
+  void MoveRangeSelectionExtent(const gfx::PointF& extent) override;
+  void SelectBetweenCoordinates(const gfx::PointF& base,
+                                const gfx::PointF& extent) override;
+  void OnSelectionEvent(ui::SelectionEventType event) override;
+  std::unique_ptr<ui::TouchHandleDrawable> CreateDrawable() override;
+
+ private:
+  RenderWidgetHostViewAndroid* rwhv_;
+  TouchSelectionControllerClient* active_client_;
+  float page_scale_factor_;
+  gfx::SelectionBound manager_selection_start_;
+  gfx::SelectionBound manager_selection_end_;
+  base::ObserverList<TouchSelectionControllerClientManager::Observer>
+      observers_;
+
+  DISALLOW_COPY_AND_ASSIGN(TouchSelectionControllerClientManagerAndroid);
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_RENDERER_HOST_INPUT_TOUCH_SELECTION_CONTROLLER_CLIENT_MANAGER_ANDROID_H_
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc
index 845d0f8d..c7406682 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -55,6 +55,7 @@
 #include "content/browser/renderer_host/frame_metadata_util.h"
 #include "content/browser/renderer_host/input/input_router.h"
 #include "content/browser/renderer_host/input/synthetic_gesture_target_android.h"
+#include "content/browser/renderer_host/input/touch_selection_controller_client_manager_android.h"
 #include "content/browser/renderer_host/input/web_input_event_builders_android.h"
 #include "content/browser/renderer_host/render_process_host_impl.h"
 #include "content/browser/renderer_host/render_view_host_delegate_view.h"
@@ -491,6 +492,8 @@
   }
 
   host_->SetView(this);
+  touch_selection_controller_client_manager_ =
+      base::MakeUnique<TouchSelectionControllerClientManagerAndroid>(this);
   SetContentViewCore(content_view_core);
 
   CreateOverscrollControllerIfPossible();
@@ -1369,6 +1372,19 @@
       event, GetSelectionRect(*touch_selection_controller_));
 }
 
+ui::TouchSelectionControllerClient*
+RenderWidgetHostViewAndroid::GetSelectionControllerClientManagerForTesting() {
+  return touch_selection_controller_client_manager_.get();
+}
+
+void RenderWidgetHostViewAndroid::SetSelectionControllerClientForTesting(
+    std::unique_ptr<ui::TouchSelectionControllerClient> client) {
+  touch_selection_controller_client_for_test_.swap(client);
+
+  touch_selection_controller_ = CreateSelectionController(
+      touch_selection_controller_client_for_test_.get(), content_view_core_);
+}
+
 std::unique_ptr<ui::TouchHandleDrawable>
 RenderWidgetHostViewAndroid::CreateDrawable() {
   DCHECK(content_view_core_);
@@ -1457,8 +1473,12 @@
     overscroll_controller_->OnFrameMetadataUpdated(frame_metadata);
 
   if (touch_selection_controller_) {
-    touch_selection_controller_->OnSelectionBoundsChanged(
-        frame_metadata.selection.start, frame_metadata.selection.end);
+    DCHECK(touch_selection_controller_client_manager_);
+    touch_selection_controller_client_manager_->UpdateClientSelectionBounds(
+        frame_metadata.selection.start, frame_metadata.selection.end, this,
+        nullptr);
+    touch_selection_controller_client_manager_->SetPageScaleFactor(
+        frame_metadata.page_scale_factor);
 
     // Set parameters for adaptive handle orientation.
     gfx::SizeF viewport_size(frame_metadata.scrollable_viewport_size);
@@ -1667,6 +1687,8 @@
     needs_animate |= overscroll_controller_->Animate(
         frame_time, content_view_core_->GetViewAndroid()->GetLayer());
   }
+  // TODO(wjmaclean): Investigate how animation here does or doesn't affect
+  // an OOPIF client.
   if (touch_selection_controller_)
     needs_animate |= touch_selection_controller_->Animate(frame_time);
   return needs_animate;
@@ -1713,33 +1735,6 @@
 
 InputEventAckState RenderWidgetHostViewAndroid::FilterInputEvent(
     const blink::WebInputEvent& input_event) {
-  if (touch_selection_controller_ &&
-      blink::WebInputEvent::IsGestureEventType(input_event.GetType())) {
-    const blink::WebGestureEvent& gesture_event =
-        static_cast<const blink::WebGestureEvent&>(input_event);
-    switch (gesture_event.GetType()) {
-      case blink::WebInputEvent::kGestureLongPress:
-        touch_selection_controller_->HandleLongPressEvent(
-            base::TimeTicks() +
-                base::TimeDelta::FromSecondsD(input_event.TimeStampSeconds()),
-            gfx::PointF(gesture_event.x, gesture_event.y));
-        break;
-
-      case blink::WebInputEvent::kGestureTap:
-        touch_selection_controller_->HandleTapEvent(
-            gfx::PointF(gesture_event.x, gesture_event.y),
-            gesture_event.data.tap.tap_count);
-        break;
-
-      case blink::WebInputEvent::kGestureScrollBegin:
-        touch_selection_controller_->OnScrollBeginEvent();
-        break;
-
-      default:
-        break;
-    }
-  }
-
   if (overscroll_controller_ &&
       blink::WebInputEvent::IsGestureEventType(input_event.GetType()) &&
       overscroll_controller_->WillHandleGestureEvent(
@@ -1899,6 +1894,33 @@
   if (!host_ || !host_->delegate())
     return;
 
+  // We let the touch selection controller see gesture events here, since they
+  // may be routed and not make it to FilterInputEvent().
+  if (touch_selection_controller_ &&
+      event.source_device ==
+          blink::WebGestureDevice::kWebGestureDeviceTouchscreen) {
+    switch (event.GetType()) {
+      case blink::WebInputEvent::kGestureLongPress:
+        touch_selection_controller_->HandleLongPressEvent(
+            base::TimeTicks() +
+                base::TimeDelta::FromSecondsD(event.TimeStampSeconds()),
+            gfx::PointF(event.x, event.y));
+        break;
+
+      case blink::WebInputEvent::kGestureTap:
+        touch_selection_controller_->HandleTapEvent(
+            gfx::PointF(event.x, event.y), event.data.tap.tap_count);
+        break;
+
+      case blink::WebInputEvent::kGestureScrollBegin:
+        touch_selection_controller_->OnScrollBeginEvent();
+        break;
+
+      default:
+        break;
+    }
+  }
+
   ui::LatencyInfo latency_info =
       ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event);
   if (wheel_scroll_latching_enabled()) {
@@ -2055,9 +2077,15 @@
   if (resize)
     WasResized();
 
-  if (!touch_selection_controller_)
+  if (!touch_selection_controller_) {
+    ui::TouchSelectionControllerClient* client =
+        touch_selection_controller_client_manager_.get();
+    if (touch_selection_controller_client_for_test_)
+      client = touch_selection_controller_client_for_test_.get();
+
     touch_selection_controller_ =
-        CreateSelectionController(this, content_view_core_);
+        CreateSelectionController(client, content_view_core_);
+  }
 
   if (content_view_core_)
     CreateOverscrollControllerIfPossible();
@@ -2070,6 +2098,11 @@
   }
 }
 
+TouchSelectionControllerClientManager*
+RenderWidgetHostViewAndroid::GetTouchSelectionControllerClientManager() {
+  return touch_selection_controller_client_manager_.get();
+}
+
 bool RenderWidgetHostViewAndroid::OnTouchEvent(
     const ui::MotionEventAndroid& event,
     bool for_touch_handle) {
diff --git a/content/browser/renderer_host/render_widget_host_view_android.h b/content/browser/renderer_host/render_widget_host_view_android.h
index df19e6808..c7c18a97 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.h
+++ b/content/browser/renderer_host/render_widget_host_view_android.h
@@ -56,6 +56,7 @@
 class SelectionPopupController;
 class SynchronousCompositorHost;
 class SynchronousCompositorClient;
+class TouchSelectionControllerClientManagerAndroid;
 class WebContentsAccessibilityAndroid;
 struct NativeWebKeyboardEvent;
 struct ContextMenuParams;
@@ -95,6 +96,10 @@
   void AddDestructionObserver(DestructionObserver* connector);
   void RemoveDestructionObserver(DestructionObserver* connector);
 
+  ui::TouchSelectionController* touch_selection_controller() {
+    return touch_selection_controller_.get();
+  }
+
   // RenderWidgetHostView implementation.
   bool OnMessageReceived(const IPC::Message& msg) override;
   void InitAsChild(gfx::NativeView parent_view) override;
@@ -181,6 +186,8 @@
       const gfx::Point& point,
       RenderWidgetHostViewBase* target_view,
       gfx::Point* transformed_point) override;
+  TouchSelectionControllerClientManager*
+  GetTouchSelectionControllerClientManager() override;
 
   // ui::ViewClient implementation.
   bool OnTouchEvent(const ui::MotionEventAndroid& m,
@@ -305,6 +312,11 @@
   // Exposed for tests.
   cc::SurfaceId SurfaceIdForTesting() const override;
 
+  ui::TouchSelectionControllerClient*
+  GetSelectionControllerClientManagerForTesting();
+  void SetSelectionControllerClientForTesting(
+      std::unique_ptr<ui::TouchSelectionControllerClient> client);
+
  private:
   void RunAckCallbacks();
 
@@ -414,6 +426,12 @@
   // Manages selection handle rendering and manipulation.
   // This will always be NULL if |content_view_core_| is NULL.
   std::unique_ptr<ui::TouchSelectionController> touch_selection_controller_;
+  std::unique_ptr<ui::TouchSelectionControllerClient>
+      touch_selection_controller_client_for_test_;
+  // Keeps track of currently active touch selection controller clients (some
+  // may be representing out-of-process iframes).
+  std::unique_ptr<TouchSelectionControllerClientManagerAndroid>
+      touch_selection_controller_client_manager_;
 
   // Bounds to use if we have no backing ContentViewCore
   gfx::Rect default_bounds_;
diff --git a/content/browser/resources/media/client_renderer.js b/content/browser/resources/media/client_renderer.js
index 3206ac9..3bdf538 100644
--- a/content/browser/resources/media/client_renderer.js
+++ b/content/browser/resources/media/client_renderer.js
@@ -51,7 +51,7 @@
     NO_PLAYERS_SELECTED: 'no-players-selected',
     NO_COMPONENTS_SELECTED: 'no-components-selected',
     SELECTABLE_BUTTON: 'selectable-button',
-    DESTRUCTED_PLAYER: 'destructed-player'
+    DESTRUCTED_PLAYER: 'destructed-player',
   };
 
   function removeChildren(element) {
@@ -60,7 +60,7 @@
     }
   };
 
-  function createSelectableButton(id, groupName, text, select_cb,
+  function createSelectableButton(id, groupName, buttonLabel, select_cb,
                                   isDestructed) {
     // For CSS styling.
     var radioButton = document.createElement('input');
@@ -69,12 +69,10 @@
     radioButton.id = id;
     radioButton.name = groupName;
 
-    var buttonLabel = document.createElement('label');
     buttonLabel.classList.add(ClientRenderer.Css_.SELECTABLE_BUTTON);
     if (isDestructed)
       buttonLabel.classList.add(ClientRenderer.Css_.DESTRUCTED_PLAYER);
     buttonLabel.setAttribute('for', radioButton.id);
-    buttonLabel.appendChild(document.createTextNode(text));
 
     var fragment = document.createDocumentFragment();
     fragment.appendChild(radioButton);
@@ -177,14 +175,11 @@
         this.drawProperties_(player.properties, this.playerPropertiesTable);
         this.drawLog_();
       }
-      if (key === 'name' || key === 'url') {
-        this.redrawPlayerList_(players);
-      }
-      if (key === 'event' && value === 'WEBMEDIAPLAYER_DESTROYED') {
+      if (key === 'event' && value === 'WEBMEDIAPLAYER_DESTROYED')
         player.destructed = true;
-        document.querySelector(
-            "label.selectable-button[for='" + player.id + "']").classList.add(
-                ClientRenderer.Css_.DESTRUCTED_PLAYER);
+      if (['url', 'frame_url', 'frame_title', 'audio_codec_name',
+           'video_codec_name', 'width', 'height', 'event'].includes(key)) {
+        this.redrawPlayerList_(players);
       }
     },
 
@@ -307,8 +302,10 @@
         var button_cb = this.selectAudioComponent_.bind(
                 this, componentType, id, components[id]);
         var friendlyName = this.getAudioComponentName_(componentType, id);
+        var label = document.createElement('label');
+        label.appendChild(document.createTextNode(friendlyName));
         li.appendChild(createSelectableButton(
-            id, buttonGroupName, friendlyName, button_cb));
+            id, buttonGroupName, label, button_cb));
         fragment.appendChild(li);
       }
       removeChildren(listElement);
@@ -348,14 +345,53 @@
       for (var id in players) {
         hasPlayers = true;
         var player = players[id];
-        var usableName = player.properties.name ||
-            player.properties.url ||
-            'Player ' + player.id;
+        var p = player.properties;
+        var label = document.createElement('label');
+
+        var name_text = p.url || 'Player ' + player.id;
+        var name_node = document.createElement('span');
+        name_node.appendChild(document.createTextNode(name_text));
+        name_node.className = 'player-name';
+        label.appendChild(name_node);
+
+        var frame = [];
+        if (p.frame_title)
+          frame.push(p.frame_title);
+        if (p.frame_url)
+          frame.push(p.frame_url);
+        var frame_text = frame.join(' - ');
+        if (frame_text) {
+          label.appendChild(document.createElement('br'));
+          var frame_node = document.createElement('span');
+          frame_node.className = 'player-frame';
+          frame_node.appendChild(document.createTextNode(frame_text));
+          label.appendChild(frame_node);
+        }
+
+        var desc = []
+        if (p.width && p.height)
+          desc.push(p.width + 'x' + p.height);
+        if (p.video_codec_name)
+          desc.push(p.video_codec_name);
+        if (p.video_codec_name && p.audio_codec_name)
+          desc.push('+');
+        if (p.audio_codec_name)
+          desc.push(p.audio_codec_name);
+        if (p.event)
+          desc.push('(' + p.event + ')');
+        var desc_text = desc.join(' ');
+        if (desc_text) {
+          label.appendChild(document.createElement('br'));
+          var desc_node = document.createElement('span');
+          desc_node.className = 'player-desc';
+          desc_node.appendChild(document.createTextNode(desc_text));
+          label.appendChild(desc_node);
+        }
 
         var li = document.createElement('li');
         var button_cb = this.selectPlayer_.bind(this, player);
         li.appendChild(createSelectableButton(
-            id, buttonGroupName, usableName, button_cb, player.destructed));
+            id, buttonGroupName, label, button_cb, player.destructed));
         fragment.appendChild(li);
       }
       removeChildren(this.playerListElement);
diff --git a/content/browser/resources/media/media_internals.css b/content/browser/resources/media/media_internals.css
index 372d2a8..72afd8c 100644
--- a/content/browser/resources/media/media_internals.css
+++ b/content/browser/resources/media/media_internals.css
@@ -178,10 +178,15 @@
 }
 
 label.selectable-button {
-  -webkit-appearance: button;
   -webkit-user-select: none;
-  padding: 2px 5px;
-  margin-bottom: 5px;
+  display: inline-block;
+  background: #BDF;
+  cursor: pointer;
+  border: solid 1px #999;
+  border-radius: 3px;
+  padding: 6px;
+  margin: 4px 0;
+  line-height: 1.4;
 }
 
 input.selectable-button {
@@ -189,12 +194,25 @@
 }
 
 input.selectable-button:checked + label.selectable-button {
-  background-color: #4AA9E4;
-  color: white;
+  background-color: #2196F3;
+  border-color: #666;
+  color: #FFF;
+}
+
+input.selectable-button:hover + label.selectable-button {
+  border-color: #666;
 }
 
 label.destructed-player {
-  background-color: #E4854A;
+  background-color: #EEE;
+}
+
+.player-name {
+  font-weight: bold;
+}
+
+.player-frame {
+  font-style: italic;
 }
 
 .no-players-selected #players .property-wrapper,
diff --git a/content/browser/security_exploit_browsertest.cc b/content/browser/security_exploit_browsertest.cc
index 35c121a..be38010 100644
--- a/content/browser/security_exploit_browsertest.cc
+++ b/content/browser/security_exploit_browsertest.cc
@@ -46,6 +46,7 @@
 #include "net/dns/mock_host_resolver.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "net/test/url_request/url_request_slow_download_job.h"
+#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "third_party/WebKit/public/web/WebTriggeringEventInfo.h"
 
 using IPC::IpcSecurityTestUtil;
@@ -163,11 +164,15 @@
   IPC::IpcSecurityTestUtil::PwnMessageReceived(
       rfh->GetProcess()->GetChannel(),
       ResourceHostMsg_RequestResource(rfh->GetRoutingID(),
-                                      kRequestIdNotPreviouslyUsed, request));
+                                      kRequestIdNotPreviouslyUsed, request,
+                                      net::MutableNetworkTrafficAnnotationTag(
+                                          TRAFFIC_ANNOTATION_FOR_TESTS)));
   IPC::IpcSecurityTestUtil::PwnMessageReceived(
       rfh->GetProcess()->GetChannel(),
       ResourceHostMsg_RequestResource(rfh->GetRoutingID(),
-                                      kRequestIdNotPreviouslyUsed, request));
+                                      kRequestIdNotPreviouslyUsed, request,
+                                      net::MutableNetworkTrafficAnnotationTag(
+                                          TRAFFIC_ANNOTATION_FOR_TESTS)));
   process_killed.Wait();
 }
 
@@ -456,7 +461,9 @@
         web_rfh->GetProcess()->GetChannel(),
         ResourceHostMsg_RequestResource(web_rfh->GetRoutingID(),
                                         kRequestIdNotPreviouslyUsed,
-                                        chrome_origin_msg));
+                                        chrome_origin_msg,
+                                        net::MutableNetworkTrafficAnnotationTag(
+                                            TRAFFIC_ANNOTATION_FOR_TESTS)));
     web_process_killed.Wait();
   }
 
@@ -476,7 +483,9 @@
         web_rfh->GetProcess()->GetChannel(),
         ResourceHostMsg_RequestResource(web_rfh->GetRoutingID(),
                                         kRequestIdNotPreviouslyUsed,
-                                        embedder_isolated_origin_msg));
+                                        embedder_isolated_origin_msg,
+                                        net::MutableNetworkTrafficAnnotationTag(
+                                            TRAFFIC_ANNOTATION_FOR_TESTS)));
     web_process_killed.Wait();
   }
 
@@ -490,7 +499,9 @@
         web_rfh->GetProcess()->GetChannel(),
         ResourceHostMsg_RequestResource(web_rfh->GetRoutingID(),
                                         kRequestIdNotPreviouslyUsed,
-                                        invalid_origin_msg));
+                                        invalid_origin_msg,
+                                        net::MutableNetworkTrafficAnnotationTag(
+                                            TRAFFIC_ANNOTATION_FOR_TESTS)));
     web_process_killed.Wait();
   }
 
@@ -504,7 +515,9 @@
         web_rfh->GetProcess()->GetChannel(),
         ResourceHostMsg_RequestResource(web_rfh->GetRoutingID(),
                                         kRequestIdNotPreviouslyUsed,
-                                        invalid_scheme_origin_msg));
+                                        invalid_scheme_origin_msg,
+                                        net::MutableNetworkTrafficAnnotationTag(
+                                            TRAFFIC_ANNOTATION_FOR_TESTS)));
     web_process_killed.Wait();
   }
 }
diff --git a/content/browser/service_worker/embedded_worker_instance.cc b/content/browser/service_worker/embedded_worker_instance.cc
index f8df38c9..d64ee26 100644
--- a/content/browser/service_worker/embedded_worker_instance.cc
+++ b/content/browser/service_worker/embedded_worker_instance.cc
@@ -238,8 +238,8 @@
   DISALLOW_COPY_AND_ASSIGN(DevToolsProxy);
 };
 
-// A handle for a worker process managed by ServiceWorkerProcessManager on the
-// UI thread.
+// A handle for a renderer process managed by ServiceWorkerProcessManager on the
+// UI thread. Lives on the IO thread.
 class EmbeddedWorkerInstance::WorkerProcessHandle {
  public:
   WorkerProcessHandle(const base::WeakPtr<ServiceWorkerContextCore>& context,
@@ -250,12 +250,19 @@
         embedded_worker_id_(embedded_worker_id),
         process_id_(process_id),
         is_new_process_(is_new_process) {
+    DCHECK_CURRENTLY_ON(BrowserThread::IO);
     DCHECK_NE(ChildProcessHost::kInvalidUniqueID, process_id_);
   }
 
   ~WorkerProcessHandle() {
-    if (context_)
-      context_->process_manager()->ReleaseWorkerProcess(embedded_worker_id_);
+    DCHECK_CURRENTLY_ON(BrowserThread::IO);
+    if (!context_)
+      return;
+    BrowserThread::PostTask(
+        BrowserThread::UI, FROM_HERE,
+        base::BindOnce(&ServiceWorkerProcessManager::ReleaseWorkerProcess,
+                       context_->process_manager()->AsWeakPtr(),
+                       embedded_worker_id_));
   }
 
   int process_id() const { return process_id_; }
@@ -290,6 +297,7 @@
         is_installed_(false),
         started_during_browser_startup_(false),
         weak_factory_(this) {
+    DCHECK_CURRENTLY_ON(BrowserThread::IO);
     TRACE_EVENT_NESTABLE_ASYNC_BEGIN1("ServiceWorker",
                                       "EmbeddedWorkerInstance::Start",
                                       instance_, "Script", script_url.spec());
@@ -309,8 +317,11 @@
         break;
       case ProcessAllocationState::ALLOCATING:
         // Abort half-baked process allocation on the UI thread.
-        instance_->context_->process_manager()->ReleaseWorkerProcess(
-            instance_->embedded_worker_id());
+        BrowserThread::PostTask(
+            BrowserThread::UI, FROM_HERE,
+            base::BindOnce(&ServiceWorkerProcessManager::ReleaseWorkerProcess,
+                           instance_->context_->process_manager()->AsWeakPtr(),
+                           instance_->embedded_worker_id()));
         break;
       case ProcessAllocationState::ALLOCATED:
         // Otherwise, the process will be released by EmbeddedWorkerInstance.
@@ -461,6 +472,7 @@
 }
 
 EmbeddedWorkerInstance::~EmbeddedWorkerInstance() {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
   DCHECK(status_ == EmbeddedWorkerStatus::STOPPING ||
          status_ == EmbeddedWorkerStatus::STOPPED)
       << static_cast<int>(status_);
@@ -584,7 +596,9 @@
       instance_host_binding_(this),
       devtools_attached_(false),
       network_accessed_for_script_(false),
-      weak_factory_(this) {}
+      weak_factory_(this) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+}
 
 void EmbeddedWorkerInstance::OnProcessAllocated(
     std::unique_ptr<WorkerProcessHandle> handle,
diff --git a/content/browser/service_worker/embedded_worker_instance.h b/content/browser/service_worker/embedded_worker_instance.h
index b99d435..f70c3fc4 100644
--- a/content/browser/service_worker/embedded_worker_instance.h
+++ b/content/browser/service_worker/embedded_worker_instance.h
@@ -47,6 +47,8 @@
 // This gives an interface to control one EmbeddedWorker instance, which
 // may be 'in-waiting' or running in one of the child processes added by
 // AddProcessReference().
+//
+// Owned by ServiceWorkerVersion. Lives on the IO thread.
 class CONTENT_EXPORT EmbeddedWorkerInstance
     : NON_EXPORTED_BASE(public mojom::EmbeddedWorkerInstanceHost) {
  public:
diff --git a/content/browser/service_worker/service_worker_controllee_request_handler.cc b/content/browser/service_worker/service_worker_controllee_request_handler.cc
index 61a3c55..6c679e73 100644
--- a/content/browser/service_worker/service_worker_controllee_request_handler.cc
+++ b/content/browser/service_worker/service_worker_controllee_request_handler.cc
@@ -9,6 +9,7 @@
 #include <string>
 
 #include "base/trace_event/trace_event.h"
+#include "components/offline_pages/features/features.h"
 #include "content/browser/service_worker/service_worker_context_core.h"
 #include "content/browser/service_worker/service_worker_metrics.h"
 #include "content/browser/service_worker/service_worker_provider_host.h"
@@ -30,6 +31,10 @@
 #include "net/url_request/url_request.h"
 #include "ui/base/page_transition_types.h"
 
+#if BUILDFLAG(ENABLE_OFFLINE_PAGES)
+#include "components/offline_pages/core/request_header/offline_page_header.h"
+#endif  // BUILDFLAG(ENABLE_OFFLINE_PAGES)
+
 namespace content {
 
 namespace {
@@ -50,6 +55,26 @@
   return false;
 }
 
+#if BUILDFLAG(ENABLE_OFFLINE_PAGES)
+// A web page, regardless of whether the service worker is used or not, could
+// be downloaded with the offline snapshot captured. The user can then open
+// the downloaded page which is identified by the presence of a specific
+// offline header in the network request. In this case, we want to fall back
+// in order for the subsequent offline page interceptor to bring up the
+// offline snapshot of the page.
+bool ShouldFallbackToLoadOfflinePage(
+    const net::HttpRequestHeaders& extra_request_headers) {
+  std::string offline_header_value;
+  if (!extra_request_headers.GetHeader(offline_pages::kOfflinePageHeader,
+                                       &offline_header_value)) {
+    return false;
+  }
+  offline_pages::OfflinePageHeader offline_header(offline_header_value);
+  return offline_header.reason ==
+         offline_pages::OfflinePageHeader::Reason::DOWNLOAD;
+}
+#endif  // BUILDFLAG(ENABLE_OFFLINE_PAGES)
+
 }  // namespace
 
 ServiceWorkerControlleeRequestHandler::ServiceWorkerControlleeRequestHandler(
@@ -124,6 +149,13 @@
     return NULL;
   }
 
+#if BUILDFLAG(ENABLE_OFFLINE_PAGES)
+  // Fall back for the subsequent offline page interceptor to load the offline
+  // snapshot of the page if required.
+  if (ShouldFallbackToLoadOfflinePage(request->extra_request_headers()))
+    return nullptr;
+#endif  // BUILDFLAG(ENABLE_OFFLINE_PAGES)
+
   // It's for original request (A) or redirect case (B-a or B-b).
   std::unique_ptr<ServiceWorkerURLRequestJob> job(
       new ServiceWorkerURLRequestJob(
@@ -176,6 +208,17 @@
   // never see use_network_ gets true.
   DCHECK(!use_network_);
 
+#if BUILDFLAG(ENABLE_OFFLINE_PAGES)
+  // Fall back for the subsequent offline page interceptor to load the offline
+  // snapshot of the page if required.
+  net::HttpRequestHeaders extra_request_headers;
+  extra_request_headers.AddHeadersFromString(resource_request.headers);
+  if (ShouldFallbackToLoadOfflinePage(extra_request_headers)) {
+    std::move(callback).Run(StartLoaderCallback());
+    return;
+  }
+#endif  // BUILDFLAG(ENABLE_OFFLINE_PAGES)
+
   url_job_ = base::MakeUnique<ServiceWorkerURLJobWrapper>(
       base::MakeUnique<ServiceWorkerURLLoaderJob>(
           std::move(callback), this, resource_request, blob_storage_context_));
diff --git a/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc b/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc
index fd10726..5c6f391 100644
--- a/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc
+++ b/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc
@@ -11,6 +11,7 @@
 #include "base/files/scoped_temp_dir.h"
 #include "base/logging.h"
 #include "base/run_loop.h"
+#include "components/offline_pages/features/features.h"
 #include "content/browser/browser_thread_impl.h"
 #include "content/browser/service_worker/embedded_worker_test_helper.h"
 #include "content/browser/service_worker/service_worker_context_core.h"
@@ -78,6 +79,8 @@
 
     void ResetHandler() { handler_.reset(nullptr); }
 
+    net::URLRequest* request() const { return request_.get(); }
+
    private:
     ServiceWorkerControlleeRequestHandlerTest* test_;
     std::unique_ptr<net::URLRequest> request_;
@@ -378,4 +381,50 @@
   EXPECT_FALSE(sub_cors_job->ShouldForwardToServiceWorker());
 }
 
+#if BUILDFLAG(ENABLE_OFFLINE_PAGES)
+TEST_F(ServiceWorkerControlleeRequestHandlerTest, FallbackWithOfflineHeader) {
+  version_->set_fetch_handler_existence(
+      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
+  registration_->SetActiveVersion(version_);
+  context()->storage()->StoreRegistration(
+      registration_.get(), version_.get(),
+      base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
+  base::RunLoop().RunUntilIdle();
+  version_ = NULL;
+  registration_ = NULL;
+
+  ServiceWorkerRequestTestResources test_resources(
+      this, GURL("https://host/scope/doc"), RESOURCE_TYPE_MAIN_FRAME);
+  // Sets an offline header to indicate force loading offline page.
+  test_resources.request()->SetExtraRequestHeaderByName(
+      "X-Chrome-offline", "reason=download", true);
+  ServiceWorkerURLRequestJob* sw_job = test_resources.MaybeCreateJob();
+
+  EXPECT_FALSE(sw_job);
+}
+
+TEST_F(ServiceWorkerControlleeRequestHandlerTest, FallbackWithNoOfflineHeader) {
+  version_->set_fetch_handler_existence(
+      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
+  registration_->SetActiveVersion(version_);
+  context()->storage()->StoreRegistration(
+      registration_.get(), version_.get(),
+      base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
+  base::RunLoop().RunUntilIdle();
+  version_ = NULL;
+  registration_ = NULL;
+
+  ServiceWorkerRequestTestResources test_resources(
+      this, GURL("https://host/scope/doc"), RESOURCE_TYPE_MAIN_FRAME);
+  // Empty offline header value should not cause fallback.
+  test_resources.request()->SetExtraRequestHeaderByName("X-Chrome-offline", "",
+                                                        true);
+  ServiceWorkerURLRequestJob* sw_job = test_resources.MaybeCreateJob();
+
+  EXPECT_TRUE(sw_job);
+}
+#endif  // BUILDFLAG(ENABLE_OFFLINE_PAGE
+
 }  // namespace content
diff --git a/content/browser/service_worker/service_worker_process_manager.cc b/content/browser/service_worker/service_worker_process_manager.cc
index 4cf0da9..48d2547 100644
--- a/content/browser/service_worker/service_worker_process_manager.cc
+++ b/content/browser/service_worker/service_worker_process_manager.cc
@@ -237,16 +237,7 @@
 }
 
 void ServiceWorkerProcessManager::ReleaseWorkerProcess(int embedded_worker_id) {
-  if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
-    BrowserThread::PostTask(
-        BrowserThread::UI,
-        FROM_HERE,
-        base::Bind(&ServiceWorkerProcessManager::ReleaseWorkerProcess,
-                   weak_this_,
-                   embedded_worker_id));
-    return;
-  }
-
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
   if (process_id_for_test_ != ChildProcessHost::kInvalidUniqueID) {
     // Unittests don't increment or decrement the worker refcount of a
     // RenderProcessHost.
@@ -267,7 +258,7 @@
   if (info == instance_info_.end())
     return;
 
-  RenderProcessHost* rph = NULL;
+  RenderProcessHost* rph = nullptr;
   if (info->second.site_instance.get()) {
     rph = info->second.site_instance->GetProcess();
     DCHECK_EQ(info->second.process_id, rph->GetID())
diff --git a/content/browser/service_worker/service_worker_process_manager.h b/content/browser/service_worker/service_worker_process_manager.h
index 606164f..6c86d491 100644
--- a/content/browser/service_worker/service_worker_process_manager.h
+++ b/content/browser/service_worker/service_worker_process_manager.h
@@ -60,9 +60,11 @@
   // Returns a reference to a running process suitable for starting the service
   // worker described by |emdedded_worker_id|, |pattern|, and |script_url|.
   //
-  // AllocateWorkerProcess() tries to return an existing process. If one is not
-  // available, or |can_use_existing_process| is false, it will create a new
-  // one.
+  // AllocateWorkerProcess() tries to return a process that already exists in
+  // this ServiceWorkerProcessManager's map of processes, populated via
+  // AddProcessReferenceToPattern().  If one is not found, or
+  // |can_use_existing_process| is false, it will instead use SiteInstance to
+  // get a process, possibly creating a new one.
   //
   // If SERVICE_WORKER_OK is returned, |out_info| contains information about the
   // process.
@@ -79,6 +81,8 @@
 
   // Drops a reference to a process that was running a Service Worker, and its
   // SiteInstance.  This must match a call to AllocateWorkerProcess.
+  //
+  // Called on the UI thread.
   void ReleaseWorkerProcess(int embedded_worker_id);
 
   // Sets a single process ID that will be used for all embedded workers.  This
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc
index 24a2536..ef3341d9b 100644
--- a/content/browser/site_per_process_browsertest.cc
+++ b/content/browser/site_per_process_browsertest.cc
@@ -111,8 +111,11 @@
 #include "base/android/jni_android.h"
 #include "base/android/jni_string.h"
 #include "base/android/scoped_java_ref.h"
+#include "base/json/json_reader.h"
 #include "content/browser/android/ime_adapter_android.h"
+#include "content/browser/renderer_host/input/touch_selection_controller_client_manager_android.h"
 #include "content/browser/renderer_host/render_widget_host_view_android.h"
+#include "ui/gfx/geometry/point_f.h"
 #endif
 
 using ::testing::SizeIs;
@@ -10487,4 +10490,306 @@
                 ->GetProcess());
 }
 
+#if defined(OS_ANDROID)
+// Tests for Android TouchSelectionEditing.
+class TouchSelectionControllerClientAndroidSiteIsolationTest
+    : public SitePerProcessBrowserTest {
+ public:
+  TouchSelectionControllerClientAndroidSiteIsolationTest() {}
+
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    IsolateAllSitesForTesting(command_line);
+  }
+
+  RenderWidgetHostViewAndroid* GetRenderWidgetHostViewAndroid() {
+    return static_cast<RenderWidgetHostViewAndroid*>(
+        shell()->web_contents()->GetRenderWidgetHostView());
+  }
+
+  void SelectWithLongPress(gfx::Point point) {
+    // Get main frame view for event insertion.
+    RenderWidgetHostViewAndroid* main_view = GetRenderWidgetHostViewAndroid();
+
+    SendTouch(main_view, ui::MotionEvent::ACTION_DOWN, point);
+    // action_timeout() is far longer than needed for a LongPress, so we use
+    // a custom timeout here.
+    DelayBy(base::TimeDelta::FromMilliseconds(2000));
+    SendTouch(main_view, ui::MotionEvent::ACTION_UP, point);
+  }
+
+  void SimpleTap(gfx::Point point) {
+    // Get main frame view for event insertion.
+    RenderWidgetHostViewAndroid* main_view = GetRenderWidgetHostViewAndroid();
+
+    SendTouch(main_view, ui::MotionEvent::ACTION_DOWN, point);
+    // tiny_timeout() is way shorter than a reasonable user-created tap gesture,
+    // so we use a custom timeout here.
+    DelayBy(base::TimeDelta::FromMilliseconds(300));
+    SendTouch(main_view, ui::MotionEvent::ACTION_UP, point);
+  }
+
+ protected:
+  void DelayBy(base::TimeDelta delta) {
+    base::RunLoop run_loop;
+    base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+        FROM_HERE, run_loop.QuitClosure(), delta);
+    run_loop.Run();
+  }
+
+ private:
+  void SendTouch(RenderWidgetHostViewAndroid* view,
+                 ui::MotionEvent::Action action,
+                 gfx::Point point) {
+    DCHECK(action >= ui::MotionEvent::ACTION_DOWN &&
+           action << ui::MotionEvent::ACTION_CANCEL);
+    ui::MotionEventGeneric touch(
+        action, ui::EventTimeForNow(),
+        ui::PointerProperties(point.x(), point.y(), 10));
+    view->OnTouchEvent(touch);
+  }
+};
+
+class FrameStableObserver {
+ public:
+  FrameStableObserver(RenderWidgetHostViewBase* view, base::TimeDelta delta)
+      : view_(view), delta_(delta) {}
+  virtual ~FrameStableObserver() {}
+
+  void WaitUntilStable() {
+    uint32_t current_frame_number = view_->RendererFrameNumber();
+    uint32_t previous_frame_number;
+
+    do {
+      base::RunLoop run_loop;
+      base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+          FROM_HERE, run_loop.QuitClosure(), delta_);
+      run_loop.Run();
+      previous_frame_number = current_frame_number;
+      current_frame_number = view_->RendererFrameNumber();
+    } while (current_frame_number != previous_frame_number);
+  }
+
+ private:
+  RenderWidgetHostViewBase* view_;
+  base::TimeDelta delta_;
+
+  DISALLOW_COPY_AND_ASSIGN(FrameStableObserver);
+};
+
+class TouchSelectionControllerClientTestWrapper
+    : public ui::TouchSelectionControllerClient {
+ public:
+  explicit TouchSelectionControllerClientTestWrapper(
+      ui::TouchSelectionControllerClient* client)
+      : expected_event_(ui::SELECTION_HANDLES_SHOWN), client_(client) {}
+
+  ~TouchSelectionControllerClientTestWrapper() override {}
+
+  void InitWaitForSelectionEvent(ui::SelectionEventType expected_event) {
+    DCHECK(!run_loop_);
+    expected_event_ = expected_event;
+    run_loop_.reset(new base::RunLoop());
+  }
+
+  void Wait() {
+    DCHECK(run_loop_);
+    run_loop_->Run();
+    run_loop_.reset();
+  }
+
+ private:
+  // TouchSelectionControllerClient:
+  void OnSelectionEvent(ui::SelectionEventType event) override {
+    client_->OnSelectionEvent(event);
+    if (run_loop_ && event == expected_event_)
+      run_loop_->Quit();
+  }
+
+  bool SupportsAnimation() const override {
+    return client_->SupportsAnimation();
+  }
+
+  void SetNeedsAnimate() override { client_->SetNeedsAnimate(); }
+
+  void MoveCaret(const gfx::PointF& position) override {
+    client_->MoveCaret(position);
+  }
+
+  void MoveRangeSelectionExtent(const gfx::PointF& extent) override {
+    client_->MoveRangeSelectionExtent(extent);
+  }
+
+  void SelectBetweenCoordinates(const gfx::PointF& base,
+                                const gfx::PointF& extent) override {
+    client_->SelectBetweenCoordinates(base, extent);
+  }
+
+  std::unique_ptr<ui::TouchHandleDrawable> CreateDrawable() override {
+    return client_->CreateDrawable();
+  }
+
+  ui::SelectionEventType expected_event_;
+  std::unique_ptr<base::RunLoop> run_loop_;
+  // Not owned.
+  ui::TouchSelectionControllerClient* client_;
+
+  DISALLOW_COPY_AND_ASSIGN(TouchSelectionControllerClientTestWrapper);
+};
+
+namespace {
+
+bool ConvertJSONToPoint(const std::string& str, gfx::PointF* point) {
+  std::unique_ptr<base::Value> value = base::JSONReader::Read(str);
+  if (!value)
+    return false;
+  base::DictionaryValue* root;
+  if (!value->GetAsDictionary(&root))
+    return false;
+  double x, y;
+  if (!root->GetDouble("x", &x))
+    return false;
+  if (!root->GetDouble("y", &y))
+    return false;
+  point->set_x(x);
+  point->set_y(y);
+  return true;
+}
+
+}  // namespace
+
+IN_PROC_BROWSER_TEST_F(TouchSelectionControllerClientAndroidSiteIsolationTest,
+                       BasicSelectionIsolatedIframe) {
+  GURL test_url(embedded_test_server()->GetURL(
+      "a.com", "/cross_site_iframe_factory.html?a(a)"));
+  EXPECT_TRUE(NavigateToURL(shell(), test_url));
+  FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
+                            ->GetFrameTree()
+                            ->root();
+  EXPECT_EQ(
+      " Site A\n"
+      "   +--Site A\n"
+      "Where A = http://a.com/",
+      FrameTreeVisualizer().DepictFrameTree(root));
+  TestNavigationObserver observer(shell()->web_contents());
+  EXPECT_EQ(1u, root->child_count());
+  FrameTreeNode* child = root->child_at(0);
+
+  RenderWidgetHostViewAndroid* parent_view =
+      static_cast<RenderWidgetHostViewAndroid*>(
+          root->current_frame_host()->GetRenderWidgetHost()->GetView());
+  TouchSelectionControllerClientTestWrapper* selection_controller_client =
+      new TouchSelectionControllerClientTestWrapper(
+          parent_view->GetSelectionControllerClientManagerForTesting());
+  parent_view->SetSelectionControllerClientForTesting(
+      base::WrapUnique(selection_controller_client));
+
+  // We need to load the desired subframe and then wait until it's stable, i.e.
+  // generates no new compositor frames for some reasonable time period: a stray
+  // frame between touch selection's pre-handling of GestureLongPress and the
+  // expected frame containing the selected region can confuse the
+  // TouchSelectionController, causing it to fail to show selection handles.
+  // Note this is an issue with the TouchSelectionController in general, and
+  // not a property of this test.
+  GURL child_url(
+      embedded_test_server()->GetURL("b.com", "/touch_selection.html"));
+  NavigateFrameToURL(child, child_url);
+  EXPECT_EQ(
+      " Site A ------------ proxies for B\n"
+      "   +--Site B ------- proxies for A\n"
+      "Where A = http://a.com/\n"
+      "      B = http://b.com/",
+      FrameTreeVisualizer().DepictFrameTree(root));
+  // The child will change with the cross-site navigation. It shouldn't change
+  // after this.
+  child = root->child_at(0);
+  WaitForChildFrameSurfaceReady(child->current_frame_host());
+
+  RenderWidgetHostViewChildFrame* child_view =
+      static_cast<RenderWidgetHostViewChildFrame*>(
+          child->current_frame_host()->GetRenderWidgetHost()->GetView());
+
+  EXPECT_EQ(child_url, observer.last_navigation_url());
+  EXPECT_TRUE(observer.last_navigation_succeeded());
+  FrameStableObserver child_frame_stable_observer(child_view,
+                                                  TestTimeouts::tiny_timeout());
+  child_frame_stable_observer.WaitUntilStable();
+
+  EXPECT_EQ(ui::TouchSelectionController::INACTIVE,
+            parent_view->touch_selection_controller()->active_status());
+  // Find the location of some text to select.
+  auto* manager = static_cast<TouchSelectionControllerClientManagerAndroid*>(
+      parent_view->GetTouchSelectionControllerClientManager());
+  float page_scale_factor = manager->page_scale_factor();
+  gfx::PointF point_f;
+  std::string str;
+  EXPECT_TRUE(ExecuteScriptAndExtractString(child->current_frame_host(),
+                                            "get_point_inside_text()", &str));
+  ConvertJSONToPoint(str, &point_f);
+  gfx::Point origin = child_view->GetViewOriginInRoot();
+  gfx::Vector2dF origin_vec(origin.x(), origin.y());
+  point_f += origin_vec;
+  point_f.Scale(page_scale_factor);
+
+  // Initiate selection with a sequence of events that go through the targeting
+  // system.
+  selection_controller_client->InitWaitForSelectionEvent(
+      ui::SELECTION_HANDLES_SHOWN);
+
+  SelectWithLongPress(gfx::Point(point_f.x(), point_f.y()));
+
+  selection_controller_client->Wait();
+
+  // Check that selection is active and the quick menu is showing.
+  EXPECT_EQ(ui::TouchSelectionController::SELECTION_ACTIVE,
+            parent_view->touch_selection_controller()->active_status());
+
+  // Tap inside/outside the iframe and make sure the selection handles go away.
+  selection_controller_client->InitWaitForSelectionEvent(
+      ui::SELECTION_HANDLES_CLEARED);
+  // Since Android tests may run with page_scale_factor < 1, use an offset a
+  // bigger than +/-1 for doing the inside/outside taps to cancel the selection
+  // handles.
+  gfx::PointF point_inside_iframe = gfx::PointF(+5.f, +5.f) + origin_vec;
+  point_inside_iframe.Scale(page_scale_factor);
+  SimpleTap(gfx::Point(point_inside_iframe.x(), point_inside_iframe.y()));
+  selection_controller_client->Wait();
+
+  EXPECT_EQ(ui::TouchSelectionController::INACTIVE,
+            parent_view->touch_selection_controller()->active_status());
+
+  // Let's wait for the previous events to clear the round-trip to the renders
+  // and back.
+  DelayBy(base::TimeDelta::FromMilliseconds(2000));
+
+  // Initiate selection with a sequence of events that go through the targeting
+  // system. Repeat of above but this time we'l cancel the selection by
+  // tapping outside of the OOPIF.
+  selection_controller_client->InitWaitForSelectionEvent(
+      ui::SELECTION_HANDLES_SHOWN);
+
+  SelectWithLongPress(gfx::Point(point_f.x(), point_f.y()));
+
+  selection_controller_client->Wait();
+
+  // Check that selection is active and the quick menu is showing.
+  EXPECT_EQ(ui::TouchSelectionController::SELECTION_ACTIVE,
+            parent_view->touch_selection_controller()->active_status());
+
+  // Tap inside/outside the iframe and make sure the selection handles go away.
+  selection_controller_client->InitWaitForSelectionEvent(
+      ui::SELECTION_HANDLES_CLEARED);
+  // Since Android tests may run with page_scale_factor < 1, use an offset a
+  // bigger than +/-1 for doing the inside/outside taps to cancel the selection
+  // handles.
+  gfx::PointF point_outside_iframe = gfx::PointF(-5.f, -5.f) + origin_vec;
+  point_outside_iframe.Scale(page_scale_factor);
+  SimpleTap(gfx::Point(point_outside_iframe.x(), point_outside_iframe.y()));
+  selection_controller_client->Wait();
+
+  EXPECT_EQ(ui::TouchSelectionController::INACTIVE,
+            parent_view->touch_selection_controller()->active_status());
+}
+
+#endif  // defined(OS_ANDROID)
+
 }  // namespace content
diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc
index 4ff9f579..c50b6ef 100644
--- a/content/browser/storage_partition_impl.cc
+++ b/content/browser/storage_partition_impl.cc
@@ -5,6 +5,7 @@
 #include "content/browser/storage_partition_impl.h"
 
 #include <stddef.h>
+#include <stdint.h>
 
 #include <set>
 #include <vector>
@@ -64,7 +65,7 @@
   return cookie.IsHostCookie() && cookie.IsDomainMatch(host);
 }
 
-void OnClearedCookies(const base::Closure& callback, int num_deleted) {
+void OnClearedCookies(const base::Closure& callback, uint32_t num_deleted) {
   // The final callback needs to happen from UI thread.
   if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
     BrowserThread::PostTask(
diff --git a/content/browser/webrtc/webrtc_capture_from_element_browsertest.cc b/content/browser/webrtc/webrtc_capture_from_element_browsertest.cc
index f9da9d08..008ee47f 100644
--- a/content/browser/webrtc/webrtc_capture_from_element_browsertest.cc
+++ b/content/browser/webrtc/webrtc_capture_from_element_browsertest.cc
@@ -4,6 +4,7 @@
 
 #include "base/command_line.h"
 #include "base/strings/stringprintf.h"
+#include "build/build_config.h"
 #include "content/browser/webrtc/webrtc_content_browsertest_base.h"
 #include "content/public/common/content_switches.h"
 #include "media/base/media_switches.h"
@@ -101,8 +102,15 @@
   MakeTypicalCall("testCanvasCapture(drawWebGL);", kCanvasCaptureTestHtmlFile);
 }
 
+#if defined(OS_LINUX)
+#define MAYBE_VerifyCanvasCaptureOffscreenCanvasCommitFrames \
+  DISABLED_VerifyCanvasCaptureOffscreenCanvasCommitFrames
+#else
+#define MAYBE_VerifyCanvasCaptureOffscreenCanvasCommitFrames \
+  VerifyCanvasCaptureOffscreenCanvasCommitFrames
+#endif
 IN_PROC_BROWSER_TEST_F(WebRtcCaptureFromElementBrowserTest,
-                       VerifyCanvasCaptureOffscreenCanvasCommitFrames) {
+                       MAYBE_VerifyCanvasCaptureOffscreenCanvasCommitFrames) {
   MakeTypicalCall("testCanvasCapture(drawOffscreenCanvasCommit);",
                   kCanvasCaptureTestHtmlFile);
 }
diff --git a/content/browser/webrtc/webrtc_eventlog_host_unittest.cc b/content/browser/webrtc/webrtc_eventlog_host_unittest.cc
index a9659cb8..776c80d 100644
--- a/content/browser/webrtc/webrtc_eventlog_host_unittest.cc
+++ b/content/browser/webrtc/webrtc_eventlog_host_unittest.cc
@@ -189,7 +189,7 @@
 // maximum allowed number of IPC messages and log files will be opened, but we
 // expect the number of stop IPC messages to be equal to the actual number of
 // PeerConnections.
-TEST_F(WebRtcEventlogHostTest, ExceedMaxPeerConnectionsTest) {
+TEST_F(WebRtcEventlogHostTest, DISABLED_ExceedMaxPeerConnectionsTest) {
 #if defined(OS_ANDROID)
   const int kMaxNumberLogFiles = 3;
 #else
diff --git a/content/child/resource_dispatcher.cc b/content/child/resource_dispatcher.cc
index 4d724c1..a0b9c47 100644
--- a/content/child/resource_dispatcher.cc
+++ b/content/child/resource_dispatcher.cc
@@ -662,6 +662,30 @@
     return request_id;
   }
 
+  net::NetworkTrafficAnnotationTag traffic_annotation =
+      net::DefineNetworkTrafficAnnotation("blink_resource_loader", R"(
+      semantics {
+        sender: "Blink Resource Loader"
+        description:
+          "Blink initiated request, which includes all resources for "
+          "normal page loads, chrome URLs, resources for installed "
+          "extensions, as well as downloads."
+        trigger:
+          "Navigating to a URL or downloading a file. A webpage, "
+          "ServiceWorker, chrome:// page, or extension may also initiate "
+          "requests in the background."
+        data: "Anything the initiator wants to send."
+        destination: OTHER
+      }
+      policy {
+        cookies_allowed: true
+        cookies_store: "user"
+        setting: "These requests cannot be disabled in settings."
+        policy_exception_justification:
+          "Not implemented. Without these requests, Chrome will be unable "
+          "to load any webpage."
+      })");
+
   if (ipc_type == blink::WebURLRequest::LoadingIPCType::kMojo) {
     scoped_refptr<base::SingleThreadTaskRunner> task_runner =
         loading_task_runner ? loading_task_runner : thread_task_runner_;
@@ -671,12 +695,13 @@
         ThrottlingURLLoader::CreateLoaderAndStart(
             url_loader_factory, std::move(throttles), routing_id, request_id,
             mojom::kURLLoadOptionNone, *request, client.get(),
-            NO_TRAFFIC_ANNOTATION_YET, std::move(task_runner));
+            traffic_annotation, std::move(task_runner));
     pending_requests_[request_id]->url_loader = std::move(url_loader);
     pending_requests_[request_id]->url_loader_client = std::move(client);
   } else {
-    message_sender_->Send(
-        new ResourceHostMsg_RequestResource(routing_id, request_id, *request));
+    message_sender_->Send(new ResourceHostMsg_RequestResource(
+        routing_id, request_id, *request,
+        net::MutableNetworkTrafficAnnotationTag(traffic_annotation)));
   }
 
   return request_id;
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
index d80a199..8affb3fe 100644
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -9,6 +9,7 @@
 #include "base/command_line.h"
 #include "base/feature_list.h"
 #include "base/metrics/field_trial.h"
+#include "base/metrics/field_trial_params.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "build/build_config.h"
@@ -390,6 +391,10 @@
   WebRuntimeFeatures::EnableModuleScripts(
       base::FeatureList::IsEnabled(features::kModuleScripts));
 
+  WebRuntimeFeatures::EnableClientPlaceholdersForServerLoFi(
+      base::GetFieldTrialParamValue("PreviewsClientLoFi",
+                                    "replace_server_placeholders") == "true");
+
   // Enable explicitly enabled features, and then disable explicitly disabled
   // ones.
   if (command_line.HasSwitch(switches::kEnableBlinkFeatures)) {
diff --git a/content/common/resource_messages.h b/content/common/resource_messages.h
index 0fe7c8438..885adb0 100644
--- a/content/common/resource_messages.h
+++ b/content/common/resource_messages.h
@@ -27,6 +27,7 @@
 #include "net/cert/signed_certificate_timestamp_and_status.h"
 #include "net/http/http_response_info.h"
 #include "net/ssl/ssl_info.h"
+#include "net/traffic_annotation/network_traffic_annotation.h"
 #include "net/url_request/redirect_info.h"
 #include "third_party/WebKit/public/platform/WebMixedContentContextType.h"
 
@@ -236,6 +237,10 @@
   IPC_STRUCT_TRAITS_MEMBER(referred_token_binding_host)
 IPC_STRUCT_TRAITS_END()
 
+IPC_STRUCT_TRAITS_BEGIN(net::MutableNetworkTrafficAnnotationTag)
+  IPC_STRUCT_TRAITS_MEMBER(unique_id_hash_code)
+IPC_STRUCT_TRAITS_END()
+
 IPC_STRUCT_TRAITS_BEGIN(net::SignedCertificateTimestampAndStatus)
   IPC_STRUCT_TRAITS_MEMBER(sct)
   IPC_STRUCT_TRAITS_MEMBER(status)
@@ -369,10 +374,12 @@
 // Resource messages sent from the renderer to the browser.
 
 // Makes a resource request via the browser.
-IPC_MESSAGE_CONTROL3(ResourceHostMsg_RequestResource,
-                     int /* routing_id */,
-                     int /* request_id */,
-                     content::ResourceRequest)
+IPC_MESSAGE_CONTROL4(
+    ResourceHostMsg_RequestResource,
+    int /* routing_id */,
+    int /* request_id */,
+    content::ResourceRequest,
+    net::MutableNetworkTrafficAnnotationTag /* network_traffic_annotation */)
 
 // Cancels a resource request with the ID given as the parameter.
 IPC_MESSAGE_CONTROL1(ResourceHostMsg_CancelRequest,
diff --git a/content/common/sandbox_init_mac.cc b/content/common/sandbox_init_mac.cc
index f73e85db..314bfbb 100644
--- a/content/common/sandbox_init_mac.cc
+++ b/content/common/sandbox_init_mac.cc
@@ -4,6 +4,7 @@
 
 #include "content/common/sandbox_init_mac.h"
 
+#include "base/callback.h"
 #include "base/command_line.h"
 #include "base/files/file_path.h"
 #include "base/logging.h"
@@ -14,14 +15,28 @@
 
 namespace content {
 
-bool InitializeSandbox(int sandbox_type, const base::FilePath& allowed_dir) {
+namespace {
+
+bool InitializeSandbox(int sandbox_type,
+                       const base::FilePath& allowed_dir,
+                       base::OnceClosure hook) {
   // Warm up APIs before turning on the sandbox.
   Sandbox::SandboxWarmup(sandbox_type);
 
+  // Execute the post warmup callback.
+  if (!hook.is_null())
+    std::move(hook).Run();
+
   // Actually sandbox the process.
   return Sandbox::EnableSandbox(sandbox_type, allowed_dir);
 }
 
+}  // namespace
+
+bool InitializeSandbox(int sandbox_type, const base::FilePath& allowed_dir) {
+  return InitializeSandbox(sandbox_type, allowed_dir, base::OnceClosure());
+}
+
 // Fill in |sandbox_type| and |allowed_dir| based on the command line,  returns
 // false if the current process type doesn't need to be sandboxed or if the
 // sandbox was disabled from the command line.
@@ -72,12 +87,16 @@
   return true;
 }
 
-bool InitializeSandbox() {
+bool InitializeSandboxWithPostWarmupHook(base::OnceClosure hook) {
   int sandbox_type = 0;
   base::FilePath allowed_dir;
   if (!GetSandboxTypeFromCommandLine(&sandbox_type, &allowed_dir))
     return true;
-  return InitializeSandbox(sandbox_type, allowed_dir);
+  return InitializeSandbox(sandbox_type, allowed_dir, std::move(hook));
+}
+
+bool InitializeSandbox() {
+  return InitializeSandboxWithPostWarmupHook(base::OnceClosure());
 }
 
 }  // namespace content
diff --git a/content/common/sandbox_init_mac.h b/content/common/sandbox_init_mac.h
index 8f860efd..375b3d99 100644
--- a/content/common/sandbox_init_mac.h
+++ b/content/common/sandbox_init_mac.h
@@ -5,6 +5,8 @@
 #ifndef CONTENT_COMMON_SANDBOX_INIT_MAC_H_
 #define CONTENT_COMMON_SANDBOX_INIT_MAC_H_
 
+#include "base/callback_forward.h"
+
 namespace content {
 
 // Initialize the sandbox for renderer, gpu, utility, worker, and plugin
@@ -15,6 +17,10 @@
 // returned.
 bool InitializeSandbox();
 
+// Initializes the sandbox, as described above, but executes the callback after
+// warmup and before initialization.
+bool InitializeSandboxWithPostWarmupHook(base::OnceClosure hook);
+
 }  // namespace content
 
 #endif  // CONTENT_COMMON_SANDBOX_INIT_MAC_H_
diff --git a/content/common/sandbox_mac.mm b/content/common/sandbox_mac.mm
index 49886fde..cfe004f 100644
--- a/content/common/sandbox_mac.mm
+++ b/content/common/sandbox_mac.mm
@@ -41,12 +41,6 @@
 #include "ui/base/layout.h"
 #include "ui/gl/init/gl_factory.h"
 
-extern "C" {
-void CGSSetDenyWindowServerConnections(bool);
-void CGSShutdownServerConnections();
-OSStatus SetApplicationIsDaemon(Boolean isDaemon);
-};
-
 namespace content {
 namespace {
 
@@ -175,21 +169,6 @@
     NSColor* color = [NSColor controlTextColor];
     [color colorUsingColorSpaceName:NSCalibratedRGBColorSpace];
   }
-
-  if (sandbox_type == SANDBOX_TYPE_RENDERER) {
-    // Now disconnect from WindowServer, after all objects have been warmed up.
-    // Shutting down the connection requires connecting to WindowServer,
-    // so do this before actually engaging the sandbox. This may cause two log
-    // messages to be printed to the system logger on certain OS versions.
-    CGSSetDenyWindowServerConnections(true);
-    CGSShutdownServerConnections();
-
-    // Allow the process to continue without a LaunchServices ASN. The
-    // INIT_Process function in HIServices will abort if it cannot connect to
-    // launchservicesd to get an ASN. By setting this flag, HIServices skips
-    // that.
-    SetApplicationIsDaemon(true);
-  }
 }
 
 // Load the appropriate template for the given sandbox type.
diff --git a/content/common/view_messages.h b/content/common/view_messages.h
index d52258a..8ca428f 100644
--- a/content/common/view_messages.h
+++ b/content/common/view_messages.h
@@ -38,7 +38,6 @@
 #include "media/base/audio_parameters.h"
 #include "media/base/channel_layout.h"
 #include "media/base/ipc/media_param_traits.h"
-#include "media/base/media_log_event.h"
 #include "media/capture/ipc/capture_param_traits.h"
 #include "net/base/network_change_notifier.h"
 #include "ppapi/features/features.h"
@@ -109,8 +108,6 @@
                           content::TAP_MULTIPLE_TARGETS_STRATEGY_MAX)
 IPC_ENUM_TRAITS_MAX_VALUE(content::ThreeDAPIType,
                           content::THREE_D_API_TYPE_LAST)
-IPC_ENUM_TRAITS_MAX_VALUE(media::MediaLogEvent::Type,
-                          media::MediaLogEvent::TYPE_LAST)
 IPC_ENUM_TRAITS_MAX_VALUE(ui::TextInputMode, ui::TEXT_INPUT_MODE_MAX)
 IPC_ENUM_TRAITS_MAX_VALUE(ui::TextInputType, ui::TEXT_INPUT_TYPE_MAX)
 
@@ -258,13 +255,6 @@
   IPC_STRUCT_TRAITS_MEMBER(default_font_size)
 IPC_STRUCT_TRAITS_END()
 
-IPC_STRUCT_TRAITS_BEGIN(media::MediaLogEvent)
-  IPC_STRUCT_TRAITS_MEMBER(id)
-  IPC_STRUCT_TRAITS_MEMBER(type)
-  IPC_STRUCT_TRAITS_MEMBER(params)
-  IPC_STRUCT_TRAITS_MEMBER(time)
-IPC_STRUCT_TRAITS_END()
-
 IPC_STRUCT_TRAITS_BEGIN(content::TextInputState)
   IPC_STRUCT_TRAITS_MEMBER(type)
   IPC_STRUCT_TRAITS_MEMBER(mode)
diff --git a/content/public/android/BUILD.gn b/content/public/android/BUILD.gn
index e9a3dfe..53ceaab2 100644
--- a/content/public/android/BUILD.gn
+++ b/content/public/android/BUILD.gn
@@ -114,6 +114,7 @@
     "java/src/org/chromium/content/browser/BrowserStartupController.java",
     "java/src/org/chromium/content/browser/ChildConnectionAllocator.java",
     "java/src/org/chromium/content/browser/ChildProcessConnection.java",
+    "java/src/org/chromium/content/browser/ChildProcessLauncher.java",
     "java/src/org/chromium/content/browser/ChildProcessLauncherHelper.java",
     "java/src/org/chromium/content/browser/ContentChildProcessConstants.java",
     "java/src/org/chromium/content/browser/ContentClassFactory.java",
@@ -373,6 +374,9 @@
 
 android_library("content_javatests") {
   testonly = true
+
+  srcjar_deps = [ "//content/shell/android:content_javatests_aidl" ]
+
   deps = [
     ":content_java",
     "//base:base_java",
@@ -396,6 +400,7 @@
     "//net/android:net_java_test_support",
     "//third_party/android_support_test_runner:rules_java",
     "//third_party/android_support_test_runner:runner_java",
+    "//third_party/jsr-305:jsr_305_javalib",
     "//third_party/junit",
     "//ui/android:ui_java",
     "//ui/gfx/geometry/mojo:mojo_java",
@@ -405,6 +410,7 @@
     "javatests/src/org/chromium/content/browser/BrowserStartupControllerTest.java",
     "javatests/src/org/chromium/content/browser/ChildProcessLauncherIntegrationTest.java",
     "javatests/src/org/chromium/content/browser/ChildProcessLauncherTest.java",
+    "javatests/src/org/chromium/content/browser/ChildProcessLauncherHelperTest.java",
     "javatests/src/org/chromium/content/browser/ClipboardTest.java",
     "javatests/src/org/chromium/content/browser/ContentCommandLineTest.java",
     "javatests/src/org/chromium/content/browser/ContentViewCoreSelectionTest.java",
diff --git a/content/public/android/java/src/org/chromium/content/browser/ChildConnectionAllocator.java b/content/public/android/java/src/org/chromium/content/browser/ChildConnectionAllocator.java
index 8d1e260..c1972fc 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ChildConnectionAllocator.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ChildConnectionAllocator.java
@@ -27,14 +27,14 @@
     private static final String TAG = "ChildConnAllocator";
 
     /** Listener that clients can use to get notified when connections get allocated/freed. */
-    public interface Listener {
+    public abstract static class Listener {
         /** Called when a connection has been allocated, before it gets bound. */
-        void onConnectionAllocated(
-                ChildConnectionAllocator allocator, ChildProcessConnection connection);
+        public void onConnectionAllocated(
+                ChildConnectionAllocator allocator, ChildProcessConnection connection) {}
 
         /** Called when a connection has been freed. */
-        void onConnectionFreed(
-                ChildConnectionAllocator allocator, ChildProcessConnection connection);
+        public void onConnectionFreed(
+                ChildConnectionAllocator allocator, ChildProcessConnection connection) {}
     }
 
     /** Factory interface. Used by tests to specialize created connections. */
@@ -103,8 +103,7 @@
 
         // Check that the service exists.
         try {
-            // PackageManager#getServiceInfo() throws an exception if the service does not
-            // exist.
+            // PackageManager#getServiceInfo() throws an exception if the service does not exist.
             packageManager.getServiceInfo(
                     new ComponentName(packageName, serviceClassName + "0"), 0);
         } catch (PackageManager.NameNotFoundException e) {
diff --git a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java
new file mode 100644
index 0000000..4fc7085
--- /dev/null
+++ b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java
@@ -0,0 +1,298 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.content.browser;
+
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+
+import org.chromium.base.ContextUtils;
+import org.chromium.base.Log;
+import org.chromium.base.TraceEvent;
+import org.chromium.base.annotations.SuppressFBWarnings;
+import org.chromium.base.process_launcher.ChildProcessConstants;
+import org.chromium.base.process_launcher.FileDescriptorInfo;
+
+import java.io.IOException;
+
+/**
+ * This class is used to start a child process by connecting to a ChildProcessService.
+ */
+public class ChildProcessLauncher {
+    private static final String TAG = "ChildProcLauncher";
+
+    /** Delegate that client should use to customize the process launching. */
+    public interface Delegate {
+        /**
+         * Called before a connection is allocated.
+         * Note that this is only called if the ChildProcessLauncher is created with
+         * {@link #createWithConnectionAllocator}.
+         * @param serviceBundle the bundle passed in the service intent. Clients can add their own
+         * extras to the bundle.
+         */
+        void onBeforeConnectionAllocated(Bundle serviceBundle);
+
+        /**
+         * Called before setup is called on the connection.
+         * @param connectionBundle the bundle passed to the {@link ChildProcessService} in the
+         * setup call. Clients can add their own extras to the bundle.
+         */
+        void onBeforeConnectionSetup(Bundle connectionBundle);
+
+        /**
+         * Called when the connection was successfully established, meaning the setup call on the
+         * service was successful.
+         * @param connection the connection over which the setup call was made.
+         */
+        void onConnectionEstablished(ChildProcessConnection connection);
+
+        /**
+         * Called when a connection has been disconnected. Only invoked if onConnectionEstablished
+         * was called, meaning the connection was already established.
+         * @param connection the connection that got disconnected.
+         */
+        void onConnectionLost(ChildProcessConnection connection);
+    }
+
+    /**
+     * Interface used by clients that already have a bound connection ready when instanciating the
+     * ChildProcessLauncher.
+     */
+    public interface BoundConnectionProvider {
+        ChildProcessConnection getConnection(
+                ChildProcessConnection.ServiceCallback serviceCallback);
+    }
+
+    // Represents an invalid process handle; same as base/process/process.h kNullProcessHandle.
+    private static final int NULL_PROCESS_HANDLE = 0;
+
+    // The handle for the thread we were created on and on which all methods should be called.
+    private final Handler mLauncherHandler = new Handler();
+
+    private final Delegate mDelegate;
+
+    private final String[] mCommandLine;
+    private final FileDescriptorInfo[] mFilesToBeMapped;
+
+    // The allocator used to create the connection.
+    private final BoundConnectionProvider mConnectionProvider;
+
+    // The allocator used to create the connection.
+    private final ChildConnectionAllocator mConnectionAllocator;
+
+    // The IBinder provided to the created service.
+    private final IBinder mIBinderCallback;
+
+    // The actual service connection. Set once we have connected to the service.
+    private ChildProcessConnection mConnection;
+
+    /**
+     * Creates a ChildProcessLauncher using the already bound connection provided.
+     * Note that onBeforeConnectionAllocated and onConnectionBound will not be invoked on the
+     * delegate since the connection is already available.
+     */
+    public static ChildProcessLauncher createWithBoundConnectionProvider(Delegate delegate,
+            String[] commandLine, FileDescriptorInfo[] filesToBeMapped,
+            BoundConnectionProvider connectionProvider, IBinder binderCallback) {
+        return new ChildProcessLauncher(delegate, commandLine, filesToBeMapped, connectionProvider,
+                null /* connectionAllocator */, binderCallback);
+    }
+
+    /**
+     * Creates a ChildProcessLauncher that will create a connection using the specified
+     * ChildConnectionAllocator.
+     */
+    public static ChildProcessLauncher createWithConnectionAllocator(Delegate delegate,
+            String[] commandLine, FileDescriptorInfo[] filesToBeMapped,
+            ChildConnectionAllocator connectionAllocator, IBinder binderCallback) {
+        return new ChildProcessLauncher(delegate, commandLine, filesToBeMapped,
+                null /* connection */, connectionAllocator, binderCallback);
+    }
+
+    @SuppressFBWarnings("EI_EXPOSE_REP2")
+    private ChildProcessLauncher(Delegate delegate, String[] commandLine,
+            FileDescriptorInfo[] filesToBeMapped, BoundConnectionProvider connectionProvider,
+            ChildConnectionAllocator connectionAllocator, IBinder binderCallback) {
+        // Either a bound connection provider or a connection allocator should be provided.
+        assert (connectionProvider == null) != (connectionAllocator == null);
+        mCommandLine = commandLine;
+        mConnectionProvider = connectionProvider;
+        mConnectionAllocator = connectionAllocator;
+        mDelegate = delegate;
+        mFilesToBeMapped = filesToBeMapped;
+        mIBinderCallback = binderCallback;
+    }
+
+    /**
+     * Starts the child process and calls setup on it if {@param setupConnection} is true.
+     * @param setupConnection whether the setup should be performed on the connection once
+     * established
+     * @param queueIfNoFreeConnection whether to queue that request if no service connection is
+     * available. If the launcher was created with a connection provider, this parameter has no
+     * effect.
+     * @return true if the connection was started or was queued.
+     */
+    public boolean start(final boolean setupConnection, final boolean queueIfNoFreeConnection) {
+        assert isRunningOnLauncherThread();
+        try {
+            TraceEvent.begin("ChildProcessLauncher.start");
+            ChildProcessConnection.ServiceCallback serviceCallback =
+                    new ChildProcessConnection.ServiceCallback() {
+                        @Override
+                        public void onChildStarted() {}
+
+                        @Override
+                        public void onChildStartFailed() {
+                            assert isRunningOnLauncherThread();
+                            Log.e(TAG, "ChildProcessConnection.start failed, trying again");
+                            mLauncherHandler.post(new Runnable() {
+                                @Override
+                                public void run() {
+                                    // The child process may already be bound to another client
+                                    // (this can happen if multi-process WebView is used in more
+                                    // than one process), so try starting the process again.
+                                    // This connection that failed to start has not been freed,
+                                    // so a new bound connection will be allocated.
+                                    mConnection = null;
+                                    start(setupConnection, queueIfNoFreeConnection);
+                                }
+                            });
+                        }
+
+                        @Override
+                        public void onChildProcessDied(ChildProcessConnection connection) {
+                            assert LauncherThread.runningOnLauncherThread();
+                            assert mConnection == connection;
+                            ChildProcessLauncher.this.onChildProcessDied();
+                        }
+                    };
+            if (mConnectionProvider != null) {
+                mConnection = mConnectionProvider.getConnection(serviceCallback);
+                assert mConnection != null;
+                setupConnection();
+            } else {
+                assert mConnectionAllocator != null;
+                if (!allocateAndSetupConnection(
+                            serviceCallback, setupConnection, queueIfNoFreeConnection)
+                        && !queueIfNoFreeConnection) {
+                    return false;
+                }
+            }
+            return true;
+        } finally {
+            TraceEvent.end("ChildProcessLauncher.start");
+        }
+    }
+
+    public ChildProcessConnection getConnection() {
+        return mConnection;
+    }
+
+    public ChildConnectionAllocator getConnectionAllocator() {
+        return mConnectionAllocator;
+    }
+
+    private boolean allocateAndSetupConnection(
+            final ChildProcessConnection.ServiceCallback serviceCallback,
+            final boolean setupConnection, final boolean queueIfNoFreeConnection) {
+        assert mConnection == null;
+        Bundle serviceBundle = new Bundle();
+        mDelegate.onBeforeConnectionAllocated(serviceBundle);
+
+        mConnection = mConnectionAllocator.allocate(
+                ContextUtils.getApplicationContext(), serviceBundle, serviceCallback);
+        if (mConnection == null) {
+            if (!queueIfNoFreeConnection) {
+                Log.d(TAG, "Failed to allocate a child connection (no queuing).");
+                return false;
+            }
+            // No connection is available at this time. Add a listener so when one becomes
+            // available we can create the service.
+            mConnectionAllocator.addListener(new ChildConnectionAllocator.Listener() {
+                @Override
+                public void onConnectionFreed(
+                        ChildConnectionAllocator allocator, ChildProcessConnection connection) {
+                    assert allocator == mConnectionAllocator;
+                    if (!allocator.isFreeConnectionAvailable()) return;
+                    allocator.removeListener(this);
+                    allocateAndSetupConnection(
+                            serviceCallback, setupConnection, queueIfNoFreeConnection);
+                }
+            });
+            return false;
+        }
+        assert mConnection != null;
+
+        if (setupConnection) {
+            setupConnection();
+        }
+        return true;
+    }
+
+    private void setupConnection() {
+        ChildProcessConnection.ConnectionCallback connectionCallback =
+                new ChildProcessConnection.ConnectionCallback() {
+                    @Override
+                    public void onConnected(ChildProcessConnection connection) {
+                        assert mConnection == connection;
+                        onServiceConnected();
+                    }
+                };
+        Bundle connectionBundle = createConnectionBundle();
+        mDelegate.onBeforeConnectionSetup(connectionBundle);
+        mConnection.setupConnection(connectionBundle, getIBinderCallback(), connectionCallback);
+    }
+
+    private void onServiceConnected() {
+        assert isRunningOnLauncherThread();
+
+        Log.d(TAG, "on connect callback, pid=%d", mConnection.getPid());
+
+        mDelegate.onConnectionEstablished(mConnection);
+
+        // Proactively close the FDs rather than waiting for the GC to do it.
+        try {
+            for (FileDescriptorInfo fileInfo : mFilesToBeMapped) {
+                fileInfo.fd.close();
+            }
+        } catch (IOException ioe) {
+            Log.w(TAG, "Failed to close FD.", ioe);
+        }
+    }
+
+    public int getPid() {
+        assert isRunningOnLauncherThread();
+        return mConnection == null ? NULL_PROCESS_HANDLE : mConnection.getPid();
+    }
+
+    public IBinder getIBinderCallback() {
+        return mIBinderCallback;
+    }
+
+    private boolean isRunningOnLauncherThread() {
+        return mLauncherHandler.getLooper() == Looper.myLooper();
+    }
+
+    private Bundle createConnectionBundle() {
+        Bundle bundle = new Bundle();
+        bundle.putStringArray(ChildProcessConstants.EXTRA_COMMAND_LINE, mCommandLine);
+        bundle.putParcelableArray(ChildProcessConstants.EXTRA_FILES, mFilesToBeMapped);
+        return bundle;
+    }
+
+    private void onChildProcessDied() {
+        assert LauncherThread.runningOnLauncherThread();
+        if (getPid() != 0) {
+            mDelegate.onConnectionLost(mConnection);
+        }
+    }
+
+    public void stop() {
+        assert isRunningOnLauncherThread();
+        Log.d(TAG, "stopping child connection: pid=%d", mConnection.getPid());
+        mConnection.stop();
+    }
+}
diff --git a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelper.java b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelper.java
index ce2e033..9e4204a 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelper.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelper.java
@@ -15,7 +15,6 @@
 import org.chromium.base.CpuFeatures;
 import org.chromium.base.Log;
 import org.chromium.base.ThreadUtils;
-import org.chromium.base.TraceEvent;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
@@ -51,12 +50,6 @@
     private static final String PRIVILEGED_SERVICES_NAME_KEY =
             "org.chromium.content.browser.PRIVILEGED_SERVICES_NAME";
 
-    // Represents an invalid process handle; same as base/process/process.h kNullProcessHandle.
-    private static final int NULL_PROCESS_HANDLE = 0;
-
-    // Delay between the call to freeConnection and the connection actually beeing freed.
-    private static final long FREE_CONNECTION_DELAY_MILLIS = 1;
-
     // A warmed-up connection to a sandboxed service.
     private static SpareChildConnection sSpareSandboxedConnection;
 
@@ -64,6 +57,9 @@
     private static final Map<String, ChildConnectionAllocator>
             sSandboxedChildConnectionAllocatorMap = new HashMap<>();
 
+    // Map from PID to ChildProcessLauncherHelper.
+    private static final Map<Integer, ChildProcessLauncherHelper> sLauncherByPid = new HashMap<>();
+
     // Allocator used for non-sandboxed services.
     private static ChildConnectionAllocator sPrivilegedChildConnectionAllocator;
 
@@ -72,40 +68,75 @@
     private static int sSandboxedServicesCountForTesting = -1;
     private static String sSandboxedServicesNameForTesting;
 
-    // Map from PID to ChildService connection.
-    private static Map<Integer, ChildProcessLauncherHelper> sLauncherByPid = new HashMap<>();
-
     // Manages OOM bindings used to bind chind services. Lazily initialized by getBindingManager().
     private static BindingManager sBindingManager;
 
     // Whether the main application is currently brought to the foreground.
     private static boolean sApplicationInForeground = true;
 
-    // The IBinder provided to the created service.
-    private final IBinder mIBinderCallback;
-
-    // Whether the connection should be setup once connected. Tests can set this to false to
-    // simulate a connected but not yet setup connection.
-    private final boolean mDoSetupConnection;
+    // Whether the connection is managed by the BindingManager.
+    private final boolean mUseBindingManager;
 
     private final ChildProcessCreationParams mCreationParams;
 
-    private final String[] mCommandLine;
-
-    private final FileDescriptorInfo[] mFilesToBeMapped;
-
-    // The allocator used to create the connection.
-    private final ChildConnectionAllocator mConnectionAllocator;
-
     // Whether the created process should be sandboxed.
     private final boolean mSandboxed;
 
+    private final ChildProcessLauncher.Delegate mLauncherDelegate =
+            new ChildProcessLauncher.Delegate() {
+                @Override
+                public void onBeforeConnectionAllocated(Bundle bundle) {
+                    populateServiceBundle(bundle, mCreationParams);
+                }
+
+                @Override
+                public void onBeforeConnectionSetup(Bundle connectionBundle) {
+                    // Populate the bundle passed to the service setup call with content specific
+                    // parameters.
+                    connectionBundle.putInt(
+                            ContentChildProcessConstants.EXTRA_CPU_COUNT, CpuFeatures.getCount());
+                    connectionBundle.putLong(
+                            ContentChildProcessConstants.EXTRA_CPU_FEATURES, CpuFeatures.getMask());
+                    connectionBundle.putBundle(Linker.EXTRA_LINKER_SHARED_RELROS,
+                            Linker.getInstance().getSharedRelros());
+                }
+
+                @Override
+                public void onConnectionEstablished(ChildProcessConnection connection) {
+                    int pid = connection.getPid();
+                    assert pid > 0;
+
+                    sLauncherByPid.put(pid, ChildProcessLauncherHelper.this);
+
+                    if (mUseBindingManager) {
+                        getBindingManager().addNewConnection(pid, connection);
+                    }
+
+                    // If the connection fails and pid == 0, the Java-side cleanup was already
+                    // handled by DeathCallback. We still have to call back to native for cleanup
+                    // there.
+                    if (mNativeChildProcessLauncherHelper != 0) {
+                        nativeOnChildProcessStarted(
+                                mNativeChildProcessLauncherHelper, connection.getPid());
+                    }
+                    mNativeChildProcessLauncherHelper = 0;
+                }
+
+                @Override
+                public void onConnectionLost(ChildProcessConnection connection) {
+                    assert connection.getPid() > 0;
+                    sLauncherByPid.remove(connection.getPid());
+                    if (mUseBindingManager) {
+                        getBindingManager().removeConnection(connection.getPid());
+                    }
+                }
+            };
+
+    private final ChildProcessLauncher mLauncher;
+
     // Note native pointer is only guaranteed live until nativeOnChildProcessStarted.
     private long mNativeChildProcessLauncherHelper;
 
-    // The actual service connection. Set once we have connected to the service.
-    private ChildProcessConnection mConnection;
-
     @CalledByNative
     private static FileDescriptorInfo makeFdInfo(
             int id, int fd, boolean autoClose, long offset, long size) {
@@ -152,11 +183,11 @@
                 ? new GpuProcessCallback()
                 : null;
 
-        ChildProcessLauncherHelper process_launcher =
-                new ChildProcessLauncherHelper(nativePointer, creationParams, commandLine,
-                        filesToBeMapped, sandboxed, binderCallback, true /* doSetupConnection */);
-        process_launcher.start();
-        return process_launcher;
+        ChildProcessLauncherHelper processLauncher = new ChildProcessLauncherHelper(nativePointer,
+                creationParams, commandLine, filesToBeMapped, sandboxed, binderCallback);
+        processLauncher.mLauncher.start(
+                true /* doSetupConnection */, true /* queueIfNoFreeConnection */);
+        return processLauncher;
     }
 
     /**
@@ -169,23 +200,23 @@
         LauncherThread.post(new Runnable() {
             @Override
             public void run() {
-                if (sSpareSandboxedConnection != null && !sSpareSandboxedConnection.isEmpty()) {
-                    return;
-                }
-
-                ChildProcessCreationParams creationParams = ChildProcessCreationParams.getDefault();
-                boolean bindToCallerCheck =
-                        creationParams == null ? false : creationParams.getBindToCallerCheck();
-                Bundle serviceBundle =
-                        ChildProcessLauncherHelper.createServiceBundle(bindToCallerCheck);
-                ChildConnectionAllocator allocator =
-                        getConnectionAllocator(context, creationParams, true /* sandboxed */);
-                sSpareSandboxedConnection =
-                        new SpareChildConnection(context, allocator, serviceBundle);
+                warmUpOnLauncherThread(context);
             }
         });
     }
 
+    private static void warmUpOnLauncherThread(Context context) {
+        if (sSpareSandboxedConnection != null && !sSpareSandboxedConnection.isEmpty()) {
+            return;
+        }
+
+        ChildProcessCreationParams creationParams = ChildProcessCreationParams.getDefault();
+        Bundle serviceBundle = populateServiceBundle(new Bundle(), creationParams);
+        ChildConnectionAllocator allocator =
+                getConnectionAllocator(context, creationParams, true /* sandboxed */);
+        sSpareSandboxedConnection = new SpareChildConnection(context, allocator, serviceBundle);
+    }
+
     public static String getPackageNameFromCreationParams(
             Context context, ChildProcessCreationParams params, boolean sandboxed) {
         return (sandboxed && params != null) ? params.getPackageNameForSandboxedService()
@@ -314,6 +345,7 @@
                         sSandboxedServiceFactoryForTesting);
             }
             sSandboxedChildConnectionAllocatorMap.put(packageName, connectionAllocator);
+
             final ChildConnectionAllocator finalConnectionAllocator = connectionAllocator;
             // Tracks connections removal so the allocator can be freed when no longer used.
             connectionAllocator.addListener(new ChildConnectionAllocator.Listener() {
@@ -321,6 +353,7 @@
                 public void onConnectionAllocated(
                         ChildConnectionAllocator allocator, ChildProcessConnection connection) {
                     assert connection != null;
+                    assert allocator == finalConnectionAllocator;
                     if (!allocator.isFreeConnectionAvailable()) {
                         // Proactively releases all the moderate bindings once all the sandboxed
                         // services are allocated, which will be very likely to have some of them
@@ -349,195 +382,61 @@
 
     private ChildProcessLauncherHelper(long nativePointer,
             ChildProcessCreationParams creationParams, String[] commandLine,
-            FileDescriptorInfo[] filesToBeMapped, boolean sandboxed, IBinder binderCallback,
-            boolean doSetupConnection) {
+            FileDescriptorInfo[] filesToBeMapped, boolean sandboxed, IBinder binderCallback) {
         assert LauncherThread.runningOnLauncherThread();
 
-        mCreationParams = creationParams;
-        mCommandLine = commandLine;
-        mFilesToBeMapped = filesToBeMapped;
         mNativeChildProcessLauncherHelper = nativePointer;
-        mIBinderCallback = binderCallback;
-        mDoSetupConnection = doSetupConnection;
+        mCreationParams = creationParams;
+        mUseBindingManager = sandboxed;
         mSandboxed = sandboxed;
 
-        mConnectionAllocator = getConnectionAllocator(
+        final ChildConnectionAllocator connectionAllocator = getConnectionAllocator(
                 ContextUtils.getApplicationContext(), mCreationParams, sandboxed);
-
-        initLinker();
-    }
-
-    private void start() {
-        assert LauncherThread.runningOnLauncherThread();
-        assert mConnection == null;
-        try {
-            TraceEvent.begin("ChildProcessLauncher.start");
-
-            ChildProcessConnection.ServiceCallback serviceCallback =
-                    new ChildProcessConnection.ServiceCallback() {
+        if (sSpareSandboxedConnection != null && !sSpareSandboxedConnection.isEmpty()
+                && sSpareSandboxedConnection.isForAllocator(connectionAllocator)) {
+            // Use the warmed-up connection.
+            ChildProcessLauncher.BoundConnectionProvider connectionProvider =
+                    new ChildProcessLauncher.BoundConnectionProvider() {
                         @Override
-                        public void onChildStarted() {}
-
-                        @Override
-                        public void onChildStartFailed() {
-                            assert LauncherThread.runningOnLauncherThread();
-                            Log.e(TAG, "ChildProcessConnection.start failed, trying again");
-                            LauncherThread.post(new Runnable() {
-                                @Override
-                                public void run() {
-                                    // The child process may already be bound to another client
-                                    // (this can happen if multi-process WebView is used in more
-                                    // than one process), so try starting the process again.
-                                    // This connection that failed to start has not been freed,
-                                    // so a new bound connection will be allocated.
-                                    mConnection = null;
-                                    start();
-                                }
-                            });
-                        }
-
-                        @Override
-                        public void onChildProcessDied(ChildProcessConnection connection) {
-                            assert LauncherThread.runningOnLauncherThread();
-                            assert mConnection == connection;
-                            ChildProcessLauncherHelper.this.onChildProcessDied();
+                        public ChildProcessConnection getConnection(
+                                ChildProcessConnection.ServiceCallback serviceCallback) {
+                            return sSpareSandboxedConnection.getConnection(
+                                    connectionAllocator, serviceCallback);
                         }
                     };
-
-            // Try to use the spare connection if there's one.
-            if (sSpareSandboxedConnection != null) {
-                mConnection = sSpareSandboxedConnection.getConnection(
-                        mConnectionAllocator, serviceCallback);
-                if (mConnection != null) {
-                    Log.d(TAG, "Using warmed-up connection for service %s.",
-                            mConnection.getServiceName());
-                    // Clear the spare connection now that it's been used.
-                    sSpareSandboxedConnection = null;
-                }
-            }
-
-            allocateAndSetupConnection(serviceCallback);
-        } finally {
-            TraceEvent.end("ChildProcessLauncher.start");
-        }
-    }
-
-    // Allocates a new connection and calls setUp on it.
-    // If there are no available connections, it will retry when one becomes available.
-    private boolean allocateAndSetupConnection(
-            final ChildProcessConnection.ServiceCallback serviceCallback) {
-        if (mConnection == null) {
-            final Context context = ContextUtils.getApplicationContext();
-            boolean bindToCallerCheck =
-                    mCreationParams == null ? false : mCreationParams.getBindToCallerCheck();
-            Bundle serviceBundle = createServiceBundle(bindToCallerCheck);
-            onBeforeConnectionAllocated(serviceBundle);
-
-            boolean useBindingManager = mSandboxed;
-            mConnection = mConnectionAllocator.allocate(context, serviceBundle, serviceCallback);
-            if (mConnection == null) {
-                // No connection is available at this time. Add a listener so when one becomes
-                // available we can create the service.
-                mConnectionAllocator.addListener(new ChildConnectionAllocator.Listener() {
-                    @Override
-                    public void onConnectionAllocated(ChildConnectionAllocator allocator,
-                            ChildProcessConnection connection) {}
-
-                    @Override
-                    public void onConnectionFreed(
-                            ChildConnectionAllocator allocator, ChildProcessConnection connection) {
-                        assert allocator == mConnectionAllocator;
-                        if (!allocator.isFreeConnectionAvailable()) return;
-                        allocator.removeListener(this);
-                        boolean success = allocateAndSetupConnection(serviceCallback);
-                        assert success;
-                    }
-                });
-                return false;
-            }
-        }
-
-        assert mConnection != null;
-        Bundle connectionBundle = createConnectionBundle();
-        onConnectionBound(mConnection, mConnectionAllocator, connectionBundle);
-
-        if (mDoSetupConnection) {
-            setupConnection(connectionBundle);
-        }
-        return true;
-    }
-
-    private void setupConnection(Bundle connectionBundle) {
-        ChildProcessConnection.ConnectionCallback connectionCallback =
-                new ChildProcessConnection.ConnectionCallback() {
-                    @Override
-                    public void onConnected(ChildProcessConnection connection) {
-                        assert mConnection == connection;
-                        onChildProcessStarted();
-                    }
-                };
-        mConnection.setupConnection(connectionBundle, getIBinderCallback(), connectionCallback);
-    }
-
-    private void onChildProcessStarted() {
-        assert LauncherThread.runningOnLauncherThread();
-
-        int pid = mConnection.getPid();
-        Log.d(TAG, "on connect callback, pid=%d", pid);
-
-        onConnectionEstablished(mConnection);
-
-        sLauncherByPid.put(pid, this);
-
-        // Proactively close the FDs rather than waiting for the GC to do it.
-        try {
-            for (FileDescriptorInfo fileInfo : mFilesToBeMapped) {
-                fileInfo.fd.close();
-            }
-        } catch (IOException ioe) {
-            Log.w(TAG, "Failed to close FD.", ioe);
-        }
-
-        // If the connection fails and pid == 0, the Java-side cleanup was already handled by
-        // ServiceCallback.onChildStopped. We still have to call back to native for cleanup there.
-        if (mNativeChildProcessLauncherHelper != 0) {
-            nativeOnChildProcessStarted(mNativeChildProcessLauncherHelper, getPid());
-        }
-        mNativeChildProcessLauncherHelper = 0;
-    }
-
-    private void onChildProcessDied() {
-        assert LauncherThread.runningOnLauncherThread();
-        if (getPid() != 0) {
-            onConnectionLost(mConnection, getPid());
-            sLauncherByPid.remove(getPid());
+            mLauncher = ChildProcessLauncher.createWithBoundConnectionProvider(mLauncherDelegate,
+                    commandLine, filesToBeMapped, connectionProvider, binderCallback);
+        } else {
+            mLauncher = ChildProcessLauncher.createWithConnectionAllocator(mLauncherDelegate,
+                    commandLine, filesToBeMapped, connectionAllocator, binderCallback);
         }
     }
 
     public int getPid() {
         assert LauncherThread.runningOnLauncherThread();
-        return mConnection == null ? NULL_PROCESS_HANDLE : mConnection.getPid();
+        return mLauncher.getPid();
     }
 
     // Called on client (UI or IO) thread.
     @CalledByNative
     private boolean isOomProtected() {
-        // mConnection is set on a different thread but does not change once it's been set. So it is
-        // safe to test whether it's null from a different thread.
-        if (mConnection == null) {
+        ChildProcessConnection connection = mLauncher.getConnection();
+        // Here we are accessing the connection from a thread other than the launcher thread, but it
+        // does not change once it's been set. So it is safe to test whether it's null here and
+        // access it afterwards.
+        if (connection == null) {
             return false;
         }
 
         // We consider the process to be child protected if it has a strong or moderate binding and
         // the app is in the foreground.
-        return sApplicationInForeground && !mConnection.isWaivedBoundOnlyOrWasWhenDied();
+        return sApplicationInForeground && !connection.isWaivedBoundOnlyOrWasWhenDied();
     }
 
     @CalledByNative
     private void setInForeground(int pid, boolean foreground, boolean boostForPendingViews) {
         assert LauncherThread.runningOnLauncherThread();
-        assert mConnection != null;
-        assert getPid() == pid;
+        assert mLauncher.getPid() == pid;
         getBindingManager().setPriority(pid, foreground, boostForPendingViews);
     }
 
@@ -545,10 +444,11 @@
     static void stop(int pid) {
         assert LauncherThread.runningOnLauncherThread();
         Log.d(TAG, "stopping child connection: pid=%d", pid);
-        ChildProcessLauncherHelper launcher = sLauncherByPid.get(pid);
-        // Launcher can be null for single process.
+        ChildProcessLauncherHelper launcher = getByPid(pid);
+        // launcher can be null for single process.
         if (launcher != null) {
-            launcher.mConnection.stop();
+            // Can happen for single process.
+            launcher.mLauncher.stop();
         }
     }
 
@@ -579,8 +479,7 @@
 
     private static boolean sLinkerInitialized;
     private static long sLinkerLoadAddress;
-    @VisibleForTesting
-    static void initLinker() {
+    private static void initLinker() {
         assert LauncherThread.runningOnLauncherThread();
         if (sLinkerInitialized) return;
         if (Linker.isUsed()) {
@@ -594,8 +493,9 @@
 
     private static ChromiumLinkerParams getLinkerParamsForNewConnection() {
         assert LauncherThread.runningOnLauncherThread();
-        assert sLinkerInitialized;
 
+        initLinker();
+        assert sLinkerInitialized;
         if (sLinkerLoadAddress == 0) return null;
 
         // Always wait for the shared RELROs in service processes.
@@ -610,70 +510,18 @@
         }
     }
 
-    /**
-     * Creates the common bundle to be passed to child processes through the service binding intent.
-     * If the service gets recreated by the framework the intent will be reused, so these parameters
-     * should be common to all processes of that type.
-     *
-     * @param commandLine Command line params to be passed to the service.
-     * @param linkerParams Linker params to start the service.
-     */
-    private static Bundle createServiceBundle(boolean bindToCallerCheck) {
-        initLinker();
-        Bundle bundle = new Bundle();
+    private static Bundle populateServiceBundle(
+            Bundle bundle, ChildProcessCreationParams creationParams) {
+        boolean bindToCallerCheck =
+                creationParams == null ? false : creationParams.getBindToCallerCheck();
         bundle.putBoolean(ChildProcessConstants.EXTRA_BIND_TO_CALLER, bindToCallerCheck);
         bundle.putParcelable(ContentChildProcessConstants.EXTRA_LINKER_PARAMS,
                 getLinkerParamsForNewConnection());
         return bundle;
     }
 
-    public Bundle createConnectionBundle() {
-        Bundle bundle = new Bundle();
-        bundle.putStringArray(ChildProcessConstants.EXTRA_COMMAND_LINE, mCommandLine);
-        bundle.putParcelableArray(ChildProcessConstants.EXTRA_FILES, mFilesToBeMapped);
-        return bundle;
-    }
-
-    // Below are methods that will eventually be moved to a content delegate class.
-
-    private void onBeforeConnectionAllocated(Bundle commonParameters) {
-        // TODO(jcivelli): move createServiceBundle in there.
-    }
-
-    // Called once a connection has been allocated.
-    private void onConnectionBound(ChildProcessConnection connection,
-            ChildConnectionAllocator connectionAllocator, Bundle connectionBundle) {
-        if (mSandboxed && !connectionAllocator.isFreeConnectionAvailable()) {
-            // Proactively releases all the moderate bindings once all the sandboxed services are
-            // allocated, which will be very likely to have some of them killed by OOM killer.
-            getBindingManager().releaseAllModerateBindings();
-        }
-
-        // Popuplate the bundle passed to the service setup call with content specific parameters.
-        connectionBundle.putInt(
-                ContentChildProcessConstants.EXTRA_CPU_COUNT, CpuFeatures.getCount());
-        connectionBundle.putLong(
-                ContentChildProcessConstants.EXTRA_CPU_FEATURES, CpuFeatures.getMask());
-        connectionBundle.putBundle(
-                Linker.EXTRA_LINKER_SHARED_RELROS, Linker.getInstance().getSharedRelros());
-    }
-
-    private void onConnectionEstablished(ChildProcessConnection connection) {
-        if (mSandboxed) {
-            getBindingManager().addNewConnection(connection.getPid(), connection);
-        }
-    }
-
-    // Called when a connection has been disconnected. Only invoked if onConnectionEstablished was
-    // called, meaning the connection was already established.
-    private void onConnectionLost(ChildProcessConnection connection, int pid) {
-        if (mSandboxed) {
-            getBindingManager().removeConnection(pid);
-        }
-    }
-
-    private IBinder getIBinderCallback() {
-        return mIBinderCallback;
+    public static ChildProcessLauncherHelper getByPid(int pid) {
+        return sLauncherByPid.get(pid);
     }
 
     // Testing only related methods.
@@ -682,18 +530,12 @@
             ChildProcessCreationParams creationParams, String[] commandLine,
             FileDescriptorInfo[] filesToBeMapped, boolean sandboxed, IBinder binderCallback,
             boolean doSetupConnection) {
-        ChildProcessLauncherHelper launcherHelper =
-                new ChildProcessLauncherHelper(0L, creationParams, commandLine, filesToBeMapped,
-                        sandboxed, binderCallback, doSetupConnection);
-        launcherHelper.start();
+        ChildProcessLauncherHelper launcherHelper = new ChildProcessLauncherHelper(
+                0L, creationParams, commandLine, filesToBeMapped, sandboxed, binderCallback);
+        launcherHelper.mLauncher.start(doSetupConnection, true /* queueIfNoFreeConnection */);
         return launcherHelper;
     }
 
-    @VisibleForTesting
-    public static ChildProcessLauncherHelper getLauncherForPid(int pid) {
-        return sLauncherByPid.get(pid);
-    }
-
     /** @return the count of services set-up and working. */
     @VisibleForTesting
     static int getConnectedServicesCountForTesting() {
@@ -720,18 +562,13 @@
     }
 
     @VisibleForTesting
-    ChildProcessConnection getConnection() {
-        return mConnection;
-    }
-
-    @VisibleForTesting
     public ChildProcessConnection getChildProcessConnection() {
-        return mConnection;
+        return mLauncher.getConnection();
     }
 
     @VisibleForTesting
     public ChildConnectionAllocator getChildConnectionAllocatorForTesting() {
-        return mConnectionAllocator;
+        return mLauncher.getConnectionAllocator();
     }
 
     @VisibleForTesting
@@ -743,9 +580,8 @@
     public static boolean crashProcessForTesting(int pid) {
         if (sLauncherByPid.get(pid) == null) return false;
 
-        ChildProcessConnection connection = sLauncherByPid.get(pid).mConnection;
+        ChildProcessConnection connection = sLauncherByPid.get(pid).mLauncher.getConnection();
         if (connection == null) return false;
-
         try {
             connection.crashServiceForTesting();
             return true;
diff --git a/content/public/android/java/src/org/chromium/content/browser/SpareChildConnection.java b/content/public/android/java/src/org/chromium/content/browser/SpareChildConnection.java
index dec2322a..6538cc7 100644
--- a/content/public/android/java/src/org/chromium/content/browser/SpareChildConnection.java
+++ b/content/public/android/java/src/org/chromium/content/browser/SpareChildConnection.java
@@ -84,8 +84,7 @@
     public ChildProcessConnection getConnection(ChildConnectionAllocator allocator,
             @NonNull final ChildProcessConnection.ServiceCallback serviceCallback) {
         assert LauncherThread.runningOnLauncherThread();
-        if (mConnection == null || allocator != mConnectionAllocator
-                || mConnectionServiceCallback != null) {
+        if (isEmpty() || !isForAllocator(allocator) || mConnectionServiceCallback != null) {
             return null;
         }
 
@@ -117,6 +116,11 @@
         return mConnection == null || mConnectionServiceCallback != null;
     }
 
+    /** Returns true if this spare connection uses {@param allocator}. */
+    public boolean isForAllocator(ChildConnectionAllocator allocator) {
+        return mConnectionAllocator == allocator;
+    }
+
     private void clearConnection() {
         assert LauncherThread.runningOnLauncherThread();
         mConnection = null;
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherHelperTest.java b/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherHelperTest.java
new file mode 100644
index 0000000..3e87a5f
--- /dev/null
+++ b/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherHelperTest.java
@@ -0,0 +1,563 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.content.browser;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Messenger;
+import android.os.RemoteException;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.MediumTest;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.BaseSwitches;
+import org.chromium.base.ThreadUtils;
+import org.chromium.base.library_loader.LibraryLoader;
+import org.chromium.base.library_loader.LibraryProcessType;
+import org.chromium.base.process_launcher.ChildProcessCreationParams;
+import org.chromium.base.process_launcher.FileDescriptorInfo;
+import org.chromium.base.test.util.Feature;
+import org.chromium.content.browser.test.ChildProcessAllocatorSettings;
+import org.chromium.content.browser.test.ContentJUnit4ClassRunner;
+import org.chromium.content.browser.test.util.Criteria;
+import org.chromium.content.browser.test.util.CriteriaHelper;
+import org.chromium.content_shell_apk.ChildProcessLauncherTestHelperService;
+import org.chromium.content_shell_apk.ChildProcessLauncherTestUtils;
+
+import java.util.concurrent.Callable;
+
+/**
+ * Instrumentation tests for ChildProcessLauncher.
+ */
+@RunWith(ContentJUnit4ClassRunner.class)
+public class ChildProcessLauncherHelperTest {
+    // Pseudo command line arguments to instruct the child process to wait until being killed.
+    // Allowing the process to continue would lead to a crash when attempting to initialize IPC
+    // channels that are not being set up in this test.
+    private static final String[] sProcessWaitArguments = {
+            "_", "--" + BaseSwitches.RENDERER_WAIT_FOR_JAVA_DEBUGGER};
+    private static final String EXTERNAL_APK_PACKAGE_NAME = "org.chromium.external.apk";
+    private static final String DEFAULT_SANDBOXED_PROCESS_SERVICE =
+            "org.chromium.content.app.SandboxedProcessService";
+
+    private static final int DONT_BLOCK = 0;
+    private static final int BLOCK_UNTIL_CONNECTED = 1;
+    private static final int BLOCK_UNTIL_SETUP = 2;
+
+    @Before
+    public void setUp() throws Exception {
+        LibraryLoader.get(LibraryProcessType.PROCESS_CHILD).ensureInitialized();
+    }
+
+    /**
+     * Tests that external APKs and regular use different ChildConnectionAllocators.
+     */
+    @Test
+    @MediumTest
+    @Feature({"ProcessManagement"})
+    @ChildProcessAllocatorSettings(
+            sandboxedServiceCount = 4, sandboxedServiceName = DEFAULT_SANDBOXED_PROCESS_SERVICE)
+    public void testAllocatorForPackage() {
+        Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+
+        ChildConnectionAllocator connectionAllocator = getChildConnectionAllocator(
+                appContext, appContext.getPackageName(), true /* sandboxed */);
+        ChildConnectionAllocator externalConnectionAllocator = getChildConnectionAllocator(
+                appContext, EXTERNAL_APK_PACKAGE_NAME, true /* sandboxed */);
+        Assert.assertNotEquals(connectionAllocator, externalConnectionAllocator);
+    }
+
+    /**
+     * Tests binding to the same sandboxed service process from multiple processes in the
+     * same package. This uses the ChildProcessLauncherTestHelperService declared in
+     * ContentShell.apk as a separate android:process to bind the first (slot 0) service. The
+     * instrumentation test then tries to bind the same slot, which fails, so the
+     * ChildProcessLauncher retries on a new connection.
+     */
+    @Test
+    @MediumTest
+    @Feature({"ProcessManagement"})
+    public void testBindServiceFromMultipleProcesses() throws RemoteException {
+        final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
+
+        // Start the Helper service.
+        class HelperConnection implements ServiceConnection {
+            Messenger mMessenger = null;
+
+            @Override
+            public void onServiceConnected(ComponentName name, IBinder service) {
+                mMessenger = new Messenger(service);
+            }
+
+            @Override
+            public void onServiceDisconnected(ComponentName name) {}
+        }
+        final HelperConnection serviceConnection = new HelperConnection();
+
+        Intent intent = new Intent();
+        intent.setComponent(new ComponentName(context.getPackageName(),
+                context.getPackageName() + ".ChildProcessLauncherTestHelperService"));
+        Assert.assertTrue(context.bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE));
+
+        // Wait for the Helper service to connect.
+        CriteriaHelper.pollInstrumentationThread(
+                new Criteria("Failed to get helper service Messenger") {
+                    @Override
+                    public boolean isSatisfied() {
+                        return serviceConnection.mMessenger != null;
+                    }
+                });
+
+        Assert.assertNotNull(serviceConnection.mMessenger);
+
+        class ReplyHandler implements Handler.Callback {
+            Message mMessage;
+
+            @Override
+            public boolean handleMessage(Message msg) {
+                // Copy the message so its contents outlive this Binder transaction.
+                mMessage = Message.obtain();
+                mMessage.copyFrom(msg);
+                return true;
+            }
+        }
+        final ReplyHandler replyHandler = new ReplyHandler();
+
+        // Send a message to the Helper and wait for the reply. This will cause the slot 0
+        // sandboxed service connection to be bound by a different PID (i.e., not this process).
+        Message msg = Message.obtain(null, ChildProcessLauncherTestHelperService.MSG_BIND_SERVICE);
+        msg.replyTo = new Messenger(new Handler(Looper.getMainLooper(), replyHandler));
+        serviceConnection.mMessenger.send(msg);
+
+        CriteriaHelper.pollInstrumentationThread(
+                new Criteria("Failed waiting for helper service reply") {
+                    @Override
+                    public boolean isSatisfied() {
+                        return replyHandler.mMessage != null;
+                    }
+                });
+
+        // Verify that the Helper was able to launch the sandboxed service.
+        Assert.assertNotNull(replyHandler.mMessage);
+        Assert.assertEquals(ChildProcessLauncherTestHelperService.MSG_BIND_SERVICE_REPLY,
+                replyHandler.mMessage.what);
+        Assert.assertEquals(
+                "Connection slot from helper service is not 0", 0, replyHandler.mMessage.arg2);
+
+        final int helperConnectionPid = replyHandler.mMessage.arg1;
+        Assert.assertTrue(helperConnectionPid > 0);
+
+        // Launch a service from this process. Since slot 0 is already bound by the Helper, it
+        // will fail to start and the ChildProcessLauncher will retry and use the slot 1.
+        ChildProcessCreationParams creationParams = new ChildProcessCreationParams(
+                context.getPackageName(), false /* isExternalService */,
+                LibraryProcessType.PROCESS_CHILD, true /* bindToCallerCheck */);
+        ChildProcessLauncherHelper launcher = startSandboxedChildProcessWithCreationParams(
+                creationParams, BLOCK_UNTIL_SETUP, true /* doSetupConnection */);
+
+        final ChildProcessConnection retryConnection =
+                ChildProcessLauncherTestUtils.getConnection(launcher);
+        Assert.assertEquals(
+                1, ChildProcessLauncherTestUtils.getConnectionServiceNumber(retryConnection));
+
+        ChildConnectionAllocator connectionAllocator =
+                launcher.getChildConnectionAllocatorForTesting();
+
+        // Check that only two connections are created.
+        for (int i = 0; i < connectionAllocator.getNumberOfServices(); ++i) {
+            ChildProcessConnection sandboxedConn =
+                    connectionAllocator.getChildProcessConnectionAtSlotForTesting(i);
+            if (i <= 1) {
+                Assert.assertNotNull(sandboxedConn);
+                Assert.assertNotNull(
+                        ChildProcessLauncherTestUtils.getConnectionService(sandboxedConn));
+            } else {
+                Assert.assertNull(sandboxedConn);
+            }
+        }
+
+        Assert.assertEquals(
+                connectionAllocator.getChildProcessConnectionAtSlotForTesting(1), retryConnection);
+
+        ChildProcessConnection failedConnection =
+                connectionAllocator.getChildProcessConnectionAtSlotForTesting(0);
+        Assert.assertEquals(0, ChildProcessLauncherTestUtils.getConnectionPid(failedConnection));
+        Assert.assertFalse(ChildProcessLauncherTestUtils.getConnectionService(failedConnection)
+                                   .bindToCaller());
+
+        CriteriaHelper.pollInstrumentationThread(
+                new Criteria("Failed waiting retry connection to get pid") {
+                    @Override
+                    public boolean isSatisfied() {
+                        return ChildProcessLauncherTestUtils.getConnectionPid(retryConnection) > 0;
+                    }
+                });
+        Assert.assertTrue(ChildProcessLauncherTestUtils.getConnectionPid(retryConnection)
+                != helperConnectionPid);
+        Assert.assertTrue(
+                ChildProcessLauncherTestUtils.getConnectionService(retryConnection).bindToCaller());
+    }
+
+    private static void warmUpOnUiThreadBlocking(final Context context) {
+        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+            @Override
+            public void run() {
+                ChildProcessLauncherHelper.warmUp(context);
+            }
+        });
+        ChildProcessConnection connection = getWarmUpConnection();
+        Assert.assertNotNull(connection);
+        blockUntilConnected(connection);
+    }
+
+    private void testWarmUpWithCreationParams(ChildProcessCreationParams creationParams) {
+        if (creationParams != null) {
+            ChildProcessCreationParams.registerDefault(creationParams);
+        }
+
+        Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
+        warmUpOnUiThreadBlocking(context);
+
+        Assert.assertEquals(1, getConnectedSandboxedServicesCount());
+
+        ChildProcessLauncherHelper launcherHelper = startSandboxedChildProcessWithCreationParams(
+                creationParams, BLOCK_UNTIL_SETUP, true /* doSetupConnection */);
+
+        // The warm-up connection was used, so no new process should have been created.
+        Assert.assertEquals(1, getConnectedSandboxedServicesCount());
+
+        int pid = getPid(launcherHelper);
+        Assert.assertNotEquals(0, pid);
+
+        stopProcess(launcherHelper);
+
+        waitForConnectedSandboxedServicesCount(0);
+    }
+
+    @Test
+    @MediumTest
+    @Feature({"ProcessManagement"})
+    public void testWarmUp() {
+        // Use the default creation parameters.
+        testWarmUpWithCreationParams(null /* creationParams */);
+    }
+
+    @Test
+    @MediumTest
+    @Feature({"ProcessManagement"})
+    public void testWarmUpWithBindToCaller() {
+        Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
+        ChildProcessCreationParams creationParams = new ChildProcessCreationParams(
+                context.getPackageName(), false /* isExternalService */,
+                LibraryProcessType.PROCESS_CHILD, true /* bindToCallerCheck */);
+        testWarmUpWithCreationParams(creationParams);
+    }
+
+    // Tests that the warm-up connection is freed from its allocator if it crashes.
+    @Test
+    @MediumTest
+    @Feature({"ProcessManagement"})
+    public void testWarmUpProcessCrashBeforeUse() throws RemoteException {
+        Assert.assertEquals(0, getConnectedSandboxedServicesCount());
+
+        Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
+        warmUpOnUiThreadBlocking(context);
+
+        Assert.assertEquals(1, getConnectedSandboxedServicesCount());
+
+        // Crash the warm-up connection before it gets used.
+        ChildProcessConnection connection = getWarmUpConnection();
+        Assert.assertNotNull(connection);
+        connection.crashServiceForTesting();
+
+        // It should get cleaned-up.
+        waitForConnectedSandboxedServicesCount(0);
+
+        // And subsequent process launches should work.
+        ChildProcessLauncherHelper launcher = startSandboxedChildProcess(
+                null /* packageName */, BLOCK_UNTIL_SETUP, true /* doSetupConnection */);
+        Assert.assertEquals(1, getConnectedSandboxedServicesCount());
+        Assert.assertNotNull(ChildProcessLauncherTestUtils.getConnection(launcher));
+    }
+
+    // Tests that the warm-up connection is freed from its allocator if it crashes after being used.
+    @Test
+    @MediumTest
+    @Feature({"ProcessManagement"})
+    public void testWarmUpProcessCrashAfterUse() throws RemoteException {
+        Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
+        warmUpOnUiThreadBlocking(context);
+
+        Assert.assertEquals(1, getConnectedSandboxedServicesCount());
+
+        ChildProcessLauncherHelper launcherHelper = startSandboxedChildProcessWithCreationParams(
+                null /* creationParams */, BLOCK_UNTIL_SETUP, true /* doSetupConnection */);
+
+        // The warm-up connection was used, so no new process should have been created.
+        Assert.assertEquals(1, getConnectedSandboxedServicesCount());
+
+        int pid = getPid(launcherHelper);
+        Assert.assertNotEquals(0, pid);
+
+        ChildProcessConnection connection = retrieveConnection(launcherHelper);
+        connection.crashServiceForTesting();
+
+        waitForConnectedSandboxedServicesCount(0);
+    }
+
+    @Test
+    @MediumTest
+    @Feature({"ProcessManagement"})
+    public void testSandboxedAllocatorFreed() {
+        final String packageName =
+                InstrumentationRegistry.getInstrumentation().getTargetContext().getPackageName();
+
+        ChildProcessLauncherHelper launcher = startSandboxedChildProcess(
+                null /* packageName */, BLOCK_UNTIL_SETUP, true /* doSetupConnection */);
+
+        Assert.assertTrue(hasSandboxedConnectionAllocatorForPackage(packageName));
+
+        stopProcess(launcher);
+
+        // Poll until allocator is removed. Need to poll here because actually freeing a connection
+        // from allocator is a posted task, rather than a direct call from stop.
+        CriteriaHelper.pollInstrumentationThread(
+                new Criteria("The connection allocator was not removed.") {
+                    @Override
+                    public boolean isSatisfied() {
+                        return !hasSandboxedConnectionAllocatorForPackage(packageName);
+                    }
+                });
+    }
+
+    @Test
+    @MediumTest
+    @Feature({"ProcessManagement"})
+    @ChildProcessAllocatorSettings(sandboxedServiceCount = 4)
+    public void testCustomCreationParamDoesNotReuseWarmupConnection() {
+        // Since warmUp only uses default params.
+        final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
+        ChildProcessCreationParams defaultCreationParams =
+                getDefaultChildProcessCreationParams(context.getPackageName());
+        ChildProcessCreationParams.registerDefault(defaultCreationParams);
+        ChildProcessCreationParams otherCreationParams = getDefaultChildProcessCreationParams(
+                InstrumentationRegistry.getInstrumentation().getContext().getPackageName());
+
+        warmUpOnUiThreadBlocking(context);
+        Assert.assertEquals(1, getConnectedSandboxedServicesCount());
+
+        // First create a connnection with different creation params than the default, it should not
+        // use the warmup connection (note that it won't bind since we are using the wrong package,
+        // but we need to use a different package to differentiate them, and we can only have 1
+        // valid package per app).
+        startSandboxedChildProcessWithCreationParams(
+                otherCreationParams, DONT_BLOCK, false /* doSetupConnection */);
+        Assert.assertNotNull(getWarmUpConnection());
+
+        // Then start a process with the default creation params, the warmup-connection should be
+        // used.
+        startSandboxedChildProcessWithCreationParams(
+                defaultCreationParams, BLOCK_UNTIL_SETUP, true /* doSetupConnection */);
+        Assert.assertNull(getWarmUpConnection());
+    }
+
+    @Test
+    @MediumTest
+    @Feature({"ProcessManagement"})
+    public void testLauncherCleanup() throws RemoteException {
+        ChildProcessLauncherHelper launcher = startSandboxedChildProcess(
+                null /* packageName */, BLOCK_UNTIL_SETUP, true /* doSetupConnection */);
+        int pid = getPid(launcher);
+        Assert.assertNotEquals(0, pid);
+
+        // Stop the process explicitly, the launcher should get cleared.
+        stopProcess(launcher);
+        waitForConnectedSandboxedServicesCount(0);
+
+        launcher = startSandboxedChildProcess(
+                null /* packageName */, BLOCK_UNTIL_SETUP, true /* doSetupConnection */);
+        pid = getPid(launcher);
+        Assert.assertNotEquals(0, pid);
+
+        // This time crash the connection, the launcher should also get cleared.
+        ChildProcessConnection connection = retrieveConnection(launcher);
+        connection.crashServiceForTesting();
+        waitForConnectedSandboxedServicesCount(0);
+    }
+
+    private static ChildProcessLauncherHelper startSandboxedChildProcess(
+            final String packageName, int blockingPolicy, final boolean doSetupConnection) {
+        ChildProcessCreationParams creationParams =
+                packageName == null ? null : getDefaultChildProcessCreationParams(packageName);
+        return startSandboxedChildProcessWithCreationParams(
+                creationParams, blockingPolicy, doSetupConnection);
+    }
+
+    private static ChildProcessLauncherHelper startSandboxedChildProcessWithCreationParams(
+            final ChildProcessCreationParams creationParams, int blockingPolicy,
+            final boolean doSetupConnection) {
+        assert doSetupConnection || blockingPolicy != BLOCK_UNTIL_SETUP;
+        ChildProcessLauncherHelper launcher =
+                ChildProcessLauncherTestUtils.runOnLauncherAndGetResult(
+                        new Callable<ChildProcessLauncherHelper>() {
+                            @Override
+                            public ChildProcessLauncherHelper call() {
+                                return ChildProcessLauncherHelper.createAndStartForTesting(
+                                        creationParams, sProcessWaitArguments,
+                                        new FileDescriptorInfo[0], true /* sandboxed */,
+                                        null /* binderCallback */, doSetupConnection);
+                            }
+                        });
+        if (blockingPolicy != DONT_BLOCK) {
+            assert blockingPolicy == BLOCK_UNTIL_CONNECTED || blockingPolicy == BLOCK_UNTIL_SETUP;
+            blockUntilConnected(launcher);
+            if (blockingPolicy == BLOCK_UNTIL_SETUP) {
+                blockUntilSetup(launcher);
+            }
+        }
+        return launcher;
+    }
+
+    private static void blockUntilConnected(final ChildProcessLauncherHelper launcher) {
+        CriteriaHelper.pollInstrumentationThread(
+                new Criteria("The connection wasn't established.") {
+                    @Override
+                    public boolean isSatisfied() {
+                        return launcher.getChildProcessConnection() != null
+                                && launcher.getChildProcessConnection().isConnected();
+                    }
+                });
+    }
+
+    private static void blockUntilConnected(final ChildProcessConnection connection) {
+        CriteriaHelper.pollInstrumentationThread(
+                new Criteria("The connection wasn't established.") {
+                    @Override
+                    public boolean isSatisfied() {
+                        return connection.isConnected();
+                    }
+                });
+    }
+
+    private static void blockUntilSetup(final ChildProcessLauncherHelper launcher) {
+        CriteriaHelper.pollInstrumentationThread(
+                new Criteria("The connection wasn't established.") {
+                    @Override
+                    public boolean isSatisfied() {
+                        return getPid(launcher) != 0;
+                    }
+                });
+    }
+
+    private static ChildConnectionAllocator getChildConnectionAllocator(
+            final Context context, final String packageName, final boolean sandboxed) {
+        return ChildProcessLauncherTestUtils.runOnLauncherAndGetResult(
+                new Callable<ChildConnectionAllocator>() {
+                    @Override
+                    public ChildConnectionAllocator call() {
+                        return ChildProcessLauncherHelper.getConnectionAllocator(context,
+                                getDefaultChildProcessCreationParams(packageName), sandboxed);
+                    }
+                });
+    }
+
+    // Returns the number of sandboxed connection currently connected,
+    private static int getConnectedSandboxedServicesCount() {
+        return getConnectedSandboxedServicesCountForPackage(null /* packageName */);
+    }
+
+    // Returns the number of sandboxed connection matching the specificed package name that are
+    // connected,
+    private static int getConnectedSandboxedServicesCountForPackage(final String packageName) {
+        return ChildProcessLauncherTestUtils.runOnLauncherAndGetResult(new Callable<Integer>() {
+            @Override
+            public Integer call() {
+                return ChildProcessLauncherHelper.getConnectedSandboxedServicesCountForTesting(
+                        packageName);
+            }
+        });
+    }
+
+    // Blocks until the number of sandboxed connections reaches targetCount.
+    private static void waitForConnectedSandboxedServicesCount(int targetCount) {
+        CriteriaHelper.pollInstrumentationThread(
+                Criteria.equals(targetCount, new Callable<Integer>() {
+                    @Override
+                    public Integer call() {
+                        return getConnectedSandboxedServicesCountForPackage(null /* packageName */);
+                    }
+                }));
+    }
+
+    private static ChildProcessCreationParams getDefaultChildProcessCreationParams(
+            String packageName) {
+        return packageName == null
+                ? null
+                : new ChildProcessCreationParams(packageName, false /* isExternalService */,
+                          LibraryProcessType.PROCESS_CHILD, false /* bindToCallerCheck */);
+    }
+
+    private static boolean hasSandboxedConnectionAllocatorForPackage(final String packageName) {
+        return ChildProcessLauncherTestUtils.runOnLauncherAndGetResult(new Callable<Boolean>() {
+            @Override
+            public Boolean call() {
+                return ChildProcessLauncherHelper.hasSandboxedConnectionAllocatorForPackage(
+                        packageName);
+            }
+        });
+    }
+
+    private static ChildProcessConnection retrieveConnection(
+            final ChildProcessLauncherHelper launcherHelper) {
+        CriteriaHelper.pollInstrumentationThread(
+                new Criteria("Failed waiting for child process to connect") {
+                    @Override
+                    public boolean isSatisfied() {
+                        return ChildProcessLauncherTestUtils.getConnection(launcherHelper) != null;
+                    }
+                });
+
+        return ChildProcessLauncherTestUtils.getConnection(launcherHelper);
+    }
+
+    private static void stopProcess(ChildProcessLauncherHelper launcherHelper) {
+        final ChildProcessConnection connection = retrieveConnection(launcherHelper);
+        ChildProcessLauncherTestUtils.runOnLauncherThreadBlocking(new Runnable() {
+            @Override
+            public void run() {
+                ChildProcessLauncherHelper.stop(connection.getPid());
+            }
+        });
+    }
+
+    private static int getPid(final ChildProcessLauncherHelper launcherHelper) {
+        return ChildProcessLauncherTestUtils.runOnLauncherAndGetResult(new Callable<Integer>() {
+            @Override
+            public Integer call() {
+                return launcherHelper.getPid();
+            }
+        });
+    }
+
+    private static ChildProcessConnection getWarmUpConnection() {
+        return ChildProcessLauncherTestUtils.runOnLauncherAndGetResult(
+                new Callable<ChildProcessConnection>() {
+                    @Override
+                    public ChildProcessConnection call() {
+                        return ChildProcessLauncherHelper.getWarmUpConnectionForTesting();
+                    }
+                });
+    }
+}
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherTest.java b/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherTest.java
index 3a36065f..5ff7ab2 100644
--- a/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherTest.java
+++ b/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherTest.java
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
+// Copyright 2017 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -6,15 +6,11 @@
 
 import android.content.ComponentName;
 import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.os.Handler;
+import android.os.Bundle;
 import android.os.IBinder;
-import android.os.Looper;
-import android.os.Message;
-import android.os.Messenger;
 import android.os.RemoteException;
 import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.LargeTest;
 import android.support.test.filters.MediumTest;
 
 import org.junit.Assert;
@@ -22,49 +18,381 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import org.chromium.base.BaseSwitches;
-import org.chromium.base.ThreadUtils;
-import org.chromium.base.library_loader.LibraryLoader;
-import org.chromium.base.library_loader.LibraryProcessType;
-import org.chromium.base.process_launcher.ChildProcessCreationParams;
 import org.chromium.base.process_launcher.FileDescriptorInfo;
+import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.Feature;
-import org.chromium.content.browser.test.ChildProcessAllocatorSettings;
 import org.chromium.content.browser.test.ContentJUnit4ClassRunner;
 import org.chromium.content.browser.test.util.Criteria;
 import org.chromium.content.browser.test.util.CriteriaHelper;
-import org.chromium.content_shell_apk.ChildProcessLauncherTestHelperService;
 import org.chromium.content_shell_apk.ChildProcessLauncherTestUtils;
+import org.chromium.content_shell_apk.IChildProcessTest;
 
 import java.util.concurrent.Callable;
+import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicReference;
 
 /**
  * Instrumentation tests for ChildProcessLauncher.
  */
 @RunWith(ContentJUnit4ClassRunner.class)
 public class ChildProcessLauncherTest {
-    // Pseudo command line arguments to instruct the child process to wait until being killed.
-    // Allowing the process to continue would lead to a crash when attempting to initialize IPC
-    // channels that are not being set up in this test.
-    private static final String[] sProcessWaitArguments = {
-        "_", "--" + BaseSwitches.RENDERER_WAIT_FOR_JAVA_DEBUGGER };
-    private static final String EXTERNAL_APK_PACKAGE_NAME = "org.chromium.external.apk";
-    private static final String DEFAULT_SANDBOXED_PROCESS_SERVICE =
-            "org.chromium.content.app.SandboxedProcessService";
+    private static final long CONDITION_WAIT_TIMEOUT_MS = 5000;
 
-    private static final int DONT_BLOCK = 0;
-    private static final int BLOCK_UNTIL_CONNECTED = 1;
-    private static final int BLOCK_UNTIL_SETUP = 2;
+    private static final String SERVICE_PACKAGE_NAME = "org.chromium.content_shell_apk";
+    private static final String SERVICE_NAME_META_DATA_KEY =
+            "org.chromium.content.browser.TEST_SERVICES_NAME";
+    private static final String SERVICE_COUNT_META_DATA_KEY =
+            "org.chromium.content.browser.NUM_TEST_SERVICES";
+    private static final String SERVICE0_FULL_NAME =
+            "org.chromium.content_shell_apk.TestChildProcessService0";
+
+    private static final String EXTRA_SERVICE_PARAM = "org.chromium.content.browser.SERVICE_EXTRA";
+    private static final String EXTRA_SERVICE_PARAM_VALUE = "SERVICE_EXTRA";
+
+    private static final String EXTRA_CONNECTION_PARAM =
+            "org.chromium.content.browser.CONNECTION_EXTRA";
+    private static final String EXTRA_CONNECTION_PARAM_VALUE = "CONNECTION_EXTRA";
+
+    private static final int CONNECTION_BLOCK_UNTIL_CONNECTED = 1;
+    private static final int CONNECTION_BLOCK_UNTIL_SETUP = 2;
+
+    /**
+     * A factory used to create a ChildProcessLauncher with a bound connection or with a connection
+     * connection allocator so that the test code can be reused for both scenarios.
+     */
+    private abstract static class ChildProcessLauncherFactory {
+        private final boolean mConnectionProvided;
+
+        public ChildProcessLauncherFactory(boolean connectionProvided) {
+            mConnectionProvided = connectionProvided;
+        }
+
+        public abstract ChildProcessLauncher createChildProcessLauncher(
+                ChildProcessLauncher.Delegate delegate, String[] commandLine,
+                FileDescriptorInfo[] filesToBeMapped, IBinder binderCallback);
+
+        public boolean isConnectionProvided() {
+            return mConnectionProvided;
+        }
+    }
+
+    private static final ChildProcessLauncher.Delegate EMPTY_LAUNCHER_DELEGATE =
+            new ChildProcessLauncher.Delegate() {
+                @Override
+                public void onBeforeConnectionAllocated(Bundle serviceBundle) {}
+
+                @Override
+                public void onBeforeConnectionSetup(Bundle connectionBundle) {}
+
+                @Override
+                public void onConnectionEstablished(ChildProcessConnection connection) {}
+
+                @Override
+                public void onConnectionLost(ChildProcessConnection connection) {}
+            };
+
+    private ChildConnectionAllocator mConnectionAllocator;
 
     @Before
     public void setUp() throws Exception {
-        LibraryLoader.get(LibraryProcessType.PROCESS_CHILD).ensureInitialized();
+        mConnectionAllocator = ChildProcessLauncherTestUtils.runOnLauncherAndGetResult(
+                new Callable<ChildConnectionAllocator>() {
+                    @Override
+                    public ChildConnectionAllocator call() {
+                        Context context =
+                                InstrumentationRegistry.getInstrumentation().getTargetContext();
+                        return ChildConnectionAllocator.create(context, null /* creationParams */,
+                                SERVICE_PACKAGE_NAME, SERVICE_NAME_META_DATA_KEY,
+                                SERVICE_COUNT_META_DATA_KEY, false /* bindAsExternalService */,
+                                false /* useStrongBinding */);
+                    }
+                });
+    }
+
+    private static class IChildProcessBinder extends IChildProcessTest.Stub {
+        private final CallbackHelper mOnConnectionSetupHelper = new CallbackHelper();
+        private final CallbackHelper mOnLoadNativeHelper = new CallbackHelper();
+        private final CallbackHelper mOnBeforeMainHelper = new CallbackHelper();
+        private final CallbackHelper mOnRunMainHelper = new CallbackHelper();
+        private final CallbackHelper mOnDestroyHelper = new CallbackHelper();
+
+        // Can be accessed after mOnConnectionSetupCalled is signaled.
+        private boolean mServiceCreated;
+        private Bundle mServiceBundle;
+        private Bundle mConnectionBundle;
+
+        // Can be accessed after mOnLoadNativeCalled is signaled.
+        private boolean mNativeLibraryLoaded;
+
+        // Can be accessed after mOnBeforeMainCalled is signaled.
+        private String[] mCommandLine;
+
+        @Override
+        public void onConnectionSetup(
+                boolean serviceCreatedCalled, Bundle serviceBundle, Bundle connectionBundle) {
+            mServiceCreated = serviceCreatedCalled;
+            mServiceBundle = serviceBundle;
+            mConnectionBundle = connectionBundle;
+            Assert.assertEquals(0, mOnConnectionSetupHelper.getCallCount());
+            mOnConnectionSetupHelper.notifyCalled();
+        }
+
+        @Override
+        public void onLoadNativeLibrary(boolean loadedSuccessfully) {
+            mNativeLibraryLoaded = loadedSuccessfully;
+            Assert.assertEquals(0, mOnLoadNativeHelper.getCallCount());
+            mOnLoadNativeHelper.notifyCalled();
+        }
+
+        @Override
+        public void onBeforeMain(String[] commandLine) {
+            mCommandLine = commandLine;
+            Assert.assertEquals(0, mOnBeforeMainHelper.getCallCount());
+            mOnBeforeMainHelper.notifyCalled();
+        }
+
+        @Override
+        public void onRunMain() {
+            Assert.assertEquals(0, mOnRunMainHelper.getCallCount());
+            mOnRunMainHelper.notifyCalled();
+        }
+
+        @Override
+        public void onDestroy() {
+            Assert.assertEquals(0, mOnDestroyHelper.getCallCount());
+            mOnDestroyHelper.notifyCalled();
+        }
+
+        public void waitForOnConnectionSetupCalled() throws InterruptedException, TimeoutException {
+            mOnConnectionSetupHelper.waitForCallback(0 /* currentCallCount */);
+        }
+
+        public void waitForOnNativeLibraryCalled() throws InterruptedException, TimeoutException {
+            mOnLoadNativeHelper.waitForCallback(0 /* currentCallCount */);
+        }
+
+        public void waitOnBeforeMainCalled() throws InterruptedException, TimeoutException {
+            mOnBeforeMainHelper.waitForCallback(0 /* currentCallCount */);
+        }
+
+        public void waitOnRunMainCalled() throws InterruptedException, TimeoutException {
+            mOnRunMainHelper.waitForCallback(0 /* currentCallCount */);
+        }
+
+        public void waitOnDestroyCalled() throws InterruptedException, TimeoutException {
+            mOnDestroyHelper.waitForCallback(0 /* currentCallCount */);
+        }
+    };
+
+    /**
+     * Creates a child process with the ChildProcessLauncher created with {@param launcherFactory}
+     * and tests that the all callbacks on the client and in the service are called appropriately.
+     * The service echos back the delegate calls through the IBinder callback so that the test can
+     * validate them.
+     */
+    private void testProcessLauncher(final ChildProcessLauncherFactory launcherFactory)
+            throws InterruptedException, TimeoutException {
+        // ConditionVariables used to check the ChildProcessLauncher.Delegate methods get called.
+        final CallbackHelper onBeforeConnectionAllocatedHelper = new CallbackHelper();
+        final CallbackHelper onBeforeConnectionSetupHelper = new CallbackHelper();
+        final CallbackHelper onConnectionEstablishedHelper = new CallbackHelper();
+        final CallbackHelper onConnectionLostHelper = new CallbackHelper();
+
+        final ChildProcessLauncher.Delegate delegate = new ChildProcessLauncher.Delegate() {
+            @Override
+            public void onBeforeConnectionAllocated(Bundle serviceBundle) {
+                // Should only be called when the ChildProcessLauncher creates the connection.
+                Assert.assertFalse(launcherFactory.isConnectionProvided());
+                Assert.assertEquals(0, onBeforeConnectionAllocatedHelper.getCallCount());
+                serviceBundle.putString(EXTRA_SERVICE_PARAM, EXTRA_SERVICE_PARAM_VALUE);
+                onBeforeConnectionAllocatedHelper.notifyCalled();
+            }
+
+            @Override
+            public void onBeforeConnectionSetup(Bundle connectionBundle) {
+                connectionBundle.putString(EXTRA_CONNECTION_PARAM, EXTRA_CONNECTION_PARAM_VALUE);
+                Assert.assertEquals(0, onBeforeConnectionSetupHelper.getCallCount());
+                onBeforeConnectionSetupHelper.notifyCalled();
+            }
+
+            @Override
+            public void onConnectionEstablished(ChildProcessConnection connection) {
+                Assert.assertEquals(0, onConnectionEstablishedHelper.getCallCount());
+                onConnectionEstablishedHelper.notifyCalled();
+            }
+
+            @Override
+            public void onConnectionLost(ChildProcessConnection connection) {
+                Assert.assertEquals(0, onConnectionLostHelper.getCallCount());
+                onConnectionLostHelper.notifyCalled();
+            }
+        };
+
+        final String[] commandLine = new String[] {"--test-param1", "--test-param2"};
+        final FileDescriptorInfo[] filesToBeMapped = new FileDescriptorInfo[0];
+
+        final IChildProcessBinder childProcessBinder = new IChildProcessBinder();
+
+        final ChildProcessLauncher processLauncher =
+                ChildProcessLauncherTestUtils.runOnLauncherAndGetResult(
+                        new Callable<ChildProcessLauncher>() {
+                            @Override
+                            public ChildProcessLauncher call() {
+                                ChildProcessLauncher processLauncher =
+                                        launcherFactory.createChildProcessLauncher(delegate,
+                                                commandLine, filesToBeMapped, childProcessBinder);
+                                processLauncher.start(true /* setupConnection */,
+                                        false /*queueIfNoFreeConnection */);
+                                return processLauncher;
+                            }
+                        });
+
+        Assert.assertNotNull(processLauncher);
+
+        if (!launcherFactory.isConnectionProvided()) {
+            onBeforeConnectionAllocatedHelper.waitForCallback(0 /* currentCallback */);
+        }
+
+        onBeforeConnectionSetupHelper.waitForCallback(0 /* currentCallback */);
+
+        // Wait for the service to notify its onConnectionSetup was called.
+        childProcessBinder.waitForOnConnectionSetupCalled();
+        Assert.assertTrue(childProcessBinder.mServiceCreated);
+        Assert.assertNotNull(childProcessBinder.mServiceBundle);
+        Assert.assertNotNull(childProcessBinder.mConnectionBundle);
+        if (!launcherFactory.isConnectionProvided()) {
+            Assert.assertEquals(EXTRA_SERVICE_PARAM_VALUE,
+                    childProcessBinder.mServiceBundle.getString(EXTRA_SERVICE_PARAM));
+        }
+        Assert.assertEquals(EXTRA_CONNECTION_PARAM_VALUE,
+                childProcessBinder.mConnectionBundle.getString(EXTRA_CONNECTION_PARAM));
+
+        // Wait for the client onConnectionEstablished call.
+        onConnectionEstablishedHelper.waitForCallback(0 /* currentCallback */);
+
+        // Wait for the service to notify its library got loaded.
+        childProcessBinder.waitForOnNativeLibraryCalled();
+        Assert.assertTrue(childProcessBinder.mNativeLibraryLoaded);
+
+        // Wait for the service to notify its onBeforeMain was called.
+        childProcessBinder.waitOnBeforeMainCalled();
+        Assert.assertArrayEquals(commandLine, childProcessBinder.mCommandLine);
+
+        // Wait for the service to notify its onRunMain was called.
+        childProcessBinder.waitOnRunMainCalled();
+
+        // Stop the launcher.
         ChildProcessLauncherTestUtils.runOnLauncherThreadBlocking(new Runnable() {
             @Override
             public void run() {
-                ChildProcessLauncherHelper.initLinker();
+                processLauncher.stop();
             }
         });
+        // Wait for service to notify its onDestroy was called.
+        childProcessBinder.waitOnDestroyCalled();
+        // The client should also get a notification that the connection was lost.
+        onConnectionLostHelper.waitForCallback(0 /* currentCallback */);
+    }
+
+    @Test
+    @LargeTest
+    @Feature({"ProcessManagement"})
+    public void testLaunchServiceCreatedWithConnectionAllocator() throws Exception {
+        final ChildProcessLauncherFactory childProcessLauncherFactory =
+                new ChildProcessLauncherFactory(false /* providesConnection */) {
+                    @Override
+                    public ChildProcessLauncher createChildProcessLauncher(
+                            ChildProcessLauncher.Delegate delegate, String[] commandLine,
+                            FileDescriptorInfo[] filesToBeMapped, IBinder binderCallback) {
+                        return ChildProcessLauncher.createWithConnectionAllocator(delegate,
+                                commandLine, filesToBeMapped, mConnectionAllocator, binderCallback);
+                    }
+                };
+
+        testProcessLauncher(childProcessLauncherFactory);
+    }
+
+    @Test
+    @LargeTest
+    @Feature({"ProcessManagement"})
+    public void testLaunchServiceCreatedWithBoundConnection() throws Exception {
+        // Wraps the serviceCallback provided by the ChildProcessLauncher so that the
+        // ChildProcessConnection can forward to them appropriately.
+        final AtomicReference<ChildProcessConnection.ServiceCallback> serviceCallbackWrapper =
+                new AtomicReference<>();
+
+        final ChildProcessConnection boundConnection =
+                ChildProcessLauncherTestUtils.runOnLauncherAndGetResult(new Callable<
+                        ChildProcessConnection>() {
+                    @Override
+                    public ChildProcessConnection call() {
+                        Context context =
+                                InstrumentationRegistry.getInstrumentation().getTargetContext();
+                        ComponentName serviceName =
+                                new ComponentName(SERVICE_PACKAGE_NAME, SERVICE0_FULL_NAME);
+                        ChildProcessConnection connection = new ChildProcessConnection(context,
+                                serviceName, false /* bindAsExternalService */,
+                                new Bundle() /* serviceBundle */, null /* creationParams */);
+                        connection.start(false /* useStrongBinding */,
+                                new ChildProcessConnection.ServiceCallback() {
+                                    @Override
+                                    public void onChildStarted() {
+                                        if (serviceCallbackWrapper.get() != null) {
+                                            serviceCallbackWrapper.get().onChildStarted();
+                                        }
+                                    }
+
+                                    @Override
+                                    public void onChildStartFailed() {
+                                        if (serviceCallbackWrapper.get() != null) {
+                                            serviceCallbackWrapper.get().onChildStartFailed();
+                                        }
+                                    }
+
+                                    @Override
+                                    public void onChildProcessDied(
+                                            ChildProcessConnection connection) {
+                                        if (serviceCallbackWrapper.get() != null) {
+                                            serviceCallbackWrapper.get().onChildProcessDied(
+                                                    connection);
+                                        }
+                                    }
+                                });
+                        return connection;
+                    }
+                });
+
+        Assert.assertNotNull(boundConnection);
+
+        CriteriaHelper.pollInstrumentationThread(new Criteria("Connection failed to connect") {
+            @Override
+            public boolean isSatisfied() {
+                return boundConnection.isConnected();
+            }
+        });
+
+        final ChildProcessLauncher.BoundConnectionProvider connectionProvider =
+                new ChildProcessLauncher.BoundConnectionProvider() {
+                    @Override
+                    public ChildProcessConnection getConnection(
+                            ChildProcessConnection.ServiceCallback serviceCallback) {
+                        serviceCallbackWrapper.set(serviceCallback);
+                        return boundConnection;
+                    }
+                };
+
+        final ChildProcessLauncherFactory childProcessLauncherFactory =
+                new ChildProcessLauncherFactory(true /* providesConnection */) {
+                    @Override
+                    public ChildProcessLauncher createChildProcessLauncher(
+                            ChildProcessLauncher.Delegate delegate, String[] commandLine,
+                            FileDescriptorInfo[] filesToBeMapped, IBinder binderCallback) {
+                        return ChildProcessLauncher.createWithBoundConnectionProvider(delegate,
+                                commandLine, filesToBeMapped, connectionProvider, binderCallback);
+                    }
+                };
+
+        testProcessLauncher(childProcessLauncherFactory);
     }
 
     /**
@@ -73,19 +401,32 @@
     @Test
     @MediumTest
     @Feature({"ProcessManagement"})
-    @ChildProcessAllocatorSettings(sandboxedServiceCount = 4)
     public void testServiceFailedToBind() {
-        Assert.assertEquals(0, getConnectedSandboxedServicesCount());
+        final ChildConnectionAllocator badConnectionAllocator =
+                ChildProcessLauncherTestUtils.runOnLauncherAndGetResult(
+                        new Callable<ChildConnectionAllocator>() {
+                            @Override
+                            public ChildConnectionAllocator call() {
+                                return ChildConnectionAllocator.createForTest(
+                                        null /* creationParams */, "org.chromium.wrong_package",
+                                        "WrongService", 2 /* serviceCount */,
+                                        false /* bindAsExternalService */,
+                                        false /* useStrongBinding */);
+                            }
+                        });
+        Assert.assertFalse(badConnectionAllocator.anyConnectionAllocated());
 
         // Try to allocate a connection to service class in incorrect package. We can do that by
         // using the instrumentation context (getContext()) instead of the app context
         // (getTargetContext()).
-        Context context = InstrumentationRegistry.getInstrumentation().getContext();
-        startSandboxedChildProcess(
-                context.getPackageName(), DONT_BLOCK, true /* doSetupConnection */);
+        ChildProcessLauncher processLauncher = createChildProcessLauncher(badConnectionAllocator,
+                true /* setupConnection */, false /* queueIfNoFreeConnection */);
 
-        // Verify that the connection is not considered as allocated.
-        waitForConnectedSandboxedServicesCount(0);
+        Assert.assertNotNull(processLauncher);
+
+        // Verify that the connection is not considered as allocated (or only briefly, as the
+        // freeing is delayed).
+        waitForConnectionAllocatorState(badConnectionAllocator, true /* isEmpty */);
     }
 
     /**
@@ -95,617 +436,166 @@
     @MediumTest
     @Feature({"ProcessManagement"})
     public void testServiceCrashedBeforeSetup() throws RemoteException {
-        Assert.assertEquals(0, getConnectedSandboxedServicesCount());
+        Assert.assertFalse(mConnectionAllocator.anyConnectionAllocated());
 
         // Start and connect to a new service.
-        ChildProcessLauncherHelper launcher = startSandboxedChildProcess(
-                null /* packageName */, BLOCK_UNTIL_CONNECTED, false /* doSetupConnection */);
+        ChildProcessLauncher processLauncher = createChildProcessLauncher(mConnectionAllocator,
+                false /* setupConnection */, false /* queueIfNoFreeConnection */);
 
         // Verify that the service is bound but not yet set up.
-        Assert.assertEquals(1, getConnectedSandboxedServicesCount());
-        ChildProcessConnection connection = retrieveConnection(launcher);
+        Assert.assertTrue(mConnectionAllocator.anyConnectionAllocated());
+        ChildProcessConnection connection = processLauncher.getConnection();
         Assert.assertNotNull(connection);
-        Assert.assertTrue(connection.isConnected());
-        Assert.assertEquals(0, ChildProcessLauncherTestUtils.getConnectionPid(connection));
+        waitForConnectionState(connection, CONNECTION_BLOCK_UNTIL_CONNECTED);
+        Assert.assertEquals(0, getConnectionPid(connection));
 
         // Crash the service.
         connection.crashServiceForTesting();
 
         // Verify that the connection gets cleaned-up.
-        waitForConnectedSandboxedServicesCount(0);
+        waitForConnectionAllocatorState(mConnectionAllocator, true /* isEmpty */);
     }
 
-    /**
-     * Tests cleanup for a connection that terminates after setup.
-     */
     @Test
     @MediumTest
     @Feature({"ProcessManagement"})
     public void testServiceCrashedAfterSetup() throws RemoteException {
-        Assert.assertEquals(0, getConnectedSandboxedServicesCount());
+        Assert.assertFalse(mConnectionAllocator.anyConnectionAllocated());
 
         // Start and connect to a new service.
-        ChildProcessLauncherHelper launcher = startSandboxedChildProcess(
-                null /* packageName */, BLOCK_UNTIL_SETUP, true /* doSetupConnection */);
-        Assert.assertEquals(1, getConnectedSandboxedServicesCount());
+        ChildProcessLauncher processLauncher = createChildProcessLauncher(mConnectionAllocator,
+                true /* setupConnection */, false /* queueIfNoFreeConnection */);
 
-        int pid = getPid(launcher);
-        Assert.assertNotEquals(0, pid);
+        Assert.assertTrue(mConnectionAllocator.anyConnectionAllocated());
+        ChildProcessConnection connection = processLauncher.getConnection();
+        Assert.assertNotNull(connection);
+        waitForConnectionState(connection, CONNECTION_BLOCK_UNTIL_SETUP);
+        // We are passed set-up, the connection should have received its PID.
+        Assert.assertNotEquals(0, getConnectionPid(connection));
 
         // Crash the service.
-        ChildProcessConnection connection = retrieveConnection(launcher);
         connection.crashServiceForTesting();
 
         // Verify that the connection gets cleaned-up.
-        waitForConnectedSandboxedServicesCount(0);
+        waitForConnectionAllocatorState(mConnectionAllocator, true /* isEmpty */);
 
         // Verify that the connection pid remains set after termination.
-        Assert.assertTrue(ChildProcessLauncherTestUtils.getConnectionPid(connection) != 0);
-        // And that the launcher is cleared.
-        Assert.assertNull(ChildProcessLauncherHelper.getLauncherForPid(pid));
+        Assert.assertNotEquals(0, getConnectionPid(connection));
     }
 
-    /**
-     * Tests that connection requests get queued when no slot is availabe and created once a slot
-     * frees up .
-     */
     @Test
     @MediumTest
     @Feature({"ProcessManagement"})
-    @ChildProcessAllocatorSettings(sandboxedServiceCount = 1)
     public void testPendingSpawnQueue() throws RemoteException {
-        Assert.assertEquals(0, getConnectedSandboxedServicesCount());
+        Assert.assertFalse(mConnectionAllocator.anyConnectionAllocated());
 
-        ChildProcessLauncherHelper launcher1 = startSandboxedChildProcess(
-                null /* packageName */, BLOCK_UNTIL_SETUP, true /* doSetupConnection */);
-        Assert.assertEquals(1, getConnectedSandboxedServicesCount());
-        Assert.assertNotNull(ChildProcessLauncherTestUtils.getConnection(launcher1));
-
-        ChildProcessLauncherHelper launcher2 = startSandboxedChildProcess(
-                null /* packageName */, DONT_BLOCK, true /* doSetupConnection */);
-        Assert.assertEquals(1, getConnectedSandboxedServicesCount());
-        Assert.assertNull(ChildProcessLauncherTestUtils.getConnection(launcher2));
-
-        final ChildProcessConnection connection1 =
-                ChildProcessLauncherTestUtils.getConnection(launcher1);
-        connection1.crashServiceForTesting();
-
-        // The previous service crashing should have freed a connection that should be used for the
-        // pending process.
-        blockUntilConnected(launcher2);
-    }
-
-    /**
-     * Tests that external APKs and regular use different ChildConnectionAllocators.
-     */
-    @Test
-    @MediumTest
-    @Feature({"ProcessManagement"})
-    @ChildProcessAllocatorSettings(
-            sandboxedServiceCount = 4, sandboxedServiceName = DEFAULT_SANDBOXED_PROCESS_SERVICE)
-    public void testAllocatorForPackage() {
-        Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
-
-        ChildConnectionAllocator connectionAllocator = getChildConnectionAllocator(
-                appContext, appContext.getPackageName(), true /* sandboxed */);
-        ChildConnectionAllocator externalConnectionAllocator = getChildConnectionAllocator(
-                appContext, EXTERNAL_APK_PACKAGE_NAME, true /* sandboxed */);
-        Assert.assertNotEquals(connectionAllocator, externalConnectionAllocator);
-    }
-
-    /**
-     * Tests binding to the same sandboxed service process from multiple processes in the
-     * same package. This uses the ChildProcessLauncherTestHelperService declared in
-     * ContentShell.apk as a separate android:process to bind the first (slot 0) service. The
-     * instrumentation test then tries to bind the same slot, which fails, so the
-     * ChildProcessLauncher retries on a new connection.
-     */
-    @Test
-    @MediumTest
-    @Feature({"ProcessManagement"})
-    public void testBindServiceFromMultipleProcesses() throws RemoteException {
-        final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
-
-        // Start the Helper service.
-        class HelperConnection implements ServiceConnection {
-            Messenger mMessenger = null;
-
-            @Override
-            public void onServiceConnected(ComponentName name, IBinder service) {
-                mMessenger = new Messenger(service);
-            }
-
-            @Override
-            public void onServiceDisconnected(ComponentName name) {}
+        // Launch 4 processes. Since we have only 2 services, the 3rd and 4th should get queued.
+        ChildProcessLauncher[] launchers = new ChildProcessLauncher[4];
+        ChildProcessConnection[] connections = new ChildProcessConnection[4];
+        for (int i = 0; i < 4; i++) {
+            launchers[i] = createChildProcessLauncher(mConnectionAllocator,
+                    true /* setupConnection */, true /* queueIfNoFreeConnection */);
+            Assert.assertNotNull(launchers[i]);
+            connections[i] = launchers[i].getConnection();
         }
-        final HelperConnection serviceConnection = new HelperConnection();
+        Assert.assertNotNull(connections[0]);
+        Assert.assertNotNull(connections[1]);
+        Assert.assertNull(connections[2]);
+        Assert.assertNull(connections[3]);
 
-        Intent intent = new Intent();
-        intent.setComponent(new ComponentName(context.getPackageName(),
-                context.getPackageName() + ".ChildProcessLauncherTestHelperService"));
-        Assert.assertTrue(context.bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE));
+        // Test creating a launcher with queueIfNoFreeConnection false with no connection available.
+        Assert.assertNull(createChildProcessLauncher(mConnectionAllocator,
+                true /* setupConnection */, false /* queueIfNoFreeConnection */));
 
-        // Wait for the Helper service to connect.
-        CriteriaHelper.pollInstrumentationThread(
-                new Criteria("Failed to get helper service Messenger") {
-                    @Override
-                    public boolean isSatisfied() {
-                        return serviceConnection.mMessenger != null;
-                    }
-                });
+        // Stop one connection, that should free-up a connection and the first queued launcher
+        // should use it.
+        stopLauncher(launchers[0]);
+        waitUntilLauncherSetup(launchers[2]);
 
-        Assert.assertNotNull(serviceConnection.mMessenger);
+        // Last launcher is still queued.
+        Assert.assertNull(launchers[3].getConnection());
 
-        class ReplyHandler implements Handler.Callback {
-            Message mMessage;
-
-            @Override
-            public boolean handleMessage(Message msg) {
-                // Copy the message so its contents outlive this Binder transaction.
-                mMessage = Message.obtain();
-                mMessage.copyFrom(msg);
-                return true;
-            }
-        }
-        final ReplyHandler replyHandler = new ReplyHandler();
-
-        // Send a message to the Helper and wait for the reply. This will cause the slot 0
-        // sandboxed service connection to be bound by a different PID (i.e., not this process).
-        Message msg = Message.obtain(null, ChildProcessLauncherTestHelperService.MSG_BIND_SERVICE);
-        msg.replyTo = new Messenger(new Handler(Looper.getMainLooper(), replyHandler));
-        serviceConnection.mMessenger.send(msg);
-
-        CriteriaHelper.pollInstrumentationThread(
-                new Criteria("Failed waiting for helper service reply") {
-                    @Override
-                    public boolean isSatisfied() {
-                        return replyHandler.mMessage != null;
-                    }
-                });
-
-        // Verify that the Helper was able to launch the sandboxed service.
-        Assert.assertNotNull(replyHandler.mMessage);
-        Assert.assertEquals(ChildProcessLauncherTestHelperService.MSG_BIND_SERVICE_REPLY,
-                replyHandler.mMessage.what);
-        Assert.assertEquals(
-                "Connection slot from helper service is not 0", 0, replyHandler.mMessage.arg2);
-
-        final int helperConnectionPid = replyHandler.mMessage.arg1;
-        Assert.assertTrue(helperConnectionPid > 0);
-
-        // Launch a service from this process. Since slot 0 is already bound by the Helper, it
-        // will fail to start and the ChildProcessLauncher will retry and use the slot 1.
-        ChildProcessCreationParams creationParams = new ChildProcessCreationParams(
-                context.getPackageName(), false /* isExternalService */,
-                LibraryProcessType.PROCESS_CHILD, true /* bindToCallerCheck */);
-        ChildProcessLauncherHelper launcher = startSandboxedChildProcessWithCreationParams(
-                creationParams, BLOCK_UNTIL_SETUP, true /* doSetupConnection */);
-
-        final ChildProcessConnection retryConnection =
-                ChildProcessLauncherTestUtils.getConnection(launcher);
-        Assert.assertEquals(
-                1, ChildProcessLauncherTestUtils.getConnectionServiceNumber(retryConnection));
-
-        ChildConnectionAllocator connectionAllocator =
-                launcher.getChildConnectionAllocatorForTesting();
-
-        // Check that only two connections are created.
-        for (int i = 0; i < connectionAllocator.getNumberOfServices(); ++i) {
-            ChildProcessConnection sandboxedConn =
-                    connectionAllocator.getChildProcessConnectionAtSlotForTesting(i);
-            if (i <= 1) {
-                Assert.assertNotNull(sandboxedConn);
-                Assert.assertNotNull(
-                        ChildProcessLauncherTestUtils.getConnectionService(sandboxedConn));
-            } else {
-                Assert.assertNull(sandboxedConn);
-            }
-        }
-
-        Assert.assertEquals(
-                connectionAllocator.getChildProcessConnectionAtSlotForTesting(1), retryConnection);
-
-        ChildProcessConnection failedConnection =
-                connectionAllocator.getChildProcessConnectionAtSlotForTesting(0);
-        Assert.assertEquals(0, ChildProcessLauncherTestUtils.getConnectionPid(failedConnection));
-        Assert.assertFalse(ChildProcessLauncherTestUtils.getConnectionService(failedConnection)
-                                   .bindToCaller());
-
-        CriteriaHelper.pollInstrumentationThread(
-                new Criteria("Failed waiting retry connection to get pid") {
-                    @Override
-                    public boolean isSatisfied() {
-                        return ChildProcessLauncherTestUtils.getConnectionPid(retryConnection) > 0;
-                    }
-                });
-        Assert.assertTrue(ChildProcessLauncherTestUtils.getConnectionPid(retryConnection)
-                != helperConnectionPid);
-        Assert.assertTrue(
-                ChildProcessLauncherTestUtils.getConnectionService(retryConnection).bindToCaller());
+        // Crash another launcher. It should free-up another connection that the queued-up launcher
+        // should use.
+        connections[1].crashServiceForTesting();
+        waitUntilLauncherSetup(launchers[3]);
     }
 
-    private static void warmUpOnUiThreadBlocking(final Context context) {
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                ChildProcessLauncherHelper.warmUp(context);
-            }
-        });
-        ChildProcessConnection connection = getWarmUpConnection();
-        Assert.assertNotNull(connection);
-        blockUntilConnected(connection);
-    }
-
-    private void testWarmUpWithCreationParams(ChildProcessCreationParams creationParams) {
-        if (creationParams != null) {
-            ChildProcessCreationParams.registerDefault(creationParams);
-        }
-
-        Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
-        warmUpOnUiThreadBlocking(context);
-
-        Assert.assertEquals(1, getConnectedSandboxedServicesCount());
-
-        ChildProcessLauncherHelper launcherHelper = startSandboxedChildProcessWithCreationParams(
-                creationParams, BLOCK_UNTIL_SETUP, true /* doSetupConnection */);
-
-        // The warm-up connection was used, so no new process should have been created.
-        Assert.assertEquals(1, getConnectedSandboxedServicesCount());
-
-        int pid = getPid(launcherHelper);
-        Assert.assertNotEquals(0, pid);
-
-        stopProcess(launcherHelper);
-
-        waitForConnectedSandboxedServicesCount(0);
-        Assert.assertNull(ChildProcessLauncherHelper.getLauncherForPid(pid));
-    }
-
-    @Test
-    @MediumTest
-    @Feature({"ProcessManagement"})
-    public void testWarmUp() {
-        // Use the default creation parameters.
-        testWarmUpWithCreationParams(null /* creationParams */);
-    }
-
-    @Test
-    @MediumTest
-    @Feature({"ProcessManagement"})
-    public void testWarmUpWithBindToCaller() {
-        Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
-        ChildProcessCreationParams creationParams = new ChildProcessCreationParams(
-                context.getPackageName(), false /* isExternalService */,
-                LibraryProcessType.PROCESS_CHILD, true /* bindToCallerCheck */);
-        testWarmUpWithCreationParams(creationParams);
-    }
-
-    // Tests that the warm-up connection is freed from its allocator if it crashes.
-    @Test
-    @MediumTest
-    @Feature({"ProcessManagement"})
-    public void testWarmUpProcessCrashBeforeUse() throws RemoteException {
-        Assert.assertEquals(0, getConnectedSandboxedServicesCount());
-
-        Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
-        warmUpOnUiThreadBlocking(context);
-
-        Assert.assertEquals(1, getConnectedSandboxedServicesCount());
-
-        // Crash the warm-up connection before it gets used.
-        ChildProcessConnection connection = getWarmUpConnection();
-        Assert.assertNotNull(connection);
-        connection.crashServiceForTesting();
-
-        // It should get cleaned-up.
-        waitForConnectedSandboxedServicesCount(0);
-
-        // And subsequent process launches should work.
-        ChildProcessLauncherHelper launcher = startSandboxedChildProcess(
-                null /* packageName */, BLOCK_UNTIL_SETUP, true /* doSetupConnection */);
-        Assert.assertEquals(1, getConnectedSandboxedServicesCount());
-        Assert.assertNotNull(ChildProcessLauncherTestUtils.getConnection(launcher));
-    }
-
-    // Tests that the warm-up connection is freed from its allocator if it crashes after being used.
-    @Test
-    @MediumTest
-    @Feature({"ProcessManagement"})
-    public void testWarmUpProcessCrashAfterUse() throws RemoteException {
-        Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
-        warmUpOnUiThreadBlocking(context);
-
-        Assert.assertEquals(1, getConnectedSandboxedServicesCount());
-
-        ChildProcessLauncherHelper launcherHelper = startSandboxedChildProcessWithCreationParams(
-                null /* creationParams */, BLOCK_UNTIL_SETUP, true /* doSetupConnection */);
-
-        // The warm-up connection was used, so no new process should have been created.
-        Assert.assertEquals(1, getConnectedSandboxedServicesCount());
-
-        int pid = getPid(launcherHelper);
-        Assert.assertNotEquals(0, pid);
-
-        ChildProcessConnection connection = retrieveConnection(launcherHelper);
-        connection.crashServiceForTesting();
-
-        waitForConnectedSandboxedServicesCount(0);
-        Assert.assertNull(ChildProcessLauncherHelper.getLauncherForPid(pid));
-    }
-
-    @Test
-    @MediumTest
-    @Feature({"ProcessManagement"})
-    public void testSandboxedAllocatorFreed() {
-        final String packageName =
-                InstrumentationRegistry.getInstrumentation().getTargetContext().getPackageName();
-
-        ChildProcessLauncherHelper launcher = startSandboxedChildProcess(
-                null /* packageName */, BLOCK_UNTIL_SETUP, true /* doSetupConnection */);
-
-        Assert.assertTrue(hasSandboxedConnectionAllocatorForPackage(packageName));
-
-        stopProcess(launcher);
-
-        // Poll until allocator is removed. Need to poll here because actually freeing a connection
-        // from allocator is a posted task, rather than a direct call from stop.
-        CriteriaHelper.pollInstrumentationThread(
-                new Criteria("The connection allocator was not removed.") {
-                    @Override
-                    public boolean isSatisfied() {
-                        return !hasSandboxedConnectionAllocatorForPackage(packageName);
-                    }
-                });
-    }
-
-    @Test
-    @MediumTest
-    @Feature({"ProcessManagement"})
-    @ChildProcessAllocatorSettings(sandboxedServiceCount = 4)
-    public void testCustomCreationParamDoesNotReuseWarmupConnection() {
-        // Since warmUp only uses default params.
-        final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
-        ChildProcessCreationParams defaultCreationParams =
-                getDefaultChildProcessCreationParams(context.getPackageName());
-        ChildProcessCreationParams.registerDefault(defaultCreationParams);
-        ChildProcessCreationParams otherCreationParams = getDefaultChildProcessCreationParams(
-                InstrumentationRegistry.getInstrumentation().getContext().getPackageName());
-
-        warmUpOnUiThreadBlocking(context);
-        Assert.assertEquals(1, getConnectedSandboxedServicesCount());
-
-        // First create a connnection with different creation params than the default, it should not
-        // use the warmup connection (note that it won't bind since we are using the wrong package,
-        // but we need to use a different package to differentiate them, and we can only have 1
-        // valid package per app).
-        startSandboxedChildProcessWithCreationParams(
-                otherCreationParams, DONT_BLOCK, false /* doSetupConnection */);
-        Assert.assertNotNull(getWarmUpConnection());
-
-        // Then start a process with the default creation params, the warmup-connection should be
-        // used.
-        startSandboxedChildProcessWithCreationParams(
-                defaultCreationParams, BLOCK_UNTIL_SETUP, true /* doSetupConnection */);
-        Assert.assertNull(getWarmUpConnection());
-    }
-
-    @Test
-    @MediumTest
-    @Feature({"ProcessManagement"})
-    public void testUseStrongBindingConnection() {
-        // Since warmUp only uses default params.
-        Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
-        ChildProcessCreationParams creationParams = new ChildProcessCreationParams(
-                context.getPackageName(), false /* isExternalService */,
-                LibraryProcessType.PROCESS_CHILD, true /* bindToCallerCheck */);
-
-        for (final boolean sandboxed : new boolean[] {true, false}) {
-            ChildProcessLauncherHelper launcher = ChildProcessLauncherTestUtils.startForTesting(
-                    sandboxed, sProcessWaitArguments, new FileDescriptorInfo[0], creationParams,
-                    true /* doSetupConnection */);
-            final ChildProcessConnection connection =
-                    ChildProcessLauncherTestUtils.getConnection(launcher);
-            Assert.assertNotNull(connection);
-            ChildProcessLauncherTestUtils.runOnLauncherThreadBlocking(new Runnable() {
-                @Override
-                public void run() {
-                    // Only non sandboxed connections should use strong bindings.
-                    Assert.assertNotEquals(sandboxed, connection.isStrongBindingBound());
-                }
-            });
-        }
-    }
-
-    @Test
-    @MediumTest
-    @Feature({"ProcessManagement"})
-    public void testLauncherCleanup() throws RemoteException {
-        ChildProcessLauncherHelper launcher = startSandboxedChildProcess(
-                null /* packageName */, BLOCK_UNTIL_SETUP, true /* doSetupConnection */);
-        int pid = getPid(launcher);
-        Assert.assertNotEquals(0, pid);
-        Assert.assertNotNull(ChildProcessLauncherHelper.getLauncherForPid(pid));
-
-        // Stop the process explicitly, the launcher should get cleared.
-        stopProcess(launcher);
-        waitForConnectedSandboxedServicesCount(0);
-        Assert.assertNull(ChildProcessLauncherHelper.getLauncherForPid(pid));
-
-        launcher = startSandboxedChildProcess(
-                null /* packageName */, BLOCK_UNTIL_SETUP, true /* doSetupConnection */);
-        pid = getPid(launcher);
-        Assert.assertNotEquals(0, pid);
-        Assert.assertNotNull(ChildProcessLauncherHelper.getLauncherForPid(pid));
-
-        // This time crash the connection, the launcher should also get cleared.
-        ChildProcessConnection connection = retrieveConnection(launcher);
-        connection.crashServiceForTesting();
-        waitForConnectedSandboxedServicesCount(0);
-        Assert.assertNull(ChildProcessLauncherHelper.getLauncherForPid(pid));
-    }
-
-    private static ChildProcessLauncherHelper startSandboxedChildProcess(
-            final String packageName, int blockingPolicy, final boolean doSetupConnection) {
-        ChildProcessCreationParams creationParams =
-                packageName == null ? null : getDefaultChildProcessCreationParams(packageName);
-        return startSandboxedChildProcessWithCreationParams(
-                creationParams, blockingPolicy, doSetupConnection);
-    }
-
-    private static ChildProcessLauncherHelper startSandboxedChildProcessWithCreationParams(
-            final ChildProcessCreationParams creationParams, int blockingPolicy,
-            final boolean doSetupConnection) {
-        assert doSetupConnection || blockingPolicy != BLOCK_UNTIL_SETUP;
-        ChildProcessLauncherHelper launcher =
-                ChildProcessLauncherTestUtils.runOnLauncherAndGetResult(
-                        new Callable<ChildProcessLauncherHelper>() {
-                            @Override
-                            public ChildProcessLauncherHelper call() {
-                                return ChildProcessLauncherHelper.createAndStartForTesting(
-                                        creationParams, sProcessWaitArguments,
-                                        new FileDescriptorInfo[0], true /* sandboxed */,
-                                        null /* binderCallback */, doSetupConnection);
-                            }
-                        });
-        if (blockingPolicy != DONT_BLOCK) {
-            assert blockingPolicy == BLOCK_UNTIL_CONNECTED || blockingPolicy == BLOCK_UNTIL_SETUP;
-            blockUntilConnected(launcher);
-            if (blockingPolicy == BLOCK_UNTIL_SETUP) {
-                blockUntilSetup(launcher);
-            }
-        }
-        return launcher;
-    }
-
-    private static void blockUntilConnected(final ChildProcessLauncherHelper launcher) {
-        CriteriaHelper.pollInstrumentationThread(
-                new Criteria("The connection wasn't established.") {
-                    @Override
-                    public boolean isSatisfied() {
-                        return launcher.getConnection() != null
-                                && launcher.getConnection().isConnected();
-                    }
-                });
-    }
-
-    private static void blockUntilConnected(final ChildProcessConnection connection) {
-        CriteriaHelper.pollInstrumentationThread(
-                new Criteria("The connection wasn't established.") {
-                    @Override
-                    public boolean isSatisfied() {
-                        return connection.isConnected();
-                    }
-                });
-    }
-
-    private static void blockUntilSetup(final ChildProcessLauncherHelper launcher) {
-        CriteriaHelper.pollInstrumentationThread(
-                new Criteria("The connection wasn't established.") {
-                    @Override
-                    public boolean isSatisfied() {
-                        return getPid(launcher) != 0;
-                    }
-                });
-    }
-
-    private static ChildConnectionAllocator getChildConnectionAllocator(
-            final Context context, final String packageName, final boolean sandboxed) {
+    private static ChildProcessLauncher createChildProcessLauncher(
+            final ChildConnectionAllocator connectionAllocator, final boolean setupConnection,
+            final boolean queueIfNoFreeConnection) {
         return ChildProcessLauncherTestUtils.runOnLauncherAndGetResult(
-                new Callable<ChildConnectionAllocator>() {
+                new Callable<ChildProcessLauncher>() {
                     @Override
-                    public ChildConnectionAllocator call() {
-                        return ChildProcessLauncherHelper.getConnectionAllocator(context,
-                                getDefaultChildProcessCreationParams(packageName), sandboxed);
+                    public ChildProcessLauncher call() {
+                        ChildProcessLauncher processLauncher =
+                                ChildProcessLauncher.createWithConnectionAllocator(
+                                        EMPTY_LAUNCHER_DELEGATE, new String[0],
+                                        new FileDescriptorInfo[0], connectionAllocator,
+                                        null /* binderCallback */);
+                        if (!processLauncher.start(setupConnection, queueIfNoFreeConnection)) {
+                            return null;
+                        }
+                        return processLauncher;
                     }
                 });
     }
 
-    // Returns the number of sandboxed connection currently connected,
-    private static int getConnectedSandboxedServicesCount() {
-        return getConnectedSandboxedServicesCountForPackage(null /* packageName */);
-    }
-
-    // Returns the number of sandboxed connection matching the specificed package name that are
-    // connected,
-    private static int getConnectedSandboxedServicesCountForPackage(final String packageName) {
-        return ChildProcessLauncherTestUtils.runOnLauncherAndGetResult(
-                new Callable<Integer>() {
-                    @Override
-                    public Integer call() {
-                        return ChildProcessLauncherHelper
-                                .getConnectedSandboxedServicesCountForTesting(packageName);
-                    }
-                });
-    }
-
-    // Blocks until the number of sandboxed connections reaches targetCount.
-    private static void waitForConnectedSandboxedServicesCount(int targetCount) {
+    private static void waitForConnectionAllocatorState(
+            final ChildConnectionAllocator connectionAllocator, final boolean emptyState) {
         CriteriaHelper.pollInstrumentationThread(
-                Criteria.equals(targetCount, new Callable<Integer>() {
-                    @Override
-                    public Integer call() {
-                        return getConnectedSandboxedServicesCountForPackage(null /* packageName */);
-                    }
-                }));
-    }
-
-    private static ChildProcessCreationParams getDefaultChildProcessCreationParams(
-            String packageName) {
-        return packageName == null
-                ? null
-                : new ChildProcessCreationParams(packageName, false /* isExternalService */,
-                          LibraryProcessType.PROCESS_CHILD, false /* bindToCallerCheck */);
-    }
-
-    private static boolean hasSandboxedConnectionAllocatorForPackage(final String packageName) {
-        return ChildProcessLauncherTestUtils.runOnLauncherAndGetResult(new Callable<Boolean>() {
-            @Override
-            public Boolean call() {
-                return ChildProcessLauncherHelper.hasSandboxedConnectionAllocatorForPackage(
-                        packageName);
-            }
-        });
-    }
-
-    private static ChildProcessConnection retrieveConnection(
-            final ChildProcessLauncherHelper launcherHelper) {
-        CriteriaHelper.pollInstrumentationThread(
-                new Criteria("Failed waiting for child process to connect") {
+                new Criteria("Failed to wait for connection allocator.") {
                     @Override
                     public boolean isSatisfied() {
-                        return ChildProcessLauncherTestUtils.getConnection(launcherHelper) != null;
+                        return emptyState ? !connectionAllocator.anyConnectionAllocated()
+                                          : connectionAllocator.anyConnectionAllocated();
                     }
                 });
-
-        return ChildProcessLauncherTestUtils.getConnection(launcherHelper);
     }
 
-    private static void stopProcess(ChildProcessLauncherHelper launcherHelper) {
-        final ChildProcessConnection connection = retrieveConnection(launcherHelper);
-        ChildProcessLauncherTestUtils.runOnLauncherThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                ChildProcessLauncherHelper.stop(connection.getPid());
-            }
-        });
+    private static void waitForConnectionState(
+            final ChildProcessConnection connection, final int connectionState) {
+        assert connectionState == CONNECTION_BLOCK_UNTIL_CONNECTED
+                || connectionState == CONNECTION_BLOCK_UNTIL_SETUP;
+        CriteriaHelper.pollInstrumentationThread(
+                new Criteria("Failed wait for connection to connect.") {
+                    @Override
+                    public boolean isSatisfied() {
+                        if (connectionState == CONNECTION_BLOCK_UNTIL_CONNECTED) {
+                            return connection.isConnected();
+                        }
+                        assert connectionState == CONNECTION_BLOCK_UNTIL_SETUP;
+                        return getConnectionPid(connection) != 0;
+                    }
+                });
     }
 
-    private static int getPid(final ChildProcessLauncherHelper launcherHelper) {
+    private static void waitUntilLauncherSetup(final ChildProcessLauncher launcher) {
+        CriteriaHelper.pollInstrumentationThread(
+                new Criteria("Failed wait for launcher to connect.") {
+                    @Override
+                    public boolean isSatisfied() {
+                        return launcher.getConnection() != null;
+                    }
+                });
+        waitForConnectionState(launcher.getConnection(), CONNECTION_BLOCK_UNTIL_SETUP);
+    }
+
+    private static int getConnectionPid(final ChildProcessConnection connection) {
         return ChildProcessLauncherTestUtils.runOnLauncherAndGetResult(new Callable<Integer>() {
             @Override
             public Integer call() {
-                return launcherHelper.getPid();
+                return connection.getPid();
             }
         });
     }
 
-    private static ChildProcessConnection getWarmUpConnection() {
-        return ChildProcessLauncherTestUtils.runOnLauncherAndGetResult(
-                new Callable<ChildProcessConnection>() {
-                    @Override
-                    public ChildProcessConnection call() {
-                        return ChildProcessLauncherHelper.getWarmUpConnectionForTesting();
-                    }
-                });
+    private static void stopLauncher(final ChildProcessLauncher launcher) {
+        ChildProcessLauncherTestUtils.runOnLauncherThreadBlocking(new Runnable() {
+            @Override
+            public void run() {
+                launcher.stop();
+            }
+        });
     }
 }
diff --git a/content/public/browser/BUILD.gn b/content/public/browser/BUILD.gn
index d29dd4f6..df45385 100644
--- a/content/public/browser/BUILD.gn
+++ b/content/public/browser/BUILD.gn
@@ -87,6 +87,8 @@
     "content_browser_client.h",
     "context_factory.h",
     "cookie_store_factory.h",
+    "desktop_capture.cc",
+    "desktop_capture.h",
     "desktop_media_id.cc",
     "desktop_media_id.h",
     "devtools_agent_host.h",
@@ -326,6 +328,7 @@
     "//ui/events",
     "//ui/gl",
     "//ui/surface",
+    "//third_party/webrtc/modules/desktop_capture",
   ]
 
   allow_circular_includes_from = [
diff --git a/content/public/browser/DEPS b/content/public/browser/DEPS
index f6f0e3bb..b1bf25da 100644
--- a/content/public/browser/DEPS
+++ b/content/public/browser/DEPS
@@ -13,4 +13,10 @@
     # file will be moved elsewhere. See http://crbug.com/598073.
     "!content/browser/loader/resource_dispatcher_host_impl.h",
   ],
+
+  "desktop_capture\.h": [
+    # desktop_capture.h creates a DesktopCaptureOptions to share between
+    # content/browser and chrome/browser.
+    "+third_party/webrtc/modules/desktop_capture/desktop_capture_options.h",
+  ],
 }
diff --git a/content/public/browser/desktop_capture.cc b/content/public/browser/desktop_capture.cc
new file mode 100644
index 0000000..139ea14a
--- /dev/null
+++ b/content/public/browser/desktop_capture.cc
@@ -0,0 +1,30 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/public/browser/desktop_capture.h"
+
+#include "base/feature_list.h"
+#include "build/build_config.h"
+
+namespace content {
+
+webrtc::DesktopCaptureOptions CreateDesktopCaptureOptions() {
+  auto options = webrtc::DesktopCaptureOptions::CreateDefault();
+  // Leave desktop effects enabled during WebRTC captures.
+  options.set_disable_effects(false);
+#if defined(OS_WIN)
+  static constexpr base::Feature kDirectXCapturer{
+      "DirectXCapturer",
+      base::FEATURE_ENABLED_BY_DEFAULT};
+  if (base::FeatureList::IsEnabled(kDirectXCapturer)) {
+    options.set_allow_directx_capturer(true);
+    options.set_allow_use_magnification_api(false);
+  } else {
+    options.set_allow_use_magnification_api(true);
+  }
+#endif  // defined(OS_WIN)
+  return options;
+}
+
+}  // namespace content
diff --git a/content/public/browser/desktop_capture.h b/content/public/browser/desktop_capture.h
new file mode 100644
index 0000000..1b44477
--- /dev/null
+++ b/content/public/browser/desktop_capture.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 CONTENT_PUBLIC_BROWSER_DESKTOP_CAPTURE_H_
+#define CONTENT_PUBLIC_BROWSER_DESKTOP_CAPTURE_H_
+
+#include "content/common/content_export.h"
+#include "third_party/webrtc/modules/desktop_capture/desktop_capture_options.h"
+
+namespace content {
+
+// Creates a DesktopCaptureOptions with required settings.
+CONTENT_EXPORT webrtc::DesktopCaptureOptions CreateDesktopCaptureOptions();
+
+}  // namespace content
+
+#endif  // CONTENT_PUBLIC_BROWSER_DESKTOP_CAPTURE_H_
diff --git a/content/public/browser/provision_fetcher_impl.cc b/content/public/browser/provision_fetcher_impl.cc
index 1663f3e..ddfcc14 100644
--- a/content/public/browser/provision_fetcher_impl.cc
+++ b/content/public/browser/provision_fetcher_impl.cc
@@ -32,19 +32,19 @@
 
 void ProvisionFetcherImpl::Retrieve(const std::string& default_url,
                                     const std::string& request_data,
-                                    const RetrieveCallback& callback) {
+                                    RetrieveCallback callback) {
   DVLOG(1) << __FUNCTION__ << ": " << default_url;
   provision_fetcher_->Retrieve(
       default_url, request_data,
       base::Bind(&ProvisionFetcherImpl::OnResponse, weak_factory_.GetWeakPtr(),
-                 callback));
+                 base::Passed(&callback)));
 }
 
-void ProvisionFetcherImpl::OnResponse(const RetrieveCallback& callback,
+void ProvisionFetcherImpl::OnResponse(RetrieveCallback callback,
                                       bool success,
                                       const std::string& response) {
   DVLOG(1) << __FUNCTION__ << ": " << success;
-  callback.Run(success, response);
+  std::move(callback).Run(success, response);
 }
 
 }  // namespace content
diff --git a/content/public/browser/provision_fetcher_impl.h b/content/public/browser/provision_fetcher_impl.h
index b3d63023..a37d9ee 100644
--- a/content/public/browser/provision_fetcher_impl.h
+++ b/content/public/browser/provision_fetcher_impl.h
@@ -40,11 +40,11 @@
   // media::mojom::ProvisionFetcher implementation.
   void Retrieve(const std::string& default_url,
                 const std::string& request_data,
-                const RetrieveCallback& callback) final;
+                RetrieveCallback callback) final;
 
  private:
   // Callback for media::ProvisionFetcher::Retrieve().
-  void OnResponse(const RetrieveCallback& callback,
+  void OnResponse(RetrieveCallback callback,
                   bool success,
                   const std::string& response);
 
diff --git a/content/public/renderer/render_frame_observer.h b/content/public/renderer/render_frame_observer.h
index 8bb72a3..48b932e 100644
--- a/content/public/renderer/render_frame_observer.h
+++ b/content/public/renderer/render_frame_observer.h
@@ -24,6 +24,7 @@
 class WebNode;
 class WebString;
 struct WebURLError;
+class WebWorkerFetchContext;
 }
 
 namespace content {
@@ -127,6 +128,9 @@
   // Called when draggable regions change.
   virtual void DraggableRegionsChanged() {}
 
+  // Called when a worker fetch context will be created.
+  virtual void WillCreateWorkerFetchContext(blink::WebWorkerFetchContext*) {}
+
   // IPC::Listener implementation.
   bool OnMessageReceived(const IPC::Message& message) override;
 
diff --git a/content/public/test/web_contents_tester.h b/content/public/test/web_contents_tester.h
index 9918445..f3f802f 100644
--- a/content/public/test/web_contents_tester.h
+++ b/content/public/test/web_contents_tester.h
@@ -151,6 +151,9 @@
       int http_status_code,
       const std::vector<SkBitmap>& bitmaps,
       const std::vector<gfx::Size>& original_bitmap_sizes) = 0;
+
+  // Sets the return value of GetLastCommittedUrl() of TestWebContents.
+  virtual void SetLastCommittedURL(const GURL& url) = 0;
 };
 
 }  // namespace content
diff --git a/content/renderer/browser_plugin/browser_plugin.cc b/content/renderer/browser_plugin/browser_plugin.cc
index 301ea0e..a532eff 100644
--- a/content/renderer/browser_plugin/browser_plugin.cc
+++ b/content/renderer/browser_plugin/browser_plugin.cc
@@ -589,7 +589,7 @@
 
   std::vector<blink::WebCompositionUnderline> std_underlines;
   for (size_t i = 0; i < underlines.size(); ++i) {
-    std_underlines.push_back(std_underlines[i]);
+    std_underlines.push_back(underlines[i]);
   }
   gfx::Range replacement_range =
       replacementRange.IsNull()
diff --git a/content/renderer/gpu/render_widget_compositor.cc b/content/renderer/gpu/render_widget_compositor.cc
index 46049eac..29447582 100644
--- a/content/renderer/gpu/render_widget_compositor.cc
+++ b/content/renderer/gpu/render_widget_compositor.cc
@@ -474,7 +474,7 @@
     // and are disabled for Android WebView as it doesn't support the format.
     if (!cmd.HasSwitch(switches::kDisableRGBA4444Textures) &&
         base::SysInfo::AmountOfPhysicalMemoryMB() <= 512)
-      settings.preferred_tile_format = cc::RGBA_4444;
+      settings.preferred_tile_format = viz::RGBA_4444;
   } else {
     // On other devices we have increased memory excessively to avoid
     // raster-on-demand already, so now we reserve 50% _only_ to avoid
@@ -522,11 +522,11 @@
 
   if (cmd.HasSwitch(switches::kEnableRGBA4444Textures) &&
       !cmd.HasSwitch(switches::kDisableRGBA4444Textures)) {
-    settings.preferred_tile_format = cc::RGBA_4444;
+    settings.preferred_tile_format = viz::RGBA_4444;
   }
 
   if (cmd.HasSwitch(cc::switches::kEnableTileCompression)) {
-    settings.preferred_tile_format = cc::ETC1;
+    settings.preferred_tile_format = viz::ETC1;
   }
 
   settings.max_staging_buffer_usage_in_bytes = 32 * 1024 * 1024;  // 32MB
diff --git a/content/renderer/media/audio_renderer_sink_cache_impl.cc b/content/renderer/media/audio_renderer_sink_cache_impl.cc
index 7cbfe8b..157fd88460 100644
--- a/content/renderer/media/audio_renderer_sink_cache_impl.cc
+++ b/content/renderer/media/audio_renderer_sink_cache_impl.cc
@@ -173,8 +173,9 @@
 void AudioRendererSinkCacheImpl::DeleteLaterIfUnused(
     const media::AudioRendererSink* sink_ptr) {
   task_runner_->PostDelayedTask(
-      FROM_HERE, base::Bind(&AudioRendererSinkCacheImpl::DeleteSink, weak_this_,
-                            sink_ptr, false /*do not delete if used*/),
+      FROM_HERE,
+      base::Bind(&AudioRendererSinkCacheImpl::DeleteSink, weak_this_,
+                 base::RetainedRef(sink_ptr), false /*do not delete if used*/),
       delete_timeout_);
 }
 
diff --git a/content/renderer/media/gpu/rtc_video_encoder.cc b/content/renderer/media/gpu/rtc_video_encoder.cc
index 2185d7e..dc153db4 100644
--- a/content/renderer/media/gpu/rtc_video_encoder.cc
+++ b/content/renderer/media/gpu/rtc_video_encoder.cc
@@ -100,6 +100,16 @@
   return true;
 }
 
+void RecordInitEncodeUMA(int32_t init_retval,
+                         media::VideoCodecProfile profile) {
+  UMA_HISTOGRAM_BOOLEAN("Media.RTCVideoEncoderInitEncodeSuccess",
+                        init_retval == WEBRTC_VIDEO_CODEC_OK);
+  if (init_retval != WEBRTC_VIDEO_CODEC_OK)
+    return;
+  UMA_HISTOGRAM_ENUMERATION("Media.RTCVideoEncoderProfile", profile,
+                            media::VIDEO_CODEC_PROFILE_MAX + 1);
+}
+
 }  // namespace
 
 // This private class of RTCVideoEncoder does the actual work of communicating
@@ -154,7 +164,7 @@
   // Return the status of Impl. One of WEBRTC_VIDEO_CODEC_XXX value.
   int32_t GetStatus() const;
 
-  webrtc::VideoCodecType video_codec_type() { return video_codec_type_; }
+  webrtc::VideoCodecType video_codec_type() const { return video_codec_type_; }
 
   // media::VideoEncodeAccelerator::Client implementation.
   void RequireBitstreamBuffers(unsigned int input_count,
@@ -309,7 +319,7 @@
     media::VideoCodecProfile profile,
     base::WaitableEvent* async_waiter,
     int32_t* async_retval) {
-  DVLOG(3) << "Impl::CreateAndInitializeVEA()";
+  DVLOG(3) << __func__;
   DCHECK(thread_checker_.CalledOnValidThread());
 
   SetStatus(WEBRTC_VIDEO_CODEC_UNINITIALIZED);
@@ -340,7 +350,7 @@
                                     bool force_keyframe,
                                     base::WaitableEvent* async_waiter,
                                     int32_t* async_retval) {
-  DVLOG(3) << "Impl::Enqueue()";
+  DVLOG(3) << __func__;
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK(!input_next_frame_);
 
@@ -383,8 +393,7 @@
 
 void RTCVideoEncoder::Impl::UseOutputBitstreamBufferId(
     int32_t bitstream_buffer_id) {
-  DVLOG(3) << "Impl::UseOutputBitstreamBufferIndex(): "
-              "bitstream_buffer_id=" << bitstream_buffer_id;
+  DVLOG(3) << __func__ << " bitstream_buffer_id=" << bitstream_buffer_id;
   DCHECK(thread_checker_.CalledOnValidThread());
   if (video_encoder_) {
     video_encoder_->UseOutputBitstreamBuffer(media::BitstreamBuffer(
@@ -398,8 +407,7 @@
 void RTCVideoEncoder::Impl::RequestEncodingParametersChange(
     uint32_t bitrate,
     uint32_t framerate) {
-  DVLOG(3) << "Impl::RequestEncodingParametersChange(): bitrate=" << bitrate
-           << ", framerate=" << framerate;
+  DVLOG(3) << __func__ << " bitrate=" << bitrate << ", framerate=" << framerate;
   DCHECK(thread_checker_.CalledOnValidThread());
 
   // Check for overflow converting bitrate (kilobits/sec) to bits/sec.
@@ -411,7 +419,7 @@
 }
 
 void RTCVideoEncoder::Impl::Destroy(base::WaitableEvent* async_waiter) {
-  DVLOG(3) << "Impl::Destroy()";
+  DVLOG(3) << __func__;
   DCHECK(thread_checker_.CalledOnValidThread());
   RecordTimestampMatchUMA();
   if (video_encoder_) {
@@ -440,7 +448,7 @@
     unsigned int input_count,
     const gfx::Size& input_coded_size,
     size_t output_buffer_size) {
-  DVLOG(3) << "Impl::RequireBitstreamBuffers(): input_count=" << input_count
+  DVLOG(3) << __func__ << " input_count=" << input_count
            << ", input_coded_size=" << input_coded_size.ToString()
            << ", output_buffer_size=" << output_buffer_size;
   DCHECK(thread_checker_.CalledOnValidThread());
@@ -489,9 +497,8 @@
                                                  size_t payload_size,
                                                  bool key_frame,
                                                  base::TimeDelta timestamp) {
-  DVLOG(3) << "Impl::BitstreamBufferReady(): bitstream_buffer_id="
-           << bitstream_buffer_id << ", payload_size=" << payload_size
-           << ", key_frame=" << key_frame
+  DVLOG(3) << __func__ << " bitstream_buffer_id=" << bitstream_buffer_id
+           << ", payload_size=" << payload_size << ", key_frame=" << key_frame
            << ", timestamp ms=" << timestamp.InMilliseconds();
   DCHECK(thread_checker_.CalledOnValidThread());
 
@@ -726,7 +733,7 @@
     int32_t* async_retval,
     webrtc::EncodedImageCallback* callback) {
   DCHECK(thread_checker_.CalledOnValidThread());
-  DVLOG(3) << "RegisterEncodeCompleteCallback()";
+  DVLOG(3) << __func__;
   RegisterAsyncWaiter(async_waiter, async_retval);
   int32_t retval = GetStatus();
   if (retval == WEBRTC_VIDEO_CODEC_OK)
@@ -739,8 +746,7 @@
     int32_t bitstream_buffer_id,
     uint16_t picture_id) {
   DCHECK(thread_checker_.CalledOnValidThread());
-  DVLOG(3) << "ReturnEncodedImage(): "
-           << "bitstream_buffer_id=" << bitstream_buffer_id
+  DVLOG(3) << __func__ << " bitstream_buffer_id=" << bitstream_buffer_id
            << ", picture_id=" << picture_id;
 
   if (!encoded_image_callback_)
@@ -797,11 +803,11 @@
     : video_codec_type_(type),
       gpu_factories_(gpu_factories),
       gpu_task_runner_(gpu_factories->GetTaskRunner()) {
-  DVLOG(1) << "RTCVideoEncoder(): codec type=" << type;
+  DVLOG(1) << __func__ << " codec type=" << type;
 }
 
 RTCVideoEncoder::~RTCVideoEncoder() {
-  DVLOG(3) << "~RTCVideoEncoder";
+  DVLOG(3) << __func__;
   Release();
   DCHECK(!impl_.get());
 }
@@ -809,14 +815,12 @@
 int32_t RTCVideoEncoder::InitEncode(const webrtc::VideoCodec* codec_settings,
                                     int32_t number_of_cores,
                                     size_t max_payload_size) {
-  DVLOG(1) << "InitEncode(): codecType=" << codec_settings->codecType
+  DVLOG(1) << __func__ << " codecType=" << codec_settings->codecType
            << ", width=" << codec_settings->width
            << ", height=" << codec_settings->height
            << ", startBitrate=" << codec_settings->startBitrate;
-  if (impl_) {
-    DVLOG(1) << "Release because of reinitialization";
+  if (impl_)
     Release();
-  }
 
   impl_ = new Impl(gpu_factories_, video_codec_type_);
   const media::VideoCodecProfile profile = WebRTCVideoCodecToVideoCodecProfile(
@@ -846,7 +850,7 @@
     const webrtc::VideoFrame& input_image,
     const webrtc::CodecSpecificInfo* codec_specific_info,
     const std::vector<webrtc::FrameType>* frame_types) {
-  DVLOG(3) << "Encode()";
+  DVLOG(3) << __func__;
   if (!impl_.get()) {
     DVLOG(3) << "Encoder is not initialized";
     return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
@@ -875,7 +879,7 @@
 
 int32_t RTCVideoEncoder::RegisterEncodeCompleteCallback(
     webrtc::EncodedImageCallback* callback) {
-  DVLOG(3) << "RegisterEncodeCompleteCallback()";
+  DVLOG(3) << __func__;
   if (!impl_.get()) {
     DVLOG(3) << "Encoder is not initialized";
     return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
@@ -894,7 +898,7 @@
 }
 
 int32_t RTCVideoEncoder::Release() {
-  DVLOG(3) << "Release()";
+  DVLOG(3) << __func__;
   if (!impl_.get())
     return WEBRTC_VIDEO_CODEC_OK;
 
@@ -911,14 +915,13 @@
 
 int32_t RTCVideoEncoder::SetChannelParameters(uint32_t packet_loss,
                                               int64_t rtt) {
-  DVLOG(3) << "SetChannelParameters(): packet_loss=" << packet_loss
-           << ", rtt=" << rtt;
+  DVLOG(3) << __func__ << " packet_loss=" << packet_loss << ", rtt=" << rtt;
   // Ignored.
   return WEBRTC_VIDEO_CODEC_OK;
 }
 
 int32_t RTCVideoEncoder::SetRates(uint32_t new_bit_rate, uint32_t frame_rate) {
-  DVLOG(3) << "SetRates(): new_bit_rate=" << new_bit_rate
+  DVLOG(3) << __func__ << " new_bit_rate=" << new_bit_rate
            << ", frame_rate=" << frame_rate;
   if (!impl_.get()) {
     DVLOG(3) << "Encoder is not initialized";
@@ -927,7 +930,7 @@
 
   const int32_t retval = impl_->GetStatus();
   if (retval != WEBRTC_VIDEO_CODEC_OK) {
-    DVLOG(3) << "SetRates(): returning " << retval;
+    DVLOG(3) << __func__ << " returning " << retval;
     return retval;
   }
 
@@ -944,15 +947,4 @@
   return true;
 }
 
-void RTCVideoEncoder::RecordInitEncodeUMA(
-    int32_t init_retval, media::VideoCodecProfile profile) {
-  UMA_HISTOGRAM_BOOLEAN("Media.RTCVideoEncoderInitEncodeSuccess",
-                        init_retval == WEBRTC_VIDEO_CODEC_OK);
-  if (init_retval == WEBRTC_VIDEO_CODEC_OK) {
-    UMA_HISTOGRAM_ENUMERATION("Media.RTCVideoEncoderProfile",
-                              profile,
-                              media::VIDEO_CODEC_PROFILE_MAX + 1);
-  }
-}
-
 }  // namespace content
diff --git a/content/renderer/media/gpu/rtc_video_encoder.h b/content/renderer/media/gpu/rtc_video_encoder.h
index bef4f21c..390dc7b 100644
--- a/content/renderer/media/gpu/rtc_video_encoder.h
+++ b/content/renderer/media/gpu/rtc_video_encoder.h
@@ -65,9 +65,6 @@
   class Impl;
   friend class RTCVideoEncoder::Impl;
 
-  void RecordInitEncodeUMA(int32_t init_retval,
-                           media::VideoCodecProfile profile);
-
   // The video codec type, as reported to WebRTC.
   const webrtc::VideoCodecType video_codec_type_;
 
diff --git a/content/renderer/media/mojo_audio_output_ipc_unittest.cc b/content/renderer/media/mojo_audio_output_ipc_unittest.cc
index a88c8da..bfb02beb 100644
--- a/content/renderer/media/mojo_audio_output_ipc_unittest.cc
+++ b/content/renderer/media/mojo_audio_output_ipc_unittest.cc
@@ -139,7 +139,7 @@
 
   void Acquire(media::mojom::AudioOutputStreamRequest stream_request,
                const media::AudioParameters& params,
-               const AcquireCallback& callback) override {
+               AcquireCallback callback) override {
     EXPECT_EQ(binding_, base::nullopt);
     EXPECT_NE(stream_, nullptr);
     binding_.emplace(stream_, std::move(stream_request));
diff --git a/content/renderer/mojo/blink_interface_provider_impl.cc b/content/renderer/mojo/blink_interface_provider_impl.cc
index 251de34..95cb7bf 100644
--- a/content/renderer/mojo/blink_interface_provider_impl.cc
+++ b/content/renderer/mojo/blink_interface_provider_impl.cc
@@ -23,14 +23,6 @@
   weak_ptr_ = weak_ptr_factory_.GetWeakPtr();
 }
 
-BlinkInterfaceProviderImpl::BlinkInterfaceProviderImpl(
-    base::WeakPtr<service_manager::InterfaceProvider> remote_interfaces)
-    : remote_interfaces_(remote_interfaces),
-      main_thread_task_runner_(base::ThreadTaskRunnerHandle::Get()),
-      weak_ptr_factory_(this) {
-  weak_ptr_ = weak_ptr_factory_.GetWeakPtr();
-}
-
 BlinkInterfaceProviderImpl::~BlinkInterfaceProviderImpl() = default;
 
 void BlinkInterfaceProviderImpl::GetInterface(
@@ -49,14 +41,10 @@
     return;
   }
 
-  if (connector_) {
-    connector_->BindInterface(
-        service_manager::Identity(mojom::kBrowserServiceName,
-                                  service_manager::mojom::kInheritUserID),
-        name, std::move(handle));
-  } else {
-    remote_interfaces_->GetInterface(name, std::move(handle));
-  }
+  connector_->BindInterface(
+      service_manager::Identity(mojom::kBrowserServiceName,
+                                service_manager::mojom::kInheritUserID),
+      name, std::move(handle));
 }
 
 }  // namespace content
diff --git a/content/renderer/mojo/blink_interface_provider_impl.h b/content/renderer/mojo/blink_interface_provider_impl.h
index c14509504..a7c320da 100644
--- a/content/renderer/mojo/blink_interface_provider_impl.h
+++ b/content/renderer/mojo/blink_interface_provider_impl.h
@@ -17,7 +17,6 @@
 
 namespace service_manager {
 class Connector;
-class InterfaceProvider;
 }
 
 namespace content {
@@ -28,8 +27,6 @@
  public:
   explicit BlinkInterfaceProviderImpl(
       base::WeakPtr<service_manager::Connector> connector);
-  explicit BlinkInterfaceProviderImpl(
-      base::WeakPtr<service_manager::InterfaceProvider> remote_interfaces);
   ~BlinkInterfaceProviderImpl();
 
   // blink::InterfaceProvider override.
@@ -41,7 +38,6 @@
                             mojo::ScopedMessagePipeHandle handle);
 
   const base::WeakPtr<service_manager::Connector> connector_;
-  const base::WeakPtr<service_manager::InterfaceProvider> remote_interfaces_;
 
   scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner_;
 
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 9255fbd..d0dc5c7c 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -994,7 +994,6 @@
   render_frame->InitializeBlameContext(nullptr);
   WebLocalFrame* web_frame = WebLocalFrame::CreateMainFrame(
       render_view->webview(), render_frame,
-      render_frame->blink_interface_provider_.get(),
       render_frame->blink_interface_registry_.get(), opener,
       // This conversion is a little sad, as this often comes from a
       // WebString...
@@ -1045,7 +1044,6 @@
     web_frame = parent_web_frame->CreateLocalChild(
         replicated_state.scope, WebString::FromUTF8(replicated_state.name),
         replicated_state.sandbox_flags, render_frame,
-        render_frame->blink_interface_provider_.get(),
         render_frame->blink_interface_registry_.get(),
         previous_sibling_web_frame,
         FeaturePolicyHeaderToWeb(replicated_state.container_policy),
@@ -1071,9 +1069,8 @@
     render_frame->proxy_routing_id_ = proxy_routing_id;
     proxy->set_provisional_frame_routing_id(routing_id);
     web_frame = blink::WebLocalFrame::CreateProvisional(
-        render_frame, render_frame->blink_interface_provider_.get(),
-        render_frame->blink_interface_registry_.get(), proxy->web_frame(),
-        replicated_state.sandbox_flags,
+        render_frame, render_frame->blink_interface_registry_.get(),
+        proxy->web_frame(), replicated_state.sandbox_flags,
         FeaturePolicyHeaderToWeb(replicated_state.container_policy));
   }
   CHECK(parent_routing_id != MSG_ROUTING_NONE || !web_frame->Parent());
@@ -1209,8 +1206,6 @@
   pending_remote_interface_provider_request_ = MakeRequest(&remote_interfaces);
   remote_interfaces_.reset(new service_manager::InterfaceProvider);
   remote_interfaces_->Bind(std::move(remote_interfaces));
-  blink_interface_provider_.reset(new BlinkInterfaceProviderImpl(
-      remote_interfaces_->GetWeakPtr()));
   blink_interface_registry_.reset(
       new BlinkInterfaceRegistryImpl(interface_registry_->GetWeakPtr()));
 
@@ -2965,6 +2960,8 @@
     worker_fetch_context->set_is_controlled_by_service_worker(
         provider->IsControlledByServiceWorker());
   }
+  for (auto& observer : observers_)
+    observer.WillCreateWorkerFetchContext(worker_fetch_context.get());
   return std::move(worker_fetch_context);
 }
 
@@ -3109,7 +3106,6 @@
   child_render_frame->InitializeBlameContext(this);
   blink::WebLocalFrame* web_frame = parent->CreateLocalChild(
       scope, child_render_frame,
-      child_render_frame->blink_interface_provider_.get(),
       child_render_frame->blink_interface_registry_.get());
 
   child_render_frame->in_frame_tree_ = true;
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index 6db17694..351489a5 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -48,7 +48,6 @@
 #include "content/public/renderer/render_frame.h"
 #include "content/renderer/frame_blame_context.h"
 #include "content/renderer/media/media_factory.h"
-#include "content/renderer/mojo/blink_interface_provider_impl.h"
 #include "content/renderer/renderer_webcookiejar_impl.h"
 #include "ipc/ipc_message.h"
 #include "ipc/ipc_platform_file.h"
@@ -1276,7 +1275,6 @@
 
   std::unique_ptr<service_manager::BinderRegistry> interface_registry_;
   std::unique_ptr<service_manager::InterfaceProvider> remote_interfaces_;
-  std::unique_ptr<BlinkInterfaceProviderImpl> blink_interface_provider_;
   std::unique_ptr<BlinkInterfaceRegistryImpl> blink_interface_registry_;
   service_manager::mojom::InterfaceProviderRequest
       pending_remote_interface_provider_request_;
diff --git a/content/renderer/renderer_main_platform_delegate_mac.mm b/content/renderer/renderer_main_platform_delegate_mac.mm
index c890040b..c4d1da8d 100644
--- a/content/renderer/renderer_main_platform_delegate_mac.mm
+++ b/content/renderer/renderer_main_platform_delegate_mac.mm
@@ -9,6 +9,7 @@
 #include <objc/runtime.h>
 #include <stdint.h>
 
+#include "base/bind.h"
 #include "base/command_line.h"
 #include "base/logging.h"
 #include "base/mac/mac_util.h"
@@ -18,11 +19,34 @@
 #include "content/common/sandbox_init_mac.h"
 #include "content/common/sandbox_mac.h"
 #include "content/public/common/content_switches.h"
+#include "sandbox/mac/seatbelt.h"
+
+extern "C" {
+void CGSSetDenyWindowServerConnections(bool);
+void CGSShutdownServerConnections();
+OSStatus SetApplicationIsDaemon(Boolean isDaemon);
+};
 
 namespace content {
 
 namespace {
 
+// This disconnects from the window server, and then indicates that Chrome
+// should continue execution without access to launchservicesd.
+void DisconnectWindowServer() {
+  // Now disconnect from WindowServer, after all objects have been warmed up.
+  // Shutting down the connection requires connecting to WindowServer,
+  // so do this before actually engaging the sandbox. This may cause two log
+  // messages to be printed to the system logger on certain OS versions.
+  CGSSetDenyWindowServerConnections(true);
+  CGSShutdownServerConnections();
+  // Allow the process to continue without a LaunchServices ASN. The
+  // INIT_Process function in HIServices will abort if it cannot connect to
+  // launchservicesd to get an ASN. By setting this flag, HIServices skips
+  // that.
+  SetApplicationIsDaemon(true);
+}
+
 // You are about to read a pretty disgusting hack. In a static initializer,
 // CoreFoundation decides to connect with cfprefsd(8) using Mach IPC. There is
 // no public way to close this Mach port after-the-fact, nor a way to stop it
@@ -128,8 +152,15 @@
 }
 
 bool RendererMainPlatformDelegate::EnableSandbox() {
-  // Enable the sandbox.
-  bool sandbox_initialized = InitializeSandbox();
+  bool sandbox_initialized = sandbox::Seatbelt::IsSandboxed();
+
+  // If the sandbox is already engaged, just disconnect from the window server.
+  if (sandbox_initialized) {
+    DisconnectWindowServer();
+  } else {
+    sandbox_initialized = InitializeSandboxWithPostWarmupHook(
+        base::BindOnce(&DisconnectWindowServer));
+  }
 
   // The sandbox is now engaged. Make sure that the renderer has not connected
   // itself to Cocoa.
diff --git a/content/renderer/renderer_v2.sb b/content/renderer/renderer_v2.sb
index 341bbf3..4e10b34 100644
--- a/content/renderer/renderer_v2.sb
+++ b/content/renderer/renderer_v2.sb
@@ -119,6 +119,7 @@
   (global-name "com.apple.distributed_notifications@Uv3")
   (global-name "com.apple.fonts")
   (global-name "com.apple.logd")
+  (global-name "com.apple.lsd.mapdb")
   (global-name "com.apple.system.logger")
   (global-name "com.apple.system.notification_center")
   (global-name "com.apple.system.opendirectoryd.libinfo")
diff --git a/content/renderer/scheduler/resource_dispatch_throttler_unittest.cc b/content/renderer/scheduler/resource_dispatch_throttler_unittest.cc
index 6a85000..e5a0d661 100644
--- a/content/renderer/scheduler/resource_dispatch_throttler_unittest.cc
+++ b/content/renderer/scheduler/resource_dispatch_throttler_unittest.cc
@@ -14,6 +14,7 @@
 #include "base/memory/ptr_util.h"
 #include "content/common/resource_messages.h"
 #include "content/public/common/resource_request.h"
+#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/WebKit/public/platform/scheduler/test/fake_renderer_scheduler.h"
 
@@ -135,7 +136,8 @@
     ResourceRequest request;
     request.download_to_file = true;
     return throttler_->Send(new ResourceHostMsg_RequestResource(
-        kRoutingId, ++last_request_id_, request));
+        kRoutingId, ++last_request_id_, request,
+        net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS)));
   }
 
   bool RequestResourceSync() {
diff --git a/content/renderer/service_worker/worker_fetch_context_impl.cc b/content/renderer/service_worker/worker_fetch_context_impl.cc
index 96721068..c608bf78 100644
--- a/content/renderer/service_worker/worker_fetch_context_impl.cc
+++ b/content/renderer/service_worker/worker_fetch_context_impl.cc
@@ -91,6 +91,19 @@
                                                                url));
 }
 
+void WorkerFetchContextImpl::SetSubresourceFilterBuilder(
+    std::unique_ptr<blink::WebDocumentSubresourceFilter::Builder>
+        subresource_filter_builder) {
+  subresource_filter_builder_ = std::move(subresource_filter_builder);
+}
+
+std::unique_ptr<blink::WebDocumentSubresourceFilter>
+WorkerFetchContextImpl::TakeSubresourceFilter() {
+  if (!subresource_filter_builder_)
+    return nullptr;
+  return std::move(subresource_filter_builder_)->Build();
+}
+
 void WorkerFetchContextImpl::set_service_worker_provider_id(int id) {
   service_worker_provider_id_ = id;
 }
diff --git a/content/renderer/service_worker/worker_fetch_context_impl.h b/content/renderer/service_worker/worker_fetch_context_impl.h
index f89ce10b..200f2fe 100644
--- a/content/renderer/service_worker/worker_fetch_context_impl.h
+++ b/content/renderer/service_worker/worker_fetch_context_impl.h
@@ -54,6 +54,10 @@
       const blink::WebURL& url) override;
   void SetApplicationCacheHostID(int id) override;
   int ApplicationCacheHostID() const override;
+  void SetSubresourceFilterBuilder(
+      std::unique_ptr<blink::WebDocumentSubresourceFilter::Builder>) override;
+  std::unique_ptr<blink::WebDocumentSubresourceFilter> TakeSubresourceFilter()
+      override;
 
   // mojom::ServiceWorkerWorkerClient implementation:
   void SetControllerServiceWorker(int64_t controller_version_id) override;
@@ -88,6 +92,8 @@
   int controller_version_id_ = kInvalidServiceWorkerVersionId;
 
   scoped_refptr<ThreadSafeSender> thread_safe_sender_;
+  std::unique_ptr<blink::WebDocumentSubresourceFilter::Builder>
+      subresource_filter_builder_;
   bool is_data_saver_enabled_ = false;
   int parent_frame_id_ = MSG_ROUTING_NONE;
   GURL first_party_for_cookies_;
diff --git a/content/shell/android/BUILD.gn b/content/shell/android/BUILD.gn
index b6fd7b6..96af4c2 100644
--- a/content/shell/android/BUILD.gn
+++ b/content/shell/android/BUILD.gn
@@ -99,6 +99,9 @@
 
 android_library("content_shell_apk_java") {
   testonly = true
+
+  srcjar_deps = [ ":content_javatests_aidl" ]
+
   deps = [
     ":content_shell_apk_resources",
     ":content_shell_java",
@@ -107,6 +110,7 @@
     "//content/public/android:content_java",
     "//media/capture/video/android:capture_java",
     "//net/android:net_java",
+    "//third_party/jsr-305:jsr_305_javalib",
     "//ui/android:ui_java",
   ]
 
@@ -118,6 +122,16 @@
     "shell_apk/src/org/chromium/content_shell_apk/ChildProcessLauncherTestUtils.java",
     "shell_apk/src/org/chromium/content_shell_apk/ContentShellActivity.java",
     "shell_apk/src/org/chromium/content_shell_apk/ContentShellApplication.java",
+    "shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService.java",
+    "shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService0.java",
+    "shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService1.java",
+  ]
+}
+
+android_aidl("content_javatests_aidl") {
+  import_include = [ "shell_apk/src" ]
+  sources = [
+    "shell_apk/src/org/chromium/content_shell_apk/IChildProcessTest.aidl",
   ]
 }
 
diff --git a/content/shell/android/shell_apk/AndroidManifest.xml.jinja2 b/content/shell/android/shell_apk/AndroidManifest.xml.jinja2
index ea6845e..9862508b 100644
--- a/content/shell/android/shell_apk/AndroidManifest.xml.jinja2
+++ b/content/shell/android/shell_apk/AndroidManifest.xml.jinja2
@@ -67,5 +67,20 @@
 
         <service android:name="org.chromium.content_shell_apk.ChildProcessLauncherTestHelperService"
             android:process=":ChildProcessLauncherHelper" />
+
+        <!-- The following entries are for ChildProcessLauncherTest. They should eventually be moved
+             to base. -->
+        {% set num_test_services = 2 %}
+        <meta-data android:name="org.chromium.content.browser.NUM_TEST_SERVICES"
+                   android:value="{{ num_test_services }}"/>
+        <meta-data android:name="org.chromium.content.browser.TEST_SERVICES_NAME"
+                   android:value="org.chromium.content_shell_apk.TestChildProcessService"/>
+        {% for i in range(num_test_services) %}
+        <service android:name="org.chromium.content_shell_apk.TestChildProcessService{{ i }}"
+                 android:process=":test_child_service_process{{ i }}"
+                 android:isolatedProcess="true"
+                 android:exported="false" />
+        {% endfor %}
+
     </application>
 </manifest>
diff --git a/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/IChildProcessTest.aidl b/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/IChildProcessTest.aidl
new file mode 100644
index 0000000..b413d556
--- /dev/null
+++ b/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/IChildProcessTest.aidl
@@ -0,0 +1,25 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.content_shell_apk;
+
+import android.os.Bundle;
+
+/**
+  * Interface provided to the TestChildProcessService. Used to echo back the calls made on the
+  * ChildProcessServiceDelegate to the test process.
+  */
+interface IChildProcessTest {
+  // Called by the service when onConnectionSetup is received. Echos back the parameters received
+  // so far.
+  oneway void onConnectionSetup(boolean serviceCreatedCalled, in Bundle serviceBundle, in Bundle connectionBundle);
+
+  oneway void onLoadNativeLibrary(boolean loadedSuccessfully);
+
+  oneway void onBeforeMain(in String[] commandLine);
+
+  oneway void onRunMain();
+
+  oneway void onDestroy();
+}
diff --git a/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/OWNERS b/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/OWNERS
new file mode 100644
index 0000000..8f094e0
--- /dev/null
+++ b/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/OWNERS
@@ -0,0 +1,2 @@
+per-file *.aidl=set noparent
+per-file *.aidl=file://ipc/SECURITY_OWNERS
diff --git a/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService.java b/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService.java
new file mode 100644
index 0000000..6cc7189
--- /dev/null
+++ b/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService.java
@@ -0,0 +1,153 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.content_shell_apk;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.RemoteException;
+import android.util.SparseArray;
+
+import org.chromium.base.CommandLine;
+import org.chromium.base.Log;
+import org.chromium.base.library_loader.LibraryLoader;
+import org.chromium.base.library_loader.LibraryProcessType;
+import org.chromium.base.library_loader.ProcessInitException;
+import org.chromium.base.process_launcher.ChildProcessService;
+import org.chromium.base.process_launcher.ChildProcessServiceDelegate;
+
+import javax.annotation.concurrent.GuardedBy;
+
+/**
+ * Child service started by ChildProcessLauncherTest.
+ */
+public class TestChildProcessService extends ChildProcessService {
+    private static final String TAG = "TestProcessService";
+
+    private static final long MAIN_BLOCKING_DURATION_MS = 5000;
+
+    private static class TestChildProcessServiceDelegate implements ChildProcessServiceDelegate {
+        private final Object mConnectionSetupLock = new Object();
+        @GuardedBy("mConnectionSetupLock")
+        private boolean mConnectionSetup;
+
+        private boolean mServiceCreated;
+        private Bundle mServiceBundle;
+        private String[] mCommandLine;
+        private IChildProcessTest mIChildProcessTest;
+
+        @Override
+        public void onServiceCreated() {
+            mServiceCreated = true;
+        }
+
+        @Override
+        public void onServiceBound(Intent intent) {
+            mServiceBundle = intent.getExtras();
+        }
+
+        @Override
+        public void onConnectionSetup(Bundle connectionBundle, IBinder callback) {
+            if (callback != null) {
+                mIChildProcessTest = IChildProcessTest.Stub.asInterface(callback);
+            }
+            if (mIChildProcessTest != null) {
+                try {
+                    mIChildProcessTest.onConnectionSetup(
+                            mServiceCreated, mServiceBundle, connectionBundle);
+                } catch (RemoteException re) {
+                    Log.e(TAG, "Failed to call IChildProcessTest.onConnectionSetup.", re);
+                }
+            }
+            synchronized (mConnectionSetupLock) {
+                mConnectionSetup = true;
+                mConnectionSetupLock.notifyAll();
+            }
+        }
+
+        @Override
+        public void onDestroy() {
+            if (mIChildProcessTest == null) return;
+            try {
+                mIChildProcessTest.onDestroy();
+            } catch (RemoteException re) {
+                Log.e(TAG, "Failed to call IChildProcessTest.onDestroy.", re);
+            }
+        }
+
+        @Override
+        public boolean loadNativeLibrary(Context hostContext) {
+            // Store the command line before loading the library to avoid an assert in CommandLine.
+            mCommandLine = CommandLine.getJavaSwitchesOrNull();
+
+            LibraryLoader libraryLoader = null;
+            boolean isLoaded = false;
+            try {
+                libraryLoader = LibraryLoader.get(LibraryProcessType.PROCESS_CHILD);
+                libraryLoader.loadNow();
+                libraryLoader.ensureInitialized();
+                isLoaded = true;
+            } catch (ProcessInitException e) {
+                Log.e(TAG, "Failed to load native library.", e);
+            }
+
+            // Loading the library happen on the main thread and onConnectionSetup is called from
+            // the client. Wait for onConnectionSetup so mIChildProcessTest is set.
+            synchronized (mConnectionSetupLock) {
+                while (!mConnectionSetup) {
+                    try {
+                        mConnectionSetupLock.wait();
+                    } catch (InterruptedException e) {
+                        // Ignore.
+                    }
+                }
+            }
+
+            if (mIChildProcessTest != null) {
+                try {
+                    mIChildProcessTest.onLoadNativeLibrary(isLoaded);
+                } catch (RemoteException re) {
+                    Log.e(TAG, "Failed to call IChildProcessTest.onLoadNativeLibrary.", re);
+                }
+            }
+            return true;
+        }
+
+        @Override
+        public SparseArray<String> getFileDescriptorsIdsToKeys() {
+            return null;
+        }
+
+        @Override
+        public void onBeforeMain() {
+            if (mIChildProcessTest == null) return;
+            try {
+                mIChildProcessTest.onBeforeMain(mCommandLine);
+            } catch (RemoteException re) {
+                Log.e(TAG, "Failed to call IChildProcessTest.onBeforeMain.", re);
+            }
+        }
+
+        @Override
+        public void runMain() {
+            if (mIChildProcessTest != null) {
+                try {
+                    mIChildProcessTest.onRunMain();
+                } catch (RemoteException re) {
+                    Log.e(TAG, "Failed to call IChildProcessTest.onRunMain.", re);
+                }
+            }
+            // Run a message loop to keep the service from exiting.
+            Looper.prepare();
+            Looper.loop();
+        }
+    };
+
+    public TestChildProcessService() {
+        super(new TestChildProcessServiceDelegate());
+    }
+}
diff --git a/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService0.java b/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService0.java
new file mode 100644
index 0000000..90fb3336
--- /dev/null
+++ b/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService0.java
@@ -0,0 +1,8 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.content_shell_apk;
+
+/** One of the TestChildProcessService defined in the AndroidManifest.xml. */
+public class TestChildProcessService0 extends TestChildProcessService {}
diff --git a/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService1.java b/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService1.java
new file mode 100644
index 0000000..e7429bac
--- /dev/null
+++ b/content/shell/android/shell_apk/src/org/chromium/content_shell_apk/TestChildProcessService1.java
@@ -0,0 +1,8 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.content_shell_apk;
+
+/** One of the TestChildProcessService defined in the AndroidManifest.xml. */
+public class TestChildProcessService1 extends TestChildProcessService {}
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index c3234aac..f55394f 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -1504,6 +1504,7 @@
     "//cc/surfaces",
     "//components/leveldb/public/cpp",
     "//components/metrics/proto",
+    "//components/offline_pages/features:features",
     "//components/rappor:test_support",
     "//components/ukm:test_support",
     "//components/viz/common",
diff --git a/content/test/test_web_contents.cc b/content/test/test_web_contents.cc
index 7369046..f495cd8 100644
--- a/content/test/test_web_contents.cc
+++ b/content/test/test_web_contents.cc
@@ -100,6 +100,13 @@
   return g_next_image_download_id;
 }
 
+const GURL& TestWebContents::GetLastCommittedURL() const {
+  if (last_committed_url_.is_valid()) {
+    return last_committed_url_;
+  }
+  return WebContentsImpl::GetLastCommittedURL();
+}
+
 void TestWebContents::TestDidNavigate(RenderFrameHost* render_frame_host,
                                       int nav_entry_id,
                                       bool did_create_new_entry,
@@ -208,6 +215,10 @@
   return true;
 }
 
+void TestWebContents::SetLastCommittedURL(const GURL& url) {
+  last_committed_url_ = url;
+}
+
 bool TestWebContents::CrossProcessNavigationPending() {
   if (IsBrowserSideNavigationEnabled()) {
     return GetRenderManager()->speculative_render_frame_host_ != nullptr;
diff --git a/content/test/test_web_contents.h b/content/test/test_web_contents.h
index f075d52a..c8ca044 100644
--- a/content/test/test_web_contents.h
+++ b/content/test/test_web_contents.h
@@ -55,6 +55,7 @@
                     uint32_t max_bitmap_size,
                     bool bypass_cache,
                     const ImageDownloadCallback& callback) override;
+  const GURL& GetLastCommittedURL() const override;
 
   // WebContentsTester implementation.
   void CommitPendingNavigation() override;
@@ -90,6 +91,7 @@
       int http_status_code,
       const std::vector<SkBitmap>& bitmaps,
       const std::vector<gfx::Size>& original_bitmap_sizes) override;
+  void SetLastCommittedURL(const GURL& url) override;
 
   // True if a cross-site navigation is pending.
   bool CrossProcessNavigationPending();
@@ -187,6 +189,7 @@
   // Map keyed by image URL. Values are <id, callback> pairs.
   std::map<GURL, std::list<std::pair<int, ImageDownloadCallback>>>
       pending_image_downloads_;
+  GURL last_committed_url_;
 };
 
 }  // namespace content
diff --git a/docs/fuchsia_build_instructions.md b/docs/fuchsia_build_instructions.md
index 16197d4..1d9eb5a3 100644
--- a/docs/fuchsia_build_instructions.md
+++ b/docs/fuchsia_build_instructions.md
@@ -90,7 +90,7 @@
 configurations. To create a build directory, run:
 
 ```shell
-$ gn gen out/fuch --args="is_debug=false dcheck_always_on=true is_component_build=false target_os=\"fuchsia\""
+$ gn gen out/fuchsia --args="is_debug=false dcheck_always_on=true is_component_build=false target_os=\"fuchsia\""
 ```
 
 `use_goma=true` is fine to use also if you're a Googler.
@@ -101,7 +101,7 @@
 example:
 
 ```shell
-$ ninja -C out/fuch base_unittests
+$ ninja -C out/fuchsia base_unittests
 ```
 
 ## Run
@@ -122,6 +122,6 @@
 
 A useful alias (for "Build And Run Filtered") is:
 ```shell
-alias barf='ninja -C out/fuch base_unittests -j1000 && out/fuch/bin/run_base_unittests --test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.base_unittests.filter'
+alias barf='ninja -C out/fuchsia base_unittests -j1000 && out/fuch/bin/run_base_unittests --test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.base_unittests.filter'
 ```
 to build and run only the tests that are not excluded/known-failing on the bot.
diff --git a/extensions/browser/api/bluetooth_low_energy/bluetooth_low_energy_api.cc b/extensions/browser/api/bluetooth_low_energy/bluetooth_low_energy_api.cc
index 45933bc4..69fb27f 100644
--- a/extensions/browser/api/bluetooth_low_energy/bluetooth_low_energy_api.cc
+++ b/extensions/browser/api/bluetooth_low_energy/bluetooth_low_energy_api.cc
@@ -354,39 +354,6 @@
 
 namespace api {
 
-BluetoothLowEnergyExtensionFunctionDeprecated::
-    BluetoothLowEnergyExtensionFunctionDeprecated() {}
-
-BluetoothLowEnergyExtensionFunctionDeprecated::
-    ~BluetoothLowEnergyExtensionFunctionDeprecated() {}
-
-bool BluetoothLowEnergyExtensionFunctionDeprecated::RunAsync() {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
-  if (!BluetoothManifestData::CheckLowEnergyPermitted(extension())) {
-    error_ = kErrorPermissionDenied;
-    return false;
-  }
-
-  BluetoothLowEnergyEventRouter* event_router =
-      GetEventRouter(browser_context());
-  if (!event_router->IsBluetoothSupported()) {
-    SetError(kErrorPlatformNotSupported);
-    return false;
-  }
-
-  // It is safe to pass |this| here as ExtensionFunction is refcounted.
-  if (!event_router->InitializeAdapterAndInvokeCallback(base::Bind(
-          &DoWorkCallback<bool>,
-          base::Bind(&BluetoothLowEnergyExtensionFunctionDeprecated::DoWork,
-                     this)))) {
-    SetError(kErrorAdapterNotInitialized);
-    return false;
-  }
-
-  return true;
-}
-
 BluetoothLowEnergyExtensionFunction::BluetoothLowEnergyExtensionFunction()
     : event_router_(nullptr) {}
 
@@ -395,6 +362,8 @@
 ExtensionFunction::ResponseAction BluetoothLowEnergyExtensionFunction::Run() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
+  EXTENSION_FUNCTION_VALIDATE(ParseParams());
+
   if (!BluetoothManifestData::CheckLowEnergyPermitted(extension()))
     return RespondNow(Error(kErrorPermissionDenied));
 
@@ -414,6 +383,8 @@
 }
 
 void BluetoothLowEnergyExtensionFunction::PreDoWork() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
   // The adapter must be initialized at this point, but return an error instead
   // of asserting.
   if (!event_router_->HasAdapter()) {
@@ -423,15 +394,11 @@
   DoWork();
 }
 
-template <typename Params>
-BLEPeripheralExtensionFunction<Params>::BLEPeripheralExtensionFunction() {}
+BLEPeripheralExtensionFunction::BLEPeripheralExtensionFunction() {}
 
-template <typename Params>
-BLEPeripheralExtensionFunction<Params>::~BLEPeripheralExtensionFunction() {}
+BLEPeripheralExtensionFunction::~BLEPeripheralExtensionFunction() {}
 
-template <typename Params>
-ExtensionFunction::ResponseAction
-BLEPeripheralExtensionFunction<Params>::Run() {
+ExtensionFunction::ResponseAction BLEPeripheralExtensionFunction::Run() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   // Check permissions in manifest.
@@ -443,219 +410,212 @@
     return RespondNow(Error(kErrorPermissionDenied));
   }
 
-// Causes link error on Windows. API will never be on Windows, so #ifdefing.
-#if !defined(OS_WIN)
-  params_ = Params::Create(*args_);
-  EXTENSION_FUNCTION_VALIDATE(params_.get() != NULL);
-#endif
-
   return BluetoothLowEnergyExtensionFunction::Run();
 }
 
-bool BluetoothLowEnergyConnectFunction::DoWork() {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+BluetoothLowEnergyConnectFunction::BluetoothLowEnergyConnectFunction() {}
 
+BluetoothLowEnergyConnectFunction::~BluetoothLowEnergyConnectFunction() {}
+
+bool BluetoothLowEnergyConnectFunction::ParseParams() {
+  params_ = apibtle::Connect::Params::Create(*args_);
+  return params_.get() != nullptr;
+}
+
+void BluetoothLowEnergyConnectFunction::DoWork() {
   BluetoothLowEnergyEventRouter* event_router =
       GetEventRouter(browser_context());
 
   // The adapter must be initialized at this point, but return an error instead
   // of asserting.
   if (!event_router->HasAdapter()) {
-    SetError(kErrorAdapterNotInitialized);
-    SendResponse(false);
-    return false;
+    Respond(Error(kErrorAdapterNotInitialized));
+    return;
   }
 
-  std::unique_ptr<apibtle::Connect::Params> params(
-      apibtle::Connect::Params::Create(*args_));
-  EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
-
   bool persistent = false;  // Not persistent by default.
-  apibtle::ConnectProperties* properties = params->properties.get();
+  apibtle::ConnectProperties* properties = params_->properties.get();
   if (properties)
     persistent = properties->persistent;
 
   event_router->Connect(
-      persistent, extension(), params->device_address,
+      persistent, extension(), params_->device_address,
       base::Bind(&BluetoothLowEnergyConnectFunction::SuccessCallback, this),
       base::Bind(&BluetoothLowEnergyConnectFunction::ErrorCallback, this));
-
-  return true;
 }
 
 void BluetoothLowEnergyConnectFunction::SuccessCallback() {
-  SendResponse(true);
+  Respond(NoArguments());
 }
 
 void BluetoothLowEnergyConnectFunction::ErrorCallback(
     BluetoothLowEnergyEventRouter::Status status) {
-  SetError(StatusToString(status));
-  SendResponse(false);
+  Respond(Error(StatusToString(status)));
 }
 
-bool BluetoothLowEnergyDisconnectFunction::DoWork() {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+BluetoothLowEnergyDisconnectFunction::BluetoothLowEnergyDisconnectFunction() {}
 
+BluetoothLowEnergyDisconnectFunction::~BluetoothLowEnergyDisconnectFunction() {}
+
+bool BluetoothLowEnergyDisconnectFunction::ParseParams() {
+  params_ = apibtle::Disconnect::Params::Create(*args_);
+  return params_.get() != nullptr;
+}
+
+void BluetoothLowEnergyDisconnectFunction::DoWork() {
   BluetoothLowEnergyEventRouter* event_router =
       GetEventRouter(browser_context());
 
   // The adapter must be initialized at this point, but return an error instead
   // of asserting.
   if (!event_router->HasAdapter()) {
-    SetError(kErrorAdapterNotInitialized);
-    SendResponse(false);
-    return false;
+    Respond(Error(kErrorAdapterNotInitialized));
+    return;
   }
 
-  std::unique_ptr<apibtle::Disconnect::Params> params(
-      apibtle::Disconnect::Params::Create(*args_));
-  EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
-
   event_router->Disconnect(
-      extension(), params->device_address,
+      extension(), params_->device_address,
       base::Bind(&BluetoothLowEnergyDisconnectFunction::SuccessCallback, this),
       base::Bind(&BluetoothLowEnergyDisconnectFunction::ErrorCallback, this));
-
-  return true;
 }
 
 void BluetoothLowEnergyDisconnectFunction::SuccessCallback() {
-  SendResponse(true);
+  Respond(NoArguments());
 }
 
 void BluetoothLowEnergyDisconnectFunction::ErrorCallback(
     BluetoothLowEnergyEventRouter::Status status) {
-  SetError(StatusToString(status));
-  SendResponse(false);
+  Respond(Error(StatusToString(status)));
 }
 
-bool BluetoothLowEnergyGetServiceFunction::DoWork() {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+BluetoothLowEnergyGetServiceFunction::BluetoothLowEnergyGetServiceFunction() {}
 
+BluetoothLowEnergyGetServiceFunction::~BluetoothLowEnergyGetServiceFunction() {}
+
+bool BluetoothLowEnergyGetServiceFunction::ParseParams() {
+  params_ = apibtle::GetService::Params::Create(*args_);
+  return params_.get() != nullptr;
+}
+
+void BluetoothLowEnergyGetServiceFunction::DoWork() {
   BluetoothLowEnergyEventRouter* event_router =
       GetEventRouter(browser_context());
 
   // The adapter must be initialized at this point, but return an error instead
   // of asserting.
   if (!event_router->HasAdapter()) {
-    SetError(kErrorAdapterNotInitialized);
-    SendResponse(false);
-    return false;
+    Respond(Error(kErrorAdapterNotInitialized));
+    return;
   }
 
-  std::unique_ptr<apibtle::GetService::Params> params(
-      apibtle::GetService::Params::Create(*args_));
-  EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
-
   apibtle::Service service;
   BluetoothLowEnergyEventRouter::Status status =
-      event_router->GetService(params->service_id, &service);
+      event_router->GetService(params_->service_id, &service);
   if (status != BluetoothLowEnergyEventRouter::kStatusSuccess) {
-    SetError(StatusToString(status));
-    SendResponse(false);
-    return false;
+    Respond(Error(StatusToString(status)));
+    return;
   }
 
-  results_ = apibtle::GetService::Results::Create(service);
-  SendResponse(true);
-
-  return true;
+  Respond(ArgumentList(apibtle::GetService::Results::Create(service)));
 }
 
-bool BluetoothLowEnergyGetServicesFunction::DoWork() {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+BluetoothLowEnergyGetServicesFunction::BluetoothLowEnergyGetServicesFunction() {
+}
 
+BluetoothLowEnergyGetServicesFunction::
+    ~BluetoothLowEnergyGetServicesFunction() {}
+
+bool BluetoothLowEnergyGetServicesFunction::ParseParams() {
+  params_ = apibtle::GetServices::Params::Create(*args_);
+  return params_.get() != nullptr;
+}
+
+void BluetoothLowEnergyGetServicesFunction::DoWork() {
   BluetoothLowEnergyEventRouter* event_router =
       GetEventRouter(browser_context());
 
   // The adapter must be initialized at this point, but return an error instead
   // of asserting.
   if (!event_router->HasAdapter()) {
-    SetError(kErrorAdapterNotInitialized);
-    SendResponse(false);
-    return false;
+    Respond(Error(kErrorAdapterNotInitialized));
+    return;
   }
 
-  std::unique_ptr<apibtle::GetServices::Params> params(
-      apibtle::GetServices::Params::Create(*args_));
-  EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
-
   BluetoothLowEnergyEventRouter::ServiceList service_list;
-  if (!event_router->GetServices(params->device_address, &service_list)) {
-    SetError(kErrorNotFound);
-    SendResponse(false);
-    return false;
+  if (!event_router->GetServices(params_->device_address, &service_list)) {
+    Respond(Error(kErrorNotFound));
+    return;
   }
 
-  results_ = apibtle::GetServices::Results::Create(service_list);
-  SendResponse(true);
-
-  return true;
+  Respond(ArgumentList(apibtle::GetServices::Results::Create(service_list)));
 }
 
-bool BluetoothLowEnergyGetCharacteristicFunction::DoWork() {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+BluetoothLowEnergyGetCharacteristicFunction::
+    BluetoothLowEnergyGetCharacteristicFunction() {}
 
+BluetoothLowEnergyGetCharacteristicFunction::
+    ~BluetoothLowEnergyGetCharacteristicFunction() {}
+
+bool BluetoothLowEnergyGetCharacteristicFunction::ParseParams() {
+  params_ = apibtle::GetCharacteristic::Params::Create(*args_);
+  return params_.get() != nullptr;
+}
+
+void BluetoothLowEnergyGetCharacteristicFunction::DoWork() {
   BluetoothLowEnergyEventRouter* event_router =
       GetEventRouter(browser_context());
 
   // The adapter must be initialized at this point, but return an error instead
   // of asserting.
   if (!event_router->HasAdapter()) {
-    SetError(kErrorAdapterNotInitialized);
-    SendResponse(false);
-    return false;
+    Respond(Error(kErrorAdapterNotInitialized));
+    return;
   }
 
-  std::unique_ptr<apibtle::GetCharacteristic::Params> params(
-      apibtle::GetCharacteristic::Params::Create(*args_));
-  EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
-
   apibtle::Characteristic characteristic;
   BluetoothLowEnergyEventRouter::Status status =
-      event_router->GetCharacteristic(extension(), params->characteristic_id,
+      event_router->GetCharacteristic(extension(), params_->characteristic_id,
                                       &characteristic);
   if (status != BluetoothLowEnergyEventRouter::kStatusSuccess) {
-    SetError(StatusToString(status));
-    SendResponse(false);
-    return false;
+    Respond(Error(StatusToString(status)));
+    return;
   }
 
   // Manually construct the result instead of using
   // apibtle::GetCharacteristic::Result::Create as it doesn't convert lists of
   // enums correctly.
-  SetResult(apibtle::CharacteristicToValue(&characteristic));
-  SendResponse(true);
-
-  return true;
+  Respond(OneArgument(apibtle::CharacteristicToValue(&characteristic)));
 }
 
-bool BluetoothLowEnergyGetCharacteristicsFunction::DoWork() {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+BluetoothLowEnergyGetCharacteristicsFunction::
+    BluetoothLowEnergyGetCharacteristicsFunction() {}
 
+BluetoothLowEnergyGetCharacteristicsFunction::
+    ~BluetoothLowEnergyGetCharacteristicsFunction() {}
+
+bool BluetoothLowEnergyGetCharacteristicsFunction::ParseParams() {
+  params_ = apibtle::GetCharacteristics::Params::Create(*args_);
+  return params_.get() != nullptr;
+}
+
+void BluetoothLowEnergyGetCharacteristicsFunction::DoWork() {
   BluetoothLowEnergyEventRouter* event_router =
       GetEventRouter(browser_context());
 
   // The adapter must be initialized at this point, but return an error instead
   // of asserting.
   if (!event_router->HasAdapter()) {
-    SetError(kErrorAdapterNotInitialized);
-    SendResponse(false);
-    return false;
+    Respond(Error(kErrorAdapterNotInitialized));
+    return;
   }
 
-  std::unique_ptr<apibtle::GetCharacteristics::Params> params(
-      apibtle::GetCharacteristics::Params::Create(*args_));
-  EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
-
   BluetoothLowEnergyEventRouter::CharacteristicList characteristic_list;
   BluetoothLowEnergyEventRouter::Status status =
-      event_router->GetCharacteristics(extension(), params->service_id,
+      event_router->GetCharacteristics(extension(), params_->service_id,
                                        &characteristic_list);
   if (status != BluetoothLowEnergyEventRouter::kStatusSuccess) {
-    SetError(StatusToString(status));
-    SendResponse(false);
-    return false;
+    Respond(Error(StatusToString(status)));
+    return;
   }
 
   // Manually construct the result instead of using
@@ -665,106 +625,107 @@
   for (apibtle::Characteristic& characteristic : characteristic_list)
     result->Append(apibtle::CharacteristicToValue(&characteristic));
 
-  SetResult(std::move(result));
-  SendResponse(true);
-
-  return true;
+  Respond(OneArgument(std::move(result)));
 }
 
-bool BluetoothLowEnergyGetIncludedServicesFunction::DoWork() {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+BluetoothLowEnergyGetIncludedServicesFunction::
+    BluetoothLowEnergyGetIncludedServicesFunction() {}
 
+BluetoothLowEnergyGetIncludedServicesFunction::
+    ~BluetoothLowEnergyGetIncludedServicesFunction() {}
+
+bool BluetoothLowEnergyGetIncludedServicesFunction::ParseParams() {
+  params_ = apibtle::GetIncludedServices::Params::Create(*args_);
+  return params_.get() != nullptr;
+}
+
+void BluetoothLowEnergyGetIncludedServicesFunction::DoWork() {
   BluetoothLowEnergyEventRouter* event_router =
       GetEventRouter(browser_context());
 
   // The adapter must be initialized at this point, but return an error instead
   // of asserting.
   if (!event_router->HasAdapter()) {
-    SetError(kErrorAdapterNotInitialized);
-    SendResponse(false);
-    return false;
+    Respond(Error(kErrorAdapterNotInitialized));
+    return;
   }
 
-  std::unique_ptr<apibtle::GetIncludedServices::Params> params(
-      apibtle::GetIncludedServices::Params::Create(*args_));
-  EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
-
   BluetoothLowEnergyEventRouter::ServiceList service_list;
   BluetoothLowEnergyEventRouter::Status status =
-      event_router->GetIncludedServices(params->service_id, &service_list);
+      event_router->GetIncludedServices(params_->service_id, &service_list);
   if (status != BluetoothLowEnergyEventRouter::kStatusSuccess) {
-    SetError(StatusToString(status));
-    SendResponse(false);
-    return false;
+    Respond(Error(StatusToString(status)));
+    return;
   }
 
-  results_ = apibtle::GetIncludedServices::Results::Create(service_list);
-  SendResponse(true);
-
-  return true;
+  Respond(ArgumentList(
+      apibtle::GetIncludedServices::Results::Create(service_list)));
 }
 
-bool BluetoothLowEnergyGetDescriptorFunction::DoWork() {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+BluetoothLowEnergyGetDescriptorFunction::
+    BluetoothLowEnergyGetDescriptorFunction() {}
 
+BluetoothLowEnergyGetDescriptorFunction::
+    ~BluetoothLowEnergyGetDescriptorFunction() {}
+
+bool BluetoothLowEnergyGetDescriptorFunction::ParseParams() {
+  params_ = apibtle::GetDescriptor::Params::Create(*args_);
+  return params_.get() != nullptr;
+}
+
+void BluetoothLowEnergyGetDescriptorFunction::DoWork() {
   BluetoothLowEnergyEventRouter* event_router =
       GetEventRouter(browser_context());
 
   // The adapter must be initialized at this point, but return an error instead
   // of asserting.
   if (!event_router->HasAdapter()) {
-    SetError(kErrorAdapterNotInitialized);
-    SendResponse(false);
-    return false;
+    Respond(Error(kErrorAdapterNotInitialized));
+    return;
   }
 
-  std::unique_ptr<apibtle::GetDescriptor::Params> params(
-      apibtle::GetDescriptor::Params::Create(*args_));
-  EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
-
   apibtle::Descriptor descriptor;
   BluetoothLowEnergyEventRouter::Status status = event_router->GetDescriptor(
-      extension(), params->descriptor_id, &descriptor);
+      extension(), params_->descriptor_id, &descriptor);
   if (status != BluetoothLowEnergyEventRouter::kStatusSuccess) {
-    SetError(StatusToString(status));
-    SendResponse(false);
-    return false;
+    Respond(Error(StatusToString(status)));
+    return;
   }
 
   // Manually construct the result instead of using
   // apibtle::GetDescriptor::Result::Create as it doesn't convert lists of enums
   // correctly.
-  SetResult(apibtle::DescriptorToValue(&descriptor));
-  SendResponse(true);
-
-  return true;
+  Respond(OneArgument(apibtle::DescriptorToValue(&descriptor)));
 }
 
-bool BluetoothLowEnergyGetDescriptorsFunction::DoWork() {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+BluetoothLowEnergyGetDescriptorsFunction::
+    BluetoothLowEnergyGetDescriptorsFunction() {}
 
+BluetoothLowEnergyGetDescriptorsFunction::
+    ~BluetoothLowEnergyGetDescriptorsFunction() {}
+
+bool BluetoothLowEnergyGetDescriptorsFunction::ParseParams() {
+  params_ = apibtle::GetDescriptors::Params::Create(*args_);
+  return params_.get() != nullptr;
+}
+
+void BluetoothLowEnergyGetDescriptorsFunction::DoWork() {
   BluetoothLowEnergyEventRouter* event_router =
       GetEventRouter(browser_context());
 
   // The adapter must be initialized at this point, but return an error instead
   // of asserting.
   if (!event_router->HasAdapter()) {
-    SetError(kErrorAdapterNotInitialized);
-    SendResponse(false);
-    return false;
+    Respond(Error(kErrorAdapterNotInitialized));
+    return;
   }
 
-  std::unique_ptr<apibtle::GetDescriptors::Params> params(
-      apibtle::GetDescriptors::Params::Create(*args_));
-  EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
-
   BluetoothLowEnergyEventRouter::DescriptorList descriptor_list;
   BluetoothLowEnergyEventRouter::Status status = event_router->GetDescriptors(
-      extension(), params->characteristic_id, &descriptor_list);
+      extension(), params_->characteristic_id, &descriptor_list);
   if (status != BluetoothLowEnergyEventRouter::kStatusSuccess) {
-    SetError(StatusToString(status));
-    SendResponse(false);
-    return false;
+    Respond(Error(StatusToString(status)));
+    return;
   }
 
   // Manually construct the result instead of using
@@ -774,31 +735,32 @@
   for (apibtle::Descriptor& descriptor : descriptor_list)
     result->Append(apibtle::DescriptorToValue(&descriptor));
 
-  SetResult(std::move(result));
-  SendResponse(true);
-
-  return true;
+  Respond(OneArgument(std::move(result)));
 }
 
-bool BluetoothLowEnergyReadCharacteristicValueFunction::DoWork() {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+BluetoothLowEnergyReadCharacteristicValueFunction::
+    BluetoothLowEnergyReadCharacteristicValueFunction() {}
 
+BluetoothLowEnergyReadCharacteristicValueFunction::
+    ~BluetoothLowEnergyReadCharacteristicValueFunction() {}
+
+bool BluetoothLowEnergyReadCharacteristicValueFunction::ParseParams() {
+  params_ = apibtle::ReadCharacteristicValue::Params::Create(*args_);
+  return params_.get() != nullptr;
+}
+
+void BluetoothLowEnergyReadCharacteristicValueFunction::DoWork() {
   BluetoothLowEnergyEventRouter* event_router =
       GetEventRouter(browser_context());
 
   // The adapter must be initialized at this point, but return an error instead
   // of asserting.
   if (!event_router->HasAdapter()) {
-    SetError(kErrorAdapterNotInitialized);
-    SendResponse(false);
-    return false;
+    Respond(Error(kErrorAdapterNotInitialized));
+    return;
   }
 
-  std::unique_ptr<apibtle::ReadCharacteristicValue::Params> params(
-      apibtle::ReadCharacteristicValue::Params::Create(*args_));
-  EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
-
-  instance_id_ = params->characteristic_id;
+  instance_id_ = params_->characteristic_id;
   event_router->ReadCharacteristicValue(
       extension(), instance_id_,
       base::Bind(
@@ -807,8 +769,6 @@
       base::Bind(
           &BluetoothLowEnergyReadCharacteristicValueFunction::ErrorCallback,
           this));
-
-  return true;
 }
 
 void BluetoothLowEnergyReadCharacteristicValueFunction::SuccessCallback() {
@@ -819,172 +779,175 @@
       GetEventRouter(browser_context())
           ->GetCharacteristic(extension(), instance_id_, &characteristic);
   if (status != BluetoothLowEnergyEventRouter::kStatusSuccess) {
-    SetError(StatusToString(status));
-    SendResponse(false);
+    Respond(Error(StatusToString(status)));
     return;
   }
 
   // Manually construct the result instead of using
   // apibtle::GetCharacteristic::Result::Create as it doesn't convert lists of
   // enums correctly.
-  SetResult(apibtle::CharacteristicToValue(&characteristic));
-  SendResponse(true);
+  Respond(OneArgument(apibtle::CharacteristicToValue(&characteristic)));
 }
 
 void BluetoothLowEnergyReadCharacteristicValueFunction::ErrorCallback(
     BluetoothLowEnergyEventRouter::Status status) {
-  SetError(StatusToString(status));
-  SendResponse(false);
+  Respond(Error(StatusToString(status)));
 }
 
-bool BluetoothLowEnergyWriteCharacteristicValueFunction::DoWork() {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+BluetoothLowEnergyWriteCharacteristicValueFunction::
+    BluetoothLowEnergyWriteCharacteristicValueFunction() {}
 
+BluetoothLowEnergyWriteCharacteristicValueFunction::
+    ~BluetoothLowEnergyWriteCharacteristicValueFunction() {}
+
+bool BluetoothLowEnergyWriteCharacteristicValueFunction::ParseParams() {
+  params_ = apibtle::WriteCharacteristicValue::Params::Create(*args_);
+  return params_.get() != nullptr;
+}
+
+void BluetoothLowEnergyWriteCharacteristicValueFunction::DoWork() {
   BluetoothLowEnergyEventRouter* event_router =
       GetEventRouter(browser_context());
 
   // The adapter must be initialized at this point, but return an error instead
   // of asserting.
   if (!event_router->HasAdapter()) {
-    SetError(kErrorAdapterNotInitialized);
-    SendResponse(false);
-    return false;
+    Respond(Error(kErrorAdapterNotInitialized));
+    return;
   }
 
-  std::unique_ptr<apibtle::WriteCharacteristicValue::Params> params(
-      apibtle::WriteCharacteristicValue::Params::Create(*args_));
-  EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
-
-  std::vector<uint8_t> value(params->value.begin(), params->value.end());
+  std::vector<uint8_t> value(params_->value.begin(), params_->value.end());
   event_router->WriteCharacteristicValue(
-      extension(), params->characteristic_id, value,
+      extension(), params_->characteristic_id, value,
       base::Bind(
           &BluetoothLowEnergyWriteCharacteristicValueFunction::SuccessCallback,
           this),
       base::Bind(
           &BluetoothLowEnergyWriteCharacteristicValueFunction::ErrorCallback,
           this));
-
-  return true;
 }
 
 void BluetoothLowEnergyWriteCharacteristicValueFunction::SuccessCallback() {
-  results_ = apibtle::WriteCharacteristicValue::Results::Create();
-  SendResponse(true);
+  Respond(ArgumentList(apibtle::WriteCharacteristicValue::Results::Create()));
 }
 
 void BluetoothLowEnergyWriteCharacteristicValueFunction::ErrorCallback(
     BluetoothLowEnergyEventRouter::Status status) {
-  SetError(StatusToString(status));
-  SendResponse(false);
+  Respond(Error(StatusToString(status)));
 }
 
-bool BluetoothLowEnergyStartCharacteristicNotificationsFunction::DoWork() {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+BluetoothLowEnergyStartCharacteristicNotificationsFunction::
+    BluetoothLowEnergyStartCharacteristicNotificationsFunction() {}
 
+BluetoothLowEnergyStartCharacteristicNotificationsFunction::
+    ~BluetoothLowEnergyStartCharacteristicNotificationsFunction() {}
+
+bool BluetoothLowEnergyStartCharacteristicNotificationsFunction::ParseParams() {
+  params_ = apibtle::StartCharacteristicNotifications::Params::Create(*args_);
+  return params_.get() != nullptr;
+}
+
+void BluetoothLowEnergyStartCharacteristicNotificationsFunction::DoWork() {
   BluetoothLowEnergyEventRouter* event_router =
       GetEventRouter(browser_context());
 
   // The adapter must be initialized at this point, but return an error instead
   // of asserting.
   if (!event_router->HasAdapter()) {
-    SetError(kErrorAdapterNotInitialized);
-    SendResponse(false);
-    return false;
+    Respond(Error(kErrorAdapterNotInitialized));
+    return;
   }
 
-  std::unique_ptr<apibtle::StartCharacteristicNotifications::Params> params(
-      apibtle::StartCharacteristicNotifications::Params::Create(*args_));
-  EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
-
   bool persistent = false;  // Not persistent by default.
-  apibtle::NotificationProperties* properties = params->properties.get();
+  apibtle::NotificationProperties* properties = params_->properties.get();
   if (properties)
     persistent = properties->persistent;
 
   event_router->StartCharacteristicNotifications(
-      persistent, extension(), params->characteristic_id,
+      persistent, extension(), params_->characteristic_id,
       base::Bind(&BluetoothLowEnergyStartCharacteristicNotificationsFunction::
                      SuccessCallback,
                  this),
       base::Bind(&BluetoothLowEnergyStartCharacteristicNotificationsFunction::
                      ErrorCallback,
                  this));
-
-  return true;
 }
 
 void BluetoothLowEnergyStartCharacteristicNotificationsFunction::
     SuccessCallback() {
-  SendResponse(true);
+  Respond(NoArguments());
 }
 
 void BluetoothLowEnergyStartCharacteristicNotificationsFunction::ErrorCallback(
     BluetoothLowEnergyEventRouter::Status status) {
-  SetError(StatusToString(status));
-  SendResponse(false);
+  Respond(Error(StatusToString(status)));
 }
 
-bool BluetoothLowEnergyStopCharacteristicNotificationsFunction::DoWork() {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+BluetoothLowEnergyStopCharacteristicNotificationsFunction::
+    BluetoothLowEnergyStopCharacteristicNotificationsFunction() {}
 
+BluetoothLowEnergyStopCharacteristicNotificationsFunction::
+    ~BluetoothLowEnergyStopCharacteristicNotificationsFunction() {}
+
+bool BluetoothLowEnergyStopCharacteristicNotificationsFunction::ParseParams() {
+  params_ = apibtle::StopCharacteristicNotifications::Params::Create(*args_);
+  return params_.get() != nullptr;
+}
+
+void BluetoothLowEnergyStopCharacteristicNotificationsFunction::DoWork() {
   BluetoothLowEnergyEventRouter* event_router =
       GetEventRouter(browser_context());
 
   // The adapter must be initialized at this point, but return an error instead
   // of asserting.
   if (!event_router->HasAdapter()) {
-    SetError(kErrorAdapterNotInitialized);
-    SendResponse(false);
-    return false;
+    Respond(Error(kErrorAdapterNotInitialized));
+    return;
   }
 
-  std::unique_ptr<apibtle::StopCharacteristicNotifications::Params> params(
-      apibtle::StopCharacteristicNotifications::Params::Create(*args_));
-  EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
-
   event_router->StopCharacteristicNotifications(
-      extension(), params->characteristic_id,
+      extension(), params_->characteristic_id,
       base::Bind(&BluetoothLowEnergyStopCharacteristicNotificationsFunction::
                      SuccessCallback,
                  this),
       base::Bind(&BluetoothLowEnergyStopCharacteristicNotificationsFunction::
                      ErrorCallback,
                  this));
-
-  return true;
 }
 
 void BluetoothLowEnergyStopCharacteristicNotificationsFunction::
     SuccessCallback() {
-  SendResponse(true);
+  Respond(NoArguments());
 }
 
 void BluetoothLowEnergyStopCharacteristicNotificationsFunction::ErrorCallback(
     BluetoothLowEnergyEventRouter::Status status) {
-  SetError(StatusToString(status));
-  SendResponse(false);
+  Respond(Error(StatusToString(status)));
 }
 
-bool BluetoothLowEnergyReadDescriptorValueFunction::DoWork() {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+BluetoothLowEnergyReadDescriptorValueFunction::
+    BluetoothLowEnergyReadDescriptorValueFunction() {}
 
+BluetoothLowEnergyReadDescriptorValueFunction::
+    ~BluetoothLowEnergyReadDescriptorValueFunction() {}
+
+bool BluetoothLowEnergyReadDescriptorValueFunction::ParseParams() {
+  params_ = apibtle::ReadDescriptorValue::Params::Create(*args_);
+  return params_.get() != nullptr;
+}
+
+void BluetoothLowEnergyReadDescriptorValueFunction::DoWork() {
   BluetoothLowEnergyEventRouter* event_router =
       GetEventRouter(browser_context());
 
   // The adapter must be initialized at this point, but return an error instead
   // of asserting.
   if (!event_router->HasAdapter()) {
-    SetError(kErrorAdapterNotInitialized);
-    SendResponse(false);
-    return false;
+    Respond(Error(kErrorAdapterNotInitialized));
+    return;
   }
 
-  std::unique_ptr<apibtle::ReadDescriptorValue::Params> params(
-      apibtle::ReadDescriptorValue::Params::Create(*args_));
-  EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
-
-  instance_id_ = params->descriptor_id;
+  instance_id_ = params_->descriptor_id;
   event_router->ReadDescriptorValue(
       extension(), instance_id_,
       base::Bind(
@@ -992,8 +955,6 @@
           this),
       base::Bind(&BluetoothLowEnergyReadDescriptorValueFunction::ErrorCallback,
                  this));
-
-  return true;
 }
 
 void BluetoothLowEnergyReadDescriptorValueFunction::SuccessCallback() {
@@ -1004,63 +965,60 @@
       GetEventRouter(browser_context())
           ->GetDescriptor(extension(), instance_id_, &descriptor);
   if (status != BluetoothLowEnergyEventRouter::kStatusSuccess) {
-    SetError(StatusToString(status));
-    SendResponse(false);
+    Respond(Error(StatusToString(status)));
     return;
   }
 
   // Manually construct the result instead of using
   // apibtle::GetDescriptor::Results::Create as it doesn't convert lists of
   // enums correctly.
-  SetResult(apibtle::DescriptorToValue(&descriptor));
-  SendResponse(true);
+  Respond(OneArgument(apibtle::DescriptorToValue(&descriptor)));
 }
 
 void BluetoothLowEnergyReadDescriptorValueFunction::ErrorCallback(
     BluetoothLowEnergyEventRouter::Status status) {
-  SetError(StatusToString(status));
-  SendResponse(false);
+  Respond(Error(StatusToString(status)));
 }
 
-bool BluetoothLowEnergyWriteDescriptorValueFunction::DoWork() {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+BluetoothLowEnergyWriteDescriptorValueFunction::
+    BluetoothLowEnergyWriteDescriptorValueFunction() {}
 
+BluetoothLowEnergyWriteDescriptorValueFunction::
+    ~BluetoothLowEnergyWriteDescriptorValueFunction() {}
+
+bool BluetoothLowEnergyWriteDescriptorValueFunction::ParseParams() {
+  params_ = apibtle::WriteDescriptorValue::Params::Create(*args_);
+  return params_.get() != nullptr;
+}
+
+void BluetoothLowEnergyWriteDescriptorValueFunction::DoWork() {
   BluetoothLowEnergyEventRouter* event_router =
       GetEventRouter(browser_context());
 
   // The adapter must be initialized at this point, but return an error instead
   // of asserting.
   if (!event_router->HasAdapter()) {
-    SetError(kErrorAdapterNotInitialized);
-    SendResponse(false);
-    return false;
+    Respond(Error(kErrorAdapterNotInitialized));
+    return;
   }
 
-  std::unique_ptr<apibtle::WriteDescriptorValue::Params> params(
-      apibtle::WriteDescriptorValue::Params::Create(*args_));
-  EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
-
-  std::vector<uint8_t> value(params->value.begin(), params->value.end());
+  std::vector<uint8_t> value(params_->value.begin(), params_->value.end());
   event_router->WriteDescriptorValue(
-      extension(), params->descriptor_id, value,
+      extension(), params_->descriptor_id, value,
       base::Bind(
           &BluetoothLowEnergyWriteDescriptorValueFunction::SuccessCallback,
           this),
       base::Bind(&BluetoothLowEnergyWriteDescriptorValueFunction::ErrorCallback,
                  this));
-
-  return true;
 }
 
 void BluetoothLowEnergyWriteDescriptorValueFunction::SuccessCallback() {
-  results_ = apibtle::WriteDescriptorValue::Results::Create();
-  SendResponse(true);
+  Respond(ArgumentList(apibtle::WriteDescriptorValue::Results::Create()));
 }
 
 void BluetoothLowEnergyWriteDescriptorValueFunction::ErrorCallback(
     BluetoothLowEnergyEventRouter::Status status) {
-  SetError(StatusToString(status));
-  SendResponse(false);
+  Respond(Error(StatusToString(status)));
 }
 
 BluetoothLowEnergyAdvertisementFunction::
@@ -1094,25 +1052,11 @@
   return advertisements_manager_->GetResourceIds(extension_id());
 }
 
-bool BluetoothLowEnergyAdvertisementFunction::RunAsync() {
+ExtensionFunction::ResponseAction
+BluetoothLowEnergyAdvertisementFunction::Run() {
   Initialize();
 
-  // Check permission in the manifest.
-  if (!BluetoothManifestData::CheckPeripheralPermitted(extension())) {
-    SetError(kErrorPermissionDenied);
-    return false;
-  }
-
-  // For advertisement API to be available the app has to be either auto
-  // launched in Kiosk Mode or the enable-ble-advertisement-in-apps
-  // should be set.
-  if (!(IsAutoLaunchedKioskApp(extension()->id()) ||
-        IsPeripheralFlagEnabled())) {
-    SetError(kErrorPermissionDenied);
-    return false;
-  }
-
-  return BluetoothLowEnergyExtensionFunctionDeprecated::RunAsync();
+  return BLEPeripheralExtensionFunction::Run();
 }
 
 void BluetoothLowEnergyAdvertisementFunction::Initialize() {
@@ -1122,27 +1066,31 @@
 
 // RegisterAdvertisement:
 
-bool BluetoothLowEnergyRegisterAdvertisementFunction::DoWork() {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+BluetoothLowEnergyRegisterAdvertisementFunction::
+    BluetoothLowEnergyRegisterAdvertisementFunction() {}
 
+BluetoothLowEnergyRegisterAdvertisementFunction::
+    ~BluetoothLowEnergyRegisterAdvertisementFunction() {}
+
+bool BluetoothLowEnergyRegisterAdvertisementFunction::ParseParams() {
+  params_ = apibtle::RegisterAdvertisement::Params::Create(*args_);
+  return params_.get() != nullptr;
+}
+
+void BluetoothLowEnergyRegisterAdvertisementFunction::DoWork() {
   BluetoothLowEnergyEventRouter* event_router =
       GetEventRouter(browser_context());
 
   // The adapter must be initialized at this point, but return an error instead
   // of asserting.
   if (!event_router->HasAdapter()) {
-    SetError(kErrorAdapterNotInitialized);
-    SendResponse(false);
-    return false;
+    Respond(Error(kErrorAdapterNotInitialized));
+    return;
   }
 
-  std::unique_ptr<apibtle::RegisterAdvertisement::Params> params(
-      apibtle::RegisterAdvertisement::Params::Create(*args_));
-  EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
-
   std::unique_ptr<device::BluetoothAdvertisement::Data> advertisement_data(
       new device::BluetoothAdvertisement::Data(
-          params->advertisement.type ==
+          params_->advertisement.type ==
                   apibtle::AdvertisementType::ADVERTISEMENT_TYPE_BROADCAST
               ? device::BluetoothAdvertisement::AdvertisementType::
                     ADVERTISEMENT_TYPE_BROADCAST
@@ -1150,16 +1098,16 @@
                     ADVERTISEMENT_TYPE_PERIPHERAL));
 
   advertisement_data->set_service_uuids(
-      std::move(params->advertisement.service_uuids));
+      std::move(params_->advertisement.service_uuids));
   advertisement_data->set_solicit_uuids(
-      std::move(params->advertisement.solicit_uuids));
-  if (params->advertisement.manufacturer_data) {
+      std::move(params_->advertisement.solicit_uuids));
+  if (params_->advertisement.manufacturer_data) {
     advertisement_data->set_manufacturer_data(
-        CreateManufacturerData(params->advertisement.manufacturer_data.get()));
+        CreateManufacturerData(params_->advertisement.manufacturer_data.get()));
   }
-  if (params->advertisement.service_data) {
+  if (params_->advertisement.service_data) {
     advertisement_data->set_service_data(
-        CreateServiceData(params->advertisement.service_data.get()));
+        CreateServiceData(params_->advertisement.service_data.get()));
   }
 
   event_router->adapter()->RegisterAdvertisement(
@@ -1170,15 +1118,13 @@
       base::Bind(
           &BluetoothLowEnergyRegisterAdvertisementFunction::ErrorCallback,
           this));
-
-  return true;
 }
 
 void BluetoothLowEnergyRegisterAdvertisementFunction::SuccessCallback(
     scoped_refptr<device::BluetoothAdvertisement> advertisement) {
-  results_ = apibtle::RegisterAdvertisement::Results::Create(AddAdvertisement(
-      new BluetoothApiAdvertisement(extension_id(), advertisement)));
-  SendResponse(true);
+  Respond(ArgumentList(
+      apibtle::RegisterAdvertisement::Results::Create(AddAdvertisement(
+          new BluetoothApiAdvertisement(extension_id(), advertisement)))));
 }
 
 void BluetoothLowEnergyRegisterAdvertisementFunction::ErrorCallback(
@@ -1186,57 +1132,60 @@
   switch (status) {
     case device::BluetoothAdvertisement::ErrorCode::
         ERROR_ADVERTISEMENT_ALREADY_EXISTS:
-      SetError(kStatusAdvertisementAlreadyExists);
+      Respond(Error(kStatusAdvertisementAlreadyExists));
       break;
     case device::BluetoothAdvertisement::ErrorCode::
         ERROR_ADVERTISEMENT_INVALID_LENGTH:
-      SetError(kErrorInvalidAdvertisementLength);
+      Respond(Error(kErrorInvalidAdvertisementLength));
       break;
     default:
-      SetError(kErrorOperationFailed);
+      Respond(Error(kErrorOperationFailed));
   }
-  SendResponse(false);
 }
 
 // UnregisterAdvertisement:
 
-bool BluetoothLowEnergyUnregisterAdvertisementFunction::DoWork() {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+BluetoothLowEnergyUnregisterAdvertisementFunction::
+    BluetoothLowEnergyUnregisterAdvertisementFunction() {}
 
+BluetoothLowEnergyUnregisterAdvertisementFunction::
+    ~BluetoothLowEnergyUnregisterAdvertisementFunction() {}
+
+bool BluetoothLowEnergyUnregisterAdvertisementFunction::ParseParams() {
+  params_ = apibtle::UnregisterAdvertisement::Params::Create(*args_);
+  return params_.get() != nullptr;
+}
+
+void BluetoothLowEnergyUnregisterAdvertisementFunction::DoWork() {
   BluetoothLowEnergyEventRouter* event_router =
       GetEventRouter(browser_context());
 
   // If we don't have an initialized adapter, unregistering is a no-op.
-  if (!event_router->HasAdapter())
-    return true;
-
-  std::unique_ptr<apibtle::UnregisterAdvertisement::Params> params(
-      apibtle::UnregisterAdvertisement::Params::Create(*args_));
-  EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
+  if (!event_router->HasAdapter()) {
+    Respond(NoArguments());
+    return;
+  }
 
   BluetoothApiAdvertisement* advertisement =
-      GetAdvertisement(params->advertisement_id);
+      GetAdvertisement(params_->advertisement_id);
   if (!advertisement) {
-    error_ = kStatusAdvertisementDoesNotExist;
-    SendResponse(false);
-    return false;
+    Respond(Error(kStatusAdvertisementDoesNotExist));
+    return;
   }
 
   advertisement->advertisement()->Unregister(
       base::Bind(
           &BluetoothLowEnergyUnregisterAdvertisementFunction::SuccessCallback,
-          this, params->advertisement_id),
+          this, params_->advertisement_id),
       base::Bind(
           &BluetoothLowEnergyUnregisterAdvertisementFunction::ErrorCallback,
-          this, params->advertisement_id));
-
-  return true;
+          this, params_->advertisement_id));
 }
 
 void BluetoothLowEnergyUnregisterAdvertisementFunction::SuccessCallback(
     int advertisement_id) {
   RemoveAdvertisement(advertisement_id);
-  SendResponse(true);
+  Respond(NoArguments());
 }
 
 void BluetoothLowEnergyUnregisterAdvertisementFunction::ErrorCallback(
@@ -1246,33 +1195,40 @@
   switch (status) {
     case device::BluetoothAdvertisement::ErrorCode::
         ERROR_ADVERTISEMENT_DOES_NOT_EXIST:
-      SetError(kStatusAdvertisementDoesNotExist);
+      Respond(Error(kStatusAdvertisementDoesNotExist));
       break;
     default:
-      SetError(kErrorOperationFailed);
+      Respond(Error(kErrorOperationFailed));
   }
-  SendResponse(false);
 }
 
 // ResetAdvertising:
 
-bool BluetoothLowEnergyResetAdvertisingFunction::DoWork() {
-#if defined(OS_CHROMEOS) || defined(OS_LINUX)
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+BluetoothLowEnergyResetAdvertisingFunction::
+    BluetoothLowEnergyResetAdvertisingFunction() {}
 
+BluetoothLowEnergyResetAdvertisingFunction::
+    ~BluetoothLowEnergyResetAdvertisingFunction() {}
+
+bool BluetoothLowEnergyResetAdvertisingFunction::ParseParams() {
+  return true;
+}
+
+void BluetoothLowEnergyResetAdvertisingFunction::DoWork() {
+#if defined(OS_CHROMEOS) || defined(OS_LINUX)
   BluetoothLowEnergyEventRouter* event_router =
       GetEventRouter(browser_context());
 
   // If the adapter is not initialized, there is nothing to reset.
   if (!event_router->HasAdapter()) {
-    SendResponse(true);
-    return true;
+    Respond(NoArguments());
+    return;
   }
 
   const base::hash_set<int>* advertisement_ids = GetAdvertisementIds();
   if (!advertisement_ids || advertisement_ids->empty()) {
-    SendResponse(true);
-    return true;
+    Respond(NoArguments());
+    return;
   }
 
   // Copy the hash set, as RemoveAdvertisement can change advertisement_ids
@@ -1288,24 +1244,29 @@
       base::Bind(&BluetoothLowEnergyResetAdvertisingFunction::ErrorCallback,
                  this));
 #endif
-
-  return true;
 }
 
 void BluetoothLowEnergyResetAdvertisingFunction::SuccessCallback() {
-  SendResponse(true);
+  Respond(NoArguments());
 }
 
 void BluetoothLowEnergyResetAdvertisingFunction::ErrorCallback(
     device::BluetoothAdvertisement::ErrorCode status) {
-  error_ = kErrorOperationFailed;
-  SendResponse(false);
+  Respond(Error(kErrorOperationFailed));
 }
 
 // SetAdvertisingInterval:
 
-template class BLEPeripheralExtensionFunction<
-    apibtle::SetAdvertisingInterval::Params>;
+BluetoothLowEnergySetAdvertisingIntervalFunction::
+    BluetoothLowEnergySetAdvertisingIntervalFunction() {}
+
+BluetoothLowEnergySetAdvertisingIntervalFunction::
+    ~BluetoothLowEnergySetAdvertisingIntervalFunction() {}
+
+bool BluetoothLowEnergySetAdvertisingIntervalFunction::ParseParams() {
+  params_ = apibtle::SetAdvertisingInterval::Params::Create(*args_);
+  return params_.get() != nullptr;
+}
 
 void BluetoothLowEnergySetAdvertisingIntervalFunction::DoWork() {
 #if defined(OS_CHROMEOS) || defined(OS_LINUX)
@@ -1343,10 +1304,23 @@
 
 // createService:
 
-template class BLEPeripheralExtensionFunction<apibtle::CreateService::Params>;
+BluetoothLowEnergyCreateServiceFunction::
+    BluetoothLowEnergyCreateServiceFunction() {}
+
+BluetoothLowEnergyCreateServiceFunction::
+    ~BluetoothLowEnergyCreateServiceFunction() {}
+
+bool BluetoothLowEnergyCreateServiceFunction::ParseParams() {
+// Causes link error on Windows. API will never be on Windows, so #ifdefing.
+#if !defined(OS_WIN)
+  params_ = apibtle::CreateService::Params::Create(*args_);
+  return params_.get() != nullptr;
+#else
+  return true;
+#endif
+}
 
 void BluetoothLowEnergyCreateServiceFunction::DoWork() {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
 // Causes link error on Windows. API will never be on Windows, so #ifdefing.
 // TODO: Ideally this should be handled by our feature system, so that this
 // code doesn't even compile on OSes it isn't being used on, but currently this
@@ -1368,8 +1342,16 @@
 
 // createCharacteristic:
 
-template class BLEPeripheralExtensionFunction<
-    apibtle::CreateCharacteristic::Params>;
+BluetoothLowEnergyCreateCharacteristicFunction::
+    BluetoothLowEnergyCreateCharacteristicFunction() {}
+
+BluetoothLowEnergyCreateCharacteristicFunction::
+    ~BluetoothLowEnergyCreateCharacteristicFunction() {}
+
+bool BluetoothLowEnergyCreateCharacteristicFunction::ParseParams() {
+  params_ = apibtle::CreateCharacteristic::Params::Create(*args_);
+  return params_.get() != nullptr;
+}
 
 void BluetoothLowEnergyCreateCharacteristicFunction::DoWork() {
   device::BluetoothLocalGattService* service =
@@ -1396,8 +1378,16 @@
 
 // createDescriptor:
 
-template class BLEPeripheralExtensionFunction<
-    apibtle::CreateDescriptor::Params>;
+BluetoothLowEnergyCreateDescriptorFunction::
+    BluetoothLowEnergyCreateDescriptorFunction() {}
+
+BluetoothLowEnergyCreateDescriptorFunction::
+    ~BluetoothLowEnergyCreateDescriptorFunction() {}
+
+bool BluetoothLowEnergyCreateDescriptorFunction::ParseParams() {
+  params_ = apibtle::CreateDescriptor::Params::Create(*args_);
+  return params_.get() != nullptr;
+}
 
 void BluetoothLowEnergyCreateDescriptorFunction::DoWork() {
   device::BluetoothLocalGattCharacteristic* characteristic =
@@ -1419,7 +1409,16 @@
 
 // registerService:
 
-template class BLEPeripheralExtensionFunction<apibtle::RegisterService::Params>;
+BluetoothLowEnergyRegisterServiceFunction::
+    BluetoothLowEnergyRegisterServiceFunction() {}
+
+BluetoothLowEnergyRegisterServiceFunction::
+    ~BluetoothLowEnergyRegisterServiceFunction() {}
+
+bool BluetoothLowEnergyRegisterServiceFunction::ParseParams() {
+  params_ = apibtle::RegisterService::Params::Create(*args_);
+  return params_.get() != nullptr;
+}
 
 void BluetoothLowEnergyRegisterServiceFunction::DoWork() {
   event_router_->RegisterGattService(
@@ -1441,8 +1440,16 @@
 
 // unregisterService:
 
-template class BLEPeripheralExtensionFunction<
-    apibtle::UnregisterService::Params>;
+BluetoothLowEnergyUnregisterServiceFunction::
+    BluetoothLowEnergyUnregisterServiceFunction() {}
+
+BluetoothLowEnergyUnregisterServiceFunction::
+    ~BluetoothLowEnergyUnregisterServiceFunction() {}
+
+bool BluetoothLowEnergyUnregisterServiceFunction::ParseParams() {
+  params_ = apibtle::UnregisterService::Params::Create(*args_);
+  return params_.get() != nullptr;
+}
 
 void BluetoothLowEnergyUnregisterServiceFunction::DoWork() {
   event_router_->UnregisterGattService(
@@ -1464,8 +1471,16 @@
 
 // notifyCharacteristicValueChanged:
 
-template class BLEPeripheralExtensionFunction<
-    apibtle::NotifyCharacteristicValueChanged::Params>;
+BluetoothLowEnergyNotifyCharacteristicValueChangedFunction::
+    BluetoothLowEnergyNotifyCharacteristicValueChangedFunction() {}
+
+BluetoothLowEnergyNotifyCharacteristicValueChangedFunction::
+    ~BluetoothLowEnergyNotifyCharacteristicValueChangedFunction() {}
+
+bool BluetoothLowEnergyNotifyCharacteristicValueChangedFunction::ParseParams() {
+  params_ = apibtle::NotifyCharacteristicValueChanged::Params::Create(*args_);
+  return params_.get() != nullptr;
+}
 
 void BluetoothLowEnergyNotifyCharacteristicValueChangedFunction::DoWork() {
   device::BluetoothLocalGattCharacteristic* characteristic =
@@ -1505,7 +1520,16 @@
 
 // removeService:
 
-template class BLEPeripheralExtensionFunction<apibtle::RemoveService::Params>;
+BluetoothLowEnergyRemoveServiceFunction::
+    BluetoothLowEnergyRemoveServiceFunction() {}
+
+BluetoothLowEnergyRemoveServiceFunction::
+    ~BluetoothLowEnergyRemoveServiceFunction() {}
+
+bool BluetoothLowEnergyRemoveServiceFunction::ParseParams() {
+  params_ = apibtle::RemoveService::Params::Create(*args_);
+  return params_.get() != nullptr;
+}
 
 void BluetoothLowEnergyRemoveServiceFunction::DoWork() {
   device::BluetoothLocalGattService* service =
@@ -1521,8 +1545,16 @@
 
 // sendRequestResponse:
 
-template class BLEPeripheralExtensionFunction<
-    apibtle::SendRequestResponse::Params>;
+BluetoothLowEnergySendRequestResponseFunction::
+    BluetoothLowEnergySendRequestResponseFunction() {}
+
+BluetoothLowEnergySendRequestResponseFunction::
+    ~BluetoothLowEnergySendRequestResponseFunction() {}
+
+bool BluetoothLowEnergySendRequestResponseFunction::ParseParams() {
+  params_ = apibtle::SendRequestResponse::Params::Create(*args_);
+  return params_.get() != nullptr;
+}
 
 void BluetoothLowEnergySendRequestResponseFunction::DoWork() {
   std::vector<uint8_t> uint8_vector;
diff --git a/extensions/browser/api/bluetooth_low_energy/bluetooth_low_energy_api.h b/extensions/browser/api/bluetooth_low_energy/bluetooth_low_energy_api.h
index 26c3303d..69d72ca 100644
--- a/extensions/browser/api/bluetooth_low_energy/bluetooth_low_energy_api.h
+++ b/extensions/browser/api/bluetooth_low_energy/bluetooth_low_energy_api.h
@@ -89,34 +89,6 @@
 // Base class for bluetoothLowEnergy API functions. This class handles some of
 // the common logic involved in all API functions, such as checking for
 // platform support and returning the correct error.
-//
-// DEPRECATED: This inherits from AsyncExtensionFunction, which we're trying to
-// get rid of for various reasons. Please inherit from the
-// BluetoothLowEnergyExtensionFunction class instead.
-class BluetoothLowEnergyExtensionFunctionDeprecated
-    : public AsyncExtensionFunction {
- public:
-  BluetoothLowEnergyExtensionFunctionDeprecated();
-
- protected:
-  ~BluetoothLowEnergyExtensionFunctionDeprecated() override;
-
-  // AsyncExtensionFunction override.
-  bool RunAsync() override;
-
-  // Implemented by individual bluetoothLowEnergy extension functions to perform
-  // the body of the function. This invoked asynchonously after RunAsync after
-  // the BluetoothLowEnergyEventRouter has obtained a handle on the
-  // BluetoothAdapter.
-  virtual bool DoWork() = 0;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(BluetoothLowEnergyExtensionFunctionDeprecated);
-};
-
-// Replacement for BluetoothLowEnergyExtensionFunctionDeprecated. Has the same
-// functionality except that instead of the SendResponse/return combo, we'll
-// return our response with Respond().
 class BluetoothLowEnergyExtensionFunction : public UIThreadExtensionFunction {
  public:
   BluetoothLowEnergyExtensionFunction();
@@ -133,6 +105,12 @@
   // BluetoothAdapter.
   virtual void DoWork() = 0;
 
+  // Subclasses to implement this method to set and validate its type-specific
+  // params. This method should return true if the params is valid and
+  // false otherwise. This method is called before DoWork() to allow early exit
+  // in the case of invalid params.
+  virtual bool ParseParams() = 0;
+
   BluetoothLowEnergyEventRouter* event_router_;
 
  private:
@@ -146,7 +124,6 @@
 // handles some of the common logic involved in all API peripheral mode
 // functions, such as checking for peripheral permissions and returning the
 // correct error.
-template <typename Params>
 class BLEPeripheralExtensionFunction
     : public BluetoothLowEnergyExtensionFunction {
  public:
@@ -158,28 +135,26 @@
   // ExtensionFunction override.
   ResponseAction Run() override;
 
-// Causes link error on Windows. API will never be on Windows, so #ifdefing.
-#if !defined(OS_WIN)
-  std::unique_ptr<Params> params_;
-#else
-  Params* params_;
-#endif
-
  private:
   DISALLOW_COPY_AND_ASSIGN(BLEPeripheralExtensionFunction);
 };
 
 class BluetoothLowEnergyConnectFunction
-    : public BluetoothLowEnergyExtensionFunctionDeprecated {
+    : public BluetoothLowEnergyExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.connect",
                              BLUETOOTHLOWENERGY_CONNECT);
 
- protected:
-  ~BluetoothLowEnergyConnectFunction() override {}
+  BluetoothLowEnergyConnectFunction();
 
-  // BluetoothLowEnergyExtensionFunctionDeprecated override.
-  bool DoWork() override;
+ protected:
+  ~BluetoothLowEnergyConnectFunction() override;
+
+  // BluetoothLowEnergyExtensionFunction override.
+  void DoWork() override;
+  bool ParseParams() override;
+
+  std::unique_ptr<bluetooth_low_energy::Connect::Params> params_;
 
  private:
   // Success and error callbacks, called by
@@ -189,16 +164,21 @@
 };
 
 class BluetoothLowEnergyDisconnectFunction
-    : public BluetoothLowEnergyExtensionFunctionDeprecated {
+    : public BluetoothLowEnergyExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.disconnect",
                              BLUETOOTHLOWENERGY_DISCONNECT);
 
- protected:
-  ~BluetoothLowEnergyDisconnectFunction() override {}
+  BluetoothLowEnergyDisconnectFunction();
 
-  // BluetoothLowEnergyExtensionFunctionDeprecated override.
-  bool DoWork() override;
+ protected:
+  ~BluetoothLowEnergyDisconnectFunction() override;
+
+  // BluetoothLowEnergyExtensionFunction override.
+  void DoWork() override;
+  bool ParseParams() override;
+
+  std::unique_ptr<bluetooth_low_energy::Disconnect::Params> params_;
 
  private:
   // Success and error callbacks, called by
@@ -208,107 +188,148 @@
 };
 
 class BluetoothLowEnergyGetServiceFunction
-    : public BluetoothLowEnergyExtensionFunctionDeprecated {
+    : public BluetoothLowEnergyExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.getService",
                              BLUETOOTHLOWENERGY_GETSERVICE);
 
- protected:
-  ~BluetoothLowEnergyGetServiceFunction() override {}
+  BluetoothLowEnergyGetServiceFunction();
 
-  // BluetoothLowEnergyExtensionFunctionDeprecated override.
-  bool DoWork() override;
+ protected:
+  ~BluetoothLowEnergyGetServiceFunction() override;
+
+  // BluetoothLowEnergyExtensionFunction override.
+  void DoWork() override;
+  bool ParseParams() override;
+
+  std::unique_ptr<bluetooth_low_energy::GetService::Params> params_;
 };
 
 class BluetoothLowEnergyGetServicesFunction
-    : public BluetoothLowEnergyExtensionFunctionDeprecated {
+    : public BluetoothLowEnergyExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.getServices",
                              BLUETOOTHLOWENERGY_GETSERVICES);
 
- protected:
-  ~BluetoothLowEnergyGetServicesFunction() override {}
+  BluetoothLowEnergyGetServicesFunction();
 
-  // BluetoothLowEnergyExtensionFunctionDeprecated override.
-  bool DoWork() override;
+ protected:
+  ~BluetoothLowEnergyGetServicesFunction() override;
+
+  // BluetoothLowEnergyExtensionFunction override.
+  void DoWork() override;
+  bool ParseParams() override;
+
+  std::unique_ptr<bluetooth_low_energy::GetServices::Params> params_;
 };
 
 class BluetoothLowEnergyGetCharacteristicFunction
-    : public BluetoothLowEnergyExtensionFunctionDeprecated {
+    : public BluetoothLowEnergyExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.getCharacteristic",
                              BLUETOOTHLOWENERGY_GETCHARACTERISTIC);
 
- protected:
-  ~BluetoothLowEnergyGetCharacteristicFunction() override {}
+  BluetoothLowEnergyGetCharacteristicFunction();
 
-  // BluetoothLowEnergyExtensionFunctionDeprecated override.
-  bool DoWork() override;
+ protected:
+  ~BluetoothLowEnergyGetCharacteristicFunction() override;
+
+  // BluetoothLowEnergyExtensionFunction override.
+  void DoWork() override;
+  bool ParseParams() override;
+
+  std::unique_ptr<bluetooth_low_energy::GetCharacteristic::Params> params_;
 };
 
 class BluetoothLowEnergyGetCharacteristicsFunction
-    : public BluetoothLowEnergyExtensionFunctionDeprecated {
+    : public BluetoothLowEnergyExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.getCharacteristics",
                              BLUETOOTHLOWENERGY_GETCHARACTERISTICS);
 
- protected:
-  ~BluetoothLowEnergyGetCharacteristicsFunction() override {}
+  BluetoothLowEnergyGetCharacteristicsFunction();
 
-  // BluetoothLowEnergyExtensionFunctionDeprecated override.
-  bool DoWork() override;
+ protected:
+  ~BluetoothLowEnergyGetCharacteristicsFunction() override;
+
+  // BluetoothLowEnergyExtensionFunction override.
+  void DoWork() override;
+  bool ParseParams() override;
+
+  std::unique_ptr<bluetooth_low_energy::GetCharacteristics::Params> params_;
 };
 
 class BluetoothLowEnergyGetIncludedServicesFunction
-    : public BluetoothLowEnergyExtensionFunctionDeprecated {
+    : public BluetoothLowEnergyExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.getIncludedServices",
                              BLUETOOTHLOWENERGY_GETINCLUDEDSERVICES);
 
- protected:
-  ~BluetoothLowEnergyGetIncludedServicesFunction() override {}
+  BluetoothLowEnergyGetIncludedServicesFunction();
 
-  // BluetoothLowEnergyExtensionFunctionDeprecated override.
-  bool DoWork() override;
+ protected:
+  ~BluetoothLowEnergyGetIncludedServicesFunction() override;
+
+  // BluetoothLowEnergyExtensionFunction override.
+  void DoWork() override;
+  bool ParseParams() override;
+
+  std::unique_ptr<bluetooth_low_energy::GetIncludedServices::Params> params_;
 };
 
 class BluetoothLowEnergyGetDescriptorFunction
-    : public BluetoothLowEnergyExtensionFunctionDeprecated {
+    : public BluetoothLowEnergyExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.getDescriptor",
                              BLUETOOTHLOWENERGY_GETDESCRIPTOR);
 
- protected:
-  ~BluetoothLowEnergyGetDescriptorFunction() override {}
+  BluetoothLowEnergyGetDescriptorFunction();
 
-  // BluetoothLowEnergyExtensionFunctionDeprecated override.
-  bool DoWork() override;
+ protected:
+  ~BluetoothLowEnergyGetDescriptorFunction() override;
+
+  // BluetoothLowEnergyExtensionFunction override.
+  void DoWork() override;
+  bool ParseParams() override;
+
+  std::unique_ptr<bluetooth_low_energy::GetDescriptor::Params> params_;
 };
 
 class BluetoothLowEnergyGetDescriptorsFunction
-    : public BluetoothLowEnergyExtensionFunctionDeprecated {
+    : public BluetoothLowEnergyExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.getDescriptors",
                              BLUETOOTHLOWENERGY_GETDESCRIPTORS);
 
- protected:
-  ~BluetoothLowEnergyGetDescriptorsFunction() override {}
+  BluetoothLowEnergyGetDescriptorsFunction();
 
-  // BluetoothLowEnergyExtensionFunctionDeprecated override.
-  bool DoWork() override;
+ protected:
+  ~BluetoothLowEnergyGetDescriptorsFunction() override;
+
+  // BluetoothLowEnergyExtensionFunction override.
+  void DoWork() override;
+  bool ParseParams() override;
+
+  std::unique_ptr<bluetooth_low_energy::GetDescriptors::Params> params_;
 };
 
 class BluetoothLowEnergyReadCharacteristicValueFunction
-    : public BluetoothLowEnergyExtensionFunctionDeprecated {
+    : public BluetoothLowEnergyExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.readCharacteristicValue",
                              BLUETOOTHLOWENERGY_READCHARACTERISTICVALUE);
 
- protected:
-  ~BluetoothLowEnergyReadCharacteristicValueFunction() override {}
+  BluetoothLowEnergyReadCharacteristicValueFunction();
 
-  // BluetoothLowEnergyExtensionFunctionDeprecated override.
-  bool DoWork() override;
+ protected:
+  ~BluetoothLowEnergyReadCharacteristicValueFunction() override;
+
+  // BluetoothLowEnergyExtensionFunction override.
+  void DoWork() override;
+  bool ParseParams() override;
+
+  std::unique_ptr<bluetooth_low_energy::ReadCharacteristicValue::Params>
+      params_;
 
  private:
   // Success and error callbacks, called by
@@ -321,16 +342,22 @@
 };
 
 class BluetoothLowEnergyWriteCharacteristicValueFunction
-    : public BluetoothLowEnergyExtensionFunctionDeprecated {
+    : public BluetoothLowEnergyExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.writeCharacteristicValue",
                              BLUETOOTHLOWENERGY_WRITECHARACTERISTICVALUE);
 
- protected:
-  ~BluetoothLowEnergyWriteCharacteristicValueFunction() override {}
+  BluetoothLowEnergyWriteCharacteristicValueFunction();
 
-  // BluetoothLowEnergyExtensionFunctionDeprecated override.
-  bool DoWork() override;
+ protected:
+  ~BluetoothLowEnergyWriteCharacteristicValueFunction() override;
+
+  // BluetoothLowEnergyExtensionFunction override.
+  void DoWork() override;
+  bool ParseParams() override;
+
+  std::unique_ptr<bluetooth_low_energy::WriteCharacteristicValue::Params>
+      params_;
 
  private:
   // Success and error callbacks, called by
@@ -343,17 +370,24 @@
 };
 
 class BluetoothLowEnergyStartCharacteristicNotificationsFunction
-    : public BluetoothLowEnergyExtensionFunctionDeprecated {
+    : public BluetoothLowEnergyExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION(
       "bluetoothLowEnergy.startCharacteristicNotifications",
       BLUETOOTHLOWENERGY_STARTCHARACTERISTICNOTIFICATIONS);
 
- protected:
-  ~BluetoothLowEnergyStartCharacteristicNotificationsFunction() override {}
+  BluetoothLowEnergyStartCharacteristicNotificationsFunction();
 
-  // BluetoothLowEnergyExtensionFunctionDeprecated override.
-  bool DoWork() override;
+ protected:
+  ~BluetoothLowEnergyStartCharacteristicNotificationsFunction() override;
+
+  // BluetoothLowEnergyExtensionFunction override.
+  void DoWork() override;
+  bool ParseParams() override;
+
+  std::unique_ptr<
+      bluetooth_low_energy::StartCharacteristicNotifications::Params>
+      params_;
 
  private:
   // Success and error callbacks, called by
@@ -363,17 +397,23 @@
 };
 
 class BluetoothLowEnergyStopCharacteristicNotificationsFunction
-    : public BluetoothLowEnergyExtensionFunctionDeprecated {
+    : public BluetoothLowEnergyExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION(
       "bluetoothLowEnergy.stopCharacteristicNotifications",
       BLUETOOTHLOWENERGY_STOPCHARACTERISTICNOTIFICATIONS);
 
- protected:
-  ~BluetoothLowEnergyStopCharacteristicNotificationsFunction() override {}
+  BluetoothLowEnergyStopCharacteristicNotificationsFunction();
 
-  // BluetoothLowEnergyExtensionFunctionDeprecated override.
-  bool DoWork() override;
+ protected:
+  ~BluetoothLowEnergyStopCharacteristicNotificationsFunction() override;
+
+  // BluetoothLowEnergyExtensionFunction override.
+  void DoWork() override;
+  bool ParseParams() override;
+
+  std::unique_ptr<bluetooth_low_energy::StopCharacteristicNotifications::Params>
+      params_;
 
  private:
   // Success and error callbacks, called by
@@ -383,16 +423,21 @@
 };
 
 class BluetoothLowEnergyReadDescriptorValueFunction
-    : public BluetoothLowEnergyExtensionFunctionDeprecated {
+    : public BluetoothLowEnergyExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.readDescriptorValue",
                              BLUETOOTHLOWENERGY_READDESCRIPTORVALUE);
 
- protected:
-  ~BluetoothLowEnergyReadDescriptorValueFunction() override {}
+  BluetoothLowEnergyReadDescriptorValueFunction();
 
-  // BluetoothLowEnergyExtensionFunctionDeprecated override.
-  bool DoWork() override;
+ protected:
+  ~BluetoothLowEnergyReadDescriptorValueFunction() override;
+
+  // BluetoothLowEnergyExtensionFunction override.
+  void DoWork() override;
+  bool ParseParams() override;
+
+  std::unique_ptr<bluetooth_low_energy::ReadDescriptorValue::Params> params_;
 
  private:
   // Success and error callbacks, called by
@@ -405,16 +450,21 @@
 };
 
 class BluetoothLowEnergyWriteDescriptorValueFunction
-    : public BluetoothLowEnergyExtensionFunctionDeprecated {
+    : public BluetoothLowEnergyExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.writeDescriptorValue",
                              BLUETOOTHLOWENERGY_WRITEDESCRIPTORVALUE);
 
- protected:
-  ~BluetoothLowEnergyWriteDescriptorValueFunction() override {}
+  BluetoothLowEnergyWriteDescriptorValueFunction();
 
-  // BluetoothLowEnergyExtensionFunctionDeprecated override.
-  bool DoWork() override;
+ protected:
+  ~BluetoothLowEnergyWriteDescriptorValueFunction() override;
+
+  // BluetoothLowEnergyExtensionFunction override.
+  void DoWork() override;
+  bool ParseParams() override;
+
+  std::unique_ptr<bluetooth_low_energy::WriteDescriptorValue::Params> params_;
 
  private:
   // Success and error callbacks, called by
@@ -427,7 +477,7 @@
 };
 
 class BluetoothLowEnergyAdvertisementFunction
-    : public BluetoothLowEnergyExtensionFunctionDeprecated {
+    : public BLEPeripheralExtensionFunction {
  public:
   BluetoothLowEnergyAdvertisementFunction();
 
@@ -441,7 +491,7 @@
   const base::hash_set<int>* GetAdvertisementIds();
 
   // ExtensionFunction override.
-  bool RunAsync() override;
+  ResponseAction Run() override;
 
  private:
   void Initialize();
@@ -457,11 +507,16 @@
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.registerAdvertisement",
                              BLUETOOTHLOWENERGY_REGISTERADVERTISEMENT);
 
- protected:
-  ~BluetoothLowEnergyRegisterAdvertisementFunction() override {}
+  BluetoothLowEnergyRegisterAdvertisementFunction();
 
-  // BluetoothLowEnergyExtensionFunctionDeprecated override.
-  bool DoWork() override;
+ protected:
+  ~BluetoothLowEnergyRegisterAdvertisementFunction() override;
+
+  // BluetoothLowEnergyExtensionFunction override.
+  void DoWork() override;
+  bool ParseParams() override;
+
+  std::unique_ptr<bluetooth_low_energy::RegisterAdvertisement::Params> params_;
 
  private:
   void SuccessCallback(scoped_refptr<device::BluetoothAdvertisement>);
@@ -474,11 +529,17 @@
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.unregisterAdvertisement",
                              BLUETOOTHLOWENERGY_UNREGISTERADVERTISEMENT);
 
- protected:
-  ~BluetoothLowEnergyUnregisterAdvertisementFunction() override {}
+  BluetoothLowEnergyUnregisterAdvertisementFunction();
 
-  // BluetoothLowEnergyExtensionFunctionDeprecated override.
-  bool DoWork() override;
+ protected:
+  ~BluetoothLowEnergyUnregisterAdvertisementFunction() override;
+
+  // BluetoothLowEnergyExtensionFunction override.
+  void DoWork() override;
+  bool ParseParams() override;
+
+  std::unique_ptr<bluetooth_low_energy::UnregisterAdvertisement::Params>
+      params_;
 
  private:
   void SuccessCallback(int advertisement_id);
@@ -492,11 +553,14 @@
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.resetAdvertising",
                              BLUETOOTHLOWENERGY_RESETADVERTISING);
 
- protected:
-  ~BluetoothLowEnergyResetAdvertisingFunction() override {}
+  BluetoothLowEnergyResetAdvertisingFunction();
 
-  // BluetoothLowEnergyExtensionFunctionDeprecated override.
-  bool DoWork() override;
+ protected:
+  ~BluetoothLowEnergyResetAdvertisingFunction() override;
+
+  // BluetoothLowEnergyExtensionFunction override.
+  void DoWork() override;
+  bool ParseParams() override;
 
  private:
   void SuccessCallback();
@@ -504,18 +568,21 @@
 };
 
 class BluetoothLowEnergySetAdvertisingIntervalFunction
-    : public BLEPeripheralExtensionFunction<
-          extensions::api::bluetooth_low_energy::SetAdvertisingInterval::
-              Params> {
+    : public BLEPeripheralExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.setAdvertisingInterval",
                              BLUETOOTHLOWENERGY_SETADVERTISINGINTERVAL);
 
- protected:
-  ~BluetoothLowEnergySetAdvertisingIntervalFunction() override {}
+  BluetoothLowEnergySetAdvertisingIntervalFunction();
 
-  // BluetoothLowEnergyExtensionFunctionDeprecated override.
+ protected:
+  ~BluetoothLowEnergySetAdvertisingIntervalFunction() override;
+
+  // BluetoothLowEnergyExtensionFunction override.
   void DoWork() override;
+  bool ParseParams() override;
+
+  std::unique_ptr<bluetooth_low_energy::SetAdvertisingInterval::Params> params_;
 
  private:
   void SuccessCallback();
@@ -523,75 +590,99 @@
 };
 
 class BluetoothLowEnergyCreateServiceFunction
-    : public BLEPeripheralExtensionFunction<
-          extensions::api::bluetooth_low_energy::CreateService::Params> {
+    : public BLEPeripheralExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.createService",
                              BLUETOOTHLOWENERGY_CREATESERVICE);
 
+  BluetoothLowEnergyCreateServiceFunction();
+
  protected:
-  ~BluetoothLowEnergyCreateServiceFunction() override {}
+  ~BluetoothLowEnergyCreateServiceFunction() override;
 
   // BluetoothLowEnergyPeripheralExtensionFunction override.
   void DoWork() override;
+  bool ParseParams() override;
+
+  // Causes link error on Windows. API will never be on Windows, so #ifdefing.
+#if !defined(OS_WIN)
+  std::unique_ptr<bluetooth_low_energy::CreateService::Params> params_;
+#endif
 };
 
 class BluetoothLowEnergyCreateCharacteristicFunction
-    : public BLEPeripheralExtensionFunction<
-          extensions::api::bluetooth_low_energy::CreateCharacteristic::Params> {
+    : public BLEPeripheralExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.createCharacteristic",
                              BLUETOOTHLOWENERGY_CREATECHARACTERISTIC);
 
+  BluetoothLowEnergyCreateCharacteristicFunction();
+
  protected:
-  ~BluetoothLowEnergyCreateCharacteristicFunction() override {}
+  ~BluetoothLowEnergyCreateCharacteristicFunction() override;
 
   // BluetoothLowEnergyPeripheralExtensionFunction override.
   void DoWork() override;
+  bool ParseParams() override;
+
+  std::unique_ptr<bluetooth_low_energy::CreateCharacteristic::Params> params_;
 };
 
 class BluetoothLowEnergyNotifyCharacteristicValueChangedFunction
-    : public BLEPeripheralExtensionFunction<
-          extensions::api::bluetooth_low_energy::
-              NotifyCharacteristicValueChanged::Params> {
+    : public BLEPeripheralExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION(
       "bluetoothLowEnergy.notifyCharacteristicValueChanged",
       BLUETOOTHLOWENERGY_NOTIFYCHARACTERISTICVALUECHANGED);
 
+  BluetoothLowEnergyNotifyCharacteristicValueChangedFunction();
+
  protected:
-  ~BluetoothLowEnergyNotifyCharacteristicValueChangedFunction() override {}
+  ~BluetoothLowEnergyNotifyCharacteristicValueChangedFunction() override;
 
   // BluetoothLowEnergyPeripheralExtensionFunction override.
   void DoWork() override;
+  bool ParseParams() override;
+
+  std::unique_ptr<
+      bluetooth_low_energy::NotifyCharacteristicValueChanged::Params>
+      params_;
 };
 
 class BluetoothLowEnergyCreateDescriptorFunction
-    : public BLEPeripheralExtensionFunction<
-          extensions::api::bluetooth_low_energy::CreateDescriptor::Params> {
+    : public BLEPeripheralExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.createDescriptor",
                              BLUETOOTHLOWENERGY_CREATEDESCRIPTOR);
 
+  BluetoothLowEnergyCreateDescriptorFunction();
+
  protected:
-  ~BluetoothLowEnergyCreateDescriptorFunction() override {}
+  ~BluetoothLowEnergyCreateDescriptorFunction() override;
 
   // BluetoothLowEnergyPeripheralExtensionFunction override.
   void DoWork() override;
+  bool ParseParams() override;
+
+  std::unique_ptr<bluetooth_low_energy::CreateDescriptor::Params> params_;
 };
 
 class BluetoothLowEnergyRegisterServiceFunction
-    : public BLEPeripheralExtensionFunction<
-          extensions::api::bluetooth_low_energy::RegisterService::Params> {
+    : public BLEPeripheralExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.registerService",
                              BLUETOOTHLOWENERGY_REGISTERSERVICE);
 
+  BluetoothLowEnergyRegisterServiceFunction();
+
  protected:
-  ~BluetoothLowEnergyRegisterServiceFunction() override {}
+  ~BluetoothLowEnergyRegisterServiceFunction() override;
 
   // BluetoothLowEnergyPeripheralExtensionFunction override.
   void DoWork() override;
+  bool ParseParams() override;
+
+  std::unique_ptr<bluetooth_low_energy::RegisterService::Params> params_;
 
  private:
   void SuccessCallback();
@@ -599,17 +690,21 @@
 };
 
 class BluetoothLowEnergyUnregisterServiceFunction
-    : public BLEPeripheralExtensionFunction<
-          extensions::api::bluetooth_low_energy::UnregisterService::Params> {
+    : public BLEPeripheralExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.unregisterService",
                              BLUETOOTHLOWENERGY_UNREGISTERSERVICE);
 
+  BluetoothLowEnergyUnregisterServiceFunction();
+
  protected:
-  ~BluetoothLowEnergyUnregisterServiceFunction() override {}
+  ~BluetoothLowEnergyUnregisterServiceFunction() override;
 
   // BluetoothLowEnergyPeripheralExtensionFunction override.
   void DoWork() override;
+  bool ParseParams() override;
+
+  std::unique_ptr<bluetooth_low_energy::UnregisterService::Params> params_;
 
  private:
   // Success and error callbacks, called by
@@ -619,31 +714,39 @@
 };
 
 class BluetoothLowEnergyRemoveServiceFunction
-    : public BLEPeripheralExtensionFunction<
-          extensions::api::bluetooth_low_energy::RemoveService::Params> {
+    : public BLEPeripheralExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.removeService",
                              BLUETOOTHLOWENERGY_REMOVESERVICE);
 
+  BluetoothLowEnergyRemoveServiceFunction();
+
  protected:
-  ~BluetoothLowEnergyRemoveServiceFunction() override {}
+  ~BluetoothLowEnergyRemoveServiceFunction() override;
 
   // BluetoothLowEnergyPeripheralExtensionFunction override.
   void DoWork() override;
+  bool ParseParams() override;
+
+  std::unique_ptr<bluetooth_low_energy::RemoveService::Params> params_;
 };
 
 class BluetoothLowEnergySendRequestResponseFunction
-    : public BLEPeripheralExtensionFunction<
-          extensions::api::bluetooth_low_energy::SendRequestResponse::Params> {
+    : public BLEPeripheralExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.sendRequestResponse",
                              BLUETOOTHLOWENERGY_SENDREQUESTRESPONSE);
 
+  BluetoothLowEnergySendRequestResponseFunction();
+
  protected:
-  ~BluetoothLowEnergySendRequestResponseFunction() override {}
+  ~BluetoothLowEnergySendRequestResponseFunction() override;
 
   // BluetoothLowEnergyPeripheralExtensionFunction override.
   void DoWork() override;
+  bool ParseParams() override;
+
+  std::unique_ptr<bluetooth_low_energy::SendRequestResponse::Params> params_;
 };
 
 }  // namespace api
diff --git a/extensions/renderer/dispatcher.cc b/extensions/renderer/dispatcher.cc
index 7dfb51c..67d8bea 100644
--- a/extensions/renderer/dispatcher.cc
+++ b/extensions/renderer/dispatcher.cc
@@ -727,7 +727,6 @@
       {"guestViewEvents", IDR_GUEST_VIEW_EVENTS_JS},
       {"imageUtil", IDR_IMAGE_UTIL_JS},
       {"json_schema", IDR_JSON_SCHEMA_JS},
-      {"lastError", IDR_LAST_ERROR_JS},
       {"messaging", IDR_MESSAGING_JS},
       {"messaging_utils", IDR_MESSAGING_UTILS_JS},
       {kSchemaUtils, IDR_SCHEMA_UTILS_JS},
@@ -801,6 +800,7 @@
   if (!FeatureSwitch::native_crx_bindings()->IsEnabled()) {
     resources.emplace_back("binding", IDR_BINDING_JS);
     resources.emplace_back(kEventBindings, IDR_EVENT_BINDINGS_JS);
+    resources.emplace_back("lastError", IDR_LAST_ERROR_JS);
     resources.emplace_back("sendRequest", IDR_SEND_REQUEST_JS);
 
     // Custom types sources.
diff --git a/extensions/renderer/resources/file_entry_binding_util.js b/extensions/renderer/resources/file_entry_binding_util.js
index 6ae219c..cdef7222 100644
--- a/extensions/renderer/resources/file_entry_binding_util.js
+++ b/extensions/renderer/resources/file_entry_binding_util.js
@@ -4,12 +4,20 @@
 
 var fileSystemNatives = requireNative('file_system_natives');
 var GetIsolatedFileSystem = fileSystemNatives.GetIsolatedFileSystem;
-var lastError = require('lastError');
 var GetModuleSystem = requireNative('v8_context').GetModuleSystem;
 // TODO(sammc): Don't require extension. See http://crbug.com/235689.
 var GetExtensionViews = requireNative('runtime').GetExtensionViews;
 var safeCallbackApply = require('uncaught_exception_handler').safeCallbackApply;
 
+var jsLastError = bindingUtil ? undefined : require('lastError');
+function runCallbackWithLastError(name, message, stack, callback) {
+  if (bindingUtil)
+    bindingUtil.runCallbackWithLastError(message, callback);
+  else
+    jsLastError.run(name, message, stack, callback);
+}
+
+
 var WINDOW = {};
 try {
   WINDOW = window;
@@ -51,7 +59,7 @@
           var getEntryError = function(fileError) {
             if (!hasError) {
               hasError = true;
-              lastError.run(
+              runCallbackWithLastError(
                   apiName + '.' + functionName,
                   'Error getting fileEntry, code: ' + fileError.code,
                   request.stack,
@@ -103,10 +111,9 @@
             } catch (e) {
               if (!hasError) {
                 hasError = true;
-                lastError.run(apiName + '.' + functionName,
-                              'Error getting fileEntry: ' + e.stack,
-                              request.stack,
-                              callback);
+                runCallbackWithLastError(apiName + '.' + functionName,
+                                         'Error getting fileEntry: ' + e.stack,
+                                         request.stack, callback);
               }
             }
           });
@@ -150,16 +157,15 @@
 
         try {
           fs.root.getDirectory(baseName, {}, callback, function(fileError) {
-            lastError.run('runtime.' + functionName,
-                          'Error getting Entry, code: ' + fileError.code,
-                          request.stack,
-                          callback);
+            runCallbackWithLastError(
+                'runtime.' + functionName,
+                'Error getting Entry, code: ' + fileError.code,
+                request.stack, callback);
           });
         } catch (e) {
-          lastError.run('runtime.' + functionName,
-                        'Error: ' + e.stack,
-                        request.stack,
-                        callback);
+          runCallbackWithLastError('runtime.' + functionName,
+                                   'Error: ' + e.stack,
+                                   request.stack, callback);
         }
       }
     }
diff --git a/extensions/renderer/resources/messaging.js b/extensions/renderer/resources/messaging.js
index f44d753d..d0ca6c8 100644
--- a/extensions/renderer/resources/messaging.js
+++ b/extensions/renderer/resources/messaging.js
@@ -7,7 +7,6 @@
 
   // TODO(kalman): factor requiring chrome out of here.
   var chrome = requireNative('chrome').GetChrome();
-  var lastError = require('lastError');
   var logActivity = requireNative('activityLogger');
   var logging = requireNative('logging');
   var messagingNatives = requireNative('messaging_natives');
@@ -46,6 +45,28 @@
       privates(event).impl.destroy_();
   }
 
+  var jsLastError = bindingUtil ? undefined : require('lastError');
+  function setLastError(name, error) {
+    if (bindingUtil)
+      bindingUtil.setLastError(error);
+    else
+      jsLastError.set(name, error, null, chrome);
+  }
+
+  function clearLastError() {
+    if (bindingUtil)
+      bindingUtil.clearLastError();
+    else
+      jsLastError.clear(chrome);
+  }
+
+  function hasLastError() {
+    if (bindingUtil)
+      return bindingUtil.hasLastError();
+    else
+      return jsLastError.hasError(chrome);
+  }
+
   // Map of port IDs to port object.
   var ports = {__proto__: null};
 
@@ -152,7 +173,7 @@
     if (sourceUrl)
       errorMsg += ' for URL ' + sourceUrl;
     errorMsg += ').';
-    lastError.set(eventName, errorMsg, null, chrome);
+    setLastError(eventName, errorMsg);
   }
 
   // Helper function for dispatchOnConnect
@@ -348,12 +369,12 @@
     if (port) {
       delete ports[portId];
       if (errorMessage)
-        lastError.set('Port', errorMessage, null, chrome);
+        setLastError('Port', errorMessage);
       try {
         port.onDisconnect.dispatch(port);
       } finally {
         privates(port).impl.destroy_();
-        lastError.clear(chrome);
+        clearLastError();
       }
     }
   };
@@ -406,17 +427,16 @@
       if (!responseCallback)
         return;
 
-      if (lastError.hasError(chrome)) {
+      if (hasLastError()) {
         sendResponseAndClearCallback();
       } else {
-        lastError.set(
+        setLastError(
             port.name,
-            'The message port closed before a response was received.', null,
-            chrome);
+            'The message port closed before a response was received.');
         try {
           sendResponseAndClearCallback();
         } finally {
-          lastError.clear(chrome);
+          clearLastError();
         }
       }
     }
diff --git a/extensions/shell/installer/linux/BUILD.gn b/extensions/shell/installer/linux/BUILD.gn
index d537e713..08f8bfa 100644
--- a/extensions/shell/installer/linux/BUILD.gn
+++ b/extensions/shell/installer/linux/BUILD.gn
@@ -128,6 +128,14 @@
       "//ppapi/native_client:irt",
     ]
   }
+
+  # TODO(thomasanderson): Move this variable into a .gni file
+  # somewhere.  It is currently copied from
+  # buildtools/third_party/libc++/BUILD.gn.
+  libcpp_is_static = !is_component_build && !using_sanitizer
+  if (!libcpp_is_static && use_custom_libcxx) {
+    public_deps += [ "//buildtools/third_party/libc++:libc++" ]
+  }
 }
 
 # Creates .deb installer package.
diff --git a/google_apis/gcm/monitoring/fake_gcm_stats_recorder.cc b/google_apis/gcm/monitoring/fake_gcm_stats_recorder.cc
index 5b138d2fa..62ca46e 100644
--- a/google_apis/gcm/monitoring/fake_gcm_stats_recorder.cc
+++ b/google_apis/gcm/monitoring/fake_gcm_stats_recorder.cc
@@ -56,6 +56,12 @@
     int64_t delay_msec,
     int retries_left) {}
 
+void FakeGCMStatsRecorder::RecordDataMessageReceived(
+    const std::string& app_id,
+    const std::string& from,
+    int message_byte_size,
+    ReceivedMessageType message_type) {}
+
 void FakeGCMStatsRecorder::RecordUnregistrationSent(
     const std::string& app_id, const std::string& source) {
 }
@@ -72,14 +78,6 @@
     int64_t delay_msec,
     int retries_left) {}
 
-void FakeGCMStatsRecorder::RecordDataMessageReceived(
-    const std::string& app_id,
-    const std::string& from,
-    int message_byte_size,
-    bool to_registered_app,
-    ReceivedMessageType message_type) {
-}
-
 void FakeGCMStatsRecorder::RecordDataSentToWire(
     const std::string& app_id,
     const std::string& receiver_id,
diff --git a/google_apis/gcm/monitoring/fake_gcm_stats_recorder.h b/google_apis/gcm/monitoring/fake_gcm_stats_recorder.h
index 8e10231..a998a02c 100644
--- a/google_apis/gcm/monitoring/fake_gcm_stats_recorder.h
+++ b/google_apis/gcm/monitoring/fake_gcm_stats_recorder.h
@@ -52,7 +52,6 @@
   void RecordDataMessageReceived(const std::string& app_id,
                                  const std::string& from,
                                  int message_byte_size,
-                                 bool to_registered_app,
                                  ReceivedMessageType message_type) override;
   void RecordDataSentToWire(const std::string& app_id,
                             const std::string& receiver_id,
diff --git a/google_apis/gcm/monitoring/gcm_stats_recorder.h b/google_apis/gcm/monitoring/gcm_stats_recorder.h
index 7cd45eb..dff4a47 100644
--- a/google_apis/gcm/monitoring/gcm_stats_recorder.h
+++ b/google_apis/gcm/monitoring/gcm_stats_recorder.h
@@ -109,14 +109,12 @@
                                                 int64_t delay_msec,
                                                 int retries_left) = 0;
 
-  // Records that a data message has been received. If this message is not
-  // sent to a registered app, to_registered_app should be false. If it
-  // indicates that one or more messages were dropped on the server,
-  // message_type should be DELETED_MESSAGES.
+  // Records that a data message has been received. If it indicates that one or
+  // more messages were dropped on the server, message_type should be
+  // DELETED_MESSAGES.
   virtual void RecordDataMessageReceived(const std::string& app_id,
                                          const std::string& from,
                                          int message_byte_size,
-                                         bool to_registered_app,
                                          ReceivedMessageType message_type) = 0;
 
   // Records that an outgoing data message was sent over the wire.
diff --git a/gpu/BUILD.gn b/gpu/BUILD.gn
index 3fa2b3e..86b3d704 100644
--- a/gpu/BUILD.gn
+++ b/gpu/BUILD.gn
@@ -157,6 +157,7 @@
     "command_buffer/tests/gl_map_buffer_range_unittest.cc",
     "command_buffer/tests/gl_native_gmb_backbuffer_unittest.cc",
     "command_buffer/tests/gl_object_bindings_unittest.cc",
+    "command_buffer/tests/gl_oob_attrib_unittest.cc",
     "command_buffer/tests/gl_pointcoord_unittest.cc",
     "command_buffer/tests/gl_program_unittest.cc",
     "command_buffer/tests/gl_query_unittest.cc",
diff --git a/gpu/command_buffer/service/program_manager.cc b/gpu/command_buffer/service/program_manager.cc
index 9fb9cc8..c1ffc0a 100644
--- a/gpu/command_buffer/service/program_manager.cc
+++ b/gpu/command_buffer/service/program_manager.cc
@@ -225,6 +225,26 @@
   return total.ValueOrDefault(std::numeric_limits<GLsizeiptr>::max());
 }
 
+size_t LocationCountForAttribType(GLenum type) {
+  switch (type) {
+    case GL_FLOAT_MAT2:
+    case GL_FLOAT_MAT2x3:
+    case GL_FLOAT_MAT2x4:
+      return 2;
+    case GL_FLOAT_MAT3x2:
+    case GL_FLOAT_MAT3:
+    case GL_FLOAT_MAT3x4:
+      return 3;
+      break;
+    case GL_FLOAT_MAT4x2:
+    case GL_FLOAT_MAT4x3:
+    case GL_FLOAT_MAT4:
+      return 4;
+    default:
+      return 1;
+  }
+}
+
 }  // anonymous namespace.
 
 Program::UniformInfo::UniformInfo()
@@ -457,16 +477,21 @@
 
 void Program::UpdateVertexInputBaseTypes() {
   ClearVertexInputMasks();
-  DCHECK_LE(attrib_infos_.size(), manager_->max_vertex_attribs());
   for (size_t ii = 0; ii < attrib_infos_.size(); ++ii) {
     const VertexAttrib& input = attrib_infos_[ii];
     if (ProgramManager::HasBuiltInPrefix(input.name)) {
       continue;
     }
-    int shift_bits = (input.location % 16) * 2;
-    vertex_input_active_mask_[ii / 16] |= 0x3 << shift_bits;
-    vertex_input_base_type_mask_[ii / 16] |=
-        InputOutputTypeToBaseType(true, input.type) << shift_bits;
+
+    DCHECK_LE(input.location + input.location_count,
+              manager_->max_vertex_attribs());
+    for (size_t location = input.location;
+         location < input.location + input.location_count; ++location) {
+      int shift_bits = (location % 16) * 2;
+      vertex_input_active_mask_[location / 16] |= 0x3 << shift_bits;
+      vertex_input_base_type_mask_[location / 16] |=
+          InputOutputTypeToBaseType(true, input.type) << shift_bits;
+    }
   }
 }
 
@@ -706,7 +731,7 @@
   uniforms_cleared_ = false;
   GLint num_attribs = 0;
   GLint max_len = 0;
-  GLint max_location = -1;
+  size_t num_locations = 0;
   glGetProgramiv(service_id_, GL_ACTIVE_ATTRIBUTES, &num_attribs);
   glGetProgramiv(service_id_, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &max_len);
   // TODO(gman): Should we check for error?
@@ -721,26 +746,25 @@
     DCHECK(length == 0 || name_buffer[length] == '\0');
     std::string original_name;
     GetVertexAttribData(name_buffer.get(), &original_name, &type);
+    size_t location_count = size * LocationCountForAttribType(type);
     // TODO(gman): Should we check for error?
     GLint location = glGetAttribLocation(service_id_, name_buffer.get());
-    if (location > max_location) {
-      max_location = location;
-    }
-    attrib_infos_.push_back(VertexAttrib(1, type, original_name, location));
+    num_locations = std::max(num_locations, location + location_count);
+    attrib_infos_.push_back(
+        VertexAttrib(1, type, original_name, location, location_count));
     max_attrib_name_length_ = std::max(
         max_attrib_name_length_, static_cast<GLsizei>(original_name.size()));
   }
 
   // Create attrib location to index map.
-  attrib_location_to_index_map_.resize(max_location + 1);
-  for (GLint ii = 0; ii <= max_location; ++ii) {
-    attrib_location_to_index_map_[ii] = -1;
-  }
+  attrib_location_to_index_map_.resize(num_locations, -1);
   for (size_t ii = 0; ii < attrib_infos_.size(); ++ii) {
     const VertexAttrib& info = attrib_infos_[ii];
-    if (info.location >= 0 && info.location <= max_location) {
-      attrib_location_to_index_map_[info.location] = ii;
-    }
+    if (info.location < 0)
+      continue;
+    DCHECK_LE(info.location + info.location_count, num_locations);
+    for (size_t j = 0; j < info.location_count; ++j)
+      attrib_location_to_index_map_[info.location + j] = ii;
   }
 
   if (manager_->gpu_preferences_.enable_gpu_service_logging_gpu) {
@@ -1864,20 +1888,7 @@
       }
     }
     if (attrib) {
-      size_t num_of_locations = 1;
-      switch (attrib->type) {
-        case GL_FLOAT_MAT2:
-          num_of_locations = 2;
-          break;
-        case GL_FLOAT_MAT3:
-          num_of_locations = 3;
-          break;
-        case GL_FLOAT_MAT4:
-          num_of_locations = 4;
-          break;
-        default:
-          break;
-      }
+      size_t num_of_locations = LocationCountForAttribType(attrib->type);
       for (size_t ii = 0; ii < num_of_locations; ++ii) {
         GLint loc = key_value.second + ii;
         auto result = location_binding_used.insert(loc);
diff --git a/gpu/command_buffer/service/program_manager.h b/gpu/command_buffer/service/program_manager.h
index 74bb256..a3b8e64 100644
--- a/gpu/command_buffer/service/program_manager.h
+++ b/gpu/command_buffer/service/program_manager.h
@@ -133,16 +133,20 @@
     std::vector<GLuint> texture_units;
   };
   struct VertexAttrib {
-    VertexAttrib(GLsizei _size, GLenum _type, const std::string& _name,
-                 GLint _location)
-        : size(_size),
-          type(_type),
-          location(_location),
-          name(_name) {
-    }
+    VertexAttrib(GLsizei size,
+                 GLenum type,
+                 const std::string& name,
+                 GLint location,
+                 size_t location_count)
+        : size(size),
+          type(type),
+          location(location),
+          location_count(location_count),
+          name(name) {}
     GLsizei size;
     GLenum type;
     GLint location;
+    size_t location_count;
     std::string name;
   };
   struct UniformBlockSizeInfo {
diff --git a/gpu/command_buffer/service/program_manager_unittest.cc b/gpu/command_buffer/service/program_manager_unittest.cc
index 154bf9d..e0269249 100644
--- a/gpu/command_buffer/service/program_manager_unittest.cc
+++ b/gpu/command_buffer/service/program_manager_unittest.cc
@@ -187,19 +187,24 @@
   static const char* kAttrib1Name;
   static const char* kAttrib2Name;
   static const char* kAttrib3Name;
+  static const char* kAttrib4Name;
   static const GLint kAttrib1Size = 1;
   static const GLint kAttrib2Size = 1;
   static const GLint kAttrib3Size = 1;
+  static const GLint kAttrib4Size = 1;
   static const GLenum kAttrib1Precision = GL_MEDIUM_FLOAT;
   static const GLenum kAttrib2Precision = GL_HIGH_FLOAT;
-  static const GLenum kAttrib3Precision = GL_LOW_FLOAT;
+  static const GLenum kAttrib3Precision = GL_LOW_INT;
+  static const GLenum kAttrib4Precision = GL_HIGH_FLOAT;
   static const bool kAttribStaticUse = true;
   static const GLint kAttrib1Location = 0;
   static const GLint kAttrib2Location = 1;
   static const GLint kAttrib3Location = 2;
+  static const GLint kAttrib4Location = 3;
   static const GLenum kAttrib1Type = GL_FLOAT_VEC4;
   static const GLenum kAttrib2Type = GL_FLOAT_VEC2;
-  static const GLenum kAttrib3Type = GL_FLOAT_VEC3;
+  static const GLenum kAttrib3Type = GL_INT_VEC3;
+  static const GLenum kAttrib4Type = GL_FLOAT_MAT3x2;
   static const GLint kInvalidAttribLocation = 30;
   static const GLint kBadAttribIndex = kNumVertexAttribs;
 
@@ -459,9 +464,18 @@
 
 ProgramManagerWithShaderTest::AttribInfo
     ProgramManagerWithShaderTest::kAttribs[] = {
-  { kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, },
-  { kAttrib2Name, kAttrib2Size, kAttrib2Type, kAttrib2Location, },
-  { kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, },
+        {
+            kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location,
+        },
+        {
+            kAttrib2Name, kAttrib2Size, kAttrib2Type, kAttrib2Location,
+        },
+        {
+            kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location,
+        },
+        {
+            kAttrib4Name, kAttrib4Size, kAttrib4Type, kAttrib4Location,
+        },
 };
 
 // GCC requires these declarations, but MSVC requires they not be present
@@ -476,12 +490,15 @@
 const GLint ProgramManagerWithShaderTest::kAttrib1Size;
 const GLint ProgramManagerWithShaderTest::kAttrib2Size;
 const GLint ProgramManagerWithShaderTest::kAttrib3Size;
+const GLint ProgramManagerWithShaderTest::kAttrib4Size;
 const GLint ProgramManagerWithShaderTest::kAttrib1Location;
 const GLint ProgramManagerWithShaderTest::kAttrib2Location;
 const GLint ProgramManagerWithShaderTest::kAttrib3Location;
+const GLint ProgramManagerWithShaderTest::kAttrib4Location;
 const GLenum ProgramManagerWithShaderTest::kAttrib1Type;
 const GLenum ProgramManagerWithShaderTest::kAttrib2Type;
 const GLenum ProgramManagerWithShaderTest::kAttrib3Type;
+const GLenum ProgramManagerWithShaderTest::kAttrib4Type;
 const GLint ProgramManagerWithShaderTest::kInvalidAttribLocation;
 const GLint ProgramManagerWithShaderTest::kBadAttribIndex;
 const GLint ProgramManagerWithShaderTest::kUniform1Size;
@@ -540,6 +557,7 @@
 const char* ProgramManagerWithShaderTest::kAttrib1Name = "attrib1";
 const char* ProgramManagerWithShaderTest::kAttrib2Name = "attrib2";
 const char* ProgramManagerWithShaderTest::kAttrib3Name = "attrib3";
+const char* ProgramManagerWithShaderTest::kAttrib4Name = "attrib4";
 const char* ProgramManagerWithShaderTest::kUniform1Name = "uniform1";
 const char* ProgramManagerWithShaderTest::kUniform2Name = "uniform2";
 const char* ProgramManagerWithShaderTest::kUniform2NameWithArrayIndex =
@@ -580,6 +598,31 @@
   EXPECT_TRUE(program->GetAttribInfo(kInvalidIndex) == NULL);
 }
 
+TEST_F(ProgramManagerWithShaderTest, GetAttribInfoByLocation) {
+  const GLint kInvalidLocation = 1000;
+  const Program* program = SetupDefaultProgram();
+  ASSERT_TRUE(program != NULL);
+
+  // attrib2 is a vec2, takes 1 location
+  const Program::VertexAttrib* expected_info = program->GetAttribInfo(1);
+  EXPECT_EQ(1u, expected_info->location_count);
+  const Program::VertexAttrib* info =
+      program->GetAttribInfoByLocation(kAttrib2Location);
+  EXPECT_EQ(expected_info, info);
+
+  // attrib4 is a mat3x2, takes 3 locations (1 per column)
+  expected_info = program->GetAttribInfo(3);
+  EXPECT_EQ(3u, expected_info->location_count);
+  info = program->GetAttribInfoByLocation(kAttrib4Location);
+  EXPECT_EQ(expected_info, info);
+  info = program->GetAttribInfoByLocation(kAttrib4Location + 1);
+  EXPECT_EQ(expected_info, info);
+  info = program->GetAttribInfoByLocation(kAttrib4Location + 2);
+  EXPECT_EQ(expected_info, info);
+
+  EXPECT_TRUE(program->GetAttribInfoByLocation(kInvalidLocation) == NULL);
+}
+
 TEST_F(ProgramManagerWithShaderTest, GetAttribLocation) {
   const char* kInvalidName = "foo";
   const Program* program = SetupDefaultProgram();
@@ -588,6 +631,27 @@
   EXPECT_EQ(-1, program->GetAttribLocation(kInvalidName));
 }
 
+TEST_F(ProgramManagerWithShaderTest, VertexArrayMasks) {
+  const Program* program = SetupDefaultProgram();
+  ASSERT_TRUE(program != NULL);
+
+  std::vector<uint32_t> active_mask = program->vertex_input_active_mask();
+  ASSERT_EQ(1u, active_mask.size());
+  uint32_t expected = 0x3 << 0 |              // attrib1
+                      0x3 << 2 |              // attrib2
+                      0x3 << 4 |              // attrib3
+                      (0x3 * 0b010101) << 6;  // attrib4
+  EXPECT_EQ(expected, active_mask[0]);
+
+  std::vector<uint32_t> base_type_mask = program->vertex_input_base_type_mask();
+  ASSERT_EQ(1u, base_type_mask.size());
+  expected = SHADER_VARIABLE_FLOAT << 0 |              // attrib1
+             SHADER_VARIABLE_FLOAT << 2 |              // attrib2
+             SHADER_VARIABLE_INT << 4 |                // attrib3
+             (SHADER_VARIABLE_FLOAT * 0b010101) << 6;  // attrib4
+  EXPECT_EQ(expected, base_type_mask[0]);
+}
+
 TEST_F(ProgramManagerWithShaderTest, GetUniformInfo) {
   const GLint kInvalidIndex = 1000;
   const Program* program = SetupDefaultProgram();
@@ -770,7 +834,7 @@
   program->Link(NULL, Program::kCountOnlyStaticallyUsed, this);
   GLint value = 0;
   program->GetProgramiv(GL_ACTIVE_ATTRIBUTES, &value);
-  EXPECT_EQ(3, value);
+  EXPECT_EQ(4, value);
   // Check that we didn't skip the "gl_" uniform.
   program->GetProgramiv(GL_ACTIVE_UNIFORMS, &value);
   EXPECT_EQ(3, value);
diff --git a/gpu/command_buffer/tests/gl_oob_attrib_unittest.cc b/gpu/command_buffer/tests/gl_oob_attrib_unittest.cc
new file mode 100644
index 0000000..d4c050f5
--- /dev/null
+++ b/gpu/command_buffer/tests/gl_oob_attrib_unittest.cc
@@ -0,0 +1,86 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
+#include <stdint.h>
+
+#include "gpu/command_buffer/tests/gl_manager.h"
+#include "gpu/command_buffer/tests/gl_test_utils.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace gpu {
+
+namespace {
+
+class GLOOBAttribTest : public testing::Test {
+ protected:
+  void SetUp() override { gl_.Initialize(GLManager::Options()); }
+  void TearDown() override { gl_.Destroy(); }
+  GLManager gl_;
+};
+
+// Tests that enabling a vertex array for a location that matches any column of
+// a matrix attribute correctly triggers out-of-bounds checks.
+TEST_F(GLOOBAttribTest, DrawUsingOOBMatrixAttrib) {
+  const char kVertexShader[] =
+      "attribute mat3 attrib;\n"
+      "varying vec4 color;\n"
+      "void main () {\n"
+      "  color = vec4(1.0,\n"
+      "      attrib[0][0] + attrib[0][1] + attrib[0][2] +\n"
+      "      attrib[1][0] + attrib[1][1] + attrib[1][2] +\n"
+      "      attrib[2][0] + attrib[2][1] + attrib[2][2],\n"
+      "      1.0,\n"
+      "      1.0);\n"
+      "}\n";
+  const char kFragmentShader[] =
+      "precision mediump float;\n"
+      "varying vec4 color;\n"
+      "void main() {\n"
+      "  gl_FragColor = color;\n"
+      "}\n";
+
+  GLuint program = GLTestHelper::LoadProgram(kVertexShader, kFragmentShader);
+  DCHECK(program);
+  glUseProgram(program);
+  GLuint vbo;
+  glGenBuffers(1, &vbo);
+  glBindBuffer(GL_ARRAY_BUFFER, vbo);
+  glBufferData(GL_ARRAY_BUFFER, 16, nullptr, GL_STATIC_DRAW);
+  GLint location = glGetAttribLocation(program, "attrib");
+  EXPECT_GE(0, location);
+
+  // All attribs disabled - no error.
+  glDrawArrays(GL_TRIANGLES, 0, 1000);
+  GLenum expected = GL_NO_ERROR;
+  EXPECT_EQ(expected, glGetError());
+
+  for (int i = 0; i < 3; ++i) {
+    // Enable any of the valid locations for the attribute, should raise an
+    // error if trying to access attributes out-of-bounds.
+    glVertexAttribPointer(location + i, 4, GL_UNSIGNED_BYTE, false, 0, nullptr);
+    glEnableVertexAttribArray(location + i);
+    glDrawArrays(GL_TRIANGLES, 0, 1000);
+    expected = GL_INVALID_OPERATION;
+    EXPECT_EQ(expected, glGetError());
+
+    // But in-bounds should pass.
+    glDrawArrays(GL_TRIANGLES, 0, 3);
+    expected = GL_NO_ERROR;
+    EXPECT_EQ(expected, glGetError());
+    glDisableVertexAttribArray(location + i);
+  }
+
+  // Enable an unused location, should not trigger out-of-bounds checks.
+  glVertexAttribPointer(location + 3, 4, GL_UNSIGNED_BYTE, false, 0, nullptr);
+  glEnableVertexAttribArray(location + 3);
+  glDrawArrays(GL_TRIANGLES, 0, 1000);
+  expected = GL_NO_ERROR;
+  EXPECT_EQ(expected, glGetError());
+}
+
+}  // anonymous namespace
+
+}  // namespace gpu
diff --git a/headless/OWNERS b/headless/OWNERS
index f8f1df65..e96cb2c 100644
--- a/headless/OWNERS
+++ b/headless/OWNERS
@@ -2,6 +2,10 @@
 alexclarke@chromium.org
 altimin@chromium.org
 eseckler@chromium.org
+dvallet@chromium.org
+irisu@chromium.org
+jzfeng@chromium.org
+rvera@chromium.org
 
 # TEAM: headless-dev@chromium.org
 # COMPONENT: Internals>Headless
diff --git a/ios/chrome/browser/browsing_data/browsing_data_removal_controller.mm b/ios/chrome/browser/browsing_data/browsing_data_removal_controller.mm
index 115c6ff..ba09317 100644
--- a/ios/chrome/browser/browsing_data/browsing_data_removal_controller.mm
+++ b/ios/chrome/browser/browsing_data/browsing_data_removal_controller.mm
@@ -6,6 +6,8 @@
 
 #import <WebKit/WebKit.h>
 
+#include <stdint.h>
+
 #include <memory>
 
 #include "base/bind.h"
@@ -39,7 +41,7 @@
 
 namespace {
 // Empty callback used by DeleteAllCreatedBetweenAsync below.
-void DoNothing(int n) {}
+void DoNothing(uint32_t n) {}
 }
 
 @interface BrowsingDataRemovalController ()
diff --git a/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.h b/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.h
index 643c1db..979d8bf08 100644
--- a/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.h
+++ b/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.h
@@ -5,6 +5,8 @@
 #ifndef IOS_CHROME_BROWSER_BROWSING_DATA_IOS_CHROME_BROWSING_DATA_REMOVER_H_
 #define IOS_CHROME_BROWSER_BROWSING_DATA_IOS_CHROME_BROWSING_DATA_REMOVER_H_
 
+#include <stdint.h>
+
 #include <memory>
 #include <set>
 
@@ -189,7 +191,7 @@
   void OnClearedPasswords();
 
   // Callback for when Cookies has been deleted. Invokes NotifyAndDeleteIfDone.
-  void OnClearedCookies(int num_deleted);
+  void OnClearedCookies(uint32_t num_deleted);
 
   // Invoked on the IO thread to delete cookies.
   void ClearCookiesOnIOThread(
diff --git a/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.mm b/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.mm
index a9f0d06..19ae87a 100644
--- a/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.mm
+++ b/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.mm
@@ -447,7 +447,7 @@
   NotifyAndDeleteIfDone();
 }
 
-void IOSChromeBrowsingDataRemover::OnClearedCookies(int num_deleted) {
+void IOSChromeBrowsingDataRemover::OnClearedCookies(uint32_t num_deleted) {
   if (!WebThread::CurrentlyOn(WebThread::UI)) {
     WebThread::PostTask(
         WebThread::UI, FROM_HERE,
diff --git a/ios/chrome/browser/chrome_url_constants.cc b/ios/chrome/browser/chrome_url_constants.cc
index b23d0ff..e4268bd 100644
--- a/ios/chrome/browser/chrome_url_constants.cc
+++ b/ios/chrome/browser/chrome_url_constants.cc
@@ -20,8 +20,6 @@
 const char kChromeUINTPTilesInternalsURL[] = "chrome://ntp-tiles-internals/";
 const char kChromeUIOfflineURL[] = "chrome://offline/";
 const char kChromeUIPhysicalWebURL[] = "chrome://physical-web/";
-const char kChromeUIPopularSitesInternalsURL[] =
-    "chrome://popular-sites-internals/";
 const char kChromeUISettingsURL[] = "chrome://settings/";
 const char kChromeUITermsURL[] = "chrome://terms/";
 const char kChromeUIVersionURL[] = "chrome://version/";
@@ -44,7 +42,6 @@
 const char kChromeUIOfflineHost[] = "offline";
 const char kChromeUIOmahaHost[] = "omaha";
 const char kChromeUIPhysicalWebHost[] = "physical-web";
-const char kChromeUIPopularSitesInternalsHost[] = "popular-sites-internals";
 const char kChromeUIPolicyHost[] = "policy";
 const char kChromeUISignInInternalsHost[] = "signin-internals";
 const char kChromeUISyncInternalsHost[] = "sync-internals";
@@ -60,8 +57,8 @@
     kChromeUIHistogramHost,       kChromeUINetExportHost,
     kChromeUINewTabHost,          kChromeUINTPTilesInternalsHost,
     kChromeUISignInInternalsHost, kChromeUISyncInternalsHost,
-    kChromeUIPhysicalWebHost,     kChromeUIPopularSitesInternalsHost,
-    kChromeUITermsHost,           kChromeUIVersionHost,
+    kChromeUIPhysicalWebHost,     kChromeUITermsHost,
+    kChromeUIVersionHost,
 };
 const size_t kNumberOfChromeHostURLs = arraysize(kChromeHostURLs);
 
diff --git a/ios/chrome/browser/google/google_logo_service.mm b/ios/chrome/browser/google/google_logo_service.mm
index 1d58dfe..3a93491 100644
--- a/ios/chrome/browser/google/google_logo_service.mm
+++ b/ios/chrome/browser/google/google_logo_service.mm
@@ -27,7 +27,6 @@
 
 namespace {
 
-const char kGoogleDoodleURLPath[] = "async/newtab_mobile";
 static NSArray* const kDoodleCacheDirectory = @[ @"Chromium", @"Doodle" ];
 
 // Cache directory for doodle.
@@ -42,21 +41,6 @@
       base::SysNSStringToUTF8([NSString pathWithComponents:path_components]));
 }
 
-// Returns the URL where the doodle can be downloaded, e.g.
-// https://www.google.com/async/newtab_mobile. This depends on the user's
-// Google domain.
-GURL GetGoogleDoodleURL(ios::ChromeBrowserState* browser_state) {
-  GURL google_base_url(
-      ios::UIThreadSearchTermsData(browser_state).GoogleBaseURLValue());
-  // SetPathStr() requires its argument to stay in scope as long as
-  // |replacements| is, so a std::string is needed, instead of a char*.
-  std::string path = kGoogleDoodleURLPath;
-  GURL::Replacements replacements;
-  replacements.SetPathStr(path);
-
-  return google_base_url.ReplaceComponents(replacements);
-}
-
 class IOSChromeLogoDelegate : public search_provider_logos::LogoDelegate {
  public:
   IOSChromeLogoDelegate() {}
@@ -103,11 +87,15 @@
         base::MakeUnique<IOSChromeLogoDelegate>());
   }
 
+  GURL google_base_url(
+      ios::UIThreadSearchTermsData(browser_state_).GoogleBaseURLValue());
+
   logo_tracker_->SetServerAPI(
-      GetGoogleDoodleURL(browser_state_),
-      base::Bind(&search_provider_logos::GoogleParseLogoResponse),
-      base::Bind(&search_provider_logos::GoogleAppendQueryparamsToLogoURL,
-                 false /* gray_background */));
+      search_provider_logos::GetGoogleDoodleURL(google_base_url),
+      search_provider_logos::GetGoogleParseLogoResponseCallback(
+          google_base_url),
+      search_provider_logos::GetGoogleAppendQueryparamsCallback(
+          /*gray_background=*/false));
   logo_tracker_->GetLogo(observer);
 }
 
diff --git a/ios/chrome/browser/net/cookie_util.mm b/ios/chrome/browser/net/cookie_util.mm
index 48a2187..2b513cd4 100644
--- a/ios/chrome/browser/net/cookie_util.mm
+++ b/ios/chrome/browser/net/cookie_util.mm
@@ -6,6 +6,7 @@
 
 #import <Foundation/Foundation.h>
 #include <stddef.h>
+#include <stdint.h>
 #include <sys/sysctl.h>
 
 #include "base/logging.h"
@@ -34,7 +35,7 @@
 NSString* const kLastCookieDeletionDate = @"LastCookieDeletionDate";
 
 // Empty callback.
-void DoNothing(int n) {}
+void DoNothing(uint32_t n) {}
 
 // Creates a SQLitePersistentCookieStore running on a background thread.
 scoped_refptr<net::SQLitePersistentCookieStore> CreatePersistentCookieStore(
diff --git a/ios/chrome/browser/payments/BUILD.gn b/ios/chrome/browser/payments/BUILD.gn
index 33bd463..a57b8fa 100644
--- a/ios/chrome/browser/payments/BUILD.gn
+++ b/ios/chrome/browser/payments/BUILD.gn
@@ -9,6 +9,8 @@
   sources = [
     "ios_can_make_payment_query_factory.cc",
     "ios_can_make_payment_query_factory.h",
+    "itunes_json_request.cc",
+    "itunes_json_request.h",
     "payment_request.h",
     "payment_request.mm",
     "payment_request_util.h",
@@ -27,7 +29,9 @@
     "//ios/chrome/browser/browser_state",
     "//ios/chrome/browser/signin",
     "//ios/web",
+    "//net",
     "//ui/base",
+    "//url",
   ]
   libs = [ "UIKit.framework" ]
 }
diff --git a/ios/chrome/browser/payments/itunes_json_request.cc b/ios/chrome/browser/payments/itunes_json_request.cc
new file mode 100644
index 0000000..ef7904b
--- /dev/null
+++ b/ios/chrome/browser/payments/itunes_json_request.cc
@@ -0,0 +1,117 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ios/chrome/browser/payments/itunes_json_request.h"
+
+#include <utility>
+
+#include "base/bind.h"
+#include "base/json/json_reader.h"
+#include "base/memory/ptr_util.h"
+#include "base/values.h"
+#include "net/base/load_flags.h"
+#include "net/http/http_status_code.h"
+#include "net/url_request/url_fetcher.h"
+#include "net/url_request/url_request_status.h"
+#include "url/gurl.h"
+
+namespace payment_request_util {
+
+const char kBadResponse[] = "Bad iTunes Store search response";
+const char kITunesStoreLookupPrefix[] = "https://itunes.apple.com/lookup?";
+const char kITunesStoreSearchPrefix[] = "https://itunes.apple.com/search?";
+
+ITunesJsonRequest::ITunesJsonRequest(
+    const Callback& callback,
+    net::URLRequestContextGetter* context_getter)
+    : callback_(callback),
+      context_getter_(context_getter),
+      weak_factory_(this) {
+  DCHECK(!callback_.is_null());
+}
+
+ITunesJsonRequest::~ITunesJsonRequest() {}
+
+void ITunesJsonRequest::Start(ITunesStoreRequestType request_type,
+                              const std::string& request_query) {
+  Stop();
+
+  std::string complete_query;
+  switch (request_type) {
+    case LOOKUP:
+      complete_query = kITunesStoreLookupPrefix + request_query;
+    case SEARCH:
+      complete_query = kITunesStoreSearchPrefix + request_query;
+  }
+
+  fetcher_ =
+      net::URLFetcher::Create(GURL(complete_query), net::URLFetcher::GET, this);
+  fetcher_->SetRequestContext(context_getter_);
+  fetcher_->SetLoadFlags(net::LOAD_MAYBE_USER_GESTURE |
+                         net::LOAD_DO_NOT_SAVE_COOKIES |
+                         net::LOAD_VERIFY_EV_CERT);
+  fetcher_->Start();
+}
+
+void ITunesJsonRequest::Stop() {
+  fetcher_.reset();
+  weak_factory_.InvalidateWeakPtrs();
+}
+
+void ITunesJsonRequest::ParseJson(
+    const std::string& json,
+    const payment_request_util::ITunesJsonRequest::SuccessCallback&
+        success_callback,
+    const payment_request_util::ITunesJsonRequest::ErrorCallback&
+        error_callback) {
+  DCHECK(!success_callback.is_null());
+  DCHECK(!error_callback.is_null());
+
+  base::JSONReader json_reader;
+  std::unique_ptr<base::Value> value = json_reader.ReadToValue(json);
+  if (value) {
+    success_callback.Run(std::move(value));
+  } else {
+    error_callback.Run(json_reader.GetErrorMessage());
+  }
+}
+
+void ITunesJsonRequest::OnJsonParseSuccess(
+    std::unique_ptr<base::Value> parsed_json) {
+  if (!parsed_json->IsType(base::Value::Type::DICTIONARY)) {
+    OnJsonParseError(kBadResponse);
+    return;
+  }
+
+  callback_.Run(base::WrapUnique(
+      static_cast<base::DictionaryValue*>(parsed_json.release())));
+}
+
+void ITunesJsonRequest::OnJsonParseError(const std::string& error) {
+  callback_.Run(std::unique_ptr<base::DictionaryValue>());
+}
+
+void ITunesJsonRequest::OnURLFetchComplete(const net::URLFetcher* source) {
+  CHECK_EQ(fetcher_.get(), source);
+
+  std::unique_ptr<net::URLFetcher> fetcher(std::move(fetcher_));
+
+  if (!fetcher->GetStatus().is_success() ||
+      fetcher->GetResponseCode() != net::HTTP_OK) {
+    OnJsonParseError(kBadResponse);
+    return;
+  }
+
+  std::string json_data;
+  fetcher->GetResponseAsString(&json_data);
+
+  // The parser will call us back via one of the callbacks.
+  ParseJson(json_data,
+            base::Bind(&ITunesJsonRequest::OnJsonParseSuccess,
+                       weak_factory_.GetWeakPtr()),
+            base::Bind(&ITunesJsonRequest::OnJsonParseError,
+                       weak_factory_.GetWeakPtr()));
+}
+
+}  // namespace payment_request_util
diff --git a/ios/chrome/browser/payments/itunes_json_request.h b/ios/chrome/browser/payments/itunes_json_request.h
new file mode 100644
index 0000000..fbae57f
--- /dev/null
+++ b/ios/chrome/browser/payments/itunes_json_request.h
@@ -0,0 +1,80 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_PAYMENTS_ITUNES_JSON_REQUEST_H_
+#define IOS_CHROME_BROWSER_PAYMENTS_ITUNES_JSON_REQUEST_H_
+
+#include <memory>
+#include <string>
+
+#include "base/callback.h"
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "net/url_request/url_fetcher_delegate.h"
+
+namespace base {
+class DictionaryValue;
+class Value;
+}  // namespace base
+
+namespace net {
+class URLFetcher;
+class URLRequestContextGetter;
+}  // namespace net
+
+namespace payment_request_util {
+
+// A class that fetches a JSON formatted response from the iTunes Store using
+// the iTunes Search API and a basic JSON parser to parse the response as a
+// DictionaryValue.
+class ITunesJsonRequest : public net::URLFetcherDelegate {
+ public:
+  // Callback to pass back the parsed json dictionary returned from iTunes.
+  // Invoked with NULL if there is an error.
+  typedef base::Callback<void(std::unique_ptr<base::DictionaryValue>)> Callback;
+
+  ITunesJsonRequest(const Callback& callback,
+                    net::URLRequestContextGetter* context_getter);
+  ~ITunesJsonRequest() override;
+
+  // Used to express the type of request. Please view the following for info:
+  // https://affiliate.itunes.apple.com/resources/documentation/itunes-store-web-service-search-api/
+  enum ITunesStoreRequestType {
+    LOOKUP,
+    SEARCH,
+  };
+
+  // Starts to fetch results for the given |request_type| and |request_query|.
+  void Start(ITunesStoreRequestType request_type,
+             const std::string& request_query);
+  void Stop();
+
+ private:
+  // Callbacks for JSON parsing.
+  typedef base::Callback<void(std::unique_ptr<base::Value> result)>
+      SuccessCallback;
+  typedef base::Callback<void(const std::string& error)> ErrorCallback;
+
+  void ParseJson(const std::string& raw_json_string,
+                 const SuccessCallback& success_callback,
+                 const ErrorCallback& error_callback);
+
+  void OnJsonParseSuccess(std::unique_ptr<base::Value> parsed_json);
+  void OnJsonParseError(const std::string& error);
+
+  // net::URLFetcherDelegate overrides:
+  void OnURLFetchComplete(const net::URLFetcher* source) override;
+
+  Callback callback_;
+  net::URLRequestContextGetter* context_getter_;
+
+  std::unique_ptr<net::URLFetcher> fetcher_;
+  base::WeakPtrFactory<ITunesJsonRequest> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(ITunesJsonRequest);
+};
+
+}  // namespace payment_request_util
+
+#endif  // IOS_CHROME_BROWSER_PAYMENTS_ITUNES_JSON_REQUEST_H_
diff --git a/ios/chrome/browser/ui/bookmarks/BUILD.gn b/ios/chrome/browser/ui/bookmarks/BUILD.gn
index 8319da47..08ed9ac 100644
--- a/ios/chrome/browser/ui/bookmarks/BUILD.gn
+++ b/ios/chrome/browser/ui/bookmarks/BUILD.gn
@@ -30,6 +30,8 @@
     "bookmark_home_primary_view.h",
     "bookmark_home_tablet_ntp_controller.h",
     "bookmark_home_tablet_ntp_controller.mm",
+    "bookmark_home_view_controller.h",
+    "bookmark_home_view_controller.mm",
     "bookmark_home_waiting_view.h",
     "bookmark_home_waiting_view.mm",
     "bookmark_interaction_controller.h",
@@ -147,6 +149,7 @@
   testonly = true
   sources = [
     "bookmark_home_handset_view_controller_unittest.mm",
+    "bookmark_home_view_controller_unittest.mm",
     "bookmark_ios_unittest.h",
     "bookmark_ios_unittest.mm",
     "bookmark_position_cache_unittest.mm",
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_handset_view_controller.h b/ios/chrome/browser/ui/bookmarks/bookmark_home_handset_view_controller.h
index 83bd477..2d09e87 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_home_handset_view_controller.h
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_handset_view_controller.h
@@ -5,6 +5,8 @@
 #ifndef IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_HOME_HANDSET_VIEW_CONTROLLER_H_
 #define IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_HOME_HANDSET_VIEW_CONTROLLER_H_
 
+#import "ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h"
+
 #import <UIKit/UIKit.h>
 
 #include <set>
@@ -16,14 +18,9 @@
 @protocol UrlLoader;
 
 namespace bookmarks {
-class BookmarkModel;
 class BookmarkNode;
 }  // namespace bookmarks
 
-namespace ios {
-class ChromeBrowserState;
-}  // namespace ios
-
 @protocol BookmarkHomeHandsetViewControllerDelegate
 // The view controller wants to be dismissed.
 // If |url| != GURL(), then the user has selected |url| for navigation.
@@ -33,7 +30,7 @@
 @end
 
 // Navigate/edit the bookmark hierarchy on a handset.
-@interface BookmarkHomeHandsetViewController : UIViewController {
+@interface BookmarkHomeHandsetViewController : BookmarkHomeViewController {
  @protected
   // The following 2 ivars both represent the set of nodes being edited.
   // The set is for fast lookup.
@@ -43,9 +40,6 @@
   std::set<const bookmarks::BookmarkNode*> _editNodes;
   std::vector<const bookmarks::BookmarkNode*> _editNodesOrdered;
 }
-// Designated initializer.
-- (instancetype)initWithLoader:(id<UrlLoader>)loader
-                  browserState:(ios::ChromeBrowserState*)browserState;
 
 #pragma mark - Properties Relevant To Presenters
 
@@ -57,9 +51,6 @@
 @property(nonatomic, assign, readonly) BOOL editing;
 // The set of selected index paths for edition.
 @property(nonatomic, strong, readonly) NSMutableArray* editIndexPaths;
-@property(nonatomic, assign, readonly) bookmarks::BookmarkModel* bookmarks;
-@property(nonatomic, weak, readonly) id<UrlLoader> loader;
-@property(nonatomic, assign, readonly) ios::ChromeBrowserState* browserState;
 
 #pragma mark - Relevant Methods
 // Replaces |_editNodes| and |_editNodesOrdered| with new container objects.
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 7a139fb..d642cb6 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
@@ -45,10 +45,6 @@
 
 using bookmarks::BookmarkNode;
 
-namespace {
-const CGFloat kBookmarkMenuWidth = 264;
-}  // namespace
-
 @interface BookmarkHomeHandsetViewController ()<
     BookmarkCollectionViewDelegate,
     BookmarkEditViewControllerDelegate,
@@ -74,26 +70,12 @@
 
 // This views holds the primary content of this view controller.
 @property(nonatomic, strong) UIView* contentView;
-// The possible views that can be shown from the menu.
-@property(nonatomic, strong) BookmarkCollectionView* folderView;
-// This view is created and used if the model is not fully loaded yet by the
-// time this controller starts.
-@property(nonatomic, strong) BookmarkHomeWaitingView* waitForModelView;
 
-// The menu with all the folders and special entries.
-@property(nonatomic, strong) BookmarkMenuView* menuView;
-// At any point in time, there is exactly one collection view whose view is part
-// of the view hierarchy. This property determine which collection view is
-// visible. Not by accident, this property also reflects the selected menu item
-// in the BookmarkMenuView.
-@property(nonatomic, strong) BookmarkMenuItem* primaryMenuItem;
 // When the view is first shown on the screen, this property represents the
 // cached value of the y of the content offset of the primary view. This
 // property is set to nil after it is used.
 @property(nonatomic, strong) NSNumber* cachedContentPosition;
 
-// The navigation bar sits on top of the main content.
-@property(nonatomic, strong) BookmarkNavigationBar* navigationBar;
 // The layout code in this class relies on the assumption that the editingBar
 // has the same frame as the navigationBar.
 @property(nonatomic, strong) BookmarkEditingBar* editingBar;
@@ -109,25 +91,15 @@
 @property(nonatomic, strong) BookmarkFolderEditorViewController* folderEditor;
 #pragma mark Specific to this class.
 
-// The panel view slides on top of the content to display the menu.
-@property(nonatomic, strong) BookmarkPanelView* panelView;
-
-// Either the menu or the primaryView can scrollToTop.
-@property(nonatomic, assign) BOOL scrollingMenuToTop;
 // 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 is called if the view needs to be loaded and the model is not
-// ready yet.
-- (void)loadWaitingView;
 // This method should be called at most once in the life-cycle of the
 // class. It should be called at the soonest possible time after the
 // view has been loaded, and the bookmark model is loaded.
 - (void)loadBookmarkViews;
-// If the view doesn't exist, create it.
-- (void)ensureFolderViewExists;
 // Updates the property 'primaryMenuItem'.
 // Updates the UI to reflect the new state of 'primaryMenuItem'.
 - (void)updatePrimaryMenuItem:(BookmarkMenuItem*)menuItem
@@ -201,9 +173,6 @@
 - (void)navigationBarBack:(id)sender;
 
 #pragma mark private methods
-// The active collection view that corresponds to primaryMenuItem.
-// This must be implemented by subclass.
-- (UIView<BookmarkHomePrimaryView>*)primaryView;
 // Returns the size of the primary view.
 - (CGRect)frameForPrimaryView;
 // Updates the UI to reflect the given orientation, with an animation lasting
@@ -223,13 +192,8 @@
 
 @implementation BookmarkHomeHandsetViewController
 @synthesize contentView = _contentView;
-@synthesize folderView = _folderView;
-@synthesize waitForModelView = _waitForModelView;
 
-@synthesize menuView = _menuView;
-@synthesize primaryMenuItem = _primaryMenuItem;
 @synthesize cachedContentPosition = _cachedContentPosition;
-@synthesize navigationBar = _navigationBar;
 @synthesize editingBar = _editingBar;
 
 @synthesize actionSheetCoordinator = _actionSheetCoordinator;
@@ -237,26 +201,16 @@
 @synthesize folderSelector = _folderSelector;
 @synthesize folderEditor = _folderEditor;
 
-@synthesize panelView = _panelView;
-@synthesize scrollingMenuToTop = _scrollingMenuToTop;
 @synthesize bookmarkPromoController = _bookmarkPromoController;
 
 @synthesize delegate = _delegate;
 @synthesize editIndexPaths = _editIndexPaths;
 @synthesize editing = _editing;
-@synthesize bookmarks = _bookmarks;
-@synthesize loader = _loader;
-@synthesize browserState = _browserState;
 
 - (instancetype)initWithLoader:(id<UrlLoader>)loader
                   browserState:(ios::ChromeBrowserState*)browserState {
-  DCHECK(browserState);
-  self = [super initWithNibName:nil bundle:nil];
+  self = [super initWithLoader:loader browserState:browserState];
   if (self) {
-    _browserState = browserState->GetOriginalChromeBrowserState();
-    _loader = loader;
-
-    _bookmarks = ios::BookmarkModelFactory::GetForBrowserState(_browserState);
     _editIndexPaths = [[NSMutableArray alloc] init];
 
     [self resetEditNodes];
@@ -272,19 +226,8 @@
 }
 
 - (void)dealloc {
-  _folderView.delegate = nil;
-
-  _menuView.delegate = nil;
-
   _editViewController.delegate = nil;
   _folderSelector.delegate = nil;
-
-  _panelView.delegate = nil;
-}
-
-- (void)loadView {
-  CGRect frame = [[UIScreen mainScreen] bounds];
-  self.view = [[UIView alloc] initWithFrame:frame];
 }
 
 - (void)resetEditNodes {
@@ -343,9 +286,7 @@
 - (void)viewDidLoad {
   [super viewDidLoad];
 
-  BookmarkNavigationBar* bar =
-      [[BookmarkNavigationBar alloc] initWithFrame:[self navigationBarFrame]];
-  self.navigationBar = bar;
+  self.navigationBar.frame = [self navigationBarFrame];
   [self.navigationBar setEditTarget:self
                              action:@selector(navigationBarWantsEditing:)];
   [self.navigationBar setMenuTarget:self
@@ -376,27 +317,15 @@
 
 #pragma mark - Methods duplicated from BookmarkHomeTabletNTPController.
 
-- (void)loadWaitingView {
-  DCHECK(!self.waitForModelView);
-  DCHECK([self isViewLoaded]);
-
-  // Present a waiting view.
-  BookmarkHomeWaitingView* waitingView =
-      [[BookmarkHomeWaitingView alloc] initWithFrame:self.view.bounds];
-  self.waitForModelView = waitingView;
-  [self.view addSubview:self.waitForModelView];
-  [self.waitForModelView startWaiting];
-}
-
 - (void)loadBookmarkViews {
+  [super loadBookmarkViews];
   DCHECK(self.bookmarks->loaded());
   DCHECK([self isViewLoaded]);
 
-  self.panelView =
-      [[BookmarkPanelView alloc] initWithFrame:[self frameForPrimaryView]
-                                 menuViewWidth:kBookmarkMenuWidth];
-  self.panelView.autoresizingMask =
-      UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
+  self.folderView.delegate = self;
+  [self.folderView setFrame:[self frameForPrimaryView]];
+
+  [self.panelView setFrame:[self frameForPrimaryView]];
   self.panelView.delegate = self;
   [self.view insertSubview:self.panelView atIndex:0];
 
@@ -406,15 +335,8 @@
       UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
   [self.panelView.contentView addSubview:self.contentView];
 
-  // The user can swipe the BookmarkPanelView to show the menuView.
-  // Therefore, it must be created here.
-  self.menuView = [[BookmarkMenuView alloc]
-      initWithBrowserState:self.browserState
-                     frame:self.panelView.menuView.bounds];
   self.menuView.delegate = self;
   [self.panelView.menuView addSubview:self.menuView];
-  self.menuView.autoresizingMask =
-      UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
 
   // Load the last primary menu item which the user had active.
   BookmarkMenuItem* item = nil;
@@ -439,55 +361,21 @@
   }
 }
 
-- (void)ensureFolderViewExists {
-  if (self.folderView)
-    return;
-
-  BookmarkCollectionView* view = [[BookmarkCollectionView alloc]
-      initWithBrowserState:self.browserState
-                     frame:[self frameForPrimaryView]];
-  self.folderView = view;
-  self.folderView.delegate = self;
-  [self.folderView setEditing:self.editing animated:NO];
-  self.folderView.autoresizingMask =
-      UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
-}
-
 - (void)updatePrimaryMenuItem:(BookmarkMenuItem*)menuItem
                      animated:(BOOL)animated {
-  DCHECK(menuItem.type == bookmarks::MenuItemFolder);
-  if ([self.primaryMenuItem isEqual:menuItem])
-    return;
+  [super updatePrimaryMenuItem:menuItem];
 
   // Disable editing on previous primary view before dismissing it. No need to
   // animate because this view is immediately removed from hierarchy.
   if ([[self primaryMenuItem] supportsEditing])
     [self.primaryView setEditing:NO animated:NO];
 
-  [[self primaryView] removeFromSuperview];
-  self.primaryMenuItem = menuItem;
-
-  [self ensureFolderViewExists];
-  [self.folderView resetFolder:self.primaryMenuItem.folder];
-  [self.folderView promoStateChangedAnimated:NO];
-
   UIView* primaryView = [self primaryView];
-  [[self primaryView] changeOrientation:GetInterfaceOrientation()];
-  [[self primaryView] setScrollsToTop:!self.scrollingMenuToTop];
-
   [self.contentView insertSubview:primaryView atIndex:0];
   primaryView.frame = self.contentView.bounds;
 
   [self updateNavigationBarAnimated:animated
                         orientation:GetInterfaceOrientation()];
-
-  [self.menuView updatePrimaryMenuItem:self.primaryMenuItem];
-}
-
-- (UIView<BookmarkHomePrimaryView>*)primaryView {
-  if (self.primaryMenuItem.type == bookmarks::MenuItemFolder)
-    return self.folderView;
-  return nil;
 }
 
 #pragma mark - Editing bar methods.
@@ -1023,7 +911,7 @@
 - (void)showMenuAnimated:(BOOL)animated {
   [self.menuView setScrollsToTop:YES];
   [[self primaryView] setScrollsToTop:NO];
-  self.scrollingMenuToTop = YES;
+  self.scrollToTop = YES;
   [self.panelView showMenuAnimated:animated];
   [self updateNavigationBarAnimated:animated
                         orientation:GetInterfaceOrientation()];
@@ -1032,7 +920,7 @@
 - (void)hideMenuAnimated:(BOOL)animated updateNavigationBar:(BOOL)update {
   [self.menuView setScrollsToTop:NO];
   [[self primaryView] setScrollsToTop:YES];
-  self.scrollingMenuToTop = NO;
+  self.scrollToTop = NO;
   [self.panelView hideMenuAnimated:animated];
   if (update) {
     UIInterfaceOrientation orient = GetInterfaceOrientation();
@@ -1053,11 +941,11 @@
   if (showMenu) {
     [self.menuView setScrollsToTop:YES];
     [[self primaryView] setScrollsToTop:NO];
-    self.scrollingMenuToTop = YES;
+    self.scrollToTop = YES;
   } else {
     [self.menuView setScrollsToTop:NO];
     [[self primaryView] setScrollsToTop:YES];
-    self.scrollingMenuToTop = NO;
+    self.scrollToTop = NO;
   }
 
   if ([self shouldShowEditButtonWithMenuVisibility:showMenu])
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_tablet_ntp_controller.h b/ios/chrome/browser/ui/bookmarks/bookmark_home_tablet_ntp_controller.h
index 5ba0323e..615bf17 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_home_tablet_ntp_controller.h
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_tablet_ntp_controller.h
@@ -5,20 +5,15 @@
 #ifndef IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_HOME_TABLET_NTP_CONTROLLER_H_
 #define IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_HOME_TABLET_NTP_CONTROLLER_H_
 
+#import "ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h"
 #import "ios/chrome/browser/ui/ntp/new_tab_page_panel_protocol.h"
 
 @protocol UrlLoader;
 
-namespace ios {
-class ChromeBrowserState;
-}  // namespace ios
-
 // Navigate/edit the bookmark hierarchy on tablet, from the New Tab Page (NTP).
 @interface BookmarkHomeTabletNTPController
-    : UIViewController<NewTabPagePanelProtocol>
-// Designated initializer.
-- (instancetype)initWithLoader:(id<UrlLoader>)loader
-                  browserState:(ios::ChromeBrowserState*)browserState;
+    : BookmarkHomeViewController<NewTabPagePanelProtocol>
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_HOME_TABLET_NTP_CONTROLLER_H_
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 e2f6e0a..f7d4eba 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
@@ -50,30 +50,10 @@
 using bookmarks::BookmarkNode;
 
 namespace {
-// The width of the bookmark menu, displaying the different sections.
-const CGFloat kMenuWidth = 264.0;
 // The margin on top to the navigation bar.
 const CGFloat kNavigationBarTopMargin = 8.0;
 }  // namespace
 
-// A simple UIView subclass to pass on relayout information to its delegate.
-@protocol ContentViewDelegate<NSObject>
-- (void)willLayoutSubviews;
-@end
-
-@interface ContentView : UIView
-@property(nonatomic, weak) id<ContentViewDelegate> delegate;
-@end
-
-@implementation ContentView
-@synthesize delegate = _delegate;
-
-- (void)layoutSubviews {
-  [self.delegate willLayoutSubviews];
-  [super layoutSubviews];
-}
-@end
-
 @interface BookmarkHomeTabletNTPController ()<
     BookmarkCollectionViewDelegate,
     BookmarkEditViewControllerDelegate,
@@ -81,12 +61,9 @@
     BookmarkFolderViewControllerDelegate,
     BookmarkMenuViewDelegate,
     BookmarkModelBridgeObserver,
-    BookmarkPromoControllerDelegate,
-    ContentViewDelegate> {
+    BookmarkPromoControllerDelegate> {
   // Bridge to register for bookmark changes.
   std::unique_ptr<bookmarks::BookmarkModelBridge> _bridge;
-  ios::ChromeBrowserState* _browserState;  // Weak.
-  __weak id<UrlLoader> _loader;
 
   // The following 2 ivars both represent the set of nodes being edited.
   // The set is for fast lookup.
@@ -97,19 +74,12 @@
   std::vector<const BookmarkNode*> _editNodesOrdered;
 }
 
-@property(nonatomic, strong) BookmarkPanelView* panelView;
-
 #pragma mark - Properties and methods akin to BookmarkHomeHandsetViewController
 
 // Whether the view controller is in editing mode.
 @property(nonatomic, assign) BOOL editing;
 // The set of edited index paths.
 @property(nonatomic, strong) NSMutableArray* editIndexPaths;
-// The bookmark model used.
-@property(nonatomic, assign, readonly) bookmarks::BookmarkModel* bookmarks;
-// The user's browser state model used.
-@property(nonatomic, assign, readonly)
-    ios::ChromeBrowserState* browserState;  // from superclass.
 
 // Replaces |_editNodes| and |_editNodesOrdered| with new container objects.
 - (void)resetEditNodes;
@@ -123,31 +93,12 @@
 - (void)setEditing:(BOOL)editing animated:(BOOL)animated;
 
 #pragma mark - Properties and methods akin to BookmarkHomeHandsetViewController
-
-// This views holds the primary content of this controller.
-@property(nonatomic, readwrite, strong) ContentView* view;
-
-// The possible views that can be shown from the menu.
-@property(nonatomic, strong) BookmarkCollectionView* folderView;
-// This view is created and used if the model is not fully loaded yet by the
-// time this controller starts.
-@property(nonatomic, strong) BookmarkHomeWaitingView* waitForModelView;
-
-// The menu with all the folders and special entries.
-@property(nonatomic, strong) BookmarkMenuView* menuView;
-// At any point in time, there is exactly one collection view whose view is part
-// of the view hierarchy. This property determines which collection view is
-// visible. Not by accident, this property also reflects the selected menu item
-// in the BookmarkMenuView.
-@property(nonatomic, strong) BookmarkMenuItem* primaryMenuItem;
 // When the view is first shown on the screen, this property represents the
 // cached value of the y of the content offset of the primary view. This
 // property is set to nil after it is used.
 @property(nonatomic, strong)
     NSNumber* cachedContentPosition;  // FIXME: INACTIVE
 
-// The navigation bar sits on top of the main content.
-@property(nonatomic, strong) BookmarkNavigationBar* navigationBar;
 // The editing bar present when items are selected.
 @property(nonatomic, strong) BookmarkEditingBar* editingBar;
 
@@ -167,31 +118,19 @@
 
 #pragma mark Specific to this class.
 
-// Either the menu or the primaryView can scrollToTop.
-@property(nonatomic, assign) BOOL scrollToTop;
-
 // Opens the url.
 - (void)loadURL:(const GURL&)url;
 #pragma mark View loading, laying out, and switching.
-// This method is called if the view needs to be loaded and the model is not
-// ready yet.
-- (void)loadWaitingView;
 // This method should be called at most once in the life-cycle of the class.
 // It should be called at the soonest possible time after the view has been
 // loaded, and the bookmark model is loaded.
 - (void)loadBookmarkViews;
-// If the view doesn't exist, create it.
-- (void)ensureFolderViewExists;
 // Updates the property 'primaryMenuItem'.
 // Updates the UI to reflect the new state of 'primaryMenuItem'.
 - (void)updatePrimaryMenuItem:(BookmarkMenuItem*)menuItem
                      animated:(BOOL)animated;
-// The active collection view that corresponds to primaryMenuItem.
-- (UIView<BookmarkHomePrimaryView>*)primaryView;
 // Returns whether the menu should be in a side panel that slides in.
 - (BOOL)shouldPresentMenuInSlideInPanel;
-// Returns the width of the menu.
-- (CGFloat)menuWidth;
 // Returns the leading margin of the primary view.
 - (CGFloat)primaryViewLeadingMargin;
 // Moves the menu and primary view to their correct parent views depending on
@@ -273,20 +212,10 @@
 
 @implementation BookmarkHomeTabletNTPController
 
-@dynamic view;
 @synthesize editing = _editing;
 @synthesize editIndexPaths = _editIndexPaths;
-@synthesize bookmarks = _bookmarks;
-
-@synthesize folderView = _folderView;
-@synthesize waitForModelView = _waitForModelView;
-
-@synthesize menuView = _menuView;
-@synthesize primaryMenuItem = _primaryMenuItem;
 @synthesize cachedContentPosition = _cachedContentPosition;
-@synthesize navigationBar = _navigationBar;
 @synthesize editingBar = _editingBar;
-@synthesize panelView = _panelView;
 
 @synthesize actionSheetCoordinator = _actionSheetCoordinator;
 @synthesize editViewController = _editViewController;
@@ -294,21 +223,14 @@
 @synthesize folderEditor = _folderEditor;
 @synthesize bookmarkPromoController = _bookmarkPromoController;
 
-@synthesize scrollToTop = _scrollToTop;
-
 // Property declared in NewTabPagePanelProtocol.
 @synthesize delegate = _delegate;
 
 - (id)initWithLoader:(id<UrlLoader>)loader
         browserState:(ios::ChromeBrowserState*)browserState {
-  self = [super init];
+  self = [super initWithLoader:loader browserState:browserState];
   if (self) {
-    DCHECK(browserState);
-    _browserState = browserState->GetOriginalChromeBrowserState();
-    _loader = loader;
-
-    _bookmarks = ios::BookmarkModelFactory::GetForBrowserState(_browserState);
-    _bridge.reset(new bookmarks::BookmarkModelBridge(self, _bookmarks));
+    _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.
@@ -320,23 +242,14 @@
 }
 
 - (void)dealloc {
-  self.view.delegate = nil;
-
-  _folderView.delegate = nil;
-
-  _menuView.delegate = nil;
-
   _editViewController.delegate = nil;
   _folderSelector.delegate = nil;
 }
 
-- (ios::ChromeBrowserState*)browserState {
-  return _browserState;
-}
+#pragma mark - UIViewController method.
 
-#pragma mark - ContentViewDelegate method.
-
-- (void)willLayoutSubviews {
+- (void)viewWillLayoutSubviews {
+  [super viewWillLayoutSubviews];
   if (![self primaryView] && ![self primaryMenuItem] &&
       self.bookmarks->loaded()) {
     BookmarkMenuItem* item = nil;
@@ -428,7 +341,7 @@
                                  new_tab_page_uma::ACTION_OPENED_BOOKMARK);
   base::RecordAction(
       base::UserMetricsAction("MobileBookmarkManagerEntryOpened"));
-  [_loader loadURL:url
+  [self.loader loadURL:url
                referrer:web::Referrer()
              transition:ui::PAGE_TRANSITION_AUTO_BOOKMARK
       rendererInitiated:NO];
@@ -436,18 +349,6 @@
 
 #pragma mark - Views
 
-- (void)loadWaitingView {
-  DCHECK(!self.waitForModelView);
-  DCHECK(self.view);
-
-  // Present a waiting view.
-  BookmarkHomeWaitingView* waitingView =
-      [[BookmarkHomeWaitingView alloc] initWithFrame:self.view.bounds];
-  self.waitForModelView = waitingView;
-  [self.view addSubview:self.waitForModelView];
-  [self.waitForModelView startWaiting];
-}
-
 - (void)updateMenuViewLayout {
   LayoutRect menuLayout =
       LayoutRectMake(0, self.view.bounds.size.width, 0, self.menuWidth,
@@ -456,17 +357,11 @@
 }
 
 - (void)loadBookmarkViews {
+  [super loadBookmarkViews];
   DCHECK(self.bookmarks->loaded());
 
-  // Create the menu.
-  LayoutRect menuLayout =
-      LayoutRectMake(0, self.view.bounds.size.width, 0, self.menuWidth,
-                     self.view.bounds.size.height);
-  self.menuView = [[BookmarkMenuView alloc]
-      initWithBrowserState:self.browserState
-                     frame:LayoutRectGetRect(menuLayout)];
   self.menuView.delegate = self;
-  self.menuView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
+  self.folderView.delegate = self;
 
   [self moveMenuAndPrimaryViewToAdequateParent];
 
@@ -495,38 +390,12 @@
   }
 }
 
-- (void)ensureFolderViewExists {
-  if (self.folderView)
-    return;
-
-  BookmarkCollectionView* view =
-      [[BookmarkCollectionView alloc] initWithBrowserState:self.browserState
-                                                     frame:CGRectZero];
-  self.folderView = view;
-  self.folderView.delegate = self;
-  [self.folderView setEditing:self.editing animated:NO];
-  self.folderView.autoresizingMask =
-      UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
-}
-
 - (void)updatePrimaryMenuItem:(BookmarkMenuItem*)menuItem
                      animated:(BOOL)animated {
-  DCHECK(menuItem.type == bookmarks::MenuItemFolder);
-  if ([self.primaryMenuItem isEqual:menuItem])
-    return;
-
   if (![self.view superview])
     return;
 
-  [[self primaryView] removeFromSuperview];
-  self.primaryMenuItem = menuItem;
-
-  [self ensureFolderViewExists];
-  [self.folderView resetFolder:self.primaryMenuItem.folder];
-  [self.folderView promoStateChangedAnimated:NO];
-
-  [[self primaryView] changeOrientation:GetInterfaceOrientation()];
-  [[self primaryView] setScrollsToTop:self.scrollToTop];
+  [super updatePrimaryMenuItem:menuItem];
 
   [self moveMenuAndPrimaryViewToAdequateParent];
 
@@ -536,25 +405,13 @@
   self.navigationBar.hidden = NO;
   [self updateNavigationBarAnimated:animated
                         orientation:GetInterfaceOrientation()];
-
-  [self.menuView updatePrimaryMenuItem:self.primaryMenuItem];
   [self updateEditBarShadow];
 }
 
-- (UIView<BookmarkHomePrimaryView>*)primaryView {
-  if (self.primaryMenuItem.type == bookmarks::MenuItemFolder)
-    return self.folderView;
-  return nil;
-}
-
 - (BOOL)shouldPresentMenuInSlideInPanel {
   return IsCompactTablet();
 }
 
-- (CGFloat)menuWidth {
-  return kMenuWidth;
-}
-
 - (CGFloat)primaryViewLeadingMargin {
   if ([self shouldPresentMenuInSlideInPanel])
     return 0;
@@ -572,12 +429,7 @@
     [primaryView removeFromSuperview];
 
   if ([self shouldPresentMenuInSlideInPanel]) {
-    // Create (if needed), and add the panelView to the view hierarchy.
-    if (!self.panelView) {
-      self.panelView =
-          [[BookmarkPanelView alloc] initWithFrame:CGRectZero
-                                     menuViewWidth:[self menuWidth]];
-    }
+    // Add the panelView to the view hierarchy.
     [self.view addSubview:self.panelView];
     CGSize size = self.view.bounds.size;
     CGFloat navBarHeight = CGRectGetHeight([self navigationBarFrame]);
@@ -1159,12 +1011,12 @@
 }
 
 - (void)wasShown {
-  [_folderView wasShown];
+  [self.folderView wasShown];
 }
 
 - (void)wasHidden {
   [self cachePosition];
-  [_folderView wasHidden];
+  [self.folderView wasHidden];
 }
 
 - (void)dismissModals {
@@ -1184,17 +1036,9 @@
   [[self primaryView] setScrollsToTop:self.scrollToTop];
 }
 
-- (void)loadView {
-  self.view = [[ContentView alloc] initWithFrame:CGRectZero];
-}
-
 - (void)viewDidLoad {
   [super viewDidLoad];
-  self.view.delegate = self;
   self.view.backgroundColor = bookmark_utils_ios::mainBackgroundColor();
-  BookmarkNavigationBar* bar =
-      [[BookmarkNavigationBar alloc] initWithFrame:CGRectZero];
-  self.navigationBar = bar;
   self.navigationBar.autoresizingMask = UIViewAutoresizingFlexibleWidth;
 
   [self.navigationBar setEditTarget:self
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h
new file mode 100644
index 0000000..9f29228
--- /dev/null
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h
@@ -0,0 +1,97 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_UI_BOOKMARKS_HOME_VIEW_CONTROLLER_H_
+#define IOS_CHROME_BROWSER_UI_BOOKMARKS_HOME_VIEW_CONTROLLER_H_
+
+#import <UIKit/UIKit.h>
+
+#include <set>
+#include <vector>
+
+@protocol UrlLoader;
+@protocol BookmarkHomePrimaryView;
+
+namespace ios {
+class ChromeBrowserState;
+}  // namespace ios
+
+namespace bookmarks {
+class BookmarkModel;
+}  // namespace bookmarks
+
+@class BookmarkCollectionView;
+@class BookmarkPanelView;
+@class BookmarkMenuView;
+@class BookmarkHomeWaitingView;
+@class BookmarkNavigationBar;
+@class BookmarkMenuItem;
+
+// Class to navigate the bookmark hierarchy, needs subclassing for tablet /
+// handset case.
+@interface BookmarkHomeViewController : UIViewController
+
+- (instancetype)initWithNibName:(NSString*)nibNameOrNil
+                         bundle:(NSBundle*)nibBundleOrNil NS_UNAVAILABLE;
+- (instancetype)initWithCoder:(NSCoder*)aDecoder NS_UNAVAILABLE;
+- (instancetype)init NS_UNAVAILABLE;
+- (instancetype)initWithLoader:(id<UrlLoader>)loader
+                  browserState:(ios::ChromeBrowserState*)browserState
+    NS_DESIGNATED_INITIALIZER;
+
+// The bookmark model used.
+@property(nonatomic, assign, readonly) bookmarks::BookmarkModel* bookmarks;
+
+// The user's browser state model used.
+@property(nonatomic, assign, readonly) ios::ChromeBrowserState* browserState;
+
+// The main view showing all the bookmarks.
+@property(nonatomic, strong, readonly) BookmarkCollectionView* folderView;
+
+// Object to load URLs.
+@property(nonatomic, weak, readonly) id<UrlLoader> loader;
+
+// The menu with all the folders.
+@property(nonatomic, strong, readonly) BookmarkMenuView* menuView;
+
+// The navigation bar sits on top of the main content.
+@property(nonatomic, strong, readonly) BookmarkNavigationBar* navigationBar;
+
+// At any point in time, there is exactly one collection view whose view is part
+// of the view hierarchy. This property determines what data is visible in the
+// collection view.
+@property(nonatomic, strong, readonly) BookmarkMenuItem* primaryMenuItem;
+
+// This view holds a content view, and a menu view.
+@property(nonatomic, strong, readonly) BookmarkPanelView* panelView;
+
+// Either the menu or the primaryView can scrollToTop.
+@property(nonatomic, assign) BOOL scrollToTop;
+
+// This view is created and used if the model is not fully loaded yet by the
+// time this controller starts. Property is readwrite, so that subclasses can
+// set it to nil, once finished with it.
+@property(nonatomic, strong) BookmarkHomeWaitingView* waitForModelView;
+
+// This method should be called at most once in the life-cycle of the class.
+// It should be called at the soonest possible time after the view has been
+// loaded, and the bookmark model is loaded.
+- (void)loadBookmarkViews;
+
+// Returns the width of the menu.
+- (CGFloat)menuWidth;
+
+// This method is called if the view needs to be loaded and the model is not
+// ready yet.
+- (void)loadWaitingView;
+
+// Updates the property 'primaryMenuItem'.
+// Updates the UI to reflect the new state of 'primaryMenuItem'.
+- (void)updatePrimaryMenuItem:(BookmarkMenuItem*)menuItem;
+
+// The active collection view that corresponds to primaryMenuItem.
+- (UIView<BookmarkHomePrimaryView>*)primaryView;
+@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
new file mode 100644
index 0000000..4ebcdcc
--- /dev/null
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm
@@ -0,0 +1,153 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h"
+
+#include "components/bookmarks/browser/bookmark_model.h"
+#include "ios/chrome/browser/bookmarks/bookmark_model_factory.h"
+#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#import "ios/chrome/browser/ui/bookmarks/bars/bookmark_navigation_bar.h"
+#import "ios/chrome/browser/ui/bookmarks/bookmark_collection_view.h"
+#import "ios/chrome/browser/ui/bookmarks/bookmark_home_primary_view.h"
+#import "ios/chrome/browser/ui/bookmarks/bookmark_home_waiting_view.h"
+#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/rtl_geometry.h"
+#import "ios/chrome/browser/ui/ui_util.h"
+#import "ios/chrome/browser/ui/uikit_ui_util.h"
+#import "ios/chrome/browser/ui/url_loader.h"
+
+using bookmarks::BookmarkNode;
+
+namespace {
+// The width of the bookmark menu, displaying the different sections.
+const CGFloat kMenuWidth = 264;
+}
+
+@interface BookmarkHomeViewController ()
+// Read / write declaration of read only properties.
+@property(nonatomic, assign) bookmarks::BookmarkModel* bookmarks;
+@property(nonatomic, assign) ios::ChromeBrowserState* browserState;
+@property(nonatomic, strong) BookmarkCollectionView* folderView;
+@property(nonatomic, weak) id<UrlLoader> loader;
+@property(nonatomic, strong) BookmarkMenuView* menuView;
+@property(nonatomic, strong) BookmarkNavigationBar* navigationBar;
+@property(nonatomic, strong) BookmarkPanelView* panelView;
+@property(nonatomic, strong) BookmarkMenuItem* primaryMenuItem;
+@end
+
+@implementation BookmarkHomeViewController
+
+@synthesize bookmarks = _bookmarks;
+@synthesize browserState = _browserState;
+@synthesize folderView = _folderView;
+@synthesize loader = _loader;
+@synthesize menuView = _menuView;
+@synthesize navigationBar = _navigationBar;
+@synthesize panelView = _panelView;
+@synthesize primaryMenuItem = _primaryMenuItem;
+@synthesize waitForModelView = _waitForModelView;
+@synthesize scrollToTop = _scrollToTop;
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+#pragma mark - Initializer
+
+- (instancetype)initWithLoader:(id<UrlLoader>)loader
+                  browserState:(ios::ChromeBrowserState*)browserState {
+  DCHECK(browserState);
+  self = [super initWithNibName:nil bundle:nil];
+  if (self) {
+    _browserState = browserState->GetOriginalChromeBrowserState();
+    _loader = loader;
+
+    _bookmarks = ios::BookmarkModelFactory::GetForBrowserState(browserState);
+  }
+  return self;
+}
+
+#pragma mark - UIViewController
+
+- (void)viewDidLoad {
+  [super viewDidLoad];
+  self.navigationBar = [[BookmarkNavigationBar alloc] initWithFrame:CGRectZero];
+}
+
+#pragma mark - Public
+
+- (void)loadBookmarkViews {
+  LayoutRect menuLayout =
+      LayoutRectMake(0, self.view.bounds.size.width, 0, self.menuWidth,
+                     self.view.bounds.size.height);
+
+  // Create menu view.
+  self.menuView = [[BookmarkMenuView alloc]
+      initWithBrowserState:_browserState
+                     frame:LayoutRectGetRect(menuLayout)];
+  self.menuView.autoresizingMask =
+      UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
+
+  // Create panel view.
+  self.panelView = [[BookmarkPanelView alloc] initWithFrame:CGRectZero
+                                              menuViewWidth:self.menuWidth];
+  self.panelView.autoresizingMask =
+      UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
+
+  // Create folder view.
+  BookmarkCollectionView* view =
+      [[BookmarkCollectionView alloc] initWithBrowserState:self.browserState
+                                                     frame:CGRectZero];
+  self.folderView = view;
+  [self.folderView setEditing:self.editing animated:NO];
+  self.folderView.autoresizingMask =
+      UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
+}
+
+- (void)updatePrimaryMenuItem:(BookmarkMenuItem*)menuItem {
+  DCHECK(menuItem.type == bookmarks::MenuItemFolder);
+  if ([self.primaryMenuItem isEqual:menuItem])
+    return;
+
+  // TODO(crbug.com/705339): Folder view is the only primary view now,
+  // hence we don't need to remove primary view anymore.
+  // Simplify this code that removes primary view and adds it back
+  // in subclasses, once the addition code moves here.
+  [[self primaryView] removeFromSuperview];
+  self.primaryMenuItem = menuItem;
+
+  [self.folderView resetFolder:self.primaryMenuItem.folder];
+  [self.folderView promoStateChangedAnimated:NO];
+
+  [[self primaryView] changeOrientation:GetInterfaceOrientation()];
+  [[self primaryView] setScrollsToTop:!self.scrollToTop];
+
+  [self.menuView updatePrimaryMenuItem:self.primaryMenuItem];
+}
+
+- (UIView<BookmarkHomePrimaryView>*)primaryView {
+  if (self.primaryMenuItem.type == bookmarks::MenuItemFolder)
+    return self.folderView;
+  return nil;
+}
+
+- (void)loadWaitingView {
+  DCHECK(!self.waitForModelView);
+  DCHECK(self.view);
+
+  // Present a waiting view.
+  BookmarkHomeWaitingView* waitingView =
+      [[BookmarkHomeWaitingView alloc] initWithFrame:self.view.bounds];
+  self.waitForModelView = waitingView;
+  [self.view addSubview:self.waitForModelView];
+  [self.waitForModelView startWaiting];
+}
+
+- (CGFloat)menuWidth {
+  return kMenuWidth;
+}
+
+@end
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller_unittest.mm b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller_unittest.mm
new file mode 100644
index 0000000..039f704
--- /dev/null
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller_unittest.mm
@@ -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.
+
+#import "ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h"
+
+#import "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
+#include "ios/chrome/browser/ui/bookmarks/bookmark_ios_unittest.h"
+
+namespace {
+
+using BookmarkHomeViewControllerTest = BookmarkIOSUnitTest;
+
+TEST_F(BookmarkHomeViewControllerTest, LoadBookmarks) {
+  @autoreleasepool {
+    BookmarkHomeViewController* controller = [[BookmarkHomeViewController alloc]
+        initWithLoader:nil
+          browserState:chrome_browser_state_.get()];
+
+    EXPECT_EQ(nil, controller.menuView);
+    EXPECT_EQ(nil, controller.panelView);
+    EXPECT_EQ(nil, controller.folderView);
+
+    [controller view];
+    [controller loadBookmarkViews];
+
+    EXPECT_NE(nil, controller);
+    EXPECT_NE(nil, controller.navigationBar);
+    EXPECT_NE(nil, controller.menuView);
+    EXPECT_NE(nil, controller.panelView);
+    EXPECT_NE(nil, controller.folderView);
+  }
+}
+
+TEST_F(BookmarkHomeViewControllerTest, LoadWaitingView) {
+  @autoreleasepool {
+    BookmarkHomeViewController* controller = [[BookmarkHomeViewController alloc]
+        initWithLoader:nil
+          browserState:chrome_browser_state_.get()];
+
+    EXPECT_TRUE(controller.waitForModelView == nil);
+
+    [controller view];
+    [controller loadWaitingView];
+
+    EXPECT_TRUE(controller != nil);
+    EXPECT_TRUE(controller.waitForModelView != nil);
+  }
+}
+
+}  // namespace
diff --git a/ios/chrome/browser/ui/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view_controller.mm
index e2389e0..c39ee90 100644
--- a/ios/chrome/browser/ui/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view_controller.mm
@@ -4044,6 +4044,21 @@
   }
 }
 
+- (void)sharePage {
+  ShareToData* data = activity_services::ShareToDataForTab([_model currentTab]);
+  if (data)
+    [self sharePageWithData:data];
+}
+
+- (void)bookmarkPage {
+  [self initializeBookmarkInteractionController];
+  [_bookmarkInteractionController
+      presentBookmarkForTab:[_model currentTab]
+        currentlyBookmarked:_toolbarModelIOS->IsCurrentTabBookmarkedByUser()
+                     inView:[_toolbarController bookmarkButtonView]
+                 originRect:[_toolbarController bookmarkButtonAnchorRect]];
+}
+
 #pragma mark - Command Handling
 
 - (IBAction)chromeExecuteCommand:(id)sender {
@@ -4054,14 +4069,6 @@
   Tab* currentTab = [_model currentTab];
 
   switch (command) {
-    case IDC_BOOKMARK_PAGE:
-      [self initializeBookmarkInteractionController];
-      [_bookmarkInteractionController
-          presentBookmarkForTab:[_model currentTab]
-            currentlyBookmarked:_toolbarModelIOS->IsCurrentTabBookmarkedByUser()
-                         inView:[_toolbarController bookmarkButtonView]
-                     originRect:[_toolbarController bookmarkButtonAnchorRect]];
-      break;
     case IDC_FIND:
       [self initFindBarForTab];
       break;
@@ -4122,9 +4129,6 @@
       [self.dispatcher reload];
       break;
     }
-    case IDC_SHARE_PAGE:
-      [self sharePage];
-      break;
     case IDC_SHOW_MAIL_COMPOSER:
       [self showMailComposer:sender];
       break;
@@ -4248,11 +4252,6 @@
   }
 }
 
-- (void)sharePage {
-  ShareToData* data = activity_services::ShareToDataForTab([_model currentTab]);
-  if (data)
-    [self sharePageWithData:data];
-}
 
 - (void)sharePageWithData:(ShareToData*)data {
   id<ShareProtocol> controller = [_dependencyFactory shareControllerInstance];
diff --git a/ios/chrome/browser/ui/browser_view_controller_unittest.mm b/ios/chrome/browser/ui/browser_view_controller_unittest.mm
index 72f2e73..917d8fd 100644
--- a/ios/chrome/browser/ui/browser_view_controller_unittest.mm
+++ b/ios/chrome/browser/ui/browser_view_controller_unittest.mm
@@ -33,6 +33,7 @@
 #import "ios/chrome/browser/ui/browser_view_controller.h"
 #import "ios/chrome/browser/ui/browser_view_controller_dependency_factory.h"
 #import "ios/chrome/browser/ui/browser_view_controller_testing.h"
+#import "ios/chrome/browser/ui/commands/browser_commands.h"
 #import "ios/chrome/browser/ui/commands/generic_chrome_command.h"
 #include "ios/chrome/browser/ui/commands/ios_command_ids.h"
 #import "ios/chrome/browser/ui/ntp/new_tab_page_controller.h"
@@ -429,7 +430,7 @@
 }
 
 // Verifies that BVC invokes -shareURL on ShareController with the correct
-// parameters in response to the IDC_SHARE_PAGE command.
+// parameters in response to the -sharePage command.
 TEST_F(BrowserViewControllerTest, TestSharePageCommandHandling) {
   GURL expectedUrl("http://www.testurl.net");
   NSString* expectedTitle = @"title";
@@ -472,12 +473,12 @@
       shareToDelegate:bvc_
              fromRect:[bvc_ testing_shareButtonAnchorRect]
                inView:[OCMArg any]];
-  [bvc_ chromeExecuteCommand:GetCommandWithTag(IDC_SHARE_PAGE)];
+  [bvc_.dispatcher sharePage];
   EXPECT_OCMOCK_VERIFY(shareControllerMock);
 }
 
 // Verifies that BVC does not invoke -shareURL on ShareController in response
-// to the IDC_SHARE_PAGE command if tab is in the process of being closed.
+// to the |-sharePage| command if tab is in the process of being closed.
 TEST_F(BrowserViewControllerTest, TestSharePageWhenClosing) {
   GURL expectedUrl("http://www.testurl.net");
   NSString* expectedTitle = @"title";
@@ -498,7 +499,7 @@
       shareToDelegate:bvc_
              fromRect:[bvc_ testing_shareButtonAnchorRect]
                inView:[OCMArg any]];
-  [bvc_ chromeExecuteCommand:GetCommandWithTag(IDC_SHARE_PAGE)];
+  [bvc_.dispatcher sharePage];
   EXPECT_OCMOCK_VERIFY(shareControllerMock);
 }
 
diff --git a/ios/chrome/browser/ui/chrome_web_view_factory.mm b/ios/chrome/browser/ui/chrome_web_view_factory.mm
index c53d324..cbd7be9 100644
--- a/ios/chrome/browser/ui/chrome_web_view_factory.mm
+++ b/ios/chrome/browser/ui/chrome_web_view_factory.mm
@@ -4,6 +4,8 @@
 
 #import "ios/chrome/browser/ui/chrome_web_view_factory.h"
 
+#include <stdint.h>
+
 #include "base/base64.h"
 #include "base/logging.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
@@ -52,7 +54,7 @@
 scoped_refptr<web::RequestTrackerImpl> g_request_tracker;
 
 // Empty callback used by ClearCookiesOnIOThread below.
-void DoNothing(int n) {}
+void DoNothing(uint32_t n) {}
 
 // Clears the cookies.
 void ClearCookiesOnIOThread(net::URLRequestContextGetter* context_getter,
diff --git a/ios/chrome/browser/ui/commands/browser_commands.h b/ios/chrome/browser/ui/commands/browser_commands.h
index 3c97d78b..07ed08b 100644
--- a/ios/chrome/browser/ui/commands/browser_commands.h
+++ b/ios/chrome/browser/ui/commands/browser_commands.h
@@ -24,6 +24,12 @@
 // Reloads the current web page
 - (void)reload;
 
+// Shows the share sheet for the current page.
+- (void)sharePage;
+
+// Bookmarks the current page.
+- (void)bookmarkPage;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_COMMANDS_BROWSER_COMMANDS_H_
diff --git a/ios/chrome/browser/ui/commands/ios_command_ids.h b/ios/chrome/browser/ui/commands/ios_command_ids.h
index ad25284..23e66f2 100644
--- a/ios/chrome/browser/ui/commands/ios_command_ids.h
+++ b/ios/chrome/browser/ui/commands/ios_command_ids.h
@@ -16,7 +16,6 @@
 #define IDC_RELOAD                                     33002
 #define IDC_NEW_TAB                                    34014
 #define IDC_FULLSCREEN                                 34030
-#define IDC_BOOKMARK_PAGE                              35000
 #define IDC_VIEW_SOURCE                                35002
 #define IDC_PRINT                                      35003
 #define IDC_FIND                                       37000
@@ -52,7 +51,6 @@
 #define IDC_CLEAR_BROWSING_DATA_IOS                    40924
 #define IDC_SHOW_MAIL_COMPOSER                         40926
 #define IDC_RESET_ALL_WEBVIEWS                         40928
-#define IDC_SHARE_PAGE                                 40929
 #define IDC_BACK_FORWARD_IN_TAB_HISTORY                40930
 #define IDC_SHOW_PRIVACY_SETTINGS                      40934
 #define IDC_HIDE_SETTINGS_AND_SHOW_PRIVACY_SETTINGS    40935
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.h
index 6d9d043..cedd920 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.h
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.h
@@ -76,7 +76,8 @@
 // header containing the fake omnibox and the logo.
 - (BOOL)isHeaderSection:(NSInteger)section;
 
-// Updates the number of Most Visited tiles shown for the |size|.
+// Updates the number of Most Visited tiles shown for the |size| on the model
+// only. The collection needs to be updated separately.
 - (void)updateMostVisitedForSize:(CGSize)size;
 
 // Dismisses the |item| from the model. Does not change the UI.
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm
index 8b33943..1f6b8a3 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm
@@ -446,24 +446,22 @@
   if (currentCount == newCount)
     return;
 
-  // If the animations are enabled, the items are added then the rotation
-  // animation is triggered, creating a weird sequenced animation.
-  [UIView setAnimationsEnabled:NO];
   if (currentCount > newCount) {
     for (NSInteger i = newCount; i < currentCount; i++) {
-      NSIndexPath* itemToRemove =
-          [NSIndexPath indexPathForItem:newCount inSection:mostVisitedSection];
-      [self.collectionViewController dismissEntryAtIndexPath:itemToRemove];
+      [self.collectionViewController.collectionViewModel
+                 removeItemWithType:ItemTypeMostVisited
+          fromSectionWithIdentifier:SectionIdentifierMostVisited
+                            atIndex:newCount];
     }
   } else {
-    NSMutableArray* itemsToBeAdded = [NSMutableArray array];
     for (NSInteger i = currentCount; i < newCount; i++) {
-      [itemsToBeAdded addObject:mostVisited[i]];
+      CSCollectionViewItem* item = mostVisited[i];
+      item.type = ItemTypeMostVisited;
+      [self.collectionViewController.collectionViewModel
+                          addItem:item
+          toSectionWithIdentifier:SectionIdentifierMostVisited];
     }
-    [self.collectionViewController addSuggestions:itemsToBeAdded
-                                    toSectionInfo:mostVisitedSectionInfo];
   }
-  [UIView setAnimationsEnabled:YES];
 }
 
 - (void)dismissItem:(CSCollectionViewItem*)item {
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm
index 597a0d6..95ba674 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm
@@ -204,7 +204,7 @@
         UIEdgeInsetsMake(0, self.cardStyleMargin, 0, self.cardStyleMargin);
   }
   [self.collectionUpdater updateMostVisitedForSize:size];
-  [self.collectionView.collectionViewLayout invalidateLayout];
+  [self.collectionView reloadData];
 }
 
 - (void)willTransitionToTraitCollection:(UITraitCollection*)newCollection
@@ -212,6 +212,10 @@
                   (id<UIViewControllerTransitionCoordinator>)coordinator {
   [super willTransitionToTraitCollection:newCollection
                withTransitionCoordinator:coordinator];
+  // Invalidating the layout after changing the cellStyle/contentInset results
+  // in the layout not being updated. Do it before to have it taken into
+  // account.
+  [self.collectionView.collectionViewLayout invalidateLayout];
   if (ShouldCellsBeFullWidth(newCollection)) {
     self.collectionView.contentInset = UIEdgeInsetsZero;
     self.styler.cellStyle = MDCCollectionViewCellStyleGrouped;
@@ -220,7 +224,6 @@
         UIEdgeInsetsMake(0, self.cardStyleMargin, 0, self.cardStyleMargin);
     self.styler.cellStyle = MDCCollectionViewCellStyleCard;
   }
-  [self.collectionView.collectionViewLayout invalidateLayout];
 }
 
 #pragma mark - UICollectionViewDelegate
diff --git a/ios/chrome/browser/ui/external_url_error_page_egtest.mm b/ios/chrome/browser/ui/external_url_error_page_egtest.mm
index 6397978..26f250b 100644
--- a/ios/chrome/browser/ui/external_url_error_page_egtest.mm
+++ b/ios/chrome/browser/ui/external_url_error_page_egtest.mm
@@ -24,8 +24,6 @@
 
 using chrome_test_util::OmniboxText;
 using chrome_test_util::TapWebViewElementWithId;
-using chrome_test_util::WebViewNotContainingText;
-
 using web::test::HttpServer;
 
 // Tests display of error pages for bad URLs.
@@ -49,8 +47,7 @@
       assertWithMatcher:grey_notNil()];
   const std::string kError =
       l10n_util::GetStringUTF8(IDS_ERRORPAGES_HEADING_NOT_AVAILABLE);
-  [[EarlGrey selectElementWithMatcher:WebViewNotContainingText(kError)]
-      assertWithMatcher:grey_notNil()];
+  [ChromeEarlGrey waitForWebViewNotContainingText:kError];
 }
 
 #pragma mark - tests
diff --git a/ios/chrome/browser/ui/key_commands_provider.mm b/ios/chrome/browser/ui/key_commands_provider.mm
index 06d711d4..1a387aa 100644
--- a/ios/chrome/browser/ui/key_commands_provider.mm
+++ b/ios/chrome/browser/ui/key_commands_provider.mm
@@ -129,7 +129,7 @@
                            title:l10n_util::GetNSStringWithFixup(
                                      IDS_IOS_KEYBOARD_BOOKMARK_THIS_PAGE)
                           action:^{
-                            execute(IDC_BOOKMARK_PAGE);
+                            [weakDispatcher bookmarkPage];
                           }],
       [UIKeyCommand cr_keyCommandWithInput:@"f"
                              modifierFlags:UIKeyModifierCommand
diff --git a/ios/chrome/browser/ui/settings/save_passwords_collection_view_controller.mm b/ios/chrome/browser/ui/settings/save_passwords_collection_view_controller.mm
index d1a678d4..ea70274a 100644
--- a/ios/chrome/browser/ui/settings/save_passwords_collection_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/save_passwords_collection_view_controller.mm
@@ -65,18 +65,6 @@
   ItemTypeBlacklisted,    // This is a repeated item type.
 };
 
-// TODO(crbug.com/669538): This function should be removed after original
-// version of GetHumanReadableOrigin will be moved to affiliation_utils.
-std::string GetHumanReadableOriginCopy(
-    const autofill::PasswordForm& password_form) {
-  password_manager::FacetURI facet_uri =
-      password_manager::FacetURI::FromPotentiallyInvalidSpec(
-          password_form.signon_realm);
-  if (facet_uri.IsValidAndroidFacetURI())
-    return facet_uri.scheme() + "://" + facet_uri.android_package_name();
-  return base::UTF16ToUTF8(url_formatter::FormatUrl(password_form.origin));
-}
-
 }  // namespace
 
 namespace password_manager {
@@ -274,7 +262,7 @@
   SavedFormContentItem* passwordItem =
       [[SavedFormContentItem alloc] initWithType:ItemTypeSavedPassword];
   passwordItem.text =
-      base::SysUTF8ToNSString(GetHumanReadableOriginCopy(*form));
+      base::SysUTF8ToNSString(password_manager::GetHumanReadableOrigin(*form));
   passwordItem.detailText = base::SysUTF16ToNSString(form->username_value);
   if (experimental_flags::IsViewCopyPasswordsEnabled()) {
     passwordItem.accessibilityTraits |= UIAccessibilityTraitButton;
@@ -289,7 +277,7 @@
   BlacklistedFormContentItem* passwordItem =
       [[BlacklistedFormContentItem alloc] initWithType:ItemTypeBlacklisted];
   passwordItem.text =
-      base::SysUTF8ToNSString(GetHumanReadableOriginCopy(*form));
+      base::SysUTF8ToNSString(password_manager::GetHumanReadableOrigin(*form));
   return passwordItem;
 }
 
@@ -460,8 +448,8 @@
       autofill::PasswordForm* form = savedForms_[indexPath.item].get();
       NSString* username = base::SysUTF16ToNSString(form->username_value);
       NSString* password = base::SysUTF16ToNSString(form->password_value);
-      NSString* origin =
-          base::SysUTF8ToNSString(GetHumanReadableOriginCopy(*form));
+      NSString* origin = base::SysUTF8ToNSString(
+          password_manager::GetHumanReadableOrigin(*form));
       UIViewController* controller =
           [[PasswordDetailsCollectionViewController alloc]
                 initWithPasswordForm:*form
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_controller.mm b/ios/chrome/browser/ui/toolbar/toolbar_controller.mm
index 9b526c8..3921ae95 100644
--- a/ios/chrome/browser/ui/toolbar/toolbar_controller.mm
+++ b/ios/chrome/browser/ui/toolbar/toolbar_controller.mm
@@ -16,7 +16,7 @@
 #include "base/metrics/user_metrics_action.h"
 #import "ios/chrome/browser/ui/animation_util.h"
 #import "ios/chrome/browser/ui/commands/UIKit+ChromeExecuteCommand.h"
-#import "ios/chrome/browser/ui/commands/generic_chrome_command.h"
+#import "ios/chrome/browser/ui/commands/browser_commands.h"
 #include "ios/chrome/browser/ui/commands/ios_command_ids.h"
 #import "ios/chrome/browser/ui/fullscreen_controller.h"
 #import "ios/chrome/browser/ui/image_util.h"
@@ -302,7 +302,6 @@
     if (idiom == IPAD_IDIOM) {
       CGRect shareButtonFrame = LayoutRectGetRect(kShareMenuButtonFrame);
       shareButton_ = [[UIButton alloc] initWithFrame:shareButtonFrame];
-      [shareButton_ setTag:IDC_SHARE_PAGE];
       [shareButton_
           setAutoresizingMask:UIViewAutoresizingFlexibleLeadingMargin() |
                               UIViewAutoresizingFlexibleBottomMargin];
@@ -311,6 +310,9 @@
            forInitialState:UIControlStateNormal
           hasDisabledImage:YES
              synchronously:NO];
+      [shareButton_ addTarget:self.dispatcher
+                       action:@selector(sharePage)
+             forControlEvents:UIControlEventTouchUpInside];
       SetA11yLabelAndUiAutomationName(shareButton_, IDS_IOS_TOOLS_MENU_SHARE,
                                       kToolbarShareButtonIdentifier);
       [view_ addSubview:shareButton_];
diff --git a/ios/chrome/browser/ui/toolbar/web_toolbar_controller.mm b/ios/chrome/browser/ui/toolbar/web_toolbar_controller.mm
index a067d08..3b4039b 100644
--- a/ios/chrome/browser/ui/toolbar/web_toolbar_controller.mm
+++ b/ios/chrome/browser/ui/toolbar/web_toolbar_controller.mm
@@ -508,7 +508,6 @@
 
     // Assign tags before calling -setUpButton, since only buttons with tags
     // have -chromeExecuteCommand added as a target.
-    [_starButton setTag:IDC_BOOKMARK_PAGE];
     [_voiceSearchButton setTag:IDC_VOICE_SEARCH];
 
     [_webToolbar addSubview:_voiceSearchButton];
@@ -544,6 +543,9 @@
     [_reloadButton addTarget:self.dispatcher
                       action:@selector(reload)
             forControlEvents:UIControlEventTouchUpInside];
+    [_starButton addTarget:self.dispatcher
+                    action:@selector(bookmarkPage)
+          forControlEvents:UIControlEventTouchUpInside];
   } else {
     [_forwardButton setAlpha:0.0];
   }
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_constants.h b/ios/chrome/browser/ui/tools_menu/tools_menu_constants.h
index b7904b6..7fada93 100644
--- a/ios/chrome/browser/ui/tools_menu/tools_menu_constants.h
+++ b/ios/chrome/browser/ui/tools_menu/tools_menu_constants.h
@@ -43,6 +43,9 @@
   // All of these values must be < 0.
   TOOLS_STOP_ITEM = -1,
   TOOLS_RELOAD_ITEM = -2,
+  TOOLS_BOOKMARK_ITEM = -3,
+  TOOLS_BOOKMARK_EDIT = -4,
+  TOOLS_SHARE_ITEM = -5,
 };
 
 #endif  // IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_MENU_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.mm b/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.mm
index 3928cfaa..5806909 100644
--- a/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.mm
+++ b/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.mm
@@ -194,7 +194,6 @@
 - (void)setCanShowShareMenu:(BOOL)enabled {
   ToolsMenuViewToolsCell* toolsCell = [self toolsCell];
   [[toolsCell shareButton] setEnabled:enabled];
-  [self setItemEnabled:enabled withTag:IDC_SHARE_PAGE];
 }
 
 - (UIButton*)toolsButton {
@@ -473,6 +472,12 @@
   [toolsCell.reloadButton removeTarget:self.dispatcher
                                 action:@selector(reload)
                       forControlEvents:UIControlEventTouchUpInside];
+  [toolsCell.starButton removeTarget:self.dispatcher
+                              action:@selector(bookmarkPage)
+                    forControlEvents:UIControlEventTouchUpInside];
+  [toolsCell.starredButton removeTarget:self.dispatcher
+                                 action:@selector(bookmarkPage)
+                       forControlEvents:UIControlEventTouchUpInside];
 }
 
 #pragma mark - Button event handling
@@ -480,20 +485,12 @@
 - (void)buttonPressed:(id)sender {
   int commandId = [sender tag];
   DCHECK(commandId);
-  // The bookmark command workaround is only needed for metrics; remap it
-  // to the real command for the dispatch. This is very hacky, but it will go
-  // away soon.  See crbug/228521
-  DCHECK([sender respondsToSelector:@selector(setTag:)]);
-  if (commandId == IDC_TEMP_EDIT_BOOKMARK)
-    [sender setTag:IDC_BOOKMARK_PAGE];
   // Do nothing when tapping the tools menu a second time.
   // Do not use -chromeExecuteCommand: for tags < 0 -- that is, items that have
   // been refactored to use the dispatcher.
   if (commandId != IDC_SHOW_TOOLS_MENU && commandId > 0) {
     [self chromeExecuteCommand:sender];
   }
-  if (commandId == IDC_TEMP_EDIT_BOOKMARK)
-    [sender setTag:IDC_TEMP_EDIT_BOOKMARK];
 
   // Do any metrics logging for the command, and then close the menu.
   [_delegate commandWasSelected:commandId];
@@ -598,6 +595,12 @@
     [cell.reloadButton addTarget:self.dispatcher
                           action:@selector(reload)
                 forControlEvents:UIControlEventTouchUpInside];
+    [cell.starButton addTarget:self.dispatcher
+                        action:@selector(bookmarkPage)
+              forControlEvents:UIControlEventTouchUpInside];
+    [cell.starredButton addTarget:self.dispatcher
+                           action:@selector(bookmarkPage)
+                 forControlEvents:UIControlEventTouchUpInside];
     for (UIButton* button in [cell allButtons]) {
       [button addTarget:self
                     action:@selector(buttonPressed:)
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_view_tools_cell.mm b/ios/chrome/browser/ui/tools_menu/tools_menu_view_tools_cell.mm
index 7d4c069..9935171a 100644
--- a/ios/chrome/browser/ui/tools_menu/tools_menu_view_tools_cell.mm
+++ b/ios/chrome/browser/ui/tools_menu/tools_menu_view_tools_cell.mm
@@ -12,12 +12,6 @@
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 
-// TODO(crbug.com/228521): Remove this once the new command/metric handling is
-// implemented. This is a temporary workaround to allow metrics recording to
-// distinguish the action. The value used is in the dynamic range (<
-// IDC_MinimumLabelValue) to avoid collisions.
-#define IDC_TEMP_EDIT_BOOKMARK 3900
-
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
@@ -53,13 +47,13 @@
 
   int star[2][3] = TOOLBAR_IDR_TWO_STATE(STAR);
   _starButton = [self newButtonForImageIds:star
-                                 commandID:IDC_BOOKMARK_PAGE
+                                 commandID:TOOLS_BOOKMARK_ITEM
                       accessibilityLabelID:IDS_BOOKMARK_ADD_EDITOR_TITLE
                             automationName:@"Add Bookmark"];
 
   int star_pressed[2][3] = TOOLBAR_IDR_ONE_STATE(STAR_PRESSED);
   _starredButton = [self newButtonForImageIds:star_pressed
-                                    commandID:IDC_TEMP_EDIT_BOOKMARK
+                                    commandID:TOOLS_BOOKMARK_EDIT
                          accessibilityLabelID:IDS_IOS_TOOLS_MENU_EDIT_BOOKMARK
                                automationName:@"Edit Bookmark"];
 
@@ -78,7 +72,7 @@
 
   int share[2][3] = TOOLBAR_IDR_THREE_STATE(SHARE);
   _shareButton = [self newButtonForImageIds:share
-                                  commandID:IDC_SHARE_PAGE
+                                  commandID:TOOLS_SHARE_ITEM
                        accessibilityLabelID:IDS_IOS_TOOLS_MENU_SHARE
                              automationName:@"Stop"];
   int tools[2][3] = TOOLBAR_IDR_ONE_STATE(TOOLS_PRESSED);
diff --git a/ios/chrome/browser/ui/tools_menu/tools_popup_controller.mm b/ios/chrome/browser/ui/tools_menu/tools_popup_controller.mm
index 02d7b2f6..b5b339f 100644
--- a/ios/chrome/browser/ui/tools_menu/tools_popup_controller.mm
+++ b/ios/chrome/browser/ui/tools_menu/tools_popup_controller.mm
@@ -163,10 +163,10 @@
 - (void)commandWasSelected:(int)commandID {
   // Record the corresponding metric.
   switch (commandID) {
-    case IDC_TEMP_EDIT_BOOKMARK:
+    case TOOLS_BOOKMARK_EDIT:
       base::RecordAction(UserMetricsAction("MobileMenuEditBookmark"));
       break;
-    case IDC_BOOKMARK_PAGE:
+    case TOOLS_BOOKMARK_ITEM:
       base::RecordAction(UserMetricsAction("MobileMenuAddToBookmarks"));
       break;
     case IDC_CLOSE_ALL_TABS:
@@ -193,7 +193,7 @@
     case TOOLS_RELOAD_ITEM:
       base::RecordAction(UserMetricsAction("MobileMenuReload"));
       break;
-    case IDC_SHARE_PAGE:
+    case TOOLS_SHARE_ITEM:
       base::RecordAction(UserMetricsAction("MobileMenuShare"));
       break;
     case IDC_REQUEST_DESKTOP_SITE:
diff --git a/ios/chrome/browser/ui/webui/BUILD.gn b/ios/chrome/browser/ui/webui/BUILD.gn
index 48b462d..fcda20bd 100644
--- a/ios/chrome/browser/ui/webui/BUILD.gn
+++ b/ios/chrome/browser/ui/webui/BUILD.gn
@@ -16,8 +16,6 @@
     "ntp_tiles_internals_ui.h",
     "physical_web_ui.cc",
     "physical_web_ui.h",
-    "popular_sites_internals_ui.cc",
-    "popular_sites_internals_ui.h",
     "terms_ui.h",
     "terms_ui.mm",
     "version_handler.cc",
diff --git a/ios/chrome/browser/ui/webui/chrome_web_ui_ios_controller_factory.mm b/ios/chrome/browser/ui/webui/chrome_web_ui_ios_controller_factory.mm
index 7153cfb1..510a5ab 100644
--- a/ios/chrome/browser/ui/webui/chrome_web_ui_ios_controller_factory.mm
+++ b/ios/chrome/browser/ui/webui/chrome_web_ui_ios_controller_factory.mm
@@ -17,7 +17,6 @@
 #include "ios/chrome/browser/ui/webui/ntp_tiles_internals_ui.h"
 #include "ios/chrome/browser/ui/webui/omaha_ui.h"
 #include "ios/chrome/browser/ui/webui/physical_web_ui.h"
-#include "ios/chrome/browser/ui/webui/popular_sites_internals_ui.h"
 #include "ios/chrome/browser/ui/webui/signin_internals_ui_ios.h"
 #include "ios/chrome/browser/ui/webui/sync_internals/sync_internals_ui.h"
 #include "ios/chrome/browser/ui/webui/terms_ui.h"
@@ -80,8 +79,6 @@
     if (url_host == kChromeUIPhysicalWebHost)
       return &NewWebUIIOS<PhysicalWebUI>;
   }
-  if (url_host == kChromeUIPopularSitesInternalsHost)
-    return &NewWebUIIOS<PopularSitesInternalsUI>;
   if (url_host == kChromeUISignInInternalsHost)
     return &NewWebUIIOS<SignInInternalsUIIOS>;
   if (url_host == kChromeUISyncInternalsHost)
diff --git a/ios/chrome/browser/ui/webui/popular_sites_internals_ui.cc b/ios/chrome/browser/ui/webui/popular_sites_internals_ui.cc
deleted file mode 100644
index d06f078..0000000
--- a/ios/chrome/browser/ui/webui/popular_sites_internals_ui.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ios/chrome/browser/ui/webui/popular_sites_internals_ui.h"
-
-#include "base/memory/ptr_util.h"
-#include "components/grit/components_resources.h"
-#include "components/ntp_tiles/popular_sites.h"
-#include "components/ntp_tiles/webui/popular_sites_internals_message_handler.h"
-#include "components/ntp_tiles/webui/popular_sites_internals_message_handler_client.h"
-#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
-#include "ios/chrome/browser/chrome_url_constants.h"
-#include "ios/chrome/browser/ntp_tiles/ios_popular_sites_factory.h"
-#include "ios/web/public/web_thread.h"
-#include "ios/web/public/web_ui_ios_data_source.h"
-#include "ios/web/public/webui/web_ui_ios.h"
-#include "ios/web/public/webui/web_ui_ios_message_handler.h"
-
-namespace {
-
-// The implementation for the chrome://popular-sites-internals page.
-class IOSPopularSitesInternalsMessageHandlerBridge
-    : public web::WebUIIOSMessageHandler,
-      public ntp_tiles::PopularSitesInternalsMessageHandlerClient {
- public:
-  IOSPopularSitesInternalsMessageHandlerBridge() : handler_(this) {}
-
- private:
-  // web::WebUIIOSMessageHandler:
-  void RegisterMessages() override;
-
-  // ntp_tiles::PopularSitesInternalsMessageHandlerClient
-  std::unique_ptr<ntp_tiles::PopularSites> MakePopularSites() override;
-  PrefService* GetPrefs() override;
-  void RegisterMessageCallback(
-      const std::string& message,
-      const base::Callback<void(const base::ListValue*)>& callback) override;
-  void CallJavascriptFunctionVector(
-      const std::string& name,
-      const std::vector<const base::Value*>& values) override;
-
-  ntp_tiles::PopularSitesInternalsMessageHandler handler_;
-
-  DISALLOW_COPY_AND_ASSIGN(IOSPopularSitesInternalsMessageHandlerBridge);
-};
-
-void IOSPopularSitesInternalsMessageHandlerBridge::RegisterMessages() {
-  handler_.RegisterMessages();
-}
-
-std::unique_ptr<ntp_tiles::PopularSites>
-IOSPopularSitesInternalsMessageHandlerBridge::MakePopularSites() {
-  return IOSPopularSitesFactory::NewForBrowserState(
-      ios::ChromeBrowserState::FromWebUIIOS(web_ui()));
-}
-
-PrefService* IOSPopularSitesInternalsMessageHandlerBridge::GetPrefs() {
-  return ios::ChromeBrowserState::FromWebUIIOS(web_ui())->GetPrefs();
-}
-
-void IOSPopularSitesInternalsMessageHandlerBridge::RegisterMessageCallback(
-    const std::string& message,
-    const base::Callback<void(const base::ListValue*)>& callback) {
-  web_ui()->RegisterMessageCallback(message, callback);
-}
-
-void IOSPopularSitesInternalsMessageHandlerBridge::CallJavascriptFunctionVector(
-    const std::string& name,
-    const std::vector<const base::Value*>& values) {
-  web_ui()->CallJavascriptFunction(name, values);
-}
-
-}  // namespace
-
-web::WebUIIOSDataSource* CreatePopularSitesInternalsHTMLSource() {
-  web::WebUIIOSDataSource* source =
-      web::WebUIIOSDataSource::Create(kChromeUIPopularSitesInternalsHost);
-
-  source->AddResourcePath("popular_sites_internals.js",
-                          IDR_POPULAR_SITES_INTERNALS_JS);
-  source->AddResourcePath("popular_sites_internals.css",
-                          IDR_POPULAR_SITES_INTERNALS_CSS);
-  source->SetDefaultResource(IDR_POPULAR_SITES_INTERNALS_HTML);
-  return source;
-}
-
-PopularSitesInternalsUI::PopularSitesInternalsUI(web::WebUIIOS* web_ui)
-    : web::WebUIIOSController(web_ui) {
-  web::WebUIIOSDataSource::Add(ios::ChromeBrowserState::FromWebUIIOS(web_ui),
-                               CreatePopularSitesInternalsHTMLSource());
-  web_ui->AddMessageHandler(
-      base::MakeUnique<IOSPopularSitesInternalsMessageHandlerBridge>());
-}
-
-PopularSitesInternalsUI::~PopularSitesInternalsUI() {}
diff --git a/ios/chrome/browser/ui/webui/popular_sites_internals_ui.h b/ios/chrome/browser/ui/webui/popular_sites_internals_ui.h
deleted file mode 100644
index a36f295..0000000
--- a/ios/chrome/browser/ui/webui/popular_sites_internals_ui.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_WEBUI_POPULAR_SITES_INTERNALS_UI_H_
-#define IOS_CHROME_BROWSER_UI_WEBUI_POPULAR_SITES_INTERNALS_UI_H_
-
-#include <string>
-
-#include "base/macros.h"
-#include "ios/web/public/webui/web_ui_ios_controller.h"
-
-// The WebUI handler for chrome://physical-web.
-class PopularSitesInternalsUI : public web::WebUIIOSController {
- public:
-  explicit PopularSitesInternalsUI(web::WebUIIOS* web_ui);
-  ~PopularSitesInternalsUI() override;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(PopularSitesInternalsUI);
-};
-
-#endif  // IOS_CHROME_BROWSER_UI_WEBUI_POPULAR_SITES_INTERNALS_UI_H_
diff --git a/ios/chrome/browser/web/navigation_egtest.mm b/ios/chrome/browser/web/navigation_egtest.mm
index 084f3de..8ba939e 100644
--- a/ios/chrome/browser/web/navigation_egtest.mm
+++ b/ios/chrome/browser/web/navigation_egtest.mm
@@ -471,11 +471,7 @@
   std::string hashChangeContent = "FAIL_loadUrlHashChange";
   [self addHashChangeListenerWithContent:hashChangeContent];
   [ChromeEarlGrey loadURL:hashChangedWithHistoryURL];
-  // TODO(crbug.com/714157): Remove matcher that waits.
-  [[EarlGrey
-      selectElementWithMatcher:chrome_test_util::WebViewNotContainingText(
-                                   hashChangeContent)]
-      assertWithMatcher:grey_notNil()];
+  [ChromeEarlGrey waitForWebViewNotContainingText:hashChangeContent];
 }
 
 // Loads a URL and replaces its location, then updates its location.hash
diff --git a/ios/chrome/browser/web/push_and_replace_state_navigation_egtest.mm b/ios/chrome/browser/web/push_and_replace_state_navigation_egtest.mm
index 2b3870b..b67f2a08 100644
--- a/ios/chrome/browser/web/push_and_replace_state_navigation_egtest.mm
+++ b/ios/chrome/browser/web/push_and_replace_state_navigation_egtest.mm
@@ -329,10 +329,7 @@
   if (pageLoaded) {
     [ChromeEarlGrey waitForWebViewContainingText:"onload"];
   } else {
-    id<GREYMatcher> pageLoadedMatcher =
-        chrome_test_util::WebViewNotContainingText("onload");
-    [[EarlGrey selectElementWithMatcher:pageLoadedMatcher]
-        assertWithMatcher:grey_notNil()];
+    [ChromeEarlGrey waitForWebViewNotContainingText:"onload"];
   }
 
   if (status != NULL) {
diff --git a/ios/chrome/test/earl_grey/chrome_matchers.h b/ios/chrome/test/earl_grey/chrome_matchers.h
index 6c4fb37..ec003bd 100644
--- a/ios/chrome/test/earl_grey/chrome_matchers.h
+++ b/ios/chrome/test/earl_grey/chrome_matchers.h
@@ -31,9 +31,6 @@
 // accessibility trait UIAccessibilityTraitStaticText.
 id<GREYMatcher> StaticTextWithAccessibilityLabel(NSString* label);
 
-// Returns matcher for webview not containing |text|.
-id<GREYMatcher> WebViewNotContainingText(std::string text);
-
 // Returns matcher for WKWebView containing a blocked |image_id|.  When blocked,
 // the image element will be smaller than actual image.
 id<GREYMatcher> WebViewContainingBlockedImage(std::string image_id);
diff --git a/ios/chrome/test/earl_grey/chrome_matchers.mm b/ios/chrome/test/earl_grey/chrome_matchers.mm
index 3a951c9..67beef5 100644
--- a/ios/chrome/test/earl_grey/chrome_matchers.mm
+++ b/ios/chrome/test/earl_grey/chrome_matchers.mm
@@ -95,10 +95,6 @@
       l10n_util::GetNSStringWithFixup(message_id));
 }
 
-id<GREYMatcher> WebViewNotContainingText(std::string text) {
-  return web::WebViewNotContainingText(std::move(text), GetCurrentWebState());
-}
-
 id<GREYMatcher> WebViewContainingBlockedImage(std::string image_id) {
   return web::WebViewContainingBlockedImage(
       std::move(image_id), chrome_test_util::GetCurrentWebState());
diff --git a/ios/clean/chrome/DEPS b/ios/clean/chrome/DEPS
index e6eb2ee..d9539617 100644
--- a/ios/clean/chrome/DEPS
+++ b/ios/clean/chrome/DEPS
@@ -3,6 +3,7 @@
   "+ui/base",
   "+ios/chrome",
   "+ios/shared",
+  "+ios/testing/perf",
   "+ios/third_party",
   "+ios/web",
 
diff --git a/ios/clean/chrome/app/BUILD.gn b/ios/clean/chrome/app/BUILD.gn
index 21655ec..e5d414ba 100644
--- a/ios/clean/chrome/app/BUILD.gn
+++ b/ios/clean/chrome/app/BUILD.gn
@@ -85,6 +85,7 @@
     "//ios/chrome/browser:browser_internal",
     "//ios/chrome/browser/crash_report",
     "//ios/chrome/common",
+    "//ios/testing/perf:startup",
     "//third_party/google_toolbox_for_mac",
   ]
 
@@ -104,6 +105,7 @@
   deps = [
     "//base",
     "//ios/shared/chrome/browser/ui/coordinators",
+    "//ios/testing/perf:startup",
   ]
 }
 
@@ -118,5 +120,6 @@
   deps = [
     ":application_state",
     "//ios/clean/chrome/app/steps",
+    "//ios/testing/perf:startup",
   ]
 }
diff --git a/ios/clean/chrome/app/app_delegate.mm b/ios/clean/chrome/app/app_delegate.mm
index d83998a..1325e27 100644
--- a/ios/clean/chrome/app/app_delegate.mm
+++ b/ios/clean/chrome/app/app_delegate.mm
@@ -9,6 +9,7 @@
 #import "ios/clean/chrome/app/steps/launch_to_basic.h"
 #import "ios/clean/chrome/app/steps/launch_to_foreground.h"
 #import "ios/clean/chrome/app/steps/root_coordinator+application_step.h"
+#import "ios/testing/perf/startupLoggers.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -26,6 +27,7 @@
 
 - (BOOL)application:(UIApplication*)application
     didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
+  startup_loggers::RegisterAppDidFinishLaunchingTime();
   self.applicationState = [[ApplicationState alloc] init];
   self.applicationState.application = application;
   [self configureApplicationState];
@@ -35,6 +37,7 @@
 }
 
 - (void)applicationDidBecomeActive:(UIApplication*)application {
+  startup_loggers::RegisterAppDidBecomeActiveTime();
 }
 
 - (void)applicationWillResignActive:(UIApplication*)application {
diff --git a/ios/clean/chrome/app/main.mm b/ios/clean/chrome/app/main.mm
index 7b81862..aa03753 100644
--- a/ios/clean/chrome/app/main.mm
+++ b/ios/clean/chrome/app/main.mm
@@ -12,6 +12,7 @@
 #include "ios/chrome/browser/crash_report/crash_keys.h"
 #include "ios/chrome/common/channel_info.h"
 #include "ios/clean/chrome/app/app_delegate.h"
+#include "ios/testing/perf/startupLoggers.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -36,6 +37,7 @@
   base::AtExitManager at_exit;
 
   IOSChromeMain::InitStartTime();
+  startup_loggers::RegisterAppStartTime();
 
   // Pre-launch actions are in their own autorelease pool so they get cleaned
   // up before the main app starts.
diff --git a/ios/clean/chrome/browser/ui/tab_collection/BUILD.gn b/ios/clean/chrome/browser/ui/tab_collection/BUILD.gn
index 6239acd..e9bb6bd 100644
--- a/ios/clean/chrome/browser/ui/tab_collection/BUILD.gn
+++ b/ios/clean/chrome/browser/ui/tab_collection/BUILD.gn
@@ -30,6 +30,7 @@
   deps = [
     "//base",
     "//ios/chrome/app/theme:theme_grit",
+    "//ios/chrome/browser/snapshots",
     "//ios/chrome/browser/ui",
     "//ios/chrome/browser/ui/tab_switcher",
     "//ios/clean/chrome/browser/ui/commands",
@@ -40,6 +41,7 @@
 source_set("unit_tests") {
   sources = [
     "tab_collection_mediator_unittest.mm",
+    "tab_collection_tab_cell_unittest.mm",
     "tab_collection_view_controller_unittest.mm",
   ]
   deps = [
@@ -47,6 +49,8 @@
     ":tab_collection_ui",
     "//base",
     "//base/test:test_support",
+    "//ios/chrome/browser/snapshots",
+    "//ios/chrome/browser/ui/tab_switcher",
     "//ios/chrome/browser/web",
     "//ios/chrome/browser/web_state_list",
     "//ios/chrome/browser/web_state_list:test_support",
@@ -54,6 +58,7 @@
     "//ios/web/public/test/fakes",
     "//testing/gtest",
     "//third_party/ocmock",
+    "//ui/base:test_support",
     "//url:url",
   ]
   configs += [ "//build/config/compiler:enable_arc" ]
diff --git a/ios/clean/chrome/browser/ui/tab_collection/tab_collection_tab_cell.h b/ios/clean/chrome/browser/ui/tab_collection/tab_collection_tab_cell.h
index ed919d5..ad34a1b 100644
--- a/ios/clean/chrome/browser/ui/tab_collection/tab_collection_tab_cell.h
+++ b/ios/clean/chrome/browser/ui/tab_collection/tab_collection_tab_cell.h
@@ -5,10 +5,9 @@
 #ifndef IOS_CLEAN_CHROME_BROWSER_UI_TAB_COLLECTION_TAB_COLLECTION_TAB_CELL_H_
 #define IOS_CLEAN_CHROME_BROWSER_UI_TAB_COLLECTION_TAB_COLLECTION_TAB_CELL_H_
 
-#import <UIKit/UIKit.h>
-
 #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_cell.h"
 
+@class SnapshotCache;
 @class TabCollectionItem;
 
 // Cell represents a tab for use in the tab collection. It has a title, favicon,
@@ -16,7 +15,8 @@
 // highlight in the tintColor.
 // PLACEHOLDER: Create custom implemementation rather than subclassing.
 @interface TabCollectionTabCell : TabSwitcherLocalSessionCell
-@property(nonatomic, strong) TabCollectionItem* item;
+- (void)configureCell:(TabCollectionItem*)item
+        snapshotCache:(SnapshotCache*)snapshotCache;
 @end
 
 #endif  // IOS_CLEAN_CHROME_BROWSER_UI_TAB_COLLECTION_TAB_COLLECTION_TAB_CELL_H_
diff --git a/ios/clean/chrome/browser/ui/tab_collection/tab_collection_tab_cell.mm b/ios/clean/chrome/browser/ui/tab_collection/tab_collection_tab_cell.mm
index f9c7914..2367e1c4 100644
--- a/ios/clean/chrome/browser/ui/tab_collection/tab_collection_tab_cell.mm
+++ b/ios/clean/chrome/browser/ui/tab_collection/tab_collection_tab_cell.mm
@@ -4,6 +4,7 @@
 
 #import "ios/clean/chrome/browser/ui/tab_collection/tab_collection_tab_cell.h"
 
+#import "ios/chrome/browser/snapshots/snapshot_cache.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_button.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #include "ios/chrome/grit/ios_theme_resources.h"
@@ -20,6 +21,7 @@
 }
 
 @interface TabCollectionTabCell ()
+@property(nonatomic, strong) TabCollectionItem* item;
 @property(nonatomic, strong) UILabel* titleLabel;
 @property(nonatomic, strong) UIImageView* favicon;
 @property(nonatomic, strong) TabSwitcherButton* snapshotButton;
@@ -38,19 +40,38 @@
   return self;
 }
 
-#pragma mark - Properties
+#pragma mark - Cell lifecycle
 
-- (void)setItem:(TabCollectionItem*)item {
+- (void)prepareForReuse {
+  [super prepareForReuse];
+  self.item = nil;
+}
+
+#pragma mark - Public methods
+
+- (void)configureCell:(TabCollectionItem*)item
+        snapshotCache:(SnapshotCache*)snapshotCache {
   DCHECK(item);
-  _item = item;
+  self.item = item;
   self.titleLabel.text = item.title;
   self.snapshotButton.accessibilityIdentifier =
       [NSString stringWithFormat:@"%@_button", item.title];
   self.contentView.accessibilityLabel = item.title;
   self.favicon.image = NativeImage(IDR_IOS_OMNIBOX_HTTP);
+  __weak TabCollectionTabCell* weakSelf = self;
+  [snapshotCache
+      retrieveImageForSessionID:self.item.tabID
+                       callback:^(UIImage* snapshot) {
+                         // PLACEHOLDER: This operation will be cancellable.
+                         if ([weakSelf.item.tabID isEqualToString:item.tabID]) {
+                           [weakSelf.snapshotButton
+                               setImage:snapshot
+                               forState:UIControlStateNormal];
+                         }
+                       }];
 }
 
-#pragma mark - Private
+#pragma mark - Private methods
 
 - (void)setupSelectedBackgroundView {
   self.selectedBackgroundView = [[UIView alloc] init];
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
new file mode 100644
index 0000000..23605ab
--- /dev/null
+++ b/ios/clean/chrome/browser/ui/tab_collection/tab_collection_tab_cell_unittest.mm
@@ -0,0 +1,104 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/clean/chrome/browser/ui/tab_collection/tab_collection_tab_cell.h"
+
+#import <UIKit/UIKit.h>
+
+#include "base/test/ios/wait_util.h"
+#import "ios/chrome/browser/snapshots/snapshot_cache.h"
+#import "ios/chrome/browser/ui/tab_switcher/tab_switcher_button.h"
+#import "ios/clean/chrome/browser/ui/tab_collection/tab_collection_item.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#import "testing/gtest_mac.h"
+#include "testing/platform_test.h"
+#import "third_party/ocmock/OCMock/OCMock.h"
+#include "third_party/ocmock/gtest_support.h"
+#include "ui/base/test/ios/ui_image_test_utils.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@interface TestTabCell : TabCollectionTabCell
+@property(nonatomic) UILabel* titleLabel;
+@property(nonatomic) TabSwitcherButton* snapshotButton;
+@end
+
+@implementation TestTabCell
+@dynamic titleLabel;
+@dynamic snapshotButton;
+@end
+
+class TabCollectionTabCellTest : public PlatformTest {
+ public:
+  TabCollectionTabCellTest() {
+    cell_ = [[TestTabCell alloc] init];
+    snapshotCache_ = OCMClassMock([SnapshotCache class]);
+    item_ = [[TabCollectionItem alloc] init];
+    item_.tabID = @"1234";
+    item_.title = @"Title";
+    snapshot_ = ui::test::uiimage_utils::UIImageWithSizeAndSolidColor(
+        CGSizeMake(30, 40), [UIColor blueColor]);
+  }
+  ~TabCollectionTabCellTest() override {}
+
+ protected:
+  TestTabCell* cell_;
+  id snapshotCache_;
+  TabCollectionItem* item_;
+  UIImage* snapshot_;
+};
+
+// Tests that -configureCell updates the title.
+TEST_F(TabCollectionTabCellTest, TestConfigureTitle) {
+  EXPECT_EQ(nil, cell_.titleLabel.text);
+  [cell_ configureCell:item_ snapshotCache:snapshotCache_];
+  EXPECT_NSEQ(@"Title", cell_.titleLabel.text);
+}
+
+// Tests that -configureCell: does not change the cell's snapshot if the
+// snapshotCache does not contain the image.
+TEST_F(TabCollectionTabCellTest, TestSnapshotMissing) {
+  OCMStub([snapshotCache_ retrieveImageForSessionID:[OCMArg any]
+                                           callback:[OCMArg any]])
+      .andDo(^(NSInvocation* invocation) {
+        void (^callback)(UIImage* image);
+        [invocation getArgument:&callback atIndex:3];
+        callback(nil);
+      });
+  [cell_ configureCell:item_ snapshotCache:snapshotCache_];
+  EXPECT_EQ(nil, [cell_.snapshotButton imageForState:UIControlStateNormal]);
+}
+
+// Tests that -configureCell: updates the cell's snapshot from the cache.
+TEST_F(TabCollectionTabCellTest, TestSnapshotUpdated) {
+  OCMStub([snapshotCache_ retrieveImageForSessionID:[OCMArg any]
+                                           callback:[OCMArg any]])
+      .andDo(^(NSInvocation* invocation) {
+        void (^callback)(UIImage* image);
+        [invocation getArgument:&callback atIndex:3];
+        callback(snapshot_);
+      });
+  [cell_ configureCell:item_ snapshotCache:snapshotCache_];
+  UIImage* cellImage =
+      [cell_.snapshotButton imageForState:UIControlStateNormal];
+  EXPECT_TRUE(ui::test::uiimage_utils::UIImagesAreEqual(snapshot_, cellImage));
+}
+
+// Tests that asynchronous snapshot retrieval does not set the image after
+// -prepareForReuse.
+TEST_F(TabCollectionTabCellTest, TestPrepareForReuse) {
+  OCMStub([snapshotCache_ retrieveImageForSessionID:[OCMArg any]
+                                           callback:[OCMArg any]])
+      .andDo(^(NSInvocation* invocation) {
+        void (^callback)(UIImage* image);
+        [invocation getArgument:&callback atIndex:3];
+        // -prepareForReuse is called before the callback.
+        [cell_ prepareForReuse];
+        callback(snapshot_);
+      });
+  [cell_ configureCell:item_ snapshotCache:snapshotCache_];
+  EXPECT_EQ(nil, [cell_.snapshotButton imageForState:UIControlStateNormal]);
+}
diff --git a/ios/clean/chrome/browser/ui/tab_collection/tab_collection_view_controller.h b/ios/clean/chrome/browser/ui/tab_collection/tab_collection_view_controller.h
index 907f4b99..643b890 100644
--- a/ios/clean/chrome/browser/ui/tab_collection/tab_collection_view_controller.h
+++ b/ios/clean/chrome/browser/ui/tab_collection/tab_collection_view_controller.h
@@ -9,6 +9,8 @@
 
 #import "ios/clean/chrome/browser/ui/tab_collection/tab_collection_consumer.h"
 
+@class SnapshotCache;
+
 // Controller for a scrolling view displaying square cells that represent
 // the user's open tabs.
 @interface TabCollectionViewController
@@ -18,6 +20,8 @@
 // Model for collection view.
 @property(nonatomic, strong, readonly)
     NSMutableArray<TabCollectionItem*>* items;
+// Cache used to retrieve snapshot images for tab cells.
+@property(nonatomic, weak) SnapshotCache* snapshotCache;
 @end
 
 #endif  // IOS_CLEAN_CHROME_BROWSER_UI_TAB_COLLECTION_TAB_COLLECTION_VIEW_CONTROLLER_H_
diff --git a/ios/clean/chrome/browser/ui/tab_collection/tab_collection_view_controller.mm b/ios/clean/chrome/browser/ui/tab_collection/tab_collection_view_controller.mm
index dba8b4c..87b9107 100644
--- a/ios/clean/chrome/browser/ui/tab_collection/tab_collection_view_controller.mm
+++ b/ios/clean/chrome/browser/ui/tab_collection/tab_collection_view_controller.mm
@@ -28,6 +28,7 @@
 @synthesize tabs = _tabs;
 @synthesize items = _items;
 @synthesize selectedIndex = _selectedIndex;
+@synthesize snapshotCache = _snapshotCache;
 
 #pragma mark - UIViewController
 
@@ -118,7 +119,7 @@
   [cell setSessionType:TabSwitcherSessionType::REGULAR_SESSION];
   DCHECK_LE(indexPath.item, INT_MAX);
   int index = static_cast<int>(indexPath.item);
-  cell.item = self.items[index];
+  [cell configureCell:self.items[index] snapshotCache:self.snapshotCache];
   return cell;
 }
 
@@ -133,7 +134,7 @@
 #pragma mark - SessionCellDelegate
 
 - (TabSwitcherCache*)tabSwitcherCache {
-  // PLACEHOLDER: return image cache.
+  // PLACEHOLDER: SnapshotCache will be passed into the cell.
   return nil;
 }
 
@@ -186,13 +187,14 @@
 }
 
 - (void)replaceItemAtIndex:(int)index withItem:(TabCollectionItem*)item {
+  DCHECK(item);
   DCHECK_GE(index, 0);
   DCHECK_LT(static_cast<NSUInteger>(index), self.items.count);
   self.items[index] = item;
   TabCollectionTabCell* cell = base::mac::ObjCCastStrict<TabCollectionTabCell>(
       [self.tabs cellForItemAtIndexPath:[NSIndexPath indexPathForItem:index
                                                             inSection:0]]);
-  cell.item = self.items[index];
+  [cell configureCell:self.items[index] snapshotCache:self.snapshotCache];
 }
 
 - (void)populateItems:(NSArray<TabCollectionItem*>*)items
diff --git a/ios/clean/chrome/browser/ui/tab_grid/BUILD.gn b/ios/clean/chrome/browser/ui/tab_grid/BUILD.gn
index dffab41..6dce052d 100644
--- a/ios/clean/chrome/browser/ui/tab_grid/BUILD.gn
+++ b/ios/clean/chrome/browser/ui/tab_grid/BUILD.gn
@@ -16,6 +16,7 @@
     ":tab_grid_ui",
     "//base",
     "//ios/chrome/browser/browser_state",
+    "//ios/chrome/browser/snapshots",
     "//ios/chrome/browser/web_state_list",
     "//ios/clean/chrome/browser",
     "//ios/clean/chrome/browser/ui/commands",
diff --git a/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm b/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm
index 1049789..26e1b554 100644
--- a/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm
+++ b/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm
@@ -9,6 +9,7 @@
 #include "base/mac/foundation_util.h"
 #include "base/strings/sys_string_conversions.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#import "ios/chrome/browser/snapshots/snapshot_cache_factory.h"
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
 #import "ios/clean/chrome/browser/ui/commands/context_menu_commands.h"
 #import "ios/clean/chrome/browser/ui/commands/settings_commands.h"
@@ -43,6 +44,7 @@
 @property(nonatomic, weak) TabCoordinator* activeTabCoordinator;
 @property(nonatomic, readonly) WebStateList& webStateList;
 @property(nonatomic, strong) TabGridMediator* mediator;
+@property(nonatomic, readonly) SnapshotCache* snapshotCache;
 @end
 
 @implementation TabGridCoordinator
@@ -58,6 +60,11 @@
   return self.browser->web_state_list();
 }
 
+- (SnapshotCache*)snapshotCache {
+  return SnapshotCacheFactory::GetForBrowserState(
+      self.browser->browser_state());
+}
+
 #pragma mark - BrowserCoordinator
 
 - (void)start {
@@ -71,6 +78,7 @@
 
   self.viewController = [[TabGridViewController alloc] init];
   self.viewController.dispatcher = static_cast<id>(self.browser->dispatcher());
+  self.viewController.snapshotCache = self.snapshotCache;
 
   self.mediator.consumer = self.viewController;
 
diff --git a/ios/clean/chrome/test/BUILD.gn b/ios/clean/chrome/test/BUILD.gn
index f4a6f6aa..446e0c6c 100644
--- a/ios/clean/chrome/test/BUILD.gn
+++ b/ios/clean/chrome/test/BUILD.gn
@@ -9,6 +9,7 @@
   testonly = true
   deps = [
     ":ios_clean_chrome_unittests",
+    "//ios/clean/chrome/test/perf:ios_clean_skeleton_perf_egtests",
   ]
 }
 
diff --git a/ios/clean/chrome/test/perf/BUILD.gn b/ios/clean/chrome/test/perf/BUILD.gn
new file mode 100644
index 0000000..2be9ae9
--- /dev/null
+++ b/ios/clean/chrome/test/perf/BUILD.gn
@@ -0,0 +1,80 @@
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/ios/rules.gni")
+import("//build/config/mac/base_rules.gni")
+import("//build/mac/tweak_info_plist.gni")
+import("//ios/build/chrome_build.gni")
+import("//ios/third_party/earl_grey/ios_eg_test.gni")
+
+tweak_info_plist("info_plist") {
+  info_plists = [
+    "//ios/chrome/app/resources/Info.plist",
+    "//ios/chrome/app/resources/ChromeAddition+Info.plist",
+  ]
+  if (ios_chrome_info_plist_additions != []) {
+    info_plists += ios_chrome_info_plist_additions
+  }
+  if (ios_encryption_export_compliance_code != "") {
+    info_plists +=
+        [ "//ios/chrome/app/resources/EncryptionExportCompliance+Info.plist" ]
+  }
+  args = [
+    "--breakpad=$breakpad_enabled_as_int",
+    "--branding=$chromium_short_name",
+  ]
+}
+
+compile_plist("entitlements") {
+  format = "xml1"
+  plist_templates = [ "resources/Chrome.entitlements" ]
+  if (ios_chrome_entitlements_additions != []) {
+    # TODO(crbug.com/707206): Allow additional entitlements once the CSChromium
+    # mobile provisioning profiles have been updated.
+    # plist_templates += ios_chrome_entitlements_additions
+  }
+  substitutions = [ "IOS_BUNDLE_ID_PREFIX=$ios_app_bundle_id_prefix" ]
+  output_name = "$target_gen_dir/$chromium_short_name.entitlements"
+}
+
+ios_eg_test("ios_clean_skeleton_perf_egtests") {
+  entitlements_target = ":entitlements"
+  info_plist_target = ":info_plist"
+
+  sources = [
+    "startup_egtests.mm",
+  ]
+
+  deps = [
+    "//ios/clean/chrome/app:main",
+    "//ios/testing/perf:startup",
+  ]
+
+  bundle_deps = [ "//ios/chrome/app/resources" ]
+
+  configs += [ "//build/config/compiler:enable_arc" ]
+
+  extra_substitutions = [
+    "CHROMIUM_HANDOFF_ID=$chromium_handoff_id",
+    "CHROMIUM_SHORT_NAME=$target_name",
+    "CHROMIUM_URL_SCHEME_1=$url_unsecure_scheme",
+    "CHROMIUM_URL_SCHEME_2=$url_secure_scheme",
+    "CHROMIUM_URL_SCHEME_3=$url_x_callback_scheme",
+    "CHROMIUM_URL_SCHEME_4=$url_channel_scheme",
+    "SSOAUTH_URL_SCHEME=$url_ssoauth_scheme",
+  ]
+
+  if (ios_automatically_manage_certs) {
+    # Use the same bundle identifier for EarlGrey tests as for unit tests
+    # when managing certificates as the number of free certs is limited.
+    extra_substitutions +=
+        [ "CHROMIUM_BUNDLE_ID=gtest.${ios_generic_test_bundle_id_suffix}" ]
+  } else {
+    extra_substitutions += [ "CHROMIUM_BUNDLE_ID=gtest.$target_name" ]
+  }
+
+  if (ios_encryption_export_compliance_code != "") {
+    extra_substitutions += [ "ENCRYPTION_EXPORT_COMPLIANCE_CODE=$ios_encryption_export_compliance_code" ]
+  }
+}
diff --git a/ios/clean/chrome/test/perf/resources/Chrome.entitlements b/ios/clean/chrome/test/perf/resources/Chrome.entitlements
new file mode 100644
index 0000000..061639e
--- /dev/null
+++ b/ios/clean/chrome/test/perf/resources/Chrome.entitlements
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>application-identifier</key>
+	<string>$(AppIdentifierPrefix)$(CFBundleIdentifier)</string>
+</dict>
+</plist>
diff --git a/ios/clean/chrome/test/perf/startup_egtests.mm b/ios/clean/chrome/test/perf/startup_egtests.mm
new file mode 100644
index 0000000..c25e853
--- /dev/null
+++ b/ios/clean/chrome/test/perf/startup_egtests.mm
@@ -0,0 +1,23 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import <XCTest/XCTest.h>
+
+#import "ios/testing/perf/startupLoggers.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@interface StartupTestCase : XCTestCase
+@end
+
+@implementation StartupTestCase
+
+// Simple test to launch the app and log startup data.
+- (void)testColdStartUp {
+  XCTAssertTrue(startup_loggers::LogData(@"testColdStartUp"));
+}
+
+@end
diff --git a/ios/net/cookies/cookie_store_ios.h b/ios/net/cookies/cookie_store_ios.h
index 04a37f19..3877586 100644
--- a/ios/net/cookies/cookie_store_ios.h
+++ b/ios/net/cookies/cookie_store_ios.h
@@ -5,6 +5,8 @@
 #ifndef IOS_NET_COOKIES_COOKIE_STORE_IOS_H_
 #define IOS_NET_COOKIES_COOKIE_STORE_IOS_H_
 
+#include <stdint.h>
+
 #include <map>
 #include <memory>
 #include <string>
@@ -253,7 +255,7 @@
   // calling the provided callback.
 
   void UpdateCachesAfterSet(SetCookiesCallback callback, bool success);
-  void UpdateCachesAfterDelete(DeleteCallback callback, int num_deleted);
+  void UpdateCachesAfterDelete(DeleteCallback callback, uint32_t num_deleted);
   void UpdateCachesAfterClosure(base::OnceClosure callback);
 
   // Takes an NSArray of NSHTTPCookies as returns a net::CookieList.
diff --git a/ios/net/cookies/cookie_store_ios.mm b/ios/net/cookies/cookie_store_ios.mm
index edb3bad..87baca6b 100644
--- a/ios/net/cookies/cookie_store_ios.mm
+++ b/ios/net/cookies/cookie_store_ios.mm
@@ -861,7 +861,7 @@
 }
 
 void CookieStoreIOS::UpdateCachesAfterDelete(DeleteCallback callback,
-                                             int num_deleted) {
+                                             uint32_t num_deleted) {
   DCHECK(thread_checker_.CalledOnValidThread());
   UpdateCachesFromCookieMonster();
   if (!callback.is_null())
diff --git a/ios/testing/perf/BUILD.gn b/ios/testing/perf/BUILD.gn
new file mode 100644
index 0000000..13700de
--- /dev/null
+++ b/ios/testing/perf/BUILD.gn
@@ -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.
+
+source_set("startup") {
+  sources = [
+    "startupLoggers.h",
+    "startupLoggers.mm",
+  ]
+  deps = [
+    "//base",
+  ]
+  configs += [ "//build/config/compiler:enable_arc" ]
+}
diff --git a/ios/testing/perf/startupLoggers.h b/ios/testing/perf/startupLoggers.h
new file mode 100644
index 0000000..d16a2b2
--- /dev/null
+++ b/ios/testing/perf/startupLoggers.h
@@ -0,0 +1,23 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import <Foundation/Foundation.h>
+
+namespace startup_loggers {
+
+// Registers the current time variable. This function should be called when the
+// app is launched.
+void RegisterAppStartTime();
+// Registers the current time variable. This function should be called when the
+// app gets didFinishLaunchingWithOptions notification.
+void RegisterAppDidFinishLaunchingTime();
+// Registers the current time variable. Chrome does some lauch option steps
+// after the app gets didFinishLaunchingWithOptions notification. This function
+// should be called when the app gets applicationDidBecomeActive notification.
+void RegisterAppDidBecomeActiveTime();
+// Returns whether data is successfully stored in the output json file.  This
+// function stores the time variables into a json file.
+bool LogData(NSString* testName);
+
+}  // namespace startup_loggers
diff --git a/ios/testing/perf/startupLoggers.mm b/ios/testing/perf/startupLoggers.mm
new file mode 100644
index 0000000..389e919
--- /dev/null
+++ b/ios/testing/perf/startupLoggers.mm
@@ -0,0 +1,70 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/testing/perf/startupLoggers.h"
+#include "base/time/time.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace startup_loggers {
+// Stores the time of app startup states.
+base::Time* g_start_time;
+base::Time* g_finish_launching_time;
+base::Time* g_become_active_time;
+
+void RegisterAppStartTime() {
+  DCHECK(!g_start_time);
+  g_start_time = new base::Time(base::Time::Now());
+}
+
+void RegisterAppDidFinishLaunchingTime() {
+  DCHECK(g_start_time);
+  DCHECK(!g_finish_launching_time);
+  g_finish_launching_time = new base::Time(base::Time::Now());
+}
+
+void RegisterAppDidBecomeActiveTime() {
+  DCHECK(g_start_time);
+  DCHECK(!g_become_active_time);
+  g_become_active_time = new base::Time(base::Time::Now());
+}
+
+bool LogData(NSString* testName) {
+  // Store the data into a format compatiable with infra scripts.
+  double finishLaunchingDuration =
+      g_finish_launching_time->ToDoubleT() - g_start_time->ToDoubleT();
+  double becomeActiveDuration =
+      g_become_active_time->ToDoubleT() - g_start_time->ToDoubleT();
+  NSDictionary* values = @{
+    @"AppDidFinishLaunchingTime" : @(finishLaunchingDuration),
+    @"AppDidBecomeActiveTime" : @(becomeActiveDuration)
+  };
+  NSDictionary* timingData =
+      @{ testName : @{@"unit" : @"seconds", @"value" : values} };
+  NSDictionary* summary = @{@"Perf Data" : timingData};
+
+  // Converts data into json format.
+  NSError* error;
+  NSData* jsonData =
+      [NSJSONSerialization dataWithJSONObject:summary
+                                      options:NSJSONWritingPrettyPrinted
+                                        error:&error];
+  if (error) {
+    return false;
+  }
+
+  // Stores data into a json file under the app's document directory.
+  NSString* fileName = @"perf_result.json";
+  NSArray<NSString*>* outputDirectories = NSSearchPathForDirectoriesInDomains(
+      NSDocumentDirectory, NSUserDomainMask, YES);
+  if ([outputDirectories count] == 0) {
+    return false;
+  }
+  NSString* outputPath =
+      [outputDirectories[0] stringByAppendingPathComponent:fileName];
+  return [jsonData writeToFile:outputPath atomically:YES];
+}
+}
diff --git a/media/base/decoder_factory.cc b/media/base/decoder_factory.cc
index fa002d6..4b9b0b3 100644
--- a/media/base/decoder_factory.cc
+++ b/media/base/decoder_factory.cc
@@ -19,6 +19,7 @@
 void DecoderFactory::CreateVideoDecoders(
     scoped_refptr<base::SingleThreadTaskRunner> task_runner,
     GpuVideoAcceleratorFactories* gpu_factories,
+    MediaLog* media_log,
     std::vector<std::unique_ptr<VideoDecoder>>* video_decoders) {}
 
 }  // namespace media
diff --git a/media/base/decoder_factory.h b/media/base/decoder_factory.h
index 4d90ee3..7de18e0 100644
--- a/media/base/decoder_factory.h
+++ b/media/base/decoder_factory.h
@@ -20,6 +20,7 @@
 
 class AudioDecoder;
 class GpuVideoAcceleratorFactories;
+class MediaLog;
 class VideoDecoder;
 
 // A factory class for creating audio and video decoders.
@@ -39,6 +40,7 @@
   virtual void CreateVideoDecoders(
       scoped_refptr<base::SingleThreadTaskRunner> task_runner,
       GpuVideoAcceleratorFactories* gpu_factories,
+      MediaLog* media_log,
       std::vector<std::unique_ptr<VideoDecoder>>* video_decoders);
 
  private:
diff --git a/media/base/ipc/media_param_traits_macros.h b/media/base/ipc/media_param_traits_macros.h
index 79083bc..a127800c 100644
--- a/media/base/ipc/media_param_traits_macros.h
+++ b/media/base/ipc/media_param_traits_macros.h
@@ -18,6 +18,7 @@
 #include "media/base/demuxer_stream.h"
 #include "media/base/eme_constants.h"
 #include "media/base/encryption_scheme.h"
+#include "media/base/media_log_event.h"
 #include "media/base/output_device_info.h"
 #include "media/base/sample_format.h"
 #include "media/base/subsample_entry.h"
@@ -42,6 +43,15 @@
 IPC_ENUM_TRAITS_MAX_VALUE(media::CdmKeyInformation::KeyStatus,
                           media::CdmKeyInformation::KEY_STATUS_MAX)
 
+IPC_ENUM_TRAITS_MAX_VALUE(media::CdmMessageType,
+                          media::CdmMessageType::MESSAGE_TYPE_MAX)
+
+IPC_ENUM_TRAITS_MAX_VALUE(media::CdmPromise::Exception,
+                          media::CdmPromise::EXCEPTION_MAX)
+
+IPC_ENUM_TRAITS_MAX_VALUE(media::CdmSessionType,
+                          media::CdmSessionType::SESSION_TYPE_MAX)
+
 IPC_ENUM_TRAITS_MAX_VALUE(media::ChannelLayout, media::CHANNEL_LAYOUT_MAX)
 
 IPC_ENUM_TRAITS_MAX_VALUE(media::ColorSpace, media::COLOR_SPACE_MAX)
@@ -66,14 +76,8 @@
 IPC_ENUM_TRAITS_MAX_VALUE(media::EncryptionScheme::CipherMode,
                           media::EncryptionScheme::CipherMode::CIPHER_MODE_MAX)
 
-IPC_ENUM_TRAITS_MAX_VALUE(media::CdmPromise::Exception,
-                          media::CdmPromise::EXCEPTION_MAX)
-
-IPC_ENUM_TRAITS_MAX_VALUE(media::CdmMessageType,
-                          media::CdmMessageType::MESSAGE_TYPE_MAX)
-
-IPC_ENUM_TRAITS_MAX_VALUE(media::CdmSessionType,
-                          media::CdmSessionType::SESSION_TYPE_MAX)
+IPC_ENUM_TRAITS_MAX_VALUE(media::MediaLogEvent::Type,
+                          media::MediaLogEvent::TYPE_LAST)
 
 IPC_ENUM_TRAITS_MAX_VALUE(media::OutputDeviceStatus,
                           media::OUTPUT_DEVICE_STATUS_MAX)
@@ -114,6 +118,13 @@
   IPC_STRUCT_TRAITS_MEMBER(system_code)
 IPC_STRUCT_TRAITS_END()
 
+IPC_STRUCT_TRAITS_BEGIN(media::MediaLogEvent)
+  IPC_STRUCT_TRAITS_MEMBER(id)
+  IPC_STRUCT_TRAITS_MEMBER(type)
+  IPC_STRUCT_TRAITS_MEMBER(params)
+  IPC_STRUCT_TRAITS_MEMBER(time)
+IPC_STRUCT_TRAITS_END()
+
 IPC_STRUCT_TRAITS_BEGIN(media::SubsampleEntry)
   IPC_STRUCT_TRAITS_MEMBER(clear_bytes)
   IPC_STRUCT_TRAITS_MEMBER(cypher_bytes)
diff --git a/media/base/media_log.h b/media/base/media_log.h
index d138fd6..08eadc5 100644
--- a/media/base/media_log.h
+++ b/media/base/media_log.h
@@ -101,6 +101,10 @@
   void SetDoubleProperty(const std::string& key, double value);
   void SetBooleanProperty(const std::string& key, bool value);
 
+  // Getter for |id_|. Used by MojoMediaLogService to construct MediaLogEvents
+  // to log into this MediaLog.
+  int32_t id() const { return id_; }
+
  private:
   // A unique (to this process) id for this MediaLog.
   int32_t id_;
diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc
index d21c201..479e72c 100644
--- a/media/base/pipeline_impl.cc
+++ b/media/base/pipeline_impl.cc
@@ -201,7 +201,6 @@
       text_renderer_ended_(false),
       weak_factory_(this) {
   weak_this_ = weak_factory_.GetWeakPtr();
-  media_log_->AddEvent(media_log_->CreatePipelineStateChangedEvent(kCreated));
 }
 
 PipelineImpl::RendererWrapper::~RendererWrapper() {
diff --git a/media/base/test_helpers.cc b/media/base/test_helpers.cc
index 73114df..aa89ecec 100644
--- a/media/base/test_helpers.cc
+++ b/media/base/test_helpers.cc
@@ -180,6 +180,12 @@
   return kLargeSize;
 }
 
+AudioDecoderConfig TestAudioConfig::Normal() {
+  return AudioDecoderConfig(kCodecVorbis, kSampleFormatPlanarF32,
+                            CHANNEL_LAYOUT_STEREO, 44100, EmptyExtraData(),
+                            Unencrypted());
+}
+
 // static
 AudioParameters TestAudioParameters::Normal() {
   return AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
diff --git a/media/base/test_helpers.h b/media/base/test_helpers.h
index e54d0a4..dc0ff01 100644
--- a/media/base/test_helpers.h
+++ b/media/base/test_helpers.h
@@ -101,6 +101,13 @@
   DISALLOW_COPY_AND_ASSIGN(TestVideoConfig);
 };
 
+// Provides pre-canned AudioDecoderConfig. These types are used for tests that
+// don't care about detailed parameters of the config.
+class TestAudioConfig {
+ public:
+  static AudioDecoderConfig Normal();
+};
+
 // Provides pre-canned AudioParameters objects.
 class TestAudioParameters {
  public:
@@ -171,10 +178,36 @@
                          "SourceBuffer with multiple tracks");
 }
 
+MATCHER_P2(NonkeyframePrecedesGopStartWarning,
+           keyframe_time_string,
+           nonkeyframe_time_string,
+           "") {
+  return CONTAINS_STRING(
+      arg,
+      "Warning: presentation time of most recently processed random access "
+      "point (" +
+          std::string(keyframe_time_string) +
+          " s) is later than the presentation time of a non-keyframe (" +
+          nonkeyframe_time_string +
+          " s) that depends on it. This type of random access point is not "
+          "well supported by MSE; buffered range reporting may be less "
+          "precise.");
+}
+
 MATCHER(StreamParsingFailed, "") {
   return CONTAINS_STRING(arg, "Append: stream parsing failed.");
 }
 
+MATCHER(ParsedBuffersNotInDTSSequence, "") {
+  return CONTAINS_STRING(arg, "Parsed buffers not in DTS sequence");
+}
+
+MATCHER(ParsedDTSGreaterThanPTS, "") {
+  return CONTAINS_STRING(arg, "Parsed ") &&
+         CONTAINS_STRING(arg, "frame has DTS ") &&
+         CONTAINS_STRING(arg, ", which is after the frame's PTS");
+}
+
 MATCHER_P(FoundStream, stream_type_string, "") {
   return CONTAINS_STRING(
              arg, "found_" + std::string(stream_type_string) + "_stream") &&
@@ -203,6 +236,12 @@
                                   " track track_id=" + id);
 }
 
+MATCHER_P2(FrameTypeMismatchesTrackType, frame_type, track_type, "") {
+  return CONTAINS_STRING(arg, std::string("Frame type ") + frame_type +
+                                  " doesn't match track buffer type " +
+                                  track_type);
+}
+
 MATCHER_P2(SkippingSpliceAtOrBefore,
            new_microseconds,
            existing_microseconds,
diff --git a/media/base/video_decoder_config.cc b/media/base/video_decoder_config.cc
index 9599ff1..845c37a 100644
--- a/media/base/video_decoder_config.cc
+++ b/media/base/video_decoder_config.cc
@@ -53,7 +53,8 @@
 VideoDecoderConfig::VideoDecoderConfig()
     : codec_(kUnknownVideoCodec),
       profile_(VIDEO_CODEC_PROFILE_UNKNOWN),
-      format_(PIXEL_FORMAT_UNKNOWN) {}
+      format_(PIXEL_FORMAT_UNKNOWN),
+      color_space_(COLOR_SPACE_UNSPECIFIED) {}
 
 VideoDecoderConfig::VideoDecoderConfig(
     VideoCodec codec,
@@ -79,7 +80,7 @@
   color_space_info_ = color_space_info;
 }
 
-VideoColorSpace VideoDecoderConfig::color_space_info() const {
+const VideoColorSpace& VideoDecoderConfig::color_space_info() const {
   return color_space_info_;
 }
 
@@ -87,7 +88,7 @@
   hdr_metadata_ = hdr_metadata;
 }
 
-base::Optional<HDRMetadata> VideoDecoderConfig::hdr_metadata() const {
+const base::Optional<HDRMetadata>& VideoDecoderConfig::hdr_metadata() const {
   return hdr_metadata_;
 }
 
diff --git a/media/base/video_decoder_config.h b/media/base/video_decoder_config.h
index ec6b315..80b5c8f 100644
--- a/media/base/video_decoder_config.h
+++ b/media/base/video_decoder_config.h
@@ -89,14 +89,14 @@
   // Deprecated. TODO(wolenetz): Remove. See https://crbug.com/665539.
   // Width and height of video frame immediately post-decode. Not all pixels
   // in this region are valid.
-  gfx::Size coded_size() const { return coded_size_; }
+  const gfx::Size& coded_size() const { return coded_size_; }
 
   // Region of |coded_size_| that is visible.
-  gfx::Rect visible_rect() const { return visible_rect_; }
+  const gfx::Rect& visible_rect() const { return visible_rect_; }
 
   // Final visible width and height of a video frame with aspect ratio taken
   // into account.
-  gfx::Size natural_size() const { return natural_size_; }
+  const gfx::Size& natural_size() const { return natural_size_; }
 
   // Optional byte data required to initialize video decoders, such as H.264
   // AVCC data.
@@ -114,10 +114,10 @@
   }
 
   void set_color_space_info(const VideoColorSpace& color_space_info);
-  VideoColorSpace color_space_info() const;
+  const VideoColorSpace& color_space_info() const;
 
   void set_hdr_metadata(const HDRMetadata& hdr_metadata);
-  base::Optional<HDRMetadata> hdr_metadata() const;
+  const base::Optional<HDRMetadata>& hdr_metadata() const;
 
   // Sets the config to be encrypted or not encrypted manually. This can be
   // useful for decryptors that decrypts an encrypted stream to a clear stream.
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc
index 28911b1..c558870 100644
--- a/media/blink/webmediaplayer_impl.cc
+++ b/media/blink/webmediaplayer_impl.cc
@@ -290,6 +290,10 @@
 
   media_log_->AddEvent(media_log_->CreateCreatedEvent(
       url::Origin(frame_->GetSecurityOrigin()).GetURL().spec()));
+  media_log_->SetStringProperty("frame_url",
+                                frame_->GetDocument().Url().GetString().Utf8());
+  media_log_->SetStringProperty("frame_title",
+                                frame_->GetDocument().Title().Utf8());
 
   if (params->initial_cdm())
     SetCdm(params->initial_cdm());
diff --git a/media/filters/frame_processor.cc b/media/filters/frame_processor.cc
index 41d79c8..b770e68 100644
--- a/media/filters/frame_processor.cc
+++ b/media/filters/frame_processor.cc
@@ -18,6 +18,7 @@
 const int kMaxDroppedPrerollWarnings = 10;
 const int kMaxDtsBeyondPtsWarnings = 10;
 const int kMaxMuxedSequenceModeWarnings = 1;
+const int kMaxNumNonkeyframePrecedesGopStartWarnings = 1;
 
 // Helper class to capture per-track details needed by a frame processor. Some
 // of this information may be duplicated in the short-term in the associated
@@ -26,7 +27,7 @@
 // http://www.w3.org/TR/media-source/#track-buffers.
 class MseTrackBuffer {
  public:
-  explicit MseTrackBuffer(ChunkDemuxerStream* stream);
+  MseTrackBuffer(ChunkDemuxerStream* stream, MediaLog* media_log);
   ~MseTrackBuffer();
 
   // Get/set |last_decode_timestamp_|.
@@ -104,6 +105,14 @@
   // also FrameProcessor::ProcessFrame().
   DecodeTimestamp last_processed_decode_timestamp_;
 
+  // This is used to understand if the stream parser is producing random access
+  // points that are not SAP Type 1, whose support is likely going to be
+  // deprecated from MSE API pending real-world usage data. This is kNoTimestamp
+  // if no frames have been enqueued ever or since the last
+  // NotifyStartOfCodedFrameGroup() or Reset(). Otherwise, this is the most
+  // recently enqueued keyframe's presentation timestamp.
+  base::TimeDelta last_keyframe_presentation_timestamp_;
+
   // The coded frame duration of the last coded frame appended in the current
   // coded frame group. Initially kNoTimestamp, meaning "unset".
   base::TimeDelta last_frame_duration_;
@@ -128,16 +137,24 @@
   // clears it.
   StreamParser::BufferQueue processed_frames_;
 
+  // MediaLog for reporting messages and properties to debug content and engine.
+  MediaLog* media_log_;
+
+  // Counter that limits spam to |media_log_| for MseTrackBuffer warnings.
+  int num_nonkeyframe_precedes_gop_start_warnings_ = 0;
+
   DISALLOW_COPY_AND_ASSIGN(MseTrackBuffer);
 };
 
-MseTrackBuffer::MseTrackBuffer(ChunkDemuxerStream* stream)
+MseTrackBuffer::MseTrackBuffer(ChunkDemuxerStream* stream, MediaLog* media_log)
     : last_decode_timestamp_(kNoDecodeTimestamp()),
       last_processed_decode_timestamp_(DecodeTimestamp()),
+      last_keyframe_presentation_timestamp_(kNoTimestamp),
       last_frame_duration_(kNoTimestamp),
       highest_presentation_timestamp_(kNoTimestamp),
       needs_random_access_point_(true),
-      stream_(stream) {
+      stream_(stream),
+      media_log_(media_log) {
   DCHECK(stream_);
 }
 
@@ -152,6 +169,7 @@
   last_frame_duration_ = kNoTimestamp;
   highest_presentation_timestamp_ = kNoTimestamp;
   needs_random_access_point_ = true;
+  last_keyframe_presentation_timestamp_ = kNoTimestamp;
 }
 
 void MseTrackBuffer::SetHighestPresentationTimestampIfIncreased(
@@ -164,6 +182,28 @@
 
 void MseTrackBuffer::EnqueueProcessedFrame(
     const scoped_refptr<StreamParserBuffer>& frame) {
+  if (frame->is_key_frame()) {
+    last_keyframe_presentation_timestamp_ = frame->timestamp();
+  } else {
+    DCHECK(last_keyframe_presentation_timestamp_ != kNoTimestamp);
+    // This is just one case of potentially problematic GOP structures, though
+    // others are more clearly disallowed in at least some of the MSE bytestream
+    // specs, especially ISOBMFF.
+    if (frame->timestamp() < last_keyframe_presentation_timestamp_) {
+      LIMITED_MEDIA_LOG(DEBUG, media_log_,
+                        num_nonkeyframe_precedes_gop_start_warnings_,
+                        kMaxNumNonkeyframePrecedesGopStartWarnings)
+          << "Warning: presentation time of most recently processed random "
+             "access point ("
+          << last_keyframe_presentation_timestamp_
+          << ") is later than the presentation time of a non-keyframe ("
+          << frame->timestamp()
+          << ") that depends on it. This type of random access point is not "
+             "well supported by MSE; buffered range reporting may be less "
+             "precise.";
+    }
+  }
+
   last_processed_decode_timestamp_ = frame->GetDecodeTimestamp();
   processed_frames_.push_back(frame);
 }
@@ -182,6 +222,7 @@
 }
 
 void MseTrackBuffer::NotifyStartOfCodedFrameGroup(DecodeTimestamp start_time) {
+  last_keyframe_presentation_timestamp_ = kNoTimestamp;
   last_processed_decode_timestamp_ = start_time;
   stream_->OnStartOfCodedFrameGroup(start_time);
 }
@@ -294,7 +335,7 @@
     return false;
   }
 
-  track_buffers_[id] = base::MakeUnique<MseTrackBuffer>(stream);
+  track_buffers_[id] = base::MakeUnique<MseTrackBuffer>(stream, media_log_);
   return true;
 }
 
diff --git a/media/filters/frame_processor_unittest.cc b/media/filters/frame_processor_unittest.cc
index 7c5fb88..1240e7b2 100644
--- a/media/filters/frame_processor_unittest.cc
+++ b/media/filters/frame_processor_unittest.cc
@@ -20,6 +20,7 @@
 #include "media/base/media_log.h"
 #include "media/base/media_util.h"
 #include "media/base/mock_filters.h"
+#include "media/base/mock_media_log.h"
 #include "media/base/test_helpers.h"
 #include "media/base/timestamp_constants.h"
 #include "media/filters/chunk_demuxer.h"
@@ -263,7 +264,7 @@
   }
 
   base::MessageLoop message_loop_;
-  MediaLog media_log_;
+  StrictMock<MockMediaLog> media_log_;
   StrictMock<FrameProcessorTestCallbackHelper> callbacks_;
 
   std::unique_ptr<FrameProcessor> frame_processor_;
@@ -336,6 +337,7 @@
   const auto& audio_buffers =
       StringToBufferQueue("0K", audio_id_, DemuxerStream::VIDEO);
   buffer_queue_map.insert(std::make_pair(audio_id_, audio_buffers));
+  EXPECT_MEDIA_LOG(FrameTypeMismatchesTrackType("video", "1"));
   ASSERT_FALSE(
       frame_processor_->ProcessFrames(buffer_queue_map, append_window_start_,
                                       append_window_end_, &timestamp_offset_));
@@ -352,6 +354,7 @@
   const auto& audio_buffers =
       StringToBufferQueue("10K 0K", audio_id_, DemuxerStream::AUDIO);
   buffer_queue_map.insert(std::make_pair(audio_id_, audio_buffers));
+  EXPECT_MEDIA_LOG(ParsedBuffersNotInDTSSequence());
   ASSERT_FALSE(
       frame_processor_->ProcessFrames(buffer_queue_map, append_window_start_,
                                       append_window_end_, &timestamp_offset_));
@@ -536,8 +539,10 @@
   //   (a0,a10,a20,a30,a40);(v0,v10,v20,v30)
   InSequence s;
   AddTestTracks(HAS_AUDIO | HAS_VIDEO);
-  if (GetParam())
+  if (GetParam()) {
     frame_processor_->SetSequenceMode(true);
+    EXPECT_MEDIA_LOG(MuxedSequenceModeWarning());
+  }
 
   EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 3));
   ProcessFrames("0K 10K", "0K 10 20");
@@ -568,6 +573,7 @@
   bool using_sequence_mode = GetParam();
   if (using_sequence_mode) {
     frame_processor_->SetSequenceMode(true);
+    EXPECT_MEDIA_LOG(MuxedSequenceModeWarning());
     EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 7));
   } else {
     EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 6));
@@ -603,6 +609,8 @@
   AddTestTracks(HAS_AUDIO | HAS_VIDEO);
   bool using_sequence_mode = GetParam();
   frame_processor_->SetSequenceMode(using_sequence_mode);
+  if (using_sequence_mode)
+    EXPECT_MEDIA_LOG(MuxedSequenceModeWarning());
 
   // Start a coded frame group at time 100ms. Note the jagged start still uses
   // the coded frame group's start time as the range start for both streams.
@@ -722,6 +730,7 @@
     // applied to frames beginning at the first frame after the discontinuity
     // caused by the video append at 160K, below.
     SetTimestampOffset(frame_duration_ * 10);
+    EXPECT_MEDIA_LOG(MuxedSequenceModeWarning());
   }
   EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 14));
   ProcessFrames("100K 110K 120K", "110K 120K 130K");
@@ -906,6 +915,8 @@
   InSequence s;
   AddTestTracks(HAS_AUDIO);
   bool using_sequence_mode = GetParam();
+
+  EXPECT_MEDIA_LOG(ParsedDTSGreaterThanPTS()).Times(2);
   if (using_sequence_mode) {
     frame_processor_->SetSequenceMode(true);
     EXPECT_CALL(callbacks_, PossibleDurationIncrease(
@@ -941,9 +952,12 @@
   // partial front trim, to prevent incorrect introduction of a discontinuity
   // and potentially a non-keyframe video frame to be processed next after the
   // discontinuity.
+  bool using_sequence_mode = GetParam();
   InSequence s;
   AddTestTracks(HAS_AUDIO | HAS_VIDEO);
-  frame_processor_->SetSequenceMode(GetParam());
+  frame_processor_->SetSequenceMode(using_sequence_mode);
+  if (using_sequence_mode)
+    EXPECT_MEDIA_LOG(MuxedSequenceModeWarning());
   EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_));
   ProcessFrames("", "0K");
   EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_));
@@ -1027,6 +1041,45 @@
             last_read_parser_buffer->preroll_buffer()->duration());
 }
 
+TEST_P(FrameProcessorTest,
+       OOOKeyframePrecededByDependantNonKeyframeShouldWarn) {
+  bool is_sequence_mode = GetParam();
+  InSequence s;
+  AddTestTracks(HAS_VIDEO);
+  frame_processor_->SetSequenceMode(is_sequence_mode);
+
+  if (is_sequence_mode) {
+    // Allow room in the timeline for the last video append (40|70, below) in
+    // this test to remain within default append window [0, +Infinity]. Moving
+    // the sequence mode appends to begin at time 50ms, the same time as the
+    // first append, below, also results in identical expectation checks for
+    // buffered ranges and buffer reads for both segments and sequence modes.
+    SetTimestampOffset(frame_duration_ * 5);
+  }
+
+  EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 7));
+  ProcessFrames("", "50K 60");
+
+  CheckExpectedRangesByTimestamp(video_.get(), "{ [50,70) }");
+
+  EXPECT_MEDIA_LOG(ParsedDTSGreaterThanPTS());
+  EXPECT_MEDIA_LOG(NonkeyframePrecedesGopStartWarning("0.05", "0.04"));
+  EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 7));
+  ProcessFrames("", "40|70");  // PTS=40, DTS=70
+
+  // Verify DTS-based range is increased.
+  // TODO(wolenetz): Update this expectation to be { [50,70] } when switching to
+  // managing and reporting buffered ranges by PTS intervals instead of DTS
+  // intervals. This reflects the expectation that PTS start is not "pulled
+  // backward" for the new frame at PTS=40 because current spec text doesn't
+  // support SAP Type 2; it has no steps in the coded frame processing algorithm
+  // that would do that "pulling backward". See https://crbug.com/718641 and
+  // https://github.com/w3c/media-source/issues/187.
+  CheckExpectedRangesByTimestamp(video_.get(), "{ [50,80) }");
+  seek(video_.get(), base::TimeDelta());
+  CheckReadsThenReadStalls(video_.get(), "50 60 40");
+}
+
 INSTANTIATE_TEST_CASE_P(SequenceMode, FrameProcessorTest, Values(true));
 INSTANTIATE_TEST_CASE_P(SegmentsMode, FrameProcessorTest, Values(false));
 
diff --git a/media/filters/gpu_video_decoder.cc b/media/filters/gpu_video_decoder.cc
index 8afb950..c92214f 100644
--- a/media/filters/gpu_video_decoder.cc
+++ b/media/filters/gpu_video_decoder.cc
@@ -83,21 +83,15 @@
 enum { kMaxInFlightDecodes = 4 };
 
 struct GpuVideoDecoder::PendingDecoderBuffer {
-  PendingDecoderBuffer(std::unique_ptr<SHMBuffer> s,
+  PendingDecoderBuffer(std::unique_ptr<base::SharedMemory> s,
                        const scoped_refptr<DecoderBuffer>& b,
                        const DecodeCB& done_cb)
-      : shm_buffer(std::move(s)), buffer(b), done_cb(done_cb) {}
-  std::unique_ptr<SHMBuffer> shm_buffer;
+      : shared_memory(std::move(s)), buffer(b), done_cb(done_cb) {}
+  std::unique_ptr<base::SharedMemory> shared_memory;
   scoped_refptr<DecoderBuffer> buffer;
   DecodeCB done_cb;
 };
 
-GpuVideoDecoder::SHMBuffer::SHMBuffer(std::unique_ptr<base::SharedMemory> m,
-                                      size_t s)
-    : shm(std::move(m)), size(s) {}
-
-GpuVideoDecoder::SHMBuffer::~SHMBuffer() {}
-
 GpuVideoDecoder::BufferData::BufferData(int32_t bbid,
                                         base::TimeDelta ts,
                                         const gfx::Rect& vr,
@@ -439,17 +433,17 @@
   }
 
   size_t size = buffer->data_size();
-  std::unique_ptr<SHMBuffer> shm_buffer = GetSHM(size);
-  if (!shm_buffer) {
+  auto shared_memory = GetSharedMemory(size);
+  if (!shared_memory) {
     bound_decode_cb.Run(DecodeStatus::DECODE_ERROR);
     return;
   }
 
-  memcpy(shm_buffer->shm->memory(), buffer->data(), size);
+  memcpy(shared_memory->memory(), buffer->data(), size);
   // AndroidVideoDecodeAccelerator needs the timestamp to output frames in
   // presentation order.
   BitstreamBuffer bitstream_buffer(next_bitstream_buffer_id_,
-                                   shm_buffer->shm->handle(), size, 0,
+                                   shared_memory->handle(), size, 0,
                                    buffer->timestamp());
 
   if (buffer->decrypt_config())
@@ -461,7 +455,7 @@
       !base::ContainsKey(bitstream_buffers_in_decoder_, bitstream_buffer.id()));
   bitstream_buffers_in_decoder_.emplace(
       bitstream_buffer.id(),
-      PendingDecoderBuffer(std::move(shm_buffer), buffer, decode_cb));
+      PendingDecoderBuffer(std::move(shared_memory), buffer, decode_cb));
   DCHECK_LE(static_cast<int>(bitstream_buffers_in_decoder_.size()),
             kMaxInFlightDecodes);
   RecordBufferData(bitstream_buffer, *buffer.get());
@@ -748,27 +742,24 @@
     vda_->ReusePictureBuffer(picture_buffer_id);
 }
 
-std::unique_ptr<GpuVideoDecoder::SHMBuffer> GpuVideoDecoder::GetSHM(
+std::unique_ptr<base::SharedMemory> GpuVideoDecoder::GetSharedMemory(
     size_t min_size) {
   DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent();
   if (available_shm_segments_.empty() ||
-      available_shm_segments_.back()->size < min_size) {
+      available_shm_segments_.back()->mapped_size() < min_size) {
     size_t size_to_allocate = std::max(min_size, kSharedMemorySegmentBytes);
-    std::unique_ptr<base::SharedMemory> shm =
-        factories_->CreateSharedMemory(size_to_allocate);
     // CreateSharedMemory() can return NULL during Shutdown.
-    if (!shm)
-      return NULL;
-    return base::MakeUnique<SHMBuffer>(std::move(shm), size_to_allocate);
+    return factories_->CreateSharedMemory(size_to_allocate);
   }
-  std::unique_ptr<SHMBuffer> ret(std::move(available_shm_segments_.back()));
+  auto ret = std::move(available_shm_segments_.back());
   available_shm_segments_.pop_back();
   return ret;
 }
 
-void GpuVideoDecoder::PutSHM(std::unique_ptr<SHMBuffer> shm_buffer) {
+void GpuVideoDecoder::PutSharedMemory(
+    std::unique_ptr<base::SharedMemory> shared_memory) {
   DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent();
-  available_shm_segments_.push_back(std::move(shm_buffer));
+  available_shm_segments_.push_back(std::move(shared_memory));
 }
 
 void GpuVideoDecoder::NotifyEndOfBitstreamBuffer(int32_t id) {
@@ -783,7 +774,7 @@
     return;
   }
 
-  PutSHM(std::move(it->second.shm_buffer));
+  PutSharedMemory(std::move(it->second.shared_memory));
   it->second.done_cb.Run(state_ == kError ? DecodeStatus::DECODE_ERROR
                                           : DecodeStatus::OK);
   bitstream_buffers_in_decoder_.erase(it);
diff --git a/media/filters/gpu_video_decoder.h b/media/filters/gpu_video_decoder.h
index 4463a0e..c765d31c 100644
--- a/media/filters/gpu_video_decoder.h
+++ b/media/filters/gpu_video_decoder.h
@@ -90,14 +90,6 @@
     kError
   };
 
-  // A shared memory segment and its allocated size.
-  struct SHMBuffer {
-    SHMBuffer(std::unique_ptr<base::SharedMemory> m, size_t s);
-    ~SHMBuffer();
-    std::unique_ptr<base::SharedMemory> shm;
-    size_t size;
-  };
-
   // A SHMBuffer and the DecoderBuffer its data came from.
   struct PendingDecoderBuffer;
 
@@ -125,10 +117,10 @@
 
   // Request a shared-memory segment of at least |min_size| bytes.  Will
   // allocate as necessary.
-  std::unique_ptr<SHMBuffer> GetSHM(size_t min_size);
+  std::unique_ptr<base::SharedMemory> GetSharedMemory(size_t min_size);
 
   // Return a shared-memory segment to the available pool.
-  void PutSHM(std::unique_ptr<SHMBuffer> shm_buffer);
+  void PutSharedMemory(std::unique_ptr<base::SharedMemory> shm_buffer);
 
   // Destroy all PictureBuffers in |buffers|, and delete their textures.
   void DestroyPictureBuffers(PictureBufferMap* buffers);
@@ -187,7 +179,7 @@
   // Shared-memory buffer pool.  Since allocating SHM segments requires a
   // round-trip to the browser process, we keep allocation out of the
   // steady-state of the decoder.
-  std::vector<std::unique_ptr<SHMBuffer>> available_shm_segments_;
+  std::vector<std::unique_ptr<base::SharedMemory>> available_shm_segments_;
 
   // Placeholder sync token that was created and validated after the most
   // recent picture buffers were created.
diff --git a/media/gpu/BUILD.gn b/media/gpu/BUILD.gn
index 6066206a..5a4cc5dd7 100644
--- a/media/gpu/BUILD.gn
+++ b/media/gpu/BUILD.gn
@@ -133,6 +133,8 @@
     "fake_jpeg_decode_accelerator.h",
     "fake_video_decode_accelerator.cc",
     "fake_video_decode_accelerator.h",
+    "gles2_decoder_helper.cc",
+    "gles2_decoder_helper.h",
     "gpu_video_accelerator_util.cc",
     "gpu_video_accelerator_util.h",
     "gpu_video_decode_accelerator_factory.cc",
diff --git a/media/gpu/gles2_decoder_helper.cc b/media/gpu/gles2_decoder_helper.cc
new file mode 100644
index 0000000..25726f9a
--- /dev/null
+++ b/media/gpu/gles2_decoder_helper.cc
@@ -0,0 +1,124 @@
+// 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 "media/gpu/gles2_decoder_helper.h"
+
+#include "base/macros.h"
+#include "base/memory/ptr_util.h"
+#include "base/threading/thread_checker.h"
+#include "gpu/command_buffer/common/mailbox.h"
+#include "gpu/command_buffer/service/context_group.h"
+#include "gpu/command_buffer/service/gles2_cmd_decoder.h"
+#include "gpu/command_buffer/service/mailbox_manager.h"
+#include "gpu/command_buffer/service/texture_manager.h"
+#include "ui/gl/gl_context.h"
+
+namespace media {
+
+class GLES2DecoderHelperImpl : public GLES2DecoderHelper {
+ public:
+  explicit GLES2DecoderHelperImpl(gpu::gles2::GLES2Decoder* decoder)
+      : decoder_(decoder) {}
+
+  bool MakeContextCurrent() override {
+    DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+    return decoder_->MakeCurrent();
+  }
+
+  scoped_refptr<gpu::gles2::TextureRef> CreateTexture(GLenum target,
+                                                      GLenum internal_format,
+                                                      GLsizei width,
+                                                      GLsizei height,
+                                                      GLenum format,
+                                                      GLenum type) override {
+    DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+    DCHECK(decoder_->GetGLContext()->IsCurrent(nullptr));
+    gpu::gles2::ContextGroup* group = decoder_->GetContextGroup();
+    gpu::gles2::TextureManager* texture_manager = group->texture_manager();
+    // TODO(sandersd): Support GLES2DecoderPassthroughImpl.
+    DCHECK(texture_manager);
+
+    // We can't use texture_manager->CreateTexture(), since it requires a unique
+    // |client_id|. Instead we create the texture directly, and create our own
+    // TextureRef for it.
+    GLuint texture_id;
+    glGenTextures(1, &texture_id);
+    glBindTexture(target, texture_id);
+
+    scoped_refptr<gpu::gles2::TextureRef> texture_ref =
+        gpu::gles2::TextureRef::Create(texture_manager, 0, texture_id);
+    texture_manager->SetTarget(texture_ref.get(), target);
+    texture_manager->SetLevelInfo(texture_ref.get(),  // ref
+                                  target,             // target
+                                  0,                  // level
+                                  internal_format,    // internal_format
+                                  width,              // width
+                                  height,             // height
+                                  1,                  // depth
+                                  0,                  // border
+                                  format,             // format
+                                  type,               // type
+                                  gfx::Rect());       // cleared_rect
+
+    texture_manager->SetParameteri(__func__, decoder_->GetErrorState(),
+                                   texture_ref.get(), GL_TEXTURE_MAG_FILTER,
+                                   GL_LINEAR);
+    texture_manager->SetParameteri(__func__, decoder_->GetErrorState(),
+                                   texture_ref.get(), GL_TEXTURE_MIN_FILTER,
+                                   GL_LINEAR);
+
+    texture_manager->SetParameteri(__func__, decoder_->GetErrorState(),
+                                   texture_ref.get(), GL_TEXTURE_WRAP_S,
+                                   GL_CLAMP_TO_EDGE);
+    texture_manager->SetParameteri(__func__, decoder_->GetErrorState(),
+                                   texture_ref.get(), GL_TEXTURE_WRAP_T,
+                                   GL_CLAMP_TO_EDGE);
+
+    texture_manager->SetParameteri(__func__, decoder_->GetErrorState(),
+                                   texture_ref.get(), GL_TEXTURE_BASE_LEVEL, 0);
+    texture_manager->SetParameteri(__func__, decoder_->GetErrorState(),
+                                   texture_ref.get(), GL_TEXTURE_MAX_LEVEL, 0);
+
+    // TODO(sandersd): Do we always want to allocate for GL_TEXTURE_2D?
+    if (target == GL_TEXTURE_2D) {
+      glTexImage2D(target,           // target
+                   0,                // level
+                   internal_format,  // internal_format
+                   width,            // width
+                   height,           // height
+                   0,                // border
+                   format,           // format
+                   type,             // type
+                   nullptr);         // data
+    }
+
+    decoder_->RestoreActiveTextureUnitBinding(target);
+    return texture_ref;
+  }
+
+  gpu::Mailbox CreateMailbox(gpu::gles2::TextureRef* texture_ref) override {
+    DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+    gpu::gles2::ContextGroup* group = decoder_->GetContextGroup();
+    gpu::gles2::MailboxManager* mailbox_manager = group->mailbox_manager();
+    gpu::Mailbox mailbox = gpu::Mailbox::Generate();
+    mailbox_manager->ProduceTexture(mailbox, texture_ref->texture());
+    return mailbox;
+  }
+
+ private:
+  gpu::gles2::GLES2Decoder* decoder_;
+  THREAD_CHECKER(thread_checker_);
+
+  DISALLOW_COPY_AND_ASSIGN(GLES2DecoderHelperImpl);
+};
+
+// static
+std::unique_ptr<GLES2DecoderHelper> GLES2DecoderHelper::Create(
+    gpu::gles2::GLES2Decoder* decoder) {
+  if (!decoder)
+    return nullptr;
+  return base::MakeUnique<GLES2DecoderHelperImpl>(decoder);
+}
+
+}  // namespace media
diff --git a/media/gpu/gles2_decoder_helper.h b/media/gpu/gles2_decoder_helper.h
new file mode 100644
index 0000000..60f8dfae
--- /dev/null
+++ b/media/gpu/gles2_decoder_helper.h
@@ -0,0 +1,59 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MEDIA_GPU_GLES2_DECODER_HELPER_H_
+#define MEDIA_GPU_GLES2_DECODER_HELPER_H_
+
+#include <stdint.h>
+
+#include <memory>
+
+#include "base/memory/ref_counted.h"
+#include "base/optional.h"
+#include "media/gpu/media_gpu_export.h"
+#include "ui/gl/gl_bindings.h"
+
+namespace gpu {
+struct Mailbox;
+namespace gles2 {
+class GLES2Decoder;
+class TextureRef;
+}  // namespace gles2
+}  // namespace gpu
+
+namespace media {
+
+// Utility methods to simplify working with a gpu::gles2::GLES2Decoder from
+// inside VDAs.
+class MEDIA_GPU_EXPORT GLES2DecoderHelper {
+ public:
+  static std::unique_ptr<GLES2DecoderHelper> Create(
+      gpu::gles2::GLES2Decoder* decoder);
+
+  virtual ~GLES2DecoderHelper() {}
+
+  // TODO(sandersd): Provide scoped version?
+  virtual bool MakeContextCurrent() = 0;
+
+  // Creates a texture and configures it as a video frame (linear filtering,
+  // clamp to edge, no mipmaps). The context must be current.
+  //
+  // See glTexImage2D() for parameter definitions.
+  //
+  // Returns nullptr on failure, but there are currently no failure paths.
+  virtual scoped_refptr<gpu::gles2::TextureRef> CreateTexture(
+      GLenum target,
+      GLenum internal_format,
+      GLsizei width,
+      GLsizei height,
+      GLenum format,
+      GLenum type) = 0;
+
+  // Creates a mailbox for a texture.
+  virtual gpu::Mailbox CreateMailbox(gpu::gles2::TextureRef* texture_ref) = 0;
+};
+
+}  // namespace media
+
+#endif  // MEDIA_GPU_GLES2_DECODER_HELPER_H_
diff --git a/media/gpu/ipc/client/gpu_video_encode_accelerator_host.cc b/media/gpu/ipc/client/gpu_video_encode_accelerator_host.cc
index 3f18bc0..9e4fe86 100644
--- a/media/gpu/ipc/client/gpu_video_encode_accelerator_host.cc
+++ b/media/gpu/ipc/client/gpu_video_encode_accelerator_host.cc
@@ -223,9 +223,8 @@
     Error error,
     const std::string& message) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DLOG(ERROR) << "Error from " << location.function_name() << "("
-              << location.file_name() << ":" << location.line_number() << ") "
-              << message << " (error = " << error << ")";
+  DLOG(ERROR) << "Error from " << location.ToString() << ", " << message
+              << " (error = " << error << ")";
   // Post the error notification back to this thread, to avoid re-entrancy.
   media_task_runner_->PostTask(
       FROM_HERE, base::Bind(&GpuVideoEncodeAcceleratorHost::OnNotifyError,
@@ -249,10 +248,10 @@
   DVLOG(2) << __func__ << " input_count=" << input_count
            << ", input_coded_size=" << input_coded_size.ToString()
            << ", output_buffer_size=" << output_buffer_size;
-  if (client_) {
-    client_->RequireBitstreamBuffers(input_count, input_coded_size,
-                                     output_buffer_size);
-  }
+  if (!client_)
+    return;
+  client_->RequireBitstreamBuffers(input_count, input_coded_size,
+                                   output_buffer_size);
 }
 
 void GpuVideoEncodeAcceleratorHost::OnNotifyInputDone(int32_t frame_id) {
@@ -283,9 +282,10 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DVLOG(3) << __func__ << " bitstream_buffer_id=" << bitstream_buffer_id
            << ", payload_size=" << payload_size << ", key_frame=" << key_frame;
-  if (client_)
-    client_->BitstreamBufferReady(bitstream_buffer_id, payload_size, key_frame,
-                                  timestamp);
+  if (!client_)
+    return;
+  client_->BitstreamBufferReady(bitstream_buffer_id, payload_size, key_frame,
+                                timestamp);
 }
 
 void GpuVideoEncodeAcceleratorHost::OnNotifyError(Error error) {
diff --git a/media/mojo/BUILD.gn b/media/mojo/BUILD.gn
index 224db04..6b9e99f 100644
--- a/media/mojo/BUILD.gn
+++ b/media/mojo/BUILD.gn
@@ -74,6 +74,9 @@
     "common/media_type_converters_unittest.cc",
     "common/mojo_decoder_buffer_converter_unittest.cc",
     "common/mojo_shared_buffer_video_frame_unittest.cc",
+    "interfaces/audio_decoder_config_struct_traits_unittest.cc",
+    "interfaces/encryption_scheme_struct_traits_unittest.cc",
+    "interfaces/video_decoder_config_struct_traits_unittest.cc",
     "interfaces/video_frame_struct_traits_unittest.cc",
     "services/mojo_audio_output_stream_unittest.cc",
     "services/mojo_cdm_allocator_unittest.cc",
diff --git a/media/mojo/clients/BUILD.gn b/media/mojo/clients/BUILD.gn
index a299b51d..407b7dd9 100644
--- a/media/mojo/clients/BUILD.gn
+++ b/media/mojo/clients/BUILD.gn
@@ -35,6 +35,8 @@
     "mojo_decryptor.h",
     "mojo_demuxer_stream_impl.cc",
     "mojo_demuxer_stream_impl.h",
+    "mojo_media_log_service.cc",
+    "mojo_media_log_service.h",
     "mojo_renderer.cc",
     "mojo_renderer.h",
     "mojo_renderer_factory.cc",
diff --git a/media/mojo/clients/mojo_audio_decoder.cc b/media/mojo/clients/mojo_audio_decoder.cc
index 2023236..94a86b3 100644
--- a/media/mojo/clients/mojo_audio_decoder.cc
+++ b/media/mojo/clients/mojo_audio_decoder.cc
@@ -70,7 +70,7 @@
   // Using base::Unretained(this) is safe because |this| owns |remote_decoder_|,
   // and the callback won't be dispatched if |remote_decoder_| is destroyed.
   remote_decoder_->Initialize(
-      mojom::AudioDecoderConfig::From(config), cdm_id,
+      config, cdm_id,
       base::Bind(&MojoAudioDecoder::OnInitialized, base::Unretained(this)));
 }
 
diff --git a/media/mojo/clients/mojo_decoder_factory.cc b/media/mojo/clients/mojo_decoder_factory.cc
index e187d48e..1a9e6e8b 100644
--- a/media/mojo/clients/mojo_decoder_factory.cc
+++ b/media/mojo/clients/mojo_decoder_factory.cc
@@ -38,13 +38,14 @@
 void MojoDecoderFactory::CreateVideoDecoders(
     scoped_refptr<base::SingleThreadTaskRunner> task_runner,
     GpuVideoAcceleratorFactories* gpu_factories,
+    MediaLog* media_log,
     std::vector<std::unique_ptr<VideoDecoder>>* video_decoders) {
 #if BUILDFLAG(ENABLE_MOJO_VIDEO_DECODER)
   mojom::VideoDecoderPtr remote_decoder;
   service_manager::GetInterface<mojom::VideoDecoder>(interface_provider_,
                                                      &remote_decoder);
   video_decoders->push_back(base::MakeUnique<MojoVideoDecoder>(
-      task_runner, gpu_factories, std::move(remote_decoder)));
+      task_runner, gpu_factories, media_log, std::move(remote_decoder)));
 #endif
 }
 
diff --git a/media/mojo/clients/mojo_decoder_factory.h b/media/mojo/clients/mojo_decoder_factory.h
index edf3546..cd6725ed 100644
--- a/media/mojo/clients/mojo_decoder_factory.h
+++ b/media/mojo/clients/mojo_decoder_factory.h
@@ -25,6 +25,7 @@
   void CreateVideoDecoders(
       scoped_refptr<base::SingleThreadTaskRunner> task_runner,
       GpuVideoAcceleratorFactories* gpu_factories,
+      MediaLog* media_log,
       std::vector<std::unique_ptr<VideoDecoder>>* video_decoders) final;
 
  private:
diff --git a/media/mojo/clients/mojo_decryptor.cc b/media/mojo/clients/mojo_decryptor.cc
index 4b57ed9a1..9297175 100644
--- a/media/mojo/clients/mojo_decryptor.cc
+++ b/media/mojo/clients/mojo_decryptor.cc
@@ -102,8 +102,7 @@
   DVLOG(1) << __func__;
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  remote_decryptor_->InitializeAudioDecoder(
-      mojom::AudioDecoderConfig::From(config), init_cb);
+  remote_decryptor_->InitializeAudioDecoder(config, init_cb);
 }
 
 void MojoDecryptor::InitializeVideoDecoder(const VideoDecoderConfig& config,
@@ -111,8 +110,7 @@
   DVLOG(1) << __func__;
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  remote_decryptor_->InitializeVideoDecoder(
-      mojom::VideoDecoderConfig::From(config), init_cb);
+  remote_decryptor_->InitializeVideoDecoder(config, init_cb);
 }
 
 void MojoDecryptor::DecryptAndDecodeAudio(
diff --git a/media/mojo/clients/mojo_demuxer_stream_impl.cc b/media/mojo/clients/mojo_demuxer_stream_impl.cc
index 8d51802..89d4772 100644
--- a/media/mojo/clients/mojo_demuxer_stream_impl.cc
+++ b/media/mojo/clients/mojo_demuxer_stream_impl.cc
@@ -29,18 +29,16 @@
 // This is called when our DemuxerStreamClient has connected itself and is
 // ready to receive messages.  Send an initial config and notify it that
 // we are now ready for business.
-void MojoDemuxerStreamImpl::Initialize(const InitializeCallback& callback) {
+void MojoDemuxerStreamImpl::Initialize(InitializeCallback callback) {
   DVLOG(2) << __func__;
 
   // Prepare the initial config.
-  mojom::AudioDecoderConfigPtr audio_config;
-  mojom::VideoDecoderConfigPtr video_config;
+  base::Optional<AudioDecoderConfig> audio_config;
+  base::Optional<VideoDecoderConfig> video_config;
   if (stream_->type() == Type::AUDIO) {
-    audio_config =
-        mojom::AudioDecoderConfig::From(stream_->audio_decoder_config());
+    audio_config = stream_->audio_decoder_config();
   } else if (stream_->type() == Type::VIDEO) {
-    video_config =
-        mojom::VideoDecoderConfig::From(stream_->video_decoder_config());
+    video_config = stream_->video_decoder_config();
   } else {
     NOTREACHED() << "Unsupported stream type: " << stream_->type();
     return;
@@ -50,13 +48,14 @@
   mojo_decoder_buffer_writer_ =
       MojoDecoderBufferWriter::Create(stream_->type(), &remote_consumer_handle);
 
-  callback.Run(stream_->type(), std::move(remote_consumer_handle),
-               std::move(audio_config), std::move(video_config));
+  std::move(callback).Run(stream_->type(), std::move(remote_consumer_handle),
+                          audio_config, video_config);
 }
 
-void MojoDemuxerStreamImpl::Read(const ReadCallback& callback) {
+void MojoDemuxerStreamImpl::Read(ReadCallback callback) {
   stream_->Read(base::Bind(&MojoDemuxerStreamImpl::OnBufferReady,
-                           weak_factory_.GetWeakPtr(), callback));
+                           weak_factory_.GetWeakPtr(),
+                           base::Passed(&callback)));
 }
 
 void MojoDemuxerStreamImpl::EnableBitstreamConverter() {
@@ -64,35 +63,33 @@
 }
 
 void MojoDemuxerStreamImpl::OnBufferReady(
-    const ReadCallback& callback,
+    ReadCallback callback,
     Status status,
     const scoped_refptr<media::DecoderBuffer>& buffer) {
-  mojom::AudioDecoderConfigPtr audio_config;
-  mojom::VideoDecoderConfigPtr video_config;
+  base::Optional<AudioDecoderConfig> audio_config;
+  base::Optional<VideoDecoderConfig> video_config;
 
   if (status == Status::kConfigChanged) {
     DVLOG(2) << __func__ << ": ConfigChange!";
     // Send the config change so our client can read it once it parses the
     // Status obtained via Run() below.
     if (stream_->type() == Type::AUDIO) {
-      audio_config =
-          mojom::AudioDecoderConfig::From(stream_->audio_decoder_config());
+      audio_config = stream_->audio_decoder_config();
     } else if (stream_->type() == Type::VIDEO) {
-      video_config =
-          mojom::VideoDecoderConfig::From(stream_->video_decoder_config());
+      video_config = stream_->video_decoder_config();
     } else {
       NOTREACHED() << "Unsupported config change encountered for type: "
                    << stream_->type();
     }
 
-    callback.Run(Status::kConfigChanged, mojom::DecoderBufferPtr(),
-                 std::move(audio_config), std::move(video_config));
+    std::move(callback).Run(Status::kConfigChanged, mojom::DecoderBufferPtr(),
+                            audio_config, video_config);
     return;
   }
 
   if (status == Status::kAborted) {
-    callback.Run(Status::kAborted, mojom::DecoderBufferPtr(),
-                 std::move(audio_config), std::move(video_config));
+    std::move(callback).Run(Status::kAborted, mojom::DecoderBufferPtr(),
+                            audio_config, video_config);
     return;
   }
 
@@ -101,16 +98,16 @@
   mojom::DecoderBufferPtr mojo_buffer =
       mojo_decoder_buffer_writer_->WriteDecoderBuffer(buffer);
   if (!mojo_buffer) {
-    callback.Run(Status::kAborted, mojom::DecoderBufferPtr(),
-                 std::move(audio_config), std::move(video_config));
+    std::move(callback).Run(Status::kAborted, mojom::DecoderBufferPtr(),
+                            audio_config, video_config);
     return;
   }
 
   // TODO(dalecurtis): Once we can write framed data to the DataPipe, fill via
   // the producer handle and then read more to keep the pipe full.  Waiting for
   // space can be accomplished using an AsyncWaiter.
-  callback.Run(status, std::move(mojo_buffer), std::move(audio_config),
-               std::move(video_config));
+  std::move(callback).Run(status, std::move(mojo_buffer), audio_config,
+                          video_config);
 }
 
 }  // namespace media
diff --git a/media/mojo/clients/mojo_demuxer_stream_impl.h b/media/mojo/clients/mojo_demuxer_stream_impl.h
index 684c262..4524b1d5 100644
--- a/media/mojo/clients/mojo_demuxer_stream_impl.h
+++ b/media/mojo/clients/mojo_demuxer_stream_impl.h
@@ -32,8 +32,8 @@
   // mojom::DemuxerStream implementation.
   // InitializeCallback and ReadCallback are defined in
   // mojom::DemuxerStream.
-  void Initialize(const InitializeCallback& callback) override;
-  void Read(const ReadCallback& callback) override;
+  void Initialize(InitializeCallback callback) override;
+  void Read(ReadCallback callback) override;
   void EnableBitstreamConverter() override;
 
   // Sets an error handler that will be called if a connection error occurs on
@@ -46,7 +46,7 @@
   using Type = media::DemuxerStream::Type;
   using Status = media::DemuxerStream::Status;
 
-  void OnBufferReady(const ReadCallback& callback,
+  void OnBufferReady(ReadCallback callback,
                      Status status,
                      const scoped_refptr<media::DecoderBuffer>& buffer);
 
diff --git a/media/mojo/clients/mojo_media_log_service.cc b/media/mojo/clients/mojo_media_log_service.cc
new file mode 100644
index 0000000..5403543
--- /dev/null
+++ b/media/mojo/clients/mojo_media_log_service.cc
@@ -0,0 +1,40 @@
+// 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 "media/mojo/clients/mojo_media_log_service.h"
+
+#include <memory>
+
+#include "base/logging.h"
+#include "base/memory/ptr_util.h"
+#include "media/base/media_log_event.h"
+
+namespace media {
+
+MojoMediaLogService::MojoMediaLogService(media::MediaLog* media_log)
+    : media_log_(media_log) {
+  DVLOG(1) << __func__;
+  DCHECK(media_log_);
+}
+
+MojoMediaLogService::~MojoMediaLogService() {
+  DVLOG(1) << __func__;
+}
+
+void MojoMediaLogService::AddEvent(const media::MediaLogEvent& event) {
+  DVLOG(1) << __func__;
+
+  // Make a copy so that we can transfer ownership to |media_log_|.
+  std::unique_ptr<media::MediaLogEvent> modified_event =
+      base::MakeUnique<media::MediaLogEvent>(event);
+
+  // |id| is player-unique per-process, but the remote side does not know the
+  // correct value (nor would we necessarily trust it). Overwrite with the
+  // correct value.
+  modified_event->id = media_log_->id();
+
+  media_log_->AddEvent(std::move(modified_event));
+}
+
+}  // namespace media
diff --git a/media/mojo/clients/mojo_media_log_service.h b/media/mojo/clients/mojo_media_log_service.h
new file mode 100644
index 0000000..80d2a3a
--- /dev/null
+++ b/media/mojo/clients/mojo_media_log_service.h
@@ -0,0 +1,33 @@
+// 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 MEDIA_MOJO_CLIENTS_MOJO_MEDIA_LOG_SERVICE_H_
+#define MEDIA_MOJO_CLIENTS_MOJO_MEDIA_LOG_SERVICE_H_
+
+#include <stdint.h>
+
+#include "base/macros.h"
+#include "media/base/media_log.h"
+#include "media/mojo/interfaces/media_log.mojom.h"
+
+namespace media {
+
+// Implementation of a mojom::MediaLog service which wraps a media::MediaLog.
+class MojoMediaLogService : public mojom::MediaLog {
+ public:
+  explicit MojoMediaLogService(media::MediaLog* media_log);
+  ~MojoMediaLogService() final;
+
+  // mojom::MediaLog implementation
+  void AddEvent(const media::MediaLogEvent& event) final;
+
+ private:
+  media::MediaLog* media_log_;
+
+  DISALLOW_COPY_AND_ASSIGN(MojoMediaLogService);
+};
+
+}  // namespace media
+
+#endif  // MEDIA_MOJO_CLIENTS_MOJO_MEDIA_LOG_SERVICE_H_
diff --git a/media/mojo/clients/mojo_renderer_unittest.cc b/media/mojo/clients/mojo_renderer_unittest.cc
index 6b54148f..222543f 100644
--- a/media/mojo/clients/mojo_renderer_unittest.cc
+++ b/media/mojo/clients/mojo_renderer_unittest.cc
@@ -105,6 +105,7 @@
 
   void CreateAudioStream() {
     audio_stream_ = CreateStream(DemuxerStream::AUDIO);
+    audio_stream_->set_audio_decoder_config(TestAudioConfig::Normal());
     streams_.push_back(audio_stream_.get());
     EXPECT_CALL(demuxer_, GetAllStreams()).WillRepeatedly(Return(streams_));
   }
diff --git a/media/mojo/clients/mojo_video_decoder.cc b/media/mojo/clients/mojo_video_decoder.cc
index 37135b8a..637bf89 100644
--- a/media/mojo/clients/mojo_video_decoder.cc
+++ b/media/mojo/clients/mojo_video_decoder.cc
@@ -26,11 +26,14 @@
 MojoVideoDecoder::MojoVideoDecoder(
     scoped_refptr<base::SingleThreadTaskRunner> task_runner,
     GpuVideoAcceleratorFactories* gpu_factories,
+    MediaLog* media_log,
     mojom::VideoDecoderPtr remote_decoder)
     : task_runner_(task_runner),
       remote_decoder_info_(remote_decoder.PassInterface()),
       gpu_factories_(gpu_factories),
       client_binding_(this),
+      media_log_service_(media_log),
+      media_log_binding_(&media_log_service_),
       weak_factory_(this) {
   DVLOG(1) << __func__;
 }
@@ -67,7 +70,7 @@
   init_cb_ = init_cb;
   output_cb_ = output_cb;
   remote_decoder_->Initialize(
-      mojom::VideoDecoderConfig::From(config), low_delay,
+      config, low_delay,
       base::Bind(&MojoVideoDecoder::OnInitializeDone, base::Unretained(this)));
 }
 
@@ -198,10 +201,12 @@
   remote_decoder_.set_connection_error_handler(
       base::Bind(&MojoVideoDecoder::Stop, base::Unretained(this)));
 
-  // TODO(sandersd): Does this need its own error handler?
   mojom::VideoDecoderClientAssociatedPtrInfo client_ptr_info;
   client_binding_.Bind(mojo::MakeRequest(&client_ptr_info));
 
+  mojom::MediaLogAssociatedPtrInfo media_log_ptr_info;
+  media_log_binding_.Bind(mojo::MakeRequest(&media_log_ptr_info));
+
   // TODO(sandersd): Better buffer sizing.
   mojo::ScopedDataPipeConsumerHandle remote_consumer_handle;
   mojo_decoder_buffer_writer_ = MojoDecoderBufferWriter::Create(
@@ -217,9 +222,9 @@
     }
   }
 
-  remote_decoder_->Construct(std::move(client_ptr_info),
-                             std::move(remote_consumer_handle),
-                             std::move(command_buffer_id));
+  remote_decoder_->Construct(
+      std::move(client_ptr_info), std::move(media_log_ptr_info),
+      std::move(remote_consumer_handle), std::move(command_buffer_id));
 }
 
 void MojoVideoDecoder::Stop() {
diff --git a/media/mojo/clients/mojo_video_decoder.h b/media/mojo/clients/mojo_video_decoder.h
index 1f2f9f8..c8d9d27 100644
--- a/media/mojo/clients/mojo_video_decoder.h
+++ b/media/mojo/clients/mojo_video_decoder.h
@@ -9,6 +9,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "media/base/video_decoder.h"
+#include "media/mojo/clients/mojo_media_log_service.h"
 #include "media/mojo/interfaces/video_decoder.mojom.h"
 #include "mojo/public/cpp/bindings/associated_binding.h"
 
@@ -19,6 +20,7 @@
 namespace media {
 
 class GpuVideoAcceleratorFactories;
+class MediaLog;
 class MojoDecoderBufferWriter;
 
 // A VideoDecoder, for use in the renderer process, that proxies to a
@@ -30,6 +32,7 @@
  public:
   MojoVideoDecoder(scoped_refptr<base::SingleThreadTaskRunner> task_runner,
                    GpuVideoAcceleratorFactories* gpu_factories,
+                   MediaLog* media_log,
                    mojom::VideoDecoderPtr remote_decoder);
   ~MojoVideoDecoder() final;
 
@@ -87,7 +90,9 @@
   std::unique_ptr<MojoDecoderBufferWriter> mojo_decoder_buffer_writer_;
   bool remote_decoder_bound_ = false;
   bool has_connection_error_ = false;
-  mojo::AssociatedBinding<VideoDecoderClient> client_binding_;
+  mojo::AssociatedBinding<mojom::VideoDecoderClient> client_binding_;
+  MojoMediaLogService media_log_service_;
+  mojo::AssociatedBinding<mojom::MediaLog> media_log_binding_;
 
   bool initialized_ = false;
   bool needs_bitstream_conversion_ = false;
diff --git a/media/mojo/common/media_type_converters.cc b/media/mojo/common/media_type_converters.cc
index 5571a8b..d1f584c 100644
--- a/media/mojo/common/media_type_converters.cc
+++ b/media/mojo/common/media_type_converters.cc
@@ -17,7 +17,6 @@
 #include "media/base/decrypt_config.h"
 #include "media/base/encryption_scheme.h"
 #include "media/base/subsample_entry.h"
-#include "media/base/video_decoder_config.h"
 #include "mojo/public/cpp/system/buffer.h"
 
 namespace mojo {
@@ -36,44 +35,6 @@
 };
 
 // static
-media::mojom::PatternPtr
-TypeConverter<media::mojom::PatternPtr, media::EncryptionScheme::Pattern>::
-    Convert(const media::EncryptionScheme::Pattern& input) {
-  media::mojom::PatternPtr mojo_pattern(media::mojom::Pattern::New());
-  mojo_pattern->encrypt_blocks = input.encrypt_blocks();
-  mojo_pattern->skip_blocks = input.skip_blocks();
-  return mojo_pattern;
-}
-
-// static
-media::EncryptionScheme::Pattern TypeConverter<
-    media::EncryptionScheme::Pattern,
-    media::mojom::PatternPtr>::Convert(const media::mojom::PatternPtr& input) {
-  return media::EncryptionScheme::Pattern(input->encrypt_blocks,
-                                          input->skip_blocks);
-}
-
-// static
-media::mojom::EncryptionSchemePtr TypeConverter<
-    media::mojom::EncryptionSchemePtr,
-    media::EncryptionScheme>::Convert(const media::EncryptionScheme& input) {
-  media::mojom::EncryptionSchemePtr mojo_encryption_scheme(
-      media::mojom::EncryptionScheme::New());
-  mojo_encryption_scheme->mode = input.mode();
-  mojo_encryption_scheme->pattern =
-      media::mojom::Pattern::From(input.pattern());
-  return mojo_encryption_scheme;
-}
-
-// static
-media::EncryptionScheme
-TypeConverter<media::EncryptionScheme, media::mojom::EncryptionSchemePtr>::
-    Convert(const media::mojom::EncryptionSchemePtr& input) {
-  return media::EncryptionScheme(
-      input->mode, input->pattern.To<media::EncryptionScheme::Pattern>());
-}
-
-// static
 media::mojom::DecryptConfigPtr
 TypeConverter<media::mojom::DecryptConfigPtr, media::DecryptConfig>::Convert(
     const media::DecryptConfig& input) {
@@ -183,8 +144,7 @@
   config->extra_data = input.extra_data();
   config->seek_preroll = input.seek_preroll();
   config->codec_delay = input.codec_delay();
-  config->encryption_scheme =
-      media::mojom::EncryptionScheme::From(input.encryption_scheme());
+  config->encryption_scheme = input.encryption_scheme();
   return config;
 }
 
@@ -195,45 +155,8 @@
   media::AudioDecoderConfig config;
   config.Initialize(input->codec, input->sample_format, input->channel_layout,
                     input->samples_per_second, input->extra_data,
-                    input->encryption_scheme.To<media::EncryptionScheme>(),
-                    input->seek_preroll, input->codec_delay);
-  return config;
-}
-
-// static
-media::mojom::VideoDecoderConfigPtr
-TypeConverter<media::mojom::VideoDecoderConfigPtr, media::VideoDecoderConfig>::
-    Convert(const media::VideoDecoderConfig& input) {
-  media::mojom::VideoDecoderConfigPtr config(
-      media::mojom::VideoDecoderConfig::New());
-  config->codec = input.codec();
-  config->profile = input.profile();
-  config->format = input.format();
-  config->color_space = input.color_space();
-  config->coded_size = input.coded_size();
-  config->visible_rect = input.visible_rect();
-  config->natural_size = input.natural_size();
-  config->extra_data = input.extra_data();
-  config->encryption_scheme =
-      media::mojom::EncryptionScheme::From(input.encryption_scheme());
-  config->color_space_info = input.color_space_info();
-  if (input.hdr_metadata())
-    config->hdr_metadata = *input.hdr_metadata();
-  return config;
-}
-
-// static
-media::VideoDecoderConfig
-TypeConverter<media::VideoDecoderConfig, media::mojom::VideoDecoderConfigPtr>::
-    Convert(const media::mojom::VideoDecoderConfigPtr& input) {
-  media::VideoDecoderConfig config;
-  config.Initialize(input->codec, input->profile, input->format,
-                    input->color_space, input->coded_size, input->visible_rect,
-                    input->natural_size, input->extra_data,
-                    input->encryption_scheme.To<media::EncryptionScheme>());
-  config.set_color_space_info(input->color_space_info);
-  if (input->hdr_metadata)
-    config.set_hdr_metadata(*input->hdr_metadata);
+                    input->encryption_scheme, input->seek_preroll,
+                    input->codec_delay);
   return config;
 }
 
diff --git a/media/mojo/common/media_type_converters.h b/media/mojo/common/media_type_converters.h
index c10c277..d99cf1b66 100644
--- a/media/mojo/common/media_type_converters.h
+++ b/media/mojo/common/media_type_converters.h
@@ -17,8 +17,6 @@
 class AudioDecoderConfig;
 class DecoderBuffer;
 class DecryptConfig;
-class EncryptionScheme;
-class VideoDecoderConfig;
 struct CdmConfig;
 struct CdmKeyInformation;
 }
@@ -28,19 +26,6 @@
 namespace mojo {
 
 template <>
-struct TypeConverter<media::mojom::EncryptionSchemePtr,
-                     media::EncryptionScheme> {
-  static media::mojom::EncryptionSchemePtr Convert(
-      const media::EncryptionScheme& input);
-};
-template <>
-struct TypeConverter<media::EncryptionScheme,
-                     media::mojom::EncryptionSchemePtr> {
-  static media::EncryptionScheme Convert(
-      const media::mojom::EncryptionSchemePtr& input);
-};
-
-template <>
 struct TypeConverter<media::mojom::DecryptConfigPtr, media::DecryptConfig> {
   static media::mojom::DecryptConfigPtr Convert(
       const media::DecryptConfig& input);
@@ -79,19 +64,6 @@
 };
 
 template <>
-struct TypeConverter<media::mojom::VideoDecoderConfigPtr,
-                     media::VideoDecoderConfig> {
-  static media::mojom::VideoDecoderConfigPtr Convert(
-      const media::VideoDecoderConfig& input);
-};
-template <>
-struct TypeConverter<media::VideoDecoderConfig,
-                     media::mojom::VideoDecoderConfigPtr> {
-  static media::VideoDecoderConfig Convert(
-      const media::mojom::VideoDecoderConfigPtr& input);
-};
-
-template <>
 struct TypeConverter<media::mojom::CdmKeyInformationPtr,
                      media::CdmKeyInformation> {
   static media::mojom::CdmKeyInformationPtr Convert(
diff --git a/media/mojo/common/media_type_converters_unittest.cc b/media/mojo/common/media_type_converters_unittest.cc
index 7ba0fa5..3d5d2a5 100644
--- a/media/mojo/common/media_type_converters_unittest.cc
+++ b/media/mojo/common/media_type_converters_unittest.cc
@@ -24,10 +24,6 @@
 
 namespace {
 
-static const gfx::Size kCodedSize(320, 240);
-static const gfx::Rect kVisibleRect(320, 240);
-static const gfx::Size kNaturalSize(320, 240);
-
 void CompareBytes(uint8_t* original_data, uint8_t* result_data, size_t length) {
   EXPECT_GT(length, 0u);
   EXPECT_EQ(memcmp(original_data, result_data, length), 0);
@@ -167,112 +163,6 @@
   EXPECT_TRUE(buffer->decrypt_config()->iv().empty());
 }
 
-// TODO(tim): Check other properties.
-
-TEST(MediaTypeConvertersTest, ConvertAudioDecoderConfig_Normal) {
-  const uint8_t kExtraData[] = "config extra data";
-  const std::vector<uint8_t> kExtraDataVector(
-      &kExtraData[0], &kExtraData[0] + arraysize(kExtraData));
-
-  AudioDecoderConfig config;
-  config.Initialize(kCodecAAC, kSampleFormatU8, CHANNEL_LAYOUT_SURROUND, 48000,
-                    kExtraDataVector, Unencrypted(), base::TimeDelta(), 0);
-  mojom::AudioDecoderConfigPtr ptr(mojom::AudioDecoderConfig::From(config));
-  EXPECT_FALSE(ptr->extra_data.empty());
-  AudioDecoderConfig result(ptr.To<AudioDecoderConfig>());
-  EXPECT_TRUE(result.Matches(config));
-}
-
-TEST(MediaTypeConvertersTest, ConvertAudioDecoderConfig_EmptyExtraData) {
-  AudioDecoderConfig config;
-  config.Initialize(kCodecAAC, kSampleFormatU8, CHANNEL_LAYOUT_SURROUND, 48000,
-                    EmptyExtraData(), Unencrypted(), base::TimeDelta(), 0);
-  mojom::AudioDecoderConfigPtr ptr(mojom::AudioDecoderConfig::From(config));
-  EXPECT_TRUE(ptr->extra_data.empty());
-  AudioDecoderConfig result(ptr.To<AudioDecoderConfig>());
-  EXPECT_TRUE(result.Matches(config));
-}
-
-TEST(MediaTypeConvertersTest, ConvertAudioDecoderConfig_Encrypted) {
-  AudioDecoderConfig config;
-  config.Initialize(kCodecAAC, kSampleFormatU8, CHANNEL_LAYOUT_SURROUND, 48000,
-                    EmptyExtraData(), AesCtrEncryptionScheme(),
-                    base::TimeDelta(), 0);
-  mojom::AudioDecoderConfigPtr ptr(mojom::AudioDecoderConfig::From(config));
-  AudioDecoderConfig result(ptr.To<AudioDecoderConfig>());
-  EXPECT_TRUE(result.Matches(config));
-}
-
-TEST(MediaTypeConvertersTest, ConvertVideoDecoderConfig_Normal) {
-  const uint8_t kExtraData[] = "config extra data";
-  const std::vector<uint8_t> kExtraDataVector(
-      &kExtraData[0], &kExtraData[0] + arraysize(kExtraData));
-
-  VideoDecoderConfig config(kCodecVP8, VP8PROFILE_ANY, PIXEL_FORMAT_YV12,
-                            COLOR_SPACE_UNSPECIFIED, kCodedSize, kVisibleRect,
-                            kNaturalSize, kExtraDataVector, Unencrypted());
-  mojom::VideoDecoderConfigPtr ptr(mojom::VideoDecoderConfig::From(config));
-  EXPECT_FALSE(ptr->extra_data.empty());
-  VideoDecoderConfig result(ptr.To<VideoDecoderConfig>());
-  EXPECT_TRUE(result.Matches(config));
-}
-
-TEST(MediaTypeConvertersTest, ConvertVideoDecoderConfig_EmptyExtraData) {
-  VideoDecoderConfig config(kCodecVP8, VP8PROFILE_ANY, PIXEL_FORMAT_YV12,
-                            COLOR_SPACE_UNSPECIFIED, kCodedSize, kVisibleRect,
-                            kNaturalSize, EmptyExtraData(), Unencrypted());
-  mojom::VideoDecoderConfigPtr ptr(mojom::VideoDecoderConfig::From(config));
-  EXPECT_TRUE(ptr->extra_data.empty());
-  VideoDecoderConfig result(ptr.To<VideoDecoderConfig>());
-  EXPECT_TRUE(result.Matches(config));
-}
-
-TEST(MediaTypeConvertersTest, ConvertVideoDecoderConfig_Encrypted) {
-  VideoDecoderConfig config(kCodecVP8, VP8PROFILE_ANY, PIXEL_FORMAT_YV12,
-                            COLOR_SPACE_UNSPECIFIED, kCodedSize, kVisibleRect,
-                            kNaturalSize, EmptyExtraData(),
-                            AesCtrEncryptionScheme());
-  mojom::VideoDecoderConfigPtr ptr(mojom::VideoDecoderConfig::From(config));
-  VideoDecoderConfig result(ptr.To<VideoDecoderConfig>());
-  EXPECT_TRUE(result.Matches(config));
-}
-
-TEST(MediaTypeConvertersTest, ConvertVideoDecoderConfig_ColorSpaceInfo) {
-  VideoDecoderConfig config(kCodecVP8, VP8PROFILE_ANY, PIXEL_FORMAT_YV12,
-                            COLOR_SPACE_UNSPECIFIED, kCodedSize, kVisibleRect,
-                            kNaturalSize, EmptyExtraData(), Unencrypted());
-  config.set_color_space_info(VideoColorSpace(
-      VideoColorSpace::PrimaryID::BT2020,
-      VideoColorSpace::TransferID::SMPTEST2084,
-      VideoColorSpace::MatrixID::BT2020_CL, gfx::ColorSpace::RangeID::LIMITED));
-  mojom::VideoDecoderConfigPtr ptr(mojom::VideoDecoderConfig::From(config));
-  VideoDecoderConfig result(ptr.To<VideoDecoderConfig>());
-  EXPECT_TRUE(result.Matches(config));
-}
-
-TEST(MediaTypeConvertersTest, ConvertVideoDecoderConfig_HDRMetadata) {
-  VideoDecoderConfig config(kCodecVP8, VP8PROFILE_ANY, PIXEL_FORMAT_YV12,
-                            COLOR_SPACE_UNSPECIFIED, kCodedSize, kVisibleRect,
-                            kNaturalSize, EmptyExtraData(), Unencrypted());
-  HDRMetadata hdr_metadata;
-  hdr_metadata.max_frame_average_light_level = 123;
-  hdr_metadata.max_content_light_level = 456;
-  hdr_metadata.mastering_metadata.primary_r.set_x(0.1f);
-  hdr_metadata.mastering_metadata.primary_r.set_y(0.2f);
-  hdr_metadata.mastering_metadata.primary_g.set_x(0.3f);
-  hdr_metadata.mastering_metadata.primary_g.set_y(0.4f);
-  hdr_metadata.mastering_metadata.primary_b.set_x(0.5f);
-  hdr_metadata.mastering_metadata.primary_b.set_y(0.6f);
-  hdr_metadata.mastering_metadata.white_point.set_x(0.7f);
-  hdr_metadata.mastering_metadata.white_point.set_y(0.8f);
-  hdr_metadata.mastering_metadata.luminance_max = 1000;
-  hdr_metadata.mastering_metadata.luminance_min = 0;
-  config.set_hdr_metadata(hdr_metadata);
-  mojom::VideoDecoderConfigPtr ptr(mojom::VideoDecoderConfig::From(config));
-  VideoDecoderConfig result(ptr.To<VideoDecoderConfig>());
-  EXPECT_TRUE(result.Matches(config));
-}
-
 TEST(MediaTypeConvertersTest, ConvertCdmConfig) {
   CdmConfig config;
   config.allow_distinctive_identifier = true;
@@ -334,20 +224,4 @@
   CompareAudioBuffers(kSampleFormatPlanarF32, buffer, result);
 }
 
-TEST(MediaTypeConvertersTest, ConvertEncryptionSchemeAesCbcWithPattern) {
-  // Original.
-  EncryptionScheme scheme(EncryptionScheme::CIPHER_MODE_AES_CBC,
-                          EncryptionScheme::Pattern(1, 9));
-
-  // Convert to and back.
-  mojom::EncryptionSchemePtr ptr(mojom::EncryptionScheme::From(scheme));
-  EncryptionScheme result(ptr.To<EncryptionScheme>());
-
-  EXPECT_TRUE(result.Matches(scheme));
-
-  // Verify a couple of negative cases.
-  EXPECT_FALSE(result.Matches(Unencrypted()));
-  EXPECT_FALSE(result.Matches(AesCtrEncryptionScheme()));
-}
-
 }  // namespace media
diff --git a/media/mojo/interfaces/BUILD.gn b/media/mojo/interfaces/BUILD.gn
index 9055e38e..ad90949 100644
--- a/media/mojo/interfaces/BUILD.gn
+++ b/media/mojo/interfaces/BUILD.gn
@@ -13,6 +13,7 @@
     "decryptor.mojom",
     "demuxer_stream.mojom",
     "interface_factory.mojom",
+    "media_log.mojom",
     "media_service.mojom",
     "media_types.mojom",
     "output_protection.mojom",
@@ -41,9 +42,6 @@
     "//url/mojo:url_mojom_gurl",
     "//url/mojo:url_mojom_origin",
   ]
-
-  # TODO(crbug.com/714018): Convert the implementation to use OnceCallback.
-  use_once_callback = false
 }
 
 mojom("constants") {
diff --git a/media/mojo/interfaces/audio_decoder_config.typemap b/media/mojo/interfaces/audio_decoder_config.typemap
new file mode 100644
index 0000000..a2d7d1a
--- /dev/null
+++ b/media/mojo/interfaces/audio_decoder_config.typemap
@@ -0,0 +1,27 @@
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+mojom = "//media/mojo/interfaces/media_types.mojom"
+
+public_headers = [ "//media/base/audio_decoder_config.h" ]
+
+traits_headers =
+    [ "//media/mojo/interfaces/audio_decoder_config_struct_traits.h" ]
+
+sources = [
+  "//media/mojo/interfaces/audio_decoder_config_struct_traits.cc",
+]
+
+public_deps = [
+  "//base",
+  "//media",
+]
+
+deps = [
+  "//media/base/ipc",
+  "//mojo/common:struct_traits",
+]
+
+# See media_types.typemap for enum mappings.
+type_mappings = [ "media.mojom.AudioDecoderConfig=media::AudioDecoderConfig" ]
diff --git a/media/mojo/interfaces/audio_decoder_config_struct_traits.cc b/media/mojo/interfaces/audio_decoder_config_struct_traits.cc
new file mode 100644
index 0000000..192e269
--- /dev/null
+++ b/media/mojo/interfaces/audio_decoder_config_struct_traits.cc
@@ -0,0 +1,48 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "media/mojo/interfaces/audio_decoder_config_struct_traits.h"
+
+namespace mojo {
+
+// static
+bool StructTraits<media::mojom::AudioDecoderConfigDataView,
+                  media::AudioDecoderConfig>::
+    Read(media::mojom::AudioDecoderConfigDataView input,
+         media::AudioDecoderConfig* output) {
+  media::AudioCodec codec;
+  if (!input.ReadCodec(&codec))
+    return false;
+
+  media::SampleFormat sample_format;
+  if (!input.ReadSampleFormat(&sample_format))
+    return false;
+
+  media::ChannelLayout channel_layout;
+  if (!input.ReadChannelLayout(&channel_layout))
+    return false;
+
+  std::vector<uint8_t> extra_data;
+  if (!input.ReadExtraData(&extra_data))
+    return false;
+
+  media::EncryptionScheme encryption_scheme;
+  if (!input.ReadEncryptionScheme(&encryption_scheme))
+    return false;
+
+  base::TimeDelta seek_preroll;
+  if (!input.ReadSeekPreroll(&seek_preroll))
+    return false;
+
+  output->Initialize(codec, sample_format, channel_layout,
+                     input.samples_per_second(), extra_data, encryption_scheme,
+                     seek_preroll, input.codec_delay());
+
+  if (!output->IsValidConfig())
+    return false;
+
+  return true;
+}
+
+}  // namespace mojo
\ No newline at end of file
diff --git a/media/mojo/interfaces/audio_decoder_config_struct_traits.h b/media/mojo/interfaces/audio_decoder_config_struct_traits.h
new file mode 100644
index 0000000..81b95bc
--- /dev/null
+++ b/media/mojo/interfaces/audio_decoder_config_struct_traits.h
@@ -0,0 +1,61 @@
+// 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 MEDIA_MOJO_INTERFACES_AUDIO_DECODER_CONFIG_STRUCT_TRAITS_H_
+#define MEDIA_MOJO_INTERFACES_AUDIO_DECODER_CONFIG_STRUCT_TRAITS_H_
+
+#include "media/base/audio_decoder_config.h"
+#include "media/base/ipc/media_param_traits.h"
+#include "media/mojo/interfaces/encryption_scheme_struct_traits.h"
+#include "media/mojo/interfaces/media_types.mojom.h"
+#include "mojo/common/common_custom_types_struct_traits.h"
+
+namespace mojo {
+
+template <>
+struct StructTraits<media::mojom::AudioDecoderConfigDataView,
+                    media::AudioDecoderConfig> {
+  static media::AudioCodec codec(const media::AudioDecoderConfig& input) {
+    return input.codec();
+  }
+
+  static media::SampleFormat sample_format(
+      const media::AudioDecoderConfig& input) {
+    return input.sample_format();
+  }
+
+  static media::ChannelLayout channel_layout(
+      const media::AudioDecoderConfig& input) {
+    return input.channel_layout();
+  }
+
+  static int samples_per_second(const media::AudioDecoderConfig& input) {
+    return input.samples_per_second();
+  }
+
+  static const std::vector<uint8_t>& extra_data(
+      const media::AudioDecoderConfig& input) {
+    return input.extra_data();
+  }
+
+  static base::TimeDelta seek_preroll(const media::AudioDecoderConfig& input) {
+    return input.seek_preroll();
+  }
+
+  static int codec_delay(const media::AudioDecoderConfig& input) {
+    return input.codec_delay();
+  }
+
+  static const media::EncryptionScheme& encryption_scheme(
+      const media::AudioDecoderConfig& input) {
+    return input.encryption_scheme();
+  }
+
+  static bool Read(media::mojom::AudioDecoderConfigDataView input,
+                   media::AudioDecoderConfig* output);
+};
+
+}  // namespace mojo
+
+#endif  // MEDIA_MOJO_INTERFACES_AUDIO_DECODER_CONFIG_STRUCT_TRAITS_H_
diff --git a/media/mojo/interfaces/audio_decoder_config_struct_traits_unittest.cc b/media/mojo/interfaces/audio_decoder_config_struct_traits_unittest.cc
new file mode 100644
index 0000000..0ff6756
--- /dev/null
+++ b/media/mojo/interfaces/audio_decoder_config_struct_traits_unittest.cc
@@ -0,0 +1,58 @@
+// 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 "media/mojo/interfaces/audio_decoder_config_struct_traits.h"
+
+#include <utility>
+
+#include "base/macros.h"
+#include "media/base/audio_decoder_config.h"
+#include "media/base/media_util.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace media {
+
+TEST(AudioDecoderConfigStructTraitsTest, ConvertAudioDecoderConfig_Normal) {
+  const uint8_t kExtraData[] = "input extra data";
+  const std::vector<uint8_t> kExtraDataVector(
+      &kExtraData[0], &kExtraData[0] + arraysize(kExtraData));
+
+  AudioDecoderConfig input;
+  input.Initialize(kCodecAAC, kSampleFormatU8, CHANNEL_LAYOUT_SURROUND, 48000,
+                   kExtraDataVector, Unencrypted(), base::TimeDelta(), 0);
+  std::vector<uint8_t> data =
+      media::mojom::AudioDecoderConfig::Serialize(&input);
+  AudioDecoderConfig output;
+  EXPECT_TRUE(
+      media::mojom::AudioDecoderConfig::Deserialize(std::move(data), &output));
+  EXPECT_TRUE(output.Matches(input));
+}
+
+TEST(AudioDecoderConfigStructTraitsTest,
+     ConvertAudioDecoderConfig_EmptyExtraData) {
+  AudioDecoderConfig input;
+  input.Initialize(kCodecAAC, kSampleFormatU8, CHANNEL_LAYOUT_SURROUND, 48000,
+                   EmptyExtraData(), Unencrypted(), base::TimeDelta(), 0);
+  std::vector<uint8_t> data =
+      media::mojom::AudioDecoderConfig::Serialize(&input);
+  AudioDecoderConfig output;
+  EXPECT_TRUE(
+      media::mojom::AudioDecoderConfig::Deserialize(std::move(data), &output));
+  EXPECT_TRUE(output.Matches(input));
+}
+
+TEST(AudioDecoderConfigStructTraitsTest, ConvertAudioDecoderConfig_Encrypted) {
+  AudioDecoderConfig input;
+  input.Initialize(kCodecAAC, kSampleFormatU8, CHANNEL_LAYOUT_SURROUND, 48000,
+                   EmptyExtraData(), AesCtrEncryptionScheme(),
+                   base::TimeDelta(), 0);
+  std::vector<uint8_t> data =
+      media::mojom::AudioDecoderConfig::Serialize(&input);
+  AudioDecoderConfig output;
+  EXPECT_TRUE(
+      media::mojom::AudioDecoderConfig::Deserialize(std::move(data), &output));
+  EXPECT_TRUE(output.Matches(input));
+}
+
+}  // namespace media
diff --git a/media/mojo/interfaces/encryption_scheme.typemap b/media/mojo/interfaces/encryption_scheme.typemap
new file mode 100644
index 0000000..13a2c655
--- /dev/null
+++ b/media/mojo/interfaces/encryption_scheme.typemap
@@ -0,0 +1,27 @@
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+mojom = "//media/mojo/interfaces/media_types.mojom"
+
+public_headers = [ "//media/base/encryption_scheme.h" ]
+
+traits_headers = [ "//media/mojo/interfaces/encryption_scheme_struct_traits.h" ]
+
+sources = [
+  "//media/mojo/interfaces/encryption_scheme_struct_traits.cc",
+]
+
+public_deps = [
+  "//media",
+]
+
+deps = [
+  "//media/base/ipc",
+]
+
+# See media_types.typemap for enum mappings.
+type_mappings = [
+  "media.mojom.Pattern=media::EncryptionScheme::Pattern",
+  "media.mojom.EncryptionScheme=media::EncryptionScheme",
+]
diff --git a/media/mojo/interfaces/encryption_scheme_struct_traits.cc b/media/mojo/interfaces/encryption_scheme_struct_traits.cc
new file mode 100644
index 0000000..e2052a93
--- /dev/null
+++ b/media/mojo/interfaces/encryption_scheme_struct_traits.cc
@@ -0,0 +1,37 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "media/mojo/interfaces/encryption_scheme_struct_traits.h"
+
+namespace mojo {
+
+// static
+bool StructTraits<media::mojom::PatternDataView,
+                  media::EncryptionScheme::Pattern>::
+    Read(media::mojom::PatternDataView input,
+         media::EncryptionScheme::Pattern* output) {
+  *output = media::EncryptionScheme::Pattern(input.encrypt_blocks(),
+                                             input.skip_blocks());
+  return true;
+}
+
+// static
+bool StructTraits<
+    media::mojom::EncryptionSchemeDataView,
+    media::EncryptionScheme>::Read(media::mojom::EncryptionSchemeDataView input,
+                                   media::EncryptionScheme* output) {
+  media::EncryptionScheme::CipherMode mode;
+  if (!input.ReadMode(&mode))
+    return false;
+
+  media::EncryptionScheme::Pattern pattern;
+  if (!input.ReadPattern(&pattern))
+    return false;
+
+  *output = media::EncryptionScheme(mode, pattern);
+
+  return true;
+}
+
+}  // namespace mojo
\ No newline at end of file
diff --git a/media/mojo/interfaces/encryption_scheme_struct_traits.h b/media/mojo/interfaces/encryption_scheme_struct_traits.h
new file mode 100644
index 0000000..7eaa35a
--- /dev/null
+++ b/media/mojo/interfaces/encryption_scheme_struct_traits.h
@@ -0,0 +1,49 @@
+// 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 MEDIA_MOJO_INTERFACES_ENCRYPTION_SCHEME_STRUCT_TRAITS_H_
+#define MEDIA_MOJO_INTERFACES_ENCRYPTION_SCHEME_STRUCT_TRAITS_H_
+
+#include "media/base/encryption_scheme.h"
+#include "media/base/ipc/media_param_traits.h"
+#include "media/mojo/interfaces/media_types.mojom.h"
+
+namespace mojo {
+
+template <>
+struct StructTraits<media::mojom::PatternDataView,
+                    media::EncryptionScheme::Pattern> {
+  static uint32_t encrypt_blocks(
+      const media::EncryptionScheme::Pattern& input) {
+    return input.encrypt_blocks();
+  }
+
+  static uint32_t skip_blocks(const media::EncryptionScheme::Pattern& input) {
+    return input.skip_blocks();
+  }
+
+  static bool Read(media::mojom::PatternDataView input,
+                   media::EncryptionScheme::Pattern* output);
+};
+
+template <>
+struct StructTraits<media::mojom::EncryptionSchemeDataView,
+                    media::EncryptionScheme> {
+  static media::EncryptionScheme::CipherMode mode(
+      const media::EncryptionScheme& input) {
+    return input.mode();
+  }
+
+  static media::EncryptionScheme::Pattern pattern(
+      const media::EncryptionScheme& input) {
+    return input.pattern();
+  }
+
+  static bool Read(media::mojom::EncryptionSchemeDataView input,
+                   media::EncryptionScheme* output);
+};
+
+}  // namespace mojo
+
+#endif  // MEDIA_MOJO_INTERFACES_ENCRYPTION_SCHEME_STRUCT_TRAITS_H_
diff --git a/media/mojo/interfaces/encryption_scheme_struct_traits_unittest.cc b/media/mojo/interfaces/encryption_scheme_struct_traits_unittest.cc
new file mode 100644
index 0000000..cb017a3f
--- /dev/null
+++ b/media/mojo/interfaces/encryption_scheme_struct_traits_unittest.cc
@@ -0,0 +1,31 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "media/mojo/interfaces/encryption_scheme_struct_traits.h"
+
+#include <utility>
+
+#include "media/base/encryption_scheme.h"
+#include "media/base/media_util.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace media {
+
+TEST(EncryptionSchemeStructTraitsTest,
+     ConvertEncryptionSchemeAesCbcWithPattern) {
+  EncryptionScheme input(EncryptionScheme::CIPHER_MODE_AES_CBC,
+                         EncryptionScheme::Pattern(1, 9));
+  std::vector<uint8_t> data = media::mojom::EncryptionScheme::Serialize(&input);
+
+  EncryptionScheme output;
+  EXPECT_TRUE(
+      media::mojom::EncryptionScheme::Deserialize(std::move(data), &output));
+  EXPECT_TRUE(output.Matches(input));
+
+  // Verify a couple of negative cases.
+  EXPECT_FALSE(output.Matches(Unencrypted()));
+  EXPECT_FALSE(output.Matches(AesCtrEncryptionScheme()));
+}
+
+}  // namespace media
diff --git a/media/mojo/interfaces/media_log.mojom b/media/mojo/interfaces/media_log.mojom
new file mode 100644
index 0000000..05f3b64
--- /dev/null
+++ b/media/mojo/interfaces/media_log.mojom
@@ -0,0 +1,11 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module media.mojom;
+
+import "media/mojo/interfaces/media_types.mojom";
+
+interface MediaLog {
+  AddEvent(MediaLogEvent event);
+};
diff --git a/media/mojo/interfaces/media_types.mojom b/media/mojo/interfaces/media_types.mojom
index 5448756c..bb40ad4f 100644
--- a/media/mojo/interfaces/media_types.mojom
+++ b/media/mojo/interfaces/media_types.mojom
@@ -8,21 +8,29 @@
 import "mojo/common/time.mojom";
 import "ui/gfx/geometry/mojo/geometry.mojom";
 
+// See media/base/audio_codecs.h for descriptions.
+[Native]
+enum AudioCodec;
+
 // See media/base/buffering_state.h for descriptions.
 [Native]
 enum BufferingState;
 
+// See media/base/channel_layout.h for descriptions.
+[Native]
+enum ChannelLayout;
+
+// See media/base/video_types.h for descriptions.
+[Native]
+enum ColorSpace;
+
 // See media/base/decode_status.h for descriptions.
 [Native]
 enum DecodeStatus;
 
-// See media/base/audio_codecs.h for descriptions.
+// See media/base/media_log_event.h for description.
 [Native]
-enum AudioCodec;
-
-// See media/base/channel_layout.h for descriptions.
-[Native]
-enum ChannelLayout;
+struct MediaLogEvent;
 
 // See media/base/output_device_info.h for descriptions.
 [Native]
@@ -32,14 +40,6 @@
 [Native]
 enum SampleFormat;
 
-// See media/base/video_types.h for descriptions.
-[Native]
-enum VideoPixelFormat;
-
-// See media/base/video_types.h for descriptions.
-[Native]
-enum ColorSpace;
-
 // See media/base/video_codecs.h for descriptions.
 [Native]
 enum VideoCodec;
@@ -48,6 +48,10 @@
 [Native]
 enum VideoCodecProfile;
 
+// See media/base/video_types.h for descriptions.
+[Native]
+enum VideoPixelFormat;
+
 // This defines a mojo transport format for media::EncryptionScheme::Pattern
 // See media/base/encryption_scheme.h for description.
 struct Pattern {
diff --git a/media/mojo/interfaces/media_types.typemap b/media/mojo/interfaces/media_types.typemap
index cc8b655..f885864 100644
--- a/media/mojo/interfaces/media_types.typemap
+++ b/media/mojo/interfaces/media_types.typemap
@@ -11,6 +11,7 @@
   "//media/base/decode_status.h",
   "//media/base/encryption_scheme.h",
   "//media/base/hdr_metadata.h",
+  "//media/base/media_log_event.h",
   "//media/base/output_device_info.h",
   "//media/base/sample_format.h",
   "//media/base/subsample_entry.h",
@@ -35,6 +36,7 @@
   "media.mojom.ColorSpace=media::ColorSpace",
   "media.mojom.DecodeStatus=media::DecodeStatus",
   "media.mojom.EncryptionScheme.CipherMode=media::EncryptionScheme::CipherMode",
+  "media.mojom.MediaLogEvent=media::MediaLogEvent",
   "media.mojom.OutputDeviceStatus=media::OutputDeviceStatus",
   "media.mojom.SampleFormat=media::SampleFormat",
   "media.mojom.SubsampleEntry=media::SubsampleEntry",
diff --git a/media/mojo/interfaces/typemaps.gni b/media/mojo/interfaces/typemaps.gni
index f485f00..1785024 100644
--- a/media/mojo/interfaces/typemaps.gni
+++ b/media/mojo/interfaces/typemaps.gni
@@ -3,13 +3,16 @@
 # found in the LICENSE file.
 
 typemaps = [
+  "//media/mojo/interfaces/audio_decoder_config.typemap",
   "//media/mojo/interfaces/audio_parameters.typemap",
   "//media/mojo/interfaces/content_decryption_module.typemap",
   "//media/mojo/interfaces/decryptor.typemap",
   "//media/mojo/interfaces/demuxer_stream.typemap",
+  "//media/mojo/interfaces/encryption_scheme.typemap",
   "//media/mojo/interfaces/hdr_metadata.typemap",
   "//media/mojo/interfaces/media_types.typemap",
   "//media/mojo/interfaces/pipeline_statistics.typemap",
   "//media/mojo/interfaces/video_color_space.typemap",
+  "//media/mojo/interfaces/video_decoder_config.typemap",
   "//media/mojo/interfaces/video_frame.typemap",
 ]
diff --git a/media/mojo/interfaces/video_decoder.mojom b/media/mojo/interfaces/video_decoder.mojom
index 36ae91f..3b1430d 100644
--- a/media/mojo/interfaces/video_decoder.mojom
+++ b/media/mojo/interfaces/video_decoder.mojom
@@ -5,6 +5,7 @@
 module media.mojom;
 
 import "gpu/ipc/common/sync_token.mojom";
+import "media/mojo/interfaces/media_log.mojom";
 import "media/mojo/interfaces/media_types.mojom";
 import "mojo/common/unguessable_token.mojom";
 
@@ -28,6 +29,7 @@
   // TODO(sandersd): Rename to Initialize() if/when
   // media::VideoDecoder::Initialize() is renamed to Configure().
   Construct(associated VideoDecoderClient client,
+            associated MediaLog media_log,
             handle<data_pipe_consumer> decoder_buffer_pipe,
             CommandBufferId? command_buffer_id);
 
diff --git a/media/mojo/interfaces/video_decoder_config.typemap b/media/mojo/interfaces/video_decoder_config.typemap
new file mode 100644
index 0000000..41fbc5b
--- /dev/null
+++ b/media/mojo/interfaces/video_decoder_config.typemap
@@ -0,0 +1,27 @@
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+mojom = "//media/mojo/interfaces/media_types.mojom"
+
+public_headers = [ "//media/base/video_decoder_config.h" ]
+
+traits_headers =
+    [ "//media/mojo/interfaces/video_decoder_config_struct_traits.h" ]
+
+sources = [
+  "video_decoder_config_struct_traits.cc",
+]
+
+public_deps = [
+  "//base",
+  "//media",
+]
+
+deps = [
+  "//media/base/ipc",
+  "//ui/gfx/geometry/mojo:struct_traits",
+]
+
+# See media_types.typemap for enum mappings.
+type_mappings = [ "media.mojom.VideoDecoderConfig=media::VideoDecoderConfig" ]
diff --git a/media/mojo/interfaces/video_decoder_config_struct_traits.cc b/media/mojo/interfaces/video_decoder_config_struct_traits.cc
new file mode 100644
index 0000000..3e2c2457
--- /dev/null
+++ b/media/mojo/interfaces/video_decoder_config_struct_traits.cc
@@ -0,0 +1,72 @@
+// 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 "media/mojo/interfaces/video_decoder_config_struct_traits.h"
+
+namespace mojo {
+
+// static
+bool StructTraits<media::mojom::VideoDecoderConfigDataView,
+                  media::VideoDecoderConfig>::
+    Read(media::mojom::VideoDecoderConfigDataView input,
+         media::VideoDecoderConfig* output) {
+  media::VideoCodec codec;
+  if (!input.ReadCodec(&codec))
+    return false;
+
+  media::VideoCodecProfile profile;
+  if (!input.ReadProfile(&profile))
+    return false;
+
+  media::VideoPixelFormat format;
+  if (!input.ReadFormat(&format))
+    return false;
+
+  media::ColorSpace color_space;
+  if (!input.ReadColorSpace(&color_space))
+    return false;
+
+  gfx::Size coded_size;
+  if (!input.ReadCodedSize(&coded_size))
+    return false;
+
+  gfx::Rect visible_rect;
+  if (!input.ReadVisibleRect(&visible_rect))
+    return false;
+
+  gfx::Size natural_size;
+  if (!input.ReadNaturalSize(&natural_size))
+    return false;
+
+  std::vector<uint8_t> extra_data;
+  if (!input.ReadExtraData(&extra_data))
+    return false;
+
+  media::EncryptionScheme encryption_scheme;
+  if (!input.ReadEncryptionScheme(&encryption_scheme))
+    return false;
+
+  media::VideoColorSpace color_space_info;
+  if (!input.ReadColorSpaceInfo(&color_space_info))
+    return false;
+
+  base::Optional<media::HDRMetadata> hdr_metadata;
+  if (!input.ReadHdrMetadata(&hdr_metadata))
+    return false;
+
+  output->Initialize(codec, profile, format, color_space, coded_size,
+                     visible_rect, natural_size, extra_data, encryption_scheme);
+
+  output->set_color_space_info(color_space_info);
+
+  if (hdr_metadata)
+    output->set_hdr_metadata(hdr_metadata.value());
+
+  if (!output->IsValidConfig())
+    return false;
+
+  return true;
+}
+
+}  // namespace mojo
\ No newline at end of file
diff --git a/media/mojo/interfaces/video_decoder_config_struct_traits.h b/media/mojo/interfaces/video_decoder_config_struct_traits.h
new file mode 100644
index 0000000..c6cbb52
--- /dev/null
+++ b/media/mojo/interfaces/video_decoder_config_struct_traits.h
@@ -0,0 +1,77 @@
+// 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 MEDIA_MOJO_INTERFACES_VIDEO_DECODER_CONFIG_STRUCT_TRAITS_H_
+#define MEDIA_MOJO_INTERFACES_VIDEO_DECODER_CONFIG_STRUCT_TRAITS_H_
+
+#include "media/base/ipc/media_param_traits.h"
+#include "media/base/video_decoder_config.h"
+#include "media/mojo/interfaces/encryption_scheme_struct_traits.h"
+#include "media/mojo/interfaces/hdr_metadata_struct_traits.h"
+#include "media/mojo/interfaces/media_types.mojom.h"
+#include "media/mojo/interfaces/video_color_space_struct_traits.h"
+#include "ui/gfx/geometry/mojo/geometry_struct_traits.h"
+
+namespace mojo {
+
+template <>
+struct StructTraits<media::mojom::VideoDecoderConfigDataView,
+                    media::VideoDecoderConfig> {
+  static media::VideoCodec codec(const media::VideoDecoderConfig& input) {
+    return input.codec();
+  }
+
+  static media::VideoCodecProfile profile(
+      const media::VideoDecoderConfig& input) {
+    return input.profile();
+  }
+
+  static media::VideoPixelFormat format(
+      const media::VideoDecoderConfig& input) {
+    return input.format();
+  }
+
+  static media::ColorSpace color_space(const media::VideoDecoderConfig& input) {
+    return input.color_space();
+  }
+
+  static const gfx::Size& coded_size(const media::VideoDecoderConfig& input) {
+    return input.coded_size();
+  }
+
+  static const gfx::Rect& visible_rect(const media::VideoDecoderConfig& input) {
+    return input.visible_rect();
+  }
+
+  static const gfx::Size& natural_size(const media::VideoDecoderConfig& input) {
+    return input.natural_size();
+  }
+
+  static const std::vector<uint8_t>& extra_data(
+      const media::VideoDecoderConfig& input) {
+    return input.extra_data();
+  }
+
+  static const media::EncryptionScheme& encryption_scheme(
+      const media::VideoDecoderConfig& input) {
+    return input.encryption_scheme();
+  }
+
+  static const media::VideoColorSpace& color_space_info(
+      const media::VideoDecoderConfig& input) {
+    return input.color_space_info();
+  }
+
+  static const base::Optional<media::HDRMetadata>& hdr_metadata(
+      const media::VideoDecoderConfig& input) {
+    return input.hdr_metadata();
+  }
+
+  static bool Read(media::mojom::VideoDecoderConfigDataView input,
+                   media::VideoDecoderConfig* output);
+};
+
+}  // namespace mojo
+
+#endif  // MEDIA_MOJO_INTERFACES_VIDEO_DECODER_CONFIG_STRUCT_TRAITS_H_
diff --git a/media/mojo/interfaces/video_decoder_config_struct_traits_unittest.cc b/media/mojo/interfaces/video_decoder_config_struct_traits_unittest.cc
new file mode 100644
index 0000000..3b49841
--- /dev/null
+++ b/media/mojo/interfaces/video_decoder_config_struct_traits_unittest.cc
@@ -0,0 +1,135 @@
+// 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 "media/mojo/interfaces/video_decoder_config_struct_traits.h"
+
+#include <utility>
+
+#include "base/macros.h"
+#include "media/base/media_util.h"
+#include "media/base/video_decoder_config.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace media {
+
+namespace {
+
+static const gfx::Size kCodedSize(320, 240);
+static const gfx::Rect kVisibleRect(320, 240);
+static const gfx::Size kNaturalSize(320, 240);
+
+}  // namespace
+
+TEST(VideoDecoderConfigStructTraitsTest, ConvertVideoDecoderConfig_Normal) {
+  const uint8_t kExtraData[] = "config extra data";
+  const std::vector<uint8_t> kExtraDataVector(
+      &kExtraData[0], &kExtraData[0] + arraysize(kExtraData));
+  VideoDecoderConfig input(kCodecVP8, VP8PROFILE_ANY, PIXEL_FORMAT_YV12,
+                           COLOR_SPACE_UNSPECIFIED, kCodedSize, kVisibleRect,
+                           kNaturalSize, kExtraDataVector, Unencrypted());
+  std::vector<uint8_t> data =
+      media::mojom::VideoDecoderConfig::Serialize(&input);
+  VideoDecoderConfig output;
+  EXPECT_TRUE(
+      media::mojom::VideoDecoderConfig::Deserialize(std::move(data), &output));
+  EXPECT_TRUE(output.Matches(input));
+}
+
+TEST(VideoDecoderConfigStructTraitsTest,
+     ConvertVideoDecoderConfig_EmptyExtraData) {
+  VideoDecoderConfig input(kCodecVP8, VP8PROFILE_ANY, PIXEL_FORMAT_YV12,
+                           COLOR_SPACE_UNSPECIFIED, kCodedSize, kVisibleRect,
+                           kNaturalSize, EmptyExtraData(), Unencrypted());
+  std::vector<uint8_t> data =
+      media::mojom::VideoDecoderConfig::Serialize(&input);
+  VideoDecoderConfig output;
+  EXPECT_TRUE(
+      media::mojom::VideoDecoderConfig::Deserialize(std::move(data), &output));
+  EXPECT_TRUE(output.Matches(input));
+}
+
+TEST(VideoDecoderConfigStructTraitsTest, ConvertVideoDecoderConfig_Encrypted) {
+  VideoDecoderConfig input(kCodecVP8, VP8PROFILE_ANY, PIXEL_FORMAT_YV12,
+                           COLOR_SPACE_UNSPECIFIED, kCodedSize, kVisibleRect,
+                           kNaturalSize, EmptyExtraData(),
+                           AesCtrEncryptionScheme());
+  std::vector<uint8_t> data =
+      media::mojom::VideoDecoderConfig::Serialize(&input);
+  VideoDecoderConfig output;
+  EXPECT_TRUE(
+      media::mojom::VideoDecoderConfig::Deserialize(std::move(data), &output));
+  EXPECT_TRUE(output.Matches(input));
+}
+
+TEST(VideoDecoderConfigStructTraitsTest,
+     ConvertVideoDecoderConfig_ColorSpaceInfo) {
+  VideoDecoderConfig input(kCodecVP8, VP8PROFILE_ANY, PIXEL_FORMAT_YV12,
+                           COLOR_SPACE_UNSPECIFIED, kCodedSize, kVisibleRect,
+                           kNaturalSize, EmptyExtraData(), Unencrypted());
+  input.set_color_space_info(VideoColorSpace(
+      VideoColorSpace::PrimaryID::BT2020,
+      VideoColorSpace::TransferID::SMPTEST2084,
+      VideoColorSpace::MatrixID::BT2020_CL, gfx::ColorSpace::RangeID::LIMITED));
+  std::vector<uint8_t> data =
+      media::mojom::VideoDecoderConfig::Serialize(&input);
+  VideoDecoderConfig output;
+  EXPECT_TRUE(
+      media::mojom::VideoDecoderConfig::Deserialize(std::move(data), &output));
+  EXPECT_TRUE(output.Matches(input));
+}
+
+TEST(VideoDecoderConfigStructTraitsTest,
+     ConvertVideoDecoderConfig_HDRMetadata) {
+  VideoDecoderConfig input(kCodecVP8, VP8PROFILE_ANY, PIXEL_FORMAT_YV12,
+                           COLOR_SPACE_UNSPECIFIED, kCodedSize, kVisibleRect,
+                           kNaturalSize, EmptyExtraData(), Unencrypted());
+  HDRMetadata hdr_metadata;
+  hdr_metadata.max_frame_average_light_level = 123;
+  hdr_metadata.max_content_light_level = 456;
+  hdr_metadata.mastering_metadata.primary_r.set_x(0.1f);
+  hdr_metadata.mastering_metadata.primary_r.set_y(0.2f);
+  hdr_metadata.mastering_metadata.primary_g.set_x(0.3f);
+  hdr_metadata.mastering_metadata.primary_g.set_y(0.4f);
+  hdr_metadata.mastering_metadata.primary_b.set_x(0.5f);
+  hdr_metadata.mastering_metadata.primary_b.set_y(0.6f);
+  hdr_metadata.mastering_metadata.white_point.set_x(0.7f);
+  hdr_metadata.mastering_metadata.white_point.set_y(0.8f);
+  hdr_metadata.mastering_metadata.luminance_max = 1000;
+  hdr_metadata.mastering_metadata.luminance_min = 0;
+  input.set_hdr_metadata(hdr_metadata);
+  std::vector<uint8_t> data =
+      media::mojom::VideoDecoderConfig::Serialize(&input);
+  VideoDecoderConfig output;
+  EXPECT_TRUE(
+      media::mojom::VideoDecoderConfig::Deserialize(std::move(data), &output));
+  EXPECT_TRUE(output.Matches(input));
+}
+
+TEST(VideoDecoderConfigStructTraitsTest,
+     ConvertVideoDecoderConfig_InvalidConfigs) {
+  // Create an invalid empty config.
+  VideoDecoderConfig input;
+  EXPECT_FALSE(input.IsValidConfig());
+
+  std::vector<uint8_t> data =
+      media::mojom::VideoDecoderConfig::Serialize(&input);
+  VideoDecoderConfig output;
+
+  // Deserialize should only pass for valid configs.
+  EXPECT_FALSE(
+      media::mojom::VideoDecoderConfig::Deserialize(std::move(data), &output));
+
+  // Next try an non-empty invalid config. Natural size must not be zero.
+  const gfx::Size kInvalidNaturalSize(0, 0);
+  input.Initialize(kCodecVP8, VP8PROFILE_ANY, PIXEL_FORMAT_YV12,
+                   COLOR_SPACE_UNSPECIFIED, kCodedSize, kVisibleRect,
+                   kInvalidNaturalSize, EmptyExtraData(), Unencrypted());
+  EXPECT_FALSE(input.IsValidConfig());
+
+  // Deserialize should again fail due to invalid config.
+  EXPECT_FALSE(
+      media::mojom::VideoDecoderConfig::Deserialize(std::move(data), &output));
+}
+
+}  // namespace media
diff --git a/media/mojo/services/BUILD.gn b/media/mojo/services/BUILD.gn
index 87b60ed..8cd21c59 100644
--- a/media/mojo/services/BUILD.gn
+++ b/media/mojo/services/BUILD.gn
@@ -55,6 +55,8 @@
     "mojo_demuxer_stream_adapter.h",
     "mojo_media_client.cc",
     "mojo_media_client.h",
+    "mojo_media_log.cc",
+    "mojo_media_log.h",
     "mojo_provision_fetcher.cc",
     "mojo_provision_fetcher.h",
     "mojo_renderer_service.cc",
diff --git a/media/mojo/services/gpu_mojo_media_client.cc b/media/mojo/services/gpu_mojo_media_client.cc
index 786b64c..b46d574 100644
--- a/media/mojo/services/gpu_mojo_media_client.cc
+++ b/media/mojo/services/gpu_mojo_media_client.cc
@@ -68,6 +68,7 @@
 
 std::unique_ptr<VideoDecoder> GpuMojoMediaClient::CreateVideoDecoder(
     scoped_refptr<base::SingleThreadTaskRunner> task_runner,
+    MediaLog* media_log,
     mojom::CommandBufferIdPtr command_buffer_id,
     OutputWithReleaseMailboxCB output_cb) {
   static_cast<void>(media_gpu_channel_manager_);
diff --git a/media/mojo/services/gpu_mojo_media_client.h b/media/mojo/services/gpu_mojo_media_client.h
index 9be197bc..a3c6cb40 100644
--- a/media/mojo/services/gpu_mojo_media_client.h
+++ b/media/mojo/services/gpu_mojo_media_client.h
@@ -31,6 +31,7 @@
       scoped_refptr<base::SingleThreadTaskRunner> task_runner) final;
   std::unique_ptr<VideoDecoder> CreateVideoDecoder(
       scoped_refptr<base::SingleThreadTaskRunner> task_runner,
+      MediaLog* media_log,
       mojom::CommandBufferIdPtr command_buffer_id,
       OutputWithReleaseMailboxCB output_cb) final;
   std::unique_ptr<CdmFactory> CreateCdmFactory(
diff --git a/media/mojo/services/mojo_audio_decoder_service.cc b/media/mojo/services/mojo_audio_decoder_service.cc
index 2fd18de..c11f536 100644
--- a/media/mojo/services/mojo_audio_decoder_service.cc
+++ b/media/mojo/services/mojo_audio_decoder_service.cc
@@ -32,42 +32,40 @@
   client_.Bind(std::move(client));
 }
 
-void MojoAudioDecoderService::Initialize(
-    mojom::AudioDecoderConfigPtr config,
-    int32_t cdm_id,
-    const InitializeCallback& callback) {
-  DVLOG(1) << __func__ << " "
-           << config.To<media::AudioDecoderConfig>().AsHumanReadableString();
+void MojoAudioDecoderService::Initialize(const AudioDecoderConfig& config,
+                                         int32_t cdm_id,
+                                         InitializeCallback callback) {
+  DVLOG(1) << __func__ << " " << config.AsHumanReadableString();
 
   // Get CdmContext from cdm_id if the stream is encrypted.
   CdmContext* cdm_context = nullptr;
   scoped_refptr<ContentDecryptionModule> cdm;
-  if (config.To<media::AudioDecoderConfig>().is_encrypted()) {
+  if (config.is_encrypted()) {
     if (!mojo_cdm_service_context_) {
       DVLOG(1) << "CDM service context not available.";
-      callback.Run(false, false);
+      std::move(callback).Run(false, false);
       return;
     }
 
     cdm = mojo_cdm_service_context_->GetCdm(cdm_id);
     if (!cdm) {
       DVLOG(1) << "CDM not found for CDM id: " << cdm_id;
-      callback.Run(false, false);
+      std::move(callback).Run(false, false);
       return;
     }
 
     cdm_context = cdm->GetCdmContext();
     if (!cdm_context) {
       DVLOG(1) << "CDM context not available for CDM id: " << cdm_id;
-      callback.Run(false, false);
+      std::move(callback).Run(false, false);
       return;
     }
   }
 
   decoder_->Initialize(
-      config.To<media::AudioDecoderConfig>(), cdm_context,
-      base::Bind(&MojoAudioDecoderService::OnInitialized, weak_this_, callback,
-                 cdm),
+      config, cdm_context,
+      base::Bind(&MojoAudioDecoderService::OnInitialized, weak_this_,
+                 base::Passed(&callback), cdm),
       base::Bind(&MojoAudioDecoderService::OnAudioBufferReady, weak_this_));
 }
 
@@ -80,31 +78,31 @@
 }
 
 void MojoAudioDecoderService::Decode(mojom::DecoderBufferPtr buffer,
-                                     const DecodeCallback& callback) {
+                                     DecodeCallback callback) {
   DVLOG(3) << __func__;
   mojo_decoder_buffer_reader_->ReadDecoderBuffer(
       std::move(buffer), base::BindOnce(&MojoAudioDecoderService::OnReadDone,
-                                        weak_this_, callback));
+                                        weak_this_, std::move(callback)));
 }
 
-void MojoAudioDecoderService::Reset(const ResetCallback& callback) {
+void MojoAudioDecoderService::Reset(ResetCallback callback) {
   DVLOG(1) << __func__;
-  decoder_->Reset(
-      base::Bind(&MojoAudioDecoderService::OnResetDone, weak_this_, callback));
+  decoder_->Reset(base::Bind(&MojoAudioDecoderService::OnResetDone, weak_this_,
+                             base::Passed(&callback)));
 }
 
 void MojoAudioDecoderService::OnInitialized(
-    const InitializeCallback& callback,
+    InitializeCallback callback,
     scoped_refptr<ContentDecryptionModule> cdm,
     bool success) {
   DVLOG(1) << __func__ << " success:" << success;
 
   if (success) {
     cdm_ = cdm;
-    callback.Run(success, decoder_->NeedsBitstreamConversion());
+    std::move(callback).Run(success, decoder_->NeedsBitstreamConversion());
   } else {
     // Do not call decoder_->NeedsBitstreamConversion() if init failed.
-    callback.Run(false, false);
+    std::move(callback).Run(false, false);
   }
 }
 
@@ -112,28 +110,28 @@
 // to avoid running the |callback| after connection error happens and |this| is
 // deleted. It's not safe to run the |callback| after a connection error.
 
-void MojoAudioDecoderService::OnReadDone(const DecodeCallback& callback,
+void MojoAudioDecoderService::OnReadDone(DecodeCallback callback,
                                          scoped_refptr<DecoderBuffer> buffer) {
   DVLOG(3) << __func__ << " success:" << !!buffer;
 
   if (!buffer) {
-    callback.Run(DecodeStatus::DECODE_ERROR);
+    std::move(callback).Run(DecodeStatus::DECODE_ERROR);
     return;
   }
 
   decoder_->Decode(buffer, base::Bind(&MojoAudioDecoderService::OnDecodeStatus,
-                                      weak_this_, callback));
+                                      weak_this_, base::Passed(&callback)));
 }
 
-void MojoAudioDecoderService::OnDecodeStatus(const DecodeCallback& callback,
+void MojoAudioDecoderService::OnDecodeStatus(DecodeCallback callback,
                                              media::DecodeStatus status) {
   DVLOG(3) << __func__ << " status:" << status;
-  callback.Run(status);
+  std::move(callback).Run(status);
 }
 
-void MojoAudioDecoderService::OnResetDone(const ResetCallback& callback) {
+void MojoAudioDecoderService::OnResetDone(ResetCallback callback) {
   DVLOG(1) << __func__;
-  callback.Run();
+  std::move(callback).Run();
 }
 
 void MojoAudioDecoderService::OnAudioBufferReady(
diff --git a/media/mojo/services/mojo_audio_decoder_service.h b/media/mojo/services/mojo_audio_decoder_service.h
index 6230892..37b27957 100644
--- a/media/mojo/services/mojo_audio_decoder_service.h
+++ b/media/mojo/services/mojo_audio_decoder_service.h
@@ -32,32 +32,29 @@
 
   // mojom::AudioDecoder implementation
   void Construct(mojom::AudioDecoderClientAssociatedPtrInfo client) final;
-  void Initialize(mojom::AudioDecoderConfigPtr config,
+  void Initialize(const AudioDecoderConfig& config,
                   int32_t cdm_id,
-                  const InitializeCallback& callback) final;
+                  InitializeCallback callback) final;
 
   void SetDataSource(mojo::ScopedDataPipeConsumerHandle receive_pipe) final;
 
-  void Decode(mojom::DecoderBufferPtr buffer,
-              const DecodeCallback& callback) final;
+  void Decode(mojom::DecoderBufferPtr buffer, DecodeCallback callback) final;
 
-  void Reset(const ResetCallback& callback) final;
+  void Reset(ResetCallback callback) final;
 
  private:
   // Called by |decoder_| upon finishing initialization.
-  void OnInitialized(const InitializeCallback& callback,
+  void OnInitialized(InitializeCallback callback,
                      scoped_refptr<ContentDecryptionModule> cdm,
                      bool success);
 
-  void OnReadDone(const DecodeCallback& callback,
-                  scoped_refptr<DecoderBuffer> buffer);
+  void OnReadDone(DecodeCallback callback, scoped_refptr<DecoderBuffer> buffer);
 
   // Called by |decoder_| when DecoderBuffer is accepted or rejected.
-  void OnDecodeStatus(const DecodeCallback& callback,
-                      media::DecodeStatus status);
+  void OnDecodeStatus(DecodeCallback callback, media::DecodeStatus status);
 
   // Called by |decoder_| when reset sequence is finished.
-  void OnResetDone(const ResetCallback& callback);
+  void OnResetDone(ResetCallback callback);
 
   // Called by |decoder_| for each decoded buffer.
   void OnAudioBufferReady(const scoped_refptr<AudioBuffer>& audio_buffer);
diff --git a/media/mojo/services/mojo_audio_output_stream_provider.cc b/media/mojo/services/mojo_audio_output_stream_provider.cc
index 6141a48..01ec1422 100644
--- a/media/mojo/services/mojo_audio_output_stream_provider.cc
+++ b/media/mojo/services/mojo_audio_output_stream_provider.cc
@@ -30,7 +30,7 @@
 void MojoAudioOutputStreamProvider::Acquire(
     mojom::AudioOutputStreamRequest stream_request,
     const AudioParameters& params,
-    const AcquireCallback& callback) {
+    AcquireCallback callback) {
   DCHECK(thread_checker_.CalledOnValidThread());
   if (audio_output_) {
     LOG(ERROR) << "Output acquired twice.";
diff --git a/media/mojo/services/mojo_audio_output_stream_provider.h b/media/mojo/services/mojo_audio_output_stream_provider.h
index 5a1b2f5..2d014d6 100644
--- a/media/mojo/services/mojo_audio_output_stream_provider.h
+++ b/media/mojo/services/mojo_audio_output_stream_provider.h
@@ -41,7 +41,7 @@
   // mojom::AudioOutputStreamProvider implementation.
   void Acquire(mojom::AudioOutputStreamRequest stream_request,
                const AudioParameters& params,
-               const AcquireCallback& acquire_callback) override;
+               AcquireCallback acquire_callback) override;
 
   // Called when |audio_output_| had an error.
   void OnError();
diff --git a/media/mojo/services/mojo_cdm_promise.cc b/media/mojo/services/mojo_cdm_promise.cc
index da9ae8c..01b013be 100644
--- a/media/mojo/services/mojo_cdm_promise.cc
+++ b/media/mojo/services/mojo_cdm_promise.cc
@@ -27,8 +27,8 @@
 }
 
 template <typename... T>
-MojoCdmPromise<T...>::MojoCdmPromise(const CallbackType& callback)
-    : callback_(callback) {
+MojoCdmPromise<T...>::MojoCdmPromise(CallbackType callback)
+    : callback_(std::move(callback)) {
   DCHECK(!callback_.is_null());
 }
 
@@ -46,8 +46,7 @@
   MarkPromiseSettled();
   mojom::CdmPromiseResultPtr cdm_promise_result(mojom::CdmPromiseResult::New());
   cdm_promise_result->success = true;
-  callback_.Run(std::move(cdm_promise_result), result...);
-  callback_.Reset();
+  std::move(callback_).Run(std::move(cdm_promise_result), result...);
 }
 
 template <typename... T>
@@ -55,8 +54,8 @@
                                   uint32_t system_code,
                                   const std::string& error_message) {
   MarkPromiseSettled();
-  callback_.Run(GetRejectResult(exception, system_code, error_message), T()...);
-  callback_.Reset();
+  std::move(callback_).Run(
+      GetRejectResult(exception, system_code, error_message), T()...);
 }
 
 template class MojoCdmPromise<>;
diff --git a/media/mojo/services/mojo_cdm_promise.h b/media/mojo/services/mojo_cdm_promise.h
index cfb7930..dcd5e2f 100644
--- a/media/mojo/services/mojo_cdm_promise.h
+++ b/media/mojo/services/mojo_cdm_promise.h
@@ -19,9 +19,9 @@
 class MojoCdmPromise : public CdmPromiseTemplate<T...> {
  public:
   using CallbackType =
-      base::Callback<void(mojom::CdmPromiseResultPtr, const T&...)>;
+      base::OnceCallback<void(mojom::CdmPromiseResultPtr, const T&...)>;
 
-  explicit MojoCdmPromise(const CallbackType& callback);
+  explicit MojoCdmPromise(CallbackType callback);
   ~MojoCdmPromise() final;
 
   // CdmPromiseTemplate<> implementation.
diff --git a/media/mojo/services/mojo_cdm_service.cc b/media/mojo/services/mojo_cdm_service.cc
index 29c3e78..98257c09 100644
--- a/media/mojo/services/mojo_cdm_service.cc
+++ b/media/mojo/services/mojo_cdm_service.cc
@@ -55,7 +55,7 @@
 void MojoCdmService::Initialize(const std::string& key_system,
                                 const std::string& security_origin,
                                 mojom::CdmConfigPtr cdm_config,
-                                const InitializeCallback& callback) {
+                                InitializeCallback callback) {
   DVLOG(1) << __func__ << ": " << key_system;
   DCHECK(!cdm_);
 
@@ -66,57 +66,60 @@
       base::Bind(&MojoCdmService::OnSessionClosed, weak_this),
       base::Bind(&MojoCdmService::OnSessionKeysChange, weak_this),
       base::Bind(&MojoCdmService::OnSessionExpirationUpdate, weak_this),
-      base::Bind(&MojoCdmService::OnCdmCreated, weak_this, callback));
+      base::Bind(&MojoCdmService::OnCdmCreated, weak_this,
+                 base::Passed(&callback)));
 }
 
 void MojoCdmService::SetServerCertificate(
     const std::vector<uint8_t>& certificate_data,
-    const SetServerCertificateCallback& callback) {
+    SetServerCertificateCallback callback) {
   DVLOG(2) << __func__;
-  cdm_->SetServerCertificate(certificate_data,
-                             base::MakeUnique<SimpleMojoCdmPromise>(callback));
+  cdm_->SetServerCertificate(
+      certificate_data,
+      base::MakeUnique<SimpleMojoCdmPromise>(std::move(callback)));
 }
 
 void MojoCdmService::CreateSessionAndGenerateRequest(
     CdmSessionType session_type,
     EmeInitDataType init_data_type,
     const std::vector<uint8_t>& init_data,
-    const CreateSessionAndGenerateRequestCallback& callback) {
+    CreateSessionAndGenerateRequestCallback callback) {
   DVLOG(2) << __func__;
   cdm_->CreateSessionAndGenerateRequest(
       session_type, init_data_type, init_data,
-      base::MakeUnique<NewSessionMojoCdmPromise>(callback));
+      base::MakeUnique<NewSessionMojoCdmPromise>(std::move(callback)));
 }
 
 void MojoCdmService::LoadSession(CdmSessionType session_type,
                                  const std::string& session_id,
-                                 const LoadSessionCallback& callback) {
+                                 LoadSessionCallback callback) {
   DVLOG(2) << __func__;
-  cdm_->LoadSession(session_type, session_id,
-                    base::MakeUnique<NewSessionMojoCdmPromise>(callback));
+  cdm_->LoadSession(
+      session_type, session_id,
+      base::MakeUnique<NewSessionMojoCdmPromise>(std::move(callback)));
 }
 
 void MojoCdmService::UpdateSession(const std::string& session_id,
                                    const std::vector<uint8_t>& response,
-                                   const UpdateSessionCallback& callback) {
+                                   UpdateSessionCallback callback) {
   DVLOG(2) << __func__;
-  cdm_->UpdateSession(
-      session_id, response,
-      std::unique_ptr<SimpleCdmPromise>(new SimpleMojoCdmPromise(callback)));
+  cdm_->UpdateSession(session_id, response,
+                      std::unique_ptr<SimpleCdmPromise>(
+                          new SimpleMojoCdmPromise(std::move(callback))));
 }
 
 void MojoCdmService::CloseSession(const std::string& session_id,
-                                  const CloseSessionCallback& callback) {
+                                  CloseSessionCallback callback) {
   DVLOG(2) << __func__;
-  cdm_->CloseSession(session_id,
-                     base::MakeUnique<SimpleMojoCdmPromise>(callback));
+  cdm_->CloseSession(
+      session_id, base::MakeUnique<SimpleMojoCdmPromise>(std::move(callback)));
 }
 
 void MojoCdmService::RemoveSession(const std::string& session_id,
-                                   const RemoveSessionCallback& callback) {
+                                   RemoveSessionCallback callback) {
   DVLOG(2) << __func__;
-  cdm_->RemoveSession(session_id,
-                      base::MakeUnique<SimpleMojoCdmPromise>(callback));
+  cdm_->RemoveSession(
+      session_id, base::MakeUnique<SimpleMojoCdmPromise>(std::move(callback)));
 }
 
 scoped_refptr<ContentDecryptionModule> MojoCdmService::GetCdm() {
@@ -124,7 +127,7 @@
 }
 
 void MojoCdmService::OnCdmCreated(
-    const InitializeCallback& callback,
+    InitializeCallback callback,
     const scoped_refptr<::media::ContentDecryptionModule>& cdm,
     const std::string& error_message) {
   mojom::CdmPromiseResultPtr cdm_promise_result(mojom::CdmPromiseResult::New());
@@ -136,7 +139,7 @@
     cdm_promise_result->exception = CdmPromise::Exception::NOT_SUPPORTED_ERROR;
     cdm_promise_result->system_code = 0;
     cdm_promise_result->error_message = error_message;
-    callback.Run(std::move(cdm_promise_result), 0, nullptr);
+    std::move(callback).Run(std::move(cdm_promise_result), 0, nullptr);
     return;
   }
 
@@ -158,8 +161,8 @@
 
   DVLOG(1) << __func__ << ": CDM successfully created with ID " << cdm_id_;
   cdm_promise_result->success = true;
-  callback.Run(std::move(cdm_promise_result), cdm_id_,
-               std::move(decryptor_service));
+  std::move(callback).Run(std::move(cdm_promise_result), cdm_id_,
+                          std::move(decryptor_service));
 }
 
 void MojoCdmService::OnSessionMessage(const std::string& session_id,
diff --git a/media/mojo/services/mojo_cdm_service.h b/media/mojo/services/mojo_cdm_service.h
index cd77fe24..c7b7c82 100644
--- a/media/mojo/services/mojo_cdm_service.h
+++ b/media/mojo/services/mojo_cdm_service.h
@@ -53,31 +53,31 @@
   void Initialize(const std::string& key_system,
                   const std::string& security_origin,
                   mojom::CdmConfigPtr cdm_config,
-                  const InitializeCallback& callback) final;
+                  InitializeCallback callback) final;
   void SetServerCertificate(const std::vector<uint8_t>& certificate_data,
-                            const SetServerCertificateCallback& callback) final;
+                            SetServerCertificateCallback callback) final;
   void CreateSessionAndGenerateRequest(
       CdmSessionType session_type,
       EmeInitDataType init_data_type,
       const std::vector<uint8_t>& init_data,
-      const CreateSessionAndGenerateRequestCallback& callback) final;
+      CreateSessionAndGenerateRequestCallback callback) final;
   void LoadSession(CdmSessionType session_type,
                    const std::string& session_id,
-                   const LoadSessionCallback& callback) final;
+                   LoadSessionCallback callback) final;
   void UpdateSession(const std::string& session_id,
                      const std::vector<uint8_t>& response,
-                     const UpdateSessionCallback& callback) final;
+                     UpdateSessionCallback callback) final;
   void CloseSession(const std::string& session_id,
-                    const CloseSessionCallback& callback) final;
+                    CloseSessionCallback callback) final;
   void RemoveSession(const std::string& session_id,
-                     const RemoveSessionCallback& callback) final;
+                     RemoveSessionCallback callback) final;
 
   // Get CDM to be used by the media pipeline.
   scoped_refptr<::media::ContentDecryptionModule> GetCdm();
 
  private:
   // Callback for CdmFactory::Create().
-  void OnCdmCreated(const InitializeCallback& callback,
+  void OnCdmCreated(InitializeCallback callback,
                     const scoped_refptr<::media::ContentDecryptionModule>& cdm,
                     const std::string& error_message);
 
diff --git a/media/mojo/services/mojo_decryptor_service.cc b/media/mojo/services/mojo_decryptor_service.cc
index 0e140b7..e96a74b 100644
--- a/media/mojo/services/mojo_decryptor_service.cc
+++ b/media/mojo/services/mojo_decryptor_service.cc
@@ -71,11 +71,12 @@
 
 void MojoDecryptorService::Decrypt(StreamType stream_type,
                                    mojom::DecoderBufferPtr encrypted,
-                                   const DecryptCallback& callback) {
+                                   DecryptCallback callback) {
   DVLOG(3) << __func__;
   mojo_decoder_buffer_reader_->ReadDecoderBuffer(
-      std::move(encrypted), base::BindOnce(&MojoDecryptorService::OnReadDone,
-                                           weak_this_, stream_type, callback));
+      std::move(encrypted),
+      base::BindOnce(&MojoDecryptorService::OnReadDone, weak_this_, stream_type,
+                     std::move(callback)));
 }
 
 void MojoDecryptorService::CancelDecrypt(StreamType stream_type) {
@@ -84,41 +85,39 @@
 }
 
 void MojoDecryptorService::InitializeAudioDecoder(
-    mojom::AudioDecoderConfigPtr config,
-    const InitializeAudioDecoderCallback& callback) {
+    const AudioDecoderConfig& config,
+    InitializeAudioDecoderCallback callback) {
   DVLOG(1) << __func__;
   decryptor_->InitializeAudioDecoder(
-      config.To<AudioDecoderConfig>(),
-      base::Bind(&MojoDecryptorService::OnAudioDecoderInitialized, weak_this_,
-                 callback));
+      config, base::Bind(&MojoDecryptorService::OnAudioDecoderInitialized,
+                         weak_this_, base::Passed(&callback)));
 }
 
 void MojoDecryptorService::InitializeVideoDecoder(
-    mojom::VideoDecoderConfigPtr config,
-    const InitializeVideoDecoderCallback& callback) {
+    const VideoDecoderConfig& config,
+    InitializeVideoDecoderCallback callback) {
   DVLOG(1) << __func__;
   decryptor_->InitializeVideoDecoder(
-      config.To<VideoDecoderConfig>(),
-      base::Bind(&MojoDecryptorService::OnVideoDecoderInitialized, weak_this_,
-                 callback));
+      config, base::Bind(&MojoDecryptorService::OnVideoDecoderInitialized,
+                         weak_this_, base::Passed(&callback)));
 }
 
 void MojoDecryptorService::DecryptAndDecodeAudio(
     mojom::DecoderBufferPtr encrypted,
-    const DecryptAndDecodeAudioCallback& callback) {
+    DecryptAndDecodeAudioCallback callback) {
   DVLOG(3) << __func__;
   mojo_decoder_buffer_reader_->ReadDecoderBuffer(
-      std::move(encrypted),
-      base::BindOnce(&MojoDecryptorService::OnAudioRead, weak_this_, callback));
+      std::move(encrypted), base::BindOnce(&MojoDecryptorService::OnAudioRead,
+                                           weak_this_, std::move(callback)));
 }
 
 void MojoDecryptorService::DecryptAndDecodeVideo(
     mojom::DecoderBufferPtr encrypted,
-    const DecryptAndDecodeVideoCallback& callback) {
+    DecryptAndDecodeVideoCallback callback) {
   DVLOG(3) << __func__;
   mojo_decoder_buffer_reader_->ReadDecoderBuffer(
-      std::move(encrypted),
-      base::BindOnce(&MojoDecryptorService::OnVideoRead, weak_this_, callback));
+      std::move(encrypted), base::BindOnce(&MojoDecryptorService::OnVideoRead,
+                                           weak_this_, std::move(callback)));
 }
 
 void MojoDecryptorService::ResetDecoder(StreamType stream_type) {
@@ -132,20 +131,20 @@
 }
 
 void MojoDecryptorService::OnReadDone(StreamType stream_type,
-                                      const DecryptCallback& callback,
+                                      DecryptCallback callback,
                                       scoped_refptr<DecoderBuffer> buffer) {
   if (!buffer) {
-    callback.Run(Status::kError, nullptr);
+    std::move(callback).Run(Status::kError, nullptr);
     return;
   }
 
-  decryptor_->Decrypt(
-      stream_type, std::move(buffer),
-      base::Bind(&MojoDecryptorService::OnDecryptDone, weak_this_, callback));
+  decryptor_->Decrypt(stream_type, std::move(buffer),
+                      base::Bind(&MojoDecryptorService::OnDecryptDone,
+                                 weak_this_, base::Passed(&callback)));
 }
 
 void MojoDecryptorService::OnDecryptDone(
-    const DecryptCallback& callback,
+    DecryptCallback callback,
     Status status,
     const scoped_refptr<DecoderBuffer>& buffer) {
   DVLOG_IF(1, status != Status::kSuccess) << __func__ << "(" << status << ")";
@@ -153,62 +152,61 @@
 
   if (!buffer) {
     DCHECK_NE(status, Status::kSuccess);
-    callback.Run(status, nullptr);
+    std::move(callback).Run(status, nullptr);
     return;
   }
 
   mojom::DecoderBufferPtr mojo_buffer =
       mojo_decoder_buffer_writer_->WriteDecoderBuffer(buffer);
   if (!mojo_buffer) {
-    callback.Run(Status::kError, nullptr);
+    std::move(callback).Run(Status::kError, nullptr);
     return;
   }
 
-  callback.Run(status, std::move(mojo_buffer));
+  std::move(callback).Run(status, std::move(mojo_buffer));
 }
 
 void MojoDecryptorService::OnAudioDecoderInitialized(
-    const InitializeAudioDecoderCallback& callback,
+    InitializeAudioDecoderCallback callback,
     bool success) {
   DVLOG(1) << __func__ << "(" << success << ")";
-  callback.Run(success);
+  std::move(callback).Run(success);
 }
 
 void MojoDecryptorService::OnVideoDecoderInitialized(
-    const InitializeVideoDecoderCallback& callback,
+    InitializeVideoDecoderCallback callback,
     bool success) {
   DVLOG(1) << __func__ << "(" << success << ")";
-  callback.Run(success);
+  std::move(callback).Run(success);
 }
 
-void MojoDecryptorService::OnAudioRead(
-    const DecryptAndDecodeAudioCallback& callback,
-    scoped_refptr<DecoderBuffer> buffer) {
+void MojoDecryptorService::OnAudioRead(DecryptAndDecodeAudioCallback callback,
+                                       scoped_refptr<DecoderBuffer> buffer) {
   if (!buffer) {
-    callback.Run(Status::kError, std::vector<mojom::AudioBufferPtr>());
+    std::move(callback).Run(Status::kError,
+                            std::vector<mojom::AudioBufferPtr>());
     return;
   }
 
   decryptor_->DecryptAndDecodeAudio(
-      std::move(buffer),
-      base::Bind(&MojoDecryptorService::OnAudioDecoded, weak_this_, callback));
+      std::move(buffer), base::Bind(&MojoDecryptorService::OnAudioDecoded,
+                                    weak_this_, base::Passed(&callback)));
 }
 
-void MojoDecryptorService::OnVideoRead(
-    const DecryptAndDecodeVideoCallback& callback,
-    scoped_refptr<DecoderBuffer> buffer) {
+void MojoDecryptorService::OnVideoRead(DecryptAndDecodeVideoCallback callback,
+                                       scoped_refptr<DecoderBuffer> buffer) {
   if (!buffer) {
-    callback.Run(Status::kError, nullptr, nullptr);
+    std::move(callback).Run(Status::kError, nullptr, nullptr);
     return;
   }
 
   decryptor_->DecryptAndDecodeVideo(
-      std::move(buffer),
-      base::Bind(&MojoDecryptorService::OnVideoDecoded, weak_this_, callback));
+      std::move(buffer), base::Bind(&MojoDecryptorService::OnVideoDecoded,
+                                    weak_this_, base::Passed(&callback)));
 }
 
 void MojoDecryptorService::OnAudioDecoded(
-    const DecryptAndDecodeAudioCallback& callback,
+    DecryptAndDecodeAudioCallback callback,
     Status status,
     const media::Decryptor::AudioFrames& frames) {
   DVLOG_IF(1, status != Status::kSuccess) << __func__ << "(" << status << ")";
@@ -220,11 +218,11 @@
   for (const auto& frame : frames)
     audio_buffers.push_back(mojom::AudioBuffer::From(frame));
 
-  callback.Run(status, std::move(audio_buffers));
+  std::move(callback).Run(status, std::move(audio_buffers));
 }
 
 void MojoDecryptorService::OnVideoDecoded(
-    const DecryptAndDecodeVideoCallback& callback,
+    DecryptAndDecodeVideoCallback callback,
     Status status,
     const scoped_refptr<VideoFrame>& frame) {
   DVLOG_IF(1, status != Status::kSuccess) << __func__ << "(" << status << ")";
@@ -232,7 +230,7 @@
 
   if (!frame) {
     DCHECK_NE(status, Status::kSuccess);
-    callback.Run(status, nullptr, nullptr);
+    std::move(callback).Run(status, nullptr, nullptr);
     return;
   }
 
@@ -244,7 +242,7 @@
                             mojo::MakeRequest(&releaser));
   }
 
-  callback.Run(status, std::move(frame), std::move(releaser));
+  std::move(callback).Run(status, std::move(frame), std::move(releaser));
 }
 
 }  // namespace media
diff --git a/media/mojo/services/mojo_decryptor_service.h b/media/mojo/services/mojo_decryptor_service.h
index e3f9909..be49029 100644
--- a/media/mojo/services/mojo_decryptor_service.h
+++ b/media/mojo/services/mojo_decryptor_service.h
@@ -46,49 +46,45 @@
                   mojo::ScopedDataPipeProducerHandle transmit_pipe) final;
   void Decrypt(StreamType stream_type,
                mojom::DecoderBufferPtr encrypted,
-               const DecryptCallback& callback) final;
+               DecryptCallback callback) final;
   void CancelDecrypt(StreamType stream_type) final;
-  void InitializeAudioDecoder(
-      mojom::AudioDecoderConfigPtr config,
-      const InitializeAudioDecoderCallback& callback) final;
-  void InitializeVideoDecoder(
-      mojom::VideoDecoderConfigPtr config,
-      const InitializeVideoDecoderCallback& callback) final;
-  void DecryptAndDecodeAudio(
-      mojom::DecoderBufferPtr encrypted,
-      const DecryptAndDecodeAudioCallback& callback) final;
-  void DecryptAndDecodeVideo(
-      mojom::DecoderBufferPtr encrypted,
-      const DecryptAndDecodeVideoCallback& callback) final;
+  void InitializeAudioDecoder(const AudioDecoderConfig& config,
+                              InitializeAudioDecoderCallback callback) final;
+  void InitializeVideoDecoder(const VideoDecoderConfig& config,
+                              InitializeVideoDecoderCallback callback) final;
+  void DecryptAndDecodeAudio(mojom::DecoderBufferPtr encrypted,
+                             DecryptAndDecodeAudioCallback callback) final;
+  void DecryptAndDecodeVideo(mojom::DecoderBufferPtr encrypted,
+                             DecryptAndDecodeVideoCallback callback) final;
   void ResetDecoder(StreamType stream_type) final;
   void DeinitializeDecoder(StreamType stream_type) final;
 
  private:
   void OnReadDone(StreamType stream_type,
-                  const DecryptCallback& callback,
+                  DecryptCallback callback,
                   scoped_refptr<DecoderBuffer> buffer);
 
   // Callback executed once Decrypt() is done.
-  void OnDecryptDone(const DecryptCallback& callback,
+  void OnDecryptDone(DecryptCallback callback,
                      Status status,
                      const scoped_refptr<DecoderBuffer>& buffer);
 
   // Callbacks executed once decoder initialized.
-  void OnAudioDecoderInitialized(const InitializeAudioDecoderCallback& callback,
+  void OnAudioDecoderInitialized(InitializeAudioDecoderCallback callback,
                                  bool success);
-  void OnVideoDecoderInitialized(const InitializeVideoDecoderCallback& callback,
+  void OnVideoDecoderInitialized(InitializeVideoDecoderCallback callback,
                                  bool success);
 
-  void OnAudioRead(const DecryptAndDecodeAudioCallback& callback,
+  void OnAudioRead(DecryptAndDecodeAudioCallback callback,
                    scoped_refptr<DecoderBuffer> buffer);
-  void OnVideoRead(const DecryptAndDecodeVideoCallback& callback,
+  void OnVideoRead(DecryptAndDecodeVideoCallback callback,
                    scoped_refptr<DecoderBuffer> buffer);
 
   // Callbacks executed when DecryptAndDecode are done.
-  void OnAudioDecoded(const DecryptAndDecodeAudioCallback& callback,
+  void OnAudioDecoded(DecryptAndDecodeAudioCallback callback,
                       Status status,
                       const media::Decryptor::AudioFrames& frames);
-  void OnVideoDecoded(const DecryptAndDecodeVideoCallback& callback,
+  void OnVideoDecoded(DecryptAndDecodeVideoCallback callback,
                       Status status,
                       const scoped_refptr<VideoFrame>& frame);
 
diff --git a/media/mojo/services/mojo_demuxer_stream_adapter.cc b/media/mojo/services/mojo_demuxer_stream_adapter.cc
index 17a73eb1..23e0a7ca 100644
--- a/media/mojo/services/mojo_demuxer_stream_adapter.cc
+++ b/media/mojo/services/mojo_demuxer_stream_adapter.cc
@@ -74,8 +74,8 @@
 void MojoDemuxerStreamAdapter::OnStreamReady(
     Type type,
     mojo::ScopedDataPipeConsumerHandle consumer_handle,
-    mojom::AudioDecoderConfigPtr audio_config,
-    mojom::VideoDecoderConfigPtr video_config) {
+    const base::Optional<AudioDecoderConfig>& audio_config,
+    const base::Optional<VideoDecoderConfig>& video_config) {
   DVLOG(1) << __func__;
   DCHECK_EQ(UNKNOWN, type_);
   DCHECK(consumer_handle.is_valid());
@@ -93,8 +93,8 @@
 void MojoDemuxerStreamAdapter::OnBufferReady(
     Status status,
     mojom::DecoderBufferPtr buffer,
-    mojom::AudioDecoderConfigPtr audio_config,
-    mojom::VideoDecoderConfigPtr video_config) {
+    const base::Optional<AudioDecoderConfig>& audio_config,
+    const base::Optional<VideoDecoderConfig>& video_config) {
   DVLOG(3) << __func__;
   DCHECK(!read_cb_.is_null());
   DCHECK_NE(type_, UNKNOWN);
@@ -127,18 +127,18 @@
 }
 
 void MojoDemuxerStreamAdapter::UpdateConfig(
-    mojom::AudioDecoderConfigPtr audio_config,
-    mojom::VideoDecoderConfigPtr video_config) {
+    const base::Optional<AudioDecoderConfig>& audio_config,
+    const base::Optional<VideoDecoderConfig>& video_config) {
   DCHECK_NE(type_, UNKNOWN);
 
   switch(type_) {
     case AUDIO:
       DCHECK(audio_config && !video_config);
-      audio_config_ = audio_config.To<AudioDecoderConfig>();
+      audio_config_ = audio_config.value();
       break;
     case VIDEO:
       DCHECK(video_config && !audio_config);
-      video_config_ = video_config.To<VideoDecoderConfig>();
+      video_config_ = video_config.value();
       break;
     default:
       NOTREACHED();
diff --git a/media/mojo/services/mojo_demuxer_stream_adapter.h b/media/mojo/services/mojo_demuxer_stream_adapter.h
index 4db24ec..8350899 100644
--- a/media/mojo/services/mojo_demuxer_stream_adapter.h
+++ b/media/mojo/services/mojo_demuxer_stream_adapter.h
@@ -10,6 +10,7 @@
 
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
+#include "base/optional.h"
 #include "media/base/audio_decoder_config.h"
 #include "media/base/demuxer_stream.h"
 #include "media/base/video_decoder_config.h"
@@ -48,20 +49,20 @@
  private:
   void OnStreamReady(Type type,
                      mojo::ScopedDataPipeConsumerHandle consumer_handle,
-                     mojom::AudioDecoderConfigPtr audio_config,
-                     mojom::VideoDecoderConfigPtr video_config);
+                     const base::Optional<AudioDecoderConfig>& audio_config,
+                     const base::Optional<VideoDecoderConfig>& video_config);
 
   // The callback from |demuxer_stream_| that a read operation has completed.
   // |read_cb| is a callback from the client who invoked Read() on |this|.
   void OnBufferReady(Status status,
                      mojom::DecoderBufferPtr buffer,
-                     mojom::AudioDecoderConfigPtr audio_config,
-                     mojom::VideoDecoderConfigPtr video_config);
+                     const base::Optional<AudioDecoderConfig>& audio_config,
+                     const base::Optional<VideoDecoderConfig>& video_config);
 
   void OnBufferRead(scoped_refptr<DecoderBuffer> buffer);
 
-  void UpdateConfig(mojom::AudioDecoderConfigPtr audio_config,
-                    mojom::VideoDecoderConfigPtr video_config);
+  void UpdateConfig(const base::Optional<AudioDecoderConfig>& audio_config,
+                    const base::Optional<VideoDecoderConfig>& video_config);
 
   // See constructor for descriptions.
   mojom::DemuxerStreamPtr demuxer_stream_;
diff --git a/media/mojo/services/mojo_media_client.cc b/media/mojo/services/mojo_media_client.cc
index 6c9207a..2f2e0818 100644
--- a/media/mojo/services/mojo_media_client.cc
+++ b/media/mojo/services/mojo_media_client.cc
@@ -28,6 +28,7 @@
 
 std::unique_ptr<VideoDecoder> MojoMediaClient::CreateVideoDecoder(
     scoped_refptr<base::SingleThreadTaskRunner> task_runner,
+    MediaLog* media_log,
     mojom::CommandBufferIdPtr command_buffer_id,
     OutputWithReleaseMailboxCB output_cb) {
   return nullptr;
diff --git a/media/mojo/services/mojo_media_client.h b/media/mojo/services/mojo_media_client.h
index a3e64921..d96798f 100644
--- a/media/mojo/services/mojo_media_client.h
+++ b/media/mojo/services/mojo_media_client.h
@@ -63,6 +63,7 @@
   // See https://crbug.com/733828.
   virtual std::unique_ptr<VideoDecoder> CreateVideoDecoder(
       scoped_refptr<base::SingleThreadTaskRunner> task_runner,
+      MediaLog* media_log,
       mojom::CommandBufferIdPtr command_buffer_id,
       OutputWithReleaseMailboxCB output_cb);
 
diff --git a/media/mojo/services/mojo_media_log.cc b/media/mojo/services/mojo_media_log.cc
new file mode 100644
index 0000000..f13f13e
--- /dev/null
+++ b/media/mojo/services/mojo_media_log.cc
@@ -0,0 +1,28 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "media/mojo/services/mojo_media_log.h"
+
+#include "base/logging.h"
+
+namespace media {
+
+// TODO(sandersd): Do we need to respond to the channel closing?
+MojoMediaLog::MojoMediaLog(
+    mojo::AssociatedInterfacePtr<mojom::MediaLog> remote_media_log)
+    : remote_media_log_(std::move(remote_media_log)) {
+  DVLOG(1) << __func__;
+}
+
+MojoMediaLog::~MojoMediaLog() {
+  DVLOG(1) << __func__;
+}
+
+void MojoMediaLog::AddEvent(std::unique_ptr<MediaLogEvent> event) {
+  DVLOG(1) << __func__;
+  DCHECK(event);
+  remote_media_log_->AddEvent(*event);
+}
+
+}  // namespace media
diff --git a/media/mojo/services/mojo_media_log.h b/media/mojo/services/mojo_media_log.h
new file mode 100644
index 0000000..bf46c38
--- /dev/null
+++ b/media/mojo/services/mojo_media_log.h
@@ -0,0 +1,35 @@
+// 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 MEDIA_MOJO_SERVICES_MOJO_MEDIA_LOG_H_
+#define MEDIA_MOJO_SERVICES_MOJO_MEDIA_LOG_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "media/base/media_log.h"
+#include "media/mojo/interfaces/media_log.mojom.h"
+#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
+
+namespace media {
+
+class MojoMediaLog final : public MediaLog {
+ public:
+  // TODO(sandersd): Template on Ptr type to support non-associated.
+  explicit MojoMediaLog(
+      mojo::AssociatedInterfacePtr<mojom::MediaLog> remote_media_log);
+  ~MojoMediaLog() final;
+
+  // MediaLog implementation.
+  void AddEvent(std::unique_ptr<MediaLogEvent> event) override;
+
+ private:
+  mojo::AssociatedInterfacePtr<mojom::MediaLog> remote_media_log_;
+
+  DISALLOW_COPY_AND_ASSIGN(MojoMediaLog);
+};
+
+}  // namespace media
+
+#endif  // MEDIA_MOJO_SERVICES_MOJO_MEDIA_LOG_H_
diff --git a/media/mojo/services/mojo_renderer_service.cc b/media/mojo/services/mojo_renderer_service.cc
index 81661f86..7f45af51 100644
--- a/media/mojo/services/mojo_renderer_service.cc
+++ b/media/mojo/services/mojo_renderer_service.cc
@@ -80,7 +80,7 @@
     base::Optional<std::vector<mojom::DemuxerStreamPtr>> streams,
     const base::Optional<GURL>& media_url,
     const base::Optional<GURL>& first_party_for_cookies,
-    const InitializeCallback& callback) {
+    InitializeCallback callback) {
   DVLOG(1) << __func__;
   DCHECK_EQ(state_, STATE_UNINITIALIZED);
 
@@ -90,8 +90,8 @@
   if (media_url == base::nullopt) {
     DCHECK(streams.has_value());
     media_resource_.reset(new MediaResourceShim(
-        std::move(*streams),
-        base::Bind(&MojoRendererService::OnStreamReady, weak_this_, callback)));
+        std::move(*streams), base::Bind(&MojoRendererService::OnStreamReady,
+                                        weak_this_, base::Passed(&callback))));
     return;
   }
 
@@ -102,17 +102,17 @@
   renderer_->Initialize(
       media_resource_.get(), this,
       base::Bind(&MojoRendererService::OnRendererInitializeDone, weak_this_,
-                 callback));
+                 base::Passed(&callback)));
 }
 
-void MojoRendererService::Flush(const FlushCallback& callback) {
+void MojoRendererService::Flush(FlushCallback callback) {
   DVLOG(2) << __func__;
   DCHECK_EQ(state_, STATE_PLAYING);
 
   state_ = STATE_FLUSHING;
   CancelPeriodicMediaTimeUpdates();
-  renderer_->Flush(
-      base::Bind(&MojoRendererService::OnFlushCompleted, weak_this_, callback));
+  renderer_->Flush(base::Bind(&MojoRendererService::OnFlushCompleted,
+                              weak_this_, base::Passed(&callback)));
 }
 
 void MojoRendererService::StartPlayingFrom(base::TimeDelta time_delta) {
@@ -132,11 +132,10 @@
   renderer_->SetVolume(volume);
 }
 
-void MojoRendererService::SetCdm(int32_t cdm_id,
-                                 const SetCdmCallback& callback) {
+void MojoRendererService::SetCdm(int32_t cdm_id, SetCdmCallback callback) {
   if (!mojo_cdm_service_context_) {
     DVLOG(1) << "CDM service context not available.";
-    callback.Run(false);
+    std::move(callback).Run(false);
     return;
   }
 
@@ -144,19 +143,20 @@
       mojo_cdm_service_context_->GetCdm(cdm_id);
   if (!cdm) {
     DVLOG(1) << "CDM not found: " << cdm_id;
-    callback.Run(false);
+    std::move(callback).Run(false);
     return;
   }
 
   CdmContext* cdm_context = cdm->GetCdmContext();
   if (!cdm_context) {
     DVLOG(1) << "CDM context not available: " << cdm_id;
-    callback.Run(false);
+    std::move(callback).Run(false);
     return;
   }
 
-  renderer_->SetCdm(cdm_context, base::Bind(&MojoRendererService::OnCdmAttached,
-                                            weak_this_, cdm, callback));
+  renderer_->SetCdm(cdm_context,
+                    base::Bind(&MojoRendererService::OnCdmAttached, weak_this_,
+                               cdm, base::Passed(&callback)));
 }
 
 void MojoRendererService::OnError(PipelineStatus error) {
@@ -201,29 +201,29 @@
 }
 
 void MojoRendererService::OnStreamReady(
-    const base::Callback<void(bool)>& callback) {
+    base::OnceCallback<void(bool)> callback) {
   DCHECK_EQ(state_, STATE_INITIALIZING);
 
   renderer_->Initialize(
       media_resource_.get(), this,
       base::Bind(&MojoRendererService::OnRendererInitializeDone, weak_this_,
-                 callback));
+                 base::Passed(&callback)));
 }
 
 void MojoRendererService::OnRendererInitializeDone(
-    const base::Callback<void(bool)>& callback,
+    base::OnceCallback<void(bool)> callback,
     PipelineStatus status) {
   DVLOG(1) << __func__;
   DCHECK_EQ(state_, STATE_INITIALIZING);
 
   if (status != PIPELINE_OK) {
     state_ = STATE_ERROR;
-    callback.Run(false);
+    std::move(callback).Run(false);
     return;
   }
 
   state_ = STATE_PLAYING;
-  callback.Run(true);
+  std::move(callback).Run(true);
 }
 
 void MojoRendererService::UpdateMediaTime(bool force) {
@@ -256,27 +256,27 @@
       base::Bind(&MojoRendererService::UpdateMediaTime, weak_this_, false));
 }
 
-void MojoRendererService::OnFlushCompleted(const FlushCallback& callback) {
+void MojoRendererService::OnFlushCompleted(FlushCallback callback) {
   DVLOG(1) << __func__;
   DCHECK_EQ(state_, STATE_FLUSHING);
   state_ = STATE_PLAYING;
-  callback.Run();
+  std::move(callback).Run();
 }
 
 void MojoRendererService::OnCdmAttached(
     scoped_refptr<ContentDecryptionModule> cdm,
-    const base::Callback<void(bool)>& callback,
+    base::OnceCallback<void(bool)> callback,
     bool success) {
   DVLOG(1) << __func__ << "(" << success << ")";
 
   if (success)
     cdm_ = cdm;
 
-  callback.Run(success);
+  std::move(callback).Run(success);
 }
 
 void MojoRendererService::InitiateScopedSurfaceRequest(
-    const InitiateScopedSurfaceRequestCallback& callback) {
+    InitiateScopedSurfaceRequestCallback callback) {
   if (initiate_surface_request_cb_.is_null()) {
     // |renderer_| is likely not of type MediaPlayerRenderer.
     // This is an unexpected call, and the connection should be closed.
@@ -289,7 +289,7 @@
     return;
   }
 
-  callback.Run(initiate_surface_request_cb_.Run());
+  std::move(callback).Run(initiate_surface_request_cb_.Run());
 }
 
 }  // namespace media
diff --git a/media/mojo/services/mojo_renderer_service.h b/media/mojo/services/mojo_renderer_service.h
index 734af43..9d2a83c 100644
--- a/media/mojo/services/mojo_renderer_service.h
+++ b/media/mojo/services/mojo_renderer_service.h
@@ -66,14 +66,14 @@
                   base::Optional<std::vector<mojom::DemuxerStreamPtr>> streams,
                   const base::Optional<GURL>& media_url,
                   const base::Optional<GURL>& first_party_for_cookies,
-                  const InitializeCallback& callback) final;
-  void Flush(const FlushCallback& callback) final;
+                  InitializeCallback callback) final;
+  void Flush(FlushCallback callback) final;
   void StartPlayingFrom(base::TimeDelta time_delta) final;
   void SetPlaybackRate(double playback_rate) final;
   void SetVolume(float volume) final;
-  void SetCdm(int32_t cdm_id, const SetCdmCallback& callback) final;
+  void SetCdm(int32_t cdm_id, SetCdmCallback callback) final;
   void InitiateScopedSurfaceRequest(
-      const InitiateScopedSurfaceRequestCallback& callback) final;
+      InitiateScopedSurfaceRequestCallback callback) final;
 
   void set_bad_message_cb(base::Closure bad_message_cb) {
     bad_message_cb_ = bad_message_cb;
@@ -100,10 +100,10 @@
 
   // Called when the MediaResourceShim is ready to go (has a config,
   // pipe handle, etc) and can be handed off to a renderer for use.
-  void OnStreamReady(const base::Callback<void(bool)>& callback);
+  void OnStreamReady(base::OnceCallback<void(bool)> callback);
 
   // Called when |audio_renderer_| initialization has completed.
-  void OnRendererInitializeDone(const base::Callback<void(bool)>& callback,
+  void OnRendererInitializeDone(base::OnceCallback<void(bool)> callback,
                                 PipelineStatus status);
 
   // Periodically polls the media time from the renderer and notifies the client
@@ -115,11 +115,11 @@
   void SchedulePeriodicMediaTimeUpdates();
 
   // Callback executed once Flush() completes.
-  void OnFlushCompleted(const FlushCallback& callback);
+  void OnFlushCompleted(FlushCallback callback);
 
   // Callback executed once SetCdm() completes.
   void OnCdmAttached(scoped_refptr<ContentDecryptionModule> cdm,
-                     const base::Callback<void(bool)>& callback,
+                     base::OnceCallback<void(bool)> callback,
                      bool success);
 
   base::WeakPtr<MojoCdmServiceContext> mojo_cdm_service_context_;
diff --git a/media/mojo/services/mojo_video_decoder_service.cc b/media/mojo/services/mojo_video_decoder_service.cc
index 2c4885c..1c4d1ef 100644
--- a/media/mojo/services/mojo_video_decoder_service.cc
+++ b/media/mojo/services/mojo_video_decoder_service.cc
@@ -16,6 +16,7 @@
 #include "media/mojo/common/media_type_converters.h"
 #include "media/mojo/common/mojo_decoder_buffer_converter.h"
 #include "media/mojo/services/mojo_media_client.h"
+#include "media/mojo/services/mojo_media_log.h"
 #include "mojo/public/c/system/types.h"
 #include "mojo/public/cpp/system/buffer.h"
 #include "mojo/public/cpp/system/handle.h"
@@ -32,6 +33,7 @@
 
 void MojoVideoDecoderService::Construct(
     mojom::VideoDecoderClientAssociatedPtrInfo client,
+    mojom::MediaLogAssociatedPtrInfo media_log,
     mojo::ScopedDataPipeConsumerHandle decoder_buffer_pipe,
     mojom::CommandBufferIdPtr command_buffer_id) {
   DVLOG(1) << __func__;
@@ -41,92 +43,96 @@
     return;
   }
 
-  decoder_ = mojo_media_client_->CreateVideoDecoder(
-      base::ThreadTaskRunnerHandle::Get(), std::move(command_buffer_id),
-      base::Bind(&MojoVideoDecoderService::OnDecoderOutput, weak_this_));
-
   client_.Bind(std::move(client));
 
+  mojom::MediaLogAssociatedPtr media_log_ptr;
+  media_log_ptr.Bind(std::move(media_log));
+  media_log_ = base::MakeUnique<MojoMediaLog>(std::move(media_log_ptr));
+
   mojo_decoder_buffer_reader_.reset(
       new MojoDecoderBufferReader(std::move(decoder_buffer_pipe)));
+
+  decoder_ = mojo_media_client_->CreateVideoDecoder(
+      base::ThreadTaskRunnerHandle::Get(), media_log_.get(),
+      std::move(command_buffer_id),
+      base::Bind(&MojoVideoDecoderService::OnDecoderOutput, weak_this_));
 }
 
-void MojoVideoDecoderService::Initialize(mojom::VideoDecoderConfigPtr config,
+void MojoVideoDecoderService::Initialize(const VideoDecoderConfig& config,
                                          bool low_delay,
-                                         const InitializeCallback& callback) {
+                                         InitializeCallback callback) {
   DVLOG(1) << __func__;
 
   if (!decoder_) {
-    callback.Run(false, false, 1);
+    std::move(callback).Run(false, false, 1);
     return;
   }
 
   decoder_->Initialize(
-      config.To<VideoDecoderConfig>(), low_delay, nullptr,
+      config, low_delay, nullptr,
       base::Bind(&MojoVideoDecoderService::OnDecoderInitialized, weak_this_,
-                 callback),
+                 base::Passed(&callback)),
       base::Bind(&MojoVideoDecoderService::OnDecoderOutput, weak_this_,
                  MojoMediaClient::ReleaseMailboxCB()));
 }
 
 void MojoVideoDecoderService::Decode(mojom::DecoderBufferPtr buffer,
-                                     const DecodeCallback& callback) {
+                                     DecodeCallback callback) {
   DVLOG(2) << __func__;
 
   if (!decoder_) {
-    callback.Run(DecodeStatus::DECODE_ERROR);
+    std::move(callback).Run(DecodeStatus::DECODE_ERROR);
     return;
   }
 
   mojo_decoder_buffer_reader_->ReadDecoderBuffer(
       std::move(buffer), base::BindOnce(&MojoVideoDecoderService::OnDecoderRead,
-                                        weak_this_, callback));
+                                        weak_this_, std::move(callback)));
 }
 
-void MojoVideoDecoderService::Reset(const ResetCallback& callback) {
+void MojoVideoDecoderService::Reset(ResetCallback callback) {
   DVLOG(1) << __func__;
 
   if (!decoder_) {
-    callback.Run();
+    std::move(callback).Run();
     return;
   }
 
   decoder_->Reset(base::Bind(&MojoVideoDecoderService::OnDecoderReset,
-                             weak_this_, callback));
+                             weak_this_, base::Passed(&callback)));
 }
 
-void MojoVideoDecoderService::OnDecoderInitialized(
-    const InitializeCallback& callback,
-    bool success) {
+void MojoVideoDecoderService::OnDecoderInitialized(InitializeCallback callback,
+                                                   bool success) {
   DVLOG(1) << __func__;
   DCHECK(decoder_);
-  callback.Run(success, decoder_->NeedsBitstreamConversion(),
-               decoder_->GetMaxDecodeRequests());
+  std::move(callback).Run(success, decoder_->NeedsBitstreamConversion(),
+                          decoder_->GetMaxDecodeRequests());
 }
 
 void MojoVideoDecoderService::OnDecoderRead(
-    const DecodeCallback& callback,
+    DecodeCallback callback,
     scoped_refptr<DecoderBuffer> buffer) {
   if (!buffer) {
     // TODO(sandersd): Close the channel.
-    callback.Run(DecodeStatus::DECODE_ERROR);
+    std::move(callback).Run(DecodeStatus::DECODE_ERROR);
     return;
   }
 
   decoder_->Decode(
       buffer, base::Bind(&MojoVideoDecoderService::OnDecoderDecoded, weak_this_,
-                         callback));
+                         base::Passed(&callback)));
 }
 
-void MojoVideoDecoderService::OnDecoderDecoded(const DecodeCallback& callback,
+void MojoVideoDecoderService::OnDecoderDecoded(DecodeCallback callback,
                                                DecodeStatus status) {
   DVLOG(2) << __func__;
-  callback.Run(status);
+  std::move(callback).Run(status);
 }
 
-void MojoVideoDecoderService::OnDecoderReset(const ResetCallback& callback) {
+void MojoVideoDecoderService::OnDecoderReset(ResetCallback callback) {
   DVLOG(1) << __func__;
-  callback.Run();
+  std::move(callback).Run();
 }
 
 void MojoVideoDecoderService::OnDecoderOutput(
diff --git a/media/mojo/services/mojo_video_decoder_service.h b/media/mojo/services/mojo_video_decoder_service.h
index 54e91a2c..93bf6edb 100644
--- a/media/mojo/services/mojo_video_decoder_service.h
+++ b/media/mojo/services/mojo_video_decoder_service.h
@@ -24,6 +24,7 @@
 class DecoderBuffer;
 class MojoDecoderBufferReader;
 class MojoMediaClient;
+class MojoMediaLog;
 class VideoDecoder;
 class VideoFrame;
 
@@ -36,14 +37,14 @@
 
   // mojom::VideoDecoder implementation
   void Construct(mojom::VideoDecoderClientAssociatedPtrInfo client,
+                 mojom::MediaLogAssociatedPtrInfo media_log,
                  mojo::ScopedDataPipeConsumerHandle decoder_buffer_pipe,
                  mojom::CommandBufferIdPtr command_buffer_id) final;
-  void Initialize(mojom::VideoDecoderConfigPtr config,
+  void Initialize(const VideoDecoderConfig& config,
                   bool low_delay,
-                  const InitializeCallback& callback) final;
-  void Decode(mojom::DecoderBufferPtr buffer,
-              const DecodeCallback& callback) final;
-  void Reset(const ResetCallback& callback) final;
+                  InitializeCallback callback) final;
+  void Decode(mojom::DecoderBufferPtr buffer, DecodeCallback callback) final;
+  void Reset(ResetCallback callback) final;
   void OnReleaseMailbox(const base::UnguessableToken& release_token,
                         const gpu::SyncToken& release_sync_token) final;
 
@@ -52,16 +53,17 @@
   // running mojom::VideoDecoder callbacks after connection error happens and
   // |this| is deleted. It's not safe to run the callbacks after a connection
   // error.
-  void OnDecoderInitialized(const InitializeCallback& callback, bool success);
-  void OnDecoderRead(const DecodeCallback& callback,
+  void OnDecoderInitialized(InitializeCallback callback, bool success);
+  void OnDecoderRead(DecodeCallback callback,
                      scoped_refptr<DecoderBuffer> buffer);
-  void OnDecoderDecoded(const DecodeCallback& callback, DecodeStatus status);
-  void OnDecoderReset(const ResetCallback& callback);
+  void OnDecoderDecoded(DecodeCallback callback, DecodeStatus status);
+  void OnDecoderReset(ResetCallback callback);
 
   void OnDecoderOutput(MojoMediaClient::ReleaseMailboxCB,
                        const scoped_refptr<VideoFrame>& frame);
 
   mojom::VideoDecoderClientAssociatedPtr client_;
+  std::unique_ptr<MojoMediaLog> media_log_;
   std::unique_ptr<MojoDecoderBufferReader> mojo_decoder_buffer_reader_;
 
   MojoMediaClient* mojo_media_client_;
diff --git a/media/renderers/default_renderer_factory.cc b/media/renderers/default_renderer_factory.cc
index 2410d1b..814c5fbd 100644
--- a/media/renderers/default_renderer_factory.cc
+++ b/media/renderers/default_renderer_factory.cc
@@ -79,7 +79,7 @@
 
     if (decoder_factory_) {
       decoder_factory_->CreateVideoDecoders(media_task_runner, gpu_factories,
-                                            &video_decoders);
+                                            media_log_, &video_decoders);
     }
     video_decoders.push_back(base::MakeUnique<GpuVideoDecoder>(
         gpu_factories, request_overlay_info_cb, media_log_));
diff --git a/net/cookies/cookie_monster.cc b/net/cookies/cookie_monster.cc
index d084a239..8145802 100644
--- a/net/cookies/cookie_monster.cc
+++ b/net/cookies/cookie_monster.cc
@@ -610,18 +610,18 @@
 }
 
 // Task class for DeleteAllCreatedBetween call.
-class CookieMonster::DeleteAllCreatedBetweenTask : public DeleteTask<int> {
+class CookieMonster::DeleteAllCreatedBetweenTask : public DeleteTask<uint32_t> {
  public:
   DeleteAllCreatedBetweenTask(CookieMonster* cookie_monster,
                               const Time& delete_begin,
                               const Time& delete_end,
                               DeleteCallback callback)
-      : DeleteTask<int>(cookie_monster, std::move(callback)),
+      : DeleteTask<uint32_t>(cookie_monster, std::move(callback)),
         delete_begin_(delete_begin),
         delete_end_(delete_end) {}
 
   // DeleteTask:
-  int RunDeleteTask() override;
+  uint32_t RunDeleteTask() override;
 
  protected:
   ~DeleteAllCreatedBetweenTask() override {}
@@ -633,14 +633,14 @@
   DISALLOW_COPY_AND_ASSIGN(DeleteAllCreatedBetweenTask);
 };
 
-int CookieMonster::DeleteAllCreatedBetweenTask::RunDeleteTask() {
+uint32_t CookieMonster::DeleteAllCreatedBetweenTask::RunDeleteTask() {
   return this->cookie_monster()->DeleteAllCreatedBetween(delete_begin_,
                                                          delete_end_);
 }
 
 // Task class for DeleteAllCreatedBetweenWithPredicate call.
 class CookieMonster::DeleteAllCreatedBetweenWithPredicateTask
-    : public DeleteTask<int> {
+    : public DeleteTask<uint32_t> {
  public:
   DeleteAllCreatedBetweenWithPredicateTask(
       CookieMonster* cookie_monster,
@@ -648,13 +648,13 @@
       Time delete_end,
       base::Callback<bool(const CanonicalCookie&)> predicate,
       DeleteCallback callback)
-      : DeleteTask<int>(cookie_monster, std::move(callback)),
+      : DeleteTask<uint32_t>(cookie_monster, std::move(callback)),
         delete_begin_(delete_begin),
         delete_end_(delete_end),
         predicate_(predicate) {}
 
   // DeleteTask:
-  int RunDeleteTask() override;
+  uint32_t RunDeleteTask() override;
 
  protected:
   ~DeleteAllCreatedBetweenWithPredicateTask() override {}
@@ -667,21 +667,23 @@
   DISALLOW_COPY_AND_ASSIGN(DeleteAllCreatedBetweenWithPredicateTask);
 };
 
-int CookieMonster::DeleteAllCreatedBetweenWithPredicateTask::RunDeleteTask() {
+uint32_t
+CookieMonster::DeleteAllCreatedBetweenWithPredicateTask::RunDeleteTask() {
   return this->cookie_monster()->DeleteAllCreatedBetweenWithPredicate(
       delete_begin_, delete_end_, predicate_);
 }
 
 // Task class for DeleteCanonicalCookie call.
-class CookieMonster::DeleteCanonicalCookieTask : public DeleteTask<int> {
+class CookieMonster::DeleteCanonicalCookieTask : public DeleteTask<uint32_t> {
  public:
   DeleteCanonicalCookieTask(CookieMonster* cookie_monster,
                             const CanonicalCookie& cookie,
                             DeleteCallback callback)
-      : DeleteTask<int>(cookie_monster, std::move(callback)), cookie_(cookie) {}
+      : DeleteTask<uint32_t>(cookie_monster, std::move(callback)),
+        cookie_(cookie) {}
 
   // DeleteTask:
-  int RunDeleteTask() override;
+  uint32_t RunDeleteTask() override;
 
  protected:
   ~DeleteCanonicalCookieTask() override {}
@@ -692,7 +694,7 @@
   DISALLOW_COPY_AND_ASSIGN(DeleteCanonicalCookieTask);
 };
 
-int CookieMonster::DeleteCanonicalCookieTask::RunDeleteTask() {
+uint32_t CookieMonster::DeleteCanonicalCookieTask::RunDeleteTask() {
   return this->cookie_monster()->DeleteCanonicalCookie(cookie_);
 }
 
@@ -873,14 +875,14 @@
 }
 
 // Task class for DeleteSessionCookies call.
-class CookieMonster::DeleteSessionCookiesTask : public DeleteTask<int> {
+class CookieMonster::DeleteSessionCookiesTask : public DeleteTask<uint32_t> {
  public:
   DeleteSessionCookiesTask(CookieMonster* cookie_monster,
                            DeleteCallback callback)
-      : DeleteTask<int>(cookie_monster, std::move(callback)) {}
+      : DeleteTask<uint32_t>(cookie_monster, std::move(callback)) {}
 
   // DeleteTask:
-  int RunDeleteTask() override;
+  uint32_t RunDeleteTask() override;
 
  protected:
   ~DeleteSessionCookiesTask() override {}
@@ -889,7 +891,7 @@
   DISALLOW_COPY_AND_ASSIGN(DeleteSessionCookiesTask);
 };
 
-int CookieMonster::DeleteSessionCookiesTask::RunDeleteTask() {
+uint32_t CookieMonster::DeleteSessionCookiesTask::RunDeleteTask() {
   return this->cookie_monster()->DeleteSessionCookies();
 }
 
@@ -1207,11 +1209,11 @@
   return cookies;
 }
 
-int CookieMonster::DeleteAllCreatedBetween(const Time& delete_begin,
-                                           const Time& delete_end) {
+uint32_t CookieMonster::DeleteAllCreatedBetween(const Time& delete_begin,
+                                                const Time& delete_end) {
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  int num_deleted = 0;
+  uint32_t num_deleted = 0;
   for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) {
     CookieMap::iterator curit = it;
     CanonicalCookie* cc = curit->second.get();
@@ -1228,11 +1230,11 @@
   return num_deleted;
 }
 
-int CookieMonster::DeleteAllCreatedBetweenWithPredicate(
+uint32_t CookieMonster::DeleteAllCreatedBetweenWithPredicate(
     const base::Time& delete_begin,
     const base::Time& delete_end,
     const base::Callback<bool(const CanonicalCookie&)>& predicate) {
-  int num_deleted = 0;
+  uint32_t num_deleted = 0;
   for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) {
     CookieMap::iterator curit = it;
     CanonicalCookie* cc = curit->second.get();
@@ -1315,7 +1317,7 @@
   }
 }
 
-int CookieMonster::DeleteCanonicalCookie(const CanonicalCookie& cookie) {
+uint32_t CookieMonster::DeleteCanonicalCookie(const CanonicalCookie& cookie) {
   DCHECK(thread_checker_.CalledOnValidThread());
 
   for (CookieMapItPair its = cookies_.equal_range(GetKey(cookie.Domain()));
@@ -1323,10 +1325,10 @@
     // The creation date acts as the unique index...
     if (its.first->second->CreationDate() == cookie.CreationDate()) {
       InternalDeleteCookie(its.first, true, DELETE_COOKIE_CANONICAL);
-      return 1;
+      return 1u;
     }
   }
-  return 0;
+  return 0u;
 }
 
 bool CookieMonster::SetCookieWithCreationTime(const GURL& url,
@@ -1347,10 +1349,10 @@
                                              CookieOptions());
 }
 
-int CookieMonster::DeleteSessionCookies() {
+uint32_t CookieMonster::DeleteSessionCookies() {
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  int num_deleted = 0;
+  uint32_t num_deleted = 0;
   for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) {
     CookieMap::iterator curit = it;
     CanonicalCookie* cc = curit->second.get();
diff --git a/net/cookies/cookie_monster.h b/net/cookies/cookie_monster.h
index 7fb91e44..13ebf88 100644
--- a/net/cookies/cookie_monster.h
+++ b/net/cookies/cookie_monster.h
@@ -444,11 +444,11 @@
   CookieList GetCookieListWithOptions(const GURL& url,
                                       const CookieOptions& options);
 
-  int DeleteAllCreatedBetween(const base::Time& delete_begin,
-                              const base::Time& delete_end);
+  uint32_t DeleteAllCreatedBetween(const base::Time& delete_begin,
+                                   const base::Time& delete_end);
 
   // Predicate will be called with the calling thread.
-  int DeleteAllCreatedBetweenWithPredicate(
+  uint32_t DeleteAllCreatedBetweenWithPredicate(
       const base::Time& delete_begin,
       const base::Time& delete_end,
       const base::Callback<bool(const CanonicalCookie&)>& predicate);
@@ -462,13 +462,13 @@
 
   void DeleteCookie(const GURL& url, const std::string& cookie_name);
 
-  int DeleteCanonicalCookie(const CanonicalCookie& cookie);
+  uint32_t DeleteCanonicalCookie(const CanonicalCookie& cookie);
 
   bool SetCookieWithCreationTime(const GURL& url,
                                  const std::string& cookie_line,
                                  const base::Time& creation_time);
 
-  int DeleteSessionCookies();
+  uint32_t DeleteSessionCookies();
 
   // The first access to the cookie store initializes it. This method should be
   // called before any access to the cookie store.
diff --git a/net/cookies/cookie_monster_unittest.cc b/net/cookies/cookie_monster_unittest.cc
index aace43f..5dd66bad 100644
--- a/net/cookies/cookie_monster_unittest.cc
+++ b/net/cookies/cookie_monster_unittest.cc
@@ -4,6 +4,8 @@
 
 #include "net/cookies/cookie_monster.h"
 
+#include <stdint.h>
+
 #include <algorithm>
 #include <memory>
 #include <string>
@@ -163,28 +165,29 @@
     return callback.result();
   }
 
-  int DeleteAllCreatedBetween(CookieMonster* cm,
-                              const base::Time& delete_begin,
-                              const base::Time& delete_end) {
+  uint32_t DeleteAllCreatedBetween(CookieMonster* cm,
+                                   const base::Time& delete_begin,
+                                   const base::Time& delete_end) {
     DCHECK(cm);
-    ResultSavingCookieCallback<int> callback;
+    ResultSavingCookieCallback<uint32_t> callback;
     cm->DeleteAllCreatedBetweenAsync(
         delete_begin, delete_end,
-        base::Bind(&ResultSavingCookieCallback<int>::Run,
+        base::Bind(&ResultSavingCookieCallback<uint32_t>::Run,
                    base::Unretained(&callback)));
     callback.WaitUntilDone();
     return callback.result();
   }
 
-  int DeleteAllCreatedBetweenWithPredicate(CookieMonster* cm,
-                                           const base::Time delete_begin,
-                                           const base::Time delete_end,
-                                           const CookiePredicate& predicate) {
+  uint32_t DeleteAllCreatedBetweenWithPredicate(
+      CookieMonster* cm,
+      const base::Time delete_begin,
+      const base::Time delete_end,
+      const CookiePredicate& predicate) {
     DCHECK(cm);
-    ResultSavingCookieCallback<int> callback;
+    ResultSavingCookieCallback<uint32_t> callback;
     cm->DeleteAllCreatedBetweenWithPredicateAsync(
         delete_begin, delete_end, predicate,
-        base::Bind(&ResultSavingCookieCallback<int>::Run,
+        base::Bind(&ResultSavingCookieCallback<uint32_t>::Run,
                    base::Unretained(&callback)));
     callback.WaitUntilDone();
     return callback.result();
@@ -1356,7 +1359,7 @@
   EXPECT_EQ("A=B; C=D",
             GetCookiesWithOptions(cm.get(), http_www_foo_.url(), options));
 
-  EXPECT_EQ(2, DeleteAll(cm.get()));
+  EXPECT_EQ(2u, DeleteAll(cm.get()));
   EXPECT_EQ("", GetCookiesWithOptions(cm.get(), http_www_foo_.url(), options));
   EXPECT_EQ(0u, store->commands().size());
 
@@ -1367,7 +1370,7 @@
   ASSERT_EQ(1u, store->commands().size());
   EXPECT_EQ(CookieStoreCommand::ADD, store->commands()[0].type);
 
-  EXPECT_EQ(1, DeleteAll(cm.get()));  // sync_to_store = true.
+  EXPECT_EQ(1u, DeleteAll(cm.get()));  // sync_to_store = true.
   ASSERT_EQ(2u, store->commands().size());
   EXPECT_EQ(CookieStoreCommand::REMOVE, store->commands()[1].type);
 
@@ -1379,8 +1382,8 @@
   Time now = Time::Now();
 
   // Nothing has been added so nothing should be deleted.
-  EXPECT_EQ(0, DeleteAllCreatedBetween(cm.get(), now - TimeDelta::FromDays(99),
-                                       Time()));
+  EXPECT_EQ(0u, DeleteAllCreatedBetween(cm.get(), now - TimeDelta::FromDays(99),
+                                        Time()));
 
   // Create 5 cookies with different creation dates.
   EXPECT_TRUE(
@@ -1395,23 +1398,23 @@
                                             now - TimeDelta::FromDays(7)));
 
   // Try to delete threedays and the daybefore.
-  EXPECT_EQ(2, DeleteAllCreatedBetween(cm.get(), now - TimeDelta::FromDays(3),
-                                       now - TimeDelta::FromDays(1)));
+  EXPECT_EQ(2u, DeleteAllCreatedBetween(cm.get(), now - TimeDelta::FromDays(3),
+                                        now - TimeDelta::FromDays(1)));
 
   // Try to delete yesterday, also make sure that delete_end is not
   // inclusive.
   EXPECT_EQ(
-      1, DeleteAllCreatedBetween(cm.get(), now - TimeDelta::FromDays(2), now));
+      1u, DeleteAllCreatedBetween(cm.get(), now - TimeDelta::FromDays(2), now));
 
   // Make sure the delete_begin is inclusive.
   EXPECT_EQ(
-      1, DeleteAllCreatedBetween(cm.get(), now - TimeDelta::FromDays(7), now));
+      1u, DeleteAllCreatedBetween(cm.get(), now - TimeDelta::FromDays(7), now));
 
   // Delete the last (now) item.
-  EXPECT_EQ(1, DeleteAllCreatedBetween(cm.get(), Time(), Time()));
+  EXPECT_EQ(1u, DeleteAllCreatedBetween(cm.get(), Time(), Time()));
 
   // Really make sure everything is gone.
-  EXPECT_EQ(0, DeleteAll(cm.get()));
+  EXPECT_EQ(0u, DeleteAll(cm.get()));
 }
 
 TEST_F(CookieMonsterTest,
@@ -1428,8 +1431,8 @@
 
   // Nothing has been added so nothing should be deleted.
   EXPECT_EQ(
-      0, DeleteAllCreatedBetweenWithPredicate(
-             cm.get(), now - TimeDelta::FromDays(99), Time(), true_predicate));
+      0u, DeleteAllCreatedBetweenWithPredicate(
+              cm.get(), now - TimeDelta::FromDays(99), Time(), true_predicate));
 
   // Create 5 cookies with different creation dates.
   EXPECT_TRUE(
@@ -1445,24 +1448,24 @@
 
   // Try to delete threedays and the daybefore, but we should do nothing due
   // to the predicate.
-  EXPECT_EQ(0, DeleteAllCreatedBetweenWithPredicate(
-                   cm.get(), now - TimeDelta::FromDays(3),
-                   now - TimeDelta::FromDays(1), false_predicate));
+  EXPECT_EQ(0u, DeleteAllCreatedBetweenWithPredicate(
+                    cm.get(), now - TimeDelta::FromDays(3),
+                    now - TimeDelta::FromDays(1), false_predicate));
   // Same as above with a null predicate, so it shouldn't delete anything.
-  EXPECT_EQ(0, DeleteAllCreatedBetweenWithPredicate(
-                   cm.get(), now - TimeDelta::FromDays(3),
-                   now - TimeDelta::FromDays(1), CookiePredicate()));
+  EXPECT_EQ(0u, DeleteAllCreatedBetweenWithPredicate(
+                    cm.get(), now - TimeDelta::FromDays(3),
+                    now - TimeDelta::FromDays(1), CookiePredicate()));
   // Same as above, but we use the true_predicate, so it works.
-  EXPECT_EQ(2, DeleteAllCreatedBetweenWithPredicate(
-                   cm.get(), now - TimeDelta::FromDays(3),
-                   now - TimeDelta::FromDays(1), true_predicate));
+  EXPECT_EQ(2u, DeleteAllCreatedBetweenWithPredicate(
+                    cm.get(), now - TimeDelta::FromDays(3),
+                    now - TimeDelta::FromDays(1), true_predicate));
 
   // Try to delete yesterday, also make sure that delete_end is not
   // inclusive.
-  EXPECT_EQ(0,
+  EXPECT_EQ(0u,
             DeleteAllCreatedBetweenWithPredicate(
                 cm.get(), now - TimeDelta::FromDays(2), now, false_predicate));
-  EXPECT_EQ(1,
+  EXPECT_EQ(1u,
             DeleteAllCreatedBetweenWithPredicate(
                 cm.get(), now - TimeDelta::FromDays(2), now, true_predicate));
   // Check our cookie values.
@@ -1475,18 +1478,18 @@
       << expected_cookie->DebugString();
 
   // Make sure the delete_begin is inclusive.
-  EXPECT_EQ(0,
+  EXPECT_EQ(0u,
             DeleteAllCreatedBetweenWithPredicate(
                 cm.get(), now - TimeDelta::FromDays(7), now, false_predicate));
-  EXPECT_EQ(1,
+  EXPECT_EQ(1u,
             DeleteAllCreatedBetweenWithPredicate(
                 cm.get(), now - TimeDelta::FromDays(7), now, true_predicate));
 
   // Delete the last (now) item.
-  EXPECT_EQ(0, DeleteAllCreatedBetweenWithPredicate(cm.get(), Time(), Time(),
-                                                    false_predicate));
-  EXPECT_EQ(1, DeleteAllCreatedBetweenWithPredicate(cm.get(), Time(), Time(),
-                                                    true_predicate));
+  EXPECT_EQ(0u, DeleteAllCreatedBetweenWithPredicate(cm.get(), Time(), Time(),
+                                                     false_predicate));
+  EXPECT_EQ(1u, DeleteAllCreatedBetweenWithPredicate(cm.get(), Time(), Time(),
+                                                     true_predicate));
   expected_cookie = CanonicalCookie::Create(http_www_foo_.url(), "T-0=Now", now,
                                             CookieOptions());
   EXPECT_THAT(test_cookie, CookieEquals(*expected_cookie))
@@ -1495,7 +1498,7 @@
       << expected_cookie->DebugString();
 
   // Really make sure everything is gone.
-  EXPECT_EQ(0, DeleteAll(cm.get()));
+  EXPECT_EQ(0u, DeleteAll(cm.get()));
 }
 
 static const base::TimeDelta kLastAccessThreshold =
@@ -1937,8 +1940,8 @@
   CookiePredicate value_matcher = base::Bind(&CookieValuePredicate, kTrueValue);
 
   PopulateCmForPredicateCheck(cm.get());
-  EXPECT_EQ(7, DeleteAllCreatedBetweenWithPredicate(
-                   cm.get(), base::Time(), base::Time::Now(), value_matcher));
+  EXPECT_EQ(7u, DeleteAllCreatedBetweenWithPredicate(
+                    cm.get(), base::Time(), base::Time::Now(), value_matcher));
 
   EXPECT_EQ("dom_2=B; dom_3=C; host_3=C",
             GetCookies(cm.get(), GURL(kTopLevelDomainPlus3)));
@@ -2300,8 +2303,8 @@
   store->set_store_load_commands(true);
   std::unique_ptr<CookieMonster> cm(new CookieMonster(store.get(), nullptr));
 
-  ResultSavingCookieCallback<int> delete_callback;
-  cm->DeleteAllAsync(base::Bind(&ResultSavingCookieCallback<int>::Run,
+  ResultSavingCookieCallback<uint32_t> delete_callback;
+  cm->DeleteAllAsync(base::Bind(&ResultSavingCookieCallback<uint32_t>::Run,
                                 base::Unretained(&delete_callback)));
 
   GetCookieListCallback get_cookie_list_callback;
@@ -2323,7 +2326,7 @@
   store->commands()[0].loaded_callback.Run(std::move(cookies));
 
   delete_callback.WaitUntilDone();
-  EXPECT_EQ(1, delete_callback.result());
+  EXPECT_EQ(1u, delete_callback.result());
 
   get_cookie_list_callback.WaitUntilDone();
   EXPECT_EQ(0u, get_cookie_list_callback.cookies().size());
@@ -2764,7 +2767,7 @@
   EXPECT_TRUE(SetCookie(cm.get(), http_www_foo_.url(), "X=Y; path=/"));
 
   ASSERT_EQ(0, store->flush_count());
-  EXPECT_EQ(1, DeleteAll(cm.get()));
+  EXPECT_EQ(1u, DeleteAll(cm.get()));
   EXPECT_EQ(1, store->flush_count());
 }
 
diff --git a/net/cookies/cookie_store.h b/net/cookies/cookie_store.h
index 9ef7535..1a4d3d4 100644
--- a/net/cookies/cookie_store.h
+++ b/net/cookies/cookie_store.h
@@ -7,6 +7,8 @@
 #ifndef NET_COOKIES_COOKIE_STORE_H_
 #define NET_COOKIES_COOKIE_STORE_H_
 
+#include <stdint.h>
+
 #include <memory>
 #include <string>
 #include <vector>
@@ -69,7 +71,7 @@
   typedef base::OnceCallback<void(const std::string& cookie)>
       GetCookiesCallback;
   typedef base::OnceCallback<void(bool success)> SetCookiesCallback;
-  typedef base::OnceCallback<void(int num_deleted)> DeleteCallback;
+  typedef base::OnceCallback<void(uint32_t num_deleted)> DeleteCallback;
 
   typedef base::Callback<void(const CanonicalCookie& cookie, ChangeCause cause)>
       CookieChangedCallback;
diff --git a/net/cookies/cookie_store_unittest.h b/net/cookies/cookie_store_unittest.h
index 4aa2a3c..56ee4248 100644
--- a/net/cookies/cookie_store_unittest.h
+++ b/net/cookies/cookie_store_unittest.h
@@ -5,6 +5,8 @@
 #ifndef NET_COOKIES_COOKIE_STORE_UNITTEST_H_
 #define NET_COOKIES_COOKIE_STORE_UNITTEST_H_
 
+#include <stdint.h>
+
 #include <set>
 #include <string>
 #include <vector>
@@ -226,60 +228,59 @@
     callback.WaitUntilDone();
   }
 
-  int DeleteCanonicalCookie(CookieStore* cs, const CanonicalCookie& cookie) {
+  uint32_t DeleteCanonicalCookie(CookieStore* cs,
+                                 const CanonicalCookie& cookie) {
     DCHECK(cs);
-    ResultSavingCookieCallback<int> callback;
+    ResultSavingCookieCallback<uint32_t> callback;
     cs->DeleteCanonicalCookieAsync(
-        cookie, base::Bind(&ResultSavingCookieCallback<int>::Run,
+        cookie, base::Bind(&ResultSavingCookieCallback<uint32_t>::Run,
                            base::Unretained(&callback)));
     callback.WaitUntilDone();
     return callback.result();
   }
 
-  int DeleteCreatedBetween(CookieStore* cs,
-                            const base::Time& delete_begin,
-                            const base::Time& delete_end) {
+  uint32_t DeleteCreatedBetween(CookieStore* cs,
+                                const base::Time& delete_begin,
+                                const base::Time& delete_end) {
     DCHECK(cs);
-    ResultSavingCookieCallback<int> callback;
+    ResultSavingCookieCallback<uint32_t> callback;
     cs->DeleteAllCreatedBetweenAsync(
         delete_begin, delete_end,
-        base::Bind(
-            &ResultSavingCookieCallback<int>::Run,
-            base::Unretained(&callback)));
-    callback.WaitUntilDone();
-    return callback.result();
-  }
-
-  int DeleteAllCreatedBetweenWithPredicate(
-      CookieStore* cs,
-      const base::Time delete_begin,
-      const base::Time delete_end,
-      const CookieStore::CookiePredicate& predicate) {
-    DCHECK(cs);
-    ResultSavingCookieCallback<int> callback;
-    cs->DeleteAllCreatedBetweenWithPredicateAsync(
-        delete_begin, delete_end, predicate,
-        base::Bind(&ResultSavingCookieCallback<int>::Run,
+        base::Bind(&ResultSavingCookieCallback<uint32_t>::Run,
                    base::Unretained(&callback)));
     callback.WaitUntilDone();
     return callback.result();
   }
 
-  int DeleteSessionCookies(CookieStore* cs) {
+  uint32_t DeleteAllCreatedBetweenWithPredicate(
+      CookieStore* cs,
+      const base::Time delete_begin,
+      const base::Time delete_end,
+      const CookieStore::CookiePredicate& predicate) {
     DCHECK(cs);
-    ResultSavingCookieCallback<int> callback;
-    cs->DeleteSessionCookiesAsync(
-        base::Bind(
-            &ResultSavingCookieCallback<int>::Run,
-            base::Unretained(&callback)));
+    ResultSavingCookieCallback<uint32_t> callback;
+    cs->DeleteAllCreatedBetweenWithPredicateAsync(
+        delete_begin, delete_end, predicate,
+        base::Bind(&ResultSavingCookieCallback<uint32_t>::Run,
+                   base::Unretained(&callback)));
     callback.WaitUntilDone();
     return callback.result();
   }
 
-  int DeleteAll(CookieStore* cs) {
+  uint32_t DeleteSessionCookies(CookieStore* cs) {
     DCHECK(cs);
-    ResultSavingCookieCallback<int> callback;
-    cs->DeleteAllAsync(base::Bind(&ResultSavingCookieCallback<int>::Run,
+    ResultSavingCookieCallback<uint32_t> callback;
+    cs->DeleteSessionCookiesAsync(
+        base::Bind(&ResultSavingCookieCallback<uint32_t>::Run,
+                   base::Unretained(&callback)));
+    callback.WaitUntilDone();
+    return callback.result();
+  }
+
+  uint32_t DeleteAll(CookieStore* cs) {
+    DCHECK(cs);
+    ResultSavingCookieCallback<uint32_t> callback;
+    cs->DeleteAllAsync(base::Bind(&ResultSavingCookieCallback<uint32_t>::Run,
                                   base::Unretained(&callback)));
     callback.WaitUntilDone();
     return callback.result();
@@ -1216,7 +1217,7 @@
   EXPECT_EQ(2u, this->GetAllCookies(cs).size());
 
   // Delete both, and make sure it works
-  EXPECT_EQ(2, this->DeleteAll(cs));
+  EXPECT_EQ(2u, this->DeleteAll(cs));
   EXPECT_EQ(0u, this->GetAllCookies(cs).size());
 }
 
@@ -1238,14 +1239,14 @@
                          this->GetCookies(cs, this->http_www_foo_.url()));
 
   // Remove cookies in empty intervals.
-  EXPECT_EQ(0, this->DeleteCreatedBetween(cs, last_month, last_minute));
-  EXPECT_EQ(0, this->DeleteCreatedBetween(cs, next_minute, next_month));
+  EXPECT_EQ(0u, this->DeleteCreatedBetween(cs, last_month, last_minute));
+  EXPECT_EQ(0u, this->DeleteCreatedBetween(cs, next_minute, next_month));
   // Check that the cookie is still there.
   this->MatchCookieLines("A=B",
                          this->GetCookies(cs, this->http_www_foo_.url()));
 
   // Remove the cookie with an interval defined by two dates.
-  EXPECT_EQ(1, this->DeleteCreatedBetween(cs, last_minute, next_minute));
+  EXPECT_EQ(1u, this->DeleteCreatedBetween(cs, last_minute, next_minute));
   // Check that the cookie disappeared.
   this->MatchCookieLines(std::string(),
                          this->GetCookies(cs, this->http_www_foo_.url()));
@@ -1257,7 +1258,7 @@
                          this->GetCookies(cs, this->http_www_foo_.url()));
 
   // Remove the cookie with a null ending time.
-  EXPECT_EQ(1, this->DeleteCreatedBetween(cs, last_minute, base::Time()));
+  EXPECT_EQ(1u, this->DeleteCreatedBetween(cs, last_minute, base::Time()));
   // Check that the cookie disappeared.
   this->MatchCookieLines(std::string(),
                          this->GetCookies(cs, this->http_www_foo_.url()));
@@ -1284,7 +1285,7 @@
   EXPECT_TRUE(this->SetCookie(cs, this->https_www_foo_.url(), "E=B"));
 
   // Delete cookies.
-  EXPECT_EQ(2,  // Deletes A=B, E=B
+  EXPECT_EQ(2u,  // Deletes A=B, E=B
             this->DeleteAllCreatedBetweenWithPredicate(
                 cs, now, base::Time::Max(),
                 base::Bind(&CookieHasValue, desired_value)));
@@ -1294,20 +1295,21 @@
                          this->GetCookies(cs, this->https_www_foo_.url()));
 
   // Now check that using a null predicate will do nothing.
-  EXPECT_EQ(0, this->DeleteAllCreatedBetweenWithPredicate(
-                   cs, now, base::Time::Max(), CookieStore::CookiePredicate()));
+  EXPECT_EQ(0u,
+            this->DeleteAllCreatedBetweenWithPredicate(
+                cs, now, base::Time::Max(), CookieStore::CookiePredicate()));
 
   // Finally, check that we don't delete cookies when our time range is off.
   desired_value = "D";
-  EXPECT_EQ(0, this->DeleteAllCreatedBetweenWithPredicate(
-                   cs, last_month, last_minute,
-                   base::Bind(&CookieHasValue, desired_value)));
+  EXPECT_EQ(0u, this->DeleteAllCreatedBetweenWithPredicate(
+                    cs, last_month, last_minute,
+                    base::Bind(&CookieHasValue, desired_value)));
   this->MatchCookieLines("C=D;Y=Z",
                          this->GetCookies(cs, this->https_www_foo_.url()));
   // Same thing, but with a good time range.
-  EXPECT_EQ(1, this->DeleteAllCreatedBetweenWithPredicate(
-                   cs, now, base::Time::Max(),
-                   base::Bind(&CookieHasValue, desired_value)));
+  EXPECT_EQ(1u, this->DeleteAllCreatedBetweenWithPredicate(
+                    cs, now, base::Time::Max(),
+                    base::Bind(&CookieHasValue, desired_value)));
   this->MatchCookieLines("Y=Z",
                          this->GetCookies(cs, this->https_www_foo_.url()));
 }
@@ -1440,14 +1442,14 @@
   EXPECT_EQ(1u, list.size());
   EXPECT_EQ("", list[0].Name());
   EXPECT_EQ("a", list[0].Value());
-  EXPECT_EQ(1, this->DeleteAll(cs));
+  EXPECT_EQ(1u, this->DeleteAll(cs));
 
   EXPECT_TRUE(this->SetCookieWithOptions(cs, url_foo, "=b", options));
   list = this->GetAllCookiesForURL(cs, url_foo);
   EXPECT_EQ(1u, list.size());
   EXPECT_EQ("", list[0].Name());
   EXPECT_EQ("b", list[0].Value());
-  EXPECT_EQ(1, this->DeleteAll(cs));
+  EXPECT_EQ(1u, this->DeleteAll(cs));
 }
 
 TYPED_TEST_P(CookieStoreTest, CookieOrdering) {
@@ -1570,20 +1572,20 @@
   CookieList cookies = this->GetCookieListWithOptions(
       cs, this->www_foo_foo_.url(), CookieOptions());
   ASSERT_EQ(1u, cookies.size());
-  EXPECT_EQ(1, this->DeleteCanonicalCookie(cs, cookies[0]));
+  EXPECT_EQ(1u, this->DeleteCanonicalCookie(cs, cookies[0]));
   EXPECT_EQ(1u, this->GetAllCookies(cs).size());
   EXPECT_EQ("", this->GetCookies(cs, this->www_foo_foo_.url()));
   EXPECT_EQ("A=C", this->GetCookies(cs, this->www_foo_bar_.url()));
 
   // Deleting the "/foo" cookie again should fail.
-  EXPECT_EQ(0, this->DeleteCanonicalCookie(cs, cookies[0]));
+  EXPECT_EQ(0u, this->DeleteCanonicalCookie(cs, cookies[0]));
 
   // Try to delete the "/bar" cookie after overwriting it with a new cookie.
   cookies = this->GetCookieListWithOptions(cs, this->www_foo_bar_.url(),
                                            CookieOptions());
   ASSERT_EQ(1u, cookies.size());
   EXPECT_TRUE(this->SetCookie(cs, this->http_www_foo_.url(), "A=D;Path=/bar"));
-  EXPECT_EQ(0, this->DeleteCanonicalCookie(cs, cookies[0]));
+  EXPECT_EQ(0u, this->DeleteCanonicalCookie(cs, cookies[0]));
   EXPECT_EQ(1u, this->GetAllCookies(cs).size());
   EXPECT_EQ("A=D", this->GetCookies(cs, this->www_foo_bar_.url()));
 
@@ -1591,7 +1593,7 @@
   cookies = this->GetCookieListWithOptions(cs, this->www_foo_bar_.url(),
                                            CookieOptions());
   ASSERT_EQ(1u, cookies.size());
-  EXPECT_EQ(1, this->DeleteCanonicalCookie(cs, cookies[0]));
+  EXPECT_EQ(1u, this->DeleteCanonicalCookie(cs, cookies[0]));
   EXPECT_EQ(0u, this->GetAllCookies(cs).size());
   EXPECT_EQ("", this->GetCookies(cs, this->www_foo_bar_.url()));
 }
diff --git a/net/log/file_net_log_observer.cc b/net/log/file_net_log_observer.cc
index 0c05f9e1..7f78c9f 100644
--- a/net/log/file_net_log_observer.cc
+++ b/net/log/file_net_log_observer.cc
@@ -16,10 +16,10 @@
 #include "base/files/file_util.h"
 #include "base/json/json_writer.h"
 #include "base/logging.h"
-#include "base/single_thread_task_runner.h"
+#include "base/sequenced_task_runner.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/synchronization/lock.h"
-#include "base/threading/thread.h"
+#include "base/task_scheduler/post_task.h"
 #include "base/values.h"
 #include "net/log/net_log_capture_mode.h"
 #include "net/log/net_log_entry.h"
@@ -28,10 +28,21 @@
 
 namespace {
 
-// Number of events that can build up in |write_queue_| before file thread
-// is triggered to drain the queue.
+// Number of events that can build up in |write_queue_| before a task is posted
+// to the file task runner to flush them to disk.
 const int kNumWriteQueueEvents = 15;
 
+scoped_refptr<base::SequencedTaskRunner> CreateFileTaskRunner() {
+  // The tasks posted to this sequenced task runner do synchronous File I/O for
+  // the purposes of writing NetLog files.
+  //
+  // These intentionally block shutdown to ensure the log file has finished
+  // being written.
+  return base::CreateSequencedTaskRunnerWithTraits(
+      {base::MayBlock(), base::TaskPriority::USER_VISIBLE,
+       base::TaskShutdownBehavior::BLOCK_SHUTDOWN});
+}
+
 }  // namespace
 
 namespace net {
@@ -41,14 +52,14 @@
 
 // WriteQueue receives events from FileNetLogObserver on the main thread and
 // holds them in a queue until they are drained from the queue and written to
-// file on the file thread.
+// file on the file task runner.
 //
 // WriteQueue contains the resources shared between the main thread and the
-// file thread. |lock_| must be acquired to read or write to |queue_| and
+// file task runner. |lock_| must be acquired to read or write to |queue_| and
 // |memory_|.
 //
 // WriteQueue is refcounted and should be destroyed once all events on the
-// file thread have finished executing.
+// file task runner have finished executing.
 class FileNetLogObserver::WriteQueue
     : public base::RefCountedThreadSafe<WriteQueue> {
  public:
@@ -73,17 +84,17 @@
 
   ~WriteQueue();
 
-  // Queue of events to be written shared between main thread and file thread.
-  // Main thread adds events to the queue and the file thread drains them and
-  // writes the events to file.
+  // Queue of events to be written, shared between main thread and file task
+  // runner. Main thread adds events to the queue and the file task runner
+  // drains them and writes the events to file.
   //
   // |lock_| must be acquired to read or write to this.
   EventQueue queue_;
 
   // Tracks how much memory is being used by the virtual write queue.
   // Incremented in AddEntryToQueue() when events are added to the
-  // buffer, and decremented when SwapQueue() is called and the file thread's
-  // local queue is swapped with the shared write queue.
+  // buffer, and decremented when SwapQueue() is called and the file task
+  // runner's local queue is swapped with the shared write queue.
   //
   // |lock_| must be acquired to read or write to this.
   size_t memory_;
@@ -95,14 +106,14 @@
   // Protects access to |queue_| and |memory_|.
   //
   // A lock is necessary because |queue_| and |memory_| are shared between the
-  // file thread and the main thread. NetLog's lock protects OnAddEntry(),
+  // file task runner and the main thread. NetLog's lock protects OnAddEntry(),
   // which calls AddEntryToQueue(), but it does not protect access to the
   // observer's member variables. Thus, a race condition exists if a thread is
-  // calling OnAddEntry() at the same time that the file thread is accessing
-  // |memory_| and |queue_| to write events to file. The |queue_| and |memory_|
-  // counter are necessary to bound the amount of memory that is used for the
-  // queue in the event that the file thread lags significantly behind the main
-  // thread in writing events to file.
+  // calling OnAddEntry() at the same time that the file task runner is
+  // accessing |memory_| and |queue_| to write events to file. The |queue_| and
+  // |memory_| counter are necessary to bound the amount of memory that is used
+  // for the queue in the event that the file task runner lags significantly
+  // behind the main thread in writing events to file.
   base::Lock lock_;
 
   DISALLOW_COPY_AND_ASSIGN(WriteQueue);
@@ -138,14 +149,14 @@
 // This implementation of FileWriter is used when the observer is in bounded
 // mode.
 // BoundedFileWriter can be constructed on any thread, and afterwards is only
-// accessed on the file thread.
+// accessed on the file task runner.
 class FileNetLogObserver::BoundedFileWriter
     : public FileNetLogObserver::FileWriter {
  public:
   BoundedFileWriter(const base::FilePath& directory,
                     size_t max_file_size,
                     size_t total_num_files,
-                    scoped_refptr<base::SingleThreadTaskRunner> task_runner);
+                    scoped_refptr<base::SequencedTaskRunner> task_runner);
 
   ~BoundedFileWriter() override;
 
@@ -180,8 +191,8 @@
   // the constant file.
   const size_t max_file_size_;
 
-  // Task runner from the file thread.
-  const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
+  // Task runner for doing file operations.
+  const scoped_refptr<base::SequencedTaskRunner> task_runner_;
 
   DISALLOW_COPY_AND_ASSIGN(BoundedFileWriter);
 };
@@ -189,12 +200,12 @@
 // This implementation of FileWriter is used when the observer is in unbounded
 // mode.
 // UnboundedFileWriter can be constructed on any thread, and afterwards is only
-// accessed on the file thread.
+// accessed on the file task runner.
 class FileNetLogObserver::UnboundedFileWriter
     : public FileNetLogObserver::FileWriter {
  public:
   UnboundedFileWriter(const base::FilePath& path,
-                      scoped_refptr<base::SingleThreadTaskRunner> task_runner);
+                      scoped_refptr<base::SequencedTaskRunner> task_runner);
 
   ~UnboundedFileWriter() override;
 
@@ -211,19 +222,22 @@
   // Is set to true after the first event is written to the log file.
   bool first_event_written_;
 
-  // Task runner from the file thread.
-  const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
+  // Task runner for doing file operations.
+  const scoped_refptr<base::SequencedTaskRunner> task_runner_;
 
   DISALLOW_COPY_AND_ASSIGN(UnboundedFileWriter);
 };
 
 std::unique_ptr<FileNetLogObserver> FileNetLogObserver::CreateBounded(
-    scoped_refptr<base::SingleThreadTaskRunner> file_task_runner,
     const base::FilePath& directory,
     size_t max_total_size,
     size_t total_num_files,
     std::unique_ptr<base::Value> constants) {
   DCHECK_GT(total_num_files, 0u);
+
+  scoped_refptr<base::SequencedTaskRunner> file_task_runner =
+      CreateFileTaskRunner();
+
   // The BoundedFileWriter uses a soft limit to write events to file that allows
   // the size of the file to exceed the limit, but the WriteQueue uses a hard
   // limit which the size of |WriteQueue::queue_| cannot exceed. Thus, the
@@ -248,9 +262,11 @@
 }
 
 std::unique_ptr<FileNetLogObserver> FileNetLogObserver::CreateUnbounded(
-    scoped_refptr<base::SingleThreadTaskRunner> file_task_runner,
     const base::FilePath& log_path,
     std::unique_ptr<base::Value> constants) {
+  scoped_refptr<base::SequencedTaskRunner> file_task_runner =
+      CreateFileTaskRunner();
+
   std::unique_ptr<FileWriter> file_writer(
       new UnboundedFileWriter(log_path, file_task_runner));
 
@@ -268,9 +284,9 @@
     net_log()->DeprecatedRemoveObserver(this);
     file_task_runner_->PostTask(
         FROM_HERE, base::Bind(&FileNetLogObserver::FileWriter::DeleteAllFiles,
-                              base::Unretained(file_writer_)));
+                              base::Unretained(file_writer_.get())));
   }
-  file_task_runner_->DeleteSoon(FROM_HERE, file_writer_);
+  file_task_runner_->DeleteSoon(FROM_HERE, file_writer_.release());
 }
 
 void FileNetLogObserver::StartObserving(NetLog* net_log,
@@ -279,14 +295,22 @@
 }
 
 void FileNetLogObserver::StopObserving(std::unique_ptr<base::Value> polled_data,
-                                       const base::Closure& callback) {
+                                       base::OnceClosure optional_callback) {
   net_log()->DeprecatedRemoveObserver(this);
 
-  file_task_runner_->PostTaskAndReply(
-      FROM_HERE, base::Bind(&FileNetLogObserver::FileWriter::FlushThenStop,
-                            base::Unretained(file_writer_), write_queue_,
-                            base::Passed(&polled_data)),
-      callback);
+  base::OnceClosure bound_flush_then_stop =
+      base::Bind(&FileNetLogObserver::FileWriter::FlushThenStop,
+                 base::Unretained(file_writer_.get()), write_queue_,
+                 base::Passed(&polled_data));
+
+  // Note that PostTaskAndReply() requires a non-null closure.
+  if (!optional_callback.is_null()) {
+    file_task_runner_->PostTaskAndReply(FROM_HERE,
+                                        std::move(bound_flush_then_stop),
+                                        std::move(optional_callback));
+  } else {
+    file_task_runner_->PostTask(FROM_HERE, std::move(bound_flush_then_stop));
+  }
 }
 
 void FileNetLogObserver::OnAddEntry(const NetLogEntry& entry) {
@@ -298,31 +322,32 @@
 
   size_t queue_size = write_queue_->AddEntryToQueue(std::move(json));
 
-  // If events build up in |write_queue_|, trigger the file thread to drain
+  // If events build up in |write_queue_|, trigger the file task runner to drain
   // the queue. Because only 1 item is added to the queue at a time, if
   // queue_size > kNumWriteQueueEvents a task has already been posted, or will
   // be posted.
   if (queue_size == kNumWriteQueueEvents) {
     file_task_runner_->PostTask(
-        FROM_HERE, base::Bind(&FileNetLogObserver::FileWriter::Flush,
-                              base::Unretained(file_writer_), write_queue_));
+        FROM_HERE,
+        base::Bind(&FileNetLogObserver::FileWriter::Flush,
+                   base::Unretained(file_writer_.get()), write_queue_));
   }
 }
 
 FileNetLogObserver::FileNetLogObserver(
-    scoped_refptr<base::SingleThreadTaskRunner> file_task_runner,
+    scoped_refptr<base::SequencedTaskRunner> file_task_runner,
     std::unique_ptr<FileWriter> file_writer,
     scoped_refptr<WriteQueue> write_queue,
     std::unique_ptr<base::Value> constants)
     : file_task_runner_(std::move(file_task_runner)),
       write_queue_(std::move(write_queue)),
-      file_writer_(file_writer.release()) {
+      file_writer_(std::move(file_writer)) {
   if (!constants)
     constants = GetNetConstants();
   file_task_runner_->PostTask(
-      FROM_HERE,
-      base::Bind(&FileNetLogObserver::FileWriter::Initialize,
-                 base::Unretained(file_writer_), base::Passed(&constants)));
+      FROM_HERE, base::Bind(&FileNetLogObserver::FileWriter::Initialize,
+                            base::Unretained(file_writer_.get()),
+                            base::Passed(&constants)));
 }
 
 FileNetLogObserver::WriteQueue::WriteQueue(size_t memory_max)
@@ -367,12 +392,12 @@
     const base::FilePath& directory,
     size_t max_file_size,
     size_t total_num_files,
-    scoped_refptr<base::SingleThreadTaskRunner> task_runner)
+    scoped_refptr<base::SequencedTaskRunner> task_runner)
     : directory_(directory),
       total_num_files_(total_num_files),
       current_file_idx_(0),
       max_file_size_(max_file_size),
-      task_runner_(task_runner) {
+      task_runner_(std::move(task_runner)) {
   event_files_.resize(total_num_files_);
 }
 
@@ -473,8 +498,8 @@
 
 FileNetLogObserver::UnboundedFileWriter::UnboundedFileWriter(
     const base::FilePath& path,
-    scoped_refptr<base::SingleThreadTaskRunner> task_runner)
-    : file_path_(path), task_runner_(task_runner) {}
+    scoped_refptr<base::SequencedTaskRunner> task_runner)
+    : file_path_(path), task_runner_(std::move(task_runner)) {}
 
 FileNetLogObserver::UnboundedFileWriter::~UnboundedFileWriter() {}
 
diff --git a/net/log/file_net_log_observer.h b/net/log/file_net_log_observer.h
index 2b2b3a8..fc1fd8a 100644
--- a/net/log/file_net_log_observer.h
+++ b/net/log/file_net_log_observer.h
@@ -15,7 +15,7 @@
 namespace base {
 class Value;
 class FilePath;
-class SingleThreadTaskRunner;
+class SequencedTaskRunner;
 }  // namespace base
 
 namespace net {
@@ -42,17 +42,12 @@
 // large this file can grow; all events added will be written to the file.
 //
 // The consumer must call StartObserving before calling StopObserving, and must
-// call each method exactly once in the lifetime of the observer. StartObserving
-// and StopObserving must be called on the same thread, but there is no
-// restriction on which thread is used.
+// call each method exactly once in the lifetime of the observer.
 class NET_EXPORT FileNetLogObserver : public NetLog::ThreadSafeObserver {
  public:
   // Creates a FileNetLogObserver in bounded mode.
   //
-  // |file_task_runner| indicates the task runner that should be used to post
-  // tasks from the main thread to the file thread.
-  //
-  // |directory| is the directory where the log files will be.
+  // |directory| is the directory where the log files will be written to.
   //
   // |max_total_size| is the approximate limit on the cumulative size of all
   // netlog files.
@@ -64,7 +59,6 @@
   // the log. It should generally be a modified version of GetNetConstants().
   // If not present, the output of GetNetConstants() will be used.
   static std::unique_ptr<FileNetLogObserver> CreateBounded(
-      scoped_refptr<base::SingleThreadTaskRunner> file_task_runner,
       const base::FilePath& directory,
       size_t max_total_size,
       size_t total_num_files,
@@ -72,16 +66,12 @@
 
   // Creates a FileNetLogObserver in unbounded mode.
   //
-  // |file_task_runner| indicates the task runner that should be used to post
-  // tasks from the main thread to the file thread.
-  //
-  // |log_path| is where the log file will be.
+  // |log_path| is where the log file will be written to.
   //
   // |constants| is an optional legend for decoding constant values used in
   // the log. It should generally be a modified version of GetNetConstants().
   // If not present, the output of GetNetConstants() will be used.
   static std::unique_ptr<FileNetLogObserver> CreateUnbounded(
-      scoped_refptr<base::SingleThreadTaskRunner> file_task_runner,
       const base::FilePath& log_path,
       std::unique_ptr<base::Value> constants);
 
@@ -98,11 +88,11 @@
   // |polled_data| is an optional argument used to add additional network stack
   // state to the log.
   //
-  // |callback| will be run on whichever thread StopObserving() was called on
-  // once all file writing is complete and the netlog files can be accessed
-  // safely.
+  // If non-null, |optional_callback| will be run on whichever thread
+  // StopObserving() was called on once all file writing is complete and the
+  // netlog files can be accessed safely.
   void StopObserving(std::unique_ptr<base::Value> polled_data,
-                     const base::Closure& callback);
+                     base::OnceClosure optional_callback);
 
   // NetLog::ThreadSafeObserver
   void OnAddEntry(const NetLogEntry& entry) override;
@@ -113,29 +103,26 @@
   class BoundedFileWriter;
   class UnboundedFileWriter;
 
-  FileNetLogObserver(
-      scoped_refptr<base::SingleThreadTaskRunner> file_task_runner,
-      std::unique_ptr<FileWriter> file_writer,
-      scoped_refptr<WriteQueue> write_queue,
-      std::unique_ptr<base::Value> constants);
+  FileNetLogObserver(scoped_refptr<base::SequencedTaskRunner> file_task_runner,
+                     std::unique_ptr<FileWriter> file_writer,
+                     scoped_refptr<WriteQueue> write_queue,
+                     std::unique_ptr<base::Value> constants);
 
-  scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_;
+  scoped_refptr<base::SequencedTaskRunner> file_task_runner_;
 
-  // The |write_queue_| object is shared between the file thread and the main
-  // thread, and should be alive for the entirety of the observer's lifetime.
-  // It should be destroyed once both the observer has been destroyed and all
-  // tasks posted to the file thread have completed.
+  // The |write_queue_| object is shared between the file task runner and the
+  // main thread, and should be alive for the entirety of the observer's
+  // lifetime. It should be destroyed once both the observer has been destroyed
+  // and all tasks posted to the file task runner have completed.
   scoped_refptr<WriteQueue> write_queue_;
 
-  // This is the owning reference to a file thread object. The observer is
-  // responsible for destroying the file thread object by posting a task from
-  // the main thread to the file thread to destroy the FileWriter when the
-  // observer is destroyed.
+  // The FileNetLogObserver is shared between the main thread and
+  // |file_task_runner_|.
   //
-  // The use of base::Unretained with |file_writer_| to post tasks to the file
-  // thread is safe because the FileWriter object will be alive until the
-  // observer's destruction.
-  FileWriter* file_writer_;
+  // Conceptually FileNetLogObserver owns it, however on destruction its
+  // deletion is deferred until outstanding tasks on |file_task_runner_| have
+  // finished (since it is posted using base::Unretained()).
+  std::unique_ptr<FileWriter> file_writer_;
 
   DISALLOW_COPY_AND_ASSIGN(FileNetLogObserver);
 };
diff --git a/net/log/file_net_log_observer_unittest.cc b/net/log/file_net_log_observer_unittest.cc
index 0cbf7d1..75082a766 100644
--- a/net/log/file_net_log_observer_unittest.cc
+++ b/net/log/file_net_log_observer_unittest.cc
@@ -21,6 +21,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
+#include "base/task_scheduler/task_scheduler.h"
 #include "base/threading/thread.h"
 #include "base/values.h"
 #include "net/base/test_completion_callback.h"
@@ -159,21 +160,16 @@
     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
     bounded_log_dir_ = temp_dir_.GetPath();
     unbounded_log_path_ = bounded_log_dir_.AppendASCII("net-log.json");
-    file_thread_.reset(new base::Thread("NetLog File Thread"));
-    file_thread_->StartWithOptions(
-        base::Thread::Options(base::MessageLoop::TYPE_DEFAULT, 0));
-    ASSERT_TRUE(file_thread_->WaitUntilThreadStarted());
   }
 
   void CreateAndStartObserving(std::unique_ptr<base::Value> constants) {
     bool bounded = GetParam();
     if (bounded) {
       logger_ = FileNetLogObserver::CreateBounded(
-          file_thread_->task_runner(), bounded_log_dir_, kLargeFileSize,
-          kTotalNumFiles, std::move(constants));
+          bounded_log_dir_, kLargeFileSize, kTotalNumFiles,
+          std::move(constants));
     } else {
-      logger_ = FileNetLogObserver::CreateUnbounded(file_thread_->task_runner(),
-                                                    unbounded_log_path_,
+      logger_ = FileNetLogObserver::CreateUnbounded(unbounded_log_path_,
                                                     std::move(constants));
     }
 
@@ -194,6 +190,11 @@
   }
 
   bool LogFilesExist() {
+    // The log files are written by a sequenced task runner. Drain all the
+    // scheduled tasks to ensure that the file writing ones have run before
+    // checking if they exist.
+    base::TaskScheduler::GetInstance()->FlushForTesting();
+
     bool bounded = GetParam();
     if (bounded) {
       if (base::PathExists(bounded_log_dir_.AppendASCII("constants.json")) ||
@@ -212,7 +213,6 @@
 
  protected:
   NetLog net_log_;
-  std::unique_ptr<base::Thread> file_thread_;
   std::unique_ptr<FileNetLogObserver> logger_;
 
  private:
@@ -227,18 +227,13 @@
   void SetUp() override {
     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
     bounded_log_dir_ = temp_dir_.GetPath();
-    file_thread_.reset(new base::Thread("NetLog File Thread"));
-    file_thread_->StartWithOptions(
-        base::Thread::Options(base::MessageLoop::TYPE_DEFAULT, 0));
-    ASSERT_TRUE(file_thread_->WaitUntilThreadStarted());
   }
 
   void CreateAndStartObserving(std::unique_ptr<base::Value> constants,
                                int total_file_size,
                                int num_files) {
     logger_ = FileNetLogObserver::CreateBounded(
-        file_thread_->task_runner(), bounded_log_dir_, total_file_size,
-        num_files, std::move(constants));
+        bounded_log_dir_, total_file_size, num_files, std::move(constants));
     logger_->StartObserving(&net_log_, NetLogCaptureMode::Default());
   }
 
@@ -263,7 +258,6 @@
 
  protected:
   NetLog net_log_;
-  std::unique_ptr<base::Thread> file_thread_;
   std::unique_ptr<FileNetLogObserver> logger_;
 
  private:
@@ -276,18 +270,41 @@
                         FileNetLogObserverTest,
                         ::testing::Values(true, false));
 
+// Tests deleting a FileNetLogObserver without first calling StopObserving().
 TEST_P(FileNetLogObserverTest, ObserverDestroyedWithoutStopObserving) {
   CreateAndStartObserving(nullptr);
 
   // Send dummy event
   AddEntries(logger_.get(), 1, kDummyEventSize);
 
-  logger_.reset();
-  file_thread_.reset();
+  // The log files should have been started.
+  ASSERT_TRUE(LogFilesExist());
 
+  logger_.reset();
+
+  // When the logger is re-set without having called StopObserving(), the
+  // partially written log files are deleted.
   ASSERT_FALSE(LogFilesExist());
 }
 
+// Tests calling StopObserving() with a null closure.
+TEST_P(FileNetLogObserverTest, StopObservingNullClosure) {
+  CreateAndStartObserving(nullptr);
+
+  // Send dummy event
+  AddEntries(logger_.get(), 1, kDummyEventSize);
+
+  // The log files should have been started.
+  ASSERT_TRUE(LogFilesExist());
+
+  logger_->StopObserving(nullptr, base::OnceClosure());
+
+  logger_.reset();
+
+  // Since the logger was explicitly stopped, its files should still exist.
+  ASSERT_TRUE(LogFilesExist());
+}
+
 TEST_P(FileNetLogObserverTest, GeneratesValidJSONWithNoEvents) {
   TestClosure closure;
 
@@ -801,7 +818,7 @@
 TEST_P(FileNetLogObserverTest, AddEventsFromMultipleThreadsWithStopObserving) {
   const size_t kNumThreads = 10;
   std::vector<std::unique_ptr<base::Thread>> threads(kNumThreads);
-  // Start all the threads. Waiting for them to start is to hopefuly improve
+  // Start all the threads. Waiting for them to start is to hopefully improve
   // the odds of hitting interesting races once events start being added.
   for (size_t i = 0; i < threads.size(); ++i) {
     threads[i] = base::MakeUnique<base::Thread>(
@@ -828,13 +845,15 @@
 
   // Join all the threads.
   threads.clear();
+
+  ASSERT_TRUE(LogFilesExist());
 }
 
 TEST_P(FileNetLogObserverTest,
        AddEventsFromMultipleThreadsWithoutStopObserving) {
   const size_t kNumThreads = 10;
   std::vector<std::unique_ptr<base::Thread>> threads(kNumThreads);
-  // Start all the threads. Waiting for them to start is to hopefuly improve
+  // Start all the threads. Waiting for them to start is to hopefully improve
   // the odds of hitting interesting races once events start being added.
   for (size_t i = 0; i < threads.size(); ++i) {
     threads[i] = base::MakeUnique<base::Thread>(
@@ -859,6 +878,9 @@
 
   // Join all the threads.
   threads.clear();
+
+  // The log file doesn't exist since StopObserving() was not called.
+  ASSERT_FALSE(LogFilesExist());
 }
 
 }  // namespace
diff --git a/net/tools/transport_security_state_generator/input_file_parsers.cc b/net/tools/transport_security_state_generator/input_file_parsers.cc
index 2a8d3d8..691b403 100644
--- a/net/tools/transport_security_state_generator/input_file_parsers.cc
+++ b/net/tools/transport_security_state_generator/input_file_parsers.cc
@@ -167,6 +167,12 @@
 }  // namespace
 
 bool ParseCertificatesFile(base::StringPiece certs_input, Pinsets* pinsets) {
+  if (certs_input.find("\r\n") != base::StringPiece::npos) {
+    LOG(ERROR) << "CRLF line-endings found in the pins file. All files must "
+                  "use LF (unix style) line-endings.";
+    return false;
+  }
+
   std::string line;
   CertificateParserState current_state = CertificateParserState::PRE_NAME;
 
diff --git a/ppapi/proxy/audio_encoder_resource.h b/ppapi/proxy/audio_encoder_resource.h
index 0290d21be..acdd774 100644
--- a/ppapi/proxy/audio_encoder_resource.h
+++ b/ppapi/proxy/audio_encoder_resource.h
@@ -9,7 +9,6 @@
 
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "base/memory/scoped_vector.h"
 #include "ppapi/proxy/connection.h"
 #include "ppapi/proxy/plugin_resource.h"
 #include "ppapi/shared_impl/media_stream_buffer_manager.h"
diff --git a/ppapi/proxy/video_decoder_resource.cc b/ppapi/proxy/video_decoder_resource.cc
index 26fee481..495d257 100644
--- a/ppapi/proxy/video_decoder_resource.cc
+++ b/ppapi/proxy/video_decoder_resource.cc
@@ -238,14 +238,10 @@
       return PP_ERROR_NOMEMORY;
 
     available_shm_buffers_.push_back(shm_buffer.get());
-    if (shm_buffers_.size() < kMaximumPendingDecodes) {
-      shm_buffers_.push_back(shm_buffer.release());
-    } else {
-      // Delete manually since ScopedVector won't delete the existing element if
-      // we just assign it.
-      delete shm_buffers_[shm_id];
-      shm_buffers_[shm_id] = shm_buffer.release();
-    }
+    if (shm_buffers_.size() < kMaximumPendingDecodes)
+      shm_buffers_.push_back(std::move(shm_buffer));
+    else
+      shm_buffers_[shm_id] = std::move(shm_buffer);
   }
 
   // At this point we should have shared memory to hold the plugin's buffer.
@@ -486,7 +482,7 @@
     return;
   }
   // Make the shm buffer available.
-  available_shm_buffers_.push_back(shm_buffers_[shm_id]);
+  available_shm_buffers_.push_back(shm_buffers_[shm_id].get());
   // If the plugin is waiting, let it call Decode again.
   if (decode_callback_.get()) {
     scoped_refptr<TrackedCallback> callback;
diff --git a/ppapi/proxy/video_decoder_resource.h b/ppapi/proxy/video_decoder_resource.h
index adb3f05..0fd70400 100644
--- a/ppapi/proxy/video_decoder_resource.h
+++ b/ppapi/proxy/video_decoder_resource.h
@@ -9,11 +9,11 @@
 
 #include <memory>
 #include <queue>
+#include <vector>
 
 #include "base/containers/hash_tables.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "base/memory/scoped_vector.h"
 #include "ppapi/proxy/connection.h"
 #include "ppapi/proxy/plugin_resource.h"
 #include "ppapi/proxy/ppapi_proxy_export.h"
@@ -143,8 +143,8 @@
   void DeleteGLTexture(uint32_t texture_id);
   void WriteNextPicture();
 
-  // ScopedVector to own the shared memory buffers.
-  ScopedVector<ShmBuffer> shm_buffers_;
+  // The shared memory buffers.
+  std::vector<std::unique_ptr<ShmBuffer>> shm_buffers_;
 
   // List of available shared memory buffers.
   typedef std::vector<ShmBuffer*> ShmBufferList;
diff --git a/ppapi/proxy/video_encoder_resource.cc b/ppapi/proxy/video_encoder_resource.cc
index 0f7c890..10aa8fa 100644
--- a/ppapi/proxy/video_encoder_resource.cc
+++ b/ppapi/proxy/video_encoder_resource.cc
@@ -401,10 +401,10 @@
         new base::SharedMemory(shm_handles[i], true));
     CHECK(shm->Map(buffer_length));
 
-    ShmBuffer* buffer = new ShmBuffer(i, std::move(shm));
-    shm_buffers_.push_back(buffer);
+    auto buffer = base::MakeUnique<ShmBuffer>(i, std::move(shm));
     bitstream_buffer_map_.insert(
         std::make_pair(buffer->shm->memory(), buffer->id));
+    shm_buffers_.push_back(std::move(buffer));
   }
 }
 
diff --git a/ppapi/proxy/video_encoder_resource.h b/ppapi/proxy/video_encoder_resource.h
index 59877d3..e04c513 100644
--- a/ppapi/proxy/video_encoder_resource.h
+++ b/ppapi/proxy/video_encoder_resource.h
@@ -9,10 +9,10 @@
 
 #include <deque>
 #include <memory>
+#include <vector>
 
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "base/memory/scoped_vector.h"
 #include "ppapi/proxy/connection.h"
 #include "ppapi/proxy/plugin_resource.h"
 #include "ppapi/shared_impl/media_stream_buffer_manager.h"
@@ -46,7 +46,7 @@
     ShmBuffer(uint32_t id, std::unique_ptr<base::SharedMemory> shm);
     ~ShmBuffer();
 
-    // Index of the buffer in the ScopedVector. Buffers have the same id in
+    // Index of the buffer in the vector. Buffers have the same id in
     // the plugin and the host.
     uint32_t id;
     std::unique_ptr<base::SharedMemory> shm;
@@ -56,7 +56,7 @@
     BitstreamBuffer(uint32_t id, uint32_t size, bool key_frame);
     ~BitstreamBuffer();
 
-    // Index of the buffer in the ScopedVector. Same as ShmBuffer::id.
+    // Index of the buffer in the vector. Same as ShmBuffer::id.
     uint32_t id;
     uint32_t size;
     bool key_frame;
@@ -141,7 +141,7 @@
       VideoFrameMap;
   VideoFrameMap video_frames_;
 
-  ScopedVector<ShmBuffer> shm_buffers_;
+  std::vector<std::unique_ptr<ShmBuffer>> shm_buffers_;
 
   std::deque<BitstreamBuffer> available_bitstream_buffers_;
   typedef std::map<void*, uint32_t> BitstreamBufferMap;
diff --git a/ppapi/proxy/video_encoder_resource_unittest.cc b/ppapi/proxy/video_encoder_resource_unittest.cc
index 5dc29c2..447643cf 100644
--- a/ppapi/proxy/video_encoder_resource_unittest.cc
+++ b/ppapi/proxy/video_encoder_resource_unittest.cc
@@ -6,7 +6,9 @@
 
 #include <stdint.h>
 
+#include <memory>
 #include <utility>
+#include <vector>
 
 #include "base/memory/shared_memory.h"
 #include "base/process/process.h"
@@ -290,7 +292,7 @@
   void SendBitstreamBuffers(const ResourceMessageCallParams& params,
                             uint32_t buffer_length) {
     std::vector<SerializedHandle> handles;
-    for (base::SharedMemory* mem : shared_memory_bitstreams_) {
+    for (const auto& mem : shared_memory_bitstreams_) {
       ASSERT_EQ(mem->requested_size(), buffer_length);
       base::SharedMemoryHandle handle = mem->handle().Duplicate();
       ASSERT_TRUE(handle.IsValid());
@@ -423,7 +425,7 @@
   const PPB_VideoEncoder_0_2* encoder_iface_;
   const PPB_VideoEncoder_0_1* encoder_iface_0_1_;
 
-  ScopedVector<base::SharedMemory> shared_memory_bitstreams_;
+  std::vector<std::unique_ptr<base::SharedMemory>> shared_memory_bitstreams_;
 
   MediaStreamBufferManager video_frames_manager_;
 };
diff --git a/services/metrics/public/cpp/ukm_recorder.h b/services/metrics/public/cpp/ukm_recorder.h
index fcefa5b..ef1802f 100644
--- a/services/metrics/public/cpp/ukm_recorder.h
+++ b/services/metrics/public/cpp/ukm_recorder.h
@@ -20,6 +20,7 @@
 
 class ContextualSearchRankerLoggerImpl;
 class PluginInfoMessageFilter;
+class ProcessMemoryMetricsEmitter;
 class UkmPageLoadMetricsObserver;
 class LocalNetworkRequestsPageLoadMetricsObserver;
 
@@ -89,6 +90,7 @@
   friend autofill::AutofillMetrics;
   friend payments::JourneyLogger;
   friend ContextualSearchRankerLoggerImpl;
+  friend ProcessMemoryMetricsEmitter;
   friend PluginInfoMessageFilter;
   friend UkmPageLoadMetricsObserver;
   friend LocalNetworkRequestsPageLoadMetricsObserver;
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index df6a60f..d9d6dbc 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -2781,6 +2781,524 @@
       }
     ]
   },
+  "Chromium Win 10 GCE Tests": {
+    "gtest_tests": [
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "accessibility_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "app_shell_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "aura_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "base_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "battor_agent_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "boringssl_crypto_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "boringssl_ssl_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "shards": 10
+        },
+        "test": "browser_tests"
+      },
+      {
+        "args": [
+          "--enable-browser-side-navigation"
+        ],
+        "name": "browser_side_navigation_browser_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "shards": 10
+        },
+        "test": "browser_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "cacheinvalidation_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "capture_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "cast_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "cc_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "chrome_app_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "chrome_elf_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "chromedriver_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "components_browsertests"
+      },
+      {
+        "args": [
+          "--enable-browser-side-navigation"
+        ],
+        "name": "browser_side_navigation_components_browsertests",
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "components_browsertests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "components_unittests"
+      },
+      {
+        "args": [
+          "--enable-browser-side-navigation"
+        ],
+        "name": "browser_side_navigation_components_unittests",
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "components_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "compositor_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "content_browsertests"
+      },
+      {
+        "args": [
+          "--enable-browser-side-navigation"
+        ],
+        "name": "browser_side_navigation_content_browsertests",
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "content_browsertests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "content_unittests"
+      },
+      {
+        "args": [
+          "--enable-browser-side-navigation"
+        ],
+        "name": "browser_side_navigation_content_unittests",
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "content_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "courgette_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "crypto_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "device_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "display_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "events_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "extensions_browsertests"
+      },
+      {
+        "args": [
+          "--enable-browser-side-navigation"
+        ],
+        "name": "browser_side_navigation_extensions_browsertests",
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "extensions_browsertests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "extensions_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "gcm_unit_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "gfx_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "gn_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "google_apis_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "gpu_ipc_service_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "gpu_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "headless_browsertests"
+      },
+      {
+        "args": [
+          "--enable-browser-side-navigation"
+        ],
+        "name": "browser_side_navigation_headless_browsertests",
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "headless_browsertests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "headless_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "install_static_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "installer_util_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "ipc_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "jingle_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "keyboard_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "latency_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "libjingle_xmpp_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "media_blink_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "media_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "message_center_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "midi_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "mojo_common_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "mojo_public_bindings_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "mojo_public_system_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "mojo_system_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "nacl_loader_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "native_theme_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "net_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "pdf_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "ppapi_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "printing_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "remoting_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "sbox_integration_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "sbox_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "sbox_validation_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "services_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "setup_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "skia_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "sql_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "storage_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "sync_integration_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "ui_base_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "ui_touch_selection_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "unit_tests"
+      },
+      {
+        "args": [
+          "--enable-browser-side-navigation"
+        ],
+        "name": "browser_side_navigation_unit_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "unit_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "url_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "views_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "wm_unittests"
+      }
+    ]
+  },
   "ClangToTAndroid x64": {
     "gtest_tests": [
       {
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
index 928eb277..d9455d02 100644
--- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
+++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
@@ -9,15 +9,15 @@
 crbug.com/591099 accessibility/adjacent-continuations-cause-assertion-failure.html [ Failure ]
 crbug.com/591099 accessibility/adopt-node-causes-crash.html [ Failure ]
 crbug.com/591099 accessibility/anonymous-render-block-in-continuation-causes-crash.html [ Crash Failure ]
-crbug.com/591099 accessibility/aom-relation-properties.html [ Crash ]
-crbug.com/591099 accessibility/aom-string-properties.html [ Crash ]
-crbug.com/591099 accessibility/aom.html [ Crash ]
-crbug.com/591099 accessibility/aria-activedescendant-events.html [ Crash ]
-crbug.com/591099 accessibility/aria-activedescendant.html [ Crash ]
+crbug.com/591099 accessibility/aom-relation-properties.html [ Crash Pass ]
+crbug.com/591099 accessibility/aom-string-properties.html [ Crash Pass ]
+crbug.com/591099 accessibility/aom.html [ Crash Pass ]
+crbug.com/591099 accessibility/aria-activedescendant-events.html [ Crash Pass ]
+crbug.com/591099 accessibility/aria-activedescendant.html [ Crash Failure ]
 crbug.com/591099 accessibility/aria-checkbox-checked-mixed.html [ Failure ]
 crbug.com/591099 accessibility/aria-checkbox-checked.html [ Failure ]
 crbug.com/591099 accessibility/aria-checkbox-sends-notification.html [ Failure ]
-crbug.com/591099 accessibility/aria-combobox-activedescendant.html [ Crash ]
+crbug.com/591099 accessibility/aria-combobox-activedescendant.html [ Crash Pass ]
 crbug.com/591099 accessibility/aria-controls-with-tabs.html [ Crash Failure ]
 crbug.com/591099 accessibility/aria-controls.html [ Crash Failure ]
 crbug.com/591099 accessibility/aria-describedby-on-input.html [ Crash Failure ]
@@ -25,7 +25,7 @@
 crbug.com/591099 accessibility/aria-fallback-roles.html [ Failure ]
 crbug.com/591099 accessibility/aria-flowto.html [ Failure ]
 crbug.com/591099 accessibility/aria-hidden-children-not-in-text-from-content.html [ Failure ]
-crbug.com/591099 accessibility/aria-hidden-hides-all-elements.html [ Crash ]
+crbug.com/591099 accessibility/aria-hidden-hides-all-elements.html [ Crash Failure ]
 crbug.com/591099 accessibility/aria-hidden-update.html [ Failure ]
 crbug.com/591099 accessibility/aria-hidden-updates-alldescendants.html [ Failure ]
 crbug.com/591099 accessibility/aria-hidden-with-elements.html [ Crash Failure ]
@@ -51,18 +51,18 @@
 crbug.com/591099 accessibility/aria-text-role.html [ Failure ]
 crbug.com/591099 accessibility/aria-toggle-button-with-title.html [ Failure ]
 crbug.com/591099 accessibility/aria-used-on-image-maps.html [ Failure ]
-crbug.com/591099 accessibility/bounds-calc.html [ Crash ]
+crbug.com/591099 accessibility/bounds-calc.html [ Crash Failure ]
 crbug.com/591099 accessibility/br-element-has-correct-title.html [ Failure ]
 crbug.com/591099 accessibility/button-title-uses-inner-img-alt.html [ Failure ]
 crbug.com/591099 accessibility/calling-accessibility-methods-with-pending-layout-causes-crash.html [ Failure ]
 crbug.com/591099 accessibility/canvas-accessibilitynodeobject.html [ Failure ]
 crbug.com/591099 accessibility/canvas-description-and-role.html [ Failure ]
 crbug.com/591099 accessibility/canvas-fallback-content-2.html [ Crash Timeout ]
-crbug.com/591099 accessibility/canvas-fallback-content-labels.html [ Crash ]
+crbug.com/591099 accessibility/canvas-fallback-content-labels.html [ Crash Failure ]
 crbug.com/591099 accessibility/canvas-fallback-content.html [ Failure ]
 crbug.com/591099 accessibility/chromium-only-roles.html [ Failure ]
-crbug.com/591099 accessibility/click-event.html [ Crash ]
-crbug.com/591099 accessibility/clickable.html [ Crash ]
+crbug.com/591099 accessibility/click-event.html [ Crash Pass ]
+crbug.com/591099 accessibility/clickable.html [ Crash Failure ]
 crbug.com/591099 accessibility/color-well.html [ Failure ]
 crbug.com/591099 accessibility/computed-name.html [ Crash Timeout ]
 crbug.com/591099 accessibility/computed-role.html [ Crash Timeout ]
@@ -80,13 +80,13 @@
 crbug.com/591099 accessibility/crashing-a-tag-in-map.html [ Failure ]
 crbug.com/591099 accessibility/css-generated-content.html [ Failure ]
 crbug.com/591099 accessibility/css-styles.html [ Crash Failure ]
-crbug.com/591099 accessibility/description-calc-aria-describedby.html [ Crash ]
-crbug.com/591099 accessibility/description-calc-inputs.html [ Crash ]
-crbug.com/591099 accessibility/description-calc-native-markup-input-buttons.html [ Crash ]
+crbug.com/591099 accessibility/description-calc-aria-describedby.html [ Crash Pass ]
+crbug.com/591099 accessibility/description-calc-inputs.html [ Crash Pass ]
+crbug.com/591099 accessibility/description-calc-native-markup-input-buttons.html [ Crash Pass ]
 crbug.com/591099 accessibility/dimensions-include-descendants.html [ Failure ]
-crbug.com/591099 accessibility/disabled-controls-not-focusable.html [ Crash ]
+crbug.com/591099 accessibility/disabled-controls-not-focusable.html [ Crash Failure ]
 crbug.com/591099 accessibility/display-inline-block-crash.html [ Failure ]
-crbug.com/591099 accessibility/display-none-change.html [ Crash ]
+crbug.com/591099 accessibility/display-none-change.html [ Crash Pass ]
 crbug.com/591099 accessibility/display-table-cell-causes-crash.html [ Failure ]
 crbug.com/591099 accessibility/div-within-anchors-causes-crash.html [ Failure ]
 crbug.com/591099 accessibility/dl-role.html [ Failure ]
@@ -99,11 +99,11 @@
 crbug.com/591099 accessibility/focusable-div.html [ Crash Failure ]
 crbug.com/591099 accessibility/hang-in-isignored.html [ Failure ]
 crbug.com/591099 accessibility/heading-level.html [ Failure ]
-crbug.com/591099 accessibility/image-inside-link.html [ Crash ]
+crbug.com/591099 accessibility/image-inside-link.html [ Crash Pass ]
 crbug.com/591099 accessibility/image-link-inline-cont.html [ Failure ]
 crbug.com/591099 accessibility/image-link.html [ Failure ]
 crbug.com/591099 accessibility/image-map-title-causes-crash.html [ Failure ]
-crbug.com/591099 accessibility/image-map-update-parent-crash.html [ Crash ]
+crbug.com/591099 accessibility/image-map-update-parent-crash.html [ Crash Failure ]
 crbug.com/591099 accessibility/image-map-with-indirect-area-crash.html [ Failure Pass ]
 crbug.com/591099 accessibility/image-map1.html [ Failure ]
 crbug.com/591099 accessibility/img-alt-tag-only-whitespace.html [ Failure ]
@@ -119,63 +119,63 @@
 crbug.com/591099 accessibility/inline-text-textarea.html [ Crash Failure ]
 crbug.com/591099 accessibility/inline-text-word-boundaries.html [ Failure ]
 crbug.com/591099 accessibility/inline-text-word-boundary-causes-crash.html [ Failure ]
-crbug.com/591099 accessibility/input-aria-required.html [ Crash ]
+crbug.com/591099 accessibility/input-aria-required.html [ Crash Failure ]
 crbug.com/591099 accessibility/input-file-causes-crash.html [ Crash Failure ]
 crbug.com/591099 accessibility/input-image-alt.html [ Failure ]
-crbug.com/591099 accessibility/input-mixed.html [ Crash ]
+crbug.com/591099 accessibility/input-mixed.html [ Crash Pass ]
 crbug.com/591099 accessibility/input-type-password-value-and-selection.html [ Crash Timeout ]
 crbug.com/591099 accessibility/input-type-range-aria-value.html [ Failure ]
-crbug.com/591099 accessibility/input-type-range-value-change-event.html [ Crash ]
+crbug.com/591099 accessibility/input-type-range-value-change-event.html [ Crash Pass ]
 crbug.com/591099 accessibility/input-type-range-value-change.html [ Failure ]
 crbug.com/591099 accessibility/input-type-text-caret-position.html [ Crash Failure ]
 crbug.com/591099 accessibility/input-type-text-selection.html [ Crash Failure Timeout ]
-crbug.com/591099 accessibility/input-type-text-value-change-event.html [ Crash ]
+crbug.com/591099 accessibility/input-type-text-value-change-event.html [ Crash Pass ]
 crbug.com/591099 accessibility/insert-selected-option-into-select-causes-crash.html [ Failure ]
 crbug.com/591099 accessibility/is-richly-editable.html [ Crash Failure ]
 crbug.com/591099 accessibility/label-element-press.html [ Failure ]
 crbug.com/591099 accessibility/label-for-control-hittest.html [ Failure ]
 crbug.com/591099 accessibility/language-attribute.html [ Failure ]
 crbug.com/591099 accessibility/legend.html [ Failure ]
-crbug.com/591099 accessibility/line-for-index-endless-loop.html [ Crash ]
+crbug.com/591099 accessibility/line-for-index-endless-loop.html [ Crash Pass ]
 crbug.com/591099 accessibility/link-inside-button-accessible-text.html [ Failure ]
 crbug.com/591099 accessibility/link-inside-label.html [ Failure ]
 crbug.com/591099 accessibility/listbox-enabled-states.html [ Failure ]
-crbug.com/591099 accessibility/listbox-focus.html [ Crash ]
+crbug.com/591099 accessibility/listbox-focus.html [ Crash Pass ]
 crbug.com/591099 accessibility/listitem-presentation-inherited.html [ Crash Failure ]
 crbug.com/591099 accessibility/main-element.html [ Failure ]
 crbug.com/591099 accessibility/media-controls.html [ Failure ]
 crbug.com/591099 accessibility/menu-item-crash.html [ Failure ]
-crbug.com/591099 accessibility/menu-list-open.html [ Crash ]
-crbug.com/591099 accessibility/menu-list-optgroup.html [ Crash ]
+crbug.com/591099 accessibility/menu-list-open.html [ Crash Pass ]
+crbug.com/591099 accessibility/menu-list-optgroup.html [ Crash Pass ]
 crbug.com/591099 accessibility/menu-list-popup-reuses-objects.html [ Failure ]
 crbug.com/591099 accessibility/menu-list-selection-changed.html [ Failure ]
 crbug.com/591099 accessibility/menu-list-sends-change-notification.html [ Failure ]
 crbug.com/591099 accessibility/meter-value.html [ Failure ]
 crbug.com/591099 accessibility/misspellings.html [ Timeout ]
 crbug.com/591099 accessibility/multiselect-list-reports-active-option.html [ Failure ]
-crbug.com/591099 accessibility/name-calc-aria-label.html [ Crash ]
-crbug.com/591099 accessibility/name-calc-aria-labelledby.html [ Crash ]
-crbug.com/591099 accessibility/name-calc-aria-owns.html [ Crash ]
-crbug.com/591099 accessibility/name-calc-figure.html [ Crash ]
-crbug.com/591099 accessibility/name-calc-img.html [ Crash ]
-crbug.com/591099 accessibility/name-calc-inputs.html [ Crash ]
-crbug.com/591099 accessibility/name-calc-native-markup-buttons.html [ Crash ]
-crbug.com/591099 accessibility/name-calc-native-markup-input-buttons.html [ Crash ]
-crbug.com/591099 accessibility/name-calc-presentational.html [ Crash ]
-crbug.com/591099 accessibility/name-calc-svg.html [ Crash ]
-crbug.com/591099 accessibility/name-calc-visibility.html [ Crash ]
+crbug.com/591099 accessibility/name-calc-aria-label.html [ Crash Pass ]
+crbug.com/591099 accessibility/name-calc-aria-labelledby.html [ Crash Pass ]
+crbug.com/591099 accessibility/name-calc-aria-owns.html [ Crash Pass ]
+crbug.com/591099 accessibility/name-calc-figure.html [ Crash Pass ]
+crbug.com/591099 accessibility/name-calc-img.html [ Crash Failure ]
+crbug.com/591099 accessibility/name-calc-inputs.html [ Crash Pass ]
+crbug.com/591099 accessibility/name-calc-native-markup-buttons.html [ Crash Pass ]
+crbug.com/591099 accessibility/name-calc-native-markup-input-buttons.html [ Crash Pass ]
+crbug.com/591099 accessibility/name-calc-presentational.html [ Crash Pass ]
+crbug.com/591099 accessibility/name-calc-svg.html [ Crash Pass ]
+crbug.com/591099 accessibility/name-calc-visibility.html [ Crash Pass ]
 crbug.com/591099 accessibility/nested-layout-crash.html [ Crash Failure ]
 crbug.com/591099 accessibility/non-native-image-crash.html [ Failure ]
 crbug.com/591099 accessibility/not-ignore-landmark-roles.html [ Failure ]
 crbug.com/591099 accessibility/notification-listeners.html [ Failure ]
-crbug.com/591099 accessibility/option-aria-checked.html [ Crash ]
-crbug.com/591099 accessibility/other-aria-attribute-change-sends-notification.html [ Crash ]
+crbug.com/591099 accessibility/option-aria-checked.html [ Crash Pass ]
+crbug.com/591099 accessibility/other-aria-attribute-change-sends-notification.html [ Crash Failure ]
 crbug.com/591099 accessibility/platform-name.html [ Failure ]
 crbug.com/591099 accessibility/presentation-owned-elements.html [ Crash Failure ]
 crbug.com/591099 accessibility/presentational-elements-with-focus.html [ Crash Failure ]
-crbug.com/591099 accessibility/presentational-leaf.html [ Crash ]
+crbug.com/591099 accessibility/presentational-leaf.html [ Crash Pass ]
 crbug.com/591099 accessibility/press-works-on-control-types.html [ Failure ]
-crbug.com/591099 accessibility/press-works-on-text-fields.html [ Crash ]
+crbug.com/591099 accessibility/press-works-on-text-fields.html [ Crash Pass ]
 crbug.com/591099 accessibility/radio-button-title-label.html [ Failure ]
 crbug.com/591099 accessibility/readonly.html [ Crash Failure ]
 crbug.com/591099 accessibility/removed-anonymous-block-child-causes-crash.html [ Failure ]
@@ -200,7 +200,7 @@
 crbug.com/591099 accessibility/selection-change-notification-textarea.html [ Crash Failure ]
 crbug.com/591099 accessibility/selection-states.html [ Failure ]
 crbug.com/591099 accessibility/set-selection-whitespace.html [ Failure ]
-crbug.com/591099 accessibility/spin-button-detach.html [ Crash ]
+crbug.com/591099 accessibility/spin-button-detach.html [ Crash Failure ]
 crbug.com/591099 accessibility/spinbutton-value.html [ Failure ]
 crbug.com/591099 accessibility/svg-bounds.html [ Failure ]
 crbug.com/591099 accessibility/svg-image.html [ Crash Failure ]
@@ -218,12 +218,12 @@
 crbug.com/591099 accessibility/table-row-with-aria-role.html [ Failure ]
 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 ]
+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-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 ]
-crbug.com/591099 accessibility/title-ui-element-correctness.html [ Crash ]
+crbug.com/591099 accessibility/title-ui-element-correctness.html [ Crash Failure ]
 crbug.com/591099 accessibility/updating-attribute-in-table-causes-crash.html [ Failure ]
 crbug.com/591099 accessibility/whitespace-in-name-calc.html [ Crash Failure Pass ]
 crbug.com/591099 animations/3d/change-transform-in-end-event.html [ Failure Pass ]
@@ -231,103 +231,103 @@
 crbug.com/591099 animations/animation-css-rule-types.html [ Failure ]
 crbug.com/591099 animations/animation-events-create.html [ Failure ]
 crbug.com/591099 animations/animations-parsing.html [ Timeout ]
-crbug.com/591099 animations/animations-responsive-to-color-change.html [ Crash ]
-crbug.com/591099 animations/clear-svg-animation-effects.html [ Crash ]
-crbug.com/591099 animations/composition/background-position-composition.html [ Crash ]
-crbug.com/591099 animations/composition/caret-color-composition.html [ Crash ]
-crbug.com/591099 animations/composition/stroke-dasharray-composition.html [ Crash ]
+crbug.com/591099 animations/animations-responsive-to-color-change.html [ Crash Pass ]
+crbug.com/591099 animations/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/css-animation-overrides-svg-presentation-attribute-animation.html [ Crash ]
+crbug.com/591099 animations/css-animation-overrides-svg-presentation-attribute-animation.html [ Crash Pass ]
 crbug.com/591099 animations/delay-start-event.html [ Failure ]
-crbug.com/591099 animations/display-change-does-not-terminate-animation.html [ Crash ]
+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/inline-element-animation-end-hit-test.html [ Failure ]
-crbug.com/591099 animations/interpolation/backdrop-filter-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/background-color-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/background-image-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/background-position-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/background-position-origin-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/background-size-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/border-color-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/border-image-outset-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/border-image-slice-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/border-image-source-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/border-image-width-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/border-radius-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/border-spacing-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/border-width-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/bottom-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/box-shadow-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/calc-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/caret-color-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/clip-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/color-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/filter-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/font-size-adjust-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/font-size-interpolation-unset.html [ Crash ]
-crbug.com/591099 animations/interpolation/font-size-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/font-size-zoom-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/font-weight-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/height-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/line-height-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/margin-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/max-height-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/min-height-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/object-position-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/offset-rotate-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/opacity-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/outline-color-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/outline-offset-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/outline-width-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/padding-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/perspective-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/perspective-origin-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/position-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/sample-interpolation-test.html [ Crash ]
-crbug.com/591099 animations/interpolation/svg-baseline-shift-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/svg-cx-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/svg-cy-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/svg-d-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/svg-fill-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/svg-fill-opacity-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/svg-flood-color-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/svg-flood-opacity-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/svg-lighting-color-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/svg-r-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/svg-rx-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/svg-ry-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/svg-stop-color-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/svg-stop-opacity-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/svg-stroke-dasharray-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/svg-stroke-dashoffset-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/svg-stroke-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/svg-stroke-miterlimit-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/svg-stroke-opacity-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/svg-stroke-width-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/text-decoration-color-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/text-shadow-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/top-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/transform-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/transform-origin-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/vertical-align-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/viewport-unit-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/webkit-background-size-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/webkit-clip-path-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/webkit-column-rule-color-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/webkit-mask-box-image-outset-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/webkit-mask-box-image-slice-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/webkit-mask-box-image-source-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/webkit-mask-box-image-width-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/webkit-mask-image-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/webkit-mask-position-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/webkit-mask-size-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/webkit-perspective-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/webkit-perspective-origin-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/webkit-text-stroke-color-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/webkit-transform-interpolation.html [ Crash ]
-crbug.com/591099 animations/interpolation/webkit-transform-origin-interpolation.html [ Crash ]
+crbug.com/591099 animations/interpolation/backdrop-filter-interpolation.html [ Crash Timeout ]
+crbug.com/591099 animations/interpolation/background-color-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/background-image-interpolation.html [ Crash Timeout ]
+crbug.com/591099 animations/interpolation/background-position-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/background-position-origin-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/background-size-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/border-color-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/border-image-outset-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/border-image-slice-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/border-image-source-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/border-image-width-interpolation.html [ Crash Timeout ]
+crbug.com/591099 animations/interpolation/border-radius-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/border-spacing-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/border-width-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/bottom-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/box-shadow-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/calc-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/caret-color-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/clip-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/color-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/filter-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/font-size-adjust-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/font-size-interpolation-unset.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/font-size-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/font-size-zoom-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/font-weight-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/height-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/line-height-interpolation.html [ Crash Timeout ]
+crbug.com/591099 animations/interpolation/margin-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/max-height-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/min-height-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/object-position-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/offset-rotate-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/opacity-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/outline-color-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/outline-offset-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/outline-width-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/padding-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/perspective-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/perspective-origin-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/position-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/sample-interpolation-test.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/svg-baseline-shift-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/svg-cx-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/svg-cy-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/svg-d-interpolation.html [ Crash Timeout ]
+crbug.com/591099 animations/interpolation/svg-fill-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/svg-fill-opacity-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/svg-flood-color-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/svg-flood-opacity-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/svg-lighting-color-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/svg-r-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/svg-rx-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/svg-ry-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/svg-stop-color-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/svg-stop-opacity-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/svg-stroke-dasharray-interpolation.html [ Crash Timeout ]
+crbug.com/591099 animations/interpolation/svg-stroke-dashoffset-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/svg-stroke-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/svg-stroke-miterlimit-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/svg-stroke-opacity-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/svg-stroke-width-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/text-decoration-color-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/text-shadow-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/top-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/transform-interpolation.html [ Crash Timeout ]
+crbug.com/591099 animations/interpolation/transform-origin-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/vertical-align-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/viewport-unit-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/webkit-background-size-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/webkit-clip-path-interpolation.html [ Crash Timeout ]
+crbug.com/591099 animations/interpolation/webkit-column-rule-color-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/webkit-mask-box-image-outset-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/webkit-mask-box-image-slice-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/webkit-mask-box-image-source-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/webkit-mask-box-image-width-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/webkit-mask-image-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/webkit-mask-position-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/webkit-mask-size-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/webkit-perspective-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/webkit-perspective-origin-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/webkit-text-stroke-color-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/interpolation/webkit-transform-interpolation.html [ Crash Timeout ]
+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/negative-delay-events.html [ Failure ]
@@ -336,7 +336,7 @@
 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/d-responsive.html [ Crash ]
+crbug.com/591099 animations/responsive/d-responsive.html [ Crash Pass ]
 crbug.com/591099 animations/responsive/line-height-responsive.html [ Pass Timeout ]
 crbug.com/591099 animations/rotate-transform-equivalent.html [ Failure ]
 crbug.com/591099 animations/skew-notsequential-compositor.html [ Failure ]
@@ -344,171 +344,171 @@
 crbug.com/591099 animations/stability/animation-iteration-event-destroy-renderer.html [ Failure ]
 crbug.com/591099 animations/stability/animation-on-inline-crash.html [ Failure ]
 crbug.com/591099 animations/stability/animation-start-event-destroy-renderer.html [ Failure ]
-crbug.com/591099 animations/stability/base-render-style-crash.html [ Crash ]
-crbug.com/591099 animations/stability/checkbox-padding-animation-crash.html [ Crash ]
+crbug.com/591099 animations/stability/base-render-style-crash.html [ Crash Pass ]
+crbug.com/591099 animations/stability/checkbox-padding-animation-crash.html [ Crash Pass ]
 crbug.com/591099 animations/stability/element-animate-float-crash.html [ Failure Pass ]
 crbug.com/591099 animations/stability/empty-keyframe-animation-composited.html [ Failure ]
 crbug.com/591099 animations/stability/empty-keyframes-composited.html [ Failure ]
 crbug.com/591099 animations/stability/empty-keyframes.html [ Failure ]
 crbug.com/591099 animations/stability/import-crash.html [ Failure ]
 crbug.com/591099 animations/stability/length-zero-percent-crash.html [ Failure Pass ]
-crbug.com/591099 animations/stability/option-element-crash.html [ Crash ]
-crbug.com/591099 animations/stability/option-opacity-inherit-crash.html [ Crash ]
+crbug.com/591099 animations/stability/option-element-crash.html [ Crash Pass ]
+crbug.com/591099 animations/stability/option-opacity-inherit-crash.html [ Crash Pass ]
 crbug.com/591099 animations/stability/pause-crash.html [ Failure ]
-crbug.com/591099 animations/stability/svg-element-css-animation-crash.html [ Crash ]
-crbug.com/591099 animations/stability/svg-length-unittype-crash.html [ Crash ]
+crbug.com/591099 animations/stability/svg-element-css-animation-crash.html [ Crash Pass ]
+crbug.com/591099 animations/stability/svg-length-unittype-crash.html [ Crash Pass ]
 crbug.com/591099 animations/stability/zero-duration-infinite-iterations.html [ Failure ]
 crbug.com/591099 animations/stability/zero-duration-large-start-delay.html [ Failure ]
 crbug.com/591099 animations/state-at-end-event.html [ Failure Pass ]
-crbug.com/591099 animations/svg-attribute-composition/svg-amplitude-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-azimuth-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-baseFrequency-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-bias-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-cx-cy-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-d-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-diffuseConstant-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-divisor-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-dx-dy-length-list-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-dx-dy-number-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-elevation-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-exponent-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-fx-fy-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-gradientTransform-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-height-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-intercept-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-k1-k2-k3-k4-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-kernelMatrix-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-kernelUnitLength-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-limitingConeAngle-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-markerHeight-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-markerWidth-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-mode-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-numOctaves-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-offset-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-order-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-orient-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-pathLength-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-patternTransform-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-points-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-pointsAtX-pointsAtY-pointsAtZ-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-r-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-radius-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-refX-refY-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-rotate-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-rx-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-scale-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-seed-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-slope-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-specularConstant-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-specularExponent-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-startOffset-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-stdDeviation-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-surfaceScale-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-tableValues-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-targetX-targetY-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-textLength-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-transform-composition-distinct.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-transform-composition-list.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-transform-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-transform-matrix.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-values-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-viewBox-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-width-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-x-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-x-list-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-x1-x2-y1-y2-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-y-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-y-list-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-composition/svg-z-composition.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-amplitude-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-azimuth-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-baseFrequency-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-bias-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-calc-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-class-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-clipPathUnits-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-cx-cy-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-d-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-diffuseConstant-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-divisor-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-dx-dy-length-list-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-dx-dy-number-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-edgeMode-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-elevation-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-exponent-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-filterUnits-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-fx-fy-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-gradientTransform-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-gradientUnits-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-height-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-href-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-in-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-intercept-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-k1-k2-k3-k4-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-kernelMatrix-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-kernelUnitLength-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-lengthAdjust-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-limitingConeAngle-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-markerHeight-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-markerUnits-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-markerWidth-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-maskContentUnits-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-maskUnits-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-method-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-mode-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-numOctaves-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-offset-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-operator-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-order-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-orient-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-pathLength-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-patternContentUnits-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-patternTransform-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-patternUnits-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-points-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-pointsAtX-pointsAtY-pointsAtZ-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-preserveAlpha-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-preserveAspectRatio-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-primitiveUnits-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-r-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-radius-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-refX-refY-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-result-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-rotate-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-rx-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-scale-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-seed-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-slope-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-spacing-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-specularConstant-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-specularExponent-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-spreadMethod-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-startOffset-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-stdDeviation-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-stitchTiles-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-surfaceScale-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-tableValues-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-target-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-targetX-targetY-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-textLength-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-transform-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-type-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-values-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-viewBox-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-width-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-x-list-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-x-y-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-x1-x2-y1-y2-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-xChannelSelector-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-y-list-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-interpolation/svg-z-interpolation.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-responsive/svg-d-responsive.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-responsive/svg-points-responsive.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-responsive/svg-tableValues-responsive.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-responsive/svg-transform-responsive.html [ Crash ]
-crbug.com/591099 animations/svg-attribute-responsive/svg-x-list-responsive.html [ Crash ]
-crbug.com/591099 animations/svg-presentation-attribute-animation.html [ Crash ]
-crbug.com/591099 animations/svg-responsive-to-timing-updates.html [ Crash ]
+crbug.com/591099 animations/svg-attribute-composition/svg-amplitude-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-azimuth-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-baseFrequency-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-bias-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-cx-cy-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-d-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-diffuseConstant-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-divisor-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-dx-dy-length-list-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-dx-dy-number-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-elevation-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-exponent-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-fx-fy-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-gradientTransform-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-height-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-intercept-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-k1-k2-k3-k4-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-kernelMatrix-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-kernelUnitLength-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-limitingConeAngle-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-markerHeight-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-markerWidth-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-mode-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-numOctaves-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-offset-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-order-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-orient-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-pathLength-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-patternTransform-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-points-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-pointsAtX-pointsAtY-pointsAtZ-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-r-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-radius-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-refX-refY-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-rotate-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-rx-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-scale-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-seed-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-slope-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-specularConstant-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-specularExponent-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-startOffset-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-stdDeviation-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-surfaceScale-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-tableValues-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-targetX-targetY-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-textLength-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-transform-composition-distinct.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-transform-composition-list.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-transform-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-transform-matrix.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-values-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-viewBox-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-width-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-x-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-x-list-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-x1-x2-y1-y2-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-y-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-y-list-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-composition/svg-z-composition.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-amplitude-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-azimuth-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-baseFrequency-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-bias-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-calc-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-class-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-clipPathUnits-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-cx-cy-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-d-interpolation.html [ Crash Timeout ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-diffuseConstant-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-divisor-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-dx-dy-length-list-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-dx-dy-number-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-edgeMode-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-elevation-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-exponent-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-filterUnits-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-fx-fy-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-gradientTransform-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-gradientUnits-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-height-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-href-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-in-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-intercept-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-k1-k2-k3-k4-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-kernelMatrix-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-kernelUnitLength-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-lengthAdjust-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-limitingConeAngle-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-markerHeight-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-markerUnits-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-markerWidth-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-maskContentUnits-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-maskUnits-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-method-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-mode-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-numOctaves-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-offset-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-operator-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-order-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-orient-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-pathLength-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-patternContentUnits-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-patternTransform-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-patternUnits-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-points-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-pointsAtX-pointsAtY-pointsAtZ-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-preserveAlpha-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-preserveAspectRatio-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-primitiveUnits-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-r-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-radius-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-refX-refY-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-result-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-rotate-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-rx-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-scale-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-seed-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-slope-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-spacing-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-specularConstant-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-specularExponent-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-spreadMethod-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-startOffset-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-stdDeviation-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-stitchTiles-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-surfaceScale-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-tableValues-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-target-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-targetX-targetY-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-textLength-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-transform-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-type-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-values-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-viewBox-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-width-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-x-list-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-x-y-interpolation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-interpolation/svg-x1-x2-y1-y2-interpolation.html [ Crash Pass ]
+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/svg-attribute-responsive/svg-d-responsive.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-responsive/svg-points-responsive.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-responsive/svg-tableValues-responsive.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-responsive/svg-transform-responsive.html [ Crash Pass ]
+crbug.com/591099 animations/svg-attribute-responsive/svg-x-list-responsive.html [ Crash Pass ]
+crbug.com/591099 animations/svg-presentation-attribute-animation.html [ Crash Pass ]
+crbug.com/591099 animations/svg-responsive-to-timing-updates.html [ Crash Pass ]
 crbug.com/591099 animations/timing-model.html [ Pass Timeout ]
 crbug.com/591099 battery-status/api-defined.html [ Failure ]
 crbug.com/591099 battery-status/detached-no-crash.html [ Failure ]
@@ -517,14 +517,14 @@
 crbug.com/591099 battery-status/multiple-windows-page-visibility.html [ Failure ]
 crbug.com/591099 battery-status/multiple-windows.html [ Failure ]
 crbug.com/591099 battery-status/no-gc-with-eventlisteners.html [ Failure ]
-crbug.com/591099 battery-status/no-leak-on-detached-use.html [ Crash ]
+crbug.com/591099 battery-status/no-leak-on-detached-use.html [ Crash Failure ]
 crbug.com/591099 battery-status/page-visibility.html [ Failure ]
 crbug.com/591099 battery-status/promise-with-eventlisteners.html [ Failure ]
 crbug.com/591099 battery-status/restricted-level-precision.html [ Failure ]
 crbug.com/591099 bindings/blink-in-js-asan-crash.html [ Failure ]
-crbug.com/591099 bindings/location-lifetime.html [ Crash ]
-crbug.com/591099 bluetooth/requestDevice/request-from-iframe.html [ Crash ]
-crbug.com/591099 bluetooth/server/getPrimaryService/two-iframes-from-same-origin.html [ Crash ]
+crbug.com/591099 bindings/location-lifetime.html [ Crash Pass ]
+crbug.com/591099 bluetooth/requestDevice/request-from-iframe.html [ Crash Pass ]
+crbug.com/591099 bluetooth/server/getPrimaryService/two-iframes-from-same-origin.html [ Crash Pass ]
 crbug.com/591099 compositing/absolute-inside-out-of-view-fixed.html [ Failure Pass ]
 crbug.com/591099 compositing/animation/busy-indicator.html [ Failure ]
 crbug.com/591099 compositing/animation/hidden-composited.html [ Failure ]
@@ -562,7 +562,7 @@
 crbug.com/591099 compositing/generated-content.html [ Failure Pass ]
 crbug.com/591099 compositing/geometry/abs-position-inside-opacity.html [ Failure ]
 crbug.com/591099 compositing/geometry/ancestor-overflow-change.html [ Failure ]
-crbug.com/591099 compositing/geometry/assert-marquee-timer.html [ Crash ]
+crbug.com/591099 compositing/geometry/assert-marquee-timer.html [ Crash Pass ]
 crbug.com/591099 compositing/geometry/bounds-clipped-composited-child.html [ Failure ]
 crbug.com/591099 compositing/geometry/bounds-ignores-hidden-composited-descendant.html [ Failure ]
 crbug.com/591099 compositing/geometry/bounds-ignores-hidden-dynamic-negzindex.html [ Failure ]
@@ -614,10 +614,10 @@
 crbug.com/591099 compositing/gestures/gesture-tapHighlight-2-iframe.html [ Failure ]
 crbug.com/591099 compositing/gestures/gesture-tapHighlight-img-and-text-2.html [ Failure ]
 crbug.com/591099 compositing/gestures/gesture-tapHighlight-img-transformed.html [ Failure ]
-crbug.com/591099 compositing/gestures/gesture-tapHighlight-img.html [ Failure ]
+crbug.com/591099 compositing/gestures/gesture-tapHighlight-img.html [ Failure Pass ]
 crbug.com/591099 compositing/gestures/gesture-tapHighlight-overflowing-text-crash.html [ Failure ]
 crbug.com/591099 compositing/gestures/gesture-tapHighlight-pixel-rotated-link.html [ Failure ]
-crbug.com/591099 compositing/gestures/gesture-tapHighlight-shadow-tree.html [ Failure ]
+crbug.com/591099 compositing/gestures/gesture-tapHighlight-shadow-tree.html [ Failure Pass ]
 crbug.com/591099 compositing/gestures/gesture-tapHighlight-with-box-shadow.html [ Failure ]
 crbug.com/591099 compositing/iframes/become-composited-nested-iframes.html [ Failure ]
 crbug.com/591099 compositing/iframes/become-overlapped-iframe.html [ Failure ]
@@ -631,14 +631,14 @@
 crbug.com/591099 compositing/iframes/enter-compositing-iframe.html [ Failure ]
 crbug.com/591099 compositing/iframes/floating-self-painting-frame-complex.html [ Failure ]
 crbug.com/591099 compositing/iframes/floating-self-painting-frame.html [ Failure ]
-crbug.com/591099 compositing/iframes/iframe-composited-scrolling-hide-and-show.html [ Crash ]
+crbug.com/591099 compositing/iframes/iframe-composited-scrolling-hide-and-show.html [ Crash Failure ]
 crbug.com/591099 compositing/iframes/iframe-content-flipping.html [ Failure ]
 crbug.com/591099 compositing/iframes/iframe-copy-on-scroll.html [ Failure ]
 crbug.com/591099 compositing/iframes/iframe-in-composited-layer.html [ Failure ]
 crbug.com/591099 compositing/iframes/iframe-resize.html [ Failure ]
 crbug.com/591099 compositing/iframes/iframe-size-from-zero.html [ Failure ]
 crbug.com/591099 compositing/iframes/invisible-iframe.html [ Failure ]
-crbug.com/591099 compositing/iframes/invisible-nested-iframe-hide.html [ Crash ]
+crbug.com/591099 compositing/iframes/invisible-nested-iframe-hide.html [ Crash Failure ]
 crbug.com/591099 compositing/iframes/invisible-nested-iframe-show.html [ Failure ]
 crbug.com/591099 compositing/iframes/invisible-nested-iframe.html [ Failure ]
 crbug.com/591099 compositing/iframes/layout-on-compositing-change.html [ Failure ]
@@ -646,7 +646,7 @@
 crbug.com/591099 compositing/iframes/overlapped-iframe-iframe.html [ Failure ]
 crbug.com/591099 compositing/iframes/overlapped-iframe.html [ Failure ]
 crbug.com/591099 compositing/iframes/overlapped-nested-iframes.html [ Failure ]
-crbug.com/591099 compositing/iframes/remove-iframe-crash.html [ Crash ]
+crbug.com/591099 compositing/iframes/remove-iframe-crash.html [ Crash Pass ]
 crbug.com/591099 compositing/iframes/resizer.html [ Failure ]
 crbug.com/591099 compositing/iframes/scrolling-iframe.html [ Failure ]
 crbug.com/591099 compositing/images/content-image.html [ Failure ]
@@ -1678,16 +1678,16 @@
 crbug.com/591099 css3/blending/effect-background-blend-mode-stacking.html [ Failure ]
 crbug.com/591099 css3/blending/effect-background-blend-mode-tiled.html [ Failure ]
 crbug.com/591099 css3/blending/effect-background-blend-mode.html [ Failure ]
-crbug.com/591099 css3/blending/mix-blend-mode-2nd-stacking-context-composited.html [ Crash ]
+crbug.com/591099 css3/blending/mix-blend-mode-2nd-stacking-context-composited.html [ Crash Failure ]
 crbug.com/591099 css3/blending/mix-blend-mode-composited-layers.html [ Failure Pass ]
-crbug.com/591099 css3/blending/mix-blend-mode-composited-reason-children.html [ Crash ]
+crbug.com/591099 css3/blending/mix-blend-mode-composited-reason-children.html [ Crash Failure ]
 crbug.com/591099 css3/blending/mix-blend-mode-has-ancestor-clipping-layer.html [ Failure ]
 crbug.com/591099 css3/blending/mix-blend-mode-isolated-group-1.html [ Failure ]
 crbug.com/591099 css3/blending/mix-blend-mode-isolated-group-2.html [ Failure ]
 crbug.com/591099 css3/blending/mix-blend-mode-isolated-group-3.html [ Failure ]
-crbug.com/591099 css3/blending/mix-blend-mode-isolation-2-stacking-contexts.html [ Crash ]
-crbug.com/591099 css3/blending/mix-blend-mode-isolation-layer.html [ Crash ]
-crbug.com/591099 css3/blending/mix-blend-mode-isolation-remove.html [ Crash ]
+crbug.com/591099 css3/blending/mix-blend-mode-isolation-2-stacking-contexts.html [ Crash Failure ]
+crbug.com/591099 css3/blending/mix-blend-mode-isolation-layer.html [ Crash Failure ]
+crbug.com/591099 css3/blending/mix-blend-mode-isolation-remove.html [ Crash Failure ]
 crbug.com/591099 css3/blending/mix-blend-mode-simple-text.html [ Failure ]
 crbug.com/591099 css3/blending/mix-blend-mode-simple.html [ Failure ]
 crbug.com/591099 css3/blending/mix-blend-mode-with-masking.html [ Failure Pass ]
@@ -1709,7 +1709,7 @@
 crbug.com/591099 css3/calc/lexer-regression-57581-3.html [ Failure ]
 crbug.com/591099 css3/calc/lexer-regression-57581.html [ Failure ]
 crbug.com/591099 css3/calc/line-height.html [ Failure ]
-crbug.com/591099 css3/calc/margin.html [ Crash ]
+crbug.com/591099 css3/calc/margin.html [ Crash Failure ]
 crbug.com/591099 css3/calc/padding.html [ Failure ]
 crbug.com/591099 css3/calc/reflection-computed-style.html [ Failure ]
 crbug.com/591099 css3/calc/regression-62276.html [ Failure ]
@@ -1725,11 +1725,11 @@
 crbug.com/591099 css3/css3-modsel-37.html [ Failure Pass ]
 crbug.com/591099 css3/escape-dom-api.html [ Failure ]
 crbug.com/591099 css3/filters/add-filter-rendering.html [ Failure ]
-crbug.com/591099 css3/filters/adopt-inline-style.html [ Crash ]
+crbug.com/591099 css3/filters/adopt-inline-style.html [ Crash Pass ]
 crbug.com/591099 css3/filters/blur-filter-page-scroll-parents.html [ Failure Pass ]
 crbug.com/591099 css3/filters/blur-filter-page-scroll-self.html [ Failure Pass ]
 crbug.com/591099 css3/filters/blur-filter-page-scroll.html [ Failure Pass ]
-crbug.com/591099 css3/filters/composited-during-animation.html [ Crash ]
+crbug.com/591099 css3/filters/composited-during-animation.html [ Crash Pass ]
 crbug.com/591099 css3/filters/composited-during-transition-layertree.html [ Failure ]
 crbug.com/591099 css3/filters/composited-layer-bounds-after-sw-blur-animation.html [ Failure Pass ]
 crbug.com/591099 css3/filters/composited-layer-bounds-with-composited-blur.html [ Failure Pass ]
@@ -1759,7 +1759,7 @@
 crbug.com/591099 css3/filters/effect-opacity.html [ Failure ]
 crbug.com/591099 css3/filters/effect-reference-add-hw.html [ Failure ]
 crbug.com/591099 css3/filters/effect-reference-delete-crash.html [ Failure ]
-crbug.com/591099 css3/filters/effect-reference-delete.html [ Crash ]
+crbug.com/591099 css3/filters/effect-reference-delete.html [ Crash Pass ]
 crbug.com/591099 css3/filters/effect-reference-reset-style-delete-crash.html [ Failure ]
 crbug.com/591099 css3/filters/effect-reference-source-alpha-hw.html [ Failure ]
 crbug.com/591099 css3/filters/effect-reference-subregion-hidpi-hw.html [ Failure ]
@@ -1771,14 +1771,14 @@
 crbug.com/591099 css3/filters/effect-saturate.html [ Failure ]
 crbug.com/591099 css3/filters/effect-sepia-hw.html [ Failure ]
 crbug.com/591099 css3/filters/effect-sepia.html [ Failure ]
-crbug.com/591099 css3/filters/filter-animation-from-none-hw.html [ Crash ]
-crbug.com/591099 css3/filters/filter-animation-from-none-multi-hw.html [ Crash ]
-crbug.com/591099 css3/filters/filter-animation-from-none-multi.html [ Crash ]
-crbug.com/591099 css3/filters/filter-animation-from-none.html [ Crash ]
-crbug.com/591099 css3/filters/filter-animation-hw.html [ Crash ]
-crbug.com/591099 css3/filters/filter-animation-multi-hw.html [ Crash ]
-crbug.com/591099 css3/filters/filter-animation-multi.html [ Crash ]
-crbug.com/591099 css3/filters/filter-animation.html [ Crash ]
+crbug.com/591099 css3/filters/filter-animation-from-none-hw.html [ Crash Pass ]
+crbug.com/591099 css3/filters/filter-animation-from-none-multi-hw.html [ Crash Pass ]
+crbug.com/591099 css3/filters/filter-animation-from-none-multi.html [ Crash Pass ]
+crbug.com/591099 css3/filters/filter-animation-from-none.html [ Crash Pass ]
+crbug.com/591099 css3/filters/filter-animation-hw.html [ Crash Pass ]
+crbug.com/591099 css3/filters/filter-animation-multi-hw.html [ Crash Pass ]
+crbug.com/591099 css3/filters/filter-animation-multi.html [ Crash Pass ]
+crbug.com/591099 css3/filters/filter-animation.html [ Crash Pass ]
 crbug.com/591099 css3/filters/filter-change-repaint-composited.html [ Failure ]
 crbug.com/591099 css3/filters/filter-repaint-shadow-clipped.html [ Failure ]
 crbug.com/591099 css3/filters/filter-repaint-shadow-rotated.html [ Failure ]
@@ -1787,7 +1787,7 @@
 crbug.com/591099 css3/filters/filtered-inline.html [ Failure ]
 crbug.com/591099 css3/filters/huge-region-composited.html [ Failure ]
 crbug.com/591099 css3/filters/huge-region.html [ Failure ]
-crbug.com/591099 css3/filters/multiple-references-id-mutate-crash-2.html [ Crash ]
+crbug.com/591099 css3/filters/multiple-references-id-mutate-crash-2.html [ Crash Pass ]
 crbug.com/591099 css3/filters/nested-filter.html [ Crash Failure ]
 crbug.com/591099 css3/filters/offscreen-filters-memory-usage.html [ Failure ]
 crbug.com/591099 css3/filters/regions-expanding.html [ Crash Failure ]
@@ -1795,14 +1795,14 @@
 crbug.com/591099 css3/filters/simple-filter-rendering.html [ Failure ]
 crbug.com/591099 css3/flexbox/alignContent-applies-with-flexWrap-wrap-with-single-line.html [ Failure ]
 crbug.com/591099 css3/flexbox/assert-generated-new-flexbox.html [ Failure ]
-crbug.com/591099 css3/flexbox/box-orient-button.html [ Crash ]
+crbug.com/591099 css3/flexbox/box-orient-button.html [ Crash Pass ]
 crbug.com/591099 css3/flexbox/bug527039.html [ Failure ]
-crbug.com/591099 css3/flexbox/bug633212.html [ Crash ]
+crbug.com/591099 css3/flexbox/bug633212.html [ Crash Pass ]
 crbug.com/591099 css3/flexbox/button.html [ Failure ]
 crbug.com/591099 css3/flexbox/child-overflow.html [ Failure Pass ]
 crbug.com/591099 css3/flexbox/crash-removing-out-of-flow-child.html [ Failure ]
 crbug.com/591099 css3/flexbox/css-properties.html [ Failure ]
-crbug.com/591099 css3/flexbox/display-flexbox-set-get.html [ Crash ]
+crbug.com/591099 css3/flexbox/display-flexbox-set-get.html [ Crash Pass ]
 crbug.com/591099 css3/flexbox/flex-algorithm-with-margins.html [ Failure ]
 crbug.com/591099 css3/flexbox/flex-algorithm.html [ Failure ]
 crbug.com/591099 css3/flexbox/flex-align-baseline.html [ Failure ]
@@ -1816,7 +1816,7 @@
 crbug.com/591099 css3/flexbox/flex-flow-margins.html [ Failure ]
 crbug.com/591099 css3/flexbox/flex-flow-padding.html [ Failure ]
 crbug.com/591099 css3/flexbox/flex-flow.html [ Failure ]
-crbug.com/591099 css3/flexbox/flex-item-contains-strict.html [ Crash ]
+crbug.com/591099 css3/flexbox/flex-item-contains-strict.html [ Crash Failure ]
 crbug.com/591099 css3/flexbox/flex-longhand-parsing.html [ Failure ]
 crbug.com/591099 css3/flexbox/flex-one-sets-flex-basis-to-zero-px.html [ Failure ]
 crbug.com/591099 css3/flexbox/flex-percentage-height-in-table-standards-mode.html [ Failure ]
@@ -1827,25 +1827,25 @@
 crbug.com/591099 css3/flexbox/flexbox-wordwrap.html [ Failure ]
 crbug.com/591099 css3/flexbox/floated-flexbox.html [ Failure ]
 crbug.com/591099 css3/flexbox/floated-flexitem.html [ Failure ]
-crbug.com/591099 css3/flexbox/inline-flex-crash.html [ Crash ]
-crbug.com/591099 css3/flexbox/inline-flex-crash2.html [ Crash ]
-crbug.com/591099 css3/flexbox/inline-flex.html [ Crash ]
-crbug.com/591099 css3/flexbox/intrinsic-min-width-applies-with-fixed-width.html [ Crash ]
+crbug.com/591099 css3/flexbox/inline-flex-crash.html [ Crash Pass ]
+crbug.com/591099 css3/flexbox/inline-flex-crash2.html [ Crash Pass ]
+crbug.com/591099 css3/flexbox/inline-flex.html [ Crash Pass ]
+crbug.com/591099 css3/flexbox/intrinsic-min-width-applies-with-fixed-width.html [ Crash Pass ]
 crbug.com/591099 css3/flexbox/intrinsic-width-orthogonal-writing-mode.html [ Failure ]
 crbug.com/591099 css3/flexbox/large-flex-shrink-assert.html [ Failure ]
 crbug.com/591099 css3/flexbox/line-wrapping.html [ Failure ]
-crbug.com/591099 css3/flexbox/min-size-auto.html [ Crash ]
+crbug.com/591099 css3/flexbox/min-size-auto.html [ Crash Pass ]
 crbug.com/591099 css3/flexbox/multiline-align-self.html [ Failure ]
 crbug.com/591099 css3/flexbox/multiline-reverse-wrap-baseline.html [ Failure ]
 crbug.com/591099 css3/flexbox/multiline-shrink-to-fit.html [ Failure ]
 crbug.com/591099 css3/flexbox/negative-flex-rounding-assert.html [ Failure ]
 crbug.com/591099 css3/flexbox/nested-stretch.html [ Failure ]
 crbug.com/591099 css3/flexbox/overflow-auto-dynamic-changes.html [ Failure ]
-crbug.com/591099 css3/flexbox/overflow-auto-resizes-correctly.html [ Crash ]
+crbug.com/591099 css3/flexbox/overflow-auto-resizes-correctly.html [ Crash Pass ]
 crbug.com/591099 css3/flexbox/percent-margins.html [ Failure ]
-crbug.com/591099 css3/flexbox/percentage-height-replaced-element.html [ Crash ]
+crbug.com/591099 css3/flexbox/percentage-height-replaced-element.html [ Crash Pass ]
 crbug.com/591099 css3/flexbox/percentage-heights.html [ Failure ]
-crbug.com/591099 css3/flexbox/perpendicular-writing-modes-inside-flex-item.html [ Crash ]
+crbug.com/591099 css3/flexbox/perpendicular-writing-modes-inside-flex-item.html [ Crash Pass ]
 crbug.com/591099 css3/flexbox/position-absolute-child-with-contenteditable.html [ Failure ]
 crbug.com/591099 css3/flexbox/preferred-widths.html [ Failure ]
 crbug.com/591099 css3/flexbox/relpos-with-scrollable-with-abspos-crash.html [ Failure ]
@@ -1859,7 +1859,7 @@
 crbug.com/591099 css3/font-weight-multiple-selectors.html [ Failure ]
 crbug.com/591099 css3/font-weight.html [ Failure ]
 crbug.com/591099 css3/khtml-background-size-0x0-bmp.html [ Failure ]
-crbug.com/591099 css3/masking/clip-path-animation.html [ Crash ]
+crbug.com/591099 css3/masking/clip-path-animation.html [ Crash Pass ]
 crbug.com/591099 css3/masking/clip-path-circle-filter.html [ Failure Pass ]
 crbug.com/591099 css3/masking/clip-path-circle-overflow-hidden.html [ Failure ]
 crbug.com/591099 css3/masking/clip-path-circle-overflow.html [ Failure Pass ]
@@ -2652,32 +2652,32 @@
 crbug.com/591099 css3/zoom-coords.xhtml [ Failure ]
 crbug.com/591099 cssom/ahem-ex-units.html [ Failure ]
 crbug.com/591099 cssom/cssvalue-comparison.html [ Failure ]
-crbug.com/591099 custom-elements/constructor-context-dies-before-super.html [ Crash ]
-crbug.com/591099 custom-elements/constructor-context-dies-cross-context-call.html [ Crash ]
-crbug.com/591099 custom-elements/constructor-context-dies-retrieving-prototype.html [ Crash ]
-crbug.com/591099 custom-elements/constructor-may-poach-upgrading-element.html [ Crash ]
-crbug.com/591099 custom-elements/define-context-dies-retrieving-prototype.html [ Crash ]
-crbug.com/591099 custom-elements/isolated-worlds.html [ Crash ]
-crbug.com/591099 custom-elements/spec/adopt-node.html [ Crash ]
-crbug.com/591099 custom-elements/spec/callback.html [ Crash ]
-crbug.com/591099 custom-elements/spec/construct.html [ Crash ]
-crbug.com/591099 custom-elements/spec/create-element-defined-asynchronous.html [ Crash ]
-crbug.com/591099 custom-elements/spec/create-element-defined-synchronous.html [ Crash ]
-crbug.com/591099 custom-elements/spec/create-element-inside-template.html [ Crash ]
-crbug.com/591099 custom-elements/spec/create-element.html [ Crash ]
-crbug.com/591099 custom-elements/spec/custom-elements-registry/when_defined.html [ Crash ]
-crbug.com/591099 custom-elements/spec/define-builtin-element.html [ Crash ]
-crbug.com/591099 custom-elements/spec/define-element.html [ Crash ]
-crbug.com/591099 custom-elements/spec/doc-without-browsing-context.html [ Crash ]
-crbug.com/591099 custom-elements/spec/insert-a-node-try-to-upgrade.html [ Crash ]
-crbug.com/591099 custom-elements/spec/parsing.html [ Crash ]
-crbug.com/591099 custom-elements/spec/remove-element.html [ Crash ]
-crbug.com/591099 custom-elements/spec/report-the-exception.html [ Crash ]
-crbug.com/591099 custom-elements/spec/selectors/pseudo-class-defined.html [ Crash ]
-crbug.com/591099 custom-elements/spec/state-failed-create.html [ Crash ]
-crbug.com/591099 custom-elements/spec/state-failed-upgrade.html [ Crash ]
-crbug.com/591099 custom-elements/spec/upgrade-element.html [ Crash ]
-crbug.com/591099 custom-elements/v0-v1-interop.html [ Crash ]
+crbug.com/591099 custom-elements/constructor-context-dies-before-super.html [ Crash Pass ]
+crbug.com/591099 custom-elements/constructor-context-dies-cross-context-call.html [ Crash Pass ]
+crbug.com/591099 custom-elements/constructor-context-dies-retrieving-prototype.html [ Crash Pass ]
+crbug.com/591099 custom-elements/constructor-may-poach-upgrading-element.html [ Crash Pass ]
+crbug.com/591099 custom-elements/define-context-dies-retrieving-prototype.html [ Crash Pass ]
+crbug.com/591099 custom-elements/isolated-worlds.html [ Crash Pass ]
+crbug.com/591099 custom-elements/spec/adopt-node.html [ Crash Pass ]
+crbug.com/591099 custom-elements/spec/callback.html [ Crash Pass ]
+crbug.com/591099 custom-elements/spec/construct.html [ Crash Pass ]
+crbug.com/591099 custom-elements/spec/create-element-defined-asynchronous.html [ Crash Pass ]
+crbug.com/591099 custom-elements/spec/create-element-defined-synchronous.html [ Crash Pass ]
+crbug.com/591099 custom-elements/spec/create-element-inside-template.html [ Crash Pass ]
+crbug.com/591099 custom-elements/spec/create-element.html [ Crash Pass ]
+crbug.com/591099 custom-elements/spec/custom-elements-registry/when_defined.html [ Crash Pass ]
+crbug.com/591099 custom-elements/spec/define-builtin-element.html [ Crash Pass ]
+crbug.com/591099 custom-elements/spec/define-element.html [ Crash Pass ]
+crbug.com/591099 custom-elements/spec/doc-without-browsing-context.html [ Crash Pass ]
+crbug.com/591099 custom-elements/spec/insert-a-node-try-to-upgrade.html [ Crash Pass ]
+crbug.com/591099 custom-elements/spec/parsing.html [ Crash Pass ]
+crbug.com/591099 custom-elements/spec/remove-element.html [ Crash Pass ]
+crbug.com/591099 custom-elements/spec/report-the-exception.html [ Crash Pass ]
+crbug.com/591099 custom-elements/spec/selectors/pseudo-class-defined.html [ Crash Pass ]
+crbug.com/591099 custom-elements/spec/state-failed-create.html [ Crash Pass ]
+crbug.com/591099 custom-elements/spec/state-failed-upgrade.html [ Crash Pass ]
+crbug.com/591099 custom-elements/spec/upgrade-element.html [ Crash Pass ]
+crbug.com/591099 custom-elements/v0-v1-interop.html [ Crash Pass ]
 crbug.com/591099 device_orientation/motion/add-during-dispatch.html [ Failure ]
 crbug.com/591099 device_orientation/motion/add-listener-from-callback.html [ Failure ]
 crbug.com/591099 device_orientation/motion/create-event.html [ Failure ]
@@ -2705,7 +2705,7 @@
 crbug.com/591099 dom/attr/set-attr-value-no-DOMSubtreeModified.html [ Failure ]
 crbug.com/591099 dom/attr/set-attribute-node-from-iframe.html [ Failure ]
 crbug.com/591099 dom/attr/update-attribute-node-no-crash.html [ Failure ]
-crbug.com/591099 dom/document/adoptNode-reparenting-crash.html [ Crash ]
+crbug.com/591099 dom/document/adoptNode-reparenting-crash.html [ Crash Pass ]
 crbug.com/591099 dom/domparsing/dom-parse-serialize-display.html [ Failure ]
 crbug.com/591099 dom/domparsing/dom-parse-serialize-xmldecl.html [ Failure ]
 crbug.com/591099 dom/domparsing/dom-parse-serialize.html [ Failure ]
@@ -2719,7 +2719,7 @@
 crbug.com/591099 dom/domparsing/xmlserializer-attribute-special-namespaces.html [ Failure ]
 crbug.com/591099 dom/domparsing/xmlserializer-doctype2.html [ Failure ]
 crbug.com/591099 dom/domparsing/xmlserializer-double-xmlns.html [ Failure ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/AppletsCollection.html [ Crash ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/AppletsCollection.html [ Crash Failure ]
 crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLDocument01.html [ Crash Pass ]
 crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLDocument02.html [ Crash Pass ]
 crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLDocument03.html [ Crash Pass ]
@@ -2740,152 +2740,152 @@
 crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLDocument19.html [ Crash Pass ]
 crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLDocument20.html [ Crash Pass ]
 crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLDocument21.html [ Crash Pass ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement01.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement02.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement03.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement04.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement05.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement06.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement07.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement08.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement09.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement10.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement100.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement101.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement102.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement103.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement104.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement105.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement106.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement107.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement108.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement109.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement11.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement110.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement111.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement112.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement113.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement114.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement115.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement116.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement117.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement118.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement119.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement12.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement120.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement121.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement122.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement123.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement124.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement125.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement126.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement127.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement128.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement129.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement13.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement130.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement131.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement132.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement133.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement134.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement135.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement136.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement137.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement138.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement139.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement14.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement140.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement141.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement142.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement143.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement144.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement145.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement15.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement16.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement17.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement18.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement19.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement20.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement21.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement22.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement23.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement24.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement25.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement26.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement27.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement28.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement29.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement30.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement31.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement32.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement33.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement34.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement35.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement36.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement37.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement38.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement39.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement40.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement41.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement42.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement43.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement44.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement45.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement46.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement47.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement48.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement49.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement50.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement51.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement52.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement53.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement54.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement55.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement56.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement57.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement58.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement59.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement60.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement61.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement62.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement63.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement64.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement65.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement66.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement67.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement68.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement69.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement70.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement71.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement72.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement73.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement74.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement75.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement76.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement77.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement78.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement79.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement80.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement81.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement82.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement83.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement84.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement85.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement86.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement87.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement88.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement89.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement90.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement91.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement92.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement93.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement94.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement95.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement96.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement97.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement98.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement99.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLFormElement10.html [ Crash ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement01.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement02.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement03.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement04.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement05.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement06.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement07.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement08.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement09.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement10.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement100.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement101.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement102.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement103.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement104.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement105.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement106.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement107.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement108.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement109.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement11.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement110.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement111.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement112.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement113.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement114.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement115.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement116.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement117.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement118.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement119.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement12.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement120.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement121.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement122.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement123.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement124.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement125.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement126.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement127.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement128.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement129.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement13.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement130.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement131.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement132.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement133.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement134.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement135.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement136.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement137.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement138.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement139.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement14.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement140.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement141.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement142.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement143.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement144.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement145.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement15.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement16.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement17.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement18.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement19.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement20.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement21.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement22.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement23.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement24.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement25.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement26.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement27.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement28.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement29.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement30.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement31.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement32.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement33.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement34.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement35.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement36.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement37.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement38.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement39.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement40.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement41.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement42.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement43.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement44.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement45.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement46.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement47.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement48.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement49.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement50.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement51.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement52.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement53.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement54.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement55.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement56.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement57.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement58.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement59.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement60.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement61.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement62.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement63.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement64.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement65.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement66.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement67.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement68.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement69.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement70.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement71.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement72.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement73.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement74.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement75.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement76.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement77.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement78.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement79.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement80.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement81.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement82.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement83.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement84.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement85.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement86.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement87.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement88.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement89.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement90.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement91.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement92.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement93.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement94.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement95.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement96.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement97.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement98.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLElement99.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLFormElement10.html [ Crash Pass ]
 crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLIFrameElement01.html [ Crash Pass ]
 crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLIFrameElement02.html [ Crash Pass ]
 crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLIFrameElement03.html [ Crash Pass ]
@@ -2895,50 +2895,50 @@
 crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLIFrameElement07.html [ Crash Pass ]
 crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLIFrameElement09.html [ Crash Pass ]
 crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLIFrameElement10.html [ Crash Pass ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLIFrameElement11.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLImageElement05.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLImageElement12.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement01.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement02.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement03.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement04.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement05.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement06.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement07.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement08.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement09.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement10.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement11.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement12.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement13.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement14.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement15.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement16.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement17.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement18.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement19.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement20.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLParamElement01.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLParamElement02.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLParamElement03.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLParamElement04.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLSelectElement14.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLTextAreaElement14.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLTextAreaElement15.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object01.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object02.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object03.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object04.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object05.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object07.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object08.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object09.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object10.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object11.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object12.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object13.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object14.html [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object15.html [ Crash ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLIFrameElement11.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLImageElement05.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLImageElement12.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement01.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement02.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement03.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement04.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement05.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement06.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement07.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement08.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement09.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement10.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement11.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement12.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement13.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement14.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement15.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement16.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement17.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement18.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement19.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLObjectElement20.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLParamElement01.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLParamElement02.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLParamElement03.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLParamElement04.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLSelectElement14.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLTextAreaElement14.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/HTMLTextAreaElement15.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object01.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object02.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object03.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object04.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object05.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object07.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object08.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object09.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object10.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object11.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object12.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object13.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object14.html [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/html/level2/html/object15.html [ Crash Pass ]
 crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLDocument01.xhtml [ Crash Pass ]
 crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLDocument02.xhtml [ Crash Pass ]
 crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLDocument03.xhtml [ Crash Pass ]
@@ -2954,151 +2954,151 @@
 crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLDocument14.xhtml [ Crash Pass ]
 crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLDocument15.xhtml [ Crash Pass ]
 crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLDocument16.xhtml [ Crash Pass ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement01.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement02.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement03.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement04.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement05.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement06.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement07.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement08.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement09.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement10.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement100.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement101.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement102.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement103.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement104.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement105.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement106.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement107.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement108.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement109.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement11.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement110.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement111.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement112.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement113.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement114.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement115.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement116.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement117.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement118.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement119.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement12.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement120.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement121.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement122.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement123.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement124.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement125.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement126.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement127.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement128.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement129.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement13.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement130.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement131.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement132.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement133.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement134.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement135.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement136.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement137.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement138.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement139.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement14.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement140.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement141.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement142.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement143.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement144.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement145.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement15.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement16.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement17.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement18.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement19.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement20.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement21.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement22.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement23.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement24.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement25.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement26.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement27.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement28.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement29.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement30.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement31.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement32.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement33.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement34.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement35.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement36.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement37.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement38.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement39.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement40.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement41.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement42.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement43.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement44.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement45.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement46.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement47.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement48.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement49.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement50.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement51.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement52.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement53.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement54.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement55.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement56.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement57.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement58.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement59.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement60.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement61.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement62.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement63.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement64.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement65.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement66.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement67.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement68.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement69.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement70.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement71.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement72.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement73.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement74.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement75.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement76.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement77.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement78.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement79.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement80.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement81.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement82.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement83.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement84.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement85.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement86.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement87.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement88.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement89.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement90.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement91.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement92.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement93.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement94.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement95.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement96.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement97.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement98.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement99.xhtml [ Crash ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement01.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement02.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement03.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement04.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement05.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement06.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement07.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement08.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement09.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement10.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement100.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement101.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement102.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement103.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement104.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement105.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement106.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement107.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement108.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement109.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement11.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement110.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement111.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement112.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement113.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement114.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement115.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement116.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement117.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement118.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement119.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement12.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement120.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement121.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement122.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement123.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement124.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement125.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement126.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement127.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement128.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement129.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement13.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement130.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement131.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement132.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement133.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement134.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement135.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement136.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement137.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement138.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement139.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement14.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement140.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement141.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement142.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement143.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement144.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement145.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement15.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement16.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement17.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement18.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement19.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement20.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement21.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement22.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement23.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement24.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement25.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement26.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement27.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement28.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement29.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement30.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement31.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement32.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement33.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement34.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement35.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement36.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement37.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement38.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement39.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement40.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement41.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement42.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement43.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement44.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement45.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement46.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement47.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement48.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement49.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement50.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement51.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement52.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement53.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement54.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement55.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement56.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement57.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement58.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement59.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement60.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement61.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement62.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement63.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement64.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement65.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement66.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement67.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement68.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement69.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement70.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement71.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement72.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement73.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement74.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement75.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement76.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement77.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement78.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement79.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement80.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement81.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement82.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement83.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement84.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement85.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement86.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement87.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement88.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement89.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement90.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement91.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement92.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement93.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement94.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement95.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement96.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement97.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement98.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLElement99.xhtml [ Crash Pass ]
 crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLIFrameElement01.xhtml [ Crash Pass ]
 crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLIFrameElement02.xhtml [ Crash Pass ]
 crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLIFrameElement03.xhtml [ Crash Pass ]
@@ -3109,57 +3109,57 @@
 crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLIFrameElement08.xhtml [ Crash Pass ]
 crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLIFrameElement09.xhtml [ Crash Pass ]
 crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLIFrameElement10.xhtml [ Crash Pass ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLIFrameElement11.xhtml [ Crash ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLIFrameElement11.xhtml [ Crash Pass ]
 crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLImageElement03.xhtml [ Crash Pass ]
 crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLImageElement04.xhtml [ Crash Pass ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLImageElement05.xhtml [ Crash ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLImageElement05.xhtml [ Crash Pass ]
 crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLImageElement07.xhtml [ Crash Pass ]
 crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLImageElement09.xhtml [ Crash Pass ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLImageElement12.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement01.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement02.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement03.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement04.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement05.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement06.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement07.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement08.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement09.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement10.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement11.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement12.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement13.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement14.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement15.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement16.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement17.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement18.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement19.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement20.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLParamElement01.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLParamElement02.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLParamElement03.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLParamElement04.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLSelectElement14.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLTextAreaElement14.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLTextAreaElement15.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object01.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object02.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object03.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object04.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object05.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object07.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object08.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object09.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object10.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object11.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object12.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object13.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object14.xhtml [ Crash ]
-crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object15.xhtml [ Crash ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLImageElement12.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement01.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement02.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement03.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement04.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement05.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement06.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement07.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement08.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement09.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement10.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement11.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement12.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement13.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement14.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement15.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement16.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement17.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement18.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement19.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLObjectElement20.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLParamElement01.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLParamElement02.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLParamElement03.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLParamElement04.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLSelectElement14.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLTextAreaElement14.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/HTMLTextAreaElement15.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object01.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object02.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object03.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object04.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object05.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object07.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object08.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object09.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object10.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object11.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object12.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object13.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object14.xhtml [ Crash Pass ]
+crbug.com/591099 dom/legacy_dom_conformance/xhtml/level2/html/object15.xhtml [ Crash Pass ]
 crbug.com/591099 editing/active-suggestion-marker-basic.html [ Failure ]
 crbug.com/591099 editing/active-suggestion-marker-split.html [ Failure ]
-crbug.com/591099 editing/assert_selection.html [ Crash ]
+crbug.com/591099 editing/assert_selection.html [ Crash Failure ]
 crbug.com/591099 editing/caret/caret-color-001.html [ Failure ]
 crbug.com/591099 editing/caret/caret-color-002.html [ Failure ]
 crbug.com/591099 editing/caret/caret-color-003.html [ Failure ]
@@ -3178,7 +3178,7 @@
 crbug.com/591099 editing/caret/selection-with-caret-type-progress.html [ Failure ]
 crbug.com/591099 editing/composition-marker-basic.html [ Failure ]
 crbug.com/591099 editing/composition-marker-split.html [ Failure ]
-crbug.com/591099 editing/deleting/4866671.html [ Crash ]
+crbug.com/591099 editing/deleting/4866671.html [ Crash Failure ]
 crbug.com/591099 editing/deleting/4875189.html [ Crash Failure ]
 crbug.com/591099 editing/deleting/4916235-1.html [ Failure ]
 crbug.com/591099 editing/deleting/4922367.html [ Failure ]
@@ -3195,24 +3195,24 @@
 crbug.com/591099 editing/deleting/5433862-2.html [ Failure ]
 crbug.com/591099 editing/deleting/5483370.html [ Failure ]
 crbug.com/591099 editing/deleting/5729680.html [ Failure ]
-crbug.com/591099 editing/deleting/delete-3608430-fix.html [ Crash ]
+crbug.com/591099 editing/deleting/delete-3608430-fix.html [ Crash Failure ]
 crbug.com/591099 editing/deleting/delete-3865854-fix.html [ Failure ]
-crbug.com/591099 editing/deleting/delete-all-text-in-text-field-assertion.html [ Crash ]
+crbug.com/591099 editing/deleting/delete-all-text-in-text-field-assertion.html [ Crash Pass ]
 crbug.com/591099 editing/deleting/delete-and-cleanup.html [ Failure ]
 crbug.com/591099 editing/deleting/delete-at-paragraph-boundaries-011.html [ Failure ]
 crbug.com/591099 editing/deleting/delete-block-merge-contents-025.html [ Failure ]
 crbug.com/591099 editing/deleting/delete-block-table.html [ Crash Failure ]
 crbug.com/591099 editing/deleting/delete-blockquote-large-offsets.html [ Failure ]
 crbug.com/591099 editing/deleting/delete-br-013.html [ Failure ]
-crbug.com/591099 editing/deleting/delete-br-after-image.html [ Crash ]
+crbug.com/591099 editing/deleting/delete-br-after-image.html [ Crash Pass ]
 crbug.com/591099 editing/deleting/delete-button-background-image-none.html [ Failure ]
-crbug.com/591099 editing/deleting/delete-character-002.html [ Crash ]
+crbug.com/591099 editing/deleting/delete-character-002.html [ Crash Pass ]
 crbug.com/591099 editing/deleting/delete-contiguous-ws-001.html [ Crash Failure ]
 crbug.com/591099 editing/deleting/delete-empty-table.html [ Failure ]
-crbug.com/591099 editing/deleting/delete-inline-br.html [ Crash ]
+crbug.com/591099 editing/deleting/delete-inline-br.html [ Crash Pass ]
 crbug.com/591099 editing/deleting/delete-last-char-in-table.html [ Crash Failure ]
 crbug.com/591099 editing/deleting/delete-leading-ws-001.html [ Failure ]
-crbug.com/591099 editing/deleting/delete-ligature-001.html [ Crash ]
+crbug.com/591099 editing/deleting/delete-ligature-001.html [ Crash Pass ]
 crbug.com/591099 editing/deleting/delete-line-001.html [ Failure ]
 crbug.com/591099 editing/deleting/delete-line-002.html [ Failure ]
 crbug.com/591099 editing/deleting/delete-line-004.html [ Failure ]
@@ -3230,15 +3230,15 @@
 crbug.com/591099 editing/deleting/delete-node-after-DOMNodeRemoved.html [ Failure ]
 crbug.com/591099 editing/deleting/delete-selection-001.html [ Failure ]
 crbug.com/591099 editing/deleting/delete-surrogatepair.html [ Failure ]
-crbug.com/591099 editing/deleting/delete-svg-001.html [ Crash ]
+crbug.com/591099 editing/deleting/delete-svg-001.html [ Crash Pass ]
 crbug.com/591099 editing/deleting/delete_after_span_ws.html [ Failure ]
-crbug.com/591099 editing/deleting/delete_block_merge_contents_1.html [ Crash ]
-crbug.com/591099 editing/deleting/delete_block_merge_whitespace.html [ Crash ]
-crbug.com/591099 editing/deleting/delete_image.html [ Crash ]
+crbug.com/591099 editing/deleting/delete_block_merge_contents_1.html [ Crash Failure ]
+crbug.com/591099 editing/deleting/delete_block_merge_whitespace.html [ Crash Failure ]
+crbug.com/591099 editing/deleting/delete_image.html [ Crash Pass ]
 crbug.com/591099 editing/deleting/delete_line_end_ws.html [ Failure ]
 crbug.com/591099 editing/deleting/delete_map_area.html [ Failure ]
-crbug.com/591099 editing/deleting/delete_trailing_ws.html [ Crash ]
-crbug.com/591099 editing/deleting/delete_ws_fixup.html [ Crash ]
+crbug.com/591099 editing/deleting/delete_trailing_ws.html [ Crash Failure ]
+crbug.com/591099 editing/deleting/delete_ws_fixup.html [ Crash Failure ]
 crbug.com/591099 editing/deleting/forward-delete-key.html [ Failure ]
 crbug.com/591099 editing/deleting/merge-at-end-of-document.html [ Failure ]
 crbug.com/591099 editing/deleting/merge-different-styles.html [ Failure ]
@@ -3249,10 +3249,10 @@
 crbug.com/591099 editing/deleting/merge-paragraph-into-blockquote.html [ Failure ]
 crbug.com/591099 editing/deleting/merge-paragraph-into-pre.html [ Failure ]
 crbug.com/591099 editing/deleting/merge-whitespace-pre.html [ Failure ]
-crbug.com/591099 editing/deleting/merge_paragraph_into_h1.html [ Crash ]
+crbug.com/591099 editing/deleting/merge_paragraph_into_h1.html [ Crash Failure ]
 crbug.com/591099 editing/deleting/move-nodes-001.html [ Failure ]
 crbug.com/591099 editing/deleting/non-smart-delete.html [ Failure ]
-crbug.com/591099 editing/deleting/password-delete-contents.html [ Crash ]
+crbug.com/591099 editing/deleting/password-delete-contents.html [ Crash Failure ]
 crbug.com/591099 editing/deleting/paste-with-transparent-background-color.html [ Failure ]
 crbug.com/591099 editing/deleting/removeNodeCommand-assert.html [ Failure ]
 crbug.com/591099 editing/deleting/table-cells.html [ Failure ]
@@ -3275,8 +3275,8 @@
 crbug.com/591099 editing/execCommand/4920742-2.html [ Crash Failure ]
 crbug.com/591099 editing/execCommand/4928635.html [ Crash Failure ]
 crbug.com/591099 editing/execCommand/4976800.html [ Failure ]
-crbug.com/591099 editing/execCommand/5080333-1.html [ Crash ]
-crbug.com/591099 editing/execCommand/5080333-2.html [ Crash ]
+crbug.com/591099 editing/execCommand/5080333-1.html [ Crash Pass ]
+crbug.com/591099 editing/execCommand/5080333-2.html [ Crash Pass ]
 crbug.com/591099 editing/execCommand/5119244.html [ Failure ]
 crbug.com/591099 editing/execCommand/5120591.html [ Failure ]
 crbug.com/591099 editing/execCommand/5136770.html [ Crash Failure ]
@@ -3301,11 +3301,11 @@
 crbug.com/591099 editing/execCommand/5700414-1.html [ Failure ]
 crbug.com/591099 editing/execCommand/5700414-2.html [ Failure ]
 crbug.com/591099 editing/execCommand/align-in-span.html [ Failure ]
-crbug.com/591099 editing/execCommand/apply-inline-style-to-element-with-no-renderer-crash.html [ Crash ]
-crbug.com/591099 editing/execCommand/apply-style-command-crash.html [ Crash ]
-crbug.com/591099 editing/execCommand/apply-style-empty-paragraph-start-crash.html [ Crash ]
+crbug.com/591099 editing/execCommand/apply-inline-style-to-element-with-no-renderer-crash.html [ Crash Pass ]
+crbug.com/591099 editing/execCommand/apply-style-command-crash.html [ Crash Pass ]
+crbug.com/591099 editing/execCommand/apply-style-empty-paragraph-start-crash.html [ Crash Pass ]
 crbug.com/591099 editing/execCommand/apply-style-text-decoration-crash.html [ Failure ]
-crbug.com/591099 editing/execCommand/applyblockelement-visiblepositionforindex-crash.html [ Crash ]
+crbug.com/591099 editing/execCommand/applyblockelement-visiblepositionforindex-crash.html [ Crash Pass ]
 crbug.com/591099 editing/execCommand/arguments-combinations.html [ Failure ]
 crbug.com/591099 editing/execCommand/backcolor-crash.html [ Crash Failure ]
 crbug.com/591099 editing/execCommand/boldSelection.html [ Failure ]
@@ -3313,12 +3313,12 @@
 crbug.com/591099 editing/execCommand/clipboard-access-with-userGesture.html [ Failure ]
 crbug.com/591099 editing/execCommand/clipboard-access.html [ Failure ]
 crbug.com/591099 editing/execCommand/convert-style-elements-to-spans.html [ Failure ]
-crbug.com/591099 editing/execCommand/crash-line-break-after-outdent.html [ Crash ]
-crbug.com/591099 editing/execCommand/crash-object-cloning.html [ Crash ]
+crbug.com/591099 editing/execCommand/crash-line-break-after-outdent.html [ Crash Failure ]
+crbug.com/591099 editing/execCommand/crash-object-cloning.html [ Crash Pass ]
 crbug.com/591099 editing/execCommand/default-paragraph-separator.html [ Failure ]
 crbug.com/591099 editing/execCommand/default-parameters.html [ Failure ]
 crbug.com/591099 editing/execCommand/delete-selection-has-style.html [ Failure ]
-crbug.com/591099 editing/execCommand/editing-nontext-node-crash.xhtml [ Crash ]
+crbug.com/591099 editing/execCommand/editing-nontext-node-crash.xhtml [ Crash Failure ]
 crbug.com/591099 editing/execCommand/empty-span-removal.html [ Failure ]
 crbug.com/591099 editing/execCommand/enabling-and-selection-2.html [ Failure Timeout ]
 crbug.com/591099 editing/execCommand/enabling-and-selection.html [ Failure ]
@@ -3327,53 +3327,53 @@
 crbug.com/591099 editing/execCommand/findString-diacriticals.html [ Failure ]
 crbug.com/591099 editing/execCommand/findString.html [ Failure ]
 crbug.com/591099 editing/execCommand/format-block-contenteditable-false.html [ Failure ]
-crbug.com/591099 editing/execCommand/format-block-crash.html [ Crash ]
+crbug.com/591099 editing/execCommand/format-block-crash.html [ Crash Failure ]
 crbug.com/591099 editing/execCommand/format-block-from-range-selection.html [ Failure ]
-crbug.com/591099 editing/execCommand/format-block-multiple-paragraphs-in-pre.html [ Crash ]
-crbug.com/591099 editing/execCommand/format-block-multiple-paragraphs.html [ Crash ]
+crbug.com/591099 editing/execCommand/format-block-multiple-paragraphs-in-pre.html [ Crash Failure ]
+crbug.com/591099 editing/execCommand/format-block-multiple-paragraphs.html [ Crash Failure ]
 crbug.com/591099 editing/execCommand/format-block-with-trailing-br.html [ Failure ]
 crbug.com/591099 editing/execCommand/format_block/no-visible-content.html [ Failure ]
-crbug.com/591099 editing/execCommand/format_block/unrooted-selection-start-crash.html [ Crash ]
+crbug.com/591099 editing/execCommand/format_block/unrooted-selection-start-crash.html [ Crash Pass ]
 crbug.com/591099 editing/execCommand/forward-delete-no-scroll.html [ Failure ]
-crbug.com/591099 editing/execCommand/indent-crash-by-top-load-event.html [ Crash ]
+crbug.com/591099 editing/execCommand/indent-crash-by-top-load-event.html [ Crash Pass ]
 crbug.com/591099 editing/execCommand/indent-div-inside-list.html [ Failure ]
 crbug.com/591099 editing/execCommand/indent-empty-root.html [ Failure ]
 crbug.com/591099 editing/execCommand/indent-empty-table-cell.html [ Failure ]
-crbug.com/591099 editing/execCommand/indent-images-2.html [ Crash ]
-crbug.com/591099 editing/execCommand/indent-images-3.html [ Crash ]
-crbug.com/591099 editing/execCommand/indent-images.html [ Crash ]
+crbug.com/591099 editing/execCommand/indent-images-2.html [ Crash Pass ]
+crbug.com/591099 editing/execCommand/indent-images-3.html [ Crash Pass ]
+crbug.com/591099 editing/execCommand/indent-images.html [ Crash Pass ]
 crbug.com/591099 editing/execCommand/indent-inline-box-crash.html [ Crash Pass ]
 crbug.com/591099 editing/execCommand/indent-nested-blockquotes-crash.html [ Crash Pass ]
 crbug.com/591099 editing/execCommand/indent-nested-blockquotes.html [ Failure ]
 crbug.com/591099 editing/execCommand/indent-nested-div.html [ Failure ]
-crbug.com/591099 editing/execCommand/indent-paragraphs.html [ Crash ]
+crbug.com/591099 editing/execCommand/indent-paragraphs.html [ Crash Pass ]
 crbug.com/591099 editing/execCommand/indent-partial-table.html [ Failure ]
 crbug.com/591099 editing/execCommand/indent-right-after-table.html [ Failure ]
 crbug.com/591099 editing/execCommand/indent-second-paragraph-in-blockquote.html [ Failure ]
-crbug.com/591099 editing/execCommand/infinite-recursion-computeRectForRepaint.html [ Crash ]
+crbug.com/591099 editing/execCommand/infinite-recursion-computeRectForRepaint.html [ Crash Failure ]
 crbug.com/591099 editing/execCommand/inline-style-after-indentoutdent.html [ Crash Failure ]
-crbug.com/591099 editing/execCommand/insert-image-changing-visibility-crash.html [ Crash ]
+crbug.com/591099 editing/execCommand/insert-image-changing-visibility-crash.html [ Crash Failure ]
 crbug.com/591099 editing/execCommand/insert-image-on-top-of-directional-text.html [ Failure ]
-crbug.com/591099 editing/execCommand/insert-image-with-selecting-document.html [ Crash ]
+crbug.com/591099 editing/execCommand/insert-image-with-selecting-document.html [ Crash Pass ]
 crbug.com/591099 editing/execCommand/insert-line-break-no-scroll.html [ Failure ]
-crbug.com/591099 editing/execCommand/insert-list-br-with-child-crash.html [ Crash ]
+crbug.com/591099 editing/execCommand/insert-list-br-with-child-crash.html [ Crash Failure ]
 crbug.com/591099 editing/execCommand/insert-list-empty-div.html [ Failure ]
 crbug.com/591099 editing/execCommand/insert-list-in-noneditable-list-parent.html [ Failure ]
-crbug.com/591099 editing/execCommand/insert-list-with-progress-crash.html [ Crash ]
+crbug.com/591099 editing/execCommand/insert-list-with-progress-crash.html [ Crash Pass ]
 crbug.com/591099 editing/execCommand/insert-lists-inside-another-list.html [ Crash Failure ]
-crbug.com/591099 editing/execCommand/insert-ordered-list-crash.html [ Crash ]
-crbug.com/591099 editing/execCommand/insert-ordered-list.html [ Crash ]
-crbug.com/591099 editing/execCommand/insert-paragraph-into-table.html [ Crash ]
+crbug.com/591099 editing/execCommand/insert-ordered-list-crash.html [ Crash Failure ]
+crbug.com/591099 editing/execCommand/insert-ordered-list.html [ Crash Pass ]
+crbug.com/591099 editing/execCommand/insert-paragraph-into-table.html [ Crash Pass ]
 crbug.com/591099 editing/execCommand/insert-remove-block-list-inside-presentational-inline.html [ Crash Failure ]
 crbug.com/591099 editing/execCommand/insert-text-not-inheriting-block-properties.html [ Failure ]
-crbug.com/591099 editing/execCommand/insertHTML-aborted.html [ Crash ]
+crbug.com/591099 editing/execCommand/insertHTML-aborted.html [ Crash Pass ]
 crbug.com/591099 editing/execCommand/insertHTML.html [ Failure ]
 crbug.com/591099 editing/execCommand/insertImage-src.html [ Failure ]
 crbug.com/591099 editing/execCommand/insertImage.html [ Failure ]
-crbug.com/591099 editing/execCommand/inserting-ordered-list-crash.html [ Crash ]
-crbug.com/591099 editing/execCommand/italic-crash-by-iframe-load.html [ Crash ]
+crbug.com/591099 editing/execCommand/inserting-ordered-list-crash.html [ Crash Failure ]
+crbug.com/591099 editing/execCommand/italic-crash-by-iframe-load.html [ Crash Pass ]
 crbug.com/591099 editing/execCommand/italicizeByCharacter.html [ Crash Failure ]
-crbug.com/591099 editing/execCommand/justify-right-crash.html [ Crash ]
+crbug.com/591099 editing/execCommand/justify-right-crash.html [ Crash Pass ]
 crbug.com/591099 editing/execCommand/justify.html [ Failure Timeout ]
 crbug.com/591099 editing/execCommand/merge-text-decoration-with-typing-style.html [ Failure ]
 crbug.com/591099 editing/execCommand/modifyForeColorByCharacter.html [ Crash Failure ]
@@ -3381,42 +3381,42 @@
 crbug.com/591099 editing/execCommand/move-selection-back-line-strict.html [ Failure ]
 crbug.com/591099 editing/execCommand/move-selection-back-line.html [ Failure ]
 crbug.com/591099 editing/execCommand/non-html-document.html [ Failure ]
-crbug.com/591099 editing/execCommand/outdent-break-with-style.html [ Crash ]
-crbug.com/591099 editing/execCommand/outdent-collapse-table-crash.html [ Crash ]
+crbug.com/591099 editing/execCommand/outdent-break-with-style.html [ Crash Pass ]
+crbug.com/591099 editing/execCommand/outdent-collapse-table-crash.html [ Crash Pass ]
 crbug.com/591099 editing/execCommand/outdent-inline-list.html [ Crash Failure ]
 crbug.com/591099 editing/execCommand/outdent-multiparagraph-list.html [ Crash Failure ]
 crbug.com/591099 editing/execCommand/outdent-regular-blockquote.html [ Crash Failure ]
 crbug.com/591099 editing/execCommand/outdent-selection.html [ Crash Failure ]
 crbug.com/591099 editing/execCommand/overtype-support.html [ Failure ]
-crbug.com/591099 editing/execCommand/paste-1.html [ Crash ]
-crbug.com/591099 editing/execCommand/paste-2.html [ Crash ]
+crbug.com/591099 editing/execCommand/paste-1.html [ Crash Pass ]
+crbug.com/591099 editing/execCommand/paste-2.html [ Crash Pass ]
 crbug.com/591099 editing/execCommand/query-command-state.html [ Timeout ]
 crbug.com/591099 editing/execCommand/query-command-value-background-color.html [ Failure ]
 crbug.com/591099 editing/execCommand/query-font-size-with-typing-style.html [ Failure ]
-crbug.com/591099 editing/execCommand/query-format-block.html [ Crash ]
+crbug.com/591099 editing/execCommand/query-format-block.html [ Crash Timeout ]
 crbug.com/591099 editing/execCommand/query-text-alignment.html [ Failure Timeout ]
 crbug.com/591099 editing/execCommand/query-text-decoration-with-typing-style.html [ Failure ]
 crbug.com/591099 editing/execCommand/queryCommandState-02.html [ Crash Failure ]
-crbug.com/591099 editing/execCommand/queryCommandState-03.html [ Crash ]
+crbug.com/591099 editing/execCommand/queryCommandState-03.html [ Crash Pass ]
 crbug.com/591099 editing/execCommand/queryCommandValue-unsupported-commands.html [ Failure ]
 crbug.com/591099 editing/execCommand/remove-format-background-color.html [ Failure ]
-crbug.com/591099 editing/execCommand/remove-format-elements.html [ Crash ]
-crbug.com/591099 editing/execCommand/remove-format-iframe-in-button.html [ Crash ]
-crbug.com/591099 editing/execCommand/remove-format-image.html [ Crash ]
+crbug.com/591099 editing/execCommand/remove-format-elements.html [ Crash Pass ]
+crbug.com/591099 editing/execCommand/remove-format-iframe-in-button.html [ Crash Pass ]
+crbug.com/591099 editing/execCommand/remove-format-image.html [ Crash Pass ]
 crbug.com/591099 editing/execCommand/remove-format-multiple-elements-mac.html [ Failure ]
 crbug.com/591099 editing/execCommand/remove-format-multiple-elements-win.html [ Failure Timeout ]
-crbug.com/591099 editing/execCommand/remove-format-textdecoration-in-iframe.html [ Crash ]
+crbug.com/591099 editing/execCommand/remove-format-textdecoration-in-iframe.html [ Crash Pass ]
 crbug.com/591099 editing/execCommand/remove-list-from-range-selection.html [ Crash Failure ]
 crbug.com/591099 editing/execCommand/remove_format_and_extract_contents.html [ Failure ]
-crbug.com/591099 editing/execCommand/replace-crossing-mailblockquote-crash.html [ Crash ]
-crbug.com/591099 editing/execCommand/replaceSelectorCommand-crash.html [ Crash ]
-crbug.com/591099 editing/execCommand/selectAll-including-marquee-crash.html [ Crash ]
+crbug.com/591099 editing/execCommand/replace-crossing-mailblockquote-crash.html [ Crash Pass ]
+crbug.com/591099 editing/execCommand/replaceSelectorCommand-crash.html [ Crash Failure ]
+crbug.com/591099 editing/execCommand/selectAll-including-marquee-crash.html [ Crash Pass ]
 crbug.com/591099 editing/execCommand/selection-after-insert-list.html [ Crash Failure ]
 crbug.com/591099 editing/execCommand/strikethrough-uses-strike-tag.html [ Failure ]
 crbug.com/591099 editing/execCommand/strikethroughSelection.html [ Crash Failure ]
 crbug.com/591099 editing/execCommand/style-with-css.html [ Failure ]
-crbug.com/591099 editing/execCommand/switch-multiple-list-items-crash.html [ Crash ]
-crbug.com/591099 editing/execCommand/toggle-compound-styles.html [ Crash ]
+crbug.com/591099 editing/execCommand/switch-multiple-list-items-crash.html [ Crash Pass ]
+crbug.com/591099 editing/execCommand/toggle-compound-styles.html [ Crash Timeout ]
 crbug.com/591099 editing/execCommand/toggle-link-mac.html [ Failure ]
 crbug.com/591099 editing/execCommand/toggle-link-win.html [ Failure ]
 crbug.com/591099 editing/execCommand/toggle-style-2.html [ Failure ]
@@ -3425,20 +3425,20 @@
 crbug.com/591099 editing/execCommand/toggle-text-decorations.html [ Failure ]
 crbug.com/591099 editing/execCommand/toggle-unlink-mac.html [ Failure ]
 crbug.com/591099 editing/execCommand/toggle-unlink-win.html [ Failure ]
-crbug.com/591099 editing/execCommand/unlink.html [ Crash ]
+crbug.com/591099 editing/execCommand/unlink.html [ Crash Pass ]
 crbug.com/591099 editing/execCommand/use-css.html [ Failure ]
-crbug.com/591099 editing/execCommand/window-open-insert-list-crash.html [ Crash ]
+crbug.com/591099 editing/execCommand/window-open-insert-list-crash.html [ Crash Failure ]
 crbug.com/591099 editing/input/caret-at-the-edge-of-contenteditable.html [ Failure ]
 crbug.com/591099 editing/input/caret-at-the-edge-of-input.html [ Crash Failure ]
 crbug.com/591099 editing/input/caret-read-only-after-editable.html [ Failure ]
 crbug.com/591099 editing/input/change-style-with-key-binding.html [ Failure ]
-crbug.com/591099 editing/input/div-first-child-rule-input.html [ Crash ]
-crbug.com/591099 editing/input/div-first-child-rule-textarea.html [ Crash ]
-crbug.com/591099 editing/input/drag_in_unselectable.html [ Crash ]
+crbug.com/591099 editing/input/div-first-child-rule-input.html [ Crash Failure ]
+crbug.com/591099 editing/input/div-first-child-rule-textarea.html [ Crash Failure ]
+crbug.com/591099 editing/input/drag_in_unselectable.html [ Crash Pass ]
 crbug.com/591099 editing/input/editable-container-with-word-wrap-normal.html [ Failure ]
 crbug.com/591099 editing/input/ime-composition-clearpreedit.html [ Crash Failure ]
-crbug.com/591099 editing/input/insert-wrapping-space-in-textarea.html [ Crash ]
-crbug.com/591099 editing/input/keyboard-ctrl-enter-no-newline.html [ Crash ]
+crbug.com/591099 editing/input/insert-wrapping-space-in-textarea.html [ Crash Failure ]
+crbug.com/591099 editing/input/keyboard-ctrl-enter-no-newline.html [ Crash Pass ]
 crbug.com/591099 editing/input/linux_ltr_composition_underline.html [ Crash Failure ]
 crbug.com/591099 editing/input/linux_rtl_composition_underline.html [ Crash Failure ]
 crbug.com/591099 editing/input/option-page-up-down.html [ Failure ]
@@ -3447,10 +3447,10 @@
 crbug.com/591099 editing/input/password-echo-passnode3.html [ Crash Failure ]
 crbug.com/591099 editing/input/password-echo-textnode.html [ Crash Failure ]
 crbug.com/591099 editing/input/paste-linebreak-into-initially-hidden-textarea.html [ Crash Failure ]
-crbug.com/591099 editing/input/paste-text-ending-with-interchange-newline.html [ Crash ]
+crbug.com/591099 editing/input/paste-text-ending-with-interchange-newline.html [ Crash Pass ]
 crbug.com/591099 editing/input/reveal-caret-of-multiline-contenteditable.html [ Failure ]
 crbug.com/591099 editing/input/reveal-caret-of-multiline-input.html [ Crash Failure ]
-crbug.com/591099 editing/input/reveal-caret-of-transformed-input-scrollable-parent.html [ Crash ]
+crbug.com/591099 editing/input/reveal-caret-of-transformed-input-scrollable-parent.html [ Crash Pass ]
 crbug.com/591099 editing/input/reveal-password.html [ Crash Failure ]
 crbug.com/591099 editing/input/scroll-viewport-page-up-down.html [ Failure ]
 crbug.com/591099 editing/input/search-field-crash-in-designmode.html [ Failure ]
@@ -3458,8 +3458,8 @@
 crbug.com/591099 editing/input/set-value-on-input-and-forward-delete.html [ Crash Failure ]
 crbug.com/591099 editing/input/set-value-on-input-and-type-input.html [ Crash Failure ]
 crbug.com/591099 editing/input/set-value-on-input-and-type-textarea.html [ Crash Failure ]
-crbug.com/591099 editing/input/setting-input-value-cancel-ime-composition.html [ Crash ]
-crbug.com/591099 editing/input/textcontrol-doubleclick-at-end.html [ Crash Failure ]
+crbug.com/591099 editing/input/setting-input-value-cancel-ime-composition.html [ Crash Failure ]
+crbug.com/591099 editing/input/textcontrol-doubleclick-at-end.html [ Crash Failure Pass ]
 crbug.com/591099 editing/inserting/4278698.html [ Failure ]
 crbug.com/591099 editing/inserting/4840662.html [ Failure ]
 crbug.com/591099 editing/inserting/4875189-1.html [ Crash Failure ]
@@ -3478,10 +3478,10 @@
 crbug.com/591099 editing/inserting/5549929-2.html [ Failure ]
 crbug.com/591099 editing/inserting/5549929-3.html [ Failure ]
 crbug.com/591099 editing/inserting/5607069-1.html [ Failure ]
-crbug.com/591099 editing/inserting/5607069-2.html [ Crash ]
-crbug.com/591099 editing/inserting/5607069-3.html [ Crash ]
+crbug.com/591099 editing/inserting/5607069-2.html [ Crash Pass ]
+crbug.com/591099 editing/inserting/5607069-3.html [ Crash Pass ]
 crbug.com/591099 editing/inserting/5685601-3.html [ Failure ]
-crbug.com/591099 editing/inserting/5994480-2.html [ Crash ]
+crbug.com/591099 editing/inserting/5994480-2.html [ Crash Pass ]
 crbug.com/591099 editing/inserting/6609479-1.html [ Failure ]
 crbug.com/591099 editing/inserting/6609479.html [ Failure ]
 crbug.com/591099 editing/inserting/6703873.html [ Failure ]
@@ -3490,7 +3490,7 @@
 crbug.com/591099 editing/inserting/delete-insignificant-text-crash.html [ Failure ]
 crbug.com/591099 editing/inserting/editable-inline-element.html [ Failure ]
 crbug.com/591099 editing/inserting/edited-whitespace-1.html [ Failure ]
-crbug.com/591099 editing/inserting/editing-empty-divs.html [ Crash ]
+crbug.com/591099 editing/inserting/editing-empty-divs.html [ Crash Failure ]
 crbug.com/591099 editing/inserting/insert-3659587-fix.html [ Crash Failure ]
 crbug.com/591099 editing/inserting/insert-3800346-fix.html [ Failure ]
 crbug.com/591099 editing/inserting/insert-after-delete-001.html [ Failure ]
@@ -3502,47 +3502,47 @@
 crbug.com/591099 editing/inserting/insert-br-quoted-006.html [ Failure ]
 crbug.com/591099 editing/inserting/insert-composition-whitespace.html [ Failure ]
 crbug.com/591099 editing/inserting/insert-empty-html.html [ Failure ]
-crbug.com/591099 editing/inserting/insert-html-to-textarea-crash.html [ Crash ]
-crbug.com/591099 editing/inserting/insert-images-in-pre-x-crash.html [ Crash Failure ]
-crbug.com/591099 editing/inserting/insert-paragraph-after-non-editable-node-before-text.html [ Crash ]
-crbug.com/591099 editing/inserting/insert-paragraph-empty-textarea.html [ Crash ]
-crbug.com/591099 editing/inserting/insert-paragraph-selection-outside-contenteditable.html [ Crash ]
-crbug.com/591099 editing/inserting/insert-paragraph-separator-crash2.html [ Crash ]
+crbug.com/591099 editing/inserting/insert-html-to-textarea-crash.html [ Crash Pass ]
+crbug.com/591099 editing/inserting/insert-images-in-pre-x-crash.html [ Crash Failure Pass ]
+crbug.com/591099 editing/inserting/insert-paragraph-after-non-editable-node-before-text.html [ Crash Pass ]
+crbug.com/591099 editing/inserting/insert-paragraph-empty-textarea.html [ Crash Pass ]
+crbug.com/591099 editing/inserting/insert-paragraph-selection-outside-contenteditable.html [ Crash Pass ]
+crbug.com/591099 editing/inserting/insert-paragraph-separator-crash2.html [ Crash Pass ]
 crbug.com/591099 editing/inserting/insert-paragraph-separator-tab-span.html [ Failure ]
 crbug.com/591099 editing/inserting/insert-paste-bidi-control.html [ Crash Failure ]
-crbug.com/591099 editing/inserting/insert-space-at-start-of-wrapped-line.html [ Crash ]
+crbug.com/591099 editing/inserting/insert-space-at-start-of-wrapped-line.html [ Crash Failure ]
 crbug.com/591099 editing/inserting/insert-space-in-empty-doc.html [ Failure ]
 crbug.com/591099 editing/inserting/insert-table-in-paragraph-crash.html [ Failure ]
 crbug.com/591099 editing/inserting/insert-text-at-tabspan-001.html [ Failure ]
 crbug.com/591099 editing/inserting/insert-text-at-tabspan-003.html [ Failure ]
 crbug.com/591099 editing/inserting/insert-text-into-font.html [ Failure ]
-crbug.com/591099 editing/inserting/insert-text-with-newlines.html [ Crash ]
+crbug.com/591099 editing/inserting/insert-text-with-newlines.html [ Crash Failure ]
 crbug.com/591099 editing/inserting/insert-thai-characters-001.html [ Failure ]
-crbug.com/591099 editing/inserting/insert-without-inheriting-style.html [ Crash ]
+crbug.com/591099 editing/inserting/insert-without-inheriting-style.html [ Crash Pass ]
 crbug.com/591099 editing/inserting/insert_after_delete.html [ Failure ]
 crbug.com/591099 editing/inserting/insert_div_with_style.html [ Failure ]
-crbug.com/591099 editing/inserting/insert_html_as_plain_text.html [ Crash ]
+crbug.com/591099 editing/inserting/insert_html_as_plain_text.html [ Crash Failure ]
 crbug.com/591099 editing/inserting/insert_interchange_newline.html [ Failure ]
 crbug.com/591099 editing/inserting/line-break.html [ Failure ]
 crbug.com/591099 editing/inserting/page-zoom-font-size.html [ Failure ]
 crbug.com/591099 editing/inserting/paragraph-outside-nested-divs.html [ Failure ]
 crbug.com/591099 editing/inserting/paragraph-separator-in-table-1.html [ Failure ]
 crbug.com/591099 editing/inserting/paragraph-separator-in-table-2.html [ Failure ]
-crbug.com/591099 editing/inserting/redo_insert_text.html [ Crash ]
-crbug.com/591099 editing/inserting/replace-at-visible-boundary.html [ Crash ]
+crbug.com/591099 editing/inserting/redo_insert_text.html [ Crash Failure ]
+crbug.com/591099 editing/inserting/replace-at-visible-boundary.html [ Crash Pass ]
 crbug.com/591099 editing/inserting/replace-in-heading-001.html [ Failure ]
 crbug.com/591099 editing/inserting/replace-in-paragraph-001.html [ Failure ]
-crbug.com/591099 editing/inserting/replace_text_with_br.html [ Crash ]
-crbug.com/591099 editing/inserting/return-key-in-hidden-field.html [ Crash ]
+crbug.com/591099 editing/inserting/replace_text_with_br.html [ Crash Failure ]
+crbug.com/591099 editing/inserting/return-key-in-hidden-field.html [ Crash Pass ]
 crbug.com/591099 editing/inserting/return-key-middle-of-span.html [ Failure ]
 crbug.com/591099 editing/inserting/return-with-object-element.html [ Failure Pass ]
-crbug.com/591099 editing/inserting/typing.html [ Crash ]
+crbug.com/591099 editing/inserting/typing.html [ Crash Failure ]
 crbug.com/591099 editing/pasteboard/4242293.html [ Failure ]
 crbug.com/591099 editing/pasteboard/4631972.html [ Failure ]
 crbug.com/591099 editing/pasteboard/4744008.html [ Failure ]
-crbug.com/591099 editing/pasteboard/4806874.html [ Crash ]
+crbug.com/591099 editing/pasteboard/4806874.html [ Crash Failure ]
 crbug.com/591099 editing/pasteboard/4944770-1.html [ Failure ]
-crbug.com/591099 editing/pasteboard/4944770-2.html [ Crash ]
+crbug.com/591099 editing/pasteboard/4944770-2.html [ Crash Pass ]
 crbug.com/591099 editing/pasteboard/4947130.html [ Failure ]
 crbug.com/591099 editing/pasteboard/5006779.html [ Failure ]
 crbug.com/591099 editing/pasteboard/5032095.html [ Failure ]
@@ -3554,7 +3554,7 @@
 crbug.com/591099 editing/pasteboard/5478250.html [ Failure ]
 crbug.com/591099 editing/pasteboard/5521237.html [ Failure ]
 crbug.com/591099 editing/pasteboard/5601583-1.html [ Failure ]
-crbug.com/591099 editing/pasteboard/5665299.html [ Crash ]
+crbug.com/591099 editing/pasteboard/5665299.html [ Crash Pass ]
 crbug.com/591099 editing/pasteboard/5761530-1.html [ Failure ]
 crbug.com/591099 editing/pasteboard/5780697-2.html [ Failure ]
 crbug.com/591099 editing/pasteboard/6018653.html [ Failure ]
@@ -3566,27 +3566,27 @@
 crbug.com/591099 editing/pasteboard/clipboard-customData.html [ Failure ]
 crbug.com/591099 editing/pasteboard/copy-backslash-with-euc.html [ Crash Failure ]
 crbug.com/591099 editing/pasteboard/copy-crash.html [ Crash Timeout ]
-crbug.com/591099 editing/pasteboard/copy-cut-paste-keyevent.html [ Crash ]
+crbug.com/591099 editing/pasteboard/copy-cut-paste-keyevent.html [ Crash Pass ]
 crbug.com/591099 editing/pasteboard/copy-display-none.html [ Failure ]
 crbug.com/591099 editing/pasteboard/copy-element-with-conflicting-background-color-from-rule.html [ Failure ]
-crbug.com/591099 editing/pasteboard/copy-image-with-alt-text.html [ Crash ]
+crbug.com/591099 editing/pasteboard/copy-image-with-alt-text.html [ Crash Failure ]
 crbug.com/591099 editing/pasteboard/copy-in-password-field.html [ Crash Failure ]
-crbug.com/591099 editing/pasteboard/copy-null-characters.html [ Crash ]
+crbug.com/591099 editing/pasteboard/copy-null-characters.html [ Crash Failure ]
 crbug.com/591099 editing/pasteboard/copy-paste-bidi.html [ Crash Failure ]
 crbug.com/591099 editing/pasteboard/copy-paste-float.html [ Crash Failure ]
 crbug.com/591099 editing/pasteboard/copy-paste-pre-line-content.html [ Failure ]
-crbug.com/591099 editing/pasteboard/copy-paste-ruby-text-with-block.html [ Crash ]
-crbug.com/591099 editing/pasteboard/copy-paste-ruby-text.html [ Crash ]
+crbug.com/591099 editing/pasteboard/copy-paste-ruby-text-with-block.html [ Crash Failure ]
+crbug.com/591099 editing/pasteboard/copy-paste-ruby-text.html [ Crash Failure ]
 crbug.com/591099 editing/pasteboard/copy-paste-white-space.html [ Failure ]
 crbug.com/591099 editing/pasteboard/copy-resolves-urls.html [ Crash Failure ]
-crbug.com/591099 editing/pasteboard/copy-standalone-image-crash.html [ Crash ]
+crbug.com/591099 editing/pasteboard/copy-standalone-image-crash.html [ Crash Pass ]
 crbug.com/591099 editing/pasteboard/copy-standalone-image-escaping.html [ Timeout ]
 crbug.com/591099 editing/pasteboard/copy-standalone-image.html [ Failure ]
 crbug.com/591099 editing/pasteboard/copy-without-common-block-crash.html [ Failure ]
 crbug.com/591099 editing/pasteboard/copy_image_and_select.html [ Failure ]
 crbug.com/591099 editing/pasteboard/crash-accessing-clipboardData-types.html [ Failure ]
 crbug.com/591099 editing/pasteboard/data-transfer-items-drag-drop-string.html [ Crash Failure ]
-crbug.com/591099 editing/pasteboard/data-transfer-items-image-png-details.html [ Crash ]
+crbug.com/591099 editing/pasteboard/data-transfer-items-image-png-details.html [ Crash Pass ]
 crbug.com/591099 editing/pasteboard/data-transfer-items.html [ Failure ]
 crbug.com/591099 editing/pasteboard/dataTransfer-setData-getData.html [ Failure ]
 crbug.com/591099 editing/pasteboard/drag-and-drop-image-contenteditable.html [ Timeout ]
@@ -3594,15 +3594,15 @@
 crbug.com/591099 editing/pasteboard/drag-and-drop-objectimage-contenteditable.html [ Timeout ]
 crbug.com/591099 editing/pasteboard/drag-drop-copy-text.html [ Crash Failure ]
 crbug.com/591099 editing/pasteboard/drag-drop-dead-frame.html [ Timeout ]
-crbug.com/591099 editing/pasteboard/drag-drop-iframe-refresh-crash.html [ Crash ]
-crbug.com/591099 editing/pasteboard/drag-drop-input-in-svg.svg [ Crash ]
+crbug.com/591099 editing/pasteboard/drag-drop-iframe-refresh-crash.html [ Crash Failure ]
+crbug.com/591099 editing/pasteboard/drag-drop-input-in-svg.svg [ Crash Pass ]
 crbug.com/591099 editing/pasteboard/drag-drop-input-textarea.html [ Crash Failure ]
 crbug.com/591099 editing/pasteboard/drag-drop-list.html [ Failure ]
 crbug.com/591099 editing/pasteboard/drag-drop-modifies-page.html [ Failure ]
 crbug.com/591099 editing/pasteboard/drag-drop-url-text.html [ Crash Failure ]
 crbug.com/591099 editing/pasteboard/drag-drop-url-with-style.html [ Failure ]
 crbug.com/591099 editing/pasteboard/drag-files-to-editable-element.html [ Failure ]
-crbug.com/591099 editing/pasteboard/drag-image-in-about-blank-frame.html [ Crash ]
+crbug.com/591099 editing/pasteboard/drag-image-in-about-blank-frame.html [ Crash Failure ]
 crbug.com/591099 editing/pasteboard/drag-image-to-contenteditable-in-iframe.html [ Crash Failure ]
 crbug.com/591099 editing/pasteboard/drag-list-item.html [ Crash Failure ]
 crbug.com/591099 editing/pasteboard/drag-prioritizes-draggable-container-over-image.html [ Failure ]
@@ -3615,7 +3615,7 @@
 crbug.com/591099 editing/pasteboard/drop-text-events.html [ Crash Failure ]
 crbug.com/591099 editing/pasteboard/drop-text-without-selection.html [ Failure ]
 crbug.com/591099 editing/pasteboard/file-drag-to-editable.html [ Failure ]
-crbug.com/591099 editing/pasteboard/file-input-files-access.html [ Crash ]
+crbug.com/591099 editing/pasteboard/file-input-files-access.html [ Crash Failure ]
 crbug.com/591099 editing/pasteboard/files-during-page-drags.html [ Failure ]
 crbug.com/591099 editing/pasteboard/get-data-text-plain-drop.html [ Failure ]
 crbug.com/591099 editing/pasteboard/get-data-text-plain-paste.html [ Failure ]
@@ -3626,7 +3626,7 @@
 crbug.com/591099 editing/pasteboard/insert-font-weight.html [ Failure ]
 crbug.com/591099 editing/pasteboard/merge-start-blockquote.html [ Failure ]
 crbug.com/591099 editing/pasteboard/merge-start-list.html [ Failure ]
-crbug.com/591099 editing/pasteboard/mixed_editability.html [ Crash ]
+crbug.com/591099 editing/pasteboard/mixed_editability.html [ Crash Failure ]
 crbug.com/591099 editing/pasteboard/onpaste-text-html.html [ Failure ]
 crbug.com/591099 editing/pasteboard/paste-after-inline-style-element.html [ Failure ]
 crbug.com/591099 editing/pasteboard/paste-and-sanitize.html [ Failure ]
@@ -3664,12 +3664,12 @@
 crbug.com/591099 editing/pasteboard/paste-wrapped-blockquote-into-nonblockquote.html [ Failure ]
 crbug.com/591099 editing/pasteboard/paste_match_style.html [ Failure ]
 crbug.com/591099 editing/pasteboard/paste_with_spaces.html [ Failure ]
-crbug.com/591099 editing/pasteboard/pasteboard_with_unfocused_selection.html [ Crash ]
+crbug.com/591099 editing/pasteboard/pasteboard_with_unfocused_selection.html [ Crash Failure ]
 crbug.com/591099 editing/pasteboard/pasting-empty-html-falls-back-to-text.html [ Failure ]
 crbug.com/591099 editing/pasteboard/pasting-tabs.html [ Crash Failure ]
 crbug.com/591099 editing/pasteboard/quirks-mode-br-1.html [ Crash Failure ]
-crbug.com/591099 editing/pasteboard/restore-collapsed-space-for-copy.html [ Crash ]
-crbug.com/591099 editing/pasteboard/select-element-1.html [ Crash ]
+crbug.com/591099 editing/pasteboard/restore-collapsed-space-for-copy.html [ Crash Failure ]
+crbug.com/591099 editing/pasteboard/select-element-1.html [ Crash Failure ]
 crbug.com/591099 editing/pasteboard/selection-paste-crash.html [ Failure ]
 crbug.com/591099 editing/pasteboard/set_data_typeof_return.html [ Failure ]
 crbug.com/591099 editing/pasteboard/smart-drag-drop.html [ Failure ]
@@ -3678,7 +3678,7 @@
 crbug.com/591099 editing/pasteboard/smart-paste-in-text-control.html [ Failure ]
 crbug.com/591099 editing/pasteboard/smart_paste.html [ Failure ]
 crbug.com/591099 editing/pasteboard/styled-element-markup.html [ Failure ]
-crbug.com/591099 editing/pasteboard/subframe-dragndrop-1.html [ Crash ]
+crbug.com/591099 editing/pasteboard/subframe-dragndrop-1.html [ Crash Failure ]
 crbug.com/591099 editing/selection/4402375.html [ Failure ]
 crbug.com/591099 editing/selection/4776665.html [ Failure ]
 crbug.com/591099 editing/selection/4960116.html [ Failure ]
@@ -3696,7 +3696,7 @@
 crbug.com/591099 editing/selection/5232159.html [ Failure ]
 crbug.com/591099 editing/selection/5241148.html [ Failure ]
 crbug.com/591099 editing/selection/5354455-2.html [ Failure ]
-crbug.com/591099 editing/selection/5794920-1.html [ Crash ]
+crbug.com/591099 editing/selection/5794920-1.html [ Crash Pass ]
 crbug.com/591099 editing/selection/6476.html [ Failure ]
 crbug.com/591099 editing/selection/DOMSelection-DocumentType.html [ Failure ]
 crbug.com/591099 editing/selection/DOMSelection-crossing-document.html [ Failure ]
@@ -3729,9 +3729,9 @@
 crbug.com/591099 editing/selection/caret-rtl-right.html [ Failure ]
 crbug.com/591099 editing/selection/caret-rtl.html [ Failure ]
 crbug.com/591099 editing/selection/character-data-mutation-crash.html [ Failure ]
-crbug.com/591099 editing/selection/clear-selection-crash.html [ Crash ]
+crbug.com/591099 editing/selection/clear-selection-crash.html [ Crash Pass ]
 crbug.com/591099 editing/selection/clear-selection.html [ Failure ]
-crbug.com/591099 editing/selection/cleared-by-relayout.html [ Crash ]
+crbug.com/591099 editing/selection/cleared-by-relayout.html [ Crash Failure ]
 crbug.com/591099 editing/selection/click-after-nested-block.html [ Failure ]
 crbug.com/591099 editing/selection/click-in-focusable-link-should-not-clear-selection.html [ Failure ]
 crbug.com/591099 editing/selection/click-in-margins-inside-editable-div.html [ Failure ]
@@ -3741,10 +3741,10 @@
 crbug.com/591099 editing/selection/click-start-of-line.html [ Failure ]
 crbug.com/591099 editing/selection/collapse-null.html [ Failure ]
 crbug.com/591099 editing/selection/collapse-selection-in-bidi.html [ Failure ]
-crbug.com/591099 editing/selection/collapse/collapse_before_select.html [ Crash ]
-crbug.com/591099 editing/selection/collapse/table-caret-3.html [ Crash ]
-crbug.com/591099 editing/selection/collapseto_in_text_fields.html [ Crash ]
-crbug.com/591099 editing/selection/commit-pending-selection-crash.html [ Crash ]
+crbug.com/591099 editing/selection/collapse/collapse_before_select.html [ Crash Pass ]
+crbug.com/591099 editing/selection/collapse/table-caret-3.html [ Crash Pass ]
+crbug.com/591099 editing/selection/collapseto_in_text_fields.html [ Crash Pass ]
+crbug.com/591099 editing/selection/commit-pending-selection-crash.html [ Crash Pass ]
 crbug.com/591099 editing/selection/contains-boundaries.html [ Failure ]
 crbug.com/591099 editing/selection/contenteditable-click-inside.html [ Failure ]
 crbug.com/591099 editing/selection/context-menu-on-text.html [ Failure ]
@@ -3754,8 +3754,8 @@
 crbug.com/591099 editing/selection/css-pseudo-element-hang.html [ Failure ]
 crbug.com/591099 editing/selection/css-pseudo-element.html [ Failure ]
 crbug.com/591099 editing/selection/delete-word-granularity-text-control.html [ Crash Failure ]
-crbug.com/591099 editing/selection/deleteFromDocument-scoped-dispatch-event-crash.html [ Crash ]
-crbug.com/591099 editing/selection/deletefromdocument-shadow-leak.html [ Crash ]
+crbug.com/591099 editing/selection/deleteFromDocument-scoped-dispatch-event-crash.html [ Crash Failure ]
+crbug.com/591099 editing/selection/deletefromdocument-shadow-leak.html [ Crash Pass ]
 crbug.com/591099 editing/selection/designmode-no-caret.html [ Failure ]
 crbug.com/591099 editing/selection/directionality-after-undo-replace.html [ Crash Failure ]
 crbug.com/591099 editing/selection/display-table-text.html [ Failure ]
@@ -3766,7 +3766,7 @@
 crbug.com/591099 editing/selection/double_click_and_modify.html [ Failure ]
 crbug.com/591099 editing/selection/doubleclick-beside-cr-span.html [ Failure Timeout ]
 crbug.com/591099 editing/selection/doubleclick-inline-first-last-contenteditable.html [ Failure ]
-crbug.com/591099 editing/selection/doubleclick-whitespace-img-crash.html [ Crash ]
+crbug.com/591099 editing/selection/doubleclick-whitespace-img-crash.html [ Crash Pass ]
 crbug.com/591099 editing/selection/doubleclick-whitespace.html [ Crash Failure ]
 crbug.com/591099 editing/selection/doubleclick-with-split-text.html [ Crash Failure ]
 crbug.com/591099 editing/selection/drag-drop-events.html [ Crash Failure ]
@@ -3779,9 +3779,9 @@
 crbug.com/591099 editing/selection/drag-start-event-client-x-y.html [ Failure ]
 crbug.com/591099 editing/selection/drag-text-delay.html [ Crash Failure ]
 crbug.com/591099 editing/selection/drag-to-contenteditable-iframe.html [ Crash Failure ]
-crbug.com/591099 editing/selection/drag_with_unfocused_selection.html [ Crash ]
-crbug.com/591099 editing/selection/dump-as-markup-form-text.html [ Crash ]
-crbug.com/591099 editing/selection/dump-as-markup.html [ Crash ]
+crbug.com/591099 editing/selection/drag_with_unfocused_selection.html [ Crash Failure ]
+crbug.com/591099 editing/selection/dump-as-markup-form-text.html [ Crash Pass ]
+crbug.com/591099 editing/selection/dump-as-markup.html [ Crash Pass ]
 crbug.com/591099 editing/selection/editable-div-clear-on-keydown.html [ Failure ]
 crbug.com/591099 editing/selection/editable-links.html [ Failure ]
 crbug.com/591099 editing/selection/expanding-selections.html [ Failure ]
@@ -3793,7 +3793,7 @@
 crbug.com/591099 editing/selection/extend-forward-after-set-base-and-extent.html [ Failure ]
 crbug.com/591099 editing/selection/extend-inside-transforms-backward.html [ Failure ]
 crbug.com/591099 editing/selection/extend-inside-transforms-forward.html [ Failure ]
-crbug.com/591099 editing/selection/extend-over-file-input-by-drag-crash.html [ Crash ]
+crbug.com/591099 editing/selection/extend-over-file-input-by-drag-crash.html [ Crash Failure ]
 crbug.com/591099 editing/selection/extend-selection-after-double-click.html [ Failure ]
 crbug.com/591099 editing/selection/extend-selection-bidi.html [ Failure ]
 crbug.com/591099 editing/selection/extend-selection-character.html [ Timeout ]
@@ -3801,24 +3801,24 @@
 crbug.com/591099 editing/selection/extend-selection-word.html [ Timeout ]
 crbug.com/591099 editing/selection/extend-to-trailing-spaces.html [ Failure ]
 crbug.com/591099 editing/selection/find-in-text-control.html [ Crash Failure ]
-crbug.com/591099 editing/selection/first-letter-selection-crash.html [ Crash ]
+crbug.com/591099 editing/selection/first-letter-selection-crash.html [ Crash Pass ]
 crbug.com/591099 editing/selection/firstRect-crash.html [ Failure ]
-crbug.com/591099 editing/selection/focus-and-display-none-and-redisplay.html [ Crash ]
-crbug.com/591099 editing/selection/focus-and-display-none.html [ Crash ]
+crbug.com/591099 editing/selection/focus-and-display-none-and-redisplay.html [ Crash Failure ]
+crbug.com/591099 editing/selection/focus-and-display-none.html [ Crash Pass ]
 crbug.com/591099 editing/selection/focus-body.html [ Failure ]
-crbug.com/591099 editing/selection/focus-contenteditable-iframe.html [ Crash ]
-crbug.com/591099 editing/selection/focus-crash.html [ Crash ]
+crbug.com/591099 editing/selection/focus-contenteditable-iframe.html [ Crash Pass ]
+crbug.com/591099 editing/selection/focus-crash.html [ Crash Pass ]
 crbug.com/591099 editing/selection/focus-iframe-removal-crash.html [ Failure ]
 crbug.com/591099 editing/selection/focus_editable_html_element.html [ Timeout ]
 crbug.com/591099 editing/selection/hit-test-anonymous.html [ Failure ]
 crbug.com/591099 editing/selection/hit-test-on-text-with-line-height.html [ Failure ]
 crbug.com/591099 editing/selection/home-end.html [ Timeout ]
-crbug.com/591099 editing/selection/iframe-select-animation.html [ Crash ]
+crbug.com/591099 editing/selection/iframe-select-animation.html [ Crash Pass ]
 crbug.com/591099 editing/selection/inactive-selection.html [ Crash Failure ]
 crbug.com/591099 editing/selection/inline-closest-leaf-child.html [ Failure ]
 crbug.com/591099 editing/selection/internal-caret-rect.html [ Failure ]
 crbug.com/591099 editing/selection/keep-selection-after-set-focus.html [ Failure ]
-crbug.com/591099 editing/selection/keydown-without-selection-crash.html [ Crash ]
+crbug.com/591099 editing/selection/keydown-without-selection-crash.html [ Crash Pass ]
 crbug.com/591099 editing/selection/leave-requested-block.html [ Failure ]
 crbug.com/591099 editing/selection/legal-positions.html [ Crash Failure ]
 crbug.com/591099 editing/selection/line-wrap-1.html [ Failure ]
@@ -3838,34 +3838,34 @@
 crbug.com/591099 editing/selection/mixed-editability-inline-height.html [ Failure ]
 crbug.com/591099 editing/selection/modify-by-lineboundary-in-inline-editable-contexts.html [ Failure ]
 crbug.com/591099 editing/selection/modify-up-on-rtl-wrapping-text.html [ Failure ]
-crbug.com/591099 editing/selection/modify_extend/extend_by_character.html [ Crash ]
-crbug.com/591099 editing/selection/modify_extend/extend_selection_enclosing_block.html [ Crash ]
+crbug.com/591099 editing/selection/modify_extend/extend_by_character.html [ Crash Failure ]
+crbug.com/591099 editing/selection/modify_extend/extend_selection_enclosing_block.html [ Crash Failure ]
 crbug.com/591099 editing/selection/modify_move/move-by-character-001.html [ Failure ]
-crbug.com/591099 editing/selection/modify_move/move-by-character-002.html [ Crash ]
+crbug.com/591099 editing/selection/modify_move/move-by-character-002.html [ Crash Failure ]
 crbug.com/591099 editing/selection/modify_move/move-by-character-003.html [ Failure Pass ]
-crbug.com/591099 editing/selection/modify_move/move-by-character-004.html [ Crash ]
-crbug.com/591099 editing/selection/modify_move/move-by-character-crash-test-textarea.html [ Crash ]
-crbug.com/591099 editing/selection/modify_move/move-by-word-visually-crash-test-1.html [ Crash ]
-crbug.com/591099 editing/selection/modify_move/move-by-word-visually-crash-test-3.html [ Crash ]
-crbug.com/591099 editing/selection/modify_move/move-by-word-visually-crash-test-css-generated-content.html [ Crash ]
-crbug.com/591099 editing/selection/modify_move/move-by-word-visually-inline-block-positioned-element.html [ Crash ]
+crbug.com/591099 editing/selection/modify_move/move-by-character-004.html [ Crash Failure ]
+crbug.com/591099 editing/selection/modify_move/move-by-character-crash-test-textarea.html [ Crash Pass ]
+crbug.com/591099 editing/selection/modify_move/move-by-word-visually-crash-test-1.html [ Crash Pass ]
+crbug.com/591099 editing/selection/modify_move/move-by-word-visually-crash-test-3.html [ Crash Pass ]
+crbug.com/591099 editing/selection/modify_move/move-by-word-visually-crash-test-css-generated-content.html [ Crash Pass ]
+crbug.com/591099 editing/selection/modify_move/move-by-word-visually-inline-block-positioned-element.html [ Crash Pass ]
 crbug.com/591099 editing/selection/modify_move/move-by-word-visually-multi-line.html [ Crash Failure ]
 crbug.com/591099 editing/selection/modify_move/move-by-word-visually-multi-space.html [ Failure ]
-crbug.com/591099 editing/selection/modify_move/move-by-word-visually-single-space-one-element.html [ Crash ]
-crbug.com/591099 editing/selection/modify_move/move-by-word-visually-textarea.html [ Crash ]
+crbug.com/591099 editing/selection/modify_move/move-by-word-visually-single-space-one-element.html [ Crash Pass ]
+crbug.com/591099 editing/selection/modify_move/move-by-word-visually-textarea.html [ Crash Pass ]
 crbug.com/591099 editing/selection/modify_move/move-by-word-visually-wrong-left-right.html [ Failure ]
-crbug.com/591099 editing/selection/modify_move/move_by_sentence_boundary.html [ Crash ]
-crbug.com/591099 editing/selection/modify_move/move_character_across_iframe.html [ Crash ]
-crbug.com/591099 editing/selection/modify_move/move_character_inline_table.html [ Crash ]
-crbug.com/591099 editing/selection/modify_move/move_forward_character_button.html [ Crash ]
+crbug.com/591099 editing/selection/modify_move/move_by_sentence_boundary.html [ Crash Failure ]
+crbug.com/591099 editing/selection/modify_move/move_character_across_iframe.html [ Crash Failure ]
+crbug.com/591099 editing/selection/modify_move/move_character_inline_table.html [ Crash Pass ]
+crbug.com/591099 editing/selection/modify_move/move_forward_character_button.html [ Crash Pass ]
 crbug.com/591099 editing/selection/modify_move/move_forward_line_br.html [ Failure ]
 crbug.com/591099 editing/selection/modify_move/move_forward_line_range.html [ Failure Pass ]
 crbug.com/591099 editing/selection/modify_move/move_left_right_character_in_mixed_bidi.html [ Failure ]
 crbug.com/591099 editing/selection/mouse/click-left-of-rtl-wrapping-text.html [ Failure ]
 crbug.com/591099 editing/selection/mouse/click-user-select-all-contenteditable.html [ Failure ]
-crbug.com/591099 editing/selection/mouse/click-user-select-all-textarea.html [ Crash ]
+crbug.com/591099 editing/selection/mouse/click-user-select-all-textarea.html [ Crash Failure ]
 crbug.com/591099 editing/selection/mouse/drag-user-select-all-contenteditable.html [ Failure ]
-crbug.com/591099 editing/selection/mouse/drag-user-select-all-textarea.html [ Crash ]
+crbug.com/591099 editing/selection/mouse/drag-user-select-all-textarea.html [ Crash Failure ]
 crbug.com/591099 editing/selection/move-3875618-fix.html [ Failure ]
 crbug.com/591099 editing/selection/move-3875641-fix.html [ Failure ]
 crbug.com/591099 editing/selection/move-backwords-by-word-001.html [ Failure ]
@@ -3908,7 +3908,7 @@
 crbug.com/591099 editing/selection/select-bidi-run.html [ Failure Timeout ]
 crbug.com/591099 editing/selection/select-box.html [ Failure ]
 crbug.com/591099 editing/selection/select-element-paragraph-boundary.html [ Failure ]
-crbug.com/591099 editing/selection/select-from-textfield-outwards.html [ Crash ]
+crbug.com/591099 editing/selection/select-from-textfield-outwards.html [ Crash Pass ]
 crbug.com/591099 editing/selection/select-line-break-with-opposite-directionality.html [ Crash Failure ]
 crbug.com/591099 editing/selection/select-line.html [ Failure ]
 crbug.com/591099 editing/selection/select-missing-image.html [ Crash Failure ]
@@ -3923,26 +3923,26 @@
 crbug.com/591099 editing/selection/selectNode.html [ Crash Failure ]
 crbug.com/591099 editing/selection/selectNodeContents.html [ Crash Failure ]
 crbug.com/591099 editing/selection/select_all/select_all_contenteditable.html [ Failure ]
-crbug.com/591099 editing/selection/select_all/select_all_iframe.html [ Crash ]
-crbug.com/591099 editing/selection/select_all/select_all_iframe_crash.html [ Crash ]
-crbug.com/591099 editing/selection/select_all/select_all_input.html [ Crash ]
+crbug.com/591099 editing/selection/select_all/select_all_iframe.html [ Crash Pass ]
+crbug.com/591099 editing/selection/select_all/select_all_iframe_crash.html [ Crash Pass ]
+crbug.com/591099 editing/selection/select_all/select_all_input.html [ Crash Pass ]
 crbug.com/591099 editing/selection/select_all/select_all_overflow_hidden.html [ Failure ]
 crbug.com/591099 editing/selection/select_all/select_all_overflow_hidden_br.html [ Failure ]
 crbug.com/591099 editing/selection/select_all/select_all_overflow_hidden_table.html [ Failure ]
-crbug.com/591099 editing/selection/select_all/select_all_readonly_textarea.html [ Crash ]
-crbug.com/591099 editing/selection/select_all/select_all_textarea.html [ Crash ]
+crbug.com/591099 editing/selection/select_all/select_all_readonly_textarea.html [ Crash Pass ]
+crbug.com/591099 editing/selection/select_all/select_all_textarea.html [ Crash Pass ]
 crbug.com/591099 editing/selection/select_all/select_all_user_select_none.html [ Failure ]
 crbug.com/591099 editing/selection/selection-3748164-fix.html [ Failure ]
 crbug.com/591099 editing/selection/selection-background.html [ Failure ]
 crbug.com/591099 editing/selection/selection-button-text.html [ Failure ]
-crbug.com/591099 editing/selection/selection-crash.html [ Crash ]
+crbug.com/591099 editing/selection/selection-crash.html [ Crash Pass ]
 crbug.com/591099 editing/selection/selection-empty-documentElement.html [ Failure ]
 crbug.com/591099 editing/selection/selection-exceptions.html [ Failure ]
 crbug.com/591099 editing/selection/selection-extend-should-not-move-across-caret-on-mac.html [ Failure ]
-crbug.com/591099 editing/selection/selection-forces-unrooted-repaint.html [ Crash ]
+crbug.com/591099 editing/selection/selection-forces-unrooted-repaint.html [ Crash Pass ]
 crbug.com/591099 editing/selection/selection-invalid-offset.html [ Failure Pass ]
-crbug.com/591099 editing/selection/selection-plugin-clear-crash.html [ Crash ]
-crbug.com/591099 editing/selection/selectstart_detaches_frame.html [ Crash ]
+crbug.com/591099 editing/selection/selection-plugin-clear-crash.html [ Crash Pass ]
+crbug.com/591099 editing/selection/selectstart_detaches_frame.html [ Crash Pass ]
 crbug.com/591099 editing/selection/shift-click.html [ Crash Failure ]
 crbug.com/591099 editing/selection/shrink-selection-after-shift-pagedown.html [ Crash Failure ]
 crbug.com/591099 editing/selection/skip-non-editable-1.html [ Crash Failure ]
@@ -3957,16 +3957,16 @@
 crbug.com/591099 editing/selection/toString.html [ Crash Failure ]
 crbug.com/591099 editing/selection/transformed-selection-rects.html [ Failure ]
 crbug.com/591099 editing/selection/triple-click-in-pre.html [ Failure ]
-crbug.com/591099 editing/selection/undo-crash.html [ Crash ]
+crbug.com/591099 editing/selection/undo-crash.html [ Crash Pass ]
 crbug.com/591099 editing/selection/user-select-all-parsing.html [ Failure ]
-crbug.com/591099 editing/selection/user-select-all-with-shift.html [ Crash ]
-crbug.com/591099 editing/selection/user-select/user-select-all.html [ Crash ]
+crbug.com/591099 editing/selection/user-select-all-with-shift.html [ Crash Failure ]
+crbug.com/591099 editing/selection/user-select/user-select-all.html [ Crash Failure ]
 crbug.com/591099 editing/selection/vertical-lr-ltr-extend-line-backward-br.html [ Failure Pass ]
 crbug.com/591099 editing/selection/vertical-lr-ltr-extend-line-forward-br.html [ Failure Pass ]
 crbug.com/591099 editing/selection/vertical-rl-ltr-extend-line-backward-br.html [ Failure Pass ]
-crbug.com/591099 editing/selection/vertical-rl-ltr-extend-line-backward-wrap.html [ Crash ]
+crbug.com/591099 editing/selection/vertical-rl-ltr-extend-line-backward-wrap.html [ Crash Failure ]
 crbug.com/591099 editing/selection/vertical-rl-ltr-extend-line-forward-br.html [ Failure Pass ]
-crbug.com/591099 editing/selection/vertical-rl-ltr-extend-line-forward-wrap.html [ Crash ]
+crbug.com/591099 editing/selection/vertical-rl-ltr-extend-line-forward-wrap.html [ Crash Failure ]
 crbug.com/591099 editing/selection/vertical-rl-rtl-extend-line-backward-br.html [ Failure Pass ]
 crbug.com/591099 editing/selection/vertical-rl-rtl-extend-line-backward-p.html [ Failure ]
 crbug.com/591099 editing/selection/vertical-rl-rtl-extend-line-forward-br.html [ Failure Pass ]
@@ -3998,17 +3998,17 @@
 crbug.com/591099 editing/spelling/context_click_select_misspelling.html [ Crash Failure ]
 crbug.com/591099 editing/spelling/grammar-paste.html [ Failure ]
 crbug.com/591099 editing/spelling/mixed_paste.html [ Failure ]
-crbug.com/591099 editing/spelling/no_marker_in_blurred_input.html [ Crash ]
+crbug.com/591099 editing/spelling/no_marker_in_blurred_input.html [ Crash Pass ]
 crbug.com/591099 editing/spelling/spellcheck-async-mutation.html [ Failure ]
-crbug.com/591099 editing/spelling/spellcheck-async-remove-frame.html [ Crash ]
+crbug.com/591099 editing/spelling/spellcheck-async-remove-frame.html [ Crash Pass ]
 crbug.com/591099 editing/spelling/spellcheck-disable-enable.html [ Failure ]
-crbug.com/591099 editing/spelling/spellcheck-editable-on-focus.html [ Crash ]
+crbug.com/591099 editing/spelling/spellcheck-editable-on-focus.html [ Crash Pass ]
 crbug.com/591099 editing/spelling/spellcheck-input-search-crash.html [ Failure ]
 crbug.com/591099 editing/spelling/spellcheck-paste-disabled.html [ Failure ]
 crbug.com/591099 editing/spelling/spellcheck-paste.html [ Failure ]
 crbug.com/591099 editing/spelling/spellcheck-queue.html [ Failure ]
-crbug.com/591099 editing/spelling/spellcheck-remove-markers.html [ Crash ]
-crbug.com/591099 editing/spelling/spellcheck-sequencenum.html [ Crash ]
+crbug.com/591099 editing/spelling/spellcheck-remove-markers.html [ Crash Pass ]
+crbug.com/591099 editing/spelling/spellcheck-sequencenum.html [ Crash Failure ]
 crbug.com/591099 editing/spelling/spellcheck_test.html [ Crash Failure ]
 crbug.com/591099 editing/spelling/spelling-backward.html [ Failure ]
 crbug.com/591099 editing/spelling/spelling-changed-text.html [ Failure ]
@@ -4018,12 +4018,12 @@
 crbug.com/591099 editing/style/5065910.html [ Failure ]
 crbug.com/591099 editing/style/5084241.html [ Failure ]
 crbug.com/591099 editing/style/5228141.html [ Failure ]
-crbug.com/591099 editing/style/5279521.html [ Crash ]
+crbug.com/591099 editing/style/5279521.html [ Crash Failure ]
 crbug.com/591099 editing/style/apply-font-size-to-multiple-nodes.html [ Failure ]
-crbug.com/591099 editing/style/apply-style-atomic.html [ Crash ]
-crbug.com/591099 editing/style/apply-style-crash.html [ Crash ]
-crbug.com/591099 editing/style/apply-style-crash2.html [ Crash ]
-crbug.com/591099 editing/style/apply-style-crash3.html [ Crash ]
+crbug.com/591099 editing/style/apply-style-atomic.html [ Crash Pass ]
+crbug.com/591099 editing/style/apply-style-crash.html [ Crash Pass ]
+crbug.com/591099 editing/style/apply-style-crash2.html [ Crash Pass ]
+crbug.com/591099 editing/style/apply-style-crash3.html [ Crash Failure ]
 crbug.com/591099 editing/style/apply-through-end-of-document.html [ Failure ]
 crbug.com/591099 editing/style/background-color-retained.html [ Failure ]
 crbug.com/591099 editing/style/block-style-001.html [ Failure ]
@@ -4031,7 +4031,7 @@
 crbug.com/591099 editing/style/block-style-003.html [ Failure ]
 crbug.com/591099 editing/style/block-styles-007.html [ Failure ]
 crbug.com/591099 editing/style/designmode.html [ Failure ]
-crbug.com/591099 editing/style/fix-range-from-root-editable-crash.html [ Crash ]
+crbug.com/591099 editing/style/fix-range-from-root-editable-crash.html [ Crash Pass ]
 crbug.com/591099 editing/style/font-face-unquote.html [ Failure ]
 crbug.com/591099 editing/style/font-family-with-space.html [ Failure ]
 crbug.com/591099 editing/style/fontsize-1.html [ Crash Failure ]
@@ -4060,32 +4060,32 @@
 crbug.com/591099 editing/style/text-decoration-state.html [ Failure ]
 crbug.com/591099 editing/style/textdecoration-outside-of-rooteditable.html [ Crash Failure ]
 crbug.com/591099 editing/style/textdecoration-outside-of-unsplittable-element.html [ Crash Failure ]
-crbug.com/591099 editing/style/typing_style.html [ Crash ]
-crbug.com/591099 editing/style/unbold-in-bold.html [ Crash ]
+crbug.com/591099 editing/style/typing_style.html [ Crash Failure ]
+crbug.com/591099 editing/style/unbold-in-bold.html [ Crash Failure ]
 crbug.com/591099 editing/surrounding-text/surrounding-text-detached-no-crash.html [ Failure ]
-crbug.com/591099 editing/surrounding-text/surrounding-text.html [ Crash ]
+crbug.com/591099 editing/surrounding-text/surrounding-text.html [ Crash Failure ]
 crbug.com/591099 editing/text-iterator/basic-iteration-shadowdom.html [ Failure ]
 crbug.com/591099 editing/text-iterator/basic-iteration.html [ Crash Failure ]
 crbug.com/591099 editing/text-iterator/findString-shadow-roots.html [ Failure ]
 crbug.com/591099 editing/text-iterator/findString-start-search-after-selection.html [ Failure Pass ]
 crbug.com/591099 editing/text-iterator/findString.html [ Crash Timeout ]
 crbug.com/591099 editing/text-iterator/first-letter-rtl-crash.html [ Failure Pass ]
-crbug.com/591099 editing/text-iterator/first-letter-word-boundary.html [ Crash ]
+crbug.com/591099 editing/text-iterator/first-letter-word-boundary.html [ Crash Failure ]
 crbug.com/591099 editing/text-iterator/range-to-from-location-and-length.html [ Failure ]
-crbug.com/591099 editing/text-iterator/selection-to-string-with-auto-fill.html [ Crash ]
+crbug.com/591099 editing/text-iterator/selection-to-string-with-auto-fill.html [ Crash Pass ]
 crbug.com/591099 editing/text-iterator/thai-cursor-movement.html [ Crash Failure ]
 crbug.com/591099 editing/undo/5658727.html [ Failure ]
 crbug.com/591099 editing/undo/5738768.html [ Failure ]
-crbug.com/591099 editing/undo/audio-in-undo-stack-crash.html [ Crash ]
+crbug.com/591099 editing/undo/audio-in-undo-stack-crash.html [ Crash Pass ]
 crbug.com/591099 editing/undo/crash-redo-with-iframes.html [ Failure ]
-crbug.com/591099 editing/undo/orphaned-selection-crash-bug32823-2.html [ Crash ]
-crbug.com/591099 editing/undo/orphaned-selection-crash-bug32823-4.html [ Crash ]
+crbug.com/591099 editing/undo/orphaned-selection-crash-bug32823-2.html [ Crash Pass ]
+crbug.com/591099 editing/undo/orphaned-selection-crash-bug32823-4.html [ Crash Pass ]
 crbug.com/591099 editing/undo/paste_with_mutation_event_undo_order.html [ Failure ]
-crbug.com/591099 editing/undo/redo_correct_selection.html [ Crash ]
-crbug.com/591099 editing/undo/undo-after-removing-iframe.html [ Crash ]
+crbug.com/591099 editing/undo/redo_correct_selection.html [ Crash Pass ]
+crbug.com/591099 editing/undo/undo-after-removing-iframe.html [ Crash Pass ]
 crbug.com/591099 editing/undo/undo-after-setting-value.html [ Crash Failure ]
 crbug.com/591099 editing/undo/undo-deleteWord.html [ Failure Pass ]
-crbug.com/591099 editing/undo/undo-iframe-location-change.html [ Crash ]
+crbug.com/591099 editing/undo/undo-iframe-location-change.html [ Crash Pass ]
 crbug.com/591099 editing/undo/undo-set-selection-crash.html [ Failure ]
 crbug.com/591099 editing/undo/undo-smart-delete-reversed-selection.html [ Failure Pass ]
 crbug.com/591099 editing/unsupported-content/list-delete-001.html [ Crash Failure ]
@@ -4097,23 +4097,23 @@
 crbug.com/591099 editing/unsupported-content/table-delete-003.html [ Failure ]
 crbug.com/591099 editing/unsupported-content/table-type-after.html [ Failure ]
 crbug.com/591099 editing/unsupported-content/table-type-before.html [ Failure ]
-crbug.com/591099 external/wpt/2dcontext/drawing-images-to-the-canvas/2d.drawImage.incomplete.emptysrc.html [ Crash ]
+crbug.com/591099 external/wpt/2dcontext/drawing-images-to-the-canvas/2d.drawImage.incomplete.emptysrc.html [ Crash Pass ]
 crbug.com/591099 external/wpt/2dcontext/drawing-images-to-the-canvas/2d.drawImage.incomplete.removedsrc.html [ Crash Pass ]
 crbug.com/591099 external/wpt/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerosource.image.html [ Crash Pass ]
-crbug.com/591099 external/wpt/2dcontext/drawing-paths-to-the-canvas/canvas_focus_drawCustomFocusRing_001.html [ Crash ]
-crbug.com/591099 external/wpt/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_001.html [ Crash ]
-crbug.com/591099 external/wpt/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_002.html [ Crash ]
-crbug.com/591099 external/wpt/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_003.html [ Crash ]
-crbug.com/591099 external/wpt/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_004.html [ Crash ]
-crbug.com/591099 external/wpt/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_005.html [ Crash ]
+crbug.com/591099 external/wpt/2dcontext/drawing-paths-to-the-canvas/canvas_focus_drawCustomFocusRing_001.html [ Crash Pass ]
+crbug.com/591099 external/wpt/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_001.html [ Crash Pass ]
+crbug.com/591099 external/wpt/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_002.html [ Crash Pass ]
+crbug.com/591099 external/wpt/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_003.html [ Crash Pass ]
+crbug.com/591099 external/wpt/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_004.html [ Crash Pass ]
+crbug.com/591099 external/wpt/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_005.html [ Crash Pass ]
 crbug.com/591099 external/wpt/2dcontext/fill-and-stroke-styles/2d.pattern.image.incomplete.emptysrc.html [ Crash Pass ]
-crbug.com/591099 external/wpt/2dcontext/fill-and-stroke-styles/2d.pattern.image.incomplete.removedsrc.html [ Crash ]
-crbug.com/591099 external/wpt/2dcontext/hit-regions/hitregions-members-exist.html [ Crash ]
-crbug.com/591099 external/wpt/2dcontext/line-styles/setLineDash.html [ Crash ]
-crbug.com/591099 external/wpt/FileAPI/idlharness.html [ Crash ]
-crbug.com/591099 external/wpt/FileAPI/url/blob-url-in-sandboxed-iframe.html [ Crash ]
-crbug.com/591099 external/wpt/FileAPI/url/multi-global-origin-serialization.sub.html [ Crash ]
-crbug.com/591099 external/wpt/FileAPI/url/origin.sub.html [ Crash ]
+crbug.com/591099 external/wpt/2dcontext/fill-and-stroke-styles/2d.pattern.image.incomplete.removedsrc.html [ Crash Pass ]
+crbug.com/591099 external/wpt/2dcontext/hit-regions/hitregions-members-exist.html [ Crash Pass ]
+crbug.com/591099 external/wpt/2dcontext/line-styles/setLineDash.html [ Crash Pass ]
+crbug.com/591099 external/wpt/FileAPI/idlharness.html [ Crash Pass ]
+crbug.com/591099 external/wpt/FileAPI/url/blob-url-in-sandboxed-iframe.html [ Crash Pass ]
+crbug.com/591099 external/wpt/FileAPI/url/multi-global-origin-serialization.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/FileAPI/url/origin.sub.html [ Crash Pass ]
 crbug.com/591099 external/wpt/WebCryptoAPI/derive_bits_keys/test_hkdf.https.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/WebCryptoAPI/derive_bits_keys/test_pbkdf2_empty_empty.https.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/WebCryptoAPI/derive_bits_keys/test_pbkdf2_empty_long.https.html [ Pass Timeout ]
@@ -4131,61 +4131,61 @@
 crbug.com/591099 external/wpt/WebCryptoAPI/import_export/test_rsa_importKey.https.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/WebCryptoAPI/import_export/test_symmetric_importKey.https.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/WebIDL/ecmascript-binding/has-instance.html [ Crash Pass ]
-crbug.com/591099 external/wpt/WebIDL/ecmascript-binding/sequence-conversion.html [ Crash ]
-crbug.com/591099 external/wpt/XMLHttpRequest/open-url-multi-window-2.htm [ Crash ]
-crbug.com/591099 external/wpt/XMLHttpRequest/open-url-multi-window-3.htm [ Crash ]
-crbug.com/591099 external/wpt/XMLHttpRequest/open-url-multi-window-4.htm [ Crash ]
+crbug.com/591099 external/wpt/WebIDL/ecmascript-binding/sequence-conversion.html [ Crash Pass ]
+crbug.com/591099 external/wpt/XMLHttpRequest/open-url-multi-window-2.htm [ Crash Pass ]
+crbug.com/591099 external/wpt/XMLHttpRequest/open-url-multi-window-3.htm [ Crash Pass ]
+crbug.com/591099 external/wpt/XMLHttpRequest/open-url-multi-window-4.htm [ Crash Pass ]
 crbug.com/591099 external/wpt/XMLHttpRequest/send-authentication-prompt-2-manual.htm [ Crash Failure ]
-crbug.com/591099 external/wpt/XMLHttpRequest/xmlhttprequest-sync-block-defer-scripts.html [ Crash ]
-crbug.com/591099 external/wpt/XMLHttpRequest/xmlhttprequest-sync-not-hang-scriptloader.html [ Crash ]
-crbug.com/591099 external/wpt/clear-site-data/navigation-insecure.html [ Crash ]
-crbug.com/591099 external/wpt/clear-site-data/navigation.https.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/child-src/child-src-about-blank-allowed-by-default.sub.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/child-src/child-src-about-blank-allowed-by-scheme.sub.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/child-src/child-src-allowed.sub.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/child-src/child-src-blocked.sub.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/child-src/child-src-conflicting-frame-src.sub.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/child-src/child-src-cross-origin-load.sub.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/child-src/child-src-redirect-blocked.sub.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/allow_csp_from-header.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/required_csp-header.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-general.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-hashes.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-hosts.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-paths.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-ports.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-protocols.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-nonces.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-none.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-self.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-strict_dynamic.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_eval.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_hashed_attributes.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_inline.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/frame-ancestors/frame-ancestors-overrides-xfo.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/frame-src/frame-src-redirect.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/generic/no-default-src.sub.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/img-src/img-src-full-host-wildcard-blocked.sub.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/img-src/img-src-host-partial-wildcard-allowed.sub.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/img-src/img-src-none-blocks.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/img-src/img-src-port-wildcard-allowed.sub.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/img-src/img-src-wildcard-allowed.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/meta/meta-img-src.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/meta/meta-modified.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/navigation/to-javascript-url-frame-src.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/navigation/to-javascript-url-script-src.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/nonce-hiding/svgscript-nonces-hidden-meta.tentative.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/nonce-hiding/svgscript-nonces-hidden.tentative.html [ Crash ]
+crbug.com/591099 external/wpt/XMLHttpRequest/xmlhttprequest-sync-block-defer-scripts.html [ Crash Pass ]
+crbug.com/591099 external/wpt/XMLHttpRequest/xmlhttprequest-sync-not-hang-scriptloader.html [ Crash Pass ]
+crbug.com/591099 external/wpt/clear-site-data/navigation-insecure.html [ Crash Pass ]
+crbug.com/591099 external/wpt/clear-site-data/navigation.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/child-src/child-src-about-blank-allowed-by-default.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/child-src/child-src-about-blank-allowed-by-scheme.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/child-src/child-src-allowed.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/child-src/child-src-blocked.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/child-src/child-src-conflicting-frame-src.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/child-src/child-src-cross-origin-load.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/child-src/child-src-redirect-blocked.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/allow_csp_from-header.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/required_csp-header.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-general.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-hashes.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-hosts.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-paths.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-ports.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-protocols.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-nonces.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-none.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-self.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-strict_dynamic.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_eval.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_hashed_attributes.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_inline.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/frame-ancestors/frame-ancestors-overrides-xfo.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/frame-src/frame-src-redirect.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/generic/no-default-src.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/img-src/img-src-full-host-wildcard-blocked.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/img-src/img-src-host-partial-wildcard-allowed.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/img-src/img-src-none-blocks.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/img-src/img-src-port-wildcard-allowed.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/img-src/img-src-wildcard-allowed.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/meta/meta-img-src.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/meta/meta-modified.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/navigation/to-javascript-url-frame-src.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/navigation/to-javascript-url-script-src.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/nonce-hiding/svgscript-nonces-hidden-meta.tentative.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/nonce-hiding/svgscript-nonces-hidden.tentative.html [ Crash Pass ]
 crbug.com/591099 external/wpt/content-security-policy/script-src/script-src-1_2.html [ Crash Pass ]
-crbug.com/591099 external/wpt/content-security-policy/securitypolicyviolation/img-src-redirect-upgrade-reporting.https.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/securitypolicyviolation/script-sample-no-opt-in.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/securitypolicyviolation/script-sample.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/securitypolicyviolation/upgrade-insecure-requests-reporting.https.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/svg/object-in-svg-foreignobject.sub.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/svg/svg-from-guid.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/svg/svg-policy-resource-doc-includes.html [ Crash ]
-crbug.com/591099 external/wpt/content-security-policy/svg/svg-policy-with-resource.html [ Crash ]
-crbug.com/591099 external/wpt/cors/remote-origin.htm [ Crash ]
+crbug.com/591099 external/wpt/content-security-policy/securitypolicyviolation/img-src-redirect-upgrade-reporting.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/securitypolicyviolation/script-sample-no-opt-in.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/securitypolicyviolation/script-sample.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/securitypolicyviolation/upgrade-insecure-requests-reporting.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/svg/object-in-svg-foreignobject.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/svg/svg-from-guid.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/svg/svg-policy-resource-doc-includes.html [ Crash Pass ]
+crbug.com/591099 external/wpt/content-security-policy/svg/svg-policy-with-resource.html [ Crash Pass ]
+crbug.com/591099 external/wpt/cors/remote-origin.htm [ Crash Pass ]
 crbug.com/591099 external/wpt/css-paint-api/geometry-background-image-001.html [ Failure Pass ]
 crbug.com/591099 external/wpt/css-paint-api/geometry-background-image-002.html [ Failure Pass ]
 crbug.com/591099 external/wpt/css-paint-api/geometry-background-image-003.html [ Failure Pass ]
@@ -4392,7 +4392,7 @@
 crbug.com/591099 external/wpt/css/css-display-3/display-contents-dynamic-list-001-none.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-display-3/display-contents-dynamic-multicol-001-inline.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-display-3/display-contents-dynamic-multicol-001-none.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-display-3/display-contents-dynamic-table-001-inline.html [ Crash ]
+crbug.com/591099 external/wpt/css/css-display-3/display-contents-dynamic-table-001-inline.html [ Crash Failure ]
 crbug.com/591099 external/wpt/css/css-display-3/display-contents-list-001.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-display-3/display-contents-multicol-001.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-display-3/display-flow-root-001.html [ Failure ]
@@ -4601,54 +4601,54 @@
 crbug.com/591099 external/wpt/css/css-grid-1/abspos/positioned-grid-items-015.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-grid-1/abspos/positioned-grid-items-016.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-grid-1/abspos/positioned-grid-items-017.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-001.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-002.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-003.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-004.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-005.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-006.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-007.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-008.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-009.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-010.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-011.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-012.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-013.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-014.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-015.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-016.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-001.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-002.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-003.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-004.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-005.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-006.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-007.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-008.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-009.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-010.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-011.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-012.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-013.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-014.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-015.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-016.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-001.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-002.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-003.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-004.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-005.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-006.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-007.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-008.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-009.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-010.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-011.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-012.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-013.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-014.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-015.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-016.html [ Crash ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-001.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-002.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-003.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-004.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-005.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-006.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-007.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-008.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-009.html [ Crash Pass ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-010.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-011.html [ Crash Pass ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-012.html [ Crash Pass ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-013.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-014.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-015.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-016.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-001.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-002.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-003.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-004.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-005.html [ Crash Pass ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-006.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-007.html [ Crash Pass ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-008.html [ Crash Pass ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-009.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-010.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-011.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-012.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-013.html [ Crash Pass ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-014.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-015.html [ Crash Pass ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-016.html [ Crash Pass ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-001.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-002.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-003.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-004.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-005.html [ Crash Pass ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-006.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-007.html [ Crash Pass ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-008.html [ Crash Pass ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-009.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-010.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-011.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-012.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-013.html [ Crash Pass ]
+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/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 ]
@@ -4659,7 +4659,7 @@
 crbug.com/591099 external/wpt/css/css-grid-1/grid-items/grid-z-axis-ordering-overlapped-items-006.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-grid-1/grid-model/grid-inline-margins-no-collapse-001.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-grid-1/grid-model/grid-margins-no-collapse-001.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-grid-1/grid-model/grid-support-display-001.html [ Crash ]
+crbug.com/591099 external/wpt/css/css-grid-1/grid-model/grid-support-display-001.html [ Crash Pass ]
 crbug.com/591099 external/wpt/css/css-position-3/position-sticky-table-th-left.html [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-position-3/position-sticky-table-th-right.html [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-rhythm-1/line-height-step-basic-001.html [ Failure ]
@@ -4790,11 +4790,11 @@
 crbug.com/591099 external/wpt/css/css-ui-3/box-sizing-009.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-ui-3/box-sizing-010.html [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-ui-3/box-sizing-020.html [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-ui-3/caret-color-013.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-ui-3/caret-color-018.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-ui-3/caret-color-019.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-ui-3/caret-color-020.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-ui-3/caret-color-021.html [ Crash ]
+crbug.com/591099 external/wpt/css/css-ui-3/caret-color-013.html [ Crash Pass ]
+crbug.com/591099 external/wpt/css/css-ui-3/caret-color-018.html [ Crash Pass ]
+crbug.com/591099 external/wpt/css/css-ui-3/caret-color-019.html [ Crash Pass ]
+crbug.com/591099 external/wpt/css/css-ui-3/caret-color-020.html [ Crash Pass ]
+crbug.com/591099 external/wpt/css/css-ui-3/caret-color-021.html [ Crash Pass ]
 crbug.com/591099 external/wpt/css/css-ui-3/outline-004.html [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-ui-3/outline-011.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-ui-3/outline-019.html [ Failure ]
@@ -5077,14 +5077,14 @@
 crbug.com/591099 external/wpt/css/css-writing-modes-3/normal-flow-overconstrained-vrl-004.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/ortho-htb-alongside-vrl-floats-002.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/ortho-htb-alongside-vrl-floats-010.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001a.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001b.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001c.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001d.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001e.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001f.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001g.html [ Crash ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001h.html [ Crash ]
+crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001a.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001b.html [ Crash Pass ]
+crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001c.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001d.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001e.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001f.html [ Crash Pass ]
+crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001g.html [ Crash Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001h.html [ Crash Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001i.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001k.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001l.html [ Crash Failure ]
@@ -5199,9 +5199,9 @@
 crbug.com/591099 external/wpt/css/css-writing-modes-3/writing-mode-vertical-rl-002.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/writing-mode-vertical-rl-003.htm [ Failure ]
 crbug.com/591099 external/wpt/css/geometry-1/interfaces.html [ Timeout ]
-crbug.com/591099 external/wpt/css/selectors4/focus-display-none-001.html [ Crash ]
-crbug.com/591099 external/wpt/css/selectors4/focus-within-009.html [ Crash ]
-crbug.com/591099 external/wpt/css/selectors4/focus-within-display-none-001.html [ Crash ]
+crbug.com/591099 external/wpt/css/selectors4/focus-display-none-001.html [ Crash Pass ]
+crbug.com/591099 external/wpt/css/selectors4/focus-within-009.html [ Crash Pass ]
+crbug.com/591099 external/wpt/css/selectors4/focus-within-display-none-001.html [ Crash Pass ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-vert-001a.xhtml [ Crash Failure ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-baseline-horiz-002.xhtml [ Failure Pass ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-baseline-horiz-003.xhtml [ Failure Pass ]
@@ -5253,49 +5253,49 @@
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-006.html [ Crash Failure ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-007.html [ Crash Failure Pass ]
 crbug.com/591099 external/wpt/cssom-view/cssom-getClientRects-002.html [ Failure ]
-crbug.com/591099 external/wpt/cssom-view/elementFromPoint.html [ Crash ]
-crbug.com/591099 external/wpt/cssom-view/elementsFromPoint.html [ Crash ]
-crbug.com/591099 external/wpt/cssom-view/scrolling-quirks-vs-nonquirks.html [ Crash ]
-crbug.com/591099 external/wpt/cssom-view/scrollingElement.html [ Crash ]
-crbug.com/591099 external/wpt/cssom-view/ttwf-js-cssomview-getclientrects-length.html [ Crash ]
+crbug.com/591099 external/wpt/cssom-view/elementFromPoint.html [ Crash Failure ]
+crbug.com/591099 external/wpt/cssom-view/elementsFromPoint.html [ Crash Failure ]
+crbug.com/591099 external/wpt/cssom-view/scrolling-quirks-vs-nonquirks.html [ Crash Pass ]
+crbug.com/591099 external/wpt/cssom-view/scrollingElement.html [ Crash Pass ]
+crbug.com/591099 external/wpt/cssom-view/ttwf-js-cssomview-getclientrects-length.html [ Crash Pass ]
 crbug.com/591099 external/wpt/cssom/serialize-values.html [ Pass Timeout ]
-crbug.com/591099 external/wpt/custom-elements/custom-element-reaction-queue.html [ Crash ]
-crbug.com/591099 external/wpt/custom-elements/custom-element-registry/per-global.html [ Crash ]
-crbug.com/591099 external/wpt/custom-elements/htmlconstructor/newtarget.html [ Crash ]
-crbug.com/591099 external/wpt/custom-elements/reactions/Document.html [ Crash ]
-crbug.com/591099 external/wpt/custom-elements/reactions/HTMLAnchorElement.html [ Crash ]
-crbug.com/591099 external/wpt/custom-elements/reactions/HTMLOptionElement.html [ Crash ]
-crbug.com/591099 external/wpt/custom-elements/reactions/HTMLOptionsCollection.html [ Crash ]
-crbug.com/591099 external/wpt/custom-elements/reactions/HTMLOutputElement.html [ Crash ]
-crbug.com/591099 external/wpt/custom-elements/reactions/HTMLSelectElement.html [ Crash ]
-crbug.com/591099 external/wpt/custom-elements/reactions/HTMLTableElement.html [ Crash ]
-crbug.com/591099 external/wpt/custom-elements/reactions/HTMLTableRowElement.html [ Crash ]
-crbug.com/591099 external/wpt/custom-elements/reactions/HTMLTableSectionElement.html [ Crash ]
-crbug.com/591099 external/wpt/custom-elements/reactions/HTMLTitleElement.html [ Crash ]
-crbug.com/591099 external/wpt/custom-elements/reactions/ShadowRoot.html [ Crash ]
-crbug.com/591099 external/wpt/custom-elements/upgrading/Node-cloneNode.html [ Crash ]
-crbug.com/591099 external/wpt/custom-elements/upgrading/upgrading-enqueue-reactions.html [ Crash ]
-crbug.com/591099 external/wpt/dom/events/EventListener-incumbent-global-1.sub.html [ Crash ]
-crbug.com/591099 external/wpt/dom/events/EventListener-incumbent-global-2.sub.html [ Crash ]
+crbug.com/591099 external/wpt/custom-elements/custom-element-reaction-queue.html [ Crash Pass ]
+crbug.com/591099 external/wpt/custom-elements/custom-element-registry/per-global.html [ Crash Pass ]
+crbug.com/591099 external/wpt/custom-elements/htmlconstructor/newtarget.html [ Crash Pass ]
+crbug.com/591099 external/wpt/custom-elements/reactions/Document.html [ Crash Failure ]
+crbug.com/591099 external/wpt/custom-elements/reactions/HTMLAnchorElement.html [ Crash Pass ]
+crbug.com/591099 external/wpt/custom-elements/reactions/HTMLOptionElement.html [ Crash Pass ]
+crbug.com/591099 external/wpt/custom-elements/reactions/HTMLOptionsCollection.html [ Crash Pass ]
+crbug.com/591099 external/wpt/custom-elements/reactions/HTMLOutputElement.html [ Crash Pass ]
+crbug.com/591099 external/wpt/custom-elements/reactions/HTMLSelectElement.html [ Crash Pass ]
+crbug.com/591099 external/wpt/custom-elements/reactions/HTMLTableElement.html [ Crash Pass ]
+crbug.com/591099 external/wpt/custom-elements/reactions/HTMLTableRowElement.html [ Crash Pass ]
+crbug.com/591099 external/wpt/custom-elements/reactions/HTMLTableSectionElement.html [ Crash Pass ]
+crbug.com/591099 external/wpt/custom-elements/reactions/HTMLTitleElement.html [ Crash Pass ]
+crbug.com/591099 external/wpt/custom-elements/reactions/ShadowRoot.html [ Crash Pass ]
+crbug.com/591099 external/wpt/custom-elements/upgrading/Node-cloneNode.html [ Crash Pass ]
+crbug.com/591099 external/wpt/custom-elements/upgrading/upgrading-enqueue-reactions.html [ Crash Pass ]
+crbug.com/591099 external/wpt/dom/events/EventListener-incumbent-global-1.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/dom/events/EventListener-incumbent-global-2.sub.html [ Crash Pass ]
 crbug.com/591099 external/wpt/dom/interfaces.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/dom/nodes/DOMImplementation-createDocument.html [ Pass Timeout ]
-crbug.com/591099 external/wpt/dom/nodes/Document-URL.sub.html [ Crash ]
-crbug.com/591099 external/wpt/dom/nodes/Document-createElement-namespace.html [ Crash ]
+crbug.com/591099 external/wpt/dom/nodes/Document-URL.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/dom/nodes/Document-createElement-namespace.html [ Crash Pass ]
 crbug.com/591099 external/wpt/dom/nodes/Document-createElementNS.html [ Pass Timeout ]
-crbug.com/591099 external/wpt/dom/nodes/Element-children.html [ Crash ]
+crbug.com/591099 external/wpt/dom/nodes/Element-children.html [ Crash Pass ]
 crbug.com/591099 external/wpt/dom/nodes/Element-classlist.html [ Pass Timeout ]
-crbug.com/591099 external/wpt/dom/nodes/Element-getElementsByTagName-change-document-HTMLNess.html [ Crash ]
-crbug.com/591099 external/wpt/dom/nodes/Element-hasAttributes.html [ Crash ]
+crbug.com/591099 external/wpt/dom/nodes/Element-getElementsByTagName-change-document-HTMLNess.html [ Crash Pass ]
+crbug.com/591099 external/wpt/dom/nodes/Element-hasAttributes.html [ Crash Pass ]
 crbug.com/591099 external/wpt/dom/nodes/Element-matches.html [ Crash Failure Pass Timeout ]
 crbug.com/591099 external/wpt/dom/nodes/Element-webkitMatchesSelector.html [ Crash Failure Pass Timeout ]
 crbug.com/591099 external/wpt/dom/nodes/Node-compareDocumentPosition.html [ Pass Timeout ]
-crbug.com/591099 external/wpt/dom/nodes/Node-contains-xml.xml [ Crash ]
+crbug.com/591099 external/wpt/dom/nodes/Node-contains-xml.xml [ Crash Pass ]
 crbug.com/591099 external/wpt/dom/nodes/Node-contains.html [ Pass Timeout ]
-crbug.com/591099 external/wpt/dom/nodes/Node-parentNode.html [ Crash ]
+crbug.com/591099 external/wpt/dom/nodes/Node-parentNode.html [ Crash Pass ]
 crbug.com/591099 external/wpt/dom/nodes/Node-properties.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/dom/nodes/ParentNode-querySelector-All-xht.xht [ Crash Pass Timeout ]
 crbug.com/591099 external/wpt/dom/nodes/ParentNode-querySelector-All.html [ Crash Pass Timeout ]
-crbug.com/591099 external/wpt/dom/nodes/getElementsByClassName-30.htm [ Crash ]
+crbug.com/591099 external/wpt/dom/nodes/getElementsByClassName-30.htm [ Crash Pass ]
 crbug.com/591099 external/wpt/dom/ranges/Range-compareBoundaryPoints.html [ Timeout ]
 crbug.com/591099 external/wpt/dom/ranges/Range-comparePoint.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/dom/ranges/Range-insertNode.html [ Pass Timeout ]
@@ -5308,21 +5308,21 @@
 crbug.com/591099 external/wpt/dom/traversal/NodeIterator.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/dom/traversal/TreeWalker.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/domxpath/xml_xpath_runner.html [ Pass Timeout ]
-crbug.com/591099 external/wpt/editing/event.html [ Crash ]
-crbug.com/591099 external/wpt/editing/other/extra-text-nodes.html [ Crash ]
-crbug.com/591099 external/wpt/editing/other/restoration.html [ Crash ]
+crbug.com/591099 external/wpt/editing/event.html [ Crash Pass ]
+crbug.com/591099 external/wpt/editing/other/extra-text-nodes.html [ Crash Pass ]
+crbug.com/591099 external/wpt/editing/other/restoration.html [ Crash Pass ]
 crbug.com/591099 external/wpt/editing/run/backcolor.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/editing/run/bold.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/editing/run/fontname.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/editing/run/fontsize.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/editing/run/forecolor.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/editing/run/formatblock.html [ Crash Failure Timeout ]
-crbug.com/591099 external/wpt/editing/run/forwarddelete.html [ Crash ]
+crbug.com/591099 external/wpt/editing/run/forwarddelete.html [ Crash Timeout ]
 crbug.com/591099 external/wpt/editing/run/hilitecolor.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/editing/run/indent.html [ Crash Timeout ]
-crbug.com/591099 external/wpt/editing/run/inserthorizontalrule.html [ Crash ]
+crbug.com/591099 external/wpt/editing/run/inserthorizontalrule.html [ Crash Timeout ]
 crbug.com/591099 external/wpt/editing/run/inserthtml.html [ Crash Failure Timeout ]
-crbug.com/591099 external/wpt/editing/run/insertimage.html [ Crash ]
+crbug.com/591099 external/wpt/editing/run/insertimage.html [ Crash Timeout ]
 crbug.com/591099 external/wpt/editing/run/insertlinebreak.html [ Crash Failure Timeout ]
 crbug.com/591099 external/wpt/editing/run/insertorderedlist.html [ Crash Timeout ]
 crbug.com/591099 external/wpt/editing/run/insertparagraph.html [ Crash Failure Timeout ]
@@ -5332,9 +5332,9 @@
 crbug.com/591099 external/wpt/editing/run/justifyfull.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/editing/run/justifyleft.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/editing/run/justifyright.html [ Pass Timeout ]
-crbug.com/591099 external/wpt/editing/run/multitest.html [ Crash ]
+crbug.com/591099 external/wpt/editing/run/multitest.html [ Crash Timeout ]
 crbug.com/591099 external/wpt/editing/run/outdent.html [ Crash Timeout ]
-crbug.com/591099 external/wpt/editing/run/removeformat.html [ Crash ]
+crbug.com/591099 external/wpt/editing/run/removeformat.html [ Crash Timeout ]
 crbug.com/591099 external/wpt/editing/run/strikethrough.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/editing/run/subscript.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/editing/run/superscript.html [ Pass Timeout ]
@@ -5410,90 +5410,90 @@
 crbug.com/591099 external/wpt/encoding/legacy-mb-tchinese/big5/big5-encode-href-errors-misc.html [ Timeout ]
 crbug.com/591099 external/wpt/encoding/legacy-mb-tchinese/big5/big5-encode-href.html [ Timeout ]
 crbug.com/591099 external/wpt/encoding/textdecoder-fatal-single-byte.html [ Timeout ]
-crbug.com/591099 external/wpt/eventsource/eventsource-onmessage-realm.htm [ Crash ]
-crbug.com/591099 external/wpt/fetch/api/request/multi-globals/url-parsing.html [ Crash ]
-crbug.com/591099 external/wpt/fetch/api/response/multi-globals/url-parsing.html [ Crash ]
-crbug.com/591099 external/wpt/fetch/security/dangling-markup-mitigation.tentative.html [ Crash ]
-crbug.com/591099 external/wpt/fetch/security/embedded-credentials.tentative.sub.html [ Crash ]
-crbug.com/591099 external/wpt/fullscreen/api/element-request-fullscreen-and-remove-iframe-manual.html [ Crash ]
-crbug.com/591099 external/wpt/fullscreen/model/move-to-iframe-manual.html [ Crash ]
+crbug.com/591099 external/wpt/eventsource/eventsource-onmessage-realm.htm [ Crash Pass ]
+crbug.com/591099 external/wpt/fetch/api/request/multi-globals/url-parsing.html [ Crash Pass ]
+crbug.com/591099 external/wpt/fetch/api/response/multi-globals/url-parsing.html [ Crash Pass ]
+crbug.com/591099 external/wpt/fetch/security/dangling-markup-mitigation.tentative.html [ Crash Pass ]
+crbug.com/591099 external/wpt/fetch/security/embedded-credentials.tentative.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/fullscreen/api/element-request-fullscreen-and-remove-iframe-manual.html [ Crash Pass ]
+crbug.com/591099 external/wpt/fullscreen/model/move-to-iframe-manual.html [ Crash Pass ]
 crbug.com/591099 external/wpt/html-media-capture/capture_audio_cancel-manual.html [ Crash Failure ]
 crbug.com/591099 external/wpt/html-media-capture/capture_image_cancel-manual.html [ Crash Failure ]
 crbug.com/591099 external/wpt/html-media-capture/capture_video_cancel-manual.html [ Crash Failure ]
-crbug.com/591099 external/wpt/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-navigation-cross-origin.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/003.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/004.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/006.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/014.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/empty_fragment.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-query-fragment-components.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-form-submit.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin-fragment.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/browsing-the-web/unloading-documents/002.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/browsing-the-web/unloading-documents/003.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/browsing-the-web/unloading-documents/004.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/browsing-the-web/unloading-documents/005.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/history/joint-session-history/joint-session-history-only-fully-active.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/history/the-location-interface/location-prototype-setting-cross-origin-domain.sub.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/history/the-location-interface/location-prototype-setting-cross-origin.sub.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/history/the-location-interface/location-prototype-setting-goes-cross-origin-domain.sub.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/history/the-location-interface/location-prototype-setting-same-origin-domain.sub.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/origin/origin-of-data-document.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_setter.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_setter_null.tentative.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_setter_srcdoc.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/the-window-object/garbage-collection-and-browsing-contexts/discard_iframe_history_3.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/the-window-object/garbage-collection-and-browsing-contexts/discard_iframe_history_4.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/the-windowproxy-exotic-object/windowproxy-prototype-setting-cross-origin-domain.sub.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/the-windowproxy-exotic-object/windowproxy-prototype-setting-cross-origin.sub.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/the-windowproxy-exotic-object/windowproxy-prototype-setting-goes-cross-origin-domain.sub.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/the-windowproxy-exotic-object/windowproxy-prototype-setting-same-origin-domain.sub.html [ Crash ]
-crbug.com/591099 external/wpt/html/browsers/windows/noreferrer-window-name.html [ Crash ]
-crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.forms.html [ Crash ]
-crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.getElementsByName/document.getElementsByName-namespace.html [ Crash ]
-crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.getElementsByName/document.getElementsByName-newelements-xhtml.xhtml [ Crash ]
-crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.getElementsByName/document.getElementsByName-newelements.html [ Crash ]
-crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.getElementsByName/document.getElementsByName-param-xhtml.xhtml [ Crash ]
-crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.getElementsByName/document.getElementsByName-param.html [ Crash ]
-crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.images.html [ Crash ]
-crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/nameditem-01.html [ Crash ]
-crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/nameditem-02.html [ Crash ]
-crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/nameditem-06.html [ Crash ]
-crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/nameditem-07.html [ Crash ]
-crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/nameditem-08.html [ Crash ]
-crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/034.html [ Crash ]
-crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/035.html [ Crash ]
-crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/036.html [ Crash ]
-crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/044.html [ Crash ]
-crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/045.html [ Crash ]
-crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/046.html [ Crash ]
-crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_001.html [ Crash ]
-crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_002.html [ Crash ]
-crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_003.html [ Crash ]
-crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_004.html [ Crash ]
-crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_005.html [ Crash ]
-crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_006.html [ Crash ]
-crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_007.html [ Crash ]
-crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_008.html [ Crash ]
-crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_009.html [ Crash ]
-crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_010.html [ Crash ]
-crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/script_013.html [ Crash ]
+crbug.com/591099 external/wpt/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-navigation-cross-origin.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/003.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/004.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/006.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/014.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/empty_fragment.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-query-fragment-components.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-form-submit.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin-fragment.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/browsing-the-web/unloading-documents/002.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/browsing-the-web/unloading-documents/003.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/browsing-the-web/unloading-documents/004.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/browsing-the-web/unloading-documents/005.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/history/joint-session-history/joint-session-history-only-fully-active.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/history/the-location-interface/location-prototype-setting-cross-origin-domain.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/history/the-location-interface/location-prototype-setting-cross-origin.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/history/the-location-interface/location-prototype-setting-goes-cross-origin-domain.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/history/the-location-interface/location-prototype-setting-same-origin-domain.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/origin/origin-of-data-document.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_setter.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_setter_null.tentative.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_setter_srcdoc.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/the-window-object/garbage-collection-and-browsing-contexts/discard_iframe_history_3.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/the-window-object/garbage-collection-and-browsing-contexts/discard_iframe_history_4.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/the-windowproxy-exotic-object/windowproxy-prototype-setting-cross-origin-domain.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/the-windowproxy-exotic-object/windowproxy-prototype-setting-cross-origin.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/the-windowproxy-exotic-object/windowproxy-prototype-setting-goes-cross-origin-domain.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/the-windowproxy-exotic-object/windowproxy-prototype-setting-same-origin-domain.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/browsers/windows/noreferrer-window-name.html [ Crash Timeout ]
+crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.forms.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.getElementsByName/document.getElementsByName-namespace.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.getElementsByName/document.getElementsByName-newelements-xhtml.xhtml [ Crash Pass ]
+crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.getElementsByName/document.getElementsByName-newelements.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.getElementsByName/document.getElementsByName-param-xhtml.xhtml [ Crash Pass ]
+crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.getElementsByName/document.getElementsByName-param.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/document.images.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/nameditem-01.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/nameditem-02.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/nameditem-06.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/nameditem-07.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/nameditem-08.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/034.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/035.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/036.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/044.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/045.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/046.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_001.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_002.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_003.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_004.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_005.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_006.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_007.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_008.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_009.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/iframe_010.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/dom/dynamic-markup-insertion/document-write/script_013.html [ Crash Pass ]
 crbug.com/591099 external/wpt/html/dom/interfaces.html [ Timeout ]
-crbug.com/591099 external/wpt/html/editing/focus/focus-management/focus-event-targets-simple.html [ Crash ]
-crbug.com/591099 external/wpt/html/editing/focus/processing-model/focus-fixup-rule-one-no-dialogs.html [ Crash ]
-crbug.com/591099 external/wpt/html/editing/focus/sequential-focus-navigation-and-the-tabindex-attribute/focus-tabindex-default-value.html [ Crash ]
-crbug.com/591099 external/wpt/html/infrastructure/common-dom-interfaces/collections/htmlallcollection.html [ Crash ]
-crbug.com/591099 external/wpt/html/infrastructure/common-dom-interfaces/collections/htmlformcontrolscollection.html [ Crash ]
-crbug.com/591099 external/wpt/html/infrastructure/common-dom-interfaces/collections/htmloptionscollection.html [ Crash ]
-crbug.com/591099 external/wpt/html/infrastructure/common-dom-interfaces/collections/radionodelist.html [ Crash ]
-crbug.com/591099 external/wpt/html/infrastructure/terminology/plugins/text-plain.html [ Crash ]
-crbug.com/591099 external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/utf-16be.html [ Crash ]
-crbug.com/591099 external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/utf-16le.html [ Crash ]
-crbug.com/591099 external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/utf-8.html [ Crash ]
-crbug.com/591099 external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/windows-1251.html [ Crash ]
-crbug.com/591099 external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/windows-1252.html [ Crash ]
+crbug.com/591099 external/wpt/html/editing/focus/focus-management/focus-event-targets-simple.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/editing/focus/processing-model/focus-fixup-rule-one-no-dialogs.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/editing/focus/sequential-focus-navigation-and-the-tabindex-attribute/focus-tabindex-default-value.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/infrastructure/common-dom-interfaces/collections/htmlallcollection.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/infrastructure/common-dom-interfaces/collections/htmlformcontrolscollection.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/infrastructure/common-dom-interfaces/collections/htmloptionscollection.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/infrastructure/common-dom-interfaces/collections/radionodelist.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/infrastructure/terminology/plugins/text-plain.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/utf-16be.html [ Crash Timeout ]
+crbug.com/591099 external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/utf-16le.html [ Crash Timeout ]
+crbug.com/591099 external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/utf-8.html [ Crash Timeout ]
+crbug.com/591099 external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/windows-1251.html [ Crash Timeout ]
+crbug.com/591099 external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/windows-1252.html [ Crash Timeout ]
 crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/flow-content-0/dialog.html [ Failure ]
 crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/flow-content-0/div-align.html [ Failure ]
 crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/tables/table-cell-width-s.html [ Failure ]
@@ -5501,85 +5501,85 @@
 crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/the-fieldset-element-0/legend-block-formatting-context.html [ Crash Failure ]
 crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/the-hr-element-0/align.html [ Failure ]
 crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/the-hr-element-0/setting-overflow-visible.html [ Failure ]
-crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/the-page/iframe-body-margin-attributes.html [ Crash ]
-crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/the-page/iframe-marginwidth-marginheight.html [ Crash ]
+crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/the-page/iframe-body-margin-attributes.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/the-page/iframe-marginwidth-marginheight.html [ Crash Pass ]
 crbug.com/591099 external/wpt/html/rendering/replaced-elements/svg-embedded-sizing/svg-in-img-auto.html [ Failure ]
 crbug.com/591099 external/wpt/html/rendering/replaced-elements/svg-embedded-sizing/svg-in-img-percentage.html [ Failure ]
 crbug.com/591099 external/wpt/html/rendering/replaced-elements/svg-inline-sizing/svg-inline.html [ Failure Timeout ]
-crbug.com/591099 external/wpt/html/semantics/disabled-elements/disabledElement.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/document-metadata/the-base-element/base_about_blank.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/document-metadata/the-base-element/base_srcdoc.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-remove-from-document-networkState.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/networkState_initial.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/preload_reflects_none_autoplay.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/readyState_initial.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/src_reflects_attribute_not_source_elements.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/the-area-element/area-coords.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/the-area-element/area-download-click.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/the-area-element/area-processing.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/the-area-element/area-shape.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/the-embed-element/embed-document.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/the-embed-element/embed-ignored-in-media-element.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/the-embed-element/embed-in-object-fallback.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/change_parentage.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/content_document_changes_only_after_load_matures.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe-load-event.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe-synchronously-discard.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-2.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_ancestor-1.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_ancestor-2.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_descendants.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_itself.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/same_origin_parentage.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/the-img-element/current-pixel-density/error.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/the-img-element/delay-load-event.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/the-img-element/img.complete.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/the-img-element/nonexistent-image.html [ Crash ]
+crbug.com/591099 external/wpt/html/semantics/disabled-elements/disabledElement.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/document-metadata/the-base-element/base_about_blank.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/document-metadata/the-base-element/base_srcdoc.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-invoke-remove-from-document-networkState.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/networkState_initial.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/preload_reflects_none_autoplay.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/readyState_initial.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/media-elements/src_reflects_attribute_not_source_elements.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/the-area-element/area-coords.html [ Crash Failure ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/the-area-element/area-download-click.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/the-area-element/area-processing.html [ Crash Failure ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/the-area-element/area-shape.html [ Crash Failure ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/the-embed-element/embed-document.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/the-embed-element/embed-ignored-in-media-element.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/the-embed-element/embed-in-object-fallback.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/change_parentage.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/content_document_changes_only_after_load_matures.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe-load-event.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe-synchronously-discard.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-2.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_ancestor-1.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_ancestor-2.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_descendants.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_itself.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/same_origin_parentage.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/the-img-element/current-pixel-density/error.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/the-img-element/delay-load-event.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/the-img-element/img.complete.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/the-img-element/nonexistent-image.html [ Crash Pass ]
 crbug.com/591099 external/wpt/html/semantics/embedded-content/the-img-element/srcset/parse-a-srcset-attribute.html [ Crash Pass ]
 crbug.com/591099 external/wpt/html/semantics/embedded-content/the-img-element/srcset/select-an-image-source.html [ Crash Pass ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/the-img-element/update-the-source-set.html [ Crash ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/the-img-element/update-the-source-set.html [ Crash Pass ]
 crbug.com/591099 external/wpt/html/semantics/embedded-content/the-img-element/usemap-casing.html [ Failure ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/the-object-element/object-attributes.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/the-object-element/object-ignored-in-media-element.html [ Crash ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/the-object-element/object-attributes.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/the-object-element/object-ignored-in-media-element.html [ Crash Pass ]
 crbug.com/591099 external/wpt/html/semantics/embedded-content/the-object-element/usemap-casing.html [ Failure ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/the-video-element/video-tabindex.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/attributes-common-to-form-controls/dirname-ltr.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/constraints/form-validation-willValidate.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/form-control-infrastructure/form.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/form-control-infrastructure/form_attribute.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/form-submission-0/form-data-set-usv.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/form-submission-0/getactionurl.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/form-submission-0/submit-entity-body.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/resetting-a-form/reset-form-event-realm.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/textfieldselection/selection-after-content-change.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/textfieldselection/selection-start-end.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/textfieldselection/textfieldselection-setSelectionRange.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/the-button-element/button-activate.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/the-button-element/button-menu-historical.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/the-fieldset-element/disabled-001.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-action-submission-with-base-url.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-action-submission.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-autocomplete.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-elements-filter.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-elements-matches.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-elements-nameditem-01.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-elements-sameobject.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-indexed-element.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-nameditem.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/button.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/checkbox-click-events.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/email.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/input-type-button.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/radio-input-cancel.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/reset.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/telephone.html [ Crash ]
+crbug.com/591099 external/wpt/html/semantics/embedded-content/the-video-element/video-tabindex.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/attributes-common-to-form-controls/dirname-ltr.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/constraints/form-validation-willValidate.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/form-control-infrastructure/form.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/form-control-infrastructure/form_attribute.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/form-submission-0/form-data-set-usv.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/form-submission-0/getactionurl.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/form-submission-0/submit-entity-body.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/resetting-a-form/reset-form-event-realm.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/textfieldselection/selection-after-content-change.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/textfieldselection/selection-start-end.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/textfieldselection/textfieldselection-setSelectionRange.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/the-button-element/button-activate.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/the-button-element/button-menu-historical.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/the-fieldset-element/disabled-001.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-action-submission-with-base-url.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-action-submission.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-autocomplete.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-elements-filter.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-elements-matches.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-elements-nameditem-01.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-elements-sameobject.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-indexed-element.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/the-form-element/form-nameditem.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/button.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/checkbox-click-events.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/email.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/input-type-button.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/radio-input-cancel.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/reset.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/telephone.html [ Crash Pass ]
 crbug.com/591099 external/wpt/html/semantics/forms/the-input-element/type-change-state.html [ Pass Timeout ]
-crbug.com/591099 external/wpt/html/semantics/forms/the-label-element/proxy-click-to-associated-element.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/the-option-element/option-form.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/the-option-element/option-index.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/the-select-element/select-multiple.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/the-select-element/selected-index.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/forms/the-textarea-element/textarea-type.html [ Crash ]
+crbug.com/591099 external/wpt/html/semantics/forms/the-label-element/proxy-click-to-associated-element.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/the-option-element/option-form.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/the-option-element/option-index.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/the-select-element/select-multiple.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/the-select-element/selected-index.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/forms/the-textarea-element/textarea-type.html [ Crash Pass ]
 crbug.com/591099 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-002.html [ Failure ]
 crbug.com/591099 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-menu.html [ Crash Failure ]
 crbug.com/591099 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-mixed.html [ Crash Failure Pass ]
@@ -5588,857 +5588,865 @@
 crbug.com/591099 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-parent.html [ Crash Failure Pass ]
 crbug.com/591099 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-skip-no-boxes.html [ Crash Failure ]
 crbug.com/591099 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ul.html [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li.html [ Crash ]
+crbug.com/591099 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li.html [ Crash Pass ]
 crbug.com/591099 external/wpt/html/semantics/grouping-content/the-ol-element/grouping-ol-rev-reftest-001.html [ Failure ]
 crbug.com/591099 external/wpt/html/semantics/grouping-content/the-ol-element/grouping-ol-start-reftest-001.html [ Failure ]
 crbug.com/591099 external/wpt/html/semantics/grouping-content/the-ol-element/grouping-ol-start-reftest-002.html [ Failure ]
 crbug.com/591099 external/wpt/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-001.html [ Failure ]
 crbug.com/591099 external/wpt/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-002.html [ Failure ]
 crbug.com/591099 external/wpt/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-003.html [ Failure ]
-crbug.com/591099 external/wpt/html/semantics/grouping-content/the-ol-element/grouping-ol.html [ Crash ]
+crbug.com/591099 external/wpt/html/semantics/grouping-content/the-ol-element/grouping-ol.html [ Crash Pass ]
 crbug.com/591099 external/wpt/html/semantics/interactive-elements/the-dialog-element/centering.html [ Failure ]
-crbug.com/591099 external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-showModal.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/scripting-1/the-script-element/script-noembed-noframes-iframe.xhtml [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/scripting-1/the-script-element/script-not-executed-after-shutdown.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-1.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-2.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/scripting-1/the-script-element/script-onload-insertion-point.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/additions-to-parsing-xhtml-documents/node-document.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/additions-to-parsing-xhtml-documents/template-child-nodes.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/additions-to-the-steps-to-clone-a-node/templates-copy-document-owner.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/definitions/template-contents-owner-document-type.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/definitions/template-contents-owner-test-002.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/definitions/template-contents.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/innerhtml-on-templates/innerhtml.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/template-element/content-attribute.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/template-element/node-document-changes.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/template-element/template-content-node-document.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/template-element/template-descendant-body.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/template-element/template-descendant-frameset.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/template-element/template-descendant-head.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/checked.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/default.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/disabled.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/enabled.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/focus-autofocus.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/focus.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/indeterminate-radio.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/readwrite-readonly.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/valid-invalid.html [ Crash ]
-crbug.com/591099 external/wpt/html/semantics/text-level-semantics/the-a-element/a-download-click-404.html [ Crash ]
+crbug.com/591099 external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-showModal.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/scripting-1/the-script-element/script-noembed-noframes-iframe.xhtml [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/scripting-1/the-script-element/script-not-executed-after-shutdown.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-1.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-2.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/scripting-1/the-script-element/script-onload-insertion-point.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/additions-to-parsing-xhtml-documents/node-document.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/additions-to-parsing-xhtml-documents/template-child-nodes.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/additions-to-the-steps-to-clone-a-node/templates-copy-document-owner.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/definitions/template-contents-owner-document-type.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/definitions/template-contents-owner-test-002.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/definitions/template-contents.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/innerhtml-on-templates/innerhtml.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/template-element/content-attribute.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/template-element/node-document-changes.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/template-element/template-content-node-document.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/template-element/template-descendant-body.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/template-element/template-descendant-frameset.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/scripting-1/the-template-element/template-element/template-descendant-head.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/checked.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/default.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/disabled.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/enabled.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/focus-autofocus.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/focus.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/indeterminate-radio.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/readwrite-readonly.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/selectors/pseudo-classes/valid-invalid.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/semantics/text-level-semantics/the-a-element/a-download-click-404.html [ Crash Pass ]
 crbug.com/591099 external/wpt/html/semantics/text-level-semantics/the-br-element/br-bidi-in-inline-ancestors.html [ Failure ]
 crbug.com/591099 external/wpt/html/semantics/text-level-semantics/the-wbr-element/wbr-element.html [ Failure ]
-crbug.com/591099 external/wpt/html/syntax/parsing/Document.getElementsByTagName-foreign-01.html [ Crash ]
-crbug.com/591099 external/wpt/html/syntax/parsing/Document.getElementsByTagName-foreign-02.html [ Crash ]
-crbug.com/591099 external/wpt/html/syntax/parsing/Element.getElementsByTagName-foreign-01.html [ Crash ]
-crbug.com/591099 external/wpt/html/syntax/parsing/Element.getElementsByTagName-foreign-02.html [ Crash ]
-crbug.com/591099 external/wpt/html/syntax/parsing/math-parse03.html [ Crash ]
+crbug.com/591099 external/wpt/html/syntax/parsing/Document.getElementsByTagName-foreign-01.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/syntax/parsing/Document.getElementsByTagName-foreign-02.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/syntax/parsing/Element.getElementsByTagName-foreign-01.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/syntax/parsing/Element.getElementsByTagName-foreign-02.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/syntax/parsing/math-parse03.html [ Crash Pass ]
 crbug.com/591099 external/wpt/html/syntax/parsing/named-character-references.html [ Pass Timeout ]
-crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-body-insertion-mode/generating-of-implied-end-tags.html [ Crash ]
-crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-body-insertion-mode/ignore-body-token.html [ Crash ]
-crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-body-insertion-mode/ignore-frameset-token.html [ Crash ]
-crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-body-insertion-mode/ignore-head-token.html [ Crash ]
-crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-body-insertion-mode/ignore-html-token.html [ Crash ]
-crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-body-insertion-mode/start-tag-html.html [ Crash ]
-crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-body-insertion-mode/template-end-tag-without-start-one.html [ Crash ]
-crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-frameset-insertion-mode/end-tag-frameset.html [ Crash ]
-crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-head-insertion-mode/generating-of-implied-end-tags.html [ Crash ]
-crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-head-insertion-mode/template-end-tag-without-start-one.html [ Crash ]
-crbug.com/591099 external/wpt/html/syntax/parsing/template/appending-to-a-template/template-child-nodes.html [ Crash ]
-crbug.com/591099 external/wpt/html/syntax/parsing/template/creating-an-element-for-the-token/template-owner-document.html [ Crash ]
-crbug.com/591099 external/wpt/html/syntax/serializing-html-fragments/initial-linefeed-pre.html [ Crash ]
-crbug.com/591099 external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-10.htm [ Crash ]
-crbug.com/591099 external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-8.htm [ Crash ]
-crbug.com/591099 external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/origin-check-in-document-open-same-origin-domain.sub.html [ Crash ]
-crbug.com/591099 external/wpt/html/webappapis/scripting/events/onerroreventhandler.html [ Crash ]
-crbug.com/591099 external/wpt/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-1.html [ Crash ]
-crbug.com/591099 external/wpt/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-2.html [ Crash ]
-crbug.com/591099 external/wpt/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-3.html [ Crash ]
-crbug.com/591099 external/wpt/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-4.html [ Crash ]
+crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-body-insertion-mode/generating-of-implied-end-tags.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-body-insertion-mode/ignore-body-token.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-body-insertion-mode/ignore-frameset-token.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-body-insertion-mode/ignore-head-token.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-body-insertion-mode/ignore-html-token.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-body-insertion-mode/start-tag-html.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-body-insertion-mode/template-end-tag-without-start-one.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-frameset-insertion-mode/end-tag-frameset.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-head-insertion-mode/generating-of-implied-end-tags.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/syntax/parsing/template/additions-to-the-in-head-insertion-mode/template-end-tag-without-start-one.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/syntax/parsing/template/appending-to-a-template/template-child-nodes.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/syntax/parsing/template/creating-an-element-for-the-token/template-owner-document.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/syntax/serializing-html-fragments/initial-linefeed-pre.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-1.htm [ Timeout ]
+crbug.com/591099 external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-10.htm [ Crash Timeout ]
+crbug.com/591099 external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-2.htm [ Timeout ]
+crbug.com/591099 external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-3.htm [ Timeout ]
+crbug.com/591099 external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-4.htm [ Timeout ]
+crbug.com/591099 external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-5.htm [ Timeout ]
+crbug.com/591099 external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-6.htm [ Timeout ]
+crbug.com/591099 external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-7.htm [ Timeout ]
+crbug.com/591099 external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-8.htm [ Crash Timeout ]
+crbug.com/591099 external/wpt/html/the-xhtml-syntax/parsing-xhtml-documents/xhtml-mathml-dtd-entity-9.htm [ Timeout ]
+crbug.com/591099 external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/origin-check-in-document-open-same-origin-domain.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/webappapis/scripting/events/onerroreventhandler.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-1.html [ Crash Pass ]
+crbug.com/591099 external/wpt/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-2.html [ Crash Pass ]
+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/innerText/getter.html [ Crash ]
-crbug.com/591099 external/wpt/input-events/input-events-typing-data-manual.html [ Crash ]
-crbug.com/591099 external/wpt/intersection-observer/client-rect.html [ Crash ]
-crbug.com/591099 external/wpt/intersection-observer/cross-origin-iframe.html [ Crash ]
+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 ]
+crbug.com/591099 external/wpt/intersection-observer/cross-origin-iframe.html [ Crash Pass ]
 crbug.com/591099 external/wpt/intersection-observer/edge-inclusive-intersection.html [ Failure ]
-crbug.com/591099 external/wpt/intersection-observer/iframe-no-root.html [ Crash ]
+crbug.com/591099 external/wpt/intersection-observer/iframe-no-root.html [ Crash Pass ]
 crbug.com/591099 external/wpt/intersection-observer/remove-element.html [ Failure ]
-crbug.com/591099 external/wpt/intersection-observer/root-margin.html [ Crash ]
-crbug.com/591099 external/wpt/intersection-observer/same-document-root.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-activesourcebuffers.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-addsourcebuffer-mode.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-addsourcebuffer.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-append-buffer.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-appendwindow.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-buffered.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-closed.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-a-bitrate.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-av-audio-bitrate.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-av-framesize.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-av-video-bitrate.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-v-bitrate.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-v-framerate.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-v-framesize.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-config-change-webm-a-bitrate.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-config-change-webm-av-audio-bitrate.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-config-change-webm-av-framesize.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-config-change-webm-av-video-bitrate.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-config-change-webm-v-bitrate.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-config-change-webm-v-framerate.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-config-change-webm-v-framesize.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-detach.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-duration-boundaryconditions.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-duration.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-endofstream-invaliderror.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-endofstream.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-errors.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-getvideoplaybackquality.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-liveseekable.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-multiple-attach.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-play-then-seek-back.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-play.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-preload.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-redundant-seek.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-remove.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-removesourcebuffer.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-seek-beyond-duration.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-seek-during-pending-seek.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-seekable.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-sequencemode-append-buffer.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-sourcebuffer-mode.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-sourcebuffer-trackdefaults.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-sourcebufferlist.html [ Crash ]
-crbug.com/591099 external/wpt/media-source/mediasource-timestamp-offset.html [ Crash ]
-crbug.com/591099 external/wpt/mediacapture-fromelement/idlharness.html [ Crash ]
-crbug.com/591099 external/wpt/mediacapture-streams/MediaStream-MediaElement-srcObject.https.html [ Crash ]
-crbug.com/591099 external/wpt/mediacapture-streams/MediaStreamTrack-MediaElement-disabled-video-is-black.https.html [ Crash ]
-crbug.com/591099 external/wpt/mixed-content/imageset.https.sub.html [ Crash ]
-crbug.com/591099 external/wpt/navigation-timing/nav2_test_frame_removed.html [ Crash ]
-crbug.com/591099 external/wpt/navigation-timing/test_performance_attributes_exist_in_object.html [ Crash ]
-crbug.com/591099 external/wpt/page-visibility/test_child_document.html [ Crash ]
-crbug.com/591099 external/wpt/payment-request/allowpaymentrequest/active-document-cross-origin.https.sub.html [ Crash ]
-crbug.com/591099 external/wpt/payment-request/allowpaymentrequest/active-document-same-origin.https.html [ Crash ]
-crbug.com/591099 external/wpt/payment-request/allowpaymentrequest/basic.https.html [ Crash ]
-crbug.com/591099 external/wpt/payment-request/payment-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html [ Crash ]
-crbug.com/591099 external/wpt/payment-request/payment-allowed-by-feature-policy-attribute.https.sub.html [ Crash ]
-crbug.com/591099 external/wpt/payment-request/payment-allowed-by-feature-policy.https.sub.html [ Crash ]
-crbug.com/591099 external/wpt/payment-request/payment-default-feature-policy.https.sub.html [ Crash ]
-crbug.com/591099 external/wpt/payment-request/payment-disabled-by-feature-policy.https.sub.html [ Crash ]
-crbug.com/591099 external/wpt/payment-request/payment-request-id.https.html [ Crash ]
-crbug.com/591099 external/wpt/payment-request/payment-request-in-iframe.html [ Crash ]
+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-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 ]
+crbug.com/591099 external/wpt/media-source/mediasource-appendwindow.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-buffered.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-closed.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-a-bitrate.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-av-audio-bitrate.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-av-framesize.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-av-video-bitrate.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-v-bitrate.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-v-framerate.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-v-framesize.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-config-change-webm-a-bitrate.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-config-change-webm-av-audio-bitrate.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-config-change-webm-av-framesize.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-config-change-webm-av-video-bitrate.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-config-change-webm-v-bitrate.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-config-change-webm-v-framerate.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-config-change-webm-v-framesize.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-detach.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-duration-boundaryconditions.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-duration.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-endofstream-invaliderror.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-endofstream.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-errors.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-getvideoplaybackquality.html [ Crash Timeout ]
+crbug.com/591099 external/wpt/media-source/mediasource-liveseekable.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-multiple-attach.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-play-then-seek-back.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-play.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-preload.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-redundant-seek.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-remove.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-removesourcebuffer.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-seek-beyond-duration.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-seek-during-pending-seek.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-seekable.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-sequencemode-append-buffer.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-sourcebuffer-mode.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-sourcebuffer-trackdefaults.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-sourcebufferlist.html [ Crash Pass ]
+crbug.com/591099 external/wpt/media-source/mediasource-timestamp-offset.html [ Crash Pass ]
+crbug.com/591099 external/wpt/mediacapture-fromelement/idlharness.html [ Crash Pass ]
+crbug.com/591099 external/wpt/mediacapture-streams/MediaStream-MediaElement-srcObject.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/mediacapture-streams/MediaStreamTrack-MediaElement-disabled-video-is-black.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/mixed-content/imageset.https.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/navigation-timing/nav2_test_frame_removed.html [ Crash Pass ]
+crbug.com/591099 external/wpt/navigation-timing/test_performance_attributes_exist_in_object.html [ Crash Pass ]
+crbug.com/591099 external/wpt/page-visibility/test_child_document.html [ Crash Pass ]
+crbug.com/591099 external/wpt/payment-request/allowpaymentrequest/active-document-cross-origin.https.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/payment-request/allowpaymentrequest/active-document-same-origin.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/payment-request/allowpaymentrequest/basic.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/payment-request/payment-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/payment-request/payment-allowed-by-feature-policy-attribute.https.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/payment-request/payment-allowed-by-feature-policy.https.sub.html [ Crash Failure ]
+crbug.com/591099 external/wpt/payment-request/payment-default-feature-policy.https.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/payment-request/payment-disabled-by-feature-policy.https.sub.html [ Crash Failure ]
+crbug.com/591099 external/wpt/payment-request/payment-request-id.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/payment-request/payment-request-in-iframe.html [ Crash Pass ]
 crbug.com/591099 external/wpt/pointerevents/pointerevent_attributes_hoverable_pointers-manual.html [ Crash Pass Timeout ]
 crbug.com/591099 external/wpt/pointerevents/pointerevent_attributes_nohover_pointers-manual.html [ Crash Pass Timeout ]
-crbug.com/591099 external/wpt/pointerevents/pointerevent_capture_mouse-manual.html [ Crash Timeout ]
-crbug.com/591099 external/wpt/pointerevents/pointerevent_capture_suppressing_mouse-manual.html [ Crash Timeout ]
+crbug.com/591099 external/wpt/pointerevents/pointerevent_capture_mouse-manual.html [ Crash Pass Timeout ]
+crbug.com/591099 external/wpt/pointerevents/pointerevent_capture_suppressing_mouse-manual.html [ Crash Pass Timeout ]
 crbug.com/591099 external/wpt/pointerevents/pointerevent_click_during_capture-manual.html [ Crash Timeout ]
 crbug.com/591099 external/wpt/pointerevents/pointerevent_disabled_form_control-manual.html [ Timeout ]
 crbug.com/591099 external/wpt/pointerevents/pointerevent_lostpointercapture_for_disconnected_node-manual.html [ Crash Timeout ]
-crbug.com/591099 external/wpt/pointerevents/pointerevent_lostpointercapture_is_first-manual.html [ Crash Timeout ]
+crbug.com/591099 external/wpt/pointerevents/pointerevent_lostpointercapture_is_first-manual.html [ Crash Pass Timeout ]
 crbug.com/591099 external/wpt/pointerevents/pointerevent_pointerleave_pen-manual.html [ Failure Timeout ]
-crbug.com/591099 external/wpt/pointerevents/pointerevent_releasepointercapture_onpointerup_mouse-manual.html [ Crash ]
-crbug.com/591099 external/wpt/pointerevents/pointerevent_setpointercapture_relatedtarget-manual.html [ Crash Timeout ]
-crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-button-test_touch-manual.html [ Crash Timeout ]
-crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-inherit_child-auto-child-none_touch-manual.html [ Crash Timeout ]
-crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-inherit_child-none_touch-manual.html [ Crash Timeout ]
-crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-inherit_child-pan-x-child-pan-x_touch-manual.html [ Crash Timeout ]
-crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-inherit_child-pan-x-child-pan-y_touch-manual.html [ Crash Timeout ]
-crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-inherit_parent-none_touch-manual.html [ Crash Timeout ]
-crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-none-css_touch-manual.html [ Crash Timeout ]
-crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-pan-down-css_touch-manual.html [ Crash Timeout ]
-crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-pan-left-css_touch-manual.html [ Crash Timeout ]
-crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-pan-right-css_touch-manual.html [ Crash Timeout ]
-crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-pan-up-css_touch-manual.html [ Crash Timeout ]
-crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-pan-x-css_touch-manual.html [ Crash Timeout ]
-crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-pan-x-pan-y-pan-y_touch-manual.html [ Crash Timeout ]
-crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-pan-y-css_touch-manual.html [ Crash Timeout ]
+crbug.com/591099 external/wpt/pointerevents/pointerevent_releasepointercapture_onpointerup_mouse-manual.html [ Crash Pass ]
+crbug.com/591099 external/wpt/pointerevents/pointerevent_setpointercapture_relatedtarget-manual.html [ Crash Pass Timeout ]
+crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-button-test_touch-manual.html [ Crash Failure Timeout ]
+crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-inherit_child-auto-child-none_touch-manual.html [ Crash Pass Timeout ]
+crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-inherit_child-none_touch-manual.html [ Crash Pass Timeout ]
+crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-inherit_child-pan-x-child-pan-x_touch-manual.html [ Crash Pass Timeout ]
+crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-inherit_child-pan-x-child-pan-y_touch-manual.html [ Crash Pass Timeout ]
+crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-inherit_parent-none_touch-manual.html [ Crash Pass Timeout ]
+crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-none-css_touch-manual.html [ Crash Pass Timeout ]
+crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-pan-down-css_touch-manual.html [ Crash Pass Timeout ]
+crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-pan-left-css_touch-manual.html [ Crash Pass Timeout ]
+crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-pan-right-css_touch-manual.html [ Crash Pass Timeout ]
+crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-pan-up-css_touch-manual.html [ Crash Pass Timeout ]
+crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-pan-x-css_touch-manual.html [ Crash Pass Timeout ]
+crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-pan-x-pan-y-pan-y_touch-manual.html [ Crash Pass Timeout ]
+crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-pan-y-css_touch-manual.html [ Crash Pass Timeout ]
 crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-span-test_touch-manual.html [ Crash Timeout ]
-crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-svg-test_touch-manual.html [ Crash Timeout ]
-crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-table-test_touch-manual.html [ Crash Timeout ]
+crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-svg-test_touch-manual.html [ Crash Failure Timeout ]
+crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-table-test_touch-manual.html [ Crash Pass Timeout ]
 crbug.com/591099 external/wpt/quirks-mode/blocks-ignore-line-height.html [ Failure ]
-crbug.com/591099 external/wpt/quirks-mode/classname-query-after-sibling-adoption.html [ Crash ]
+crbug.com/591099 external/wpt/quirks-mode/classname-query-after-sibling-adoption.html [ Crash Pass ]
 crbug.com/591099 external/wpt/quirks-mode/hashless-hex-color.html [ Pass Timeout ]
-crbug.com/591099 external/wpt/quirks-mode/line-height-calculation.html [ Crash ]
-crbug.com/591099 external/wpt/quirks-mode/table-cell-width-calculation.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/css-integration/external-import-stylesheet.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/css-integration/external-stylesheet.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/css-integration/internal-import-stylesheet.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/css-integration/internal-stylesheet.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/css-integration/processing-instruction.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/generic/sandboxed-iframe-with-opaque-origin.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/generic/subresource-test/area-navigate.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/generic/subresource-test/iframe-messaging.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/generic/subresource-test/image-decoding.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/generic/subresource-test/link-navigate.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/generic/unsupported-csp-referrer-directive.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-origin.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/iframe-tag/cross-origin.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-downgrade.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-downgrade.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-downgrade.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-upgrade.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-upgrade.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-upgrade.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-downgrade.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-downgrade.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-downgrade.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-upgrade.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-upgrade.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-upgrade.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/iframe-tag/cross-origin.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/iframe-tag/cross-origin.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/iframe-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/iframe-tag/same-origin-insecure.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-downgrade.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-downgrade.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-downgrade.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-upgrade.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-upgrade.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-upgrade.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-downgrade.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-downgrade.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-downgrade.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-upgrade.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-upgrade.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-upgrade.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-origin.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-https/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-https/iframe-tag/cross-origin.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-https/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-downgrade.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-downgrade.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-downgrade.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-upgrade.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-upgrade.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-upgrade.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-downgrade.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-downgrade.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-downgrade.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-upgrade.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-upgrade.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-upgrade.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-origin.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/iframe-tag/cross-origin.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-http/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-http/iframe-tag/cross-origin.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-http/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-https/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-https/iframe-tag/cross-origin.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-https/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-http/iframe-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-http/iframe-tag/same-origin-insecure.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-http/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-origin.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/iframe-tag/cross-origin.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-insecure.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-insecure.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-insecure.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-insecure.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/iframe-tag/same-insecure.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/iframe-tag/same-insecure.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/iframe-tag/same-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/iframe-tag/cross-insecure.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/iframe-tag/cross-insecure.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/iframe-tag/cross-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-insecure.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-insecure.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/iframe-tag/same-insecure.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/iframe-tag/same-insecure.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/iframe-tag/same-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-insecure.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-insecure.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-insecure.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-insecure.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/iframe-tag/same-insecure.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/iframe-tag/same-insecure.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/iframe-tag/same-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash ]
-crbug.com/591099 external/wpt/remote-playback/idlharness.html [ Crash ]
+crbug.com/591099 external/wpt/quirks-mode/line-height-calculation.html [ Crash Failure ]
+crbug.com/591099 external/wpt/quirks-mode/table-cell-width-calculation.html [ Crash Failure ]
+crbug.com/591099 external/wpt/referrer-policy/css-integration/external-import-stylesheet.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/css-integration/external-stylesheet.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/css-integration/internal-import-stylesheet.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/css-integration/internal-stylesheet.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/css-integration/processing-instruction.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/generic/sandboxed-iframe-with-opaque-origin.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/generic/subresource-test/area-navigate.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/generic/subresource-test/iframe-messaging.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/generic/subresource-test/image-decoding.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/generic/subresource-test/link-navigate.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/generic/unsupported-csp-referrer-directive.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-origin.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/iframe-tag/cross-origin.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-downgrade.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-downgrade.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-downgrade.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-upgrade.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-upgrade.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-upgrade.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-downgrade.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-downgrade.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-downgrade.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-upgrade.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-upgrade.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-upgrade.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/iframe-tag/cross-origin.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/iframe-tag/cross-origin.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/iframe-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/iframe-tag/same-origin-insecure.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-downgrade.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-downgrade.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-downgrade.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-upgrade.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-upgrade.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-upgrade.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-downgrade.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-downgrade.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-downgrade.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-upgrade.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-upgrade.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-upgrade.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-origin.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-https/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-https/iframe-tag/cross-origin.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-https/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-downgrade.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-downgrade.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-downgrade.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-upgrade.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-upgrade.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-upgrade.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-downgrade.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-downgrade.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-downgrade.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-upgrade.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-upgrade.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-upgrade.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/http-rp/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/origin/meta-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-origin.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/iframe-tag/cross-origin.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-https/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-http/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-http/iframe-tag/cross-origin.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-http/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-https/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-https/iframe-tag/cross-origin.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-https/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-http/iframe-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-http/iframe-tag/same-origin-insecure.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-http/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-https/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/http-rp/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-origin.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/iframe-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/iframe-tag/cross-origin.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/iframe-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-http/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-https/iframe-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/same-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-insecure.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-insecure.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/iframe-tag/cross-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-insecure.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-insecure.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/iframe-tag/same-insecure.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/iframe-tag/same-insecure.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/iframe-tag/same-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/iframe-tag/cross-insecure.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/iframe-tag/cross-insecure.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/iframe-tag/cross-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-insecure.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-insecure.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/iframe-tag/same-insecure.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/iframe-tag/same-insecure.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/iframe-tag/same-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-insecure.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-insecure.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/iframe-tag/cross-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-insecure.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-insecure.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/iframe-tag/same-insecure.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/iframe-tag/same-insecure.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/iframe-tag/same-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/attr-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/http-rp/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-http/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-http/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-http/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-https/iframe-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-https/iframe-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-https/iframe-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unsafe-url/meta-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/http-rp/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-http/iframe-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-https/iframe-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/referrer-policy/unset-referrer-policy/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html [ Crash Pass ]
+crbug.com/591099 external/wpt/remote-playback/idlharness.html [ Crash Pass ]
 crbug.com/591099 external/wpt/scroll-anchoring/anchoring-with-bounds-clamping.html [ Failure ]
 crbug.com/591099 external/wpt/scroll-anchoring/clipped-scrollers-skipped.html [ Failure ]
 crbug.com/591099 external/wpt/scroll-anchoring/descend-into-container-with-float.html [ Failure ]
-crbug.com/591099 external/wpt/scroll-anchoring/inline-block.html [ Crash ]
+crbug.com/591099 external/wpt/scroll-anchoring/inline-block.html [ Crash Pass ]
 crbug.com/591099 external/wpt/scroll-anchoring/opt-out.html [ Failure ]
 crbug.com/591099 external/wpt/scroll-anchoring/position-change-heuristic.html [ Failure ]
-crbug.com/591099 external/wpt/scroll-anchoring/start-edge-in-block-layout-direction.html [ Crash ]
+crbug.com/591099 external/wpt/scroll-anchoring/start-edge-in-block-layout-direction.html [ Crash Failure ]
 crbug.com/591099 external/wpt/selection/addRange-00.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/selection/addRange-04.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/selection/addRange-12.html [ Pass Timeout ]
@@ -6452,101 +6460,101 @@
 crbug.com/591099 external/wpt/selection/collapse-15.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/selection/collapse-30.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/selection/collapse-45.html [ Pass Timeout ]
-crbug.com/591099 external/wpt/selection/deleteFromDocument.html [ Crash ]
+crbug.com/591099 external/wpt/selection/deleteFromDocument.html [ Crash Pass ]
 crbug.com/591099 external/wpt/selection/extend-00.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/selection/extend-20.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/selection/selectAllChildren.html [ Pass Timeout ]
-crbug.com/591099 external/wpt/selectors/attribute-selectors/attribute-case/semantics.html [ Crash ]
-crbug.com/591099 external/wpt/server-timing/test_server_timing.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/extendable-message-event.https.html [ Crash Timeout ]
+crbug.com/591099 external/wpt/selectors/attribute-selectors/attribute-case/semantics.html [ Crash Pass ]
+crbug.com/591099 external/wpt/server-timing/test_server_timing.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/extendable-message-event.https.html [ Crash Pass Timeout ]
 crbug.com/591099 external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/registration-attribute.https.html [ Failure Pass ]
-crbug.com/591099 external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/unregister.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/update.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/activation.https.html [ Crash ]
+crbug.com/591099 external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/unregister.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/update.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/activation.https.html [ Crash Pass ]
 crbug.com/591099 external/wpt/service-workers/service-worker/claim-fetch.https.html [ Crash Pass ]
-crbug.com/591099 external/wpt/service-workers/service-worker/claim-not-using-registration.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/client-id.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/clients-get-cross-origin.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/clients-get.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/clients-matchall-exact-controller.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/clients-matchall-include-uncontrolled.https.html [ Crash Timeout ]
-crbug.com/591099 external/wpt/service-workers/service-worker/clients-matchall-order.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/clients-matchall.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/extendable-event-async-waituntil.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/fetch-canvas-tainting-cache.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/fetch-canvas-tainting.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/fetch-cors-xhr.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/fetch-event.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/fetch-frame-resource.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/fetch-mixed-content-to-inscope.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/fetch-mixed-content-to-outscope.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/fetch-request-css-images.https.html [ Crash ]
+crbug.com/591099 external/wpt/service-workers/service-worker/claim-not-using-registration.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/client-id.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/clients-get-cross-origin.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/clients-get.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/clients-matchall-exact-controller.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/clients-matchall-include-uncontrolled.https.html [ Crash Pass Timeout ]
+crbug.com/591099 external/wpt/service-workers/service-worker/clients-matchall-order.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/clients-matchall.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/extendable-event-async-waituntil.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/fetch-canvas-tainting-cache.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/fetch-canvas-tainting.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/fetch-cors-xhr.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/fetch-event.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/fetch-frame-resource.https.html [ Crash Timeout ]
+crbug.com/591099 external/wpt/service-workers/service-worker/fetch-mixed-content-to-inscope.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/fetch-mixed-content-to-outscope.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/fetch-request-css-images.https.html [ Crash Pass ]
 crbug.com/591099 external/wpt/service-workers/service-worker/fetch-request-fallback.https.html [ Crash Pass ]
-crbug.com/591099 external/wpt/service-workers/service-worker/fetch-request-redirect.https.html [ Crash ]
+crbug.com/591099 external/wpt/service-workers/service-worker/fetch-request-redirect.https.html [ Crash Pass ]
 crbug.com/591099 external/wpt/service-workers/service-worker/fetch-response-taint.https.html [ Crash Pass ]
-crbug.com/591099 external/wpt/service-workers/service-worker/foreign-fetch-basics.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/foreign-fetch-cors.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/foreign-fetch-workers.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/iframe-sandbox-register-link-element.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/multi-globals/url-parsing.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/navigation-preload/redirect.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/navigation-preload/resource-timing.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/navigation-redirect-to-http.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/navigation-redirect.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/ready.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/register-closed-window.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/register-link-header.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/register-same-scope-different-script-url.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/registration-iframe.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/unregister-controller.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/unregister-then-register-new-script.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/unregister-then-register.https.html [ Crash ]
-crbug.com/591099 external/wpt/service-workers/service-worker/windowclient-navigate.https.html [ Crash ]
-crbug.com/591099 external/wpt/shadow-dom/leaktests/html-collection.html [ Crash ]
-crbug.com/591099 external/wpt/shadow-dom/leaktests/window-frames.html [ Crash ]
-crbug.com/591099 external/wpt/shadow-dom/untriaged/events/event-retargeting/test-001.html [ Crash ]
-crbug.com/591099 external/wpt/shadow-dom/untriaged/events/test-001.html [ Crash ]
-crbug.com/591099 external/wpt/shadow-dom/untriaged/html-elements-in-shadow-trees/html-forms/test-003.html [ Crash ]
-crbug.com/591099 external/wpt/shadow-dom/untriaged/html-elements-in-shadow-trees/inert-html-elements/test-001.html [ Crash ]
+crbug.com/591099 external/wpt/service-workers/service-worker/foreign-fetch-basics.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/foreign-fetch-cors.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/foreign-fetch-workers.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/iframe-sandbox-register-link-element.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/multi-globals/url-parsing.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/navigation-preload/redirect.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/navigation-preload/resource-timing.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/navigation-redirect-to-http.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/navigation-redirect.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/ready.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/register-closed-window.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/register-link-header.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/register-same-scope-different-script-url.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/registration-iframe.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/unregister-controller.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/unregister-then-register-new-script.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/unregister-then-register.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/service-workers/service-worker/windowclient-navigate.https.html [ Crash Pass ]
+crbug.com/591099 external/wpt/shadow-dom/leaktests/html-collection.html [ Crash Pass ]
+crbug.com/591099 external/wpt/shadow-dom/leaktests/window-frames.html [ Crash Pass ]
+crbug.com/591099 external/wpt/shadow-dom/untriaged/events/event-retargeting/test-001.html [ Crash Pass ]
+crbug.com/591099 external/wpt/shadow-dom/untriaged/events/test-001.html [ Crash Pass ]
+crbug.com/591099 external/wpt/shadow-dom/untriaged/html-elements-in-shadow-trees/html-forms/test-003.html [ Crash Pass ]
+crbug.com/591099 external/wpt/shadow-dom/untriaged/html-elements-in-shadow-trees/inert-html-elements/test-001.html [ Crash Pass ]
 crbug.com/591099 external/wpt/svg/interfaces.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/svg/linking/reftests/href-filter-element.html [ Crash Failure ]
 crbug.com/591099 external/wpt/uievents/mouse/mouseevent_move_button-manual.html [ Crash Timeout ]
-crbug.com/591099 external/wpt/uievents/order-of-events/focus-events/focus-automated-blink-webkit.html [ Crash ]
+crbug.com/591099 external/wpt/uievents/order-of-events/focus-events/focus-automated-blink-webkit.html [ Crash Pass ]
 crbug.com/591099 external/wpt/uievents/order-of-events/focus-events/focus-manual.html [ Crash Failure Timeout ]
 crbug.com/591099 external/wpt/url/a-element-xhtml.xhtml [ Pass Timeout ]
 crbug.com/591099 external/wpt/url/a-element.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/url/url-constructor.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/url/url-setters.html [ Pass Timeout ]
-crbug.com/591099 external/wpt/viewport/viewport-unscaled-scale-iframe.html [ Crash ]
-crbug.com/591099 external/wpt/viewport/viewport-unscaled-scroll-iframe.html [ Crash ]
-crbug.com/591099 external/wpt/viewport/viewport-unscaled-size-iframe.html [ Crash ]
-crbug.com/591099 external/wpt/wasm/wasm_local_iframe_test.html [ Crash ]
-crbug.com/591099 external/wpt/web-animations/interfaces/AnimationTimeline/document-timeline.html [ Crash ]
-crbug.com/591099 external/wpt/webmessaging/broadcastchannel/sandbox.html [ Crash ]
-crbug.com/591099 external/wpt/webmessaging/message-channels/004.html [ Crash ]
-crbug.com/591099 external/wpt/webmessaging/with-ports/016.html [ Crash ]
-crbug.com/591099 external/wpt/webmessaging/with-ports/017.html [ Crash ]
-crbug.com/591099 external/wpt/webmessaging/with-ports/018.html [ Crash ]
-crbug.com/591099 external/wpt/webmessaging/with-ports/019.html [ Crash ]
-crbug.com/591099 external/wpt/webmessaging/with-ports/020.html [ Crash ]
-crbug.com/591099 external/wpt/webmessaging/with-ports/021.html [ Crash ]
-crbug.com/591099 external/wpt/webmessaging/without-ports/016.html [ Crash ]
-crbug.com/591099 external/wpt/webmessaging/without-ports/017.html [ Crash ]
-crbug.com/591099 external/wpt/webmessaging/without-ports/018.html [ Crash ]
-crbug.com/591099 external/wpt/webmessaging/without-ports/019.html [ Crash ]
-crbug.com/591099 external/wpt/webmessaging/without-ports/020.html [ Crash ]
-crbug.com/591099 external/wpt/webmessaging/without-ports/021.html [ Crash ]
-crbug.com/591099 external/wpt/webmessaging/without-ports/028.html [ Crash ]
+crbug.com/591099 external/wpt/viewport/viewport-unscaled-scale-iframe.html [ Crash Pass ]
+crbug.com/591099 external/wpt/viewport/viewport-unscaled-scroll-iframe.html [ Crash Pass ]
+crbug.com/591099 external/wpt/viewport/viewport-unscaled-size-iframe.html [ Crash Pass ]
+crbug.com/591099 external/wpt/wasm/wasm_local_iframe_test.html [ Crash Failure ]
+crbug.com/591099 external/wpt/web-animations/interfaces/AnimationTimeline/document-timeline.html [ Crash Pass ]
+crbug.com/591099 external/wpt/webmessaging/broadcastchannel/sandbox.html [ Crash Failure ]
+crbug.com/591099 external/wpt/webmessaging/message-channels/004.html [ Crash Pass ]
+crbug.com/591099 external/wpt/webmessaging/with-ports/016.html [ Crash Pass ]
+crbug.com/591099 external/wpt/webmessaging/with-ports/017.html [ Crash Pass ]
+crbug.com/591099 external/wpt/webmessaging/with-ports/018.html [ Crash Pass ]
+crbug.com/591099 external/wpt/webmessaging/with-ports/019.html [ Crash Pass ]
+crbug.com/591099 external/wpt/webmessaging/with-ports/020.html [ Crash Pass ]
+crbug.com/591099 external/wpt/webmessaging/with-ports/021.html [ Crash Pass ]
+crbug.com/591099 external/wpt/webmessaging/without-ports/016.html [ Crash Pass ]
+crbug.com/591099 external/wpt/webmessaging/without-ports/017.html [ Crash Pass ]
+crbug.com/591099 external/wpt/webmessaging/without-ports/018.html [ Crash Pass ]
+crbug.com/591099 external/wpt/webmessaging/without-ports/019.html [ Crash Pass ]
+crbug.com/591099 external/wpt/webmessaging/without-ports/020.html [ Crash Pass ]
+crbug.com/591099 external/wpt/webmessaging/without-ports/021.html [ Crash Pass ]
+crbug.com/591099 external/wpt/webmessaging/without-ports/028.html [ Crash Pass ]
 crbug.com/591099 external/wpt/webrtc/interfaces.html [ Pass Timeout ]
-crbug.com/591099 external/wpt/webrtc/simplecall.html [ Crash ]
-crbug.com/591099 external/wpt/websockets/multi-globals/message-received.html [ Crash ]
-crbug.com/591099 external/wpt/webstorage/event_no_duplicates.html [ Crash ]
+crbug.com/591099 external/wpt/webrtc/simplecall.html [ Crash Pass ]
+crbug.com/591099 external/wpt/websockets/multi-globals/message-received.html [ Crash Pass ]
+crbug.com/591099 external/wpt/webstorage/event_no_duplicates.html [ Crash Pass ]
 crbug.com/591099 external/wpt/webstorage/storage_setitem.html [ Pass Timeout ]
-crbug.com/591099 external/wpt/webusb/usb-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html [ Crash ]
-crbug.com/591099 external/wpt/webusb/usb-allowed-by-feature-policy-attribute.https.sub.html [ Crash ]
-crbug.com/591099 external/wpt/webusb/usb-allowed-by-feature-policy.https.sub.html [ Crash ]
-crbug.com/591099 external/wpt/webusb/usb-default-feature-policy.https.sub.html [ Crash ]
-crbug.com/591099 external/wpt/webusb/usb-disabled-by-feature-policy.https.sub.html [ Crash ]
+crbug.com/591099 external/wpt/webusb/usb-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/webusb/usb-allowed-by-feature-policy-attribute.https.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/webusb/usb-allowed-by-feature-policy.https.sub.html [ Crash Failure ]
+crbug.com/591099 external/wpt/webusb/usb-default-feature-policy.https.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/webusb/usb-disabled-by-feature-policy.https.sub.html [ Crash Failure ]
 crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/2_cues_overlapping_completely_move_up.html [ Crash Failure ]
 crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/2_cues_overlapping_partially_move_up.html [ Crash Failure ]
 crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/bidi_ruby.html [ Crash Failure ]
@@ -6566,17 +6574,17 @@
 crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_font_shorthand.html [ Crash Failure ]
 crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_font_properties.html [ Crash Failure ]
 crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_font_shorthand.html [ Crash Failure ]
-crbug.com/591099 external/wpt/x-frame-options/deny.sub.html [ Crash ]
-crbug.com/591099 external/wpt/x-frame-options/invalid.sub.html [ Crash ]
-crbug.com/591099 external/wpt/x-frame-options/multiple.sub.html [ Crash ]
-crbug.com/591099 external/wpt/x-frame-options/sameorigin.sub.html [ Crash ]
+crbug.com/591099 external/wpt/x-frame-options/deny.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/x-frame-options/invalid.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/x-frame-options/multiple.sub.html [ Crash Pass ]
+crbug.com/591099 external/wpt/x-frame-options/sameorigin.sub.html [ Crash Pass ]
 crbug.com/591099 fast/alignment/ensure-flexbox-compatibility-with-initial-values.html [ Failure ]
 crbug.com/591099 fast/alignment/overwrite-content-alignment.html [ Failure ]
 crbug.com/591099 fast/alignment/overwrite-self-alignment.html [ Failure ]
 crbug.com/591099 fast/animation/request-animation-frame-cancel.html [ Failure ]
 crbug.com/591099 fast/animation/request-animation-frame-cancel2.html [ Failure ]
-crbug.com/591099 fast/animation/request-animation-frame-detach-element.html [ Crash ]
-crbug.com/591099 fast/animation/request-animation-frame-detach-element2.html [ Crash ]
+crbug.com/591099 fast/animation/request-animation-frame-detach-element.html [ Crash Pass ]
+crbug.com/591099 fast/animation/request-animation-frame-detach-element2.html [ Crash Pass ]
 crbug.com/591099 fast/animation/request-animation-frame-iframe.html [ Failure ]
 crbug.com/591099 fast/animation/request-animation-frame-iframe2.html [ Failure ]
 crbug.com/591099 fast/animation/request-animation-frame-missing-arguments.html [ Failure ]
@@ -6679,13 +6687,13 @@
 crbug.com/591099 fast/block/basic/quirk-percent-height-grandchild.html [ Failure ]
 crbug.com/591099 fast/block/basic/text-indent-rtl.html [ Failure ]
 crbug.com/591099 fast/block/basic/white-space-pre-wraps.html [ Failure ]
-crbug.com/591099 fast/block/block-not-removed-from-parent-lineboxes-crash.html [ Crash ]
+crbug.com/591099 fast/block/block-not-removed-from-parent-lineboxes-crash.html [ Crash Pass ]
 crbug.com/591099 fast/block/block-parent-with-zero-width-child.html [ Failure ]
 crbug.com/591099 fast/block/block-remove-child-delete-line-box-crash.html [ Failure ]
-crbug.com/591099 fast/block/block-width-recalc-with-relative-height.html [ Crash ]
-crbug.com/591099 fast/block/block-with-inline-replaced-child-following-text.html [ Crash ]
+crbug.com/591099 fast/block/block-width-recalc-with-relative-height.html [ Crash Failure ]
+crbug.com/591099 fast/block/block-with-inline-replaced-child-following-text.html [ Crash Failure ]
 crbug.com/591099 fast/block/borderbox-percent-padding.html [ Failure ]
-crbug.com/591099 fast/block/child-not-removed-from-parent-lineboxes-crash.html [ Crash ]
+crbug.com/591099 fast/block/child-not-removed-from-parent-lineboxes-crash.html [ Crash Pass ]
 crbug.com/591099 fast/block/dynamic-padding-border.html [ Failure ]
 crbug.com/591099 fast/block/float/002.html [ Crash Failure ]
 crbug.com/591099 fast/block/float/003.html [ Failure ]
@@ -6712,7 +6720,7 @@
 crbug.com/591099 fast/block/float/034.html [ Failure ]
 crbug.com/591099 fast/block/float/035.html [ Failure ]
 crbug.com/591099 fast/block/float/add-float-back-to-anonymous-block.html [ Failure ]
-crbug.com/591099 fast/block/float/assert-when-moving-float.html [ Crash ]
+crbug.com/591099 fast/block/float/assert-when-moving-float.html [ Crash Failure ]
 crbug.com/591099 fast/block/float/avoid-floats-when-negative-margin-top-2.html [ Failure ]
 crbug.com/591099 fast/block/float/avoid-floats-when-negative-margin-top-3.html [ Failure ]
 crbug.com/591099 fast/block/float/avoid-floats-when-negative-margin-top-4.html [ Failure ]
@@ -6738,15 +6746,15 @@
 crbug.com/591099 fast/block/float/float-in-float-hit-testing.html [ Failure ]
 crbug.com/591099 fast/block/float/float-in-float-painting.html [ Failure ]
 crbug.com/591099 fast/block/float/float-inserted-into-clean-line.html [ Failure ]
-crbug.com/591099 fast/block/float/float-list-changed-before-layout-crash.html [ Crash ]
+crbug.com/591099 fast/block/float/float-list-changed-before-layout-crash.html [ Crash Pass ]
 crbug.com/591099 fast/block/float/float-not-removed-from-next-sibling-crash.html [ Failure ]
 crbug.com/591099 fast/block/float/float-not-removed-from-next-sibling5.html [ Crash Failure ]
 crbug.com/591099 fast/block/float/float-on-empty-line.html [ Failure ]
-crbug.com/591099 fast/block/float/float-on-line-large-and-small-float-below.html [ Crash ]
+crbug.com/591099 fast/block/float/float-on-line-large-and-small-float-below.html [ Crash Pass ]
 crbug.com/591099 fast/block/float/float-on-line-obeys-container-padding.html [ Failure ]
 crbug.com/591099 fast/block/float/float-on-zero-height-line.html [ Failure ]
 crbug.com/591099 fast/block/float/float-overflow-hidden-containing-block-width.html [ Failure ]
-crbug.com/591099 fast/block/float/float-reparent-during-detach-crash.html [ Crash ]
+crbug.com/591099 fast/block/float/float-reparent-during-detach-crash.html [ Crash Pass ]
 crbug.com/591099 fast/block/float/floats-and-text-indent-rl.html [ Failure ]
 crbug.com/591099 fast/block/float/floats-and-text-indent.html [ Failure ]
 crbug.com/591099 fast/block/float/floats-do-not-overhang-from-block-formatting-context.html [ Failure ]
@@ -6768,7 +6776,7 @@
 crbug.com/591099 fast/block/float/intruding-float-add-in-sibling-block-on-static-position2.html [ Crash Failure Pass ]
 crbug.com/591099 fast/block/float/intruding-painted-twice.html [ Failure ]
 crbug.com/591099 fast/block/float/logical-bottom-exceeds-layoutunit-max.html [ Failure ]
-crbug.com/591099 fast/block/float/margin-top-changes.html [ Crash ]
+crbug.com/591099 fast/block/float/margin-top-changes.html [ Crash Pass ]
 crbug.com/591099 fast/block/float/marquee-shrink-to-avoid-floats.html [ Failure ]
 crbug.com/591099 fast/block/float/max-width-clear-float-with-overflow-hidden.html [ Failure Pass ]
 crbug.com/591099 fast/block/float/multiple-float-positioning.html [ Failure ]
@@ -6794,10 +6802,10 @@
 crbug.com/591099 fast/block/float/selection-gap-clip-out-tiger-crash.html [ Failure Pass ]
 crbug.com/591099 fast/block/float/shrink-to-avoid-float-complexity.html [ Failure ]
 crbug.com/591099 fast/block/float/shrink-to-fit-width.html [ Failure ]
-crbug.com/591099 fast/block/float/split-inline-sibling-of-float-crash.html [ Crash ]
+crbug.com/591099 fast/block/float/split-inline-sibling-of-float-crash.html [ Crash Pass ]
 crbug.com/591099 fast/block/float/table-relayout.html [ Failure ]
-crbug.com/591099 fast/block/float/trailing-float-layout-2.html [ Crash ]
-crbug.com/591099 fast/block/float/trailing-float-layout.html [ Crash ]
+crbug.com/591099 fast/block/float/trailing-float-layout-2.html [ Crash Pass ]
+crbug.com/591099 fast/block/float/trailing-float-layout.html [ Crash Pass ]
 crbug.com/591099 fast/block/float/trailing-float-with-columns.html [ Failure ]
 crbug.com/591099 fast/block/float/vertical-move-relayout.html [ Failure ]
 crbug.com/591099 fast/block/float/width-update-after-clear.html [ Failure ]
@@ -6913,7 +6921,7 @@
 crbug.com/591099 fast/block/positioning/padding-percent.html [ Crash Failure ]
 crbug.com/591099 fast/block/positioning/positioned-child-inside-relative-positioned-anonymous-block.html [ Failure ]
 crbug.com/591099 fast/block/positioning/positioned-container-changes-block-direction-border-with-positioned-descendant.html [ Failure ]
-crbug.com/591099 fast/block/positioning/positioned-layout-in-line.html [ Crash ]
+crbug.com/591099 fast/block/positioning/positioned-layout-in-line.html [ Crash Pass ]
 crbug.com/591099 fast/block/positioning/rel-positioned-inline-changes-width.html [ Crash Failure ]
 crbug.com/591099 fast/block/positioning/relative-overflow-block.html [ Failure ]
 crbug.com/591099 fast/block/positioning/relative-overflow-replaced-float.html [ Crash Failure ]
@@ -6921,7 +6929,7 @@
 crbug.com/591099 fast/block/positioning/relative-positioned-inline-container.html [ Crash Failure ]
 crbug.com/591099 fast/block/positioning/relative-with-implicit-height-containing-block.html [ Failure ]
 crbug.com/591099 fast/block/positioning/relayout-nested-positioned-elements-crash-2.html [ Crash Failure Pass ]
-crbug.com/591099 fast/block/positioning/relayout-nested-positioned-elements-crash.html [ Crash ]
+crbug.com/591099 fast/block/positioning/relayout-nested-positioned-elements-crash.html [ Crash Failure ]
 crbug.com/591099 fast/block/positioning/relayout-on-position-change.html [ Failure ]
 crbug.com/591099 fast/block/positioning/replaced-inside-fixed-top-bottom.html [ Failure ]
 crbug.com/591099 fast/block/positioning/rtl-static-positioning-inline-block.html [ Crash Failure ]
@@ -6940,7 +6948,7 @@
 crbug.com/591099 fast/block/positioning/vertical-rl/fixed-positioning.html [ Failure ]
 crbug.com/591099 fast/block/positioning/window-height-change.html [ Failure ]
 crbug.com/591099 fast/block/scrollbar-wider-than-border-box.html [ Failure ]
-crbug.com/591099 fast/block/skip-cleaning-up-anonymous-wrappers-when-subtree-being-destroyed.html [ Crash ]
+crbug.com/591099 fast/block/skip-cleaning-up-anonymous-wrappers-when-subtree-being-destroyed.html [ Crash Pass ]
 crbug.com/591099 fast/block/strip-anonymous-blocks-when-block-child-becomes-float.html [ Failure ]
 crbug.com/591099 fast/body-propagation/background-color/001-xhtml.xhtml [ Failure Pass ]
 crbug.com/591099 fast/body-propagation/background-color/001.html [ Failure Pass ]
@@ -7096,36 +7104,36 @@
 crbug.com/591099 fast/box-shadow/spread.html [ Failure ]
 crbug.com/591099 fast/box-shadow/transform-fringing.html [ Failure ]
 crbug.com/591099 fast/box-sizing/box-sizing.html [ Failure ]
-crbug.com/591099 fast/box-sizing/css-table-with-box-sizing.html [ Crash ]
+crbug.com/591099 fast/box-sizing/css-table-with-box-sizing.html [ Crash Failure ]
 crbug.com/591099 fast/box-sizing/table-cell.html [ Failure ]
-crbug.com/591099 fast/canvas/2d.composite.globalAlpha.fillPath.html [ Crash ]
-crbug.com/591099 fast/canvas/2d.fillText.gradient.html [ Crash ]
-crbug.com/591099 fast/canvas/2d.text.draw.fill.maxWidth.gradient.html [ Crash ]
-crbug.com/591099 fast/canvas/2d.text.draw.fill.maxWidth.negative.html [ Crash ]
-crbug.com/591099 fast/canvas/2d.text.draw.fill.maxWidth.veryLarge.html [ Crash ]
-crbug.com/591099 fast/canvas/2d.text.draw.fill.maxWidth.verySmall.html [ Crash ]
+crbug.com/591099 fast/canvas/2d.composite.globalAlpha.fillPath.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/2d.fillText.gradient.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/2d.text.draw.fill.maxWidth.gradient.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/2d.text.draw.fill.maxWidth.negative.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/2d.text.draw.fill.maxWidth.veryLarge.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/2d.text.draw.fill.maxWidth.verySmall.html [ Crash Pass ]
 crbug.com/591099 fast/canvas/OffscreenCanvas-constructor-in-worker.html [ Failure ]
 crbug.com/591099 fast/canvas/OffscreenCanvas-invalid-args-in-worker.html [ Failure ]
 crbug.com/591099 fast/canvas/OffscreenCanvas-transferable-exceptions.html [ Failure ]
 crbug.com/591099 fast/canvas/OffscreenCanvas-transferable.html [ Failure ]
-crbug.com/591099 fast/canvas/access-zero-sized-canvas.html [ Crash ]
-crbug.com/591099 fast/canvas/alpha.html [ Crash ]
-crbug.com/591099 fast/canvas/arc-crash.html [ Crash ]
-crbug.com/591099 fast/canvas/arc360.html [ Crash ]
-crbug.com/591099 fast/canvas/bug544329.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-2d-clip-anti-aliasing.html [ Crash ]
+crbug.com/591099 fast/canvas/access-zero-sized-canvas.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/alpha.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/arc-crash.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/arc360.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/bug544329.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-2d-clip-anti-aliasing.html [ Crash Pass ]
 crbug.com/591099 fast/canvas/canvas-ImageBitmap-close.html [ Failure ]
 crbug.com/591099 fast/canvas/canvas-ImageBitmap-structured-clone.html [ Failure ]
 crbug.com/591099 fast/canvas/canvas-ImageBitmap-transferable.html [ Failure ]
 crbug.com/591099 fast/canvas/canvas-ImageData-neutered-source.html [ Failure ]
 crbug.com/591099 fast/canvas/canvas-ImageData-workers.html [ Failure ]
-crbug.com/591099 fast/canvas/canvas-after-destroy-iframe.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-alphaImageData-behavior.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-arc-zero-lineto.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-bezier-same-endpoint.html [ Crash ]
+crbug.com/591099 fast/canvas/canvas-after-destroy-iframe.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-alphaImageData-behavior.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-arc-zero-lineto.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-bezier-same-endpoint.html [ Crash Pass ]
 crbug.com/591099 fast/canvas/canvas-blending-image-over-image.html [ Failure ]
 crbug.com/591099 fast/canvas/canvas-blending-text.html [ Failure ]
-crbug.com/591099 fast/canvas/canvas-closePath-single-point.html [ Crash ]
+crbug.com/591099 fast/canvas/canvas-closePath-single-point.html [ Crash Pass ]
 crbug.com/591099 fast/canvas/canvas-composite-alpha.html [ Crash Failure ]
 crbug.com/591099 fast/canvas/canvas-composite-canvas.html [ Failure ]
 crbug.com/591099 fast/canvas/canvas-composite-image.html [ Failure ]
@@ -7144,25 +7152,25 @@
 crbug.com/591099 fast/canvas/canvas-createImageBitmap-recursive.html [ Failure Timeout ]
 crbug.com/591099 fast/canvas/canvas-createImageBitmap-svg-no-intrinsic-size.html [ Failure ]
 crbug.com/591099 fast/canvas/canvas-createImageBitmap-svg.html [ Failure ]
-crbug.com/591099 fast/canvas/canvas-createPattern-fillRect-shadow.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-currentColor.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-direction.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-draw-canvas-on-canvas-shadow.html [ Crash ]
+crbug.com/591099 fast/canvas/canvas-createPattern-fillRect-shadow.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-currentColor.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-direction.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-draw-canvas-on-canvas-shadow.html [ Crash Pass ]
 crbug.com/591099 fast/canvas/canvas-drawImage-animated-images.html [ Failure ]
-crbug.com/591099 fast/canvas/canvas-drawImage-animated.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-drawImage-live-video.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-drawImage-shadow.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-ellipse-360-winding.html [ Crash ]
+crbug.com/591099 fast/canvas/canvas-drawImage-animated.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-drawImage-live-video.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-drawImage-shadow.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-ellipse-360-winding.html [ Crash Pass ]
 crbug.com/591099 fast/canvas/canvas-ellipse-connecting-line.html [ Failure Pass ]
-crbug.com/591099 fast/canvas/canvas-ellipse-zero-lineto.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-ellipse.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-empty-image-pattern.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-fillPath-alpha-shadow.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-fillPath-gradient-shadow.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-fillPath-pattern-shadow.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-fillPath-shadow.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-fillRect-gradient-shadow.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-fillRect-shadow.html [ Crash ]
+crbug.com/591099 fast/canvas/canvas-ellipse-zero-lineto.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-ellipse.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-empty-image-pattern.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-fillPath-alpha-shadow.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-fillPath-gradient-shadow.html [ Crash Failure ]
+crbug.com/591099 fast/canvas/canvas-fillPath-pattern-shadow.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-fillPath-shadow.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-fillRect-gradient-shadow.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-fillRect-shadow.html [ Crash Pass ]
 crbug.com/591099 fast/canvas/canvas-filter-fill-liveness.html [ Failure ]
 crbug.com/591099 fast/canvas/canvas-filter-fill-paint-color.html [ Failure ]
 crbug.com/591099 fast/canvas/canvas-filter-fill-paint-gradient.html [ Failure ]
@@ -7179,99 +7187,99 @@
 crbug.com/591099 fast/canvas/canvas-filter-width-height-hidpi.html [ Failure ]
 crbug.com/591099 fast/canvas/canvas-filter-width-height-scale.html [ Failure ]
 crbug.com/591099 fast/canvas/canvas-filter-width-height.html [ Failure ]
-crbug.com/591099 fast/canvas/canvas-font-cache.html [ Crash ]
+crbug.com/591099 fast/canvas/canvas-font-cache.html [ Crash Pass ]
 crbug.com/591099 fast/canvas/canvas-hides-fallback.html [ Failure ]
-crbug.com/591099 fast/canvas/canvas-hit-regions-accessibility-test.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-hit-regions-basic-test.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-hit-regions-clear-test.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-hit-regions-clip-test.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-hit-regions-css-transform-test.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-hit-regions-device-pixel-ratio-test.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-hit-regions-event-test.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-hit-regions-exception-test.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-hit-regions-fallback-element-test-1.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-hit-regions-fallback-element-test-2.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-hit-regions-fallback-element-test-3.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-hit-regions-fill-rule-test.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-hit-regions-path2d-test.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-hit-regions-path2d-transform-test.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-hit-regions-scale-factor.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-hit-regions-transform-test.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-imageSmoothingEnabled-repaint.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-imageSmoothingQuality.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-invalid-fillstyle.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-invalid-strokestyle.html [ Crash ]
+crbug.com/591099 fast/canvas/canvas-hit-regions-accessibility-test.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-hit-regions-basic-test.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-hit-regions-clear-test.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-hit-regions-clip-test.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-hit-regions-css-transform-test.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-hit-regions-device-pixel-ratio-test.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-hit-regions-event-test.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-hit-regions-exception-test.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-hit-regions-fallback-element-test-1.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-hit-regions-fallback-element-test-2.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-hit-regions-fallback-element-test-3.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-hit-regions-fill-rule-test.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-hit-regions-path2d-test.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-hit-regions-path2d-transform-test.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-hit-regions-scale-factor.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-hit-regions-transform-test.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-imageSmoothingEnabled-repaint.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-imageSmoothingQuality.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-invalid-fillstyle.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-invalid-strokestyle.html [ Crash Pass ]
 crbug.com/591099 fast/canvas/canvas-invalid-video.html [ Failure ]
-crbug.com/591099 fast/canvas/canvas-isPointInStroke-with-path.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-isPointInStroke.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-large-dimensions.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-lineDash-input-sequence.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-lineDash-invalid.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-lineDash.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-lineWidth-intact-after-strokeRect.html [ Crash ]
+crbug.com/591099 fast/canvas/canvas-isPointInStroke-with-path.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-isPointInStroke.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-large-dimensions.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-lineDash-input-sequence.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-lineDash-invalid.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-lineDash.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-lineWidth-intact-after-strokeRect.html [ Crash Pass ]
 crbug.com/591099 fast/canvas/canvas-measure-bidi-text.html [ Failure Pass ]
 crbug.com/591099 fast/canvas/canvas-negative-size.html [ Failure ]
 crbug.com/591099 fast/canvas/canvas-normalize-string.html [ Failure ]
-crbug.com/591099 fast/canvas/canvas-path-context-clip.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-path-context-fill.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-path-context-stroke.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-path-object.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-path-with-inf-nan-dimensions.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-pattern-set-transform.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-putImageData.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-quadratic-same-endpoint.html [ Crash ]
+crbug.com/591099 fast/canvas/canvas-path-context-clip.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-path-context-fill.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-path-context-stroke.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-path-object.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-path-with-inf-nan-dimensions.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-pattern-set-transform.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-putImageData.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-quadratic-same-endpoint.html [ Crash Pass ]
 crbug.com/591099 fast/canvas/canvas-render-layer.html [ Failure Pass ]
-crbug.com/591099 fast/canvas/canvas-resetTransform.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-resize-after-paint.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-scale-drawImage-shadow.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-scale-fillPath-shadow.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-scale-fillRect-shadow.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-scale-shadowBlur.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-scale-strokePath-shadow.html [ Crash ]
+crbug.com/591099 fast/canvas/canvas-resetTransform.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-resize-after-paint.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-scale-drawImage-shadow.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-scale-fillPath-shadow.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-scale-fillRect-shadow.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-scale-shadowBlur.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-scale-strokePath-shadow.html [ Crash Pass ]
 crbug.com/591099 fast/canvas/canvas-scroll-path-into-view.html [ Failure Timeout ]
-crbug.com/591099 fast/canvas/canvas-set-properties-with-non-invertible-ctm.html [ Crash ]
+crbug.com/591099 fast/canvas/canvas-set-properties-with-non-invertible-ctm.html [ Crash Pass ]
 crbug.com/591099 fast/canvas/canvas-shadow-source-in.html [ Failure Pass ]
-crbug.com/591099 fast/canvas/canvas-skia-excessive-size.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-strokePath-alpha-shadow.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-strokePath-cap-join.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-strokePath-gradient-shadow.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-strokePath-shadow.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-strokeRect-alpha-shadow.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-strokeRect-gradient-shadow.html [ Crash ]
+crbug.com/591099 fast/canvas/canvas-skia-excessive-size.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-strokePath-alpha-shadow.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-strokePath-cap-join.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-strokePath-gradient-shadow.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-strokePath-shadow.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-strokeRect-alpha-shadow.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/canvas-strokeRect-gradient-shadow.html [ Crash Pass ]
 crbug.com/591099 fast/canvas/canvas-text-baseline-tiny-fonts.html [ Failure Pass ]
-crbug.com/591099 fast/canvas/canvas-text-space-characters.html [ Crash ]
+crbug.com/591099 fast/canvas/canvas-text-space-characters.html [ Crash Pass ]
 crbug.com/591099 fast/canvas/canvas-textMetrics-width.html [ Failure ]
 crbug.com/591099 fast/canvas/canvas-transforms-during-path.html [ Failure ]
-crbug.com/591099 fast/canvas/canvas-transforms-fillRect-shadow.html [ Crash ]
+crbug.com/591099 fast/canvas/canvas-transforms-fillRect-shadow.html [ Crash Pass ]
 crbug.com/591099 fast/canvas/currentTransform-null.html [ Failure ]
-crbug.com/591099 fast/canvas/draw-focus-if-needed-invisible-crash.html [ Crash ]
-crbug.com/591099 fast/canvas/draw-focus-if-needed-on-event.html [ Crash ]
-crbug.com/591099 fast/canvas/draw-focus-if-needed-with-path2d.html [ Crash ]
-crbug.com/591099 fast/canvas/draw-focus-if-needed.html [ Crash ]
-crbug.com/591099 fast/canvas/drawImage-with-negative-source-destination.html [ Crash ]
-crbug.com/591099 fast/canvas/fallback-content.html [ Crash ]
-crbug.com/591099 fast/canvas/feimage-with-foreignobject-taint-canvas-2.html [ Crash ]
-crbug.com/591099 fast/canvas/feimage-with-foreignobject-taint-canvas.html [ Crash ]
+crbug.com/591099 fast/canvas/draw-focus-if-needed-invisible-crash.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/draw-focus-if-needed-on-event.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/draw-focus-if-needed-with-path2d.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/draw-focus-if-needed.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/drawImage-with-negative-source-destination.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/fallback-content.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/feimage-with-foreignobject-taint-canvas-2.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/feimage-with-foreignobject-taint-canvas.html [ Crash Pass ]
 crbug.com/591099 fast/canvas/fill-stroke-clip-reset-path.html [ Failure ]
-crbug.com/591099 fast/canvas/fillText-shadow.html [ Crash ]
+crbug.com/591099 fast/canvas/fillText-shadow.html [ Crash Pass ]
 crbug.com/591099 fast/canvas/fillrect_gradient.html [ Failure ]
-crbug.com/591099 fast/canvas/font-no-zoom.html [ Crash ]
-crbug.com/591099 fast/canvas/gradient-with-clip.html [ Crash ]
+crbug.com/591099 fast/canvas/font-no-zoom.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/gradient-with-clip.html [ Crash Pass ]
 crbug.com/591099 fast/canvas/image-object-in-canvas.html [ Failure ]
-crbug.com/591099 fast/canvas/image-with-foreignobject-taint-canvas-2.html [ Crash ]
-crbug.com/591099 fast/canvas/image-with-foreignobject-taint-canvas.html [ Crash ]
-crbug.com/591099 fast/canvas/painting-on-bad-canvas.html [ Crash ]
-crbug.com/591099 fast/canvas/pattern-with-transform.html [ Crash ]
+crbug.com/591099 fast/canvas/image-with-foreignobject-taint-canvas-2.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/image-with-foreignobject-taint-canvas.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/painting-on-bad-canvas.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/pattern-with-transform.html [ Crash Pass ]
 crbug.com/591099 fast/canvas/quadraticCurveTo.xml [ Failure ]
-crbug.com/591099 fast/canvas/resize-while-save-active.html [ Crash ]
-crbug.com/591099 fast/canvas/set-empty-font-crash.html [ Crash ]
+crbug.com/591099 fast/canvas/resize-while-save-active.html [ Crash Pass ]
+crbug.com/591099 fast/canvas/set-empty-font-crash.html [ Crash Pass ]
 crbug.com/591099 fast/canvas/setWidthResetAfterForcedRender.html [ Failure ]
-crbug.com/591099 fast/canvas/shadow-huge-blur.html [ Crash ]
+crbug.com/591099 fast/canvas/shadow-huge-blur.html [ Crash Pass ]
 crbug.com/591099 fast/canvas/shadow-offset-1.html [ Failure ]
 crbug.com/591099 fast/canvas/toDataURL-alpha.html [ Failure ]
-crbug.com/591099 fast/canvas/toDataURL-noData.html [ Crash ]
+crbug.com/591099 fast/canvas/toDataURL-noData.html [ Crash Pass ]
 crbug.com/591099 fast/canvas/toDataURL-supportedTypes.html [ Failure ]
-crbug.com/591099 fast/canvas/transformed-canvas-reset.html [ Crash ]
+crbug.com/591099 fast/canvas/transformed-canvas-reset.html [ Crash Pass ]
 crbug.com/591099 fast/canvas/unclosed-canvas-1.html [ Failure ]
 crbug.com/591099 fast/canvas/unclosed-canvas-3.html [ Failure ]
 crbug.com/591099 fast/canvas/unclosed-canvas-4.html [ Failure ]
@@ -7282,11 +7290,11 @@
 crbug.com/591099 fast/canvas/webgl/renderer-and-vendor-strings.html [ Failure ]
 crbug.com/591099 fast/canvas/webgl/shader-deleted-by-accessor.html [ Failure ]
 crbug.com/591099 fast/canvas/webgl/tex-sub-image-cube-maps.html [ Failure ]
-crbug.com/591099 fast/canvas/webgl/texImage-imageBitmap-from-canvas-resize.html [ Crash ]
+crbug.com/591099 fast/canvas/webgl/texImage-imageBitmap-from-canvas-resize.html [ Crash Pass ]
 crbug.com/591099 fast/canvas/webgl/texture-color-profile.html [ Failure ]
 crbug.com/591099 fast/canvas/webgl/webgl-texture-binding-preserved.html [ Failure ]
 crbug.com/591099 fast/canvas/webgl/webgl-viewport-parameters-preserved.html [ Failure ]
-crbug.com/591099 fast/canvas/zero-size-fill-rect.html [ Crash ]
+crbug.com/591099 fast/canvas/zero-size-fill-rect.html [ Crash Pass ]
 crbug.com/591099 fast/clip/001.html [ Failure ]
 crbug.com/591099 fast/clip/004.html [ Failure ]
 crbug.com/591099 fast/clip/008.html [ Failure ]
@@ -7332,7 +7340,7 @@
 crbug.com/591099 fast/css-generated-content/beforeAfter-interdocument.html [ Failure ]
 crbug.com/591099 fast/css-generated-content/block-after.html [ Failure ]
 crbug.com/591099 fast/css-generated-content/bug-106384.html [ Failure ]
-crbug.com/591099 fast/css-generated-content/crash-selection-editing-removes-pseudo.html [ Crash ]
+crbug.com/591099 fast/css-generated-content/crash-selection-editing-removes-pseudo.html [ Crash Failure ]
 crbug.com/591099 fast/css-generated-content/details-before-after-content.html [ Crash Failure ]
 crbug.com/591099 fast/css-generated-content/drag-state.html [ Failure ]
 crbug.com/591099 fast/css-generated-content/empty-content-with-float-crash.html [ Failure ]
@@ -7415,7 +7423,7 @@
 crbug.com/591099 fast/css-grid-layout/grid-auto-flow-update.html [ Failure ]
 crbug.com/591099 fast/css-grid-layout/grid-auto-repeat-inherit-initial-crash.html [ Failure ]
 crbug.com/591099 fast/css-grid-layout/grid-automatic-minimum-for-auto-rows.html [ Failure ]
-crbug.com/591099 fast/css-grid-layout/grid-baseline-must-respect-grid-order.html [ Crash ]
+crbug.com/591099 fast/css-grid-layout/grid-baseline-must-respect-grid-order.html [ Crash Failure ]
 crbug.com/591099 fast/css-grid-layout/grid-change-fit-content-argument.html [ Failure ]
 crbug.com/591099 fast/css-grid-layout/grid-columns-rows-get-set-multiple.html [ Timeout ]
 crbug.com/591099 fast/css-grid-layout/grid-columns-rows-get-set.html [ Timeout ]
@@ -7639,7 +7647,7 @@
 crbug.com/591099 fast/css-intrinsic-dimensions/fit-content-container-with-replaced-child.html [ Crash Failure Pass ]
 crbug.com/591099 fast/css-intrinsic-dimensions/fitcontent-minmax-content-inlinesize-contribution-nonreplaced-blocks.html [ Crash Failure ]
 crbug.com/591099 fast/css-intrinsic-dimensions/fixed-height-stf-img-block-child-percent-height.html [ Failure ]
-crbug.com/591099 fast/css-intrinsic-dimensions/fixed-height-stf-img-inline-child-percent-height.html [ Crash ]
+crbug.com/591099 fast/css-intrinsic-dimensions/fixed-height-stf-img-inline-child-percent-height.html [ Crash Failure ]
 crbug.com/591099 fast/css-intrinsic-dimensions/height-css-tables.html [ Failure ]
 crbug.com/591099 fast/css-intrinsic-dimensions/height-flexbox.html [ Failure Pass ]
 crbug.com/591099 fast/css-intrinsic-dimensions/height-positioned.html [ Crash Failure ]
@@ -7672,9 +7680,9 @@
 crbug.com/591099 fast/css/absolute-child-with-percent-height-inside-relative-parent.html [ Failure ]
 crbug.com/591099 fast/css/absolute-child-with-percent-padding-inside-relative-parent.html [ Failure Pass ]
 crbug.com/591099 fast/css/absolute-poition-in-rtl-parent.html [ Failure ]
-crbug.com/591099 fast/css/acid2-pixel.html [ Crash ]
-crbug.com/591099 fast/css/acid2.html [ Crash ]
-crbug.com/591099 fast/css/active-pseudo-and-focus-move.html [ Crash ]
+crbug.com/591099 fast/css/acid2-pixel.html [ Crash Failure ]
+crbug.com/591099 fast/css/acid2.html [ Crash Failure ]
+crbug.com/591099 fast/css/active-pseudo-and-focus-move.html [ Crash Pass ]
 crbug.com/591099 fast/css/all-shorthand-css-text.html [ Failure ]
 crbug.com/591099 fast/css/all-shorthand-first-letter.html [ Failure ]
 crbug.com/591099 fast/css/annotated-regions.html [ Failure ]
@@ -7723,7 +7731,7 @@
 crbug.com/591099 fast/css/box-sizing-backwards-compat-prefix.html [ Failure ]
 crbug.com/591099 fast/css/box-sizing-border-box-dynamic-padding-border-update.html [ Failure ]
 crbug.com/591099 fast/css/bug4860-absolute-block-child-does-not-inherit-alignment.html [ Failure ]
-crbug.com/591099 fast/css/button-height.html [ Crash ]
+crbug.com/591099 fast/css/button-height.html [ Crash Failure ]
 crbug.com/591099 fast/css/button-inner-child-crash.html [ Crash Pass ]
 crbug.com/591099 fast/css/calc-rounding.html [ Failure ]
 crbug.com/591099 fast/css/caption-width-absolute-position-offset-top.htm [ Failure ]
@@ -7761,9 +7769,9 @@
 crbug.com/591099 fast/css/computed-image-width-with-percent-height-quirksmode.html [ Failure ]
 crbug.com/591099 fast/css/computed-offset-with-zoom.html [ Failure ]
 crbug.com/591099 fast/css/containment/size-and-layout-containment.html [ Crash Failure ]
-crbug.com/591099 fast/css/content-disallowed-url-crash.html [ Crash ]
+crbug.com/591099 fast/css/content-disallowed-url-crash.html [ Crash Pass ]
 crbug.com/591099 fast/css/content-distributed-nodes.html [ Failure ]
-crbug.com/591099 fast/css/content-image-set-disallowed-url-crash.html [ Crash ]
+crbug.com/591099 fast/css/content-image-set-disallowed-url-crash.html [ Crash Pass ]
 crbug.com/591099 fast/css/content-language-case-insensitivity.html [ Failure ]
 crbug.com/591099 fast/css/content-language-comma-separated-list.html [ Failure ]
 crbug.com/591099 fast/css/content-language-dynamically-added.html [ Failure ]
@@ -7800,14 +7808,14 @@
 crbug.com/591099 fast/css/counters/counter-reset-000.html [ Failure ]
 crbug.com/591099 fast/css/counters/counter-reset-001.html [ Failure ]
 crbug.com/591099 fast/css/counters/counter-reset-002.html [ Failure ]
-crbug.com/591099 fast/css/counters/counter-traverse-object-crash.html [ Crash ]
+crbug.com/591099 fast/css/counters/counter-traverse-object-crash.html [ Crash Pass ]
 crbug.com/591099 fast/css/counters/counter-traverse-table-cell.html [ Failure ]
 crbug.com/591099 fast/css/counters/invalidate-cached-counter-node.html [ Failure ]
 crbug.com/591099 fast/css/counters/nesting.html [ Failure ]
 crbug.com/591099 fast/css/counters/remove-anonymous-block-wrapper-crash.html [ Crash Failure ]
 crbug.com/591099 fast/css/crash-corner-present.html [ Failure ]
-crbug.com/591099 fast/css/crash-in-attachFirstLetterTextLayoutObjects.html [ Crash ]
-crbug.com/591099 fast/css/crash-layout-detached-document.html [ Crash ]
+crbug.com/591099 fast/css/crash-in-attachFirstLetterTextLayoutObjects.html [ Crash Pass ]
+crbug.com/591099 fast/css/crash-layout-detached-document.html [ Crash Failure ]
 crbug.com/591099 fast/css/create_element_align.xhtml [ Failure ]
 crbug.com/591099 fast/css/css-imports.html [ Failure ]
 crbug.com/591099 fast/css/css-keyframe-style-parentRule.html [ Failure ]
@@ -7869,7 +7877,7 @@
 crbug.com/591099 fast/css/first-letter-float-after-float.html [ Failure ]
 crbug.com/591099 fast/css/first-letter-float.html [ Failure ]
 crbug.com/591099 fast/css/first-letter-hover.html [ Failure ]
-crbug.com/591099 fast/css/first-letter-inline-flow-split-table-crash.html [ Crash ]
+crbug.com/591099 fast/css/first-letter-inline-flow-split-table-crash.html [ Crash Pass ]
 crbug.com/591099 fast/css/first-letter-nested.html [ Failure ]
 crbug.com/591099 fast/css/first-letter-recalculation.html [ Failure Pass ]
 crbug.com/591099 fast/css/first-letter-removed-added.html [ Failure ]
@@ -7892,7 +7900,7 @@
 crbug.com/591099 fast/css/focus-ring-recursive-inlines.html [ Failure ]
 crbug.com/591099 fast/css/font-face-add-same-family-later.html [ Failure ]
 crbug.com/591099 fast/css/font-face-cache-bug.html [ Crash Failure ]
-crbug.com/591099 fast/css/font-face-cache-version.html [ Crash ]
+crbug.com/591099 fast/css/font-face-cache-version.html [ Crash Pass ]
 crbug.com/591099 fast/css/font-face-data-uri-invalid.html [ Failure ]
 crbug.com/591099 fast/css/font-face-data-uri.html [ Failure ]
 crbug.com/591099 fast/css/font-face-descending-unicode-range.html [ Failure ]
@@ -7932,7 +7940,7 @@
 crbug.com/591099 fast/css/fontface-methods.html [ Failure ]
 crbug.com/591099 fast/css/fontface-properties.html [ Failure ]
 crbug.com/591099 fast/css/fontface-single-font-family.html [ Failure ]
-crbug.com/591099 fast/css/fontfaceset-cross-frame.html [ Crash ]
+crbug.com/591099 fast/css/fontfaceset-cross-frame.html [ Crash Pass ]
 crbug.com/591099 fast/css/fontfaceset-download-error.html [ Failure ]
 crbug.com/591099 fast/css/fontfaceset-events.html [ Failure ]
 crbug.com/591099 fast/css/fontfaceset-in-detached-frame.html [ Failure ]
@@ -7991,7 +7999,7 @@
 crbug.com/591099 fast/css/getComputedStyle/getComputedStyle-outline-offset.html [ Failure ]
 crbug.com/591099 fast/css/getComputedStyle/getComputedStyle-outline-shorthand.html [ Failure ]
 crbug.com/591099 fast/css/getComputedStyle/getComputedStyle-padding-shorthand.html [ Failure ]
-crbug.com/591099 fast/css/getComputedStyle/getComputedStyle-resolved-values.html [ Crash ]
+crbug.com/591099 fast/css/getComputedStyle/getComputedStyle-resolved-values.html [ Crash Timeout ]
 crbug.com/591099 fast/css/getComputedStyle/getComputedStyle-text-decoration.html [ Failure ]
 crbug.com/591099 fast/css/getComputedStyle/getComputedStyle-text-overflow.html [ Failure ]
 crbug.com/591099 fast/css/getComputedStyle/getComputedStyle-webkit-columns-shorthand.html [ Failure ]
@@ -8051,7 +8059,7 @@
 crbug.com/591099 fast/css/input-search-padding.html [ Crash Failure ]
 crbug.com/591099 fast/css/insertRule-font-face.html [ Failure ]
 crbug.com/591099 fast/css/insertRule-media.html [ Failure ]
-crbug.com/591099 fast/css/intruding-floats-crash.html [ Crash ]
+crbug.com/591099 fast/css/intruding-floats-crash.html [ Crash Failure ]
 crbug.com/591099 fast/css/invalid-appearance-progress-bar-meter.html [ Failure ]
 crbug.com/591099 fast/css/invalid-not-with-pseudo-element.html [ Failure ]
 crbug.com/591099 fast/css/invalid-not-with-simple-selector-sequence.html [ Failure ]
@@ -8083,8 +8091,8 @@
 crbug.com/591099 fast/css/invalidation/full-page-media.html [ Failure ]
 crbug.com/591099 fast/css/invalidation/fullscreen.html [ Failure ]
 crbug.com/591099 fast/css/invalidation/hover-first-letter-sibling.html [ Failure ]
-crbug.com/591099 fast/css/invalidation/in-and-out-of-range-pseudo.html [ Crash ]
-crbug.com/591099 fast/css/invalidation/in-range-pseudo.html [ Crash ]
+crbug.com/591099 fast/css/invalidation/in-and-out-of-range-pseudo.html [ Crash Pass ]
+crbug.com/591099 fast/css/invalidation/in-range-pseudo.html [ Crash Pass ]
 crbug.com/591099 fast/css/invalidation/indeterminate-pseudo.html [ Failure ]
 crbug.com/591099 fast/css/invalidation/input-search-incremental.html [ Failure ]
 crbug.com/591099 fast/css/invalidation/invalidation-set-with-adjacent-combinators.html [ Failure ]
@@ -8094,7 +8102,7 @@
 crbug.com/591099 fast/css/invalidation/no-invalidation-set-local-style.html [ Failure ]
 crbug.com/591099 fast/css/invalidation/range-pseudo.html [ Crash Failure ]
 crbug.com/591099 fast/css/invalidation/read-only-write-pseudo.html [ Failure ]
-crbug.com/591099 fast/css/invalidation/reattach-with-sibling-invalidation.html [ Crash ]
+crbug.com/591099 fast/css/invalidation/reattach-with-sibling-invalidation.html [ Crash Failure ]
 crbug.com/591099 fast/css/invalidation/recalc-direct-adjacent-001.html [ Failure ]
 crbug.com/591099 fast/css/invalidation/recalc-direct-adjacent-002.html [ Failure ]
 crbug.com/591099 fast/css/invalidation/removed-hover-shadow-rule.html [ Failure ]
@@ -8103,7 +8111,7 @@
 crbug.com/591099 fast/css/invalidation/selection-pseudo.html [ Failure ]
 crbug.com/591099 fast/css/invalidation/shadow-add-sheet-content.html [ Failure ]
 crbug.com/591099 fast/css/invalidation/shadow-add-sheet-host.html [ Failure ]
-crbug.com/591099 fast/css/invalidation/sheet-ruleset-invalidation.html [ Crash ]
+crbug.com/591099 fast/css/invalidation/sheet-ruleset-invalidation.html [ Crash Pass ]
 crbug.com/591099 fast/css/invalidation/slotted.html [ Failure ]
 crbug.com/591099 fast/css/invalidation/style-update-with-added-stylesheet.html [ Failure ]
 crbug.com/591099 fast/css/invalidation/sub-selector-adjacent-cancellation.html [ Failure ]
@@ -8164,15 +8172,15 @@
 crbug.com/591099 fast/css/margin-start-end.html [ Failure ]
 crbug.com/591099 fast/css/margin-top-bottom-dynamic.html [ Failure ]
 crbug.com/591099 fast/css/marquee-in-template.html [ Crash Failure ]
-crbug.com/591099 fast/css/mask-missing-image-crash.html [ Crash ]
+crbug.com/591099 fast/css/mask-missing-image-crash.html [ Crash Failure ]
 crbug.com/591099 fast/css/matrix-as-function-crash.html [ Failure ]
 crbug.com/591099 fast/css/max-device-aspect-ratio.html [ Failure ]
 crbug.com/591099 fast/css/max-height-and-max-width.html [ Failure ]
 crbug.com/591099 fast/css/max-height-none.html [ Failure ]
 crbug.com/591099 fast/css/max-width-none.html [ Failure ]
-crbug.com/591099 fast/css/media-attr-non-matching-dynamic.html [ Crash ]
-crbug.com/591099 fast/css/media-query-in-supports-dynamic.html [ Crash ]
-crbug.com/591099 fast/css/media-query-zero-viewport-crash.html [ Crash ]
+crbug.com/591099 fast/css/media-attr-non-matching-dynamic.html [ Crash Pass ]
+crbug.com/591099 fast/css/media-query-in-supports-dynamic.html [ Crash Pass ]
+crbug.com/591099 fast/css/media-query-zero-viewport-crash.html [ Crash Pass ]
 crbug.com/591099 fast/css/media-rule-screenDepthPerComponent.html [ Failure ]
 crbug.com/591099 fast/css/min-device-aspect-ratio.html [ Failure ]
 crbug.com/591099 fast/css/min-max-width.html [ Failure ]
@@ -8270,16 +8278,16 @@
 crbug.com/591099 fast/css/pseudo-default-002.html [ Failure ]
 crbug.com/591099 fast/css/pseudo-default-003.html [ Failure ]
 crbug.com/591099 fast/css/pseudo-default-004.html [ Failure ]
-crbug.com/591099 fast/css/pseudo-default-checkbox-radio.html [ Crash ]
-crbug.com/591099 fast/css/pseudo-default-dynamic.html [ Crash ]
-crbug.com/591099 fast/css/pseudo-default-option.html [ Crash ]
+crbug.com/591099 fast/css/pseudo-default-checkbox-radio.html [ Crash Pass ]
+crbug.com/591099 fast/css/pseudo-default-dynamic.html [ Crash Pass ]
+crbug.com/591099 fast/css/pseudo-default-option.html [ Crash Pass ]
 crbug.com/591099 fast/css/pseudo-element-backdrop-hit-test.html [ Failure ]
 crbug.com/591099 fast/css/pseudo-element-line-break.html [ Failure ]
 crbug.com/591099 fast/css/pseudo-element-opagedxy-crash.html [ Failure ]
 crbug.com/591099 fast/css/pseudo-empty-adjacent-dynamic.html [ Failure ]
 crbug.com/591099 fast/css/pseudo-empty-display-none.html [ Failure ]
 crbug.com/591099 fast/css/pseudo-first-line-border-width.html [ Crash Failure ]
-crbug.com/591099 fast/css/pseudo-hover-active-display-none.html [ Crash ]
+crbug.com/591099 fast/css/pseudo-hover-active-display-none.html [ Crash Pass ]
 crbug.com/591099 fast/css/pseudo-in-range-invalid-value.html [ Crash Failure ]
 crbug.com/591099 fast/css/pseudo-in-range.html [ Crash Failure ]
 crbug.com/591099 fast/css/pseudo-invalid-001.html [ Crash Failure ]
@@ -8312,7 +8320,7 @@
 crbug.com/591099 fast/css/readonly-pseudoclass-opera-005.html [ Crash Failure ]
 crbug.com/591099 fast/css/recalc-inherit-001.html [ Failure ]
 crbug.com/591099 fast/css/recursive-delay-update-scroll.html [ Failure ]
-crbug.com/591099 fast/css/relative-positioned-block-crash.html [ Crash ]
+crbug.com/591099 fast/css/relative-positioned-block-crash.html [ Crash Pass ]
 crbug.com/591099 fast/css/relative-positioned-block-nested-with-inline-parent-dynamic-removed.html [ Failure ]
 crbug.com/591099 fast/css/relative-positioned-block-nested-with-inline-parent-dynamic.html [ Failure ]
 crbug.com/591099 fast/css/relative-positioned-block-nested-with-inline-parent-multiple-descendant-blocks-dynamic.html [ Failure ]
@@ -8334,8 +8342,8 @@
 crbug.com/591099 fast/css/remove-shorthand.html [ Crash Failure ]
 crbug.com/591099 fast/css/remove-style-after-insert-import-rule-crash.html [ Failure ]
 crbug.com/591099 fast/css/remove-stylesheet-from-shadow-form-crash.html [ Failure ]
-crbug.com/591099 fast/css/render-quote-crash.html [ Crash ]
-crbug.com/591099 fast/css/replaced-element-ignore-top-bottom.html [ Crash ]
+crbug.com/591099 fast/css/render-quote-crash.html [ Crash Pass ]
+crbug.com/591099 fast/css/replaced-element-ignore-top-bottom.html [ Crash Pass ]
 crbug.com/591099 fast/css/replaced-element-implicit-size.html [ Failure ]
 crbug.com/591099 fast/css/resize-corner-tracking-touch.html [ Crash Failure ]
 crbug.com/591099 fast/css/resize-corner-tracking-transformed-iframe.html [ Failure ]
@@ -8354,7 +8362,7 @@
 crbug.com/591099 fast/css/selector-set-attribute.html [ Failure ]
 crbug.com/591099 fast/css/selector-text-escape.html [ Crash Failure ]
 crbug.com/591099 fast/css/serialize-style-with-all-crash.html [ Failure ]
-crbug.com/591099 fast/css/shadow-dom-scope.html [ Crash ]
+crbug.com/591099 fast/css/shadow-dom-scope.html [ Crash Failure ]
 crbug.com/591099 fast/css/shadow-multiple.html [ Failure ]
 crbug.com/591099 fast/css/shadow-style-removed-out-of-document.html [ Failure ]
 crbug.com/591099 fast/css/sheet-collection-link.html [ Failure ]
@@ -8374,7 +8382,7 @@
 crbug.com/591099 fast/css/sticky/sticky-top-overflow-scroll-by-fragment.html [ Failure ]
 crbug.com/591099 fast/css/string-quote-binary.html [ Failure ]
 crbug.com/591099 fast/css/style-and-stylesheet-important.html [ Failure ]
-crbug.com/591099 fast/css/style-element-process-crash.html [ Crash ]
+crbug.com/591099 fast/css/style-element-process-crash.html [ Crash Pass ]
 crbug.com/591099 fast/css/style-outside-head.html [ Failure ]
 crbug.com/591099 fast/css/style-parsed-outside-head.html [ Failure ]
 crbug.com/591099 fast/css/style-sharing-inline-stylesheet.html [ Failure ]
@@ -8423,11 +8431,11 @@
 crbug.com/591099 fast/css/transition-shorthand-cssText.html [ Failure ]
 crbug.com/591099 fast/css/unicode-bidi-computed-value.html [ Failure ]
 crbug.com/591099 fast/css/universal-hover-quirk.html [ Failure ]
-crbug.com/591099 fast/css/unknown-pseudo-element-matching.html [ Crash ]
+crbug.com/591099 fast/css/unknown-pseudo-element-matching.html [ Crash Failure ]
 crbug.com/591099 fast/css/unused-data-url-fontface.html [ Failure ]
 crbug.com/591099 fast/css/uri-token-parsing.html [ Failure ]
 crbug.com/591099 fast/css/url-with-multi-byte-unicode-escape.html [ Failure ]
-crbug.com/591099 fast/css/variables/matched-properties-cache-is-disabled.html [ Crash ]
+crbug.com/591099 fast/css/variables/matched-properties-cache-is-disabled.html [ Crash Pass ]
 crbug.com/591099 fast/css/vertical-align-baseline-rowspan-003.htm [ Failure ]
 crbug.com/591099 fast/css/vertical-align-baseline-rowspan-004.htm [ Failure ]
 crbug.com/591099 fast/css/vertical-align-baseline-rowspan-005.htm [ Failure ]
@@ -8524,13 +8532,13 @@
 crbug.com/591099 fast/deprecated-flexbox/relpos-flex-item-with-percent-height-abspos-descendant.html [ Failure ]
 crbug.com/591099 fast/deprecated-flexbox/repaint-scrollbar.html [ Failure ]
 crbug.com/591099 fast/deprecated-flexbox/vertical-box-form-controls.html [ Failure ]
-crbug.com/591099 fast/dnd/dropEffect-for-file.html [ Crash ]
+crbug.com/591099 fast/dnd/dropEffect-for-file.html [ Crash Pass ]
 crbug.com/591099 fast/dnd/dropEffect-for-image.html [ Timeout ]
 crbug.com/591099 fast/doctypes/001.html [ Crash Failure ]
 crbug.com/591099 fast/doctypes/002.html [ Crash Failure ]
 crbug.com/591099 fast/doctypes/003.html [ Crash Failure ]
 crbug.com/591099 fast/doctypes/004.html [ Crash Failure ]
-crbug.com/591099 fast/doctypes/doctype-parsing.html [ Crash ]
+crbug.com/591099 fast/doctypes/doctype-parsing.html [ Crash Failure ]
 crbug.com/591099 fast/doctypes/xhtml-with-xhtmlmp-doctype.xhtml [ Failure ]
 crbug.com/591099 fast/doctypes/xhtml-with-xhtmlmp11-doctype.xhtml [ Failure ]
 crbug.com/591099 fast/doctypes/xhtml-with-xhtmlmp12-doctype.xhtml [ Failure ]
@@ -8559,7 +8567,7 @@
 crbug.com/591099 fast/dom/DOMImplementation/implementation-identity.html [ Crash Failure ]
 crbug.com/591099 fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-with-before-style.html [ Failure ]
 crbug.com/591099 fast/dom/Document/CaretRangeFromPoint/hittest-relative-to-viewport.html [ Failure ]
-crbug.com/591099 fast/dom/Document/CaretRangeFromPoint/replace-element.html [ Crash ]
+crbug.com/591099 fast/dom/Document/CaretRangeFromPoint/replace-element.html [ Crash Pass ]
 crbug.com/591099 fast/dom/Document/clone-node.html [ Failure ]
 crbug.com/591099 fast/dom/Document/createAttributeNS-namespace-err.html [ Crash Failure ]
 crbug.com/591099 fast/dom/Document/createElement-invalid-names.html [ Failure ]
@@ -8571,7 +8579,7 @@
 crbug.com/591099 fast/dom/Document/document-current-script-async.html [ Failure ]
 crbug.com/591099 fast/dom/Document/document-current-script.html [ Failure ]
 crbug.com/591099 fast/dom/Document/document-elementFromPoint-empty-document.html [ Failure ]
-crbug.com/591099 fast/dom/Document/document-elementFromPoint-on-option-element.html [ Crash ]
+crbug.com/591099 fast/dom/Document/document-elementFromPoint-on-option-element.html [ Crash Failure ]
 crbug.com/591099 fast/dom/Document/document-title-get.html [ Failure ]
 crbug.com/591099 fast/dom/Document/document-write-doctype.html [ Failure ]
 crbug.com/591099 fast/dom/Document/embeds-non-html.html [ Failure ]
@@ -8647,7 +8655,7 @@
 crbug.com/591099 fast/dom/HTMLButtonElement/change-type.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLButtonElement/value/getset.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLCollection/HTMLCollection-namedItem-invalidate-no-crash.html [ Failure ]
-crbug.com/591099 fast/dom/HTMLDialogElement-crash-style-recalc-after-dialog-close.html [ Crash ]
+crbug.com/591099 fast/dom/HTMLDialogElement-crash-style-recalc-after-dialog-close.html [ Crash Pass ]
 crbug.com/591099 fast/dom/HTMLDivElement/align/getset.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLDocument/active-element-frames.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLDocument/active-element-gets-unforcusable.html [ Failure ]
@@ -8655,15 +8663,15 @@
 crbug.com/591099 fast/dom/HTMLDocument/clone-node.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLDocument/document-open-return-value.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLDocument/document-plugins.html [ Failure ]
-crbug.com/591099 fast/dom/HTMLDocument/document-special-properties.html [ Crash ]
+crbug.com/591099 fast/dom/HTMLDocument/document-special-properties.html [ Crash Failure ]
 crbug.com/591099 fast/dom/HTMLDocument/document-write-variadic.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLDocument/frameless-location-bugzilla10837.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLDocument/named-item-multiple-match.html [ Failure ]
-crbug.com/591099 fast/dom/HTMLDocument/named-item-not-found.html [ Crash ]
+crbug.com/591099 fast/dom/HTMLDocument/named-item-not-found.html [ Crash Pass ]
 crbug.com/591099 fast/dom/HTMLDocument/named-item.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLDocument/object-by-name-or-id.html [ Crash Failure Timeout ]
-crbug.com/591099 fast/dom/HTMLDocument/object-by-name-unknown-child-element.html [ Crash ]
-crbug.com/591099 fast/dom/HTMLDocument/set-focus-on-valid-element.html [ Crash ]
+crbug.com/591099 fast/dom/HTMLDocument/object-by-name-unknown-child-element.html [ Crash Pass ]
+crbug.com/591099 fast/dom/HTMLDocument/set-focus-on-valid-element.html [ Crash Failure ]
 crbug.com/591099 fast/dom/HTMLDocument/title-get.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLDocument/title-set.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLDocument/url-getset.html [ Failure ]
@@ -8698,7 +8706,7 @@
 crbug.com/591099 fast/dom/HTMLElement/insertAdjacentHTML-errors.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLElement/iscontenteditable-designmodeon-allinherit.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLElement/iscontenteditable-designmodeon-ancestor.html [ Failure ]
-crbug.com/591099 fast/dom/HTMLElement/iscontenteditable-designmodeon-subframe.html [ Crash ]
+crbug.com/591099 fast/dom/HTMLElement/iscontenteditable-designmodeon-subframe.html [ Crash Failure ]
 crbug.com/591099 fast/dom/HTMLElement/iscontenteditable-designmodeon.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLElement/set-false.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLElement/set-inherit-parent-false.html [ Failure ]
@@ -8713,32 +8721,32 @@
 crbug.com/591099 fast/dom/HTMLFormElement/adopt-assertion.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLFormElement/associated-elements-after-index-assertion-fail1.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLFormElement/associated-elements-after-index-assertion-fail2.html [ Failure ]
-crbug.com/591099 fast/dom/HTMLFormElement/document-deactivation-callback-crash.html [ Crash ]
+crbug.com/591099 fast/dom/HTMLFormElement/document-deactivation-callback-crash.html [ Crash Failure ]
 crbug.com/591099 fast/dom/HTMLFormElement/elements-not-in-document.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLFormElement/htmlformelement-indexed-getter.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLHrElement/hr-color-noshade-attribute.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLHtmlElement/set-version.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLImageElement/constructor-mutation-event-dispatch.html [ Failure ]
-crbug.com/591099 fast/dom/HTMLImageElement/fallback-image-moved-across-documents.html [ Crash ]
+crbug.com/591099 fast/dom/HTMLImageElement/fallback-image-moved-across-documents.html [ Crash Pass ]
 crbug.com/591099 fast/dom/HTMLImageElement/image-alt-text.html [ Crash Failure ]
 crbug.com/591099 fast/dom/HTMLImageElement/image-crossOrigin.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLImageElement/image-dynamic-width.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLImageElement/image-innerHTML.html [ Failure ]
-crbug.com/591099 fast/dom/HTMLImageElement/image-load-cross-document.html [ Crash ]
+crbug.com/591099 fast/dom/HTMLImageElement/image-load-cross-document.html [ Crash Failure ]
 crbug.com/591099 fast/dom/HTMLImageElement/image-longdesc-absolute-url.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLImageElement/image-lowsrc-getset.html [ Failure ]
-crbug.com/591099 fast/dom/HTMLImageElement/image-natural-width-height-svg.html [ Crash ]
-crbug.com/591099 fast/dom/HTMLImageElement/image-sizes-1x.html [ Crash ]
+crbug.com/591099 fast/dom/HTMLImageElement/image-natural-width-height-svg.html [ Crash Pass ]
+crbug.com/591099 fast/dom/HTMLImageElement/image-sizes-1x.html [ Crash Pass ]
 crbug.com/591099 fast/dom/HTMLImageElement/image-src-absolute-url.html [ Failure ]
-crbug.com/591099 fast/dom/HTMLImageElement/image-srcset-1x.html [ Crash ]
-crbug.com/591099 fast/dom/HTMLImageElement/image-srcset-duplicate-elimination.html [ Crash ]
+crbug.com/591099 fast/dom/HTMLImageElement/image-srcset-1x.html [ Crash Pass ]
+crbug.com/591099 fast/dom/HTMLImageElement/image-srcset-duplicate-elimination.html [ Crash Pass ]
 crbug.com/591099 fast/dom/HTMLImageElement/image-srcset-invalid-url-no-crash.html [ Crash Failure ]
-crbug.com/591099 fast/dom/HTMLImageElement/image-srcset-react-to-media-changes-when-image-not-changed.html [ Crash ]
-crbug.com/591099 fast/dom/HTMLImageElement/image-srcset-react-to-media-changes-when-viewport-downsized.html [ Crash ]
-crbug.com/591099 fast/dom/HTMLImageElement/image-srcset-w-onerror.html [ Crash Failure ]
+crbug.com/591099 fast/dom/HTMLImageElement/image-srcset-react-to-media-changes-when-image-not-changed.html [ Crash Pass ]
+crbug.com/591099 fast/dom/HTMLImageElement/image-srcset-react-to-media-changes-when-viewport-downsized.html [ Crash Pass ]
+crbug.com/591099 fast/dom/HTMLImageElement/image-srcset-w-onerror.html [ Crash Failure Pass ]
 crbug.com/591099 fast/dom/HTMLImageElement/image-without-renderer-width.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLImageElement/parse-src.html [ Failure ]
-crbug.com/591099 fast/dom/HTMLImageElement/sizes-changed-intrinsic-size-update.html [ Crash ]
+crbug.com/591099 fast/dom/HTMLImageElement/sizes-changed-intrinsic-size-update.html [ Crash Pass ]
 crbug.com/591099 fast/dom/HTMLInputElement/border-attribute-crash.html [ Crash Failure ]
 crbug.com/591099 fast/dom/HTMLInputElement/clone-input-checked.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLInputElement/cloned-input-checked-state.html [ Failure ]
@@ -8776,8 +8784,8 @@
 crbug.com/591099 fast/dom/HTMLLinkElement/programmatically-add-link-with-onload-handler.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLLinkElement/resolve-url-on-insertion.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLMeterElement/meter-boundary-values.html [ Crash Failure ]
-crbug.com/591099 fast/dom/HTMLMeterElement/meter-element-crash.html [ Crash ]
-crbug.com/591099 fast/dom/HTMLMeterElement/meter-element-markup.html [ Crash ]
+crbug.com/591099 fast/dom/HTMLMeterElement/meter-element-crash.html [ Crash Pass ]
+crbug.com/591099 fast/dom/HTMLMeterElement/meter-element-markup.html [ Crash Pass ]
 crbug.com/591099 fast/dom/HTMLMeterElement/meter-element-repaint-on-update-value.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLMeterElement/meter-element-with-child-crash.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLMeterElement/meter-element.html [ Failure ]
@@ -8786,10 +8794,10 @@
 crbug.com/591099 fast/dom/HTMLMeterElement/meter-styles-changing-pseudo.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLMeterElement/meter-styles.html [ Crash Failure ]
 crbug.com/591099 fast/dom/HTMLMeterElement/set-meter-properties.html [ Failure ]
-crbug.com/591099 fast/dom/HTMLObjectElement/HTMLObject-contentWindow-query.html [ Crash ]
-crbug.com/591099 fast/dom/HTMLObjectElement/children-changed.html [ Crash ]
-crbug.com/591099 fast/dom/HTMLObjectElement/fallback-content-behaviour.html [ Crash ]
-crbug.com/591099 fast/dom/HTMLObjectElement/form/nested-form-element.html [ Crash ]
+crbug.com/591099 fast/dom/HTMLObjectElement/HTMLObject-contentWindow-query.html [ Crash Pass ]
+crbug.com/591099 fast/dom/HTMLObjectElement/children-changed.html [ Crash Pass ]
+crbug.com/591099 fast/dom/HTMLObjectElement/fallback-content-behaviour.html [ Crash Failure ]
+crbug.com/591099 fast/dom/HTMLObjectElement/form/nested-form-element.html [ Crash Failure ]
 crbug.com/591099 fast/dom/HTMLObjectElement/form/test1.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLObjectElement/update-data.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLObjectElement/vspace-hspace-as-number.html [ Failure ]
@@ -8860,7 +8868,7 @@
 crbug.com/591099 fast/dom/MutationObserver/observe-attributes.html [ Failure Timeout ]
 crbug.com/591099 fast/dom/MutationObserver/observe-characterdata.html [ Failure ]
 crbug.com/591099 fast/dom/MutationObserver/observe-childList.html [ Failure ]
-crbug.com/591099 fast/dom/MutationObserver/observe-element-resize.html [ Crash ]
+crbug.com/591099 fast/dom/MutationObserver/observe-element-resize.html [ Crash Pass ]
 crbug.com/591099 fast/dom/MutationObserver/observe-exceptions.html [ Failure ]
 crbug.com/591099 fast/dom/MutationObserver/observe-options-character-data.html [ Failure ]
 crbug.com/591099 fast/dom/MutationObserver/observe-subtree.html [ Failure ]
@@ -8880,7 +8888,7 @@
 crbug.com/591099 fast/dom/Node/initial-values.html [ Failure ]
 crbug.com/591099 fast/dom/Node/isEqualNode.html [ Failure ]
 crbug.com/591099 fast/dom/Node/isSupported.html [ Failure ]
-crbug.com/591099 fast/dom/Node/mutation-blur.html [ Crash ]
+crbug.com/591099 fast/dom/Node/mutation-blur.html [ Crash Failure ]
 crbug.com/591099 fast/dom/Node/normalize-with-cdata.html [ Failure ]
 crbug.com/591099 fast/dom/NodeIterator/detach-no-op.html [ Failure ]
 crbug.com/591099 fast/dom/NodeList/5725058-crash-scenario-1.html [ Failure ]
@@ -8893,7 +8901,7 @@
 crbug.com/591099 fast/dom/NodeList/nodelist-item-call-as-function.html [ Failure ]
 crbug.com/591099 fast/dom/NodeList/nodelist-item-with-index.html [ Failure ]
 crbug.com/591099 fast/dom/NodeList/nodelist-item-with-name.html [ Failure ]
-crbug.com/591099 fast/dom/NodeList/nodelist-iterable.html [ Crash ]
+crbug.com/591099 fast/dom/NodeList/nodelist-iterable.html [ Crash Pass ]
 crbug.com/591099 fast/dom/NodeList/nodelist-namespace-invalidation.html [ Failure ]
 crbug.com/591099 fast/dom/Range-insertNode-crash.html [ Failure ]
 crbug.com/591099 fast/dom/Range/13000.html [ Failure ]
@@ -8922,7 +8930,7 @@
 crbug.com/591099 fast/dom/Range/deleted-range-endpoints.html [ Failure ]
 crbug.com/591099 fast/dom/Range/detach-no-op.html [ Failure ]
 crbug.com/591099 fast/dom/Range/getClientRects-leading-trailing-whitespaces.html [ Failure ]
-crbug.com/591099 fast/dom/Range/getClientRects.html [ Crash ]
+crbug.com/591099 fast/dom/Range/getClientRects.html [ Crash Failure ]
 crbug.com/591099 fast/dom/Range/insertNode-empty-fragment-crash.html [ Failure ]
 crbug.com/591099 fast/dom/Range/range-clone-empty.html [ Failure ]
 crbug.com/591099 fast/dom/Range/range-constructor.html [ Failure ]
@@ -8961,8 +8969,8 @@
 crbug.com/591099 fast/dom/SelectorAPI/viewless-document.html [ Failure ]
 crbug.com/591099 fast/dom/StyleSheet/css-medialist-item.html [ Failure ]
 crbug.com/591099 fast/dom/StyleSheet/detached-parent-rule-without-wrapper.html [ Failure ]
-crbug.com/591099 fast/dom/StyleSheet/detached-sheet-owner-node-link.html [ Crash ]
-crbug.com/591099 fast/dom/StyleSheet/detached-sheet-owner-node.html [ Crash ]
+crbug.com/591099 fast/dom/StyleSheet/detached-sheet-owner-node-link.html [ Crash Failure ]
+crbug.com/591099 fast/dom/StyleSheet/detached-sheet-owner-node.html [ Crash Failure ]
 crbug.com/591099 fast/dom/StyleSheet/detached-style-2.html [ Failure ]
 crbug.com/591099 fast/dom/StyleSheet/detached-style-pi-2.xhtml [ Failure ]
 crbug.com/591099 fast/dom/StyleSheet/detached-style-pi.xhtml [ Failure ]
@@ -9010,25 +9018,25 @@
 crbug.com/591099 fast/dom/Window/getMatchedCSSRules-with-pseudo-elements.html [ Failure ]
 crbug.com/591099 fast/dom/Window/global-opener-function.html [ Crash Failure ]
 crbug.com/591099 fast/dom/Window/invalid-protocol.html [ Failure ]
-crbug.com/591099 fast/dom/Window/lookup-behavior.html [ Crash ]
+crbug.com/591099 fast/dom/Window/lookup-behavior.html [ Crash Pass ]
 crbug.com/591099 fast/dom/Window/mozilla-focus-blur.html [ Failure ]
 crbug.com/591099 fast/dom/Window/name-and-opener-on-detached-window.html [ Failure ]
 crbug.com/591099 fast/dom/Window/navigated-window-properties.html [ Failure ]
 crbug.com/591099 fast/dom/Window/new-window-opener.html [ Failure ]
 crbug.com/591099 fast/dom/Window/open-after-frame-detached.html [ Failure ]
-crbug.com/591099 fast/dom/Window/open-as-popup-vs-tab.html [ Crash ]
+crbug.com/591099 fast/dom/Window/open-as-popup-vs-tab.html [ Crash Pass ]
 crbug.com/591099 fast/dom/Window/open-existing-pop-up-blocking.html [ Failure ]
 crbug.com/591099 fast/dom/Window/open-invalid-arguments.html [ Failure ]
 crbug.com/591099 fast/dom/Window/post-message-crash.html [ Failure ]
-crbug.com/591099 fast/dom/Window/post-message-detach-in-handler.html [ Crash ]
+crbug.com/591099 fast/dom/Window/post-message-detach-in-handler.html [ Crash Failure ]
 crbug.com/591099 fast/dom/Window/post-message-to-self.html [ Failure ]
 crbug.com/591099 fast/dom/Window/property-access-in-closure-after-navigation.html [ Failure ]
 crbug.com/591099 fast/dom/Window/property-access-on-cached-properties-after-frame-navigated.html [ Failure ]
-crbug.com/591099 fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced.html [ Crash ]
-crbug.com/591099 fast/dom/Window/property-access-on-cached-properties-after-frame-removed.html [ Crash ]
+crbug.com/591099 fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced.html [ Crash Failure ]
+crbug.com/591099 fast/dom/Window/property-access-on-cached-properties-after-frame-removed.html [ Crash Failure ]
 crbug.com/591099 fast/dom/Window/property-access-on-cached-window-after-frame-navigated.html [ Timeout ]
-crbug.com/591099 fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced.html [ Crash ]
-crbug.com/591099 fast/dom/Window/property-access-on-cached-window-after-frame-removed.html [ Crash ]
+crbug.com/591099 fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced.html [ Crash Failure ]
+crbug.com/591099 fast/dom/Window/property-access-on-cached-window-after-frame-removed.html [ Crash Failure ]
 crbug.com/591099 fast/dom/Window/querySelectorAll-with-pseudo-elements.html [ Failure ]
 crbug.com/591099 fast/dom/Window/remove-timeout-crash.html [ Failure ]
 crbug.com/591099 fast/dom/Window/replaceable.html [ Failure ]
@@ -9053,7 +9061,7 @@
 crbug.com/591099 fast/dom/Window/window-lookup-precedence.html [ Crash Timeout ]
 crbug.com/591099 fast/dom/Window/window-object-cross-frame-calls.html [ Failure ]
 crbug.com/591099 fast/dom/Window/window-onFocus.html [ Crash Failure ]
-crbug.com/591099 fast/dom/Window/window-open-no-multiple-windows-from-iframe.html [ Crash ]
+crbug.com/591099 fast/dom/Window/window-open-no-multiple-windows-from-iframe.html [ Crash Pass ]
 crbug.com/591099 fast/dom/Window/window-open-pending-url.html [ Failure ]
 crbug.com/591099 fast/dom/Window/window-open-with-different-active-and-opener-windows.html [ Failure ]
 crbug.com/591099 fast/dom/Window/window-postmessage-args.html [ Failure ]
@@ -9091,13 +9099,13 @@
 crbug.com/591099 fast/dom/blur-contenteditable.html [ Failure ]
 crbug.com/591099 fast/dom/boolean-attribute-reflection.html [ Failure ]
 crbug.com/591099 fast/dom/call-a-constructor-as-a-function.html [ Failure ]
-crbug.com/591099 fast/dom/canvas-fallback-focus-crash.html [ Crash ]
+crbug.com/591099 fast/dom/canvas-fallback-focus-crash.html [ Crash Pass ]
 crbug.com/591099 fast/dom/canvasContext2d-element-attribute-js-null.html [ Failure ]
 crbug.com/591099 fast/dom/characterdata-api-arguments.html [ Failure ]
 crbug.com/591099 fast/dom/children-nodes.html [ Failure ]
 crbug.com/591099 fast/dom/class-all-whitespace.html [ Failure ]
 crbug.com/591099 fast/dom/click-method-on-html-element.html [ Failure ]
-crbug.com/591099 fast/dom/clientWidthAfterDocumentIsRemoved.html [ Crash ]
+crbug.com/591099 fast/dom/clientWidthAfterDocumentIsRemoved.html [ Crash Failure ]
 crbug.com/591099 fast/dom/clone-contents-0-end-offset.html [ Failure ]
 crbug.com/591099 fast/dom/clone-node-dynamic-style.html [ Failure ]
 crbug.com/591099 fast/dom/clone-node-load-event-crash.html [ Failure Pass ]
@@ -9116,7 +9124,7 @@
 crbug.com/591099 fast/dom/console-log-stack-overflow.html [ Failure ]
 crbug.com/591099 fast/dom/constants.html [ Crash Failure ]
 crbug.com/591099 fast/dom/constructed-objects-prototypes.html [ Failure ]
-crbug.com/591099 fast/dom/constructor-in-removed-frame.html [ Crash ]
+crbug.com/591099 fast/dom/constructor-in-removed-frame.html [ Crash Pass ]
 crbug.com/591099 fast/dom/constructor-proto.html [ Failure ]
 crbug.com/591099 fast/dom/constructors-cached.html [ Failure ]
 crbug.com/591099 fast/dom/constructors-overriding.html [ Failure ]
@@ -9126,7 +9134,7 @@
 crbug.com/591099 fast/dom/createDocumentType.html [ Failure ]
 crbug.com/591099 fast/dom/createElementNS-empty-namespace.html [ Failure ]
 crbug.com/591099 fast/dom/createElementNS-namespace-errors.html [ Failure ]
-crbug.com/591099 fast/dom/cross-frame-accessor-throw.html [ Crash ]
+crbug.com/591099 fast/dom/cross-frame-accessor-throw.html [ Crash Pass ]
 crbug.com/591099 fast/dom/cross-frame-node-prototype.html [ Failure ]
 crbug.com/591099 fast/dom/css-cached-import-rule.html [ Failure ]
 crbug.com/591099 fast/dom/css-element-attribute-js-null.html [ Failure ]
@@ -9143,12 +9151,12 @@
 crbug.com/591099 fast/dom/css-set-property-exception.html [ Crash Failure ]
 crbug.com/591099 fast/dom/css-shorthand-common-value.html [ Failure ]
 crbug.com/591099 fast/dom/css-stylesheet-candidate-ordering.html [ Failure ]
-crbug.com/591099 fast/dom/cssTarget-crash.html [ Crash ]
-crbug.com/591099 fast/dom/custom/callback-context.html [ Crash ]
+crbug.com/591099 fast/dom/cssTarget-crash.html [ Crash Pass ]
+crbug.com/591099 fast/dom/custom/callback-context.html [ Crash Pass ]
 crbug.com/591099 fast/dom/custom/callback-timing.html [ Failure ]
 crbug.com/591099 fast/dom/custom/constructor-calls-created-synchronously.html [ Failure ]
-crbug.com/591099 fast/dom/custom/crash-without-dom-wrapper.html [ Crash ]
-crbug.com/591099 fast/dom/custom/created-callback.html [ Crash ]
+crbug.com/591099 fast/dom/custom/crash-without-dom-wrapper.html [ Crash Pass ]
+crbug.com/591099 fast/dom/custom/created-callback.html [ Crash Pass ]
 crbug.com/591099 fast/dom/custom/document-register-basic.html [ Failure ]
 crbug.com/591099 fast/dom/custom/document-register-namespace.html [ Failure ]
 crbug.com/591099 fast/dom/custom/document-register-reentrant-null-constructor.html [ Failure ]
@@ -9161,7 +9169,7 @@
 crbug.com/591099 fast/dom/custom/exception-from-constructor.html [ Failure ]
 crbug.com/591099 fast/dom/custom/frameElement-crash.html [ Failure ]
 crbug.com/591099 fast/dom/custom/html-element-type-extension-assert.html [ Failure ]
-crbug.com/591099 fast/dom/custom/imports-custom-element-abort.html [ Crash ]
+crbug.com/591099 fast/dom/custom/imports-custom-element-abort.html [ Crash Pass ]
 crbug.com/591099 fast/dom/custom/isolated-world.html [ Failure ]
 crbug.com/591099 fast/dom/custom/lifecycle-created-createElement-reentrancy.html [ Failure ]
 crbug.com/591099 fast/dom/custom/lifecycle-created-creation-api.html [ Failure ]
@@ -9169,18 +9177,18 @@
 crbug.com/591099 fast/dom/custom/lifecycle-created-parser-script.html [ Failure ]
 crbug.com/591099 fast/dom/custom/lifecycle-created-paste.html [ Failure ]
 crbug.com/591099 fast/dom/custom/prerender-insert-after-stop.html [ Failure ]
-crbug.com/591099 fast/dom/custom/registration-context-delete-during-attribute-changed-retrieval.html [ Crash ]
-crbug.com/591099 fast/dom/custom/registration-context-delete-during-attribute-changed.html [ Crash ]
-crbug.com/591099 fast/dom/custom/registration-context-delete-during-callback-recursion.html [ Crash ]
-crbug.com/591099 fast/dom/custom/registration-context-delete-during-register-base-constructor-retrieval.html [ Crash ]
-crbug.com/591099 fast/dom/custom/registration-context-delete-during-register-created-retrieval.html [ Crash ]
-crbug.com/591099 fast/dom/custom/registration-context-delete-during-register-extends-retrieval-and-throw.html [ Crash ]
-crbug.com/591099 fast/dom/custom/registration-context-delete-during-register-extends-retrieval.html [ Crash ]
-crbug.com/591099 fast/dom/custom/registration-context-delete-during-register-prototype-retrieval-and-throw.html [ Crash ]
-crbug.com/591099 fast/dom/custom/registration-context-delete-during-register-prototype-retrieval.html [ Crash ]
-crbug.com/591099 fast/dom/custom/registration-context-delete-during-upgrade.html [ Crash ]
-crbug.com/591099 fast/dom/custom/registration-context-delete-then-register.html [ Crash ]
-crbug.com/591099 fast/dom/custom/registration-context-sharing.html [ Crash ]
+crbug.com/591099 fast/dom/custom/registration-context-delete-during-attribute-changed-retrieval.html [ Crash Failure ]
+crbug.com/591099 fast/dom/custom/registration-context-delete-during-attribute-changed.html [ Crash Failure ]
+crbug.com/591099 fast/dom/custom/registration-context-delete-during-callback-recursion.html [ Crash Failure ]
+crbug.com/591099 fast/dom/custom/registration-context-delete-during-register-base-constructor-retrieval.html [ Crash Failure ]
+crbug.com/591099 fast/dom/custom/registration-context-delete-during-register-created-retrieval.html [ Crash Failure ]
+crbug.com/591099 fast/dom/custom/registration-context-delete-during-register-extends-retrieval-and-throw.html [ Crash Failure ]
+crbug.com/591099 fast/dom/custom/registration-context-delete-during-register-extends-retrieval.html [ Crash Failure ]
+crbug.com/591099 fast/dom/custom/registration-context-delete-during-register-prototype-retrieval-and-throw.html [ Crash Failure ]
+crbug.com/591099 fast/dom/custom/registration-context-delete-during-register-prototype-retrieval.html [ Crash Failure ]
+crbug.com/591099 fast/dom/custom/registration-context-delete-during-upgrade.html [ Crash Failure ]
+crbug.com/591099 fast/dom/custom/registration-context-delete-then-register.html [ Crash Failure ]
+crbug.com/591099 fast/dom/custom/registration-context-sharing.html [ Crash Pass ]
 crbug.com/591099 fast/dom/custom/reparent-unwrapped-custom-element-crash.html [ Crash Pass ]
 crbug.com/591099 fast/dom/custom/type-extension-undo-assert.html [ Failure ]
 crbug.com/591099 fast/dom/custom/unresolved-pseudoclass.html [ Failure ]
@@ -9188,7 +9196,7 @@
 crbug.com/591099 fast/dom/custom/upgrade-candidate-remove-crash.html [ Failure ]
 crbug.com/591099 fast/dom/dataset-gc.html [ Failure ]
 crbug.com/591099 fast/dom/dataset-xhtml.xhtml [ Crash Failure ]
-crbug.com/591099 fast/dom/defaultView-on-detached-document.html [ Crash ]
+crbug.com/591099 fast/dom/defaultView-on-detached-document.html [ Crash Failure ]
 crbug.com/591099 fast/dom/defaultView.html [ Failure ]
 crbug.com/591099 fast/dom/dir-auto-insert-text-invalidation.html [ Failure ]
 crbug.com/591099 fast/dom/dir-no-body.html [ Failure ]
@@ -9212,12 +9220,12 @@
 crbug.com/591099 fast/dom/dom-add-optionelement.html [ Failure ]
 crbug.com/591099 fast/dom/dom-constructors.html [ Failure ]
 crbug.com/591099 fast/dom/dom-instanceof.html [ Failure ]
-crbug.com/591099 fast/dom/domListEnumeration.html [ Crash ]
+crbug.com/591099 fast/dom/domListEnumeration.html [ Crash Failure ]
 crbug.com/591099 fast/dom/domstring-attribute-reflection.html [ Timeout ]
 crbug.com/591099 fast/dom/domtimestamp-is-number.html [ Failure ]
 crbug.com/591099 fast/dom/element-attribute-js-null.html [ Timeout ]
 crbug.com/591099 fast/dom/element-bounding-client-rect-relative-to-viewport.html [ Failure ]
-crbug.com/591099 fast/dom/elementFromPoint-relative-to-viewport.html [ Crash ]
+crbug.com/591099 fast/dom/elementFromPoint-relative-to-viewport.html [ Crash Failure ]
 crbug.com/591099 fast/dom/elementsFromPoint/elementsFromPoint-iframes.html [ Failure ]
 crbug.com/591099 fast/dom/elementsFromPoint/elementsFromPoint-svg.html [ Failure ]
 crbug.com/591099 fast/dom/elementsFromPoint/elementsFromPoint-table.html [ Failure ]
@@ -9233,8 +9241,8 @@
 crbug.com/591099 fast/dom/exception-no-frame-timeout-crash.html [ Failure ]
 crbug.com/591099 fast/dom/firstline-fixed-crash.html [ Failure ]
 crbug.com/591099 fast/dom/focus-contenteditable.html [ Failure ]
-crbug.com/591099 fast/dom/focus-navigation-in-plugin.html [ Crash ]
-crbug.com/591099 fast/dom/focus-on-hidden-object.html [ Crash ]
+crbug.com/591099 fast/dom/focus-navigation-in-plugin.html [ Crash Pass ]
+crbug.com/591099 fast/dom/focus-on-hidden-object.html [ Crash Pass ]
 crbug.com/591099 fast/dom/forced-layout-only-in-document.html [ Failure ]
 crbug.com/591099 fast/dom/fragment-activation-focuses-target.html [ Crash Failure ]
 crbug.com/591099 fast/dom/frameElement-accessor-context.html [ Failure ]
@@ -9261,7 +9269,7 @@
 crbug.com/591099 fast/dom/getElementById-consistency5.html [ Failure ]
 crbug.com/591099 fast/dom/getElementsByClassName/dumpNodeList.html [ Crash Failure ]
 crbug.com/591099 fast/dom/getElementsByClassName/non-styled-elements.html [ Failure ]
-crbug.com/591099 fast/dom/getelementsbyname-invalidation-cache.html [ Crash ]
+crbug.com/591099 fast/dom/getelementsbyname-invalidation-cache.html [ Crash Failure ]
 crbug.com/591099 fast/dom/getter-on-window-object2.html [ Failure ]
 crbug.com/591099 fast/dom/global-constructors.html [ Failure ]
 crbug.com/591099 fast/dom/global-event-handlers.html [ Pass Timeout ]
@@ -9270,7 +9278,7 @@
 crbug.com/591099 fast/dom/horizontal-scrollbar-in-rtl.html [ Crash Failure ]
 crbug.com/591099 fast/dom/hover-after-dom-delete-child-invisible-cursor.html [ Failure ]
 crbug.com/591099 fast/dom/hover-after-dom-delete.html [ Failure ]
-crbug.com/591099 fast/dom/hover-node-refcnt-asan-crash.html [ Crash ]
+crbug.com/591099 fast/dom/hover-node-refcnt-asan-crash.html [ Crash Pass ]
 crbug.com/591099 fast/dom/html-collections-named-getter-mandatory-arg.html [ Failure ]
 crbug.com/591099 fast/dom/html-collections-named-getter.html [ Failure ]
 crbug.com/591099 fast/dom/html-options-collection-lifetime.html [ Failure ]
@@ -9284,7 +9292,7 @@
 crbug.com/591099 fast/dom/htmlcollection-protects-base.html [ Failure ]
 crbug.com/591099 fast/dom/htmlcollection-selectedOptions-namedItem-crash.html [ Failure ]
 crbug.com/591099 fast/dom/htmlformcontrolscollection-enumerated-properties.html [ Failure ]
-crbug.com/591099 fast/dom/htmlformcontrolscollection-no-img.html [ Crash ]
+crbug.com/591099 fast/dom/htmlformcontrolscollection-no-img.html [ Crash Pass ]
 crbug.com/591099 fast/dom/htmloptionscollection-enumerated-properties.html [ Failure ]
 crbug.com/591099 fast/dom/icon-size-property.html [ Failure ]
 crbug.com/591099 fast/dom/idl-dictionary-unittest.html [ Failure ]
@@ -9301,11 +9309,11 @@
 crbug.com/591099 fast/dom/importNodeHTML.html [ Failure ]
 crbug.com/591099 fast/dom/importNodeXML.xhtml [ Failure Pass ]
 crbug.com/591099 fast/dom/incompatible-operations.html [ Failure ]
-crbug.com/591099 fast/dom/inert/inert-does-not-match-disabled-selector.html [ Crash ]
-crbug.com/591099 fast/dom/inert/inert-focus-in-frames.html [ Crash ]
-crbug.com/591099 fast/dom/inert/inert-inlines.html [ Crash ]
-crbug.com/591099 fast/dom/inert/inert-label-focus.html [ Crash ]
-crbug.com/591099 fast/dom/inert/inert-node-is-unfocusable.html [ Crash ]
+crbug.com/591099 fast/dom/inert/inert-does-not-match-disabled-selector.html [ Crash Pass ]
+crbug.com/591099 fast/dom/inert/inert-focus-in-frames.html [ Crash Pass ]
+crbug.com/591099 fast/dom/inert/inert-inlines.html [ Crash Pass ]
+crbug.com/591099 fast/dom/inert/inert-label-focus.html [ Crash Pass ]
+crbug.com/591099 fast/dom/inert/inert-node-is-unfocusable.html [ Crash Pass ]
 crbug.com/591099 fast/dom/inline-event-attributes-crash.html [ Failure ]
 crbug.com/591099 fast/dom/inline-event-attributes-event-param-name.html [ Failure ]
 crbug.com/591099 fast/dom/inline-event-attributes-lookup-removed-form.html [ Failure ]
@@ -9314,12 +9322,12 @@
 crbug.com/591099 fast/dom/inline-event-attributes-moved.html [ Failure ]
 crbug.com/591099 fast/dom/inline-event-attributes-release.html [ Failure ]
 crbug.com/591099 fast/dom/inner-text-001.html [ Crash Failure ]
-crbug.com/591099 fast/dom/inner-text-first-letter.html [ Crash ]
+crbug.com/591099 fast/dom/inner-text-first-letter.html [ Crash Failure ]
 crbug.com/591099 fast/dom/inner-text-rtl.html [ Failure ]
 crbug.com/591099 fast/dom/inner-text.html [ Crash Failure ]
-crbug.com/591099 fast/dom/insertedIntoDocument-child.html [ Crash ]
+crbug.com/591099 fast/dom/insertedIntoDocument-child.html [ Crash Failure ]
 crbug.com/591099 fast/dom/insertedIntoDocument-no-crash.html [ Failure ]
-crbug.com/591099 fast/dom/insertedIntoDocument-sibling.html [ Crash ]
+crbug.com/591099 fast/dom/insertedIntoDocument-sibling.html [ Crash Failure ]
 crbug.com/591099 fast/dom/interface-object-proto.html [ Failure ]
 crbug.com/591099 fast/dom/isEqualNode-after-removeAttribute.html [ Failure ]
 crbug.com/591099 fast/dom/javascript-backslash.html [ Crash Failure ]
@@ -9337,7 +9345,7 @@
 crbug.com/591099 fast/dom/navigator-maxTouchPoints.html [ Failure ]
 crbug.com/591099 fast/dom/navigator-userAgent.html [ Failure ]
 crbug.com/591099 fast/dom/navigator-vendorSub.html [ Failure ]
-crbug.com/591099 fast/dom/navigator-with-content-detached-no-crash.html [ Crash ]
+crbug.com/591099 fast/dom/navigator-with-content-detached-no-crash.html [ Crash Failure ]
 crbug.com/591099 fast/dom/no-elements.html [ Crash Failure ]
 crbug.com/591099 fast/dom/node-childNodes-idempotence.html [ Failure ]
 crbug.com/591099 fast/dom/node-filter-detached-iframe-crash.html [ Failure ]
@@ -9362,10 +9370,10 @@
 crbug.com/591099 fast/dom/nodesFromRect/nodesFromRect-table.html [ Failure ]
 crbug.com/591099 fast/dom/non-numeric-values-numeric-parameters.html [ Failure ]
 crbug.com/591099 fast/dom/objc-big-method-name.html [ Failure ]
-crbug.com/591099 fast/dom/object-plugin-hides-properties.html [ Crash ]
+crbug.com/591099 fast/dom/object-plugin-hides-properties.html [ Crash Failure ]
 crbug.com/591099 fast/dom/offset-parent-positioned-and-inline.html [ Failure Pass ]
 crbug.com/591099 fast/dom/onerror-img.html [ Failure ]
-crbug.com/591099 fast/dom/onload-open.html [ Crash ]
+crbug.com/591099 fast/dom/onload-open.html [ Crash Failure ]
 crbug.com/591099 fast/dom/open-and-close-by-DOM.html [ Failure ]
 crbug.com/591099 fast/dom/option-properties.html [ Failure ]
 crbug.com/591099 fast/dom/outerText-no-element.html [ Failure ]
@@ -9398,7 +9406,7 @@
 crbug.com/591099 fast/dom/script-styled-size.html [ Failure ]
 crbug.com/591099 fast/dom/scroll-reveal-left-overflow.html [ Failure ]
 crbug.com/591099 fast/dom/scroll-reveal-top-overflow.html [ Failure ]
-crbug.com/591099 fast/dom/search-shadow-host-crash.html [ Crash ]
+crbug.com/591099 fast/dom/search-shadow-host-crash.html [ Crash Pass ]
 crbug.com/591099 fast/dom/serialize-attribute.xhtml [ Failure ]
 crbug.com/591099 fast/dom/set-innerHTML.xhtml [ Crash Failure ]
 crbug.com/591099 fast/dom/setAttribute-using-initial-input-value.html [ Failure ]
@@ -9441,16 +9449,16 @@
 crbug.com/591099 fast/dom/shadow/drag-to-meter-in-shadow-crash.html [ Failure ]
 crbug.com/591099 fast/dom/shadow/elements-in-frameless-document.html [ Failure ]
 crbug.com/591099 fast/dom/shadow/event-path-after-deleting-tree-scope-crash.html [ Failure ]
-crbug.com/591099 fast/dom/shadow/event-path-after-iframe-removed.html [ Crash ]
-crbug.com/591099 fast/dom/shadow/event-path-load.html [ Crash ]
-crbug.com/591099 fast/dom/shadow/event-pseudo.html [ Crash ]
+crbug.com/591099 fast/dom/shadow/event-path-after-iframe-removed.html [ Crash Pass ]
+crbug.com/591099 fast/dom/shadow/event-path-load.html [ Crash Pass ]
+crbug.com/591099 fast/dom/shadow/event-pseudo.html [ Crash Pass ]
 crbug.com/591099 fast/dom/shadow/events-stopped-at-shadow-boundary.html [ Failure ]
-crbug.com/591099 fast/dom/shadow/exposed-object-within-shadow.html [ Crash ]
+crbug.com/591099 fast/dom/shadow/exposed-object-within-shadow.html [ Crash Pass ]
 crbug.com/591099 fast/dom/shadow/flat-tree-traversal-shadow-reprojection.html [ Failure ]
 crbug.com/591099 fast/dom/shadow/flat-tree-traversal.html [ Failure ]
 crbug.com/591099 fast/dom/shadow/focus-navigation-negative-tabindex.html [ Failure ]
 crbug.com/591099 fast/dom/shadow/focus-navigation-skips-non-focusable-shadow-in-iframe.html [ Failure ]
-crbug.com/591099 fast/dom/shadow/focus-navigation-with-distributed-nodes.html [ Crash ]
+crbug.com/591099 fast/dom/shadow/focus-navigation-with-distributed-nodes.html [ Crash Failure ]
 crbug.com/591099 fast/dom/shadow/focus-navigation-with-multiple-shadow-roots.html [ Failure ]
 crbug.com/591099 fast/dom/shadow/focus-navigation.html [ Failure Timeout ]
 crbug.com/591099 fast/dom/shadow/frameless-media-element-crash.html [ Failure ]
@@ -9481,7 +9489,7 @@
 crbug.com/591099 fast/dom/shadow/multiple-shadowroot-adopt.html [ Failure ]
 crbug.com/591099 fast/dom/shadow/multiple-shadowroot.html [ Failure ]
 crbug.com/591099 fast/dom/shadow/nested-reprojection-inconsistent.html [ Failure ]
-crbug.com/591099 fast/dom/shadow/node-distribution-recalc-crash.html [ Crash ]
+crbug.com/591099 fast/dom/shadow/node-distribution-recalc-crash.html [ Crash Pass ]
 crbug.com/591099 fast/dom/shadow/normalize-progress-element-crash.html [ Crash Failure ]
 crbug.com/591099 fast/dom/shadow/offset-parent-does-not-leak-ua-shadow.html [ Failure ]
 crbug.com/591099 fast/dom/shadow/offsetWidth-host-style-change.html [ Failure ]
@@ -9498,13 +9506,13 @@
 crbug.com/591099 fast/dom/shadow/remove-styles-in-shadow-crash-3.html [ Failure ]
 crbug.com/591099 fast/dom/shadow/remove-stylesheet-from-shadow-crash.html [ Failure ]
 crbug.com/591099 fast/dom/shadow/select-in-shadowdom.html [ Failure ]
-crbug.com/591099 fast/dom/shadow/selection-in-nested-shadow.html [ Crash ]
+crbug.com/591099 fast/dom/shadow/selection-in-nested-shadow.html [ Crash Failure ]
 crbug.com/591099 fast/dom/shadow/selections-in-shadow.html [ Timeout ]
 crbug.com/591099 fast/dom/shadow/set-attribute-in-shadow-crash.html [ Failure ]
 crbug.com/591099 fast/dom/shadow/shadow-added-display-none-host.html [ Failure ]
 crbug.com/591099 fast/dom/shadow/shadow-aware-create-shadow-root.html [ Failure ]
 crbug.com/591099 fast/dom/shadow/shadow-aware-shadow-root.html [ Failure ]
-crbug.com/591099 fast/dom/shadow/shadow-boundary-crossing.html [ Crash ]
+crbug.com/591099 fast/dom/shadow/shadow-boundary-crossing.html [ Crash Failure ]
 crbug.com/591099 fast/dom/shadow/shadow-boundary-events.html [ Failure ]
 crbug.com/591099 fast/dom/shadow/shadow-contents-event.html [ Crash Failure ]
 crbug.com/591099 fast/dom/shadow/shadow-disable.html [ Failure ]
@@ -9513,7 +9521,7 @@
 crbug.com/591099 fast/dom/shadow/shadow-element-distributed-nodes.html [ Failure ]
 crbug.com/591099 fast/dom/shadow/shadow-element.html [ Failure ]
 crbug.com/591099 fast/dom/shadow/shadow-hierarchy-exception.html [ Failure ]
-crbug.com/591099 fast/dom/shadow/shadow-removechild-and-blur-event.html [ Crash ]
+crbug.com/591099 fast/dom/shadow/shadow-removechild-and-blur-event.html [ Crash Failure ]
 crbug.com/591099 fast/dom/shadow/shadow-reprojection-click.html [ Failure ]
 crbug.com/591099 fast/dom/shadow/shadow-root-activeElement.html [ Failure ]
 crbug.com/591099 fast/dom/shadow/shadow-root-append.html [ Failure ]
@@ -9539,11 +9547,11 @@
 crbug.com/591099 fast/dom/shadow/style-sharing-styles-in-older-shadow-roots.html [ Failure ]
 crbug.com/591099 fast/dom/shadow/suppress-mutation-events-in-shadow-characterdata.html [ Failure ]
 crbug.com/591099 fast/dom/shadow/suppress-mutation-events-in-shadow.html [ Crash Failure ]
-crbug.com/591099 fast/dom/shadow/svg-style-in-shadow-tree-crash.html [ Crash ]
+crbug.com/591099 fast/dom/shadow/svg-style-in-shadow-tree-crash.html [ Crash Pass ]
 crbug.com/591099 fast/dom/shadow/tab-order-iframe-and-shadow.html [ Failure ]
 crbug.com/591099 fast/dom/shadow/title-element-in-shadow.html [ Failure ]
 crbug.com/591099 fast/dom/shadow/touch-event-retargeting.html [ Failure ]
-crbug.com/591099 fast/dom/shadow/touch-event.html [ Crash ]
+crbug.com/591099 fast/dom/shadow/touch-event.html [ Crash Failure ]
 crbug.com/591099 fast/dom/shadow/tree-scope-crash.html [ Crash Failure ]
 crbug.com/591099 fast/dom/shadow/update-text-of-style-in-shadow-dom.html [ Failure ]
 crbug.com/591099 fast/dom/shadow/user-modify-inheritance.html [ Failure ]
@@ -9553,18 +9561,18 @@
 crbug.com/591099 fast/dom/style-sheet-candidate-remove-unrendered-document.html [ Failure ]
 crbug.com/591099 fast/dom/subtree-modified-attributes.html [ Failure ]
 crbug.com/591099 fast/dom/tab-in-right-alignment.html [ Crash Failure ]
-crbug.com/591099 fast/dom/tabindex-behavior.html [ Crash ]
+crbug.com/591099 fast/dom/tabindex-behavior.html [ Crash Pass ]
 crbug.com/591099 fast/dom/tabindex-clamp.html [ Failure ]
 crbug.com/591099 fast/dom/tabindex-defaults.html [ Failure ]
 crbug.com/591099 fast/dom/text-api-arguments.html [ Failure ]
-crbug.com/591099 fast/dom/text-control-crash-on-select.html [ Crash ]
+crbug.com/591099 fast/dom/text-control-crash-on-select.html [ Crash Pass ]
 crbug.com/591099 fast/dom/timer-throttling-background-page-near-alignment-interval.html [ Failure ]
 crbug.com/591099 fast/dom/timers-maintain-order-while-throttled.html [ Failure ]
 crbug.com/591099 fast/dom/title-content-set-innerText-get.xhtml [ Failure ]
 crbug.com/591099 fast/dom/title-content-write-set.html [ Failure ]
 crbug.com/591099 fast/dom/vertical-scrollbar-in-rtl-doesnt-fire-onscroll.html [ Failure ]
 crbug.com/591099 fast/dom/vertical-scrollbar-in-rtl.html [ Crash Failure ]
-crbug.com/591099 fast/dom/viewport/viewport-dimensions-iframe.html [ Crash ]
+crbug.com/591099 fast/dom/viewport/viewport-dimensions-iframe.html [ Crash Pass ]
 crbug.com/591099 fast/dom/webtiming-document-open.html [ Failure ]
 crbug.com/591099 fast/dom/webtiming-navigate-within-document.html [ Failure ]
 crbug.com/591099 fast/dom/webtiming.html [ Failure ]
@@ -9691,7 +9699,7 @@
 crbug.com/591099 fast/encoding/invalid-UTF-8-2.html [ Failure ]
 crbug.com/591099 fast/encoding/invalid-UTF-8.html [ Failure ]
 crbug.com/591099 fast/encoding/invalid-multi-byte-over-consumption.html [ Failure ]
-crbug.com/591099 fast/encoding/invalid-xml.html [ Crash ]
+crbug.com/591099 fast/encoding/invalid-xml.html [ Crash Pass ]
 crbug.com/591099 fast/encoding/japanese-encoding-mix.html [ Failure ]
 crbug.com/591099 fast/encoding/latin1-unencodables.html [ Crash Failure ]
 crbug.com/591099 fast/encoding/latin1-winlatin.html [ Failure ]
@@ -9740,37 +9748,37 @@
 crbug.com/591099 fast/events/anchor-image-scrolled-x-y.html [ Crash Pass Timeout ]
 crbug.com/591099 fast/events/arrow-keys-on-body.html [ Failure ]
 crbug.com/591099 fast/events/attempt-select-all-with-wrong-modifier.html [ Failure ]
-crbug.com/591099 fast/events/attribute-listener-cloned-from-frameless-doc-context-2.html [ Crash ]
-crbug.com/591099 fast/events/attribute-listener-cloned-from-frameless-doc-context.html [ Crash ]
+crbug.com/591099 fast/events/attribute-listener-cloned-from-frameless-doc-context-2.html [ Crash Pass ]
+crbug.com/591099 fast/events/attribute-listener-cloned-from-frameless-doc-context.html [ Crash Pass ]
 crbug.com/591099 fast/events/attribute-listener-cloned-from-frameless-doc.xhtml [ Failure ]
-crbug.com/591099 fast/events/attribute-listener-extracted-from-frameless-doc-context-2.html [ Crash ]
-crbug.com/591099 fast/events/attribute-listener-extracted-from-frameless-doc-context.html [ Crash ]
+crbug.com/591099 fast/events/attribute-listener-extracted-from-frameless-doc-context-2.html [ Crash Pass ]
+crbug.com/591099 fast/events/attribute-listener-extracted-from-frameless-doc-context.html [ Crash Pass ]
 crbug.com/591099 fast/events/autoscroll-in-overflow-hidden-html.html [ Failure ]
 crbug.com/591099 fast/events/autoscroll-in-textarea.html [ Crash Failure ]
 crbug.com/591099 fast/events/autoscroll-in-textfield.html [ Crash Failure ]
 crbug.com/591099 fast/events/autoscroll-nonscrollable-iframe-in-scrollable-div.html [ Failure ]
-crbug.com/591099 fast/events/autoscroll-select-crash.html [ Crash ]
+crbug.com/591099 fast/events/autoscroll-select-crash.html [ Crash Pass ]
 crbug.com/591099 fast/events/autoscroll-should-not-stop-on-keypress.html [ Failure ]
-crbug.com/591099 fast/events/autoscroll-upwards-propagation-no-scroll-iframe.html [ Crash ]
+crbug.com/591099 fast/events/autoscroll-upwards-propagation-no-scroll-iframe.html [ Crash Failure ]
 crbug.com/591099 fast/events/autoscroll-upwards-propagation-overflow-hidden-body.html [ Failure ]
-crbug.com/591099 fast/events/autoscroll-upwards-propagation-overflow-hidden-iframe-body.html [ Crash ]
+crbug.com/591099 fast/events/autoscroll-upwards-propagation-overflow-hidden-iframe-body.html [ Crash Failure ]
 crbug.com/591099 fast/events/autoscroll-upwards-propagation.html [ Crash Failure ]
 crbug.com/591099 fast/events/autoscroll-with-non-scrollable-parent.html [ Failure Pass ]
 crbug.com/591099 fast/events/autoscroll.html [ Crash Failure ]
-crbug.com/591099 fast/events/before-unload-adopt-within-subframes.html [ Crash ]
+crbug.com/591099 fast/events/before-unload-adopt-within-subframes.html [ Crash Failure ]
 crbug.com/591099 fast/events/before-unload-crash.html [ Failure ]
 crbug.com/591099 fast/events/before-unload-forbidden-navigation.html [ Failure ]
 crbug.com/591099 fast/events/before-unload-in-multiple-subframes.html [ Failure ]
 crbug.com/591099 fast/events/before-unload-in-subframe.html [ Failure ]
 crbug.com/591099 fast/events/before-unload-javascript-navigation.html [ Failure ]
 crbug.com/591099 fast/events/before-unload-remove-and-add-subframe.html [ Failure ]
-crbug.com/591099 fast/events/before-unload-remove-itself.html [ Crash ]
+crbug.com/591099 fast/events/before-unload-remove-itself.html [ Crash Failure ]
 crbug.com/591099 fast/events/before-unload-return-bad-value.html [ Failure ]
 crbug.com/591099 fast/events/before-unload-return-value-from-listener.html [ Failure ]
 crbug.com/591099 fast/events/before-unload-returnValue.html [ Failure ]
 crbug.com/591099 fast/events/before-unload-with-subframes.html [ Failure ]
 crbug.com/591099 fast/events/blur-focus-window-should-blur-focus-element.html [ Failure ]
-crbug.com/591099 fast/events/blur-remove-parent-crash.html [ Crash ]
+crbug.com/591099 fast/events/blur-remove-parent-crash.html [ Crash Pass ]
 crbug.com/591099 fast/events/bogus-dropEffect-effectAllowed.html [ Failure ]
 crbug.com/591099 fast/events/bogus-event-listener-invalidation.html [ Failure ]
 crbug.com/591099 fast/events/caller-access-from-event-listener.html [ Failure ]
@@ -9783,7 +9791,7 @@
 crbug.com/591099 fast/events/click-after-mousedown-cancel.html [ Failure ]
 crbug.com/591099 fast/events/click-focus-anchor.html [ Failure ]
 crbug.com/591099 fast/events/click-focus-svganchor-has-ring.html [ Failure ]
-crbug.com/591099 fast/events/click-over-descendant-elements.html [ Crash ]
+crbug.com/591099 fast/events/click-over-descendant-elements.html [ Crash Failure ]
 crbug.com/591099 fast/events/click-range-slider.html [ Failure ]
 crbug.com/591099 fast/events/click-svganchor-blur-refocus-window.html [ Failure ]
 crbug.com/591099 fast/events/click-svganchor-refocus-window.html [ Failure ]
@@ -9825,7 +9833,7 @@
 crbug.com/591099 fast/events/constructors/webkit-animation-event-constructor.html [ Failure ]
 crbug.com/591099 fast/events/constructors/webkit-transition-event-constructor.html [ Failure ]
 crbug.com/591099 fast/events/constructors/wheel-event-constructor.html [ Failure Timeout ]
-crbug.com/591099 fast/events/content-changed-during-drop.html [ Crash ]
+crbug.com/591099 fast/events/content-changed-during-drop.html [ Crash Failure ]
 crbug.com/591099 fast/events/context-no-deselect.html [ Crash Failure ]
 crbug.com/591099 fast/events/context-nodrag.html [ Failure ]
 crbug.com/591099 fast/events/contextmenu-scrolled-page-with-frame.html [ Failure ]
@@ -9838,7 +9846,7 @@
 crbug.com/591099 fast/events/dispatch-to-function-with-handle-event.html [ Failure ]
 crbug.com/591099 fast/events/dispatch-to-handle-event.html [ Failure ]
 crbug.com/591099 fast/events/document-elementFromPoint.html [ Failure Pass ]
-crbug.com/591099 fast/events/domactivate-sets-underlying-click-event-as-handled.html [ Crash ]
+crbug.com/591099 fast/events/domactivate-sets-underlying-click-event-as-handled.html [ Crash Failure ]
 crbug.com/591099 fast/events/domnodeinsertedintodocument-dispatched-post-rendering.html [ Failure ]
 crbug.com/591099 fast/events/dont-loose-last-event.html [ Failure ]
 crbug.com/591099 fast/events/drag-and-drop-autoscroll-inner-frame.html [ Timeout ]
@@ -9846,8 +9854,8 @@
 crbug.com/591099 fast/events/drag-and-drop-dataTransfer-types-nocrash.html [ Failure ]
 crbug.com/591099 fast/events/drag-and-drop-fire-drag-dragover.html [ Failure ]
 crbug.com/591099 fast/events/drag-and-drop-set-drag-data-arguments.html [ Failure ]
-crbug.com/591099 fast/events/drag-and-drop-subframe-dataTransfer.html [ Crash ]
-crbug.com/591099 fast/events/drag-and-drop.html [ Crash Timeout ]
+crbug.com/591099 fast/events/drag-and-drop-subframe-dataTransfer.html [ Crash Pass ]
+crbug.com/591099 fast/events/drag-and-drop.html [ Crash Failure Timeout ]
 crbug.com/591099 fast/events/drag-customData.html [ Failure Timeout ]
 crbug.com/591099 fast/events/drag-dataTransferItemList-file-handling.html [ Crash Failure ]
 crbug.com/591099 fast/events/drag-dataTransferItemList.html [ Failure ]
@@ -9890,24 +9898,24 @@
 crbug.com/591099 fast/events/event-on-culled_inline.html [ Failure ]
 crbug.com/591099 fast/events/event-properties-gc.html [ Failure ]
 crbug.com/591099 fast/events/event-sender-mouseleave.html [ Failure ]
-crbug.com/591099 fast/events/event-targets.html [ Crash ]
+crbug.com/591099 fast/events/event-targets.html [ Crash Failure ]
 crbug.com/591099 fast/events/event-trace.html [ Failure ]
 crbug.com/591099 fast/events/event-trusted.html [ Failure ]
 crbug.com/591099 fast/events/event-view-toString.html [ Failure ]
-crbug.com/591099 fast/events/file-input-hidden-in-ondrop.html [ Crash ]
-crbug.com/591099 fast/events/fire-mousedown-while-pressing-mouse-button.html [ Crash ]
+crbug.com/591099 fast/events/file-input-hidden-in-ondrop.html [ Crash Pass ]
+crbug.com/591099 fast/events/fire-mousedown-while-pressing-mouse-button.html [ Crash Failure ]
 crbug.com/591099 fast/events/fire-popstate-event.html [ Failure ]
 crbug.com/591099 fast/events/fire-scroll-event-element.html [ Failure Timeout ]
 crbug.com/591099 fast/events/fire-scroll-event.html [ Failure ]
 crbug.com/591099 fast/events/flags-unset-on-init-event.html [ Failure ]
-crbug.com/591099 fast/events/focus-change-assertion.html [ Crash ]
-crbug.com/591099 fast/events/focus-change-crash.html [ Crash Failure ]
-crbug.com/591099 fast/events/focus-change-crash2.html [ Crash Timeout ]
+crbug.com/591099 fast/events/focus-change-assertion.html [ Crash Pass ]
+crbug.com/591099 fast/events/focus-change-crash.html [ Crash Failure Pass ]
+crbug.com/591099 fast/events/focus-change-crash2.html [ Crash Failure Timeout ]
 crbug.com/591099 fast/events/focus-click-on-non-mouse-focusable-element.html [ Failure ]
 crbug.com/591099 fast/events/focus-event-source-device-from-keyboard.html [ Failure ]
 crbug.com/591099 fast/events/focus-event-source-device-from-mouse.html [ Failure ]
 crbug.com/591099 fast/events/focus-event-source-device-from-touch.html [ Failure ]
-crbug.com/591099 fast/events/focus-iframe-crash.html [ Crash ]
+crbug.com/591099 fast/events/focus-iframe-crash.html [ Crash Pass ]
 crbug.com/591099 fast/events/focus-remove-focuesed-node.html [ Failure ]
 crbug.com/591099 fast/events/form-onchange.html [ Failure ]
 crbug.com/591099 fast/events/frame-click-clear-focus.html [ Failure ]
@@ -9934,19 +9942,19 @@
 crbug.com/591099 fast/events/init-message-event-isolated-world.html [ Failure ]
 crbug.com/591099 fast/events/init-message-event.html [ Failure ]
 crbug.com/591099 fast/events/initkeyboardevent-crash.html [ Failure ]
-crbug.com/591099 fast/events/input-element-display-none-in-dragleave-crash.html [ Crash ]
+crbug.com/591099 fast/events/input-element-display-none-in-dragleave-crash.html [ Crash Pass ]
 crbug.com/591099 fast/events/input-focus-no-duplicate-events.html [ Failure ]
 crbug.com/591099 fast/events/input-tab-focus-no-duplicate-events.html [ Failure ]
-crbug.com/591099 fast/events/inputText-never-fired-on-keydown-cancel.html [ Crash ]
-crbug.com/591099 fast/events/inputevents/before-input-order-typing-command.html [ Crash ]
-crbug.com/591099 fast/events/inputevents/before-input-ranges.html [ Crash ]
-crbug.com/591099 fast/events/inputevents/beforeinput-remove-iframe-crash.html [ Crash ]
+crbug.com/591099 fast/events/inputText-never-fired-on-keydown-cancel.html [ Crash Failure ]
+crbug.com/591099 fast/events/inputevents/before-input-order-typing-command.html [ Crash Pass ]
+crbug.com/591099 fast/events/inputevents/before-input-ranges.html [ Crash Pass ]
+crbug.com/591099 fast/events/inputevents/beforeinput-remove-iframe-crash.html [ Crash Failure ]
 crbug.com/591099 fast/events/inputevents/inputevent-cut-paste.html [ Failure ]
 crbug.com/591099 fast/events/inputevents/inputevent-data-keyboard.html [ Failure ]
-crbug.com/591099 fast/events/inputevents/inputevent-drag-drop.html [ Crash Failure ]
+crbug.com/591099 fast/events/inputevents/inputevent-drag-drop.html [ Crash Failure Pass ]
 crbug.com/591099 fast/events/inputevents/inputevent-execcommand.html [ Failure ]
-crbug.com/591099 fast/events/inputevents/inputevent-keyboard.html [ Crash ]
-crbug.com/591099 fast/events/inputevents/inputevent-transpose.html [ Crash Failure ]
+crbug.com/591099 fast/events/inputevents/inputevent-keyboard.html [ Crash Failure ]
+crbug.com/591099 fast/events/inputevents/inputevent-transpose.html [ Crash Failure Pass ]
 crbug.com/591099 fast/events/invalid-001.html [ Crash Failure ]
 crbug.com/591099 fast/events/invalid-002.html [ Crash Failure ]
 crbug.com/591099 fast/events/invalid-003.html [ Crash Failure ]
@@ -9969,20 +9977,20 @@
 crbug.com/591099 fast/events/keydown-leftright-keys.html [ Failure ]
 crbug.com/591099 fast/events/keydown-numlock-standard-location.html [ Failure ]
 crbug.com/591099 fast/events/keydown-numpad-keys.html [ Failure ]
-crbug.com/591099 fast/events/keydown-remove-frame.html [ Crash ]
+crbug.com/591099 fast/events/keydown-remove-frame.html [ Crash Failure ]
 crbug.com/591099 fast/events/keyevent-iframe-removed-crash.html [ Failure ]
 crbug.com/591099 fast/events/keypress-focus-change.html [ Failure ]
-crbug.com/591099 fast/events/keypress-removed-node.html [ Crash ]
+crbug.com/591099 fast/events/keypress-removed-node.html [ Crash Failure ]
 crbug.com/591099 fast/events/main-world-does-not-override-keystate.html [ Failure ]
-crbug.com/591099 fast/events/max-tabindex-focus.html [ Crash ]
+crbug.com/591099 fast/events/max-tabindex-focus.html [ Crash Pass ]
 crbug.com/591099 fast/events/media-element-focus-tab.html [ Failure ]
-crbug.com/591099 fast/events/media-focus-in-standalone-media-document.html [ Crash ]
+crbug.com/591099 fast/events/media-focus-in-standalone-media-document.html [ Crash Pass ]
 crbug.com/591099 fast/events/menu-key-context-menu-document-pinch-zoom.html [ Failure ]
 crbug.com/591099 fast/events/menu-key-context-menu-document.html [ Failure ]
 crbug.com/591099 fast/events/menu-key-context-menu-position.html [ Failure ]
-crbug.com/591099 fast/events/menu-key-context-menu-reveal-focus.html [ Crash ]
+crbug.com/591099 fast/events/menu-key-context-menu-reveal-focus.html [ Crash Pass ]
 crbug.com/591099 fast/events/menu-key-context-menu.html [ Failure ]
-crbug.com/591099 fast/events/menu-key-no-mouse-down.html [ Crash ]
+crbug.com/591099 fast/events/menu-key-no-mouse-down.html [ Crash Pass ]
 crbug.com/591099 fast/events/message-channel-gc-2.html [ Failure ]
 crbug.com/591099 fast/events/message-channel-gc-3.html [ Failure ]
 crbug.com/591099 fast/events/message-channel-gc-4.html [ Failure ]
@@ -9991,18 +9999,18 @@
 crbug.com/591099 fast/events/message-event-max-ports.html [ Failure ]
 crbug.com/591099 fast/events/message-port-clone.html [ Failure ]
 crbug.com/591099 fast/events/message-port-close.html [ Failure ]
-crbug.com/591099 fast/events/message-port-constructor-for-deleted-document.html [ Crash ]
+crbug.com/591099 fast/events/message-port-constructor-for-deleted-document.html [ Crash Failure ]
 crbug.com/591099 fast/events/message-port-context-destroyed.html [ Failure ]
-crbug.com/591099 fast/events/message-port-deleted-document.html [ Crash ]
-crbug.com/591099 fast/events/message-port-deleted-frame.html [ Crash ]
-crbug.com/591099 fast/events/message-port-gc-closed-cloned.html [ Crash ]
-crbug.com/591099 fast/events/message-port-gc-closed.html [ Crash ]
+crbug.com/591099 fast/events/message-port-deleted-document.html [ Crash Failure ]
+crbug.com/591099 fast/events/message-port-deleted-frame.html [ Crash Failure ]
+crbug.com/591099 fast/events/message-port-gc-closed-cloned.html [ Crash Failure ]
+crbug.com/591099 fast/events/message-port-gc-closed.html [ Crash Failure ]
 crbug.com/591099 fast/events/message-port-inactive-document.html [ Failure ]
 crbug.com/591099 fast/events/message-port-multi.html [ Failure ]
 crbug.com/591099 fast/events/message-port-no-wrapper.html [ Failure ]
 crbug.com/591099 fast/events/message-port-start-and-close-different-microtask.html [ Failure ]
 crbug.com/591099 fast/events/message-port-start-and-close-same-microtask.html [ Failure ]
-crbug.com/591099 fast/events/message-port-transferables.html [ Crash ]
+crbug.com/591099 fast/events/message-port-transferables.html [ Crash Pass ]
 crbug.com/591099 fast/events/message-port.html [ Failure ]
 crbug.com/591099 fast/events/middleClickAutoscroll-click-hyperlink.html [ Failure ]
 crbug.com/591099 fast/events/middleClickAutoscroll-drag-scrollable-iframe-div.html [ Failure ]
@@ -10052,18 +10060,18 @@
 crbug.com/591099 fast/events/mutation-during-insert-before.html [ Failure ]
 crbug.com/591099 fast/events/mutation-during-replace-child-2.html [ Failure ]
 crbug.com/591099 fast/events/mutation-during-replace-child.html [ Failure ]
-crbug.com/591099 fast/events/nested-event-remove-node-crash.html [ Crash ]
+crbug.com/591099 fast/events/nested-event-remove-node-crash.html [ Crash Pass ]
 crbug.com/591099 fast/events/no-blur-on-enter-button.html [ Failure ]
-crbug.com/591099 fast/events/offsetX-offsetY-svg.html [ Crash ]
+crbug.com/591099 fast/events/offsetX-offsetY-svg.html [ Crash Pass ]
 crbug.com/591099 fast/events/offsetX-offsetY.html [ Failure Timeout ]
 crbug.com/591099 fast/events/onbeforeunload-focused-iframe.html [ Failure ]
-crbug.com/591099 fast/events/onblur-remove.html [ Crash ]
+crbug.com/591099 fast/events/onblur-remove.html [ Crash Failure ]
 crbug.com/591099 fast/events/onchange-passwordfield.html [ Failure ]
 crbug.com/591099 fast/events/onchange-range-slider.html [ Failure ]
 crbug.com/591099 fast/events/onchange-searchfield.html [ Failure ]
 crbug.com/591099 fast/events/onchange-select-popup.html [ Failure ]
-crbug.com/591099 fast/events/onchange-setvalue.html [ Crash ]
-crbug.com/591099 fast/events/onchange-text-form-field.html [ Crash ]
+crbug.com/591099 fast/events/onchange-setvalue.html [ Crash Pass ]
+crbug.com/591099 fast/events/onchange-text-form-field.html [ Crash Pass ]
 crbug.com/591099 fast/events/onchange-textfield.html [ Failure ]
 crbug.com/591099 fast/events/onclick-list-marker.html [ Crash Failure ]
 crbug.com/591099 fast/events/onload-after-document-close-no-subresource.html [ Failure ]
@@ -10072,16 +10080,16 @@
 crbug.com/591099 fast/events/onload-re-entry.html [ Failure ]
 crbug.com/591099 fast/events/onload-single-line-comment.html [ Failure ]
 crbug.com/591099 fast/events/onload-webkit-before-webcore.html [ Failure ]
-crbug.com/591099 fast/events/onloadFrameCrash.html [ Crash ]
+crbug.com/591099 fast/events/onloadFrameCrash.html [ Crash Pass ]
 crbug.com/591099 fast/events/only-valid-drop-targets-receive-file-drop.html [ Failure ]
 crbug.com/591099 fast/events/onsubmit-bubbling.html [ Failure ]
 crbug.com/591099 fast/events/page-scaled-mouse-click-iframe.html [ Failure ]
 crbug.com/591099 fast/events/page-scaled-mouse-click.html [ Failure ]
 crbug.com/591099 fast/events/page-visibility-bubble.html [ Failure ]
-crbug.com/591099 fast/events/page-visibility-iframe-delete-test.html [ Crash ]
+crbug.com/591099 fast/events/page-visibility-iframe-delete-test.html [ Crash Failure ]
 crbug.com/591099 fast/events/page-visibility-iframe-move-test.html [ Failure ]
 crbug.com/591099 fast/events/page-visibility-iframe-propagation-test.html [ Failure ]
-crbug.com/591099 fast/events/page-visibility-iframe-unload.html [ Crash ]
+crbug.com/591099 fast/events/page-visibility-iframe-unload.html [ Crash Failure ]
 crbug.com/591099 fast/events/page-visibility-null-view.html [ Failure ]
 crbug.com/591099 fast/events/page-visibility-prefixed.html [ Failure ]
 crbug.com/591099 fast/events/page-visibility-transition-test.html [ Failure ]
@@ -10091,7 +10099,7 @@
 crbug.com/591099 fast/events/pointer-events.html [ Failure ]
 crbug.com/591099 fast/events/pointerevents/fake-mouse-event-pointer-types.html [ Failure ]
 crbug.com/591099 fast/events/pointerevents/mouse-node-remove.html [ Failure ]
-crbug.com/591099 fast/events/pointerevents/mouse-on-object.html [ Crash ]
+crbug.com/591099 fast/events/pointerevents/mouse-on-object.html [ Crash Failure ]
 crbug.com/591099 fast/events/pointerevents/mouse-pointer-boundary-events-for-shadowdom.html [ Failure Pass ]
 crbug.com/591099 fast/events/pointerevents/mouse-pointer-capture-transition-events.html [ Timeout ]
 crbug.com/591099 fast/events/pointerevents/mouse-pointer-capture.html [ Failure Timeout ]
@@ -10104,7 +10112,7 @@
 crbug.com/591099 fast/events/pointerevents/multi-pointer-preventdefault.html [ Failure Timeout ]
 crbug.com/591099 fast/events/pointerevents/pointer-event-properties-in-iframe.html [ Failure ]
 crbug.com/591099 fast/events/pointerevents/pointer-use-count.html [ Failure ]
-crbug.com/591099 fast/events/pointerevents/pointerevent_touch-action-pinch_zoom_touch.html [ Crash ]
+crbug.com/591099 fast/events/pointerevents/pointerevent_touch-action-pinch_zoom_touch.html [ Crash Pass ]
 crbug.com/591099 fast/events/pointerevents/touch-capture-in-iframe.html [ Timeout ]
 crbug.com/591099 fast/events/pointerevents/touch-capture.html [ Failure Timeout ]
 crbug.com/591099 fast/events/pointerevents/touch-pointer-events.html [ Failure ]
@@ -10115,30 +10123,30 @@
 crbug.com/591099 fast/events/popup-allowed-from-gesture-only-once-iframes.html [ Timeout ]
 crbug.com/591099 fast/events/popup-allowed-from-gesture-only-once-two-events.html [ Failure ]
 crbug.com/591099 fast/events/popup-allowed-from-gesture-only-once.html [ Failure Timeout ]
-crbug.com/591099 fast/events/popup-allowed-from-pointerup-exactly-once.html [ Crash ]
+crbug.com/591099 fast/events/popup-allowed-from-pointerup-exactly-once.html [ Crash Pass ]
 crbug.com/591099 fast/events/popup-blocked-from-different-frames.html [ Failure ]
 crbug.com/591099 fast/events/popup-blocked-from-wrong-event.html [ Failure ]
 crbug.com/591099 fast/events/popup-blocking-click-in-iframe.html [ Timeout ]
 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 ]
+crbug.com/591099 fast/events/recorded-keydown-event.html [ Crash Failure ]
 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 ]
 crbug.com/591099 fast/events/remove-first-event-listener-while-firing.html [ Failure ]
-crbug.com/591099 fast/events/remove-shadow-host-crash.html [ Crash ]
+crbug.com/591099 fast/events/remove-shadow-host-crash.html [ Crash Failure ]
 crbug.com/591099 fast/events/remove-target-in-mouseup-deep.html [ Failure ]
 crbug.com/591099 fast/events/remove-target-in-mouseup-insertback.html [ Failure ]
 crbug.com/591099 fast/events/remove-target-in-mouseup-twice.html [ Failure ]
 crbug.com/591099 fast/events/remove-target-in-mouseup.html [ Crash Failure ]
-crbug.com/591099 fast/events/remove-target-with-shadow-in-drag.html [ Crash ]
+crbug.com/591099 fast/events/remove-target-with-shadow-in-drag.html [ Crash Failure ]
 crbug.com/591099 fast/events/remove-text-node-in-mouseup.html [ Failure ]
 crbug.com/591099 fast/events/resize-raf-timing.html [ Failure ]
 crbug.com/591099 fast/events/reveal-link-when-focused.html [ Failure ]
 crbug.com/591099 fast/events/right-click-focus.html [ Failure ]
 crbug.com/591099 fast/events/scale-and-scroll-div.html [ Failure ]
-crbug.com/591099 fast/events/scoped/editing-commands.html [ Crash ]
+crbug.com/591099 fast/events/scoped/editing-commands.html [ Crash Failure ]
 crbug.com/591099 fast/events/scroll-after-click-on-tab-index.html [ Failure ]
 crbug.com/591099 fast/events/scroll-div-with-prevent-default-in-subframe.html [ Failure Pass ]
 crbug.com/591099 fast/events/scroll-event-does-not-bubble.html [ Pass Timeout ]
@@ -10148,9 +10156,9 @@
 crbug.com/591099 fast/events/scroll-event-raf-timing.html [ Failure ]
 crbug.com/591099 fast/events/scroll-to-anchor-in-overflow-hidden.html [ Failure ]
 crbug.com/591099 fast/events/select-element.html [ Timeout ]
-crbug.com/591099 fast/events/select-onchange-crash.html [ Crash ]
-crbug.com/591099 fast/events/select-onchange-mouse-released-outside.html [ Crash ]
-crbug.com/591099 fast/events/selectionchange-iframe.html [ Crash ]
+crbug.com/591099 fast/events/select-onchange-crash.html [ Crash Failure ]
+crbug.com/591099 fast/events/select-onchange-mouse-released-outside.html [ Crash Failure ]
+crbug.com/591099 fast/events/selectionchange-iframe.html [ Crash Failure ]
 crbug.com/591099 fast/events/selectionchange-user-initiated.html [ Crash Failure ]
 crbug.com/591099 fast/events/selectstart-by-arrow-keys-prevent-default.html [ Failure ]
 crbug.com/591099 fast/events/selectstart-by-arrow-keys.html [ Failure ]
@@ -10161,11 +10169,11 @@
 crbug.com/591099 fast/events/selectstart-on-selectall.html [ Failure ]
 crbug.com/591099 fast/events/selectstart-prevent-selectall.html [ Crash Failure ]
 crbug.com/591099 fast/events/selectstart-prevent-selection-on-right-click.html [ Failure ]
-crbug.com/591099 fast/events/sequential-focus-navigation-starting-point.html [ Crash ]
+crbug.com/591099 fast/events/sequential-focus-navigation-starting-point.html [ Crash Failure ]
 crbug.com/591099 fast/events/setDragImage-with-detached-node.html [ Failure ]
 crbug.com/591099 fast/events/simulated-click-by-alt-enter.html [ Failure ]
 crbug.com/591099 fast/events/simulated-click-coords.html [ Failure ]
-crbug.com/591099 fast/events/simulated-click-disabled.html [ Crash ]
+crbug.com/591099 fast/events/simulated-click-disabled.html [ Crash Failure ]
 crbug.com/591099 fast/events/simulated-click-on-anchor-with-target-blank.html [ Failure ]
 crbug.com/591099 fast/events/space-scroll-event.html [ Failure ]
 crbug.com/591099 fast/events/space-scroll-textinput-canceled.html [ Failure ]
@@ -10181,20 +10189,20 @@
 crbug.com/591099 fast/events/tab-imagemap.html [ Failure ]
 crbug.com/591099 fast/events/tab-is-focusable-assert.html [ Failure ]
 crbug.com/591099 fast/events/tab-test-not-visible-imagemap.html [ Failure ]
-crbug.com/591099 fast/events/tabindex-focus-chain.html [ Crash ]
+crbug.com/591099 fast/events/tabindex-focus-chain.html [ Crash Pass ]
 crbug.com/591099 fast/events/touch/basic-multi-touch-events-limited.html [ Failure ]
 crbug.com/591099 fast/events/touch/basic-multi-touch-events.html [ Failure ]
 crbug.com/591099 fast/events/touch/basic-single-touch-events.html [ Failure ]
 crbug.com/591099 fast/events/touch/compositor-touch-hit-rects-animation.html [ Failure ]
 crbug.com/591099 fast/events/touch/compositor-touch-hit-rects-global.html [ Failure ]
-crbug.com/591099 fast/events/touch/compositor-touch-hit-rects-iframe-disappears.html [ Crash ]
+crbug.com/591099 fast/events/touch/compositor-touch-hit-rects-iframe-disappears.html [ Crash Pass ]
 crbug.com/591099 fast/events/touch/compositor-touch-hit-rects-many.html [ Failure ]
 crbug.com/591099 fast/events/touch/compositor-touch-hit-rects-non-composited-scroll.html [ Failure ]
 crbug.com/591099 fast/events/touch/compositor-touch-hit-rects-scroll.html [ Failure ]
 crbug.com/591099 fast/events/touch/compositor-touch-hit-rects-squashing.html [ Failure ]
 crbug.com/591099 fast/events/touch/compositor-touch-hit-rects-transform-changed-nolayout.html [ Failure ]
 crbug.com/591099 fast/events/touch/compositor-touch-hit-rects-trigger-commit.html [ Failure ]
-crbug.com/591099 fast/events/touch/compositor-touch-hit-rects.html [ Crash ]
+crbug.com/591099 fast/events/touch/compositor-touch-hit-rects.html [ Crash Failure ]
 crbug.com/591099 fast/events/touch/document-create-touch-list-crash.html [ Failure ]
 crbug.com/591099 fast/events/touch/document-create-touch-list.html [ Failure ]
 crbug.com/591099 fast/events/touch/document-create-touch.html [ Failure ]
@@ -10224,7 +10232,7 @@
 crbug.com/591099 fast/events/touch/gesture/gesture-tap-frame-scrolled.html [ Failure ]
 crbug.com/591099 fast/events/touch/gesture/gesture-tap-hover-clear.html [ Failure ]
 crbug.com/591099 fast/events/touch/gesture/gesture-tap-hover-state-iframe.html [ Failure ]
-crbug.com/591099 fast/events/touch/gesture/gesture-tap-input-after-composition.html [ Crash ]
+crbug.com/591099 fast/events/touch/gesture/gesture-tap-input-after-composition.html [ Crash Pass ]
 crbug.com/591099 fast/events/touch/gesture/gesture-tap-mouse-events-between-frames.html [ Failure ]
 crbug.com/591099 fast/events/touch/gesture/gesture-tap-mouse-events.html [ Failure ]
 crbug.com/591099 fast/events/touch/gesture/gesture-tap-near-iframe.html [ Failure ]
@@ -10232,7 +10240,7 @@
 crbug.com/591099 fast/events/touch/gesture/gesture-tap-paragraph-end.html [ Failure ]
 crbug.com/591099 fast/events/touch/gesture/gesture-tap-result.html [ Crash Failure ]
 crbug.com/591099 fast/events/touch/gesture/gesture-tap-scrolled.html [ Failure ]
-crbug.com/591099 fast/events/touch/gesture/gesture-tap-setrangetext-with-events.html [ Crash ]
+crbug.com/591099 fast/events/touch/gesture/gesture-tap-setrangetext-with-events.html [ Crash Pass ]
 crbug.com/591099 fast/events/touch/gesture/long-press-drag-drop-touch-editing-combined-in-iframe.html [ Failure ]
 crbug.com/591099 fast/events/touch/gesture/long-press-drag-drop-touch-editing-combined.html [ Failure ]
 crbug.com/591099 fast/events/touch/gesture/long-press-focuses-frame.html [ Failure ]
@@ -10280,7 +10288,7 @@
 crbug.com/591099 fast/events/touch/page-scaled-touch-gesture-click.html [ Failure ]
 crbug.com/591099 fast/events/touch/send-oncancel-event.html [ Failure ]
 crbug.com/591099 fast/events/touch/tap-highlight-color.html [ Failure ]
-crbug.com/591099 fast/events/touch/touch-action-range-input-crash.html [ Crash ]
+crbug.com/591099 fast/events/touch/touch-action-range-input-crash.html [ Crash Pass ]
 crbug.com/591099 fast/events/touch/touch-action-range-input.html [ Timeout ]
 crbug.com/591099 fast/events/touch/touch-action-touch-handlers.html [ Failure ]
 crbug.com/591099 fast/events/touch/touch-before-pressing-spin-button.html [ Crash Failure ]
@@ -10288,7 +10296,7 @@
 crbug.com/591099 fast/events/touch/touch-event-dispatch-no-crash.html [ Failure ]
 crbug.com/591099 fast/events/touch/touch-event-source-device-event-sender.html [ Failure ]
 crbug.com/591099 fast/events/touch/touch-fractional-coordinates.html [ Failure ]
-crbug.com/591099 fast/events/touch/touch-handler-assert-input-range.html [ Crash ]
+crbug.com/591099 fast/events/touch/touch-handler-assert-input-range.html [ Crash Failure ]
 crbug.com/591099 fast/events/touch/touch-handler-count.html [ Failure ]
 crbug.com/591099 fast/events/touch/touch-handler-iframe-plugin-assert.html [ Failure ]
 crbug.com/591099 fast/events/touch/touch-handler-iframe-unload-assert.html [ Failure ]
@@ -10338,18 +10346,18 @@
 crbug.com/591099 fast/events/xsl-onload.xhtml [ Failure ]
 crbug.com/591099 fast/eventsource/eventsource-attribute-listeners.html [ Failure ]
 crbug.com/591099 fast/eventsource/eventsource-constructor.html [ Failure ]
-crbug.com/591099 fast/files/apply-blob-url-to-img.html [ Crash ]
+crbug.com/591099 fast/files/apply-blob-url-to-img.html [ Crash Pass ]
 crbug.com/591099 fast/files/blob-close-read.html [ Failure ]
 crbug.com/591099 fast/files/blob-close-revoke.html [ Failure ]
 crbug.com/591099 fast/files/blob-close.html [ Failure ]
 crbug.com/591099 fast/files/blob-constructor.html [ Crash Failure ]
 crbug.com/591099 fast/files/blob-parts-slice-test.html [ Failure ]
-crbug.com/591099 fast/files/blob-reading-from-form-file.html [ Crash ]
+crbug.com/591099 fast/files/blob-reading-from-form-file.html [ Crash Pass ]
 crbug.com/591099 fast/files/blob-slice-test.html [ Crash Failure ]
 crbug.com/591099 fast/files/file-constructor.html [ Failure ]
 crbug.com/591099 fast/files/file-in-input-display.html [ Crash Failure ]
 crbug.com/591099 fast/files/file-list-test.html [ Crash Failure ]
-crbug.com/591099 fast/files/file-reader-abort-gc-iframe.html [ Crash ]
+crbug.com/591099 fast/files/file-reader-abort-gc-iframe.html [ Crash Failure ]
 crbug.com/591099 fast/files/file-reader-detached-no-crash.html [ Failure ]
 crbug.com/591099 fast/files/file-reader-fffd.html [ Failure ]
 crbug.com/591099 fast/files/file-reader-methods-illegal-arguments.html [ Failure ]
@@ -10413,7 +10421,7 @@
 crbug.com/591099 fast/forms/006.html [ Failure ]
 crbug.com/591099 fast/forms/007.html [ Failure ]
 crbug.com/591099 fast/forms/11423.html [ Crash Failure ]
-crbug.com/591099 fast/forms/25153.html [ Crash ]
+crbug.com/591099 fast/forms/25153.html [ Crash Pass ]
 crbug.com/591099 fast/forms/4628409.html [ Failure ]
 crbug.com/591099 fast/forms/8250.html [ Failure ]
 crbug.com/591099 fast/forms/ValidityState-customError.html [ Failure ]
@@ -10425,7 +10433,7 @@
 crbug.com/591099 fast/forms/ValidityState-stepMismatch.html [ Crash Failure ]
 crbug.com/591099 fast/forms/ValidityState-tooLong-input.html [ Crash Failure ]
 crbug.com/591099 fast/forms/ValidityState-tooLong-textarea.html [ Crash Failure ]
-crbug.com/591099 fast/forms/ValidityState-tooShort-input.html [ Crash ]
+crbug.com/591099 fast/forms/ValidityState-tooShort-input.html [ Crash Failure ]
 crbug.com/591099 fast/forms/ValidityState-tooShort-textarea.html [ Crash Failure ]
 crbug.com/591099 fast/forms/ValidityState-typeMismatch-email.html [ Failure ]
 crbug.com/591099 fast/forms/ValidityState-typeMismatch-url.html [ Failure ]
@@ -10460,7 +10468,7 @@
 crbug.com/591099 fast/forms/button/button-baseline-and-collapsing.html [ Failure ]
 crbug.com/591099 fast/forms/button/button-cannot-be-nested.html [ Failure Pass ]
 crbug.com/591099 fast/forms/button/button-click-DOM.html [ Failure ]
-crbug.com/591099 fast/forms/button/button-disabled-blur.html [ Crash ]
+crbug.com/591099 fast/forms/button/button-disabled-blur.html [ Crash Pass ]
 crbug.com/591099 fast/forms/button/button-first-line-first-letter.html [ Failure Pass ]
 crbug.com/591099 fast/forms/button/button-in-forms-collection.html [ Failure ]
 crbug.com/591099 fast/forms/button/button-inner-block-reuse.html [ Failure ]
@@ -10471,37 +10479,37 @@
 crbug.com/591099 fast/forms/calendar-picker/calendar-picker-date-types.html [ Failure Timeout ]
 crbug.com/591099 fast/forms/calendar-picker/calendar-picker-datetimelocal-with-step.html [ Crash Failure ]
 crbug.com/591099 fast/forms/calendar-picker/calendar-picker-datetimelocal.html [ Failure ]
-crbug.com/591099 fast/forms/calendar-picker/calendar-picker-key-operations.html [ Crash ]
-crbug.com/591099 fast/forms/calendar-picker/calendar-picker-mouse-operations.html [ Crash ]
+crbug.com/591099 fast/forms/calendar-picker/calendar-picker-key-operations.html [ Crash Timeout ]
+crbug.com/591099 fast/forms/calendar-picker/calendar-picker-mouse-operations.html [ Crash Failure ]
 crbug.com/591099 fast/forms/calendar-picker/calendar-picker-pre-100-year.html [ Crash Failure ]
 crbug.com/591099 fast/forms/calendar-picker/calendar-picker-should-not-change-datetimelocal-time.html [ Failure ]
-crbug.com/591099 fast/forms/calendar-picker/calendar-picker-touch-operations.html [ Crash ]
-crbug.com/591099 fast/forms/calendar-picker/calendar-picker-type-change-onchange.html [ Crash ]
-crbug.com/591099 fast/forms/calendar-picker/calendar-picker-type-change-onclick.html [ Crash ]
+crbug.com/591099 fast/forms/calendar-picker/calendar-picker-touch-operations.html [ Crash Failure ]
+crbug.com/591099 fast/forms/calendar-picker/calendar-picker-type-change-onchange.html [ Crash Failure ]
+crbug.com/591099 fast/forms/calendar-picker/calendar-picker-type-change-onclick.html [ Crash Failure ]
 crbug.com/591099 fast/forms/calendar-picker/calendar-picker-with-step.html [ Crash Failure ]
 crbug.com/591099 fast/forms/calendar-picker/date-open-picker-with-f4-key.html [ Failure ]
-crbug.com/591099 fast/forms/calendar-picker/date-picker-ax.html [ Crash ]
+crbug.com/591099 fast/forms/calendar-picker/date-picker-ax.html [ Crash Failure ]
 crbug.com/591099 fast/forms/calendar-picker/date-picker-choose-default-value-after-set-value.html [ Crash Failure ]
 crbug.com/591099 fast/forms/calendar-picker/date-picker-events.html [ Crash Failure Timeout ]
 crbug.com/591099 fast/forms/calendar-picker/date-picker-open-without-focus.html [ Failure ]
-crbug.com/591099 fast/forms/calendar-picker/datetimelocal-change-type-on-input-crash.html [ Crash ]
+crbug.com/591099 fast/forms/calendar-picker/datetimelocal-change-type-on-input-crash.html [ Crash Failure ]
 crbug.com/591099 fast/forms/calendar-picker/datetimelocal-open-picker-with-f4-key.html [ Failure ]
 crbug.com/591099 fast/forms/calendar-picker/datetimelocal-picker-choose-default-value-after-set-value.html [ Failure Timeout ]
 crbug.com/591099 fast/forms/calendar-picker/datetimelocal-picker-events.html [ Crash Failure ]
 crbug.com/591099 fast/forms/calendar-picker/month-open-picker-with-f4-key.html [ Failure ]
 crbug.com/591099 fast/forms/calendar-picker/month-picker-ax.html [ Crash Failure ]
 crbug.com/591099 fast/forms/calendar-picker/month-picker-choose-default-value-after-set-value.html [ Crash Failure ]
-crbug.com/591099 fast/forms/calendar-picker/month-picker-key-operations.html [ Crash ]
-crbug.com/591099 fast/forms/calendar-picker/month-picker-mouse-operations.html [ Crash Timeout ]
-crbug.com/591099 fast/forms/calendar-picker/month-picker-touch-operations.html [ Crash Timeout ]
+crbug.com/591099 fast/forms/calendar-picker/month-picker-key-operations.html [ Crash Timeout ]
+crbug.com/591099 fast/forms/calendar-picker/month-picker-mouse-operations.html [ Crash Failure Timeout ]
+crbug.com/591099 fast/forms/calendar-picker/month-picker-touch-operations.html [ Crash Failure Timeout ]
 crbug.com/591099 fast/forms/calendar-picker/month-picker-with-step.html [ Crash Failure ]
 crbug.com/591099 fast/forms/calendar-picker/week-open-picker-with-f4-key.html [ Failure ]
 crbug.com/591099 fast/forms/calendar-picker/week-picker-ax.html [ Crash Failure ]
 crbug.com/591099 fast/forms/calendar-picker/week-picker-choose-default-value-after-set-value.html [ Crash Failure ]
-crbug.com/591099 fast/forms/calendar-picker/week-picker-close-no-crash.html [ Crash ]
-crbug.com/591099 fast/forms/calendar-picker/week-picker-key-operations.html [ Crash ]
-crbug.com/591099 fast/forms/calendar-picker/week-picker-mouse-operations.html [ Crash ]
-crbug.com/591099 fast/forms/calendar-picker/week-picker-touch-operations.html [ Crash ]
+crbug.com/591099 fast/forms/calendar-picker/week-picker-close-no-crash.html [ Crash Pass ]
+crbug.com/591099 fast/forms/calendar-picker/week-picker-key-operations.html [ Crash Timeout ]
+crbug.com/591099 fast/forms/calendar-picker/week-picker-mouse-operations.html [ Crash Failure ]
+crbug.com/591099 fast/forms/calendar-picker/week-picker-touch-operations.html [ Crash Failure ]
 crbug.com/591099 fast/forms/caret-rtl.html [ Failure ]
 crbug.com/591099 fast/forms/change-form-element-document-crash.html [ Failure ]
 crbug.com/591099 fast/forms/checkValidity-cancel.html [ Failure ]
@@ -10513,15 +10521,15 @@
 crbug.com/591099 fast/forms/checkbox/checkbox-nested-click-event-on-label.html [ Failure ]
 crbug.com/591099 fast/forms/checkbox/checkbox-onchange.html [ Failure ]
 crbug.com/591099 fast/forms/clone-input-with-dirty-value.html [ Crash Failure ]
-crbug.com/591099 fast/forms/color/color-no-event-during-detach.html [ Crash ]
+crbug.com/591099 fast/forms/color/color-no-event-during-detach.html [ Crash Pass ]
 crbug.com/591099 fast/forms/color/color-setrangetext.html [ Failure ]
 crbug.com/591099 fast/forms/color/color-suggestion-picker-appearance-zoom125.html [ Failure ]
 crbug.com/591099 fast/forms/color/color-type-change-on-close.html [ Crash Failure ]
 crbug.com/591099 fast/forms/color/color-value-sanitization.html [ Failure ]
 crbug.com/591099 fast/forms/color/input-appearance-color.html [ Failure ]
 crbug.com/591099 fast/forms/color/input-color-choose-default-value-after-set-value.html [ Failure ]
-crbug.com/591099 fast/forms/color/input-color-chooser-shown-readonly.html [ Crash ]
-crbug.com/591099 fast/forms/color/input-color-chooser-shown.html [ Crash ]
+crbug.com/591099 fast/forms/color/input-color-chooser-shown-readonly.html [ Crash Pass ]
+crbug.com/591099 fast/forms/color/input-color-chooser-shown.html [ Crash Pass ]
 crbug.com/591099 fast/forms/color/input-color-onchange-event.html [ Failure ]
 crbug.com/591099 fast/forms/color/input-value-sanitization-color.html [ Failure ]
 crbug.com/591099 fast/forms/control-clip-overflow.html [ Failure ]
@@ -10540,9 +10548,9 @@
 crbug.com/591099 fast/forms/datalist/range-snap-to-datalist.html [ Failure ]
 crbug.com/591099 fast/forms/datalist/slider-appearance-with-ticks-crash.html [ Failure ]
 crbug.com/591099 fast/forms/date-multiple-fields/date-clearbutton-preventdefault-mousecapture-status.html [ Crash Failure ]
-crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-ax-aria-attributes.html [ Crash ]
-crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-ax-value-changed-notification.html [ Crash ]
-crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-blur-and-focus-events.html [ Crash ]
+crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-ax-aria-attributes.html [ Crash Failure ]
+crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-ax-value-changed-notification.html [ Crash Failure ]
+crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-blur-and-focus-events.html [ Crash Failure ]
 crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-change-layout-by-value.html [ Failure ]
 crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-choose-default-value-after-set-value.html [ Failure ]
 crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-clearbutton-change-and-input-events.html [ Crash Failure ]
@@ -10555,19 +10563,19 @@
 crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-onblur-setvalue-onfocusremoved.html [ Crash Failure ]
 crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-preserve-value-after-history-back.html [ Failure ]
 crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-readonly-subfield.html [ Failure ]
-crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-reset-value-after-reloads.html [ Crash ]
-crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-spinbutton-change-and-input-events.html [ Crash ]
+crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-reset-value-after-reloads.html [ Crash Failure ]
+crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-spinbutton-change-and-input-events.html [ Crash Failure ]
 crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-stepup-stepdown-from-renderer.html [ Crash Failure Timeout ]
 crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-validity-badinput.html [ Crash Failure ]
 crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-value-set-empty.html [ Failure ]
-crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-wheel-event.html [ Crash ]
+crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-wheel-event.html [ Crash Failure ]
 crbug.com/591099 fast/forms/date/ValidityState-rangeOverflow-date.html [ Failure ]
 crbug.com/591099 fast/forms/date/ValidityState-rangeUnderflow-date.html [ Failure ]
 crbug.com/591099 fast/forms/date/ValidityState-stepMismatch-date.html [ Failure ]
 crbug.com/591099 fast/forms/date/ValidityState-typeMismatch-date.html [ Failure ]
 crbug.com/591099 fast/forms/date/date-appearance-basic.html [ Crash Failure ]
 crbug.com/591099 fast/forms/date/date-appearance-pseudo-elements.html [ Crash Failure ]
-crbug.com/591099 fast/forms/date/date-format-warning.html [ Crash ]
+crbug.com/591099 fast/forms/date/date-format-warning.html [ Crash Pass ]
 crbug.com/591099 fast/forms/date/date-input-type.html [ Failure ]
 crbug.com/591099 fast/forms/date/date-interactive-validation-required.html [ Crash Failure ]
 crbug.com/591099 fast/forms/date/date-pseudo-classes.html [ Failure ]
@@ -10578,9 +10586,9 @@
 crbug.com/591099 fast/forms/date/input-valueasdate-date.html [ Failure ]
 crbug.com/591099 fast/forms/date/input-valueasnumber-date.html [ Failure ]
 crbug.com/591099 fast/forms/date/no-page-popup-controller.html [ Failure ]
-crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-ax-aria-attributes.html [ Crash ]
-crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-ax-value-changed-notification.html [ Crash ]
-crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-blur-and-focus-events.html [ Crash ]
+crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-ax-aria-attributes.html [ Crash Failure ]
+crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-ax-value-changed-notification.html [ Crash Failure ]
+crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-blur-and-focus-events.html [ Crash Failure ]
 crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-change-layout-by-value.html [ Failure ]
 crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-choose-default-value-after-set-value.html [ Failure ]
 crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-clearbutton-change-and-input-events.html [ Crash Failure ]
@@ -10589,12 +10597,12 @@
 crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-mouse-events.html [ Crash Failure ]
 crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-preserve-value-after-history-back.html [ Crash Failure ]
 crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-readonly-subfield.html [ Failure ]
-crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-reset-value-after-reloads.html [ Crash ]
-crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-spinbutton-change-and-input-events.html [ Crash ]
+crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-reset-value-after-reloads.html [ Crash Failure ]
+crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-spinbutton-change-and-input-events.html [ Crash Failure ]
 crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-stepup-stepdown-from-renderer.html [ Crash Failure ]
 crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-validity-badinput.html [ Crash Failure ]
 crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-value-set-empty.html [ Failure ]
-crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-wheel-event.html [ Crash ]
+crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-wheel-event.html [ Crash Failure ]
 crbug.com/591099 fast/forms/datetimelocal/ValidityState-rangeOverflow-datetimelocal.html [ Failure ]
 crbug.com/591099 fast/forms/datetimelocal/ValidityState-rangeUnderflow-datetimelocal.html [ Failure ]
 crbug.com/591099 fast/forms/datetimelocal/ValidityState-stepMismatch-datetimelocal.html [ Failure ]
@@ -10624,11 +10632,11 @@
 crbug.com/591099 fast/forms/empty-get.html [ Failure ]
 crbug.com/591099 fast/forms/encoding-test.html [ Failure ]
 crbug.com/591099 fast/forms/enctype-attribute.html [ Failure ]
-crbug.com/591099 fast/forms/enter-clicks-buttons.html [ Crash ]
+crbug.com/591099 fast/forms/enter-clicks-buttons.html [ Crash Failure ]
 crbug.com/591099 fast/forms/fieldset/fieldset-align.html [ Failure ]
 crbug.com/591099 fast/forms/fieldset/fieldset-crash.html [ Failure ]
 crbug.com/591099 fast/forms/fieldset/fieldset-disabled.html [ Crash Failure ]
-crbug.com/591099 fast/forms/fieldset/fieldset-elements.html [ Crash ]
+crbug.com/591099 fast/forms/fieldset/fieldset-elements.html [ Crash Failure ]
 crbug.com/591099 fast/forms/fieldset/fieldset-form-collection-radionode-list.html [ Crash Failure ]
 crbug.com/591099 fast/forms/fieldset/fieldset-legend-padding-unclipped-fieldset-border.html [ Failure ]
 crbug.com/591099 fast/forms/fieldset/fieldset-name.html [ Failure ]
@@ -10644,7 +10652,7 @@
 crbug.com/591099 fast/forms/fieldset/legend-after-margin-with-before-border-horizontal-mode.html [ Failure ]
 crbug.com/591099 fast/forms/fieldset/legend-display-none.html [ Failure ]
 crbug.com/591099 fast/forms/fieldset/legend-form.html [ Failure ]
-crbug.com/591099 fast/forms/file/file-cloneNode.html [ Crash ]
+crbug.com/591099 fast/forms/file/file-cloneNode.html [ Crash Pass ]
 crbug.com/591099 fast/forms/file/file-input-capture.html [ Failure ]
 crbug.com/591099 fast/forms/file/file-input-change-event.html [ Crash Failure ]
 crbug.com/591099 fast/forms/file/file-input-direction.html [ Failure ]
@@ -10657,7 +10665,7 @@
 crbug.com/591099 fast/forms/file/get-file-upload.html [ Crash Failure ]
 crbug.com/591099 fast/forms/file/input-file-entries.html [ Crash Failure ]
 crbug.com/591099 fast/forms/file/input-file-label.html [ Crash Failure ]
-crbug.com/591099 fast/forms/file/input-file-re-render.html [ Crash ]
+crbug.com/591099 fast/forms/file/input-file-re-render.html [ Crash Failure ]
 crbug.com/591099 fast/forms/file/input-file-value-with-zoom.html [ Crash Failure ]
 crbug.com/591099 fast/forms/file/input-file-value.html [ Crash Failure ]
 crbug.com/591099 fast/forms/file/input-file-write-files.html [ Crash Failure ]
@@ -10672,7 +10680,7 @@
 crbug.com/591099 fast/forms/focus-style-pending.html [ Failure Pass ]
 crbug.com/591099 fast/forms/focus-with-display-block.html [ Failure ]
 crbug.com/591099 fast/forms/focus.html [ Crash Failure ]
-crbug.com/591099 fast/forms/focus2.html [ Crash ]
+crbug.com/591099 fast/forms/focus2.html [ Crash Failure ]
 crbug.com/591099 fast/forms/form-added-to-table.html [ Failure Pass ]
 crbug.com/591099 fast/forms/form-and-frame-interaction-retains-values.html [ Crash Failure ]
 crbug.com/591099 fast/forms/form-associated-element-crash.html [ Crash Failure ]
@@ -10686,9 +10694,9 @@
 crbug.com/591099 fast/forms/form-attribute-not-in-document.html [ Failure ]
 crbug.com/591099 fast/forms/form-attribute.html [ Crash Failure ]
 crbug.com/591099 fast/forms/form-collection-elements-order.html [ Crash Failure ]
-crbug.com/591099 fast/forms/form-collection-elements.html [ Crash ]
+crbug.com/591099 fast/forms/form-collection-elements.html [ Crash Failure ]
 crbug.com/591099 fast/forms/form-collection-lookup.html [ Failure ]
-crbug.com/591099 fast/forms/form-collection-radio-node-list.html [ Crash ]
+crbug.com/591099 fast/forms/form-collection-radio-node-list.html [ Crash Failure ]
 crbug.com/591099 fast/forms/form-data-encoding-normalization-overrun.html [ Failure ]
 crbug.com/591099 fast/forms/form-dirname-attribute.html [ Failure ]
 crbug.com/591099 fast/forms/form-element-geometry.html [ Crash Failure ]
@@ -10700,7 +10708,7 @@
 crbug.com/591099 fast/forms/form-radio-node-list.html [ Crash Failure ]
 crbug.com/591099 fast/forms/form-submission-cancelable.html [ Crash Failure ]
 crbug.com/591099 fast/forms/form-submit-in-image-document.html [ Failure ]
-crbug.com/591099 fast/forms/form-submit-in-submit-event.html [ Crash ]
+crbug.com/591099 fast/forms/form-submit-in-submit-event.html [ Crash Pass ]
 crbug.com/591099 fast/forms/formaction-attribute.html [ Failure ]
 crbug.com/591099 fast/forms/formmethod-attribute-button-html.html [ Failure ]
 crbug.com/591099 fast/forms/formmethod-attribute-input-2.html [ Failure ]
@@ -10720,14 +10728,14 @@
 crbug.com/591099 fast/forms/image-disconnected-during-parse.html [ Failure ]
 crbug.com/591099 fast/forms/image/002.html [ Crash Failure ]
 crbug.com/591099 fast/forms/image/005.html [ Failure ]
-crbug.com/591099 fast/forms/image/fallback-reattach-crash.html [ Crash ]
+crbug.com/591099 fast/forms/image/fallback-reattach-crash.html [ Crash Pass ]
 crbug.com/591099 fast/forms/image/image-error-event-modifies-type-crash.html [ Crash Failure ]
 crbug.com/591099 fast/forms/image/image-setrangetext.html [ Crash Failure ]
 crbug.com/591099 fast/forms/image/input-align-image.html [ Failure ]
-crbug.com/591099 fast/forms/image/input-image-submit.html [ Crash ]
+crbug.com/591099 fast/forms/image/input-image-submit.html [ Crash Pass ]
 crbug.com/591099 fast/forms/image/input-width-height-attributes-without-renderer-loaded-image.html [ Crash Pass ]
 crbug.com/591099 fast/forms/image/width-and-height-of-detached-input.html [ Failure ]
-crbug.com/591099 fast/forms/implicit-submission.html [ Crash ]
+crbug.com/591099 fast/forms/implicit-submission.html [ Crash Failure ]
 crbug.com/591099 fast/forms/incremental-dom-property.html [ Failure ]
 crbug.com/591099 fast/forms/indeterminate-input-types.html [ Crash Failure ]
 crbug.com/591099 fast/forms/indeterminate.html [ Failure ]
@@ -10743,14 +10751,14 @@
 crbug.com/591099 fast/forms/input-multiple.html [ Crash Failure ]
 crbug.com/591099 fast/forms/input-named-action-overrides-action-attribute.html [ Failure ]
 crbug.com/591099 fast/forms/input-pattern.html [ Failure ]
-crbug.com/591099 fast/forms/input-readonly-select.html [ Crash ]
+crbug.com/591099 fast/forms/input-readonly-select.html [ Crash Failure ]
 crbug.com/591099 fast/forms/input-select-api-support.html [ Crash Failure ]
 crbug.com/591099 fast/forms/input-step-as-double.html [ Crash Failure ]
 crbug.com/591099 fast/forms/input-stepup-stepdown.html [ Failure ]
-crbug.com/591099 fast/forms/input-type-change-focusout.html [ Crash ]
+crbug.com/591099 fast/forms/input-type-change-focusout.html [ Crash Failure ]
 crbug.com/591099 fast/forms/input-type-change-in-onfocus-keyboard.html [ Failure ]
 crbug.com/591099 fast/forms/input-type-change-in-onfocus-mouse.html [ Failure ]
-crbug.com/591099 fast/forms/input-type-change.html [ Crash ]
+crbug.com/591099 fast/forms/input-type-change.html [ Crash Failure ]
 crbug.com/591099 fast/forms/input-type-change3.html [ Failure ]
 crbug.com/591099 fast/forms/input-type-text-min-width.html [ Crash Failure ]
 crbug.com/591099 fast/forms/input-user-modify.html [ Failure ]
@@ -10758,7 +10766,7 @@
 crbug.com/591099 fast/forms/input-value.html [ Failure ]
 crbug.com/591099 fast/forms/input-valueasnumber-unsupported.html [ Crash Failure ]
 crbug.com/591099 fast/forms/input-width-height-attributes.html [ Failure ]
-crbug.com/591099 fast/forms/input-widths.html [ Crash ]
+crbug.com/591099 fast/forms/input-widths.html [ Crash Failure ]
 crbug.com/591099 fast/forms/input-zero-height-focus.html [ Failure ]
 crbug.com/591099 fast/forms/interactive-validation-assertion-by-validate-twice.html [ Failure ]
 crbug.com/591099 fast/forms/interactive-validation-cancel.html [ Failure ]
@@ -10771,26 +10779,26 @@
 crbug.com/591099 fast/forms/interactive-validation-required-checkbox.html [ Failure ]
 crbug.com/591099 fast/forms/interactive-validation-select-crash.html [ Failure ]
 crbug.com/591099 fast/forms/label/continous-click-on-label.html [ Failure ]
-crbug.com/591099 fast/forms/label/hover-on-moving-mouse-checkbox-to-parent-label.html [ Failure ]
-crbug.com/591099 fast/forms/label/label-contains-other-interactive-content.html [ Crash ]
-crbug.com/591099 fast/forms/label/label-event-order.html [ Crash ]
+crbug.com/591099 fast/forms/label/hover-on-moving-mouse-checkbox-to-parent-label.html [ Failure Pass ]
+crbug.com/591099 fast/forms/label/label-contains-other-interactive-content.html [ Crash Pass ]
+crbug.com/591099 fast/forms/label/label-event-order.html [ Crash Failure ]
 crbug.com/591099 fast/forms/label/label-selection-by-dragging.html [ Failure ]
 crbug.com/591099 fast/forms/label/label-selection-by-textSelection-and-click.html [ Failure ]
 crbug.com/591099 fast/forms/label/label-selection.html [ Failure ]
-crbug.com/591099 fast/forms/label/labelable-elements.html [ Crash ]
-crbug.com/591099 fast/forms/label/labels-add-htmlFor-label.html [ Crash ]
-crbug.com/591099 fast/forms/label/labels-add-parent-label.html [ Crash ]
-crbug.com/591099 fast/forms/label/labels-change-htmlFor-attribute.html [ Crash ]
+crbug.com/591099 fast/forms/label/labelable-elements.html [ Crash Failure ]
+crbug.com/591099 fast/forms/label/labels-add-htmlFor-label.html [ Crash Failure ]
+crbug.com/591099 fast/forms/label/labels-add-parent-label.html [ Crash Failure ]
+crbug.com/591099 fast/forms/label/labels-change-htmlFor-attribute.html [ Crash Failure ]
 crbug.com/591099 fast/forms/label/labels-contenteditable.html [ Failure ]
 crbug.com/591099 fast/forms/label/labels-custom-property.html [ Failure ]
 crbug.com/591099 fast/forms/label/labels-item-index.html [ Failure ]
-crbug.com/591099 fast/forms/label/labels-multiple-sibling-labels.html [ Crash ]
+crbug.com/591099 fast/forms/label/labels-multiple-sibling-labels.html [ Crash Failure ]
 crbug.com/591099 fast/forms/label/labels-owner-node-adopted.html [ Crash Failure ]
-crbug.com/591099 fast/forms/label/labels-parent-and-sibling-labels.html [ Crash ]
-crbug.com/591099 fast/forms/label/labels-remove-htmlFor-attribute.html [ Crash ]
-crbug.com/591099 fast/forms/label/labels-remove-htmlFor-label.html [ Crash ]
-crbug.com/591099 fast/forms/label/labels-remove-parent-label.html [ Crash ]
-crbug.com/591099 fast/forms/label/labels-set-htmlFor-attribute.html [ Crash ]
+crbug.com/591099 fast/forms/label/labels-parent-and-sibling-labels.html [ Crash Failure ]
+crbug.com/591099 fast/forms/label/labels-remove-htmlFor-attribute.html [ Crash Failure ]
+crbug.com/591099 fast/forms/label/labels-remove-htmlFor-label.html [ Crash Failure ]
+crbug.com/591099 fast/forms/label/labels-remove-parent-label.html [ Crash Failure ]
+crbug.com/591099 fast/forms/label/labels-set-htmlFor-attribute.html [ Crash Failure ]
 crbug.com/591099 fast/forms/label/selection-disabled-label.html [ Failure ]
 crbug.com/591099 fast/forms/large-parts.html [ Failure ]
 crbug.com/591099 fast/forms/lazy-event-listener-scope-chain.html [ Crash Failure ]
@@ -10802,9 +10810,9 @@
 crbug.com/591099 fast/forms/minWidthPercent.html [ Failure ]
 crbug.com/591099 fast/forms/misplaced-img-form-registration.html [ Failure ]
 crbug.com/591099 fast/forms/missing-action.html [ Failure ]
-crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-ax-aria-attributes.html [ Crash ]
-crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-ax-value-changed-notification.html [ Crash ]
-crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-blur-and-focus-events.html [ Crash ]
+crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-ax-aria-attributes.html [ Crash Failure ]
+crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-ax-value-changed-notification.html [ Crash Failure ]
+crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-blur-and-focus-events.html [ Crash Failure ]
 crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-change-layout-by-value.html [ Failure ]
 crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-choose-default-value-after-set-value.html [ Failure ]
 crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-clearbutton-change-and-input-events.html [ Crash Failure ]
@@ -10813,12 +10821,12 @@
 crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-mouse-events.html [ Crash Failure ]
 crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-preserve-value-after-history-back.html [ Failure ]
 crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-readonly-subfield.html [ Failure ]
-crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-reset-value-after-reloads.html [ Crash ]
-crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-spinbutton-change-and-input-events.html [ Crash ]
+crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-reset-value-after-reloads.html [ Crash Failure ]
+crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-spinbutton-change-and-input-events.html [ Crash Failure ]
 crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-stepup-stepdown-from-renderer.html [ Crash Failure ]
 crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-validity-badinput.html [ Failure ]
 crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-value-set-empty.html [ Failure ]
-crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-wheel-event.html [ Crash ]
+crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-wheel-event.html [ Crash Failure ]
 crbug.com/591099 fast/forms/month/ValidityState-rangeOverflow-month.html [ Failure ]
 crbug.com/591099 fast/forms/month/ValidityState-rangeUnderflow-month.html [ Failure ]
 crbug.com/591099 fast/forms/month/ValidityState-stepMismatch-month.html [ Failure ]
@@ -10833,7 +10841,7 @@
 crbug.com/591099 fast/forms/month/month-pseudo-classes.html [ Failure ]
 crbug.com/591099 fast/forms/month/month-setrangetext.html [ Failure ]
 crbug.com/591099 fast/forms/month/month-stepup-stepdown.html [ Failure ]
-crbug.com/591099 fast/forms/mouseevent_disabled_form_control.html [ Crash ]
+crbug.com/591099 fast/forms/mouseevent_disabled_form_control.html [ Crash Pass ]
 crbug.com/591099 fast/forms/multiple-selected-options-innerHTML.html [ Failure ]
 crbug.com/591099 fast/forms/mutation-event-recalc.html [ Failure ]
 crbug.com/591099 fast/forms/negativeLineHeight.html [ Crash Failure ]
@@ -10846,31 +10854,31 @@
 crbug.com/591099 fast/forms/number/number-change-event-by-readonly.html [ Failure ]
 crbug.com/591099 fast/forms/number/number-change-type-on-focus.html [ Crash Failure ]
 crbug.com/591099 fast/forms/number/number-commit-valid-only.html [ Crash Failure ]
-crbug.com/591099 fast/forms/number/number-input-changeevent.html [ Crash ]
+crbug.com/591099 fast/forms/number/number-input-changeevent.html [ Crash Failure ]
 crbug.com/591099 fast/forms/number/number-interactive-validation-required.html [ Crash Failure ]
 crbug.com/591099 fast/forms/number/number-keyoperation.html [ Crash Failure ]
-crbug.com/591099 fast/forms/number/number-losing-renderer-on-click.html [ Crash ]
-crbug.com/591099 fast/forms/number/number-outofrange.html [ Crash ]
+crbug.com/591099 fast/forms/number/number-losing-renderer-on-click.html [ Crash Pass ]
+crbug.com/591099 fast/forms/number/number-outofrange.html [ Crash Failure ]
 crbug.com/591099 fast/forms/number/number-setrangetext.html [ Failure ]
 crbug.com/591099 fast/forms/number/number-size.html [ Failure Timeout ]
 crbug.com/591099 fast/forms/number/number-skip-spaces-in-user-input.html [ Failure ]
-crbug.com/591099 fast/forms/number/number-spinbutton-capturing.html [ Crash ]
-crbug.com/591099 fast/forms/number/number-spinbutton-change-and-input-events.html [ Crash ]
-crbug.com/591099 fast/forms/number/number-spinbutton-click-in-iframe.html [ Crash ]
-crbug.com/591099 fast/forms/number/number-spinbutton-crash-on-detach.html [ Crash ]
+crbug.com/591099 fast/forms/number/number-spinbutton-capturing.html [ Crash Failure ]
+crbug.com/591099 fast/forms/number/number-spinbutton-change-and-input-events.html [ Crash Failure ]
+crbug.com/591099 fast/forms/number/number-spinbutton-click-in-iframe.html [ Crash Failure ]
+crbug.com/591099 fast/forms/number/number-spinbutton-crash-on-detach.html [ Crash Pass ]
 crbug.com/591099 fast/forms/number/number-spinbutton-gets-disabled-or-readonly.html [ Crash Failure ]
 crbug.com/591099 fast/forms/number/number-spinbutton-in-multi-column.html [ Failure ]
-crbug.com/591099 fast/forms/number/number-spinbutton-state.html [ Crash ]
+crbug.com/591099 fast/forms/number/number-spinbutton-state.html [ Crash Failure ]
 crbug.com/591099 fast/forms/number/number-stepup-stepdown-from-renderer.html [ Crash Failure Timeout ]
 crbug.com/591099 fast/forms/number/number-stepup-stepdown.html [ Failure ]
 crbug.com/591099 fast/forms/number/number-validation-message.html [ Crash Failure ]
-crbug.com/591099 fast/forms/number/number-validity-badinput.html [ Crash ]
+crbug.com/591099 fast/forms/number/number-validity-badinput.html [ Crash Failure ]
 crbug.com/591099 fast/forms/number/number-validity-rangeoverflow.html [ Failure ]
 crbug.com/591099 fast/forms/number/number-validity-rangeunderflow.html [ Failure ]
 crbug.com/591099 fast/forms/number/number-validity-stepmismatch.html [ Crash Failure ]
 crbug.com/591099 fast/forms/number/number-validity-typemismatch.html [ Failure ]
 crbug.com/591099 fast/forms/number/number-valueasnumber.html [ Failure ]
-crbug.com/591099 fast/forms/number/number-wheel-event.html [ Crash ]
+crbug.com/591099 fast/forms/number/number-wheel-event.html [ Crash Failure ]
 crbug.com/591099 fast/forms/numeric-input-name.html [ Failure ]
 crbug.com/591099 fast/forms/old-names.html [ Failure ]
 crbug.com/591099 fast/forms/onselect-textfield.html [ Failure ]
@@ -10901,7 +10909,7 @@
 crbug.com/591099 fast/forms/radio/radio-group-arrow-cycle-edge.html [ Failure ]
 crbug.com/591099 fast/forms/radio/radio-group-document-destruction.html [ Failure ]
 crbug.com/591099 fast/forms/radio/radio-group-in-detached-form.html [ Failure ]
-crbug.com/591099 fast/forms/radio/radio-group-keyboard-change-event.html [ Crash ]
+crbug.com/591099 fast/forms/radio/radio-group-keyboard-change-event.html [ Crash Pass ]
 crbug.com/591099 fast/forms/radio/radio-group-remove-required.html [ Failure ]
 crbug.com/591099 fast/forms/radio/radio-group.html [ Failure ]
 crbug.com/591099 fast/forms/radio/radio-indeterminate-pseudo-class.html [ Failure ]
@@ -10912,7 +10920,7 @@
 crbug.com/591099 fast/forms/radio/radio-remove-form-attr.html [ Failure ]
 crbug.com/591099 fast/forms/radio/radio-restore-preventDefault.html [ Failure ]
 crbug.com/591099 fast/forms/radio/radio_checked.html [ Failure ]
-crbug.com/591099 fast/forms/radio/radio_checked_dynamic.html [ Crash ]
+crbug.com/591099 fast/forms/radio/radio_checked_dynamic.html [ Crash Pass ]
 crbug.com/591099 fast/forms/radio/radio_checked_name.html [ Failure ]
 crbug.com/591099 fast/forms/radio/remove-radio-button-assert.html [ Failure ]
 crbug.com/591099 fast/forms/radio/state-restore-radio-group.html [ Crash Failure ]
@@ -10940,11 +10948,11 @@
 crbug.com/591099 fast/forms/range/range-thumb-height-percentage.html [ Failure ]
 crbug.com/591099 fast/forms/range/range-type-change-crash.html [ Failure ]
 crbug.com/591099 fast/forms/range/range-type-change-onchange-2.html [ Failure ]
-crbug.com/591099 fast/forms/range/range-type-change-onchange.html [ Crash ]
-crbug.com/591099 fast/forms/range/range-type-change-oninput.html [ Crash ]
+crbug.com/591099 fast/forms/range/range-type-change-onchange.html [ Crash Failure ]
+crbug.com/591099 fast/forms/range/range-type-change-oninput.html [ Crash Pass ]
 crbug.com/591099 fast/forms/range/range-value-rounding.html [ Failure Timeout ]
 crbug.com/591099 fast/forms/range/slider-appearance-crash.html [ Failure ]
-crbug.com/591099 fast/forms/range/slider-delete-while-dragging-thumb.html [ Crash ]
+crbug.com/591099 fast/forms/range/slider-delete-while-dragging-thumb.html [ Crash Failure ]
 crbug.com/591099 fast/forms/range/slider-hit-testing.html [ Failure ]
 crbug.com/591099 fast/forms/range/slider-in-multi-column.html [ Failure ]
 crbug.com/591099 fast/forms/range/slider-inline-crash.html [ Failure ]
@@ -10956,31 +10964,31 @@
 crbug.com/591099 fast/forms/range/thumbslider-crash.html [ Failure ]
 crbug.com/591099 fast/forms/range/thumbslider-no-parent-slider.html [ Failure ]
 crbug.com/591099 fast/forms/removed-image-as-property.html [ Crash Failure ]
-crbug.com/591099 fast/forms/render-text-crash.html [ Crash ]
+crbug.com/591099 fast/forms/render-text-crash.html [ Crash Failure ]
 crbug.com/591099 fast/forms/reparented-image-as-property.html [ Failure ]
 crbug.com/591099 fast/forms/reportValidity-cancel.html [ Failure ]
-crbug.com/591099 fast/forms/reportValidity-handler-updates-dom.html [ Crash ]
+crbug.com/591099 fast/forms/reportValidity-handler-updates-dom.html [ Crash Failure ]
 crbug.com/591099 fast/forms/reportValidity-invalid.html [ Crash Failure ]
 crbug.com/591099 fast/forms/reportValidity-valid.html [ Crash Failure ]
 crbug.com/591099 fast/forms/required-attribute-001.html [ Failure ]
 crbug.com/591099 fast/forms/required-attribute-002.html [ Failure ]
 crbug.com/591099 fast/forms/reset-autofilled.html [ Failure ]
-crbug.com/591099 fast/forms/restore-selection-after-layout.html [ Crash ]
-crbug.com/591099 fast/forms/search/abspos-cancel-button-crash.html [ Crash ]
+crbug.com/591099 fast/forms/restore-selection-after-layout.html [ Crash Failure ]
+crbug.com/591099 fast/forms/search/abspos-cancel-button-crash.html [ Crash Pass ]
 crbug.com/591099 fast/forms/search/input-search-press-escape-key.html [ Crash Failure ]
 crbug.com/591099 fast/forms/search/search-abs-pos-cancel-button.html [ Crash Failure ]
 crbug.com/591099 fast/forms/search/search-appearance-basic.html [ Crash Failure ]
-crbug.com/591099 fast/forms/search/search-cancel-button-events.html [ Crash ]
+crbug.com/591099 fast/forms/search/search-cancel-button-events.html [ Crash Failure ]
 crbug.com/591099 fast/forms/search/search-cancel-button-mouseup.html [ Crash Failure ]
 crbug.com/591099 fast/forms/search/search-cancel-button-style-sharing.html [ Crash Failure ]
-crbug.com/591099 fast/forms/search/search-delete-while-cancel-button-clicked.html [ Crash ]
+crbug.com/591099 fast/forms/search/search-delete-while-cancel-button-clicked.html [ Crash Failure ]
 crbug.com/591099 fast/forms/search/search-disabled-readonly.html [ Crash Failure ]
 crbug.com/591099 fast/forms/search/search-display-none-cancel-button.html [ Crash Failure ]
 crbug.com/591099 fast/forms/search/search-hide-cancel-on-cancel.html [ Crash Failure ]
 crbug.com/591099 fast/forms/search/search-rtl.html [ Crash Failure ]
 crbug.com/591099 fast/forms/search/search-setrangetext.html [ Crash Failure ]
 crbug.com/591099 fast/forms/search/search-transformed.html [ Crash Failure ]
-crbug.com/591099 fast/forms/search/search-type-change-crash.html [ Crash ]
+crbug.com/591099 fast/forms/search/search-type-change-crash.html [ Crash Pass ]
 crbug.com/591099 fast/forms/search/search-vertical-alignment.html [ Crash Failure ]
 crbug.com/591099 fast/forms/search/search-zoomed.html [ Crash Failure ]
 crbug.com/591099 fast/forms/search/searchfield-heights.html [ Crash Failure ]
@@ -10998,10 +11006,10 @@
 crbug.com/591099 fast/forms/select-popup/popup-menu-appearance-zoom110.html [ Failure ]
 crbug.com/591099 fast/forms/select-popup/popup-menu-appearance.html [ Failure ]
 crbug.com/591099 fast/forms/select-popup/popup-menu-ax.html [ Crash Failure ]
-crbug.com/591099 fast/forms/select-popup/popup-menu-crash-on-cancel.html [ Crash ]
+crbug.com/591099 fast/forms/select-popup/popup-menu-crash-on-cancel.html [ Crash Failure ]
 crbug.com/591099 fast/forms/select-popup/popup-menu-crash-on-close.html [ Failure ]
 crbug.com/591099 fast/forms/select-popup/popup-menu-crash-on-select.html [ Failure ]
-crbug.com/591099 fast/forms/select-popup/popup-menu-crash-on-style-update.html [ Crash ]
+crbug.com/591099 fast/forms/select-popup/popup-menu-crash-on-style-update.html [ Crash Pass ]
 crbug.com/591099 fast/forms/select-popup/popup-menu-mouse-operations.html [ Failure ]
 crbug.com/591099 fast/forms/select-popup/popup-menu-nested-style.html [ Failure ]
 crbug.com/591099 fast/forms/select-popup/popup-menu-touch-operations.html [ Failure Timeout ]
@@ -11034,13 +11042,13 @@
 crbug.com/591099 fast/forms/select/listbox-clip.html [ Failure ]
 crbug.com/591099 fast/forms/select/listbox-deselect-scroll.html [ Failure ]
 crbug.com/591099 fast/forms/select/listbox-disabled-scroll-no-onchange.html [ Failure ]
-crbug.com/591099 fast/forms/select/listbox-drag-in-from-outside.html [ Crash ]
+crbug.com/591099 fast/forms/select/listbox-drag-in-from-outside.html [ Crash Pass ]
 crbug.com/591099 fast/forms/select/listbox-drag-in-non-multiple.html [ Failure ]
 crbug.com/591099 fast/forms/select/listbox-focusable-items.html [ Failure ]
 crbug.com/591099 fast/forms/select/listbox-height-with-before.html [ Failure ]
 crbug.com/591099 fast/forms/select/listbox-hit-test-zoomed.html [ Failure ]
 crbug.com/591099 fast/forms/select/listbox-in-multi-column.html [ Failure ]
-crbug.com/591099 fast/forms/select/listbox-no-force-layout.html [ Crash ]
+crbug.com/591099 fast/forms/select/listbox-no-force-layout.html [ Crash Pass ]
 crbug.com/591099 fast/forms/select/listbox-onchange.html [ Failure ]
 crbug.com/591099 fast/forms/select/listbox-oninput-fired.html [ Failure ]
 crbug.com/591099 fast/forms/select/listbox-overlay-scrollbar.html [ Failure Pass ]
@@ -11049,7 +11057,7 @@
 crbug.com/591099 fast/forms/select/listbox-scrollbar-incremental-load.html [ Failure ]
 crbug.com/591099 fast/forms/select/listbox-select-reset.html [ Failure ]
 crbug.com/591099 fast/forms/select/listbox-selection-2.html [ Failure ]
-crbug.com/591099 fast/forms/select/listbox-selection.html [ Crash ]
+crbug.com/591099 fast/forms/select/listbox-selection.html [ Crash Failure ]
 crbug.com/591099 fast/forms/select/listbox-tap-input-change-event.html [ Failure ]
 crbug.com/591099 fast/forms/select/listbox-tap.html [ Failure ]
 crbug.com/591099 fast/forms/select/listbox-typeahead-cyrillic.html [ Crash Failure ]
@@ -11061,7 +11069,7 @@
 crbug.com/591099 fast/forms/select/menulist-appearance-basic.html [ Failure ]
 crbug.com/591099 fast/forms/select/menulist-appearance-none.html [ Failure ]
 crbug.com/591099 fast/forms/select/menulist-appearance-rtl.html [ Failure ]
-crbug.com/591099 fast/forms/select/menulist-change-event-with-reset-blur.html [ Crash ]
+crbug.com/591099 fast/forms/select/menulist-change-event-with-reset-blur.html [ Crash Pass ]
 crbug.com/591099 fast/forms/select/menulist-clip.html [ Failure ]
 crbug.com/591099 fast/forms/select/menulist-deselect-update.html [ Failure ]
 crbug.com/591099 fast/forms/select/menulist-disabled-selected-option.html [ Failure ]
@@ -11069,14 +11077,14 @@
 crbug.com/591099 fast/forms/select/menulist-narrow-width.html [ Failure ]
 crbug.com/591099 fast/forms/select/menulist-no-overflow.html [ Failure ]
 crbug.com/591099 fast/forms/select/menulist-no-renderer-for-unexpected-children.html [ Failure ]
-crbug.com/591099 fast/forms/select/menulist-no-renderer-onmousedown.html [ Crash ]
+crbug.com/591099 fast/forms/select/menulist-no-renderer-onmousedown.html [ Crash Failure ]
 crbug.com/591099 fast/forms/select/menulist-onchange-fired-with-key-up-down.html [ Failure ]
 crbug.com/591099 fast/forms/select/menulist-oninput-fired.html [ Failure ]
 crbug.com/591099 fast/forms/select/menulist-option-wrap.html [ Failure ]
 crbug.com/591099 fast/forms/select/menulist-popup-crash.html [ Failure ]
 crbug.com/591099 fast/forms/select/menulist-popup-item-style.html [ Failure ]
 crbug.com/591099 fast/forms/select/menulist-popup-open-hide-using-keyboard.html [ Failure ]
-crbug.com/591099 fast/forms/select/menulist-remove-option-onchange.html [ Crash ]
+crbug.com/591099 fast/forms/select/menulist-remove-option-onchange.html [ Crash Pass ]
 crbug.com/591099 fast/forms/select/menulist-restrict-line-height.html [ Failure ]
 crbug.com/591099 fast/forms/select/menulist-separator-painting.html [ Failure ]
 crbug.com/591099 fast/forms/select/menulist-style-color.html [ Failure ]
@@ -11109,8 +11117,8 @@
 crbug.com/591099 fast/forms/select/options-indexed-properties.html [ Failure ]
 crbug.com/591099 fast/forms/select/popup-closes-on-blur.html [ Failure ]
 crbug.com/591099 fast/forms/select/popup-with-display-none-optgroup.html [ Failure ]
-crbug.com/591099 fast/forms/select/remove-element-from-within-focus-handler-crash.html [ Crash ]
-crbug.com/591099 fast/forms/select/select-add-assertion.html [ Crash ]
+crbug.com/591099 fast/forms/select/remove-element-from-within-focus-handler-crash.html [ Crash Failure ]
+crbug.com/591099 fast/forms/select/select-add-assertion.html [ Crash Pass ]
 crbug.com/591099 fast/forms/select/select-add.html [ Failure ]
 crbug.com/591099 fast/forms/select/select-align.html [ Failure ]
 crbug.com/591099 fast/forms/select/select-assign-null.html [ Failure ]
@@ -11119,12 +11127,12 @@
 crbug.com/591099 fast/forms/select/select-baseline.html [ Failure ]
 crbug.com/591099 fast/forms/select/select-block-background.html [ Failure ]
 crbug.com/591099 fast/forms/select/select-change-listbox-size.html [ Failure ]
-crbug.com/591099 fast/forms/select/select-change-listbox-to-popup-roundtrip.html [ Crash ]
+crbug.com/591099 fast/forms/select/select-change-listbox-to-popup-roundtrip.html [ Crash Pass ]
 crbug.com/591099 fast/forms/select/select-change-listbox-to-popup.html [ Failure ]
-crbug.com/591099 fast/forms/select/select-change-popup-to-listbox-in-event-handler.html [ Crash ]
-crbug.com/591099 fast/forms/select/select-change-popup-to-listbox-roundtrip.html [ Crash ]
+crbug.com/591099 fast/forms/select/select-change-popup-to-listbox-in-event-handler.html [ Crash Failure ]
+crbug.com/591099 fast/forms/select/select-change-popup-to-listbox-roundtrip.html [ Crash Pass ]
 crbug.com/591099 fast/forms/select/select-change-popup-to-listbox.html [ Failure ]
-crbug.com/591099 fast/forms/select/select-change-type-on-focus.html [ Crash ]
+crbug.com/591099 fast/forms/select/select-change-type-on-focus.html [ Crash Failure ]
 crbug.com/591099 fast/forms/select/select-change-type-on-mousedown-focus.html [ Crash Failure ]
 crbug.com/591099 fast/forms/select/select-clientheight-large-size.html [ Failure ]
 crbug.com/591099 fast/forms/select/select-clientheight-with-multiple-attr.html [ Failure ]
@@ -11142,7 +11150,7 @@
 crbug.com/591099 fast/forms/select/select-item-background-clip.html [ Failure ]
 crbug.com/591099 fast/forms/select/select-list-box-mouse-focus.html [ Failure ]
 crbug.com/591099 fast/forms/select/select-list-box-with-height.html [ Failure ]
-crbug.com/591099 fast/forms/select/select-listbox-focus-displaynone.html [ Crash Failure ]
+crbug.com/591099 fast/forms/select/select-listbox-focus-displaynone.html [ Crash Failure Pass ]
 crbug.com/591099 fast/forms/select/select-listbox-multiple-no-focusring.html [ Failure ]
 crbug.com/591099 fast/forms/select/select-live-pseudo-selectors.html [ Crash Failure ]
 crbug.com/591099 fast/forms/select/select-max-length.html [ Failure ]
@@ -11178,7 +11186,7 @@
 crbug.com/591099 fast/forms/select/select-type-ahead-non-latin.html [ Failure ]
 crbug.com/591099 fast/forms/select/select-typeahead-crash.html [ Failure ]
 crbug.com/591099 fast/forms/select/select-typeahead-with-spacekey.html [ Failure ]
-crbug.com/591099 fast/forms/select/select-value-null.html [ Crash ]
+crbug.com/591099 fast/forms/select/select-value-null.html [ Crash Pass ]
 crbug.com/591099 fast/forms/select/select-visual-hebrew.html [ Failure ]
 crbug.com/591099 fast/forms/select/select-width-font-change.html [ Failure ]
 crbug.com/591099 fast/forms/select/select-with-display-none-options.html [ Failure ]
@@ -11191,15 +11199,15 @@
 crbug.com/591099 fast/forms/selection-direction.html [ Crash Timeout ]
 crbug.com/591099 fast/forms/selection-functions.html [ Crash Failure ]
 crbug.com/591099 fast/forms/selection-setSelectionRange-focusing.html [ Crash Failure ]
-crbug.com/591099 fast/forms/selection-setSelectionRange-frameselection.html [ Crash ]
+crbug.com/591099 fast/forms/selection-setSelectionRange-frameselection.html [ Crash Pass ]
 crbug.com/591099 fast/forms/selection-start-end-readonly.html [ Crash Failure ]
 crbug.com/591099 fast/forms/selection-wrongtype.html [ Crash Timeout ]
 crbug.com/591099 fast/forms/setCustomValidity-arguments.html [ Failure ]
 crbug.com/591099 fast/forms/setCustomValidity-existence.html [ Crash Failure ]
 crbug.com/591099 fast/forms/setCustomValidity.html [ Failure ]
-crbug.com/591099 fast/forms/setrangetext-within-events.html [ Crash Failure ]
+crbug.com/591099 fast/forms/setrangetext-within-events.html [ Crash Failure Pass ]
 crbug.com/591099 fast/forms/setrangetext.html [ Crash Failure ]
-crbug.com/591099 fast/forms/shadow-tree-exposure.html [ Crash ]
+crbug.com/591099 fast/forms/shadow-tree-exposure.html [ Crash Failure ]
 crbug.com/591099 fast/forms/slow-click.html [ Failure Pass ]
 crbug.com/591099 fast/forms/state-restore-broken-state.html [ Crash Failure ]
 crbug.com/591099 fast/forms/state-restore-empty-state.html [ Failure ]
@@ -11221,21 +11229,21 @@
 crbug.com/591099 fast/forms/submit-to-url-fragment.html [ Failure ]
 crbug.com/591099 fast/forms/submit-with-base.html [ Crash Failure ]
 crbug.com/591099 fast/forms/submit/submit-appearance-basic.html [ Failure ]
-crbug.com/591099 fast/forms/suggested-value-after-setvalue.html [ Crash ]
-crbug.com/591099 fast/forms/suggested-value.html [ Crash ]
+crbug.com/591099 fast/forms/suggested-value-after-setvalue.html [ Crash Pass ]
+crbug.com/591099 fast/forms/suggested-value.html [ Crash Pass ]
 crbug.com/591099 fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125.html [ Crash Failure Timeout ]
 crbug.com/591099 fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200.html [ Crash Failure ]
 crbug.com/591099 fast/forms/suggestion-picker/date-suggestion-picker-key-operations.html [ Crash Failure Timeout ]
 crbug.com/591099 fast/forms/suggestion-picker/date-suggestion-picker-min-max-attribute.html [ Crash Failure Timeout ]
-crbug.com/591099 fast/forms/suggestion-picker/date-suggestion-picker-reset-value-after-reload.html [ Crash ]
+crbug.com/591099 fast/forms/suggestion-picker/date-suggestion-picker-reset-value-after-reload.html [ Crash Failure ]
 crbug.com/591099 fast/forms/suggestion-picker/date-suggestion-picker-step-attribute.html [ Crash Failure ]
 crbug.com/591099 fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew.html [ Crash Failure Timeout ]
 crbug.com/591099 fast/forms/suggestion-picker/datetimelocal-suggestion-picker-min-max-attribute.html [ Crash Failure ]
-crbug.com/591099 fast/forms/suggestion-picker/datetimelocal-suggestion-picker-reset-value-after-reload.html [ Crash ]
+crbug.com/591099 fast/forms/suggestion-picker/datetimelocal-suggestion-picker-reset-value-after-reload.html [ Crash Failure ]
 crbug.com/591099 fast/forms/suggestion-picker/datetimelocal-suggestion-picker-step-attribute.html [ Crash Failure ]
 crbug.com/591099 fast/forms/suggestion-picker/month-suggestion-picker-key-operations.html [ Crash Failure Timeout ]
 crbug.com/591099 fast/forms/suggestion-picker/month-suggestion-picker-min-max-attribute.html [ Crash Failure ]
-crbug.com/591099 fast/forms/suggestion-picker/month-suggestion-picker-reset-value-after-reload.html [ Crash ]
+crbug.com/591099 fast/forms/suggestion-picker/month-suggestion-picker-reset-value-after-reload.html [ Crash Failure ]
 crbug.com/591099 fast/forms/suggestion-picker/month-suggestion-picker-step-attribute.html [ Crash Failure ]
 crbug.com/591099 fast/forms/suggestion-picker/time-suggestion-picker-appearance-locale-hebrew.html [ Crash Failure ]
 crbug.com/591099 fast/forms/suggestion-picker/time-suggestion-picker-appearance-rtl.html [ Crash Failure ]
@@ -11244,14 +11252,14 @@
 crbug.com/591099 fast/forms/suggestion-picker/time-suggestion-picker-step-attribute.html [ Crash Failure ]
 crbug.com/591099 fast/forms/suggestion-picker/week-suggestion-picker-key-operations.html [ Crash Failure Timeout ]
 crbug.com/591099 fast/forms/suggestion-picker/week-suggestion-picker-min-max-attribute.html [ Crash Failure ]
-crbug.com/591099 fast/forms/suggestion-picker/week-suggestion-picker-reset-value-after-reload.html [ Crash ]
+crbug.com/591099 fast/forms/suggestion-picker/week-suggestion-picker-reset-value-after-reload.html [ Crash Failure ]
 crbug.com/591099 fast/forms/suggestion-picker/week-suggestion-picker-step-attribute.html [ Crash Failure ]
 crbug.com/591099 fast/forms/tabbing-input-iframe.html [ Crash Failure ]
 crbug.com/591099 fast/forms/tabs-with-modifiers.html [ Failure ]
 crbug.com/591099 fast/forms/targeted-frame-submission.html [ Failure ]
 crbug.com/591099 fast/forms/text-control-intrinsic-widths.html [ Timeout ]
-crbug.com/591099 fast/forms/text-control-selection-after-blur.html [ Crash ]
-crbug.com/591099 fast/forms/text-set-value-crash.html [ Crash ]
+crbug.com/591099 fast/forms/text-control-selection-after-blur.html [ Crash Pass ]
+crbug.com/591099 fast/forms/text-set-value-crash.html [ Crash Failure ]
 crbug.com/591099 fast/forms/text-style-color.html [ Crash Failure ]
 crbug.com/591099 fast/forms/text/input-appearance-bkcolor.html [ Crash Failure ]
 crbug.com/591099 fast/forms/text/input-appearance-default-bkcolor.html [ Crash Failure ]
@@ -11283,7 +11291,7 @@
 crbug.com/591099 fast/forms/text/input-readonly-autoscroll.html [ Crash Failure ]
 crbug.com/591099 fast/forms/text/input-readonly-dimmed.html [ Crash Failure ]
 crbug.com/591099 fast/forms/text/input-readonly-empty.html [ Failure ]
-crbug.com/591099 fast/forms/text/input-readonly-focus.html [ Crash ]
+crbug.com/591099 fast/forms/text/input-readonly-focus.html [ Crash Pass ]
 crbug.com/591099 fast/forms/text/input-select-on-click.html [ Crash Failure ]
 crbug.com/591099 fast/forms/text/input-selection-hidden.html [ Crash Failure ]
 crbug.com/591099 fast/forms/text/input-set-composition-scroll.html [ Failure ]
@@ -11298,18 +11306,18 @@
 crbug.com/591099 fast/forms/text/input-text-drag-down.html [ Crash Failure ]
 crbug.com/591099 fast/forms/text/input-text-enter.html [ Crash Failure ]
 crbug.com/591099 fast/forms/text/input-text-option-delete.html [ Crash Failure ]
-crbug.com/591099 fast/forms/text/input-text-paste-maxlength.html [ Crash Timeout ]
+crbug.com/591099 fast/forms/text/input-text-paste-maxlength.html [ Crash Pass Timeout ]
 crbug.com/591099 fast/forms/text/input-text-scroll-left-on-blur.html [ Crash Failure ]
 crbug.com/591099 fast/forms/text/input-text-self-emptying-click.html [ Crash Failure ]
 crbug.com/591099 fast/forms/text/input-text-word-wrap.html [ Crash Failure ]
 crbug.com/591099 fast/forms/text/input-width.html [ Failure ]
-crbug.com/591099 fast/forms/text/placeholder-crash-with-scrollbar-corner.html [ Crash ]
+crbug.com/591099 fast/forms/text/placeholder-crash-with-scrollbar-corner.html [ Crash Failure ]
 crbug.com/591099 fast/forms/text/placeholder-dom-property.html [ Failure ]
 crbug.com/591099 fast/forms/text/text-appearance-basic.html [ Crash Failure ]
 crbug.com/591099 fast/forms/text/text-appearance-datalist.html [ Failure ]
-crbug.com/591099 fast/forms/text/text-change-event-after-clear-in-submit.html [ Crash ]
-crbug.com/591099 fast/forms/text/text-change-event-after-updating-default.html [ Crash ]
-crbug.com/591099 fast/forms/text/text-dir-auto-with-placeholder.html [ Crash ]
+crbug.com/591099 fast/forms/text/text-change-event-after-clear-in-submit.html [ Crash Pass ]
+crbug.com/591099 fast/forms/text/text-change-event-after-updating-default.html [ Crash Pass ]
+crbug.com/591099 fast/forms/text/text-dir-auto-with-placeholder.html [ Crash Pass ]
 crbug.com/591099 fast/forms/text/text-field-setvalue-crash.html [ Failure ]
 crbug.com/591099 fast/forms/text/text-font-height-mismatch.html [ Crash Failure ]
 crbug.com/591099 fast/forms/text/text-inner-overflow.html [ Failure ]
@@ -11317,13 +11325,13 @@
 crbug.com/591099 fast/forms/text/text-reset-click-delete-text-change-event.html [ Crash Failure ]
 crbug.com/591099 fast/forms/text/text-select-disabled.html [ Crash Failure ]
 crbug.com/591099 fast/forms/text/text-select-invisible.html [ Crash Failure ]
-crbug.com/591099 fast/forms/text/text-selection-after-type-change.html [ Crash ]
-crbug.com/591099 fast/forms/text/text-set-selection-crash.html [ Crash ]
+crbug.com/591099 fast/forms/text/text-selection-after-type-change.html [ Crash Pass ]
+crbug.com/591099 fast/forms/text/text-set-selection-crash.html [ Crash Pass ]
 crbug.com/591099 fast/forms/text/text-update-datalist-while-focused.html [ Failure ]
 crbug.com/591099 fast/forms/text/text-window-lost-focus-change-event.html [ Failure Timeout ]
-crbug.com/591099 fast/forms/text/textfield-focus-out.html [ Crash ]
+crbug.com/591099 fast/forms/text/textfield-focus-out.html [ Crash Failure ]
 crbug.com/591099 fast/forms/text/textfield-focus-ring.html [ Failure ]
-crbug.com/591099 fast/forms/text/textfield-onchange-deletion.html [ Crash ]
+crbug.com/591099 fast/forms/text/textfield-onchange-deletion.html [ Crash Pass ]
 crbug.com/591099 fast/forms/text/textfield-outline.html [ Crash Failure ]
 crbug.com/591099 fast/forms/text/textfield-overflow-by-value-update.html [ Crash Failure ]
 crbug.com/591099 fast/forms/text/textfield-overflow.html [ Failure ]
@@ -11332,8 +11340,8 @@
 crbug.com/591099 fast/forms/textarea/basic-textareas.html [ Crash Failure ]
 crbug.com/591099 fast/forms/textarea/cols-attribute.html [ Failure ]
 crbug.com/591099 fast/forms/textarea/drag-into-textarea.html [ Crash Failure ]
-crbug.com/591099 fast/forms/textarea/drag-out-of-textarea.html [ Crash Failure ]
-crbug.com/591099 fast/forms/textarea/empty-textarea-toggle-disabled.html [ Crash ]
+crbug.com/591099 fast/forms/textarea/drag-out-of-textarea.html [ Crash Failure Pass ]
+crbug.com/591099 fast/forms/textarea/empty-textarea-toggle-disabled.html [ Crash Pass ]
 crbug.com/591099 fast/forms/textarea/linebox-overflow-in-textarea-padding.html [ Crash Failure ]
 crbug.com/591099 fast/forms/textarea/onselect-textarea.html [ Failure ]
 crbug.com/591099 fast/forms/textarea/paste-into-textarea.html [ Crash Failure ]
@@ -11350,7 +11358,7 @@
 crbug.com/591099 fast/forms/textarea/textarea-checkValidity-crash.html [ Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-crlf.html [ Crash Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-default-value-leading-newline.html [ Crash Failure ]
-crbug.com/591099 fast/forms/textarea/textarea-dir-auto-with-placeholder.html [ Crash ]
+crbug.com/591099 fast/forms/textarea/textarea-dir-auto-with-placeholder.html [ Crash Pass ]
 crbug.com/591099 fast/forms/textarea/textarea-initial-caret-position.html [ Crash Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-input-event.html [ Crash Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-inputmode.html [ Failure ]
@@ -11361,18 +11369,18 @@
 crbug.com/591099 fast/forms/textarea/textarea-minlength.html [ Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-newline.html [ Crash Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-no-scroll-on-blur.html [ Crash Failure ]
-crbug.com/591099 fast/forms/textarea/textarea-node-removed-from-document-crash.html [ Crash ]
+crbug.com/591099 fast/forms/textarea/textarea-node-removed-from-document-crash.html [ Crash Pass ]
 crbug.com/591099 fast/forms/textarea/textarea-placeholder-dom-property.html [ Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-placeholder-paint-order.html [ Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-placeholder-relayout-assertion.html [ Crash Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-placeholder-visibility-1.html [ Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-placeholder-visibility-2.html [ Crash Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-placeholder-wrapping.html [ Crash Failure ]
-crbug.com/591099 fast/forms/textarea/textarea-resize-above-min-size-and-below-initial-size.html [ Crash ]
-crbug.com/591099 fast/forms/textarea/textarea-resize-below-min-intrinsic-size.html [ Crash Timeout ]
-crbug.com/591099 fast/forms/textarea/textarea-resize-below-min-size-zoomed.html [ Crash Timeout ]
-crbug.com/591099 fast/forms/textarea/textarea-resize-below-min-size.html [ Crash ]
-crbug.com/591099 fast/forms/textarea/textarea-resize-orthogonal-containing-block.html [ Crash ]
+crbug.com/591099 fast/forms/textarea/textarea-resize-above-min-size-and-below-initial-size.html [ Crash Pass ]
+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 ]
+crbug.com/591099 fast/forms/textarea/textarea-resize-orthogonal-containing-block.html [ Crash Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-rows-cols.html [ Crash Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-scroll-height.html [ Crash Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-scrollbar-height.html [ Crash Failure ]
@@ -11382,7 +11390,7 @@
 crbug.com/591099 fast/forms/textarea/textarea-scrolled-type.html [ Crash Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-select.html [ Crash Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-selection-preservation.html [ Crash Failure ]
-crbug.com/591099 fast/forms/textarea/textarea-set-defaultvalue-after-value.html [ Crash ]
+crbug.com/591099 fast/forms/textarea/textarea-set-defaultvalue-after-value.html [ Crash Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-setinnerhtml.html [ Crash Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-setrangetext.html [ Crash Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-setvalue-without-renderer.html [ Crash Failure ]
@@ -11390,42 +11398,42 @@
 crbug.com/591099 fast/forms/textarea/textarea-textlength.html [ Crash Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-width.html [ Crash Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-wrap-attribute.html [ Failure ]
-crbug.com/591099 fast/forms/textfield-change-event.html [ Crash ]
-crbug.com/591099 fast/forms/textfield-clone.html [ Crash ]
+crbug.com/591099 fast/forms/textfield-change-event.html [ Crash Pass ]
+crbug.com/591099 fast/forms/textfield-clone.html [ Crash Failure ]
 crbug.com/591099 fast/forms/textfield-to-password-on-focus.html [ Crash Failure ]
-crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-ax-aria-attributes.html [ Crash ]
-crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-ax-value-changed-notification.html [ Crash ]
-crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-blur-and-focus-events.html [ Crash ]
+crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-ax-aria-attributes.html [ Crash Failure ]
+crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-ax-value-changed-notification.html [ Crash Failure ]
+crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-blur-and-focus-events.html [ Crash Failure ]
 crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-change-layout-by-value.html [ Failure ]
-crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-change-type-on-focus-2.html [ Crash ]
-crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-change-type-on-focus-3.html [ Crash ]
-crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-change-type-on-focus.html [ Crash ]
+crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-change-type-on-focus-2.html [ Crash Failure ]
+crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-change-type-on-focus-3.html [ Crash Pass ]
+crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-change-type-on-focus.html [ Crash Failure ]
 crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-choose-default-value-after-set-value.html [ Failure ]
 crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-clearbutton-change-and-input-events.html [ Crash Failure ]
-crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-crash-after-adoptnode.html [ Crash ]
-crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-crash-by-focus-on-unload.html [ Crash ]
+crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-crash-after-adoptnode.html [ Crash Failure ]
+crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-crash-by-focus-on-unload.html [ Crash Pass ]
 crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-fallback-format.html [ Failure ]
-crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-focus-style.html [ Crash ]
+crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-focus-style.html [ Crash Failure ]
 crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-focus.html [ Failure ]
 crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-keyboard-events.html [ Crash Failure Timeout ]
 crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-localization.html [ Failure ]
-crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-losing-renderer-on-click.html [ Crash ]
+crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-losing-renderer-on-click.html [ Crash Pass ]
 crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-mouse-events.html [ Crash Failure ]
 crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-narrow-width-scroll.html [ Failure ]
 crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-open-picker-key-bindings.html [ Failure ]
 crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-preserve-value-after-history-back.html [ Crash Failure ]
 crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-readonly-subfield.html [ Failure ]
-crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-reset-value-after-reload.html [ Crash ]
-crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-spinbutton-change-and-input-events.html [ Crash ]
-crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-spinbutton-click-in-iframe.html [ Crash ]
+crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-reset-value-after-reload.html [ Crash Failure ]
+crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-spinbutton-change-and-input-events.html [ Crash Failure ]
+crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-spinbutton-click-in-iframe.html [ Crash Failure ]
 crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-state-change-on-focus-or-blur.html [ Failure ]
-crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-static-relayout.html [ Crash ]
-crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-step-attribute.html [ Crash ]
-crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer-hour.html [ Crash ]
+crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-static-relayout.html [ Crash Pass ]
+crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-step-attribute.html [ Crash Failure ]
+crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer-hour.html [ Crash Pass ]
 crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer.html [ Crash Timeout ]
 crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-validity-badinput.html [ Failure ]
 crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-value-set-empty.html [ Crash Failure ]
-crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-wheel-event.html [ Crash ]
+crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-wheel-event.html [ Crash Failure ]
 crbug.com/591099 fast/forms/time/time-appearance-basic.html [ Crash Failure ]
 crbug.com/591099 fast/forms/time/time-appearance-pseudo-elements.html [ Crash Failure ]
 crbug.com/591099 fast/forms/time/time-input-type.html [ Failure ]
@@ -11440,16 +11448,16 @@
 crbug.com/591099 fast/forms/time/time-valueasdate.html [ Failure ]
 crbug.com/591099 fast/forms/time/time-valueasnumber.html [ Failure ]
 crbug.com/591099 fast/forms/type-after-focus-rule-shrink-width.html [ Crash Failure ]
-crbug.com/591099 fast/forms/ua-shadow-select-all-crash.html [ Crash ]
+crbug.com/591099 fast/forms/ua-shadow-select-all-crash.html [ Crash Pass ]
 crbug.com/591099 fast/forms/update-form-attribute-element.html [ Failure ]
-crbug.com/591099 fast/forms/url/url-sanitize-user-input.html [ Crash ]
-crbug.com/591099 fast/forms/validationMessage.html [ Crash ]
+crbug.com/591099 fast/forms/url/url-sanitize-user-input.html [ Crash Pass ]
+crbug.com/591099 fast/forms/validationMessage.html [ Crash Failure ]
 crbug.com/591099 fast/forms/validity-property.html [ Crash Failure ]
 crbug.com/591099 fast/forms/var-name-conflict-in-form-event-handler.html [ Failure ]
 crbug.com/591099 fast/forms/visual-hebrew-text-field.html [ Crash Failure ]
-crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-ax-aria-attributes.html [ Crash ]
-crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-ax-value-changed-notification.html [ Crash ]
-crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-blur-and-focus-events.html [ Crash ]
+crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-ax-aria-attributes.html [ Crash Failure ]
+crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-ax-value-changed-notification.html [ Crash Failure ]
+crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-blur-and-focus-events.html [ Crash Failure ]
 crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-change-layout-by-value.html [ Failure ]
 crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-choose-default-value-after-set-value.html [ Failure ]
 crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-clearbutton-change-and-input-events.html [ Crash Failure ]
@@ -11458,12 +11466,12 @@
 crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-mouse-events.html [ Crash Failure ]
 crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-preserve-value-after-history-back.html [ Failure ]
 crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-readonly-subfield.html [ Failure ]
-crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-reset-value-after-reloads.html [ Crash ]
-crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-spinbutton-change-and-input-events.html [ Crash ]
+crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-reset-value-after-reloads.html [ Crash Failure ]
+crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-spinbutton-change-and-input-events.html [ Crash Failure ]
 crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-stepup-stepdown-from-renderer.html [ Crash Failure ]
 crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-validity-badinput.html [ Failure ]
 crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-value-set-empty.html [ Failure ]
-crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-wheel-event.html [ Crash ]
+crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-wheel-event.html [ Crash Failure ]
 crbug.com/591099 fast/forms/week/ValidityState-rangeOverflow-week.html [ Failure ]
 crbug.com/591099 fast/forms/week/ValidityState-rangeUnderflow-week.html [ Failure ]
 crbug.com/591099 fast/forms/week/ValidityState-stepMismatch-week.html [ Failure ]
@@ -11477,10 +11485,10 @@
 crbug.com/591099 fast/forms/week/week-pseudo-classes.html [ Failure ]
 crbug.com/591099 fast/forms/week/week-setrangetext.html [ Failure ]
 crbug.com/591099 fast/forms/week/week-stepup-stepdown.html [ Failure ]
-crbug.com/591099 fast/forms/willvalidate.html [ Crash ]
+crbug.com/591099 fast/forms/willvalidate.html [ Crash Failure ]
 crbug.com/591099 fast/frames/001.html [ Failure ]
 crbug.com/591099 fast/frames/002.html [ Failure ]
-crbug.com/591099 fast/frames/cached-frame-counter.html [ Crash ]
+crbug.com/591099 fast/frames/cached-frame-counter.html [ Crash Failure ]
 crbug.com/591099 fast/frames/calculate-fixed.html [ Failure ]
 crbug.com/591099 fast/frames/calculate-order.html [ Failure ]
 crbug.com/591099 fast/frames/calculate-percentage.html [ Failure ]
@@ -11489,7 +11497,7 @@
 crbug.com/591099 fast/frames/content-opacity-1.html [ Failure ]
 crbug.com/591099 fast/frames/content-opacity-2.html [ Failure ]
 crbug.com/591099 fast/frames/crash-removed-iframe.html [ Failure ]
-crbug.com/591099 fast/frames/create-iframe-on-blur.html [ Crash ]
+crbug.com/591099 fast/frames/create-iframe-on-blur.html [ Crash Failure ]
 crbug.com/591099 fast/frames/detach-during-initial-load.html [ Failure ]
 crbug.com/591099 fast/frames/detach-frame-from-child-detach-no-crash.html [ Failure ]
 crbug.com/591099 fast/frames/detach-frame-nested-no-crash.html [ Crash Failure ]
@@ -11501,10 +11509,10 @@
 crbug.com/591099 fast/frames/empty-cols-attribute.html [ Failure ]
 crbug.com/591099 fast/frames/empty-frame-document.html [ Failure ]
 crbug.com/591099 fast/frames/empty-frame-src.html [ Failure ]
-crbug.com/591099 fast/frames/focus-controller-crash-change-event.html [ Crash Timeout ]
-crbug.com/591099 fast/frames/form-submission-early-return-for-sandboxed-iframes.html [ Crash ]
+crbug.com/591099 fast/frames/focus-controller-crash-change-event.html [ Crash Pass Timeout ]
+crbug.com/591099 fast/frames/form-submission-early-return-for-sandboxed-iframes.html [ Crash Pass ]
 crbug.com/591099 fast/frames/frame-dimensions-before-parent-layout.html [ Failure ]
-crbug.com/591099 fast/frames/frame-focus-no-focusout-event.html [ Crash ]
+crbug.com/591099 fast/frames/frame-focus-no-focusout-event.html [ Crash Pass ]
 crbug.com/591099 fast/frames/frame-focus-send-blur.html [ Failure ]
 crbug.com/591099 fast/frames/frame-inherit-noresize-from-frameset.html [ Failure ]
 crbug.com/591099 fast/frames/frame-length-fractional.html [ Failure ]
@@ -11529,13 +11537,13 @@
 crbug.com/591099 fast/frames/frameElement-frame.html [ Failure ]
 crbug.com/591099 fast/frames/frameElement-iframe.html [ Failure ]
 crbug.com/591099 fast/frames/frames-with-frameborder-zero-can-be-resized.html [ Failure ]
-crbug.com/591099 fast/frames/frameset-dynamic-resize.html [ Crash ]
+crbug.com/591099 fast/frames/frameset-dynamic-resize.html [ Crash Pass ]
 crbug.com/591099 fast/frames/frameset-frameborder-boolean-values.html [ Failure ]
 crbug.com/591099 fast/frames/frameset-frameborder-inheritance.html [ Failure ]
 crbug.com/591099 fast/frames/frameset-frameborder-overrides-border.html [ Failure ]
 crbug.com/591099 fast/frames/frameset-style-recalc.html [ Failure ]
-crbug.com/591099 fast/frames/hover-timer-crash.html [ Crash ]
-crbug.com/591099 fast/frames/iframe-access-screen-of-deleted.html [ Crash ]
+crbug.com/591099 fast/frames/hover-timer-crash.html [ Crash Failure ]
+crbug.com/591099 fast/frames/iframe-access-screen-of-deleted.html [ Crash Pass ]
 crbug.com/591099 fast/frames/iframe-js-url-clientWidth.html [ Failure ]
 crbug.com/591099 fast/frames/iframe-name-and-id.html [ Failure ]
 crbug.com/591099 fast/frames/iframe-no-name.html [ Failure ]
@@ -11544,9 +11552,9 @@
 crbug.com/591099 fast/frames/iframe-onload-and-domnodeinserted.html [ Failure ]
 crbug.com/591099 fast/frames/iframe-onload-remove-self-no-crash.html [ Failure ]
 crbug.com/591099 fast/frames/iframe-option-crash.xhtml [ Failure ]
-crbug.com/591099 fast/frames/iframe-plugin-load-remove-document-crash.html [ Crash ]
+crbug.com/591099 fast/frames/iframe-plugin-load-remove-document-crash.html [ Crash Pass ]
 crbug.com/591099 fast/frames/iframe-remove-after-id-change.html [ Failure ]
-crbug.com/591099 fast/frames/iframe-reparenting-unique-name.html [ Crash ]
+crbug.com/591099 fast/frames/iframe-reparenting-unique-name.html [ Crash Failure ]
 crbug.com/591099 fast/frames/iframe-scale-applied-twice.html [ Failure ]
 crbug.com/591099 fast/frames/iframe-scaling-with-scroll.html [ Failure ]
 crbug.com/591099 fast/frames/iframe-scrolling-attribute-overflowscroll.html [ Failure ]
@@ -11570,10 +11578,10 @@
 crbug.com/591099 fast/frames/parser-append-subframe-count.html [ Failure ]
 crbug.com/591099 fast/frames/reattach-in-unload.html [ Failure ]
 crbug.com/591099 fast/frames/removal-before-attach-crash.html [ Failure ]
-crbug.com/591099 fast/frames/remove-frame-during-load-event.html [ Crash ]
-crbug.com/591099 fast/frames/remove-frame-with-scrollbars-crash.html [ Crash ]
-crbug.com/591099 fast/frames/repaint-display-none-crash.html [ Crash ]
-crbug.com/591099 fast/frames/reparented-iframe-cleared-contentWindow.html [ Crash ]
+crbug.com/591099 fast/frames/remove-frame-during-load-event.html [ Crash Pass ]
+crbug.com/591099 fast/frames/remove-frame-with-scrollbars-crash.html [ Crash Failure ]
+crbug.com/591099 fast/frames/repaint-display-none-crash.html [ Crash Failure ]
+crbug.com/591099 fast/frames/reparented-iframe-cleared-contentWindow.html [ Crash Pass ]
 crbug.com/591099 fast/frames/sandboxed-iframe-about-blank.html [ Failure ]
 crbug.com/591099 fast/frames/sandboxed-iframe-attribute-parsing-01.html [ Failure ]
 crbug.com/591099 fast/frames/sandboxed-iframe-attribute-parsing-02.html [ Failure ]
@@ -11611,17 +11619,17 @@
 crbug.com/591099 fast/frames/set-iframe-src-in-pagehide-crash.html [ Failure ]
 crbug.com/591099 fast/frames/set-parent-src-synchronously-html.html [ Failure Pass ]
 crbug.com/591099 fast/frames/set-parent-src-synchronously-xhtml.xhtml [ Failure Pass ]
-crbug.com/591099 fast/frames/srcdoc/removing-srcdoc-loads-src.html [ Crash ]
+crbug.com/591099 fast/frames/srcdoc/removing-srcdoc-loads-src.html [ Crash Pass ]
 crbug.com/591099 fast/frames/srcdoc/setting-src-does-nothing.html [ Failure ]
 crbug.com/591099 fast/frames/srcdoc/setting-srcdoc-reloads-document.html [ Failure ]
-crbug.com/591099 fast/frames/srcdoc/srcdoc-deep-nested-frames.html [ Crash ]
-crbug.com/591099 fast/frames/subframe-load-crash-main.html [ Crash ]
-crbug.com/591099 fast/frames/take-focus-from-iframe.html [ Crash ]
+crbug.com/591099 fast/frames/srcdoc/srcdoc-deep-nested-frames.html [ Crash Pass ]
+crbug.com/591099 fast/frames/subframe-load-crash-main.html [ Crash Pass ]
+crbug.com/591099 fast/frames/take-focus-from-iframe.html [ Crash Failure ]
 crbug.com/591099 fast/frames/unique-name-all-subframes-have-same-name.html [ Failure ]
 crbug.com/591099 fast/frames/unique-name-ancestor-concatenation-conflict.html [ Failure ]
 crbug.com/591099 fast/frames/unique-name-remove-add-child.html [ Failure ]
-crbug.com/591099 fast/frames/unload-reparent-sibling-frame.html [ Crash ]
-crbug.com/591099 fast/frames/url-selected-crash.html [ Crash ]
+crbug.com/591099 fast/frames/unload-reparent-sibling-frame.html [ Crash Failure ]
+crbug.com/591099 fast/frames/url-selected-crash.html [ Crash Pass ]
 crbug.com/591099 fast/frames/valid.html [ Failure ]
 crbug.com/591099 fast/gradients/background-clipped.html [ Failure ]
 crbug.com/591099 fast/gradients/border-image-gradient-sides-and-corners.html [ Failure ]
@@ -11679,10 +11687,10 @@
 crbug.com/591099 fast/harness/perftests/perf-runner-compute-statistics.html [ Failure ]
 crbug.com/591099 fast/harness/perftests/runs-per-second-iterations.html [ Failure ]
 crbug.com/591099 fast/harness/perftests/runs-per-second-log.html [ Failure ]
-crbug.com/591099 fast/harness/results.html [ Crash ]
+crbug.com/591099 fast/harness/results.html [ Crash Pass ]
 crbug.com/591099 fast/harness/should-be-now.html [ Failure ]
 crbug.com/591099 fast/harness/user-preferred-language.html [ Crash Failure ]
-crbug.com/591099 fast/hidpi/broken-image-icon-hidpi.html [ Crash Failure ]
+crbug.com/591099 fast/hidpi/broken-image-icon-hidpi.html [ Crash Failure Pass ]
 crbug.com/591099 fast/hidpi/image-set-list-style-image.html [ Failure ]
 crbug.com/591099 fast/hidpi/image-set-shape-outside.html [ Failure ]
 crbug.com/591099 fast/hidpi/image-srcset-intrinsic-size.html [ Failure Pass ]
@@ -11702,11 +11710,11 @@
 crbug.com/591099 fast/history/multiple-classes-visited.html [ Failure ]
 crbug.com/591099 fast/history/nested-visited-test.html [ Failure ]
 crbug.com/591099 fast/history/redirect-via-iframe.html [ Failure ]
-crbug.com/591099 fast/history/same-document-iframes-changing-fragment.html [ Crash ]
-crbug.com/591099 fast/history/same-document-iframes-changing-pushstate.html [ Crash ]
+crbug.com/591099 fast/history/same-document-iframes-changing-fragment.html [ Crash Failure ]
+crbug.com/591099 fast/history/same-document-iframes-changing-pushstate.html [ Crash Failure ]
 crbug.com/591099 fast/history/saves-state-after-frame-nav.html [ Failure ]
-crbug.com/591099 fast/history/scroll-restoration/scroll-restoration-fragment-navigation-crossdoc.html [ Crash ]
-crbug.com/591099 fast/history/scroll-restoration/scroll-restoration-navigation.html [ Crash ]
+crbug.com/591099 fast/history/scroll-restoration/scroll-restoration-fragment-navigation-crossdoc.html [ Crash Pass ]
+crbug.com/591099 fast/history/scroll-restoration/scroll-restoration-navigation.html [ Crash Pass ]
 crbug.com/591099 fast/history/self-is-visited.html [ Failure ]
 crbug.com/591099 fast/history/sibling-visited-test.html [ Failure ]
 crbug.com/591099 fast/history/state-object-few-arguements-exception.html [ Failure ]
@@ -11745,13 +11753,13 @@
 crbug.com/591099 fast/html/input-type-change-crash.html [ Failure ]
 crbug.com/591099 fast/html/meter-user-modify.html [ Failure ]
 crbug.com/591099 fast/html/object-border.html [ Failure ]
-crbug.com/591099 fast/html/object-image-nested-fallback.html [ Crash ]
+crbug.com/591099 fast/html/object-image-nested-fallback.html [ Crash Pass ]
 crbug.com/591099 fast/html/progress-user-modify.html [ Failure ]
 crbug.com/591099 fast/html/script-allowed-types-languages.html [ Failure ]
 crbug.com/591099 fast/html/select-dropdown-consistent-background-color.html [ Failure Pass ]
 crbug.com/591099 fast/html/set-text-direction.html [ Crash Failure ]
 crbug.com/591099 fast/html/tab-order.html [ Crash Failure ]
-crbug.com/591099 fast/html/tabindex-nonfocusable.html [ Crash ]
+crbug.com/591099 fast/html/tabindex-nonfocusable.html [ Crash Pass ]
 crbug.com/591099 fast/html/unknown-tag.html [ Crash Failure ]
 crbug.com/591099 fast/inline-block/001.html [ Failure ]
 crbug.com/591099 fast/inline-block/002.html [ Failure ]
@@ -11782,13 +11790,13 @@
 crbug.com/591099 fast/inline/drawStyledEmptyInlinesWithWS.html [ Failure ]
 crbug.com/591099 fast/inline/empty-inline-before-collapsed-space.html [ Failure ]
 crbug.com/591099 fast/inline/emptyInlinesWithinLists.html [ Crash Failure ]
-crbug.com/591099 fast/inline/fixed-pos-moves-with-abspos-inline-parent.html [ Crash ]
+crbug.com/591099 fast/inline/fixed-pos-moves-with-abspos-inline-parent.html [ Crash Failure ]
 crbug.com/591099 fast/inline/fixed-pos-moves-with-abspos-parent-relative-ancestor.html [ Failure ]
 crbug.com/591099 fast/inline/fixed-pos-moves-with-abspos-parent.html [ Failure ]
 crbug.com/591099 fast/inline/fixed-pos-with-transform-container-moves-with-abspos-parent.html [ Failure ]
 crbug.com/591099 fast/inline/inline-body-with-inline-child.html [ Failure ]
 crbug.com/591099 fast/inline/inline-borders-with-bidi-override.html [ Failure ]
-crbug.com/591099 fast/inline/inline-box-adjust-position-crash.html [ Crash ]
+crbug.com/591099 fast/inline/inline-box-adjust-position-crash.html [ Crash Failure ]
 crbug.com/591099 fast/inline/inline-box-background-long-image.html [ Failure ]
 crbug.com/591099 fast/inline/inline-box-background-repeat-x.html [ Failure ]
 crbug.com/591099 fast/inline/inline-box-background-repeat-y.html [ Failure ]
@@ -11817,7 +11825,7 @@
 crbug.com/591099 fast/inline/positionedLifetime.html [ Failure Pass ]
 crbug.com/591099 fast/inline/reattach-inlines-in-anonymous-blocks-with-out-of-flow-siblings.html [ Failure ]
 crbug.com/591099 fast/inline/relative-positioned-overflow.html [ Failure ]
-crbug.com/591099 fast/inline/reparent-inline-box.html [ Crash ]
+crbug.com/591099 fast/inline/reparent-inline-box.html [ Crash Pass ]
 crbug.com/591099 fast/inline/styledEmptyInlinesWithBRs.html [ Failure ]
 crbug.com/591099 fast/innerHTML/004.xhtml [ Failure ]
 crbug.com/591099 fast/innerHTML/005.html [ Failure ]
@@ -11859,7 +11867,7 @@
 crbug.com/591099 fast/invalid/missing-font-end-tag.html [ Failure ]
 crbug.com/591099 fast/invalid/nestedh3s-rapidweaver.html [ Failure ]
 crbug.com/591099 fast/invalid/nestedh3s.html [ Failure ]
-crbug.com/591099 fast/invalid/residual-style.html [ Crash ]
+crbug.com/591099 fast/invalid/residual-style.html [ Crash Pass ]
 crbug.com/591099 fast/invalid/table-inside-stray-table-content.html [ Failure ]
 crbug.com/591099 fast/invalid/table-residual-style-crash.html [ Failure ]
 crbug.com/591099 fast/invalid/td-inside-object.html [ Failure ]
@@ -11872,10 +11880,10 @@
 crbug.com/591099 fast/js/activation-object-function-lifetime.html [ Failure ]
 crbug.com/591099 fast/js/activation-proto.html [ Failure ]
 crbug.com/591099 fast/js/add-to-primitive.html [ Failure ]
-crbug.com/591099 fast/js/array-foreach.html [ Crash ]
+crbug.com/591099 fast/js/array-foreach.html [ Crash Pass ]
 crbug.com/591099 fast/js/array-indexof.html [ Failure ]
 crbug.com/591099 fast/js/array-join-bug-11524.html [ Failure ]
-crbug.com/591099 fast/js/array-some.html [ Crash ]
+crbug.com/591099 fast/js/array-some.html [ Crash Pass ]
 crbug.com/591099 fast/js/array-sort-exception.html [ Failure ]
 crbug.com/591099 fast/js/assign.html [ Failure ]
 crbug.com/591099 fast/js/bom-in-file-retains-correct-offset.html [ Failure ]
@@ -12136,7 +12144,7 @@
 crbug.com/591099 fast/layers/self-painting-outline.html [ Failure ]
 crbug.com/591099 fast/layers/zindex-inherit.html [ Failure ]
 crbug.com/591099 fast/layers/zindex-ridonkulous.html [ Failure ]
-crbug.com/591099 fast/layout/scroll-anchoring/anchor-inside-iframe.html [ Crash ]
+crbug.com/591099 fast/layout/scroll-anchoring/anchor-inside-iframe.html [ Crash Pass ]
 crbug.com/591099 fast/leaks/001.html [ Failure ]
 crbug.com/591099 fast/leaks/002.html [ Crash Failure ]
 crbug.com/591099 fast/lists/001-vertical.html [ Crash Failure ]
@@ -12210,7 +12218,7 @@
 crbug.com/591099 fast/lists/list-marker-remove-crash.html [ Crash Pass ]
 crbug.com/591099 fast/lists/list-marker-with-line-height.html [ Crash Failure ]
 crbug.com/591099 fast/lists/list-style-none-crash.html [ Failure ]
-crbug.com/591099 fast/lists/list-style-position-inside.html [ Crash ]
+crbug.com/591099 fast/lists/list-style-position-inside.html [ Crash Pass ]
 crbug.com/591099 fast/lists/list-style-type-dynamic-change.html [ Crash Failure ]
 crbug.com/591099 fast/lists/marker-before-empty-inline.html [ Crash Failure ]
 crbug.com/591099 fast/lists/marker-image-error.html [ Crash Failure ]
@@ -12233,7 +12241,7 @@
 crbug.com/591099 fast/lists/ol-start-parsing.html [ Failure ]
 crbug.com/591099 fast/lists/olstart.html [ Failure ]
 crbug.com/591099 fast/lists/ordered-list-with-no-ol-tag.html [ Crash Failure ]
-crbug.com/591099 fast/lists/remove-listmarker-and-make-anonblock-empty-2.html [ Crash ]
+crbug.com/591099 fast/lists/remove-listmarker-and-make-anonblock-empty-2.html [ Crash Pass ]
 crbug.com/591099 fast/lists/w3-css3-list-styles-alphabetic.html [ Crash Failure Timeout ]
 crbug.com/591099 fast/lists/w3-css3-list-styles-deprecated.html [ Failure ]
 crbug.com/591099 fast/lists/w3-css3-list-styles-fallback-style.html [ Crash Failure ]
@@ -12245,11 +12253,11 @@
 crbug.com/591099 fast/loader/about-blank-hash-kept.html [ Failure ]
 crbug.com/591099 fast/loader/charset-parse.html [ Failure ]
 crbug.com/591099 fast/loader/child-frame-add-after-back-forward.html [ Failure Timeout ]
-crbug.com/591099 fast/loader/crash-focus-in-unload.html [ Crash ]
-crbug.com/591099 fast/loader/data-url-encoding-html-2.html [ Crash ]
+crbug.com/591099 fast/loader/crash-focus-in-unload.html [ Crash Pass ]
+crbug.com/591099 fast/loader/data-url-encoding-html-2.html [ Crash Pass ]
 crbug.com/591099 fast/loader/data-url-encoding-html.html [ Failure ]
 crbug.com/591099 fast/loader/data-url-encoding-svg.html [ Failure ]
-crbug.com/591099 fast/loader/document-destruction-within-unload.html [ Crash ]
+crbug.com/591099 fast/loader/document-destruction-within-unload.html [ Crash Pass ]
 crbug.com/591099 fast/loader/empty-embed-src-attribute.html [ Failure ]
 crbug.com/591099 fast/loader/font-face-empty.html [ Failure ]
 crbug.com/591099 fast/loader/fragment-anchor-cleared-after-load-when-hidden.html [ Failure ]
@@ -12277,9 +12285,9 @@
 crbug.com/591099 fast/loader/onload-bad-scheme-for-frame.html [ Failure Timeout ]
 crbug.com/591099 fast/loader/onload-policy-ignore-for-frame.html [ Failure ]
 crbug.com/591099 fast/loader/opaque-base-url.html [ Crash Failure ]
-crbug.com/591099 fast/loader/open-in-srcdoc-unload.html [ Crash ]
-crbug.com/591099 fast/loader/remove-iframe-during-history-navigation-different.html [ Crash ]
-crbug.com/591099 fast/loader/remove-iframe-during-history-navigation-same.html [ Crash ]
+crbug.com/591099 fast/loader/open-in-srcdoc-unload.html [ Crash Pass ]
+crbug.com/591099 fast/loader/remove-iframe-during-history-navigation-different.html [ Crash Pass ]
+crbug.com/591099 fast/loader/remove-iframe-during-history-navigation-same.html [ Crash Pass ]
 crbug.com/591099 fast/loader/scroll-position-restoration-for-history-api.html [ Failure ]
 crbug.com/591099 fast/loader/scroll-position-restoration-without-premature-clamping.html [ Failure ]
 crbug.com/591099 fast/loader/scroll-position-restored-on-back-at-load-event.html [ Failure ]
@@ -12326,7 +12334,7 @@
 crbug.com/591099 fast/media/viewport-media-query-synchronous.html [ Failure ]
 crbug.com/591099 fast/mediacapturefromelement/CanvasCaptureMediaStream-2d-events.html [ Failure ]
 crbug.com/591099 fast/mediacapturefromelement/CanvasCaptureMediaStream-framerate-0.html [ Failure ]
-crbug.com/591099 fast/mediacapturefromelement/CanvasCaptureMediaStream-imagebitmaprenderingcontext.html [ Crash ]
+crbug.com/591099 fast/mediacapturefromelement/CanvasCaptureMediaStream-imagebitmaprenderingcontext.html [ Crash Pass ]
 crbug.com/591099 fast/mediacapturefromelement/CanvasCaptureMediaStream-request-frame-events.html [ Failure ]
 crbug.com/591099 fast/mediacapturefromelement/CanvasCaptureMediaStream-webgl-events.html [ Failure ]
 crbug.com/591099 fast/mediastream/MediaStream-add-remove-tracks.html [ Failure ]
@@ -12334,7 +12342,7 @@
 crbug.com/591099 fast/mediastream/MediaStream-onactive-oninactive.html [ Failure ]
 crbug.com/591099 fast/mediastream/MediaStream-stop.html [ Failure ]
 crbug.com/591099 fast/mediastream/MediaStreamConstructor.html [ Failure ]
-crbug.com/591099 fast/mediastream/MediaStreamTrack-contentHint.html [ Crash ]
+crbug.com/591099 fast/mediastream/MediaStreamTrack-contentHint.html [ Crash Pass ]
 crbug.com/591099 fast/mediastream/MediaStreamTrack-gc-no-crash.html [ Failure ]
 crbug.com/591099 fast/mediastream/MediaStreamTrack-observer-iterate-no-crash.html [ Failure ]
 crbug.com/591099 fast/mediastream/MediaStreamTrack.html [ Failure ]
@@ -12738,7 +12746,7 @@
 crbug.com/591099 fast/overflow/overflow-with-local-background-attachment.html [ Crash Failure ]
 crbug.com/591099 fast/overflow/overflow-x-y.html [ Crash Failure ]
 crbug.com/591099 fast/overflow/overflow-y-scroll.html [ Failure ]
-crbug.com/591099 fast/overflow/replaced-child-100percent-height-inside-fixed-container-with-overflow-auto.html [ Crash ]
+crbug.com/591099 fast/overflow/replaced-child-100percent-height-inside-fixed-container-with-overflow-auto.html [ Crash Failure ]
 crbug.com/591099 fast/overflow/resize-inherit.html [ Failure ]
 crbug.com/591099 fast/overflow/scroll-div-hide-show.html [ Failure ]
 crbug.com/591099 fast/overflow/scroll-html-hidden-body.html [ Failure Pass ]
@@ -12805,10 +12813,10 @@
 crbug.com/591099 fast/parser/comment-in-textarea.html [ Crash Failure ]
 crbug.com/591099 fast/parser/comments.html [ Failure ]
 crbug.com/591099 fast/parser/crash-HTMLParser-createHead.html [ Failure ]
-crbug.com/591099 fast/parser/disable-frameset-ok-flag-inside-template.html [ Crash ]
+crbug.com/591099 fast/parser/disable-frameset-ok-flag-inside-template.html [ Crash Pass ]
 crbug.com/591099 fast/parser/document-open-in-unload.html [ Crash Failure ]
 crbug.com/591099 fast/parser/document-reload-with-failed-deferred-scripts.html [ Failure ]
-crbug.com/591099 fast/parser/document-write-into-initial-document.html [ Crash ]
+crbug.com/591099 fast/parser/document-write-into-initial-document.html [ Crash Pass ]
 crbug.com/591099 fast/parser/document-write-onload-nesting.html [ Failure ]
 crbug.com/591099 fast/parser/document-write-onload-ordering.html [ Failure ]
 crbug.com/591099 fast/parser/document-write-option.html [ Failure ]
@@ -12844,13 +12852,13 @@
 crbug.com/591099 fast/parser/inline-script-order.html [ Failure ]
 crbug.com/591099 fast/parser/innerhtml-with-prefixed-elements.xhtml [ Failure Pass ]
 crbug.com/591099 fast/parser/input-textarea-inside-select-element.html [ Failure ]
-crbug.com/591099 fast/parser/inselect-tokenization.html [ Crash ]
+crbug.com/591099 fast/parser/inselect-tokenization.html [ Crash Pass ]
 crbug.com/591099 fast/parser/invalid-entity-document-write.html [ Failure ]
 crbug.com/591099 fast/parser/move-during-parsing.html [ Failure ]
 crbug.com/591099 fast/parser/nofoo-tags-inside-paragraph.html [ Failure ]
 crbug.com/591099 fast/parser/non-script-endtag-in-textmode.html [ Failure ]
 crbug.com/591099 fast/parser/noscript-with-javascript-disabled.html [ Failure ]
-crbug.com/591099 fast/parser/object-with-textarea-fallback.html [ Crash ]
+crbug.com/591099 fast/parser/object-with-textarea-fallback.html [ Crash Pass ]
 crbug.com/591099 fast/parser/open-comment-in-style.html [ Failure ]
 crbug.com/591099 fast/parser/open-comment-in-textarea.html [ Crash Failure ]
 crbug.com/591099 fast/parser/p-in-scope-strict.html [ Failure ]
@@ -12870,19 +12878,19 @@
 crbug.com/591099 fast/parser/stray-end-tags-with-attributes-002-alt-quirks.html [ Failure ]
 crbug.com/591099 fast/parser/stray-end-tags-with-attributes-002-alt.html [ Failure ]
 crbug.com/591099 fast/parser/strict-img-in-map.html [ Crash Failure ]
-crbug.com/591099 fast/parser/strip-script-attrs-on-input.html [ Crash ]
+crbug.com/591099 fast/parser/strip-script-attrs-on-input.html [ Crash Pass ]
 crbug.com/591099 fast/parser/style-script-head-test.html [ Failure ]
 crbug.com/591099 fast/parser/tabindex-parsing.html [ Failure ]
 crbug.com/591099 fast/parser/tabs-in-scripts.html [ Failure ]
 crbug.com/591099 fast/parser/tag-with-exclamation-point.html [ Failure ]
 crbug.com/591099 fast/parser/title-error-test.html [ Failure ]
 crbug.com/591099 fast/parser/tokenizer-close-during-document-write.html [ Failure ]
-crbug.com/591099 fast/parser/write-script-waiting-for-style-crash.html [ Crash ]
+crbug.com/591099 fast/parser/write-script-waiting-for-style-crash.html [ Crash Pass ]
 crbug.com/591099 fast/parser/xhtml-alternate-entities.xml [ Crash Failure ]
 crbug.com/591099 fast/parser/xhtml-document-with-html-object.xhtml [ Failure ]
-crbug.com/591099 fast/parser/xhtml-dom-character-data-modified-crash.html [ Crash ]
+crbug.com/591099 fast/parser/xhtml-dom-character-data-modified-crash.html [ Crash Pass ]
 crbug.com/591099 fast/parser/xhtml-html-comment-in-style-block.xhtml [ Failure ]
-crbug.com/591099 fast/parser/xhtml-synchronous-detach-crash.html [ Crash ]
+crbug.com/591099 fast/parser/xhtml-synchronous-detach-crash.html [ Crash Pass ]
 crbug.com/591099 fast/parser/xml-colon-entity.html [ Failure ]
 crbug.com/591099 fast/parser/xml-declaration-missing-ending-mark.html [ Failure ]
 crbug.com/591099 fast/peerconnection/RTCPeerConnection-createAnswer.html [ Failure ]
@@ -12905,9 +12913,9 @@
 crbug.com/591099 fast/performance/performance-mark-exceptions.html [ Failure ]
 crbug.com/591099 fast/performance/performance-measure-exceptions.html [ Failure ]
 crbug.com/591099 fast/performance/performance-observer.html [ Failure ]
-crbug.com/591099 fast/plugins/update-plugin-after-detachment-crash.html [ Crash ]
-crbug.com/591099 fast/plugins/webview-plugin-updates-without-layout.html [ Crash ]
-crbug.com/591099 fast/preloader/document-write-noscript.html [ Crash ]
+crbug.com/591099 fast/plugins/update-plugin-after-detachment-crash.html [ Crash Pass ]
+crbug.com/591099 fast/plugins/webview-plugin-updates-without-layout.html [ Crash Pass ]
+crbug.com/591099 fast/preloader/document-write-noscript.html [ Crash Pass ]
 crbug.com/591099 fast/preloader/iframe-srcdoc.html [ Failure Pass ]
 crbug.com/591099 fast/reflections/abs-position-in-reflection.html [ Failure ]
 crbug.com/591099 fast/reflections/inline-crash.html [ Failure ]
@@ -12947,8 +12955,8 @@
 crbug.com/591099 fast/replaced/computed-image-width-with-percent-height-inside-table-cell-and-fixed-ancestor-vertical-lr.html [ Failure ]
 crbug.com/591099 fast/replaced/computed-image-width-with-percent-height-inside-table-cell-and-fixed-ancestor.html [ Failure ]
 crbug.com/591099 fast/replaced/container-width-zero.html [ Failure ]
-crbug.com/591099 fast/replaced/frame-removed-during-resize-smaller.html [ Crash ]
-crbug.com/591099 fast/replaced/frame-removed-during-resize.html [ Crash ]
+crbug.com/591099 fast/replaced/frame-removed-during-resize-smaller.html [ Crash Failure ]
+crbug.com/591099 fast/replaced/frame-removed-during-resize.html [ Crash Failure ]
 crbug.com/591099 fast/replaced/iframe-with-percentage-height-within-table-with-anonymous-table-cell.html [ Failure ]
 crbug.com/591099 fast/replaced/iframe-with-percentage-height-within-table-with-table-cell-ignore-height.html [ Failure ]
 crbug.com/591099 fast/replaced/image-map-2.html [ Failure ]
@@ -12962,7 +12970,7 @@
 crbug.com/591099 fast/replaced/image-resize-width.html [ Failure ]
 crbug.com/591099 fast/replaced/image-solid-color-with-alpha.html [ Failure ]
 crbug.com/591099 fast/replaced/inline-box-wrapper-handover.html [ Failure ]
-crbug.com/591099 fast/replaced/invalid-object-with-fallback.html [ Crash ]
+crbug.com/591099 fast/replaced/invalid-object-with-fallback.html [ Crash Failure ]
 crbug.com/591099 fast/replaced/max-width-percent.html [ Failure ]
 crbug.com/591099 fast/replaced/maxheight-percent.html [ Failure ]
 crbug.com/591099 fast/replaced/maxheight-pxs.html [ Failure ]
@@ -12977,10 +12985,10 @@
 crbug.com/591099 fast/replaced/no-focus-ring-object.html [ Failure Pass Timeout ]
 crbug.com/591099 fast/replaced/object-align-hspace-vspace.html [ Failure ]
 crbug.com/591099 fast/replaced/object-param-no-name.html [ Failure ]
-crbug.com/591099 fast/replaced/object-with-non-empty-classid-triggers-fallback.html [ Crash ]
+crbug.com/591099 fast/replaced/object-with-non-empty-classid-triggers-fallback.html [ Crash Failure ]
 crbug.com/591099 fast/replaced/outline-replaced-elements.html [ Failure Pass ]
 crbug.com/591099 fast/replaced/percent-height-in-anonymous-block-in-table.html [ Failure ]
-crbug.com/591099 fast/replaced/percent-height-in-anonymous-block-widget.html [ Crash ]
+crbug.com/591099 fast/replaced/percent-height-in-anonymous-block-widget.html [ Crash Failure ]
 crbug.com/591099 fast/replaced/percent-height-in-anonymous-block.html [ Failure ]
 crbug.com/591099 fast/replaced/percentage-height-with-dynamic-container-height.html [ Failure ]
 crbug.com/591099 fast/replaced/preferred-widths.html [ Failure ]
@@ -13009,7 +13017,7 @@
 crbug.com/591099 fast/ruby/base-shorter-than-text.html [ Crash Failure ]
 crbug.com/591099 fast/ruby/float-overhang-from-ruby-text.html [ Crash Failure ]
 crbug.com/591099 fast/ruby/floating-ruby-text.html [ Crash Failure ]
-crbug.com/591099 fast/ruby/line-break-ruby.html [ Crash ]
+crbug.com/591099 fast/ruby/line-break-ruby.html [ Crash Failure ]
 crbug.com/591099 fast/ruby/list-item-marker-in-block-ruby.html [ Crash Failure ]
 crbug.com/591099 fast/ruby/merge-adjacent-anonymous-blocks-inside-ruby-run.html [ Crash Failure ]
 crbug.com/591099 fast/ruby/nested-ruby.html [ Crash Failure ]
@@ -13024,20 +13032,20 @@
 crbug.com/591099 fast/ruby/percentage-height-child.html [ Crash Failure ]
 crbug.com/591099 fast/ruby/position-after.html [ Crash Failure ]
 crbug.com/591099 fast/ruby/positioned-ruby-text.html [ Crash Failure ]
-crbug.com/591099 fast/ruby/ruby-base-merge-block-children-crash.html [ Crash ]
+crbug.com/591099 fast/ruby/ruby-base-merge-block-children-crash.html [ Crash Failure ]
 crbug.com/591099 fast/ruby/ruby-block-style-not-updated.html [ Crash Failure ]
 crbug.com/591099 fast/ruby/ruby-empty-rt.html [ Crash Failure ]
 crbug.com/591099 fast/ruby/ruby-inline-style-not-updated.html [ Crash Failure ]
 crbug.com/591099 fast/ruby/ruby-inline-table.html [ Failure ]
 crbug.com/591099 fast/ruby/ruby-length.html [ Crash Failure ]
 crbug.com/591099 fast/ruby/ruby-line-height.html [ Crash Failure ]
-crbug.com/591099 fast/ruby/ruby-overhang-crash.html [ Crash ]
+crbug.com/591099 fast/ruby/ruby-overhang-crash.html [ Crash Pass ]
 crbug.com/591099 fast/ruby/ruby-run-break.html [ Crash Failure ]
 crbug.com/591099 fast/ruby/ruby-runs-spans.html [ Crash Failure ]
 crbug.com/591099 fast/ruby/ruby-runs.html [ Crash Failure ]
 crbug.com/591099 fast/ruby/ruby-simple-rp.html [ Crash Failure ]
 crbug.com/591099 fast/ruby/ruby-simple.html [ Crash Failure ]
-crbug.com/591099 fast/ruby/ruby-svg-crash.html [ Crash ]
+crbug.com/591099 fast/ruby/ruby-svg-crash.html [ Crash Pass ]
 crbug.com/591099 fast/ruby/ruby-text-before-after-content.html [ Crash Failure ]
 crbug.com/591099 fast/ruby/ruby-text-before-child-split.html [ Failure ]
 crbug.com/591099 fast/ruby/ruby-text-indent.html [ Crash Failure ]
@@ -13065,14 +13073,14 @@
 crbug.com/591099 fast/scroll-behavior/overflow-scroll-triggers-layout.html [ Failure ]
 crbug.com/591099 fast/scroll-behavior/parse-scroll-behavior.html [ Failure ]
 crbug.com/591099 fast/scroll-behavior/scroll-into-view-scrolls-layout-viewport.html [ Failure ]
-crbug.com/591099 fast/scroll-behavior/scroll-over-resizer.html [ Crash ]
+crbug.com/591099 fast/scroll-behavior/scroll-over-resizer.html [ Crash Pass ]
 crbug.com/591099 fast/scroll-behavior/smooth-scroll/keyboard-scroll.html [ Failure ]
 crbug.com/591099 fast/scroll-behavior/smooth-scroll/mousewheel-scroll.html [ Failure ]
 crbug.com/591099 fast/scroll-behavior/smooth-scroll/scroll-during-selection.html [ Failure ]
 crbug.com/591099 fast/scroll-behavior/smooth-scroll/track-scroll.html [ Failure ]
 crbug.com/591099 fast/scroll-behavior/subframe-interrupted-scroll.html [ Failure Pass ]
 crbug.com/591099 fast/scrolling/abspos-relayout-overflow-style-change.html [ Failure ]
-crbug.com/591099 fast/scrolling/content-box-smaller-than-scrollbar.html [ Crash ]
+crbug.com/591099 fast/scrolling/content-box-smaller-than-scrollbar.html [ Crash Failure ]
 crbug.com/591099 fast/scrolling/custom-scrollbar-style-applied.html [ Failure ]
 crbug.com/591099 fast/scrolling/editor-command-scroll-page-scale.html [ Failure ]
 crbug.com/591099 fast/scrolling/fractional-scroll-height-chaining.html [ Failure ]
@@ -13086,7 +13094,7 @@
 crbug.com/591099 fast/scrolling/scroll-clears-fragment-anchor.html [ Failure ]
 crbug.com/591099 fast/scrolling/scroll-element-into-view.html [ Failure ]
 crbug.com/591099 fast/scrolling/scroll-into-view-collapsed-div.html [ Failure ]
-crbug.com/591099 fast/scrolling/scroll-into-view-small-size-ancestor.html [ Crash ]
+crbug.com/591099 fast/scrolling/scroll-into-view-small-size-ancestor.html [ Crash Pass ]
 crbug.com/591099 fast/scrolling/scroll-max-value.html [ Crash Failure ]
 crbug.com/591099 fast/scrolling/scrollable-area-frame-overflow-hidden.html [ Crash Failure ]
 crbug.com/591099 fast/scrolling/scrollbar-mousedown-mouseup.html [ Failure ]
@@ -13174,8 +13182,8 @@
 crbug.com/591099 fast/selectors/adjacent-selectors-with-subselector.html [ Failure ]
 crbug.com/591099 fast/selectors/element-closest-general.html [ Failure ]
 crbug.com/591099 fast/selectors/element-closest-scope.html [ Failure ]
-crbug.com/591099 fast/selectors/focus-within-iframe.html [ Crash ]
-crbug.com/591099 fast/selectors/focus-within-window-inactive.html [ Crash ]
+crbug.com/591099 fast/selectors/focus-within-iframe.html [ Crash Pass ]
+crbug.com/591099 fast/selectors/focus-within-window-inactive.html [ Crash Pass ]
 crbug.com/591099 fast/selectors/lang-inheritance.html [ Failure Pass ]
 crbug.com/591099 fast/selectors/lang-inheritance2.html [ Failure Pass ]
 crbug.com/591099 fast/selectors/lang-vs-xml-lang-xhtml.xhtml [ Failure Pass ]
@@ -13270,16 +13278,16 @@
 crbug.com/591099 fast/spatial-navigation/snav-clipped-overflowed-content.html [ Failure ]
 crbug.com/591099 fast/spatial-navigation/snav-container-white-space.html [ Failure ]
 crbug.com/591099 fast/spatial-navigation/snav-date.html [ Failure ]
-crbug.com/591099 fast/spatial-navigation/snav-div-scrollable-but-without-focusable-content.html [ Failure ]
+crbug.com/591099 fast/spatial-navigation/snav-div-scrollable-but-without-focusable-content.html [ Failure Pass ]
 crbug.com/591099 fast/spatial-navigation/snav-fully-aligned-vertically.html [ Failure ]
 crbug.com/591099 fast/spatial-navigation/snav-hidden-focusable-element.html [ Failure ]
 crbug.com/591099 fast/spatial-navigation/snav-hidden-iframe-zero-size.html [ Failure ]
 crbug.com/591099 fast/spatial-navigation/snav-hidden-iframe.html [ Failure ]
-crbug.com/591099 fast/spatial-navigation/snav-iframe-with-offscreen-focusable-element.html [ Failure ]
-crbug.com/591099 fast/spatial-navigation/snav-imagemap-area-not-focusable.html [ Failure ]
-crbug.com/591099 fast/spatial-navigation/snav-imagemap-area-without-image.html [ Failure ]
-crbug.com/591099 fast/spatial-navigation/snav-imagemap-overlapped-areas.html [ Failure ]
-crbug.com/591099 fast/spatial-navigation/snav-imagemap-simple.html [ Failure ]
+crbug.com/591099 fast/spatial-navigation/snav-iframe-with-offscreen-focusable-element.html [ Failure Pass ]
+crbug.com/591099 fast/spatial-navigation/snav-imagemap-area-not-focusable.html [ Failure Pass ]
+crbug.com/591099 fast/spatial-navigation/snav-imagemap-area-without-image.html [ Failure Pass ]
+crbug.com/591099 fast/spatial-navigation/snav-imagemap-overlapped-areas.html [ Failure Pass ]
+crbug.com/591099 fast/spatial-navigation/snav-imagemap-simple.html [ Failure Pass ]
 crbug.com/591099 fast/spatial-navigation/snav-input.html [ Failure ]
 crbug.com/591099 fast/spatial-navigation/snav-media-elements.html [ Failure ]
 crbug.com/591099 fast/spatial-navigation/snav-multiple-select-focusring.html [ Failure ]
@@ -13330,7 +13338,7 @@
 crbug.com/591099 fast/sub-pixel/size-of-box-with-zoom.html [ Failure ]
 crbug.com/591099 fast/sub-pixel/size-of-span-with-different-positions.html [ Failure ]
 crbug.com/591099 fast/sub-pixel/sub-pixel-border-2.html [ Failure ]
-crbug.com/591099 fast/sub-pixel/sub-pixel-border.html [ Crash ]
+crbug.com/591099 fast/sub-pixel/sub-pixel-border.html [ Crash Pass ]
 crbug.com/591099 fast/sub-pixel/sub-pixel-precision-on-height-of-replaced-element.html [ Failure ]
 crbug.com/591099 fast/sub-pixel/table-rows-have-stable-height.html [ Failure ]
 crbug.com/591099 fast/table/003.html [ Failure ]
@@ -13407,7 +13415,7 @@
 crbug.com/591099 fast/table/crash-output-element-as-column-group.html [ Failure ]
 crbug.com/591099 fast/table/crash-section-logical-height-changed-needsCellRecalc.html [ Failure ]
 crbug.com/591099 fast/table/crash-split-table-section-no-cell-recalc.html [ Crash Pass ]
-crbug.com/591099 fast/table/crash-splitColumn-2.html [ Crash ]
+crbug.com/591099 fast/table/crash-splitColumn-2.html [ Crash Failure ]
 crbug.com/591099 fast/table/crash-splitColumn-3.html [ Failure ]
 crbug.com/591099 fast/table/crash-splitColumn.html [ Failure ]
 crbug.com/591099 fast/table/css-table-max-width.html [ Failure ]
@@ -13454,7 +13462,7 @@
 crbug.com/591099 fast/table/min-width-css-inline-table.html [ Failure Timeout ]
 crbug.com/591099 fast/table/min-width-html-block-table.html [ Failure Timeout ]
 crbug.com/591099 fast/table/min-width-html-inline-table.html [ Failure Timeout ]
-crbug.com/591099 fast/table/multiple-captions-crash3.html [ Crash ]
+crbug.com/591099 fast/table/multiple-captions-crash3.html [ Crash Pass ]
 crbug.com/591099 fast/table/nested-percent-height-table.html [ Failure ]
 crbug.com/591099 fast/table/overallocating-auto-cells.html [ Failure ]
 crbug.com/591099 fast/table/percent-height-border-box-content-in-cell-2.html [ Failure ]
@@ -13478,7 +13486,7 @@
 crbug.com/591099 fast/table/percent-widths-stretch-vertical.html [ Failure ]
 crbug.com/591099 fast/table/percent-widths-total-less-than-one.html [ Failure ]
 crbug.com/591099 fast/table/prepend-in-anonymous-table.html [ Failure ]
-crbug.com/591099 fast/table/quirks-mode-ignore-display-inline-table.html [ Crash ]
+crbug.com/591099 fast/table/quirks-mode-ignore-display-inline-table.html [ Crash Pass ]
 crbug.com/591099 fast/table/recalc-section-first-body-crash-main.html [ Failure ]
 crbug.com/591099 fast/table/remove-anonymous-cell.html [ Failure ]
 crbug.com/591099 fast/table/remove-cell-with-large-border-width.html [ Failure ]
@@ -13500,7 +13508,7 @@
 crbug.com/591099 fast/table/table-all-rowspans-height-distribution-in-rows-except-overlapped.html [ Failure ]
 crbug.com/591099 fast/table/table-all-rowspans-height-distribution-in-rows.html [ Failure ]
 crbug.com/591099 fast/table/table-before-child-in-table.html [ Failure Pass ]
-crbug.com/591099 fast/table/table-caption-moved-crash.html [ Crash ]
+crbug.com/591099 fast/table/table-caption-moved-crash.html [ Crash Pass ]
 crbug.com/591099 fast/table/table-cell-negative-start-margin-align-center.html [ Failure ]
 crbug.com/591099 fast/table/table-colgroup-present-after-table-row.html [ Failure ]
 crbug.com/591099 fast/table/table-different-overflow-values-2.html [ Failure ]
@@ -13569,7 +13577,7 @@
 crbug.com/591099 fast/text-autosizing/header-links-autosizing-different-fontsize.html [ Failure ]
 crbug.com/591099 fast/text-autosizing/header-links-autosizing.html [ Failure ]
 crbug.com/591099 fast/text-autosizing/inherited-multiplier.html [ Failure ]
-crbug.com/591099 fast/text-autosizing/inline-block-em-width-hover.html [ Crash ]
+crbug.com/591099 fast/text-autosizing/inline-block-em-width-hover.html [ Crash Pass ]
 crbug.com/591099 fast/text-autosizing/inline-float.html [ Failure ]
 crbug.com/591099 fast/text-autosizing/layout-after-append.html [ Failure ]
 crbug.com/591099 fast/text-autosizing/list-item-above-dbcat.html [ Failure ]
@@ -13645,7 +13653,7 @@
 crbug.com/591099 fast/text/decorations-with-text-combine.html [ Failure ]
 crbug.com/591099 fast/text/delete-hard-break-character.html [ Failure ]
 crbug.com/591099 fast/text/drawBidiText.html [ Failure ]
-crbug.com/591099 fast/text/editing-text-crash.html [ Crash ]
+crbug.com/591099 fast/text/editing-text-crash.html [ Crash Pass ]
 crbug.com/591099 fast/text/ellipsis-at-edge-of-ltr-text-in-rtl-flow.html [ Failure ]
 crbug.com/591099 fast/text/ellipsis-at-edge-of-rtl-text-in-ltr-flow.html [ Failure ]
 crbug.com/591099 fast/text/ellipsis-ltr-text-in-ltr-flow-underline-composition.html [ Failure ]
@@ -13678,11 +13686,11 @@
 crbug.com/591099 fast/text/find-kana.html [ Timeout ]
 crbug.com/591099 fast/text/find-russian.html [ Failure ]
 crbug.com/591099 fast/text/find-soft-hyphen.html [ Failure ]
-crbug.com/591099 fast/text/first-letter-bad-line-boxes-crash.html [ Crash ]
+crbug.com/591099 fast/text/first-letter-bad-line-boxes-crash.html [ Crash Pass ]
 crbug.com/591099 fast/text/firstline/001.html [ Failure ]
 crbug.com/591099 fast/text/firstline/002.html [ Failure ]
 crbug.com/591099 fast/text/firstline/003.html [ Failure ]
-crbug.com/591099 fast/text/fit-content-with-element-boundaries.html [ Crash ]
+crbug.com/591099 fast/text/fit-content-with-element-boundaries.html [ Crash Pass ]
 crbug.com/591099 fast/text/font-ascent-mac.html [ Failure ]
 crbug.com/591099 fast/text/font-fallback-synthetic-italics.html [ Failure ]
 crbug.com/591099 fast/text/font-initial.html [ Failure ]
@@ -13696,7 +13704,7 @@
 crbug.com/591099 fast/text/hyphenate-character.html [ Failure ]
 crbug.com/591099 fast/text/hyphens/hyphens-none.html [ Failure ]
 crbug.com/591099 fast/text/in-rendered-text-rtl.html [ Failure ]
-crbug.com/591099 fast/text/insert-text-crash.html [ Crash ]
+crbug.com/591099 fast/text/insert-text-crash.html [ Crash Pass ]
 crbug.com/591099 fast/text/international/arabic-justify.html [ Failure ]
 crbug.com/591099 fast/text/international/arabic-vertical-offset.html [ Failure ]
 crbug.com/591099 fast/text/international/bidi-AN-after-empty-run.html [ Failure ]
@@ -13727,7 +13735,7 @@
 crbug.com/591099 fast/text/international/hebrew-vowels.html [ Failure ]
 crbug.com/591099 fast/text/international/hindi-whitespace.html [ Failure ]
 crbug.com/591099 fast/text/international/iso-8859-8.html [ Failure ]
-crbug.com/591099 fast/text/international/listbox-width-rtl.html [ Crash ]
+crbug.com/591099 fast/text/international/listbox-width-rtl.html [ Crash Failure ]
 crbug.com/591099 fast/text/international/plane2.html [ Failure ]
 crbug.com/591099 fast/text/international/rtl-caret.html [ Failure ]
 crbug.com/591099 fast/text/international/rtl-negative-letter-spacing.html [ Failure ]
@@ -13739,8 +13747,8 @@
 crbug.com/591099 fast/text/international/text-spliced-font.html [ Failure ]
 crbug.com/591099 fast/text/international/thai-cursor-position.html [ Crash Failure ]
 crbug.com/591099 fast/text/international/thai-offsetForPosition-inside-character.html [ Failure ]
-crbug.com/591099 fast/text/international/unicode-bidi-isolate-nested-with-removes-not-adjacent.html [ Crash ]
-crbug.com/591099 fast/text/international/unicode-bidi-isolate-nested-with-removes.html [ Crash ]
+crbug.com/591099 fast/text/international/unicode-bidi-isolate-nested-with-removes-not-adjacent.html [ Crash Pass ]
+crbug.com/591099 fast/text/international/unicode-bidi-isolate-nested-with-removes.html [ Crash Pass ]
 crbug.com/591099 fast/text/international/unicode-bidi-plaintext.html [ Failure ]
 crbug.com/591099 fast/text/international/vertical-text-glyph-test.html [ Failure ]
 crbug.com/591099 fast/text/international/vertical-text-metrics-test.html [ Crash Failure ]
@@ -13820,16 +13828,16 @@
 crbug.com/591099 fast/text/soft-hyphen-min-preferred-width.html [ Failure ]
 crbug.com/591099 fast/text/soft-hyphen-overflow.html [ Failure ]
 crbug.com/591099 fast/text/stale-TextLayout-from-first-line.html [ Failure ]
-crbug.com/591099 fast/text/sub-pixel/text-scaling-ltr.html [ Crash ]
+crbug.com/591099 fast/text/sub-pixel/text-scaling-ltr.html [ Crash Pass ]
 crbug.com/591099 fast/text/sub-pixel/text-scaling-pixel.html [ Failure Timeout ]
-crbug.com/591099 fast/text/sub-pixel/text-scaling-rtl.html [ Crash Failure Timeout ]
-crbug.com/591099 fast/text/sub-pixel/text-scaling-vertical.html [ Crash Failure Timeout ]
-crbug.com/591099 fast/text/sub-pixel/text-scaling-webfont.html [ Crash Failure Timeout ]
+crbug.com/591099 fast/text/sub-pixel/text-scaling-rtl.html [ Crash Failure Pass Timeout ]
+crbug.com/591099 fast/text/sub-pixel/text-scaling-vertical.html [ Crash Failure Pass Timeout ]
+crbug.com/591099 fast/text/sub-pixel/text-scaling-webfont.html [ Crash Failure Pass Timeout ]
 crbug.com/591099 fast/text/tab-min-size.html [ Failure ]
 crbug.com/591099 fast/text/text-between-two-brs-in-nowrap-overflow.html [ Failure ]
 crbug.com/591099 fast/text/text-combine-shrink-to-fit.html [ Failure ]
 crbug.com/591099 fast/text/text-container-bounding-rect.html [ Crash Failure ]
-crbug.com/591099 fast/text/text-iterator-crash.html [ Crash ]
+crbug.com/591099 fast/text/text-iterator-crash.html [ Crash Failure ]
 crbug.com/591099 fast/text/text-large-negative-letter-spacing-with-opacity.html [ Failure ]
 crbug.com/591099 fast/text/text-letter-spacing.html [ Failure ]
 crbug.com/591099 fast/text/text-shadow-no-default-color.html [ Failure ]
@@ -13936,7 +13944,7 @@
 crbug.com/591099 fast/url/standard-url.html [ Failure ]
 crbug.com/591099 fast/url/trivial-segments.html [ Failure ]
 crbug.com/591099 fast/url/trivial.html [ Failure ]
-crbug.com/591099 fast/workers/close-context-messageport-crash.html [ Crash ]
+crbug.com/591099 fast/workers/close-context-messageport-crash.html [ Crash Pass ]
 crbug.com/591099 fast/workers/constructor-proto.html [ Failure ]
 crbug.com/591099 fast/workers/dedicated-worker-lifecycle.html [ Failure ]
 crbug.com/591099 fast/workers/shared-worker-console-log.html [ Failure ]
@@ -13946,7 +13954,7 @@
 crbug.com/591099 fast/workers/shared-worker-exception.html [ Failure ]
 crbug.com/591099 fast/workers/shared-worker-gc.html [ Failure ]
 crbug.com/591099 fast/workers/shared-worker-in-iframe.html [ Failure ]
-crbug.com/591099 fast/workers/shared-worker-lifecycle.html [ Crash ]
+crbug.com/591099 fast/workers/shared-worker-lifecycle.html [ Crash Failure ]
 crbug.com/591099 fast/workers/shared-worker-load-error.html [ Failure ]
 crbug.com/591099 fast/workers/shared-worker-location.html [ Failure ]
 crbug.com/591099 fast/workers/shared-worker-messageevent-source.html [ Failure ]
@@ -14046,7 +14054,7 @@
 crbug.com/591099 fast/writing-mode/margin-collapse.html [ Failure ]
 crbug.com/591099 fast/writing-mode/margins.html [ Failure ]
 crbug.com/591099 fast/writing-mode/orthogonal-writing-modes-available-width-absolute-crash.html [ Failure ]
-crbug.com/591099 fast/writing-mode/orthogonal-writing-modes-floats-crash-3.html [ Crash ]
+crbug.com/591099 fast/writing-mode/orthogonal-writing-modes-floats-crash-3.html [ Crash Pass ]
 crbug.com/591099 fast/writing-mode/orthogonal-writing-modes-scrollbarpart-crash.html [ Failure ]
 crbug.com/591099 fast/writing-mode/percentage-height-orthogonal-writing-modes-quirks.html [ Failure ]
 crbug.com/591099 fast/writing-mode/percentage-height-orthogonal-writing-modes.html [ Failure ]
@@ -14055,14 +14063,14 @@
 crbug.com/591099 fast/writing-mode/table-hit-test.html [ Failure ]
 crbug.com/591099 fast/writing-mode/table-percent-width-quirk.html [ Crash Failure ]
 crbug.com/591099 fast/writing-mode/table-vertical-child-width.html [ Failure ]
-crbug.com/591099 fast/writing-mode/text-combine-compress.html [ Crash ]
+crbug.com/591099 fast/writing-mode/text-combine-compress.html [ Crash Failure ]
 crbug.com/591099 fast/writing-mode/text-combine-justify.html [ Failure ]
 crbug.com/591099 fast/writing-mode/text-combine-line-break.html [ Failure ]
 crbug.com/591099 fast/writing-mode/text-combine-various-fonts.html [ Failure ]
 crbug.com/591099 fast/writing-mode/text-orientation-basic.html [ Failure ]
 crbug.com/591099 fast/writing-mode/vertical-baseline-alignment.html [ Failure ]
 crbug.com/591099 fast/writing-mode/vertical-font-fallback.html [ Failure ]
-crbug.com/591099 fast/writing-mode/vertical-inline-block-hittest.html [ Crash ]
+crbug.com/591099 fast/writing-mode/vertical-inline-block-hittest.html [ Crash Failure ]
 crbug.com/591099 fast/writing-mode/vertical-lr-replaced-selection.html [ Failure ]
 crbug.com/591099 fast/writing-mode/vorg-glyph-zero-crash.html [ Failure ]
 crbug.com/591099 fast/xmlhttprequest/instanceof-XMLHttpRequest.html [ Failure ]
@@ -14074,7 +14082,7 @@
 crbug.com/591099 fast/xmlhttprequest/xmlhttprequest-html-response-encoding.html [ Crash Failure ]
 crbug.com/591099 fast/xmlhttprequest/xmlhttprequest-missing-file-exception.html [ Failure ]
 crbug.com/591099 fast/xmlhttprequest/xmlhttprequest-nonexistent-file.html [ Failure ]
-crbug.com/591099 fast/xmlhttprequest/xmlhttprequest-open-after-iframe-onload-remove-self.html [ Crash ]
+crbug.com/591099 fast/xmlhttprequest/xmlhttprequest-open-after-iframe-onload-remove-self.html [ Crash Failure ]
 crbug.com/591099 fast/xmlhttprequest/xmlhttprequest-open-exceptions.html [ Failure ]
 crbug.com/591099 fast/xmlhttprequest/xmlhttprequest-recursive-sync-event.html [ Failure ]
 crbug.com/591099 fast/xmlhttprequest/xmlhttprequest-responseXML-html-document-responsetype-quirks.html [ Failure ]
@@ -14214,7 +14222,7 @@
 crbug.com/591099 fragmentation/tbody-before-thead.html [ Failure ]
 crbug.com/591099 fragmentation/unbreakable-tall-float-before-block.html [ Failure ]
 crbug.com/591099 fragmentation/unbreakable-tall-float-before-line.html [ Failure Pass ]
-crbug.com/591099 fullscreen/anonymous-block-merge-crash.html [ Crash ]
+crbug.com/591099 fullscreen/anonymous-block-merge-crash.html [ Crash Pass ]
 crbug.com/591099 fullscreen/compositor-touch-hit-rects-fullscreen-video-controls.html [ Failure ]
 crbug.com/591099 fullscreen/exit-full-screen-iframe.html [ Crash Failure ]
 crbug.com/591099 fullscreen/full-screen-cancel-nested.html [ Crash Failure ]
@@ -14223,7 +14231,7 @@
 crbug.com/591099 fullscreen/full-screen-element-stack.html [ Failure ]
 crbug.com/591099 fullscreen/full-screen-frameset.html [ Failure ]
 crbug.com/591099 fullscreen/full-screen-iframe-allowed-nested.html [ Timeout ]
-crbug.com/591099 fullscreen/full-screen-iframe-allowed.html [ Crash ]
+crbug.com/591099 fullscreen/full-screen-iframe-allowed.html [ Crash Failure ]
 crbug.com/591099 fullscreen/full-screen-iframe-legacy.html [ Failure ]
 crbug.com/591099 fullscreen/full-screen-iframe-not-allowed.html [ Failure ]
 crbug.com/591099 fullscreen/full-screen-iframe-without-allow-attribute-allowed-from-parent.html [ Failure ]
@@ -14231,8 +14239,8 @@
 crbug.com/591099 fullscreen/full-screen-request-removed.html [ Failure ]
 crbug.com/591099 fullscreen/full-screen-table-section.html [ Failure ]
 crbug.com/591099 fullscreen/full-screen-with-css-reference-filter.html [ Failure ]
-crbug.com/591099 fullscreen/full-screen-with-flex-item.html [ Crash ]
-crbug.com/591099 fullscreen/model/fully-exit-fullscreen-nested-iframe.html [ Crash ]
+crbug.com/591099 fullscreen/full-screen-with-flex-item.html [ Crash Failure ]
+crbug.com/591099 fullscreen/model/fully-exit-fullscreen-nested-iframe.html [ Crash Pass ]
 crbug.com/591099 fullscreen/video-controls-override.html [ Failure ]
 crbug.com/591099 fullscreen/video-controls-timeline.html [ Failure ]
 crbug.com/591099 fullscreen/video-fail-to-enter-full-screen.html [ Failure ]
@@ -14272,7 +14280,7 @@
 crbug.com/591099 geolocation-api/reentrant-error.html [ Failure ]
 crbug.com/591099 geolocation-api/reentrant-permission-denied.html [ Failure ]
 crbug.com/591099 geolocation-api/reentrant-success.html [ Failure ]
-crbug.com/591099 geolocation-api/remove-remote-context-in-error-callback-crash.html [ Crash ]
+crbug.com/591099 geolocation-api/remove-remote-context-in-error-callback-crash.html [ Crash Failure ]
 crbug.com/591099 geolocation-api/success-clear-watch.html [ Failure ]
 crbug.com/591099 geolocation-api/success.html [ Failure ]
 crbug.com/591099 geolocation-api/timeout-clear-watch.html [ Failure ]
@@ -14286,19 +14294,19 @@
 crbug.com/591099 geolocation-api/watchPosition-unique.html [ Failure ]
 crbug.com/591099 geolocation-api/window-close-crash.html [ Failure ]
 crbug.com/591099 hittesting/border-hittest-inlineFlowBox.html [ Failure ]
-crbug.com/591099 hittesting/border-hittest-with-image-fallback.html [ Crash ]
+crbug.com/591099 hittesting/border-hittest-with-image-fallback.html [ Crash Failure ]
 crbug.com/591099 hittesting/border-hittest.html [ Failure ]
 crbug.com/591099 hittesting/border-radius-hittest.html [ Failure ]
 crbug.com/591099 hittesting/culled-inline-crash.html [ Failure ]
 crbug.com/591099 hittesting/culled-inline.html [ Failure ]
-crbug.com/591099 hittesting/hittest-child-of-inlineblock.html [ Crash ]
+crbug.com/591099 hittesting/hittest-child-of-inlineblock.html [ Crash Failure ]
 crbug.com/591099 hittesting/hittest-overlapping-floats.html [ Failure ]
 crbug.com/591099 hittesting/image-with-border-radius.html [ Failure ]
 crbug.com/591099 hittesting/image-with-clip-path.html [ Failure ]
 crbug.com/591099 hittesting/inline-with-clip-path.html [ Failure ]
 crbug.com/591099 hittesting/inner-border-radius-hittest.html [ Failure ]
 crbug.com/591099 hittesting/paint-containment-hittest.html [ Failure ]
-crbug.com/591099 hittesting/subframe_active_crash.html [ Crash ]
+crbug.com/591099 hittesting/subframe_active_crash.html [ Crash Pass ]
 crbug.com/591099 hittesting/text-overflow-inline-image.html [ Timeout ]
 crbug.com/591099 html/details_summary/details-add-child-1.html [ Crash Failure ]
 crbug.com/591099 html/details_summary/details-add-child-2.html [ Crash Failure ]
@@ -14326,7 +14334,7 @@
 crbug.com/591099 html/details_summary/details-add-summary-9.html [ Crash Failure ]
 crbug.com/591099 html/details_summary/details-add-summary-child-1.html [ Crash Failure ]
 crbug.com/591099 html/details_summary/details-add-summary-child-2.html [ Crash Failure ]
-crbug.com/591099 html/details_summary/details-click-controls.html [ Crash ]
+crbug.com/591099 html/details_summary/details-click-controls.html [ Crash Pass ]
 crbug.com/591099 html/details_summary/details-clone.html [ Crash Failure ]
 crbug.com/591099 html/details_summary/details-keyboard-show-hide.html [ Crash Failure ]
 crbug.com/591099 html/details_summary/details-marker-style.html [ Crash Failure ]
@@ -14338,7 +14346,7 @@
 crbug.com/591099 html/details_summary/details-no-summary3.html [ Crash Failure ]
 crbug.com/591099 html/details_summary/details-no-summary4.html [ Crash Failure ]
 crbug.com/591099 html/details_summary/details-open-javascript.html [ Crash Failure ]
-crbug.com/591099 html/details_summary/details-open-toggle-event.html [ Crash ]
+crbug.com/591099 html/details_summary/details-open-toggle-event.html [ Crash Failure ]
 crbug.com/591099 html/details_summary/details-open1.html [ Crash Failure ]
 crbug.com/591099 html/details_summary/details-open2.html [ Crash Failure ]
 crbug.com/591099 html/details_summary/details-open3.html [ Crash Failure ]
@@ -14372,8 +14380,8 @@
 crbug.com/591099 html/details_summary/summary-display-inline-flex.html [ Failure ]
 crbug.com/591099 html/dialog/abspos-dialog-layout.html [ Failure ]
 crbug.com/591099 html/dialog/closed-dialog-does-not-block-mouse-events.html [ Failure ]
-crbug.com/591099 html/dialog/dialog-autofocus-multiple-times.html [ Crash ]
-crbug.com/591099 html/dialog/dialog-autofocus.html [ Crash ]
+crbug.com/591099 html/dialog/dialog-autofocus-multiple-times.html [ Crash Failure ]
+crbug.com/591099 html/dialog/dialog-autofocus.html [ Crash Failure ]
 crbug.com/591099 html/dialog/dialog-canceling.html [ Failure ]
 crbug.com/591099 html/dialog/dialog-close-event.html [ Failure ]
 crbug.com/591099 html/dialog/dialog-enabled.html [ Failure ]
@@ -14381,9 +14389,9 @@
 crbug.com/591099 html/dialog/dialog-return-value.html [ Failure ]
 crbug.com/591099 html/dialog/dialog-show-modal.html [ Failure ]
 crbug.com/591099 html/dialog/fixpos-dialog-layout.html [ Failure ]
-crbug.com/591099 html/dialog/form-method-dialog.html [ Crash ]
+crbug.com/591099 html/dialog/form-method-dialog.html [ Crash Failure ]
 crbug.com/591099 html/dialog/inert-does-not-match-disabled-selector.html [ Failure ]
-crbug.com/591099 html/dialog/inert-focus-in-frames.html [ Crash ]
+crbug.com/591099 html/dialog/inert-focus-in-frames.html [ Crash Failure ]
 crbug.com/591099 html/dialog/inert-inlines.html [ Failure ]
 crbug.com/591099 html/dialog/inert-label-focus.html [ Failure ]
 crbug.com/591099 html/dialog/inert-node-is-uneditable.html [ Crash Failure ]
@@ -14398,15 +14406,15 @@
 crbug.com/591099 html/dialog/non-modal-dialog-does-not-block-mouse-events.html [ Failure ]
 crbug.com/591099 html/dialog/non-modal-dialog-layout.html [ Failure ]
 crbug.com/591099 html/dialog/scrollable-after-close.html [ Failure ]
-crbug.com/591099 html/dialog/shadowdom-in-dialog.html [ Crash ]
-crbug.com/591099 html/dialog/show-modal-focusing-steps.html [ Crash ]
+crbug.com/591099 html/dialog/shadowdom-in-dialog.html [ Crash Pass ]
+crbug.com/591099 html/dialog/show-modal-focusing-steps.html [ Crash Failure ]
 crbug.com/591099 html/dialog/simulated-click-inert.html [ Failure ]
-crbug.com/591099 html/dialog/submit-dialog-close-event.html [ Crash ]
+crbug.com/591099 html/dialog/submit-dialog-close-event.html [ Crash Failure ]
 crbug.com/591099 html/dialog/synthetic-click-inert.html [ Failure ]
 crbug.com/591099 html/dialog/top-layer-position-relative.html [ Failure ]
 crbug.com/591099 html/dialog/top-layer-position-static.html [ Failure ]
 crbug.com/591099 html/document_metadata/base-multiple.html [ Failure ]
-crbug.com/591099 html/document_metadata/head-check.html [ Crash ]
+crbug.com/591099 html/document_metadata/head-check.html [ Crash Failure ]
 crbug.com/591099 html/document_metadata/head-has-text-1.html [ Failure ]
 crbug.com/591099 html/document_metadata/head-has-text-2.html [ Failure ]
 crbug.com/591099 html/document_metadata/head-has-text-3.html [ Failure ]
@@ -14423,7 +14431,7 @@
 crbug.com/591099 html/marquee/marquee-element.html [ Crash Failure ]
 crbug.com/591099 html/marquee/marquee-scroll.html [ Crash Failure ]
 crbug.com/591099 html/marquee/marquee-scrollamount.html [ Crash Failure ]
-crbug.com/591099 html/marquee/marquee-shadow-root-no-access.html [ Crash ]
+crbug.com/591099 html/marquee/marquee-shadow-root-no-access.html [ Crash Pass ]
 crbug.com/591099 html/sections/article-element.html [ Failure ]
 crbug.com/591099 html/sections/aside-element.html [ Failure ]
 crbug.com/591099 html/sections/body-quirk-client-size.html [ Failure ]
@@ -14476,9 +14484,9 @@
 crbug.com/591099 http/tests/appcache/access-via-redirect.php [ Failure ]
 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 ]
-crbug.com/591099 http/tests/appcache/deferred-events-delete-while-raising.html [ Crash ]
-crbug.com/591099 http/tests/appcache/destroyed-frame.html [ Crash ]
+crbug.com/591099 http/tests/appcache/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/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 ]
@@ -14509,7 +14517,7 @@
 crbug.com/591099 http/tests/appcache/top-frame-3.html [ 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 ]
+crbug.com/591099 http/tests/appcache/video.html [ Crash Pass ]
 crbug.com/591099 http/tests/appcache/whitelist-wildcard.html [ Failure ]
 crbug.com/591099 http/tests/appcache/wrong-content-type.html [ Failure ]
 crbug.com/591099 http/tests/appcache/wrong-signature-2.html [ Failure ]
@@ -14519,7 +14527,7 @@
 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/subresource-fragment-identifier.html [ Crash ]
+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-revalidation-referrer.html [ Failure ]
 crbug.com/591099 http/tests/cache/x-frame-options-304.html [ Failure ]
@@ -14537,13 +14545,13 @@
 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/single-quoted-value.html [ Failure ]
-crbug.com/591099 http/tests/credentialmanager/credentialscontainer-frame-errors.html [ Crash ]
+crbug.com/591099 http/tests/credentialmanager/credentialscontainer-frame-errors.html [ Crash Pass ]
 crbug.com/591099 http/tests/css/border-image-loading.html [ Failure ]
 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 ]
+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/pending-stylesheet-offset-width.html [ Failure ]
 crbug.com/591099 http/tests/css/performance-info-with-cached-sheet.html [ Failure ]
@@ -14555,8 +14563,8 @@
 crbug.com/591099 http/tests/csspaint/invalidation-background-image.html [ Timeout ]
 crbug.com/591099 http/tests/csspaint/invalidation-border-image.html [ Timeout ]
 crbug.com/591099 http/tests/csspaint/invalidation-content-image.html [ Timeout ]
-crbug.com/591099 http/tests/dom/EventListener-incumbent-global-1.html [ Crash ]
-crbug.com/591099 http/tests/dom/EventListener-incumbent-global-2.html [ Crash ]
+crbug.com/591099 http/tests/dom/EventListener-incumbent-global-1.html [ Crash Pass ]
+crbug.com/591099 http/tests/dom/EventListener-incumbent-global-2.html [ Crash Pass ]
 crbug.com/591099 http/tests/dom/create-contextual-fragment-from-bodyless-svg-document-range.html [ Failure ]
 crbug.com/591099 http/tests/dom/create-contextual-fragment-from-svg-document-range.html [ Failure ]
 crbug.com/591099 http/tests/dom/location-stringify.html [ Crash Failure ]
@@ -14581,8 +14589,8 @@
 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/existent-eventsource-status-error-iframe-crash.html [ Crash ]
-crbug.com/591099 http/tests/eventsource/non-existent-eventsource-status-error-iframe-crash.html [ Crash ]
+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 ]
 crbug.com/591099 http/tests/eventsource/workers/eventsource-content-type-charset.html [ Failure ]
 crbug.com/591099 http/tests/eventsource/workers/eventsource-cors-basic.html [ Failure ]
@@ -14605,16 +14613,16 @@
 crbug.com/591099 http/tests/feature-policy-experimental-features/vibrate-disabled.php [ Timeout ]
 crbug.com/591099 http/tests/feature-policy-experimental-features/vibrate-enabledforall.php [ Timeout ]
 crbug.com/591099 http/tests/feature-policy-experimental-features/vibrate-enabledforself.php [ Timeout ]
-crbug.com/591099 http/tests/feature-policy/fullscreen-allowed-by-container-policy-relocate.html [ Crash ]
-crbug.com/591099 http/tests/feature-policy/fullscreen-allowed-by-container-policy.html [ Crash ]
-crbug.com/591099 http/tests/feature-policy/fullscreen-disabled.php [ Crash ]
-crbug.com/591099 http/tests/feature-policy/fullscreen-enabledforall.php [ Crash ]
-crbug.com/591099 http/tests/feature-policy/fullscreen-enabledforself.php [ Crash ]
-crbug.com/591099 http/tests/feature-policy/payment-allowed-by-container-policy-relocate.html [ Crash ]
-crbug.com/591099 http/tests/feature-policy/payment-allowed-by-container-policy.html [ Crash ]
-crbug.com/591099 http/tests/feature-policy/payment-disabled.php [ Crash ]
-crbug.com/591099 http/tests/feature-policy/payment-enabledforall.php [ Crash ]
-crbug.com/591099 http/tests/feature-policy/payment-enabledforself.php [ Crash ]
+crbug.com/591099 http/tests/feature-policy/fullscreen-allowed-by-container-policy-relocate.html [ Crash Pass ]
+crbug.com/591099 http/tests/feature-policy/fullscreen-allowed-by-container-policy.html [ Crash Pass ]
+crbug.com/591099 http/tests/feature-policy/fullscreen-disabled.php [ Crash Pass ]
+crbug.com/591099 http/tests/feature-policy/fullscreen-enabledforall.php [ Crash Pass ]
+crbug.com/591099 http/tests/feature-policy/fullscreen-enabledforself.php [ Crash Pass ]
+crbug.com/591099 http/tests/feature-policy/payment-allowed-by-container-policy-relocate.html [ Crash Pass ]
+crbug.com/591099 http/tests/feature-policy/payment-allowed-by-container-policy.html [ Crash Pass ]
+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/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 ]
@@ -14659,13 +14667,13 @@
 crbug.com/591099 http/tests/htmlimports/encoding.html [ Failure ]
 crbug.com/591099 http/tests/htmlimports/import-script-block-crossorigin-dynamic.html [ Failure ]
 crbug.com/591099 http/tests/images/drag-image-to-desktop.html [ Timeout ]
-crbug.com/591099 http/tests/images/force-reload-image-document.html [ Crash ]
-crbug.com/591099 http/tests/images/force-reload.html [ Crash ]
-crbug.com/591099 http/tests/images/image-currentsrc-broken.html [ Crash ]
-crbug.com/591099 http/tests/images/image-currentsrc-error.html [ Crash ]
-crbug.com/591099 http/tests/images/image-currentsrc-invalid.html [ Crash ]
-crbug.com/591099 http/tests/images/image-error-event-not-firing.html [ Crash ]
-crbug.com/591099 http/tests/images/image-with-dpr-natural-dimensions.html [ Crash ]
+crbug.com/591099 http/tests/images/force-reload-image-document.html [ Crash Pass ]
+crbug.com/591099 http/tests/images/force-reload.html [ Crash Pass ]
+crbug.com/591099 http/tests/images/image-currentsrc-broken.html [ Crash Pass ]
+crbug.com/591099 http/tests/images/image-currentsrc-error.html [ Crash Pass ]
+crbug.com/591099 http/tests/images/image-currentsrc-invalid.html [ Crash Pass ]
+crbug.com/591099 http/tests/images/image-error-event-not-firing.html [ Crash Pass ]
+crbug.com/591099 http/tests/images/image-with-dpr-natural-dimensions.html [ Crash Pass ]
 crbug.com/591099 http/tests/images/image-with-origin-header.html [ Failure ]
 crbug.com/591099 http/tests/images/png-partial-load-as-document.html [ Failure Pass ]
 crbug.com/591099 http/tests/images/restyle-decode-error.html [ Failure Pass ]
@@ -14687,11 +14695,11 @@
 crbug.com/591099 http/tests/inspector-enabled/dom-storage-open.html [ Failure ]
 crbug.com/591099 http/tests/inspector-enabled/dynamic-scripts.html [ Crash Failure Timeout ]
 crbug.com/591099 http/tests/inspector-enabled/injected-script-discard.html [ Failure ]
-crbug.com/591099 http/tests/inspector-enabled/reattach-after-editing-styles.html [ Crash ]
+crbug.com/591099 http/tests/inspector-enabled/reattach-after-editing-styles.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector-enabled/resource-tree/main-resource-content.html [ Failure ]
 crbug.com/591099 http/tests/inspector-enabled/resource-tree/resource-tree-mimetype.html [ Failure ]
-crbug.com/591099 http/tests/inspector-enabled/shadow-dom-rules-restart.html [ Crash ]
-crbug.com/591099 http/tests/inspector-enabled/shadow-dom-rules.html [ Crash ]
+crbug.com/591099 http/tests/inspector-enabled/shadow-dom-rules-restart.html [ Crash Failure ]
+crbug.com/591099 http/tests/inspector-enabled/shadow-dom-rules.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector-protocol/access-inspected-object.html [ Failure Timeout ]
 crbug.com/591099 http/tests/inspector-protocol/cookies-protocol-test.html [ Failure Timeout ]
 crbug.com/591099 http/tests/inspector-protocol/network-data-length.html [ Failure Timeout ]
@@ -14720,7 +14728,7 @@
 crbug.com/591099 http/tests/inspector-protocol/websocket/websocket-user-agent-override.html [ Failure ]
 crbug.com/591099 http/tests/inspector-unit/viewport-datagrid-items-attached-to-dom.js [ Failure ]
 crbug.com/591099 http/tests/inspector-unit/viewport-datagrid-items-expandable-attached-to-dom.js [ Failure ]
-crbug.com/591099 http/tests/inspector/appcache/appcache-iframe-manifests.html [ Crash Timeout ]
+crbug.com/591099 http/tests/inspector/appcache/appcache-iframe-manifests.html [ Crash Failure Timeout ]
 crbug.com/591099 http/tests/inspector/appcache/appcache-manifest-with-non-existing-file.html [ Failure Timeout ]
 crbug.com/591099 http/tests/inspector/appcache/appcache-swap.html [ Failure Timeout ]
 crbug.com/591099 http/tests/inspector/application-panel/resources-panel-on-navigation.html [ Failure Timeout ]
@@ -14730,27 +14738,27 @@
 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 ]
-crbug.com/591099 http/tests/inspector/bindings/contentscripts-bindings-multiple-frames.html [ Crash ]
-crbug.com/591099 http/tests/inspector/bindings/contentscripts-navigator-multiple-frames.html [ Crash ]
+crbug.com/591099 http/tests/inspector/bindings/bindings-multiple-frames.html [ Crash Failure ]
+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 ]
 crbug.com/591099 http/tests/inspector/bindings/dynamic-navigator-frame-attach-detach.html [ Failure Timeout ]
 crbug.com/591099 http/tests/inspector/bindings/livelocation-main-frame-navigated.html [ Failure ]
 crbug.com/591099 http/tests/inspector/bindings/navigator-frame-attach-detach.html [ Failure Timeout ]
 crbug.com/591099 http/tests/inspector/bindings/navigator-frame-navigate.html [ Failure Timeout ]
 crbug.com/591099 http/tests/inspector/bindings/navigator-main-frame-navigated.html [ Failure Timeout ]
-crbug.com/591099 http/tests/inspector/bindings/navigator-multiple-frames.html [ Crash Timeout ]
+crbug.com/591099 http/tests/inspector/bindings/navigator-multiple-frames.html [ Crash Failure Timeout ]
 crbug.com/591099 http/tests/inspector/bindings/shadowdom-bindings.html [ Failure Timeout ]
 crbug.com/591099 http/tests/inspector/bindings/shadowdom-navigator.html [ Failure Timeout ]
-crbug.com/591099 http/tests/inspector/bindings/sourcemap-bindings-multiple-frames.html [ Crash Timeout ]
-crbug.com/591099 http/tests/inspector/bindings/sourcemap-navigator-multiple-frames.html [ Crash Timeout ]
-crbug.com/591099 http/tests/inspector/bindings/suspendtarget-bindings.html [ Crash Timeout ]
-crbug.com/591099 http/tests/inspector/bindings/suspendtarget-navigator.html [ Crash ]
+crbug.com/591099 http/tests/inspector/bindings/sourcemap-bindings-multiple-frames.html [ Crash Failure Timeout ]
+crbug.com/591099 http/tests/inspector/bindings/sourcemap-navigator-multiple-frames.html [ Crash Failure Timeout ]
+crbug.com/591099 http/tests/inspector/bindings/suspendtarget-bindings.html [ Crash Failure Timeout ]
+crbug.com/591099 http/tests/inspector/bindings/suspendtarget-navigator.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/cache-storage/cache-data.html [ Failure Timeout ]
 crbug.com/591099 http/tests/inspector/cache-storage/cache-deletion.html [ Failure ]
 crbug.com/591099 http/tests/inspector/cache-storage/cache-entry-deletion.html [ Failure Timeout ]
 crbug.com/591099 http/tests/inspector/cache-storage/cache-names.html [ Failure ]
-crbug.com/591099 http/tests/inspector/change-iframe-src.html [ Crash ]
+crbug.com/591099 http/tests/inspector/change-iframe-src.html [ Crash Pass ]
 crbug.com/591099 http/tests/inspector/command-line-api-inspect.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/compiler-script-mapping.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/compiler-source-mapping-debug.html [ Crash Failure ]
@@ -14766,52 +14774,52 @@
 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 ]
-crbug.com/591099 http/tests/inspector/elements/event-listeners-framework-with-service-worker.html [ Crash ]
-crbug.com/591099 http/tests/inspector/elements/html-link-import.html [ Crash ]
-crbug.com/591099 http/tests/inspector/elements/styles/edit-css-with-source-url.html [ Crash ]
-crbug.com/591099 http/tests/inspector/elements/styles/import-added-through-js-crash.html [ Crash ]
+crbug.com/591099 http/tests/inspector/elements/elements-linkify-attributes.html [ Crash Failure ]
+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 ]
+crbug.com/591099 http/tests/inspector/elements/styles/import-added-through-js-crash.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/elements/styles/inline-stylesheet-sourceurl-and-sourcemapurl.html [ Crash Failure ]
-crbug.com/591099 http/tests/inspector/elements/styles/selector-line-deprecated.html [ Crash ]
+crbug.com/591099 http/tests/inspector/elements/styles/selector-line-deprecated.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/elements/styles/selector-line-sourcemap-header-deprecated.html [ Crash Failure ]
-crbug.com/591099 http/tests/inspector/elements/styles/selector-line-sourcemap-header.html [ Crash ]
-crbug.com/591099 http/tests/inspector/elements/styles/selector-line.html [ Crash ]
+crbug.com/591099 http/tests/inspector/elements/styles/selector-line-sourcemap-header.html [ Crash Failure ]
+crbug.com/591099 http/tests/inspector/elements/styles/selector-line.html [ Crash Failure ]
 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 ]
+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 ]
+crbug.com/591099 http/tests/inspector/elements/styles/xsl-transformed.xml [ Crash Failure ]
 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 ]
+crbug.com/591099 http/tests/inspector/extensions-useragent.html [ Crash Failure ]
 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 ]
 crbug.com/591099 http/tests/inspector/extensions/extensions-audits.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/extensions/extensions-eval-content-script.html [ Failure ]
 crbug.com/591099 http/tests/inspector/extensions/extensions-eval.html [ Crash Failure ]
-crbug.com/591099 http/tests/inspector/extensions/extensions-events.html [ Crash ]
+crbug.com/591099 http/tests/inspector/extensions/extensions-events.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/extensions/extensions-network.html [ Crash Failure ]
-crbug.com/591099 http/tests/inspector/extensions/extensions-panel.html [ Crash ]
+crbug.com/591099 http/tests/inspector/extensions/extensions-panel.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/extensions/extensions-reload.html [ Failure ]
 crbug.com/591099 http/tests/inspector/extensions/extensions-resources.html [ Crash Failure ]
-crbug.com/591099 http/tests/inspector/extensions/extensions-sidebar.html [ Crash ]
-crbug.com/591099 http/tests/inspector/extensions/extensions-timeline-api.html [ Crash ]
+crbug.com/591099 http/tests/inspector/extensions/extensions-sidebar.html [ Crash Failure ]
+crbug.com/591099 http/tests/inspector/extensions/extensions-timeline-api.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/extensions/multiple-extensions.html [ Failure ]
-crbug.com/591099 http/tests/inspector/forced-layout-in-microtask.html [ Crash ]
+crbug.com/591099 http/tests/inspector/forced-layout-in-microtask.html [ Crash Failure ]
 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 ]
+crbug.com/591099 http/tests/inspector/indexeddb/database-refresh-view.html [ Crash Failure ]
 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 ]
 crbug.com/591099 http/tests/inspector/indexeddb/upgrade-events.html [ Failure ]
 crbug.com/591099 http/tests/inspector/inline-source-map-loading.html [ Crash Failure ]
-crbug.com/591099 http/tests/inspector/inspect-element.html [ Crash ]
-crbug.com/591099 http/tests/inspector/inspect-iframe-from-different-domain.html [ Crash ]
-crbug.com/591099 http/tests/inspector/modify-cross-domain-rule.html [ Crash ]
+crbug.com/591099 http/tests/inspector/inspect-element.html [ Crash Failure ]
+crbug.com/591099 http/tests/inspector/inspect-iframe-from-different-domain.html [ Crash Failure ]
+crbug.com/591099 http/tests/inspector/modify-cross-domain-rule.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/network-preflight-options.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/network/async-xhr-json-mime-type.html [ Crash Failure Timeout ]
 crbug.com/591099 http/tests/inspector/network/cached-resource-destroyed-moved-to-storage.html [ Crash Failure ]
@@ -14865,7 +14873,7 @@
 crbug.com/591099 http/tests/inspector/network/network-xsl-content.html [ Failure ]
 crbug.com/591099 http/tests/inspector/network/ping-response.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/network/ping.html [ Failure ]
-crbug.com/591099 http/tests/inspector/network/preview-searchable.html [ Crash ]
+crbug.com/591099 http/tests/inspector/network/preview-searchable.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/network/request-name-path.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/network/request-parameters-decoding.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/network/resource-priority.html [ Crash Failure ]
@@ -14924,10 +14932,10 @@
 crbug.com/591099 http/tests/inspector/search/search-in-resource.html [ Failure ]
 crbug.com/591099 http/tests/inspector/search/search-in-script.html [ Failure ]
 crbug.com/591099 http/tests/inspector/search/search-in-static.html [ Failure ]
-crbug.com/591099 http/tests/inspector/search/source-frame-replace-1.html [ Crash ]
-crbug.com/591099 http/tests/inspector/search/source-frame-replace-2.html [ Crash ]
-crbug.com/591099 http/tests/inspector/search/source-frame-replace-3.html [ Crash ]
-crbug.com/591099 http/tests/inspector/search/source-frame-replace-4.html [ Crash ]
+crbug.com/591099 http/tests/inspector/search/source-frame-replace-1.html [ Crash Failure ]
+crbug.com/591099 http/tests/inspector/search/source-frame-replace-2.html [ Crash Failure ]
+crbug.com/591099 http/tests/inspector/search/source-frame-replace-3.html [ Crash Failure ]
+crbug.com/591099 http/tests/inspector/search/source-frame-replace-4.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/search/source-frame-search.html [ Failure ]
 crbug.com/591099 http/tests/inspector/search/sources-search-scope-in-files.html [ Failure ]
 crbug.com/591099 http/tests/inspector/search/sources-search-scope-many-projects.html [ Failure ]
@@ -14960,19 +14968,19 @@
 crbug.com/591099 http/tests/inspector/service-workers/service-workers-bypass-for-network-redirect.html [ Failure ]
 crbug.com/591099 http/tests/inspector/service-workers/service-workers-force-update-on-page-load.html [ Failure ]
 crbug.com/591099 http/tests/inspector/service-workers/service-workers-navigation-preload.html [ Failure ]
-crbug.com/591099 http/tests/inspector/service-workers/service-workers-redundant.html [ Crash ]
-crbug.com/591099 http/tests/inspector/service-workers/service-workers-view.html [ Crash ]
+crbug.com/591099 http/tests/inspector/service-workers/service-workers-redundant.html [ Crash Failure ]
+crbug.com/591099 http/tests/inspector/service-workers/service-workers-view.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/service-workers/user-agent-override.html [ Failure Timeout ]
 crbug.com/591099 http/tests/inspector/sources/css-sourcemaps-toggle-enabled.html [ Failure ]
 crbug.com/591099 http/tests/inspector/sources/debugger/async-callstack-fetch.html [ Failure ]
 crbug.com/591099 http/tests/inspector/sources/debugger/async-callstack-network-initiator-image.html [ Failure ]
 crbug.com/591099 http/tests/inspector/sources/debugger/async-callstack-network-initiator.html [ Failure Timeout ]
-crbug.com/591099 http/tests/inspector/sources/debugger/pause-in-removed-frame.html [ Crash ]
+crbug.com/591099 http/tests/inspector/sources/debugger/pause-in-removed-frame.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/sources/debugger/source-map-http-header.html [ Failure ]
 crbug.com/591099 http/tests/inspector/sources/debugger/worker-debugging-script-mapping.html [ Failure ]
 crbug.com/591099 http/tests/inspector/sources/debugger/worker-debugging.html [ Failure ]
 crbug.com/591099 http/tests/inspector/sources/event-listener-breakpoints-script-fst-stmt-for-module.html [ Failure Timeout ]
-crbug.com/591099 http/tests/inspector/sources/inline-module-export-error.html [ Crash ]
+crbug.com/591099 http/tests/inspector/sources/inline-module-export-error.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/sources/js-sourcemaps-toggle-enabled.html [ Failure ]
 crbug.com/591099 http/tests/inspector/sources/navigator-view-content-scripts.html [ Failure ]
 crbug.com/591099 http/tests/inspector/sources/ui-source-code-highlight.php [ Failure ]
@@ -14983,28 +14991,28 @@
 crbug.com/591099 http/tests/inspector/stylesheet-source-mapping.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/template-content-inspect-crash.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/text-source-map.html [ Crash Failure ]
-crbug.com/591099 http/tests/inspector/tracing/timeline-network-received-data.html [ Crash ]
-crbug.com/591099 http/tests/inspector/tracing/timeline-receive-response-event.html [ Crash ]
-crbug.com/591099 http/tests/inspector/tracing/timeline-script-parse.html [ Crash ]
-crbug.com/591099 http/tests/inspector/tracing/timeline-xhr-event.html [ Crash ]
-crbug.com/591099 http/tests/inspector/tracing/timeline-xhr-response-type-blob-event.html [ Crash Timeout ]
-crbug.com/591099 http/tests/inspector/tracing/websocket/timeline-websocket-event.html [ Crash ]
+crbug.com/591099 http/tests/inspector/tracing/timeline-network-received-data.html [ Crash Failure ]
+crbug.com/591099 http/tests/inspector/tracing/timeline-receive-response-event.html [ Crash Failure ]
+crbug.com/591099 http/tests/inspector/tracing/timeline-script-parse.html [ Crash Failure ]
+crbug.com/591099 http/tests/inspector/tracing/timeline-xhr-event.html [ Crash Failure ]
+crbug.com/591099 http/tests/inspector/tracing/timeline-xhr-response-type-blob-event.html [ Crash Failure Timeout ]
+crbug.com/591099 http/tests/inspector/tracing/websocket/timeline-websocket-event.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/websocket/network-preserve-selection-on-frame-receive.html [ Failure ]
 crbug.com/591099 http/tests/inspector/websocket/websocket-frame-error.html [ Failure ]
 crbug.com/591099 http/tests/inspector/websocket/websocket-frame.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/websocket/websocket-handshake.html [ Failure ]
 crbug.com/591099 http/tests/inspector/workers-on-navigation.html [ Failure ]
-crbug.com/591099 http/tests/intersection-observer/cross-origin-iframe-with-nesting.html [ Crash ]
-crbug.com/591099 http/tests/intersection-observer/root-bounds.html [ Crash ]
-crbug.com/591099 http/tests/linkHeader/link-preload-in-iframe.html [ Crash ]
-crbug.com/591099 http/tests/loading/empty-content-disposition-type.html [ Crash ]
+crbug.com/591099 http/tests/intersection-observer/cross-origin-iframe-with-nesting.html [ Crash Pass ]
+crbug.com/591099 http/tests/intersection-observer/root-bounds.html [ Crash Pass ]
+crbug.com/591099 http/tests/linkHeader/link-preload-in-iframe.html [ Crash Pass ]
+crbug.com/591099 http/tests/loading/empty-content-disposition-type.html [ Crash Pass ]
 crbug.com/591099 http/tests/loading/fire-error-event-empty-404-script.html [ Failure ]
 crbug.com/591099 http/tests/loading/fire-error-event-script-no-content-type.html [ Failure ]
-crbug.com/591099 http/tests/loading/image-picture-download-after-shrink.html [ Crash ]
-crbug.com/591099 http/tests/loading/image-picture-no-download-after-picture-removal.html [ Crash ]
-crbug.com/591099 http/tests/loading/image-picture-no-download-after-removal.html [ Crash ]
-crbug.com/591099 http/tests/loading/image-picture-no-download-after-source-removal.html [ Crash ]
-crbug.com/591099 http/tests/loading/nested_bad_objects.php [ Crash ]
+crbug.com/591099 http/tests/loading/image-picture-download-after-shrink.html [ Crash Pass ]
+crbug.com/591099 http/tests/loading/image-picture-no-download-after-picture-removal.html [ Crash Pass ]
+crbug.com/591099 http/tests/loading/image-picture-no-download-after-removal.html [ Crash Pass ]
+crbug.com/591099 http/tests/loading/image-picture-no-download-after-source-removal.html [ Crash Pass ]
+crbug.com/591099 http/tests/loading/nested_bad_objects.php [ Crash Pass ]
 crbug.com/591099 http/tests/loading/preload-css-test.html [ Failure ]
 crbug.com/591099 http/tests/loading/preload-img-test.html [ Crash Failure ]
 crbug.com/591099 http/tests/loading/preload-picture-invalid.html [ Crash Failure ]
@@ -15023,109 +15031,109 @@
 crbug.com/591099 http/tests/local/fileapi/send-sliced-dragged-file.html [ Crash Failure ]
 crbug.com/591099 http/tests/local/formdata/send-form-data-with-bad-string.html [ Failure ]
 crbug.com/591099 http/tests/local/formdata/send-form-data-with-empty-blob-filename.html [ Failure ]
-crbug.com/591099 http/tests/local/formdata/send-form-data-with-empty-file-filename.html [ Crash ]
+crbug.com/591099 http/tests/local/formdata/send-form-data-with-empty-file-filename.html [ Crash Failure ]
 crbug.com/591099 http/tests/local/formdata/send-form-data-with-empty-name.html [ Failure ]
-crbug.com/591099 http/tests/local/formdata/send-form-data-with-filename.html [ Crash Timeout ]
+crbug.com/591099 http/tests/local/formdata/send-form-data-with-filename.html [ Crash Failure Timeout ]
 crbug.com/591099 http/tests/local/formdata/send-form-data-with-null-string.html [ Failure ]
-crbug.com/591099 http/tests/local/formdata/send-form-data-with-sliced-file.html [ Crash ]
+crbug.com/591099 http/tests/local/formdata/send-form-data-with-sliced-file.html [ Crash Failure ]
 crbug.com/591099 http/tests/local/formdata/send-form-data-with-string-containing-null.html [ Failure ]
 crbug.com/591099 http/tests/local/formdata/send-form-data.html [ Crash Failure ]
-crbug.com/591099 http/tests/local/formdata/upload-events.html [ Crash ]
+crbug.com/591099 http/tests/local/formdata/upload-events.html [ Crash Failure ]
 crbug.com/591099 http/tests/local/link-stylesheet-preferred.html [ Failure ]
-crbug.com/591099 http/tests/local/serviceworker/fetch-request-body-file.html [ Crash ]
+crbug.com/591099 http/tests/local/serviceworker/fetch-request-body-file.html [ Crash Pass ]
 crbug.com/591099 http/tests/local/stylesheet-and-script-load-order-http.html [ Failure ]
 crbug.com/591099 http/tests/local/stylesheet-and-script-load-order-media-print.html [ Failure ]
 crbug.com/591099 http/tests/local/stylesheet-and-script-load-order.html [ Failure ]
-crbug.com/591099 http/tests/media/autoplay-crossorigin.html [ Crash ]
-crbug.com/591099 http/tests/media/controls/controls-list-add-hide.html [ Crash ]
-crbug.com/591099 http/tests/media/controls/controls-list-remove-show.html [ Crash ]
-crbug.com/591099 http/tests/media/controls/video-controls-overflow-menu-correct-ordering.html [ Crash ]
-crbug.com/591099 http/tests/media/controls/video-controls-overflow-menu-updates-appropriately.html [ Crash ]
-crbug.com/591099 http/tests/media/encrypted-media/encrypted-media-encrypted-event-different-origin.html [ Crash ]
-crbug.com/591099 http/tests/media/encrypted-media/encrypted-media-encrypted-event-same-origin.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-addsourcebuffer.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-append-buffer.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-appendwindow.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-avtracks.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-buffered.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-closed.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-config-change-mp4-a-bitrate.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-config-change-mp4-av-audio-bitrate.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-config-change-mp4-av-framesize.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-config-change-mp4-av-video-bitrate.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-config-change-mp4-v-bitrate.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-config-change-mp4-v-framerate.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-config-change-mp4-v-framesize.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-config-change-webm-a-bitrate.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-config-change-webm-av-audio-bitrate.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-config-change-webm-av-framesize.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-config-change-webm-av-video-bitrate.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-config-change-webm-v-bitrate.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-config-change-webm-v-framerate.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-config-change-webm-v-framesize.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-detach.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-duration-boundaryconditions.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-duration.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-endofstream-invaliderror.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-errors.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-garbage-collection-before-sourceopen.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-gc-after-decode-error-crash.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-getvideoplaybackquality.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-initsegmentreceived-alg.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-multiple-attach.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-play-then-seek-back.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-play.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-precise-duration.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-preload.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-redundant-seek.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-remove.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-removesourcebuffer.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-seek-beyond-duration.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-seek-during-pending-seek.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-seekable.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-sequencemode-append-buffer.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-sequencemode-crbug-616565.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-sourcebuffer-mode.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-sourcebuffer-trackdefaults.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-sourcebufferlist-crash.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-sourcebufferlist.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/mediasource-timestamp-offset.html [ Crash ]
-crbug.com/591099 http/tests/media/media-source/stream_memory_tests/mediasource-appendbuffer-quota-exceeded-default-buffers.html [ Crash ]
-crbug.com/591099 http/tests/media/pdf-served-as-pdf.html [ Crash ]
-crbug.com/591099 http/tests/media/progress-events-generated-correctly.html [ Crash ]
-crbug.com/591099 http/tests/media/reload-after-dialog.html [ Crash ]
-crbug.com/591099 http/tests/media/remove-while-loading.html [ Crash ]
-crbug.com/591099 http/tests/media/text-served-as-text.html [ Crash ]
+crbug.com/591099 http/tests/media/autoplay-crossorigin.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/controls/controls-list-add-hide.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/controls/controls-list-remove-show.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/controls/video-controls-overflow-menu-correct-ordering.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/controls/video-controls-overflow-menu-updates-appropriately.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/encrypted-media/encrypted-media-encrypted-event-different-origin.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/encrypted-media/encrypted-media-encrypted-event-same-origin.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-addsourcebuffer.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-append-buffer.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-appendwindow.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-avtracks.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-buffered.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-closed.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-config-change-mp4-a-bitrate.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-config-change-mp4-av-audio-bitrate.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-config-change-mp4-av-framesize.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-config-change-mp4-av-video-bitrate.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-config-change-mp4-v-bitrate.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-config-change-mp4-v-framerate.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-config-change-mp4-v-framesize.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-config-change-webm-a-bitrate.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-config-change-webm-av-audio-bitrate.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-config-change-webm-av-framesize.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-config-change-webm-av-video-bitrate.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-config-change-webm-v-bitrate.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-config-change-webm-v-framerate.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-config-change-webm-v-framesize.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-detach.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-duration-boundaryconditions.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-duration.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-endofstream-invaliderror.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-errors.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-garbage-collection-before-sourceopen.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-gc-after-decode-error-crash.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-getvideoplaybackquality.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-initsegmentreceived-alg.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-multiple-attach.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-play-then-seek-back.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-play.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-precise-duration.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-preload.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-redundant-seek.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-remove.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-removesourcebuffer.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-seek-beyond-duration.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-seek-during-pending-seek.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-seekable.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-sequencemode-append-buffer.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-sequencemode-crbug-616565.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-sourcebuffer-mode.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-sourcebuffer-trackdefaults.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-sourcebufferlist-crash.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-sourcebufferlist.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/mediasource-timestamp-offset.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/media-source/stream_memory_tests/mediasource-appendbuffer-quota-exceeded-default-buffers.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/pdf-served-as-pdf.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/progress-events-generated-correctly.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/reload-after-dialog.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/remove-while-loading.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/text-served-as-text.html [ Crash Pass ]
 crbug.com/591099 http/tests/media/video-buffered-range-contains-currentTime.html [ Failure Pass ]
-crbug.com/591099 http/tests/media/video-buffered.html [ Crash ]
-crbug.com/591099 http/tests/media/video-controls-download-button-displayed.html [ Crash ]
-crbug.com/591099 http/tests/media/video-controls-download-button-not-displayed-hide-download-ui.html [ Crash ]
-crbug.com/591099 http/tests/media/video-controls-download-button-not-displayed-mediastream.html [ Crash ]
-crbug.com/591099 http/tests/media/video-controls-download-button-not-displayed-mse.html [ Crash ]
-crbug.com/591099 http/tests/media/video-cookie.html [ Crash ]
-crbug.com/591099 http/tests/media/video-error-abort.html [ Crash ]
+crbug.com/591099 http/tests/media/video-buffered.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/video-controls-download-button-displayed.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/video-controls-download-button-not-displayed-hide-download-ui.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/video-controls-download-button-not-displayed-mediastream.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/video-controls-download-button-not-displayed-mse.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/video-cookie.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/video-error-abort.html [ Crash Pass ]
 crbug.com/591099 http/tests/media/video-in-iframe-crash.html [ Crash Pass ]
-crbug.com/591099 http/tests/media/video-load-metadata-decode-error.html [ Crash ]
-crbug.com/591099 http/tests/media/video-load-suspend.html [ Crash ]
-crbug.com/591099 http/tests/media/video-load-with-userpass.html [ Crash ]
-crbug.com/591099 http/tests/media/video-play-progress.html [ Crash ]
-crbug.com/591099 http/tests/media/video-play-stall-before-meta-data.html [ Crash ]
+crbug.com/591099 http/tests/media/video-load-metadata-decode-error.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/video-load-suspend.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/video-load-with-userpass.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/video-play-progress.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/video-play-stall-before-meta-data.html [ Crash Pass ]
 crbug.com/591099 http/tests/media/video-play-stall.html [ Crash Timeout ]
-crbug.com/591099 http/tests/media/video-query-url.html [ Crash ]
-crbug.com/591099 http/tests/media/video-referer.html [ Crash ]
-crbug.com/591099 http/tests/media/video-seek-to-duration.html [ Crash ]
-crbug.com/591099 http/tests/media/video-seek-to-middle.html [ Crash ]
-crbug.com/591099 http/tests/media/video-served-as-text.html [ Crash ]
-crbug.com/591099 http/tests/media/video-throttled-load-metadata.html [ Crash ]
-crbug.com/591099 http/tests/media/video-useragent.html [ Crash ]
+crbug.com/591099 http/tests/media/video-query-url.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/video-referer.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/video-seek-to-duration.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/video-seek-to-middle.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/video-served-as-text.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/video-throttled-load-metadata.html [ Crash Pass ]
+crbug.com/591099 http/tests/media/video-useragent.html [ Crash Pass ]
 crbug.com/591099 http/tests/mime/quoted-charset.php [ Failure ]
-crbug.com/591099 http/tests/mime/reload-subresource-when-type-changes.html [ Crash ]
+crbug.com/591099 http/tests/mime/reload-subresource-when-type-changes.html [ Crash Pass ]
 crbug.com/591099 http/tests/misc/BOM-override-script.html [ Failure ]
 crbug.com/591099 http/tests/misc/DOMContentLoaded-event.html [ Crash Failure ]
-crbug.com/591099 http/tests/misc/acid2-pixel.html [ Crash ]
-crbug.com/591099 http/tests/misc/acid2.html [ Crash ]
+crbug.com/591099 http/tests/misc/acid2-pixel.html [ Crash Failure ]
+crbug.com/591099 http/tests/misc/acid2.html [ Crash Failure ]
 crbug.com/591099 http/tests/misc/acid3.html [ Crash Failure ]
-crbug.com/591099 http/tests/misc/adopt-iframe-src-attr-after-remove.html [ Crash ]
+crbug.com/591099 http/tests/misc/adopt-iframe-src-attr-after-remove.html [ Crash Pass ]
 crbug.com/591099 http/tests/misc/async-script-removed.html [ Failure ]
 crbug.com/591099 http/tests/misc/async-script.html [ Failure ]
 crbug.com/591099 http/tests/misc/bad-charset-alias.html [ Failure ]
@@ -15140,23 +15148,23 @@
 crbug.com/591099 http/tests/misc/char-encoding-in-hidden-charset-field-with-one-field.html [ Failure ]
 crbug.com/591099 http/tests/misc/char-encoding-in-text-charset-field-with-value.html [ Crash Failure ]
 crbug.com/591099 http/tests/misc/char-encoding-without-charset-field.html [ Crash Failure ]
-crbug.com/591099 http/tests/misc/client-hint-accept-on-subresource.html [ Crash ]
-crbug.com/591099 http/tests/misc/client-hints-accept-iframe.html [ Crash ]
-crbug.com/591099 http/tests/misc/client-hints-accept-meta.html [ Crash ]
-crbug.com/591099 http/tests/misc/client-hints-accept-parent.php [ Crash ]
-crbug.com/591099 http/tests/misc/client-hints-accept.php [ Crash ]
-crbug.com/591099 http/tests/misc/client-hints-dynamic-rw-sizes.html [ Crash ]
-crbug.com/591099 http/tests/misc/client-hints-invalid-accept.php [ Crash ]
-crbug.com/591099 http/tests/misc/client-hints-no-accept.html [ Crash ]
-crbug.com/591099 http/tests/misc/client-hints-picture-source-removal.html [ Crash ]
-crbug.com/591099 http/tests/misc/client-hints-picture.html [ Crash ]
-crbug.com/591099 http/tests/misc/client-hints-preload-rw-sizes.html [ Crash ]
+crbug.com/591099 http/tests/misc/client-hint-accept-on-subresource.html [ Crash Pass ]
+crbug.com/591099 http/tests/misc/client-hints-accept-iframe.html [ Crash Pass ]
+crbug.com/591099 http/tests/misc/client-hints-accept-meta.html [ Crash Pass ]
+crbug.com/591099 http/tests/misc/client-hints-accept-parent.php [ Crash Pass ]
+crbug.com/591099 http/tests/misc/client-hints-accept.php [ Crash Pass ]
+crbug.com/591099 http/tests/misc/client-hints-dynamic-rw-sizes.html [ Crash Pass ]
+crbug.com/591099 http/tests/misc/client-hints-invalid-accept.php [ Crash Pass ]
+crbug.com/591099 http/tests/misc/client-hints-no-accept.html [ Crash Pass ]
+crbug.com/591099 http/tests/misc/client-hints-picture-source-removal.html [ Crash Pass ]
+crbug.com/591099 http/tests/misc/client-hints-picture.html [ Crash Pass ]
+crbug.com/591099 http/tests/misc/client-hints-preload-rw-sizes.html [ Crash Pass ]
 crbug.com/591099 http/tests/misc/copy-resolves-urls.html [ Failure ]
 crbug.com/591099 http/tests/misc/crash-multiple-family-fontface.html [ Failure ]
 crbug.com/591099 http/tests/misc/css-reject-any-type-in-strict-mode.html [ Failure ]
-crbug.com/591099 http/tests/misc/delete-frame-during-readystatechange-with-gc-after-video-removal.html [ Crash ]
-crbug.com/591099 http/tests/misc/delete-frame-during-readystatechange.html [ Crash ]
-crbug.com/591099 http/tests/misc/detach-during-notifyDone.html [ Crash ]
+crbug.com/591099 http/tests/misc/delete-frame-during-readystatechange-with-gc-after-video-removal.html [ Crash Pass ]
+crbug.com/591099 http/tests/misc/delete-frame-during-readystatechange.html [ Crash Pass ]
+crbug.com/591099 http/tests/misc/detach-during-notifyDone.html [ Crash Pass ]
 crbug.com/591099 http/tests/misc/dns-prefetch-control.html [ Crash Failure ]
 crbug.com/591099 http/tests/misc/drag-over-iframe-invalid-source-crash.html [ Crash Failure ]
 crbug.com/591099 http/tests/misc/embed-image-load-outlives-gc-without-crashing.html [ Crash Pass ]
@@ -15170,13 +15178,13 @@
 crbug.com/591099 http/tests/misc/extract-http-content-language.php [ Failure ]
 crbug.com/591099 http/tests/misc/favicon-as-image.html [ Failure ]
 crbug.com/591099 http/tests/misc/font-face-in-multiple-segmented-faces.html [ Crash Failure ]
-crbug.com/591099 http/tests/misc/form-action-using-replaceChild.html [ Crash ]
+crbug.com/591099 http/tests/misc/form-action-using-replaceChild.html [ Crash Pass ]
 crbug.com/591099 http/tests/misc/form-post-textplain.html [ Failure ]
 crbug.com/591099 http/tests/misc/frame-access-during-load.html [ Failure ]
 crbug.com/591099 http/tests/misc/generated-content-inside-table.html [ Failure ]
 crbug.com/591099 http/tests/misc/gmail-assert-on-load.html [ Failure ]
 crbug.com/591099 http/tests/misc/iframe-reparenting-id-collision.html [ Failure ]
-crbug.com/591099 http/tests/misc/iframe404.html [ Crash ]
+crbug.com/591099 http/tests/misc/iframe404.html [ Crash Failure ]
 crbug.com/591099 http/tests/misc/image-blocked-src-change.html [ Crash Failure ]
 crbug.com/591099 http/tests/misc/image-blocked-src-no-change.html [ Crash Failure ]
 crbug.com/591099 http/tests/misc/image-input-type-outlives-gc-without-crashing.html [ Crash Pass ]
@@ -15190,13 +15198,13 @@
 crbug.com/591099 http/tests/misc/object-image-error-with-onload.html [ Crash Failure ]
 crbug.com/591099 http/tests/misc/object-image-error.html [ Crash Failure ]
 crbug.com/591099 http/tests/misc/object-image-load-outlives-gc-without-crashing.html [ Crash Pass ]
-crbug.com/591099 http/tests/misc/onload-remove-iframe-crash-2.html [ Crash ]
+crbug.com/591099 http/tests/misc/onload-remove-iframe-crash-2.html [ Crash Pass ]
 crbug.com/591099 http/tests/misc/percent-sign-in-form-field-name.html [ Crash Failure ]
-crbug.com/591099 http/tests/misc/plugin-array-detach.html [ Crash ]
+crbug.com/591099 http/tests/misc/plugin-array-detach.html [ Crash Pass ]
 crbug.com/591099 http/tests/misc/refresh-headers.php [ Failure ]
 crbug.com/591099 http/tests/misc/resource-timing-iframe-restored-from-history.html [ Failure ]
-crbug.com/591099 http/tests/misc/resource-timing-sizes-multipart.html [ Crash ]
-crbug.com/591099 http/tests/misc/resource-timing-sizes-tags.html [ Crash ]
+crbug.com/591099 http/tests/misc/resource-timing-sizes-multipart.html [ Crash Pass ]
+crbug.com/591099 http/tests/misc/resource-timing-sizes-tags.html [ Crash Pass ]
 crbug.com/591099 http/tests/misc/script-after-slow-stylesheet-removed.html [ Crash Failure ]
 crbug.com/591099 http/tests/misc/script-defer-after-slow-stylesheet.html [ Failure ]
 crbug.com/591099 http/tests/misc/script-sync-slow-scripts-onerror.html [ Failure ]
@@ -15223,11 +15231,11 @@
 crbug.com/591099 http/tests/misc/webtiming-resolution.html [ Failure ]
 crbug.com/591099 http/tests/misc/webtiming-slow-load.php [ Failure ]
 crbug.com/591099 http/tests/misc/webtiming-two-redirects.php [ Failure ]
-crbug.com/591099 http/tests/misc/xslt-bad-import.html [ Crash ]
+crbug.com/591099 http/tests/misc/xslt-bad-import.html [ Crash Pass ]
 crbug.com/591099 http/tests/multipart/stop-crash.html [ Failure ]
-crbug.com/591099 http/tests/multipart/stop-loading-after-onload1.html [ Crash ]
-crbug.com/591099 http/tests/multipart/stop-loading-after-onload2.html [ Crash ]
-crbug.com/591099 http/tests/multipart/stop-loading.html [ Crash ]
+crbug.com/591099 http/tests/multipart/stop-loading-after-onload1.html [ Crash Pass ]
+crbug.com/591099 http/tests/multipart/stop-loading-after-onload2.html [ Crash Pass ]
+crbug.com/591099 http/tests/multipart/stop-loading.html [ Crash Pass ]
 crbug.com/591099 http/tests/navigation/anchor-basic.html [ Crash Failure ]
 crbug.com/591099 http/tests/navigation/anchor-frames-cross-origin.html [ Failure ]
 crbug.com/591099 http/tests/navigation/anchor-frames-gbk.html [ Failure ]
@@ -15236,20 +15244,20 @@
 crbug.com/591099 http/tests/navigation/anchor-goback.html [ Crash Failure ]
 crbug.com/591099 http/tests/navigation/back-to-slow-frame.html [ Failure ]
 crbug.com/591099 http/tests/navigation/cross-origin-fragment-navigation-is-async.html [ Failure ]
-crbug.com/591099 http/tests/navigation/fallback-anchor-reload.html [ Crash ]
+crbug.com/591099 http/tests/navigation/fallback-anchor-reload.html [ Crash Pass ]
 crbug.com/591099 http/tests/navigation/form-targets-cross-site-frame-get.html [ Crash Failure ]
 crbug.com/591099 http/tests/navigation/form-targets-cross-site-frame-no-referrer.html [ Crash Failure ]
 crbug.com/591099 http/tests/navigation/form-targets-cross-site-frame-post.html [ Crash Failure ]
 crbug.com/591099 http/tests/navigation/form-with-enctype-targets-cross-site-frame.html [ Crash Failure ]
 crbug.com/591099 http/tests/navigation/forward-to-fragment-fires-onload.html [ Crash Failure ]
 crbug.com/591099 http/tests/navigation/history-back-across-form-submission-to-fragment.html [ Failure ]
-crbug.com/591099 http/tests/navigation/image-load-in-subframe-unload-handler.html [ Crash ]
+crbug.com/591099 http/tests/navigation/image-load-in-subframe-unload-handler.html [ Crash Pass ]
 crbug.com/591099 http/tests/navigation/javascriptlink-basic.html [ Crash Failure Timeout ]
 crbug.com/591099 http/tests/navigation/javascriptlink-goback.html [ Crash Failure Timeout ]
 crbug.com/591099 http/tests/navigation/lockedhistory-iframe.html [ Failure ]
 crbug.com/591099 http/tests/navigation/metaredirect-basic.html [ Crash Failure ]
 crbug.com/591099 http/tests/navigation/metaredirect-goback.html [ Crash Failure ]
-crbug.com/591099 http/tests/navigation/navigate-during-commit.html [ Crash ]
+crbug.com/591099 http/tests/navigation/navigate-during-commit.html [ Crash Pass ]
 crbug.com/591099 http/tests/navigation/navigation-with-detached-origin-document.html [ Crash Pass ]
 crbug.com/591099 http/tests/navigation/no-referrer-reset.html [ Failure Timeout ]
 crbug.com/591099 http/tests/navigation/onload-navigation-iframe-2.html [ Failure ]
@@ -15282,7 +15290,7 @@
 crbug.com/591099 http/tests/navigation/success200-goback.html [ Crash Failure ]
 crbug.com/591099 http/tests/navigation/success200-loadsame.html [ Crash Failure ]
 crbug.com/591099 http/tests/navigation/success200-reload.html [ Crash Failure ]
-crbug.com/591099 http/tests/navigation/targeted-navigation-in-unload-handler.html [ Crash ]
+crbug.com/591099 http/tests/navigation/targeted-navigation-in-unload-handler.html [ Crash Pass ]
 crbug.com/591099 http/tests/navigation/timerredirect-basic.html [ Crash Failure ]
 crbug.com/591099 http/tests/navigation/timerredirect-goback.html [ Crash Failure ]
 crbug.com/591099 http/tests/navigation/useragent.php [ Failure ]
@@ -15290,7 +15298,7 @@
 crbug.com/591099 http/tests/navigatorcontentutils/register-protocol-handler.html [ Failure ]
 crbug.com/591099 http/tests/navigatorcontentutils/unregister-protocol-handler.html [ Failure ]
 crbug.com/591099 http/tests/notifications/notification-sandbox-permission.html [ Failure ]
-crbug.com/591099 http/tests/performance-timing/paint-timing/first-contentful-canvas.html [ Crash ]
+crbug.com/591099 http/tests/performance-timing/paint-timing/first-contentful-canvas.html [ Crash Pass ]
 crbug.com/591099 http/tests/permissionclient/image-permissions.html [ Failure ]
 crbug.com/591099 http/tests/plugins/navigator-plugins-in-cross-origin-frame.html [ Failure Pass ]
 crbug.com/591099 http/tests/pointer-lock/iframe-sandboxed-allow-pointer-lock.html [ Failure ]
@@ -15301,14 +15309,14 @@
 crbug.com/591099 http/tests/pointer-lock/pointerlockelement-same-origin.html [ Failure ]
 crbug.com/591099 http/tests/pointer-lock/requestPointerLock-can-not-transfer-between-documents.html [ Failure ]
 crbug.com/591099 http/tests/preload/dynamic_remove_preload_href.html [ Failure Pass ]
-crbug.com/591099 http/tests/preload/multiple-meta-csp.html [ Crash ]
-crbug.com/591099 http/tests/preload/preload-video-cors.html [ Crash ]
+crbug.com/591099 http/tests/preload/multiple-meta-csp.html [ Crash Pass ]
+crbug.com/591099 http/tests/preload/preload-video-cors.html [ Crash Pass ]
 crbug.com/591099 http/tests/previews/client-lofi-sprite.html [ Failure ]
 crbug.com/591099 http/tests/security/MessagePort/event-listener-context.html [ Failure ]
 crbug.com/591099 http/tests/security/XFrameOptions/x-frame-options-cached.html [ Failure ]
-crbug.com/591099 http/tests/security/XFrameOptions/x-frame-options-deny-delete-frame-in-load-event.html [ Crash ]
-crbug.com/591099 http/tests/security/aboutBlank/security-context-alias.html [ Crash ]
-crbug.com/591099 http/tests/security/aboutBlank/security-context-grandchildren-alias.html [ Crash ]
+crbug.com/591099 http/tests/security/XFrameOptions/x-frame-options-deny-delete-frame-in-load-event.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/aboutBlank/security-context-alias.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/aboutBlank/security-context-grandchildren-alias.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/anchor-download-allow-blob.html [ Failure ]
 crbug.com/591099 http/tests/security/anchor-download-allow-data.html [ Failure ]
 crbug.com/591099 http/tests/security/anchor-download-allow-sameorigin.html [ Failure ]
@@ -15316,13 +15324,13 @@
 crbug.com/591099 http/tests/security/cannot-read-cssrules-redirect.html [ Failure ]
 crbug.com/591099 http/tests/security/cannot-read-cssrules.html [ Failure ]
 crbug.com/591099 http/tests/security/canvas-remote-read-redirect-to-remote-image.html [ Failure ]
-crbug.com/591099 http/tests/security/canvas-remote-read-remote-svg-image.html [ Crash ]
+crbug.com/591099 http/tests/security/canvas-remote-read-remote-svg-image.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/clipboard/clipboard-file-access.html [ Failure Timeout ]
 crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-blocked-when-target-blank.html [ Crash Failure ]
 crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-blocked-when-target-cross-site-window.html [ Crash Failure ]
 crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-leak-path-on-redirect.html [ Crash Failure ]
-crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-resubmission-iframe-reload-from-child.html [ Crash ]
-crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-resubmission-iframe-reload-from-parent.html [ Crash ]
+crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-resubmission-iframe-reload-from-child.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-resubmission-iframe-reload-from-parent.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-src-allowed-with-redirect.html [ Crash Failure ]
 crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-src-allowed.html [ Crash Failure ]
 crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-src-blocked.html [ Crash Failure ]
@@ -15333,7 +15341,7 @@
 crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-src-get-blocked-with-redirect.html [ Crash Failure ]
 crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-src-get-blocked.html [ Crash Failure ]
 crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-src-javascript-blocked.html [ Crash Failure ]
-crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-src-redirect-blocked-in-new-window.html [ Crash ]
+crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-src-redirect-blocked-in-new-window.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/form-action-src-redirect-blocked.html [ Crash Failure ]
 crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/plugintypes-affects-child.html [ Failure ]
 crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/plugintypes-affects-cross-site-child-allowed.html [ Failure ]
@@ -15346,13 +15354,13 @@
 crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/plugintypes-nourl-allowed.html [ Failure Pass ]
 crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/plugintypes-url-01.html [ Failure ]
 crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/plugintypes-url-02.html [ Failure ]
-crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/scripthash-handler-allowed.html [ Crash ]
-crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/scripthash-handler-blocked.html [ Crash ]
+crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/scripthash-handler-allowed.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/contentSecurityPolicy/1.1/scripthash-handler-blocked.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/contentSecurityPolicy/cached-frame-csp.html [ Crash Failure ]
-crbug.com/591099 http/tests/security/contentSecurityPolicy/cascade/cross-origin-with-own-policy.html [ Crash ]
-crbug.com/591099 http/tests/security/contentSecurityPolicy/cascade/cross-origin.html [ Crash ]
-crbug.com/591099 http/tests/security/contentSecurityPolicy/cascade/same-origin-with-own-policy.html [ Crash ]
-crbug.com/591099 http/tests/security/contentSecurityPolicy/cascade/same-origin.html [ Crash ]
+crbug.com/591099 http/tests/security/contentSecurityPolicy/cascade/cross-origin-with-own-policy.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/contentSecurityPolicy/cascade/cross-origin.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/contentSecurityPolicy/cascade/same-origin-with-own-policy.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/contentSecurityPolicy/cascade/same-origin.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/contentSecurityPolicy/directive-parsing-01.html [ Failure ]
 crbug.com/591099 http/tests/security/contentSecurityPolicy/directive-parsing-02.html [ Failure ]
 crbug.com/591099 http/tests/security/contentSecurityPolicy/directive-parsing-03.html [ Failure ]
@@ -15374,11 +15382,11 @@
 crbug.com/591099 http/tests/security/contentSecurityPolicy/object-src-param-url-blocked.html [ Failure ]
 crbug.com/591099 http/tests/security/contentSecurityPolicy/object-src-url-allowed.html [ Failure Pass ]
 crbug.com/591099 http/tests/security/contentSecurityPolicy/plugin-in-iframe-with-csp.html [ Failure ]
-crbug.com/591099 http/tests/security/contentSecurityPolicy/redirect-does-not-match-paths.html [ Crash ]
-crbug.com/591099 http/tests/security/contentSecurityPolicy/redirect-with-delay.html [ Crash ]
+crbug.com/591099 http/tests/security/contentSecurityPolicy/redirect-does-not-match-paths.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/contentSecurityPolicy/redirect-with-delay.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/contentSecurityPolicy/register-bypassing-scheme-partial.html [ Crash Failure ]
 crbug.com/591099 http/tests/security/contentSecurityPolicy/report-multiple-violations-01.php [ Crash Failure ]
-crbug.com/591099 http/tests/security/contentSecurityPolicy/require-sri-for/require-sri-for-svg-script-blocked.php [ Crash ]
+crbug.com/591099 http/tests/security/contentSecurityPolicy/require-sri-for/require-sri-for-svg-script-blocked.php [ Crash Pass ]
 crbug.com/591099 http/tests/security/contentSecurityPolicy/script-src-in-iframe.html [ Failure ]
 crbug.com/591099 http/tests/security/contentSecurityPolicy/script-src-none-inline-event.html [ Failure ]
 crbug.com/591099 http/tests/security/contentSecurityPolicy/script-src-none.html [ Failure ]
@@ -15405,16 +15413,16 @@
 crbug.com/591099 http/tests/security/contentTypeOptions/nosniff-script-allowed.html [ Failure ]
 crbug.com/591099 http/tests/security/contentTypeOptions/nosniff-script-blocked.html [ Failure ]
 crbug.com/591099 http/tests/security/contentTypeOptions/nosniff-script-without-content-type-blocked.html [ Failure ]
-crbug.com/591099 http/tests/security/cookies/third-party-cookie-blocking-worker.html [ Crash ]
-crbug.com/591099 http/tests/security/cookies/websocket/third-party-cookie-blocked-on-cross-origin-websocket.html [ Crash ]
-crbug.com/591099 http/tests/security/cookies/websocket/third-party-cookie-blocked-on-same-origin-websocket.html [ Crash ]
-crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-document-appcache.html [ Crash ]
-crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-document-basic.html [ Crash ]
-crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-document-csp-appcache.html [ Crash ]
-crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-document-csp.html [ Crash ]
-crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-serviceworker-basic.html [ Crash ]
-crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-sharedworker-basic.html [ Crash ]
-crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-worker-basic.html [ Crash ]
+crbug.com/591099 http/tests/security/cookies/third-party-cookie-blocking-worker.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/cookies/websocket/third-party-cookie-blocked-on-cross-origin-websocket.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/cookies/websocket/third-party-cookie-blocked-on-same-origin-websocket.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-document-appcache.html [ Crash Failure ]
+crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-document-basic.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-document-csp-appcache.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-document-csp.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-serviceworker-basic.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-sharedworker-basic.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-worker-basic.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/cross-frame-access-call.html [ Crash Failure ]
 crbug.com/591099 http/tests/security/cross-frame-access-callback-explicit-domain-ALLOW.html [ Failure ]
 crbug.com/591099 http/tests/security/cross-frame-access-callback-explicit-domain-DENY.html [ Failure ]
@@ -15431,12 +15439,12 @@
 crbug.com/591099 http/tests/security/cross-frame-access-protocol-explicit-domain.html [ Failure ]
 crbug.com/591099 http/tests/security/cross-frame-access-put.html [ Failure Timeout ]
 crbug.com/591099 http/tests/security/cross-frame-access-set-window-properties.html [ Failure ]
-crbug.com/591099 http/tests/security/cross-frame-mouse-source-capabilities.html [ Crash Timeout ]
+crbug.com/591099 http/tests/security/cross-frame-mouse-source-capabilities.html [ Crash Pass Timeout ]
 crbug.com/591099 http/tests/security/cross-origin-OffscreenCanvas2D-createPattern.html [ Failure ]
 crbug.com/591099 http/tests/security/cross-origin-OffscreenCanvas2D-transferToImageBitmap.html [ Failure ]
-crbug.com/591099 http/tests/security/cross-origin-OffscreenCanvasWebGL-texImage2D.html [ Crash ]
+crbug.com/591099 http/tests/security/cross-origin-OffscreenCanvasWebGL-texImage2D.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/cross-origin-access-over-property-descriptor.html [ Failure ]
-crbug.com/591099 http/tests/security/cross-origin-appcache-allowed.html [ Crash ]
+crbug.com/591099 http/tests/security/cross-origin-appcache-allowed.html [ Crash Failure ]
 crbug.com/591099 http/tests/security/cross-origin-createImageBitmap.html [ Failure ]
 crbug.com/591099 http/tests/security/cross-origin-getMatchedCSSRules.html [ Failure ]
 crbug.com/591099 http/tests/security/cross-origin-indexeddb-allowed.html [ Failure ]
@@ -15449,8 +15457,8 @@
 crbug.com/591099 http/tests/security/cross-origin-window-event-exception.html [ Failure ]
 crbug.com/591099 http/tests/security/cross-origin-window-open-exception.html [ Failure ]
 crbug.com/591099 http/tests/security/cross-origin-worker-indexeddb-allowed.html [ Failure ]
-crbug.com/591099 http/tests/security/dangling-markup/option.html [ Crash ]
-crbug.com/591099 http/tests/security/dangling-markup/textarea.html [ Crash ]
+crbug.com/591099 http/tests/security/dangling-markup/option.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/dangling-markup/textarea.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/data-url-inline.css.html [ Failure ]
 crbug.com/591099 http/tests/security/dataTransfer-set-data-file-url.html [ Timeout ]
 crbug.com/591099 http/tests/security/dataURL/xss-DENIED-from-data-url-in-foreign-domain-subframe.html [ Failure ]
@@ -15465,9 +15473,9 @@
 crbug.com/591099 http/tests/security/dataURL/xss-DENIED-to-data-url-sub-frame-2-level.html [ Failure ]
 crbug.com/591099 http/tests/security/dataURL/xss-DENIED-to-data-url-sub-frame-uppercase.html [ Failure ]
 crbug.com/591099 http/tests/security/dataURL/xss-DENIED-to-data-url-sub-frame.html [ Failure ]
-crbug.com/591099 http/tests/security/deprecated-subresource-requests.html [ Crash ]
-crbug.com/591099 http/tests/security/detached-sandboxed-frame-access.html [ Crash ]
-crbug.com/591099 http/tests/security/document-origin.html [ Crash ]
+crbug.com/591099 http/tests/security/deprecated-subresource-requests.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/detached-sandboxed-frame-access.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/document-origin.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/drag-drop-same-unique-origin.html [ Failure ]
 crbug.com/591099 http/tests/security/drag-over-remote-content-iframe.html [ Failure ]
 crbug.com/591099 http/tests/security/escape-form-data-field-names.html [ Crash Failure ]
@@ -15482,15 +15490,15 @@
 crbug.com/591099 http/tests/security/frameNavigation/xss-DENIED-top-navigation-user-gesture-in-parent.html [ Failure ]
 crbug.com/591099 http/tests/security/frameNavigation/xss-DENIED-top-navigation-without-user-gesture.html [ Failure ]
 crbug.com/591099 http/tests/security/host-compare-case-insensitive.html [ Failure ]
-crbug.com/591099 http/tests/security/img-crossorigin-cookies.html [ Crash ]
+crbug.com/591099 http/tests/security/img-crossorigin-cookies.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/img-crossorigin-no-credentials-prompt.html [ Crash Failure ]
 crbug.com/591099 http/tests/security/img-crossorigin-redirect-anonymous.html [ Crash Failure ]
-crbug.com/591099 http/tests/security/img-crossorigin-redirect-credentials.html [ Crash ]
+crbug.com/591099 http/tests/security/img-crossorigin-redirect-credentials.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/img-crossorigin-redirect-no-cors.html [ Crash Failure ]
-crbug.com/591099 http/tests/security/img-redirect-to-crossorigin-credentials.html [ Crash ]
+crbug.com/591099 http/tests/security/img-redirect-to-crossorigin-credentials.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/img-with-failed-cors-check-fails-to-load.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/isolatedWorld/bypass-main-world-csp-for-inline-script.html [ Failure ]
-crbug.com/591099 http/tests/security/isolatedWorld/bypass-main-world-csp.html [ Crash ]
+crbug.com/591099 http/tests/security/isolatedWorld/bypass-main-world-csp.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/isolatedWorld/cross-origin-xhr.html [ Failure ]
 crbug.com/591099 http/tests/security/isolatedWorld/no-bypass-main-world-csp-for-delayed-execution.html [ Failure ]
 crbug.com/591099 http/tests/security/isolatedWorld/sandboxed-iframe.html [ Failure ]
@@ -15512,7 +15520,7 @@
 crbug.com/591099 http/tests/security/javascriptURL/xss-DENIED-from-javascript-url-in-foreign-domain-subframe.html [ Failure ]
 crbug.com/591099 http/tests/security/javascriptURL/xss-DENIED-from-javascript-url-in-foreign-domain-window-open.html [ Failure ]
 crbug.com/591099 http/tests/security/javascriptURL/xss-DENIED-to-javascript-url-in-foreign-domain-subframe.html [ Failure ]
-crbug.com/591099 http/tests/security/lenient-this-issue569043.html [ Crash ]
+crbug.com/591099 http/tests/security/lenient-this-issue569043.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/link-crossorigin-stylesheet-anonymous.html [ Failure ]
 crbug.com/591099 http/tests/security/link-crossorigin-stylesheet-import-anonymous.html [ Failure ]
 crbug.com/591099 http/tests/security/link-crossorigin-stylesheet-import-credentials.html [ Failure ]
@@ -15554,16 +15562,16 @@
 crbug.com/591099 http/tests/security/mime-type-execute-as-html-15.html [ Failure ]
 crbug.com/591099 http/tests/security/mime-type-execute-as-html-16.html [ Failure ]
 crbug.com/591099 http/tests/security/mixedContent/active-subresource-in-iframe-blocked.https.html [ Failure ]
-crbug.com/591099 http/tests/security/mixedContent/blob-url-script-in-data-iframe.https.html [ Crash ]
-crbug.com/591099 http/tests/security/mixedContent/blob-url-script-in-sandboxed-iframe.https.html [ Crash ]
-crbug.com/591099 http/tests/security/mixedContent/blocked-blob-url-script-in-data-iframe.https.html [ Crash ]
-crbug.com/591099 http/tests/security/mixedContent/data-url-script-in-data-iframe.https.html [ Crash ]
+crbug.com/591099 http/tests/security/mixedContent/blob-url-script-in-data-iframe.https.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/mixedContent/blob-url-script-in-sandboxed-iframe.https.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/mixedContent/blocked-blob-url-script-in-data-iframe.https.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/mixedContent/data-url-script-in-data-iframe.https.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/mixedContent/data-url-script-in-iframe.html [ Failure ]
 crbug.com/591099 http/tests/security/mixedContent/empty-url-plugin-in-frame.html [ Failure ]
 crbug.com/591099 http/tests/security/mixedContent/insecure-css-in-iframe.html [ Failure ]
 crbug.com/591099 http/tests/security/mixedContent/insecure-iframe-in-iframe.html [ Failure ]
 crbug.com/591099 http/tests/security/mixedContent/insecure-image-in-iframe.html [ Failure ]
-crbug.com/591099 http/tests/security/mixedContent/insecure-picture-in-main-frame-blocked.https.html [ Crash ]
+crbug.com/591099 http/tests/security/mixedContent/insecure-picture-in-main-frame-blocked.https.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/mixedContent/insecure-plugin-in-iframe.html [ Failure ]
 crbug.com/591099 http/tests/security/mixedContent/insecure-script-in-iframe.html [ Failure ]
 crbug.com/591099 http/tests/security/mixedContent/nonwebby-scheme-in-iframe-allowed.https.html [ Failure ]
@@ -15577,14 +15585,14 @@
 crbug.com/591099 http/tests/security/popup-allowed-by-sandbox-is-sandboxed-control.html [ Failure ]
 crbug.com/591099 http/tests/security/popup-allowed-by-sandbox-is-sandboxed.html [ Failure ]
 crbug.com/591099 http/tests/security/popup-allowed-by-sandbox-when-allowed.html [ Failure ]
-crbug.com/591099 http/tests/security/postMessage/origin-unaffected-by-document-domain.html [ Crash ]
-crbug.com/591099 http/tests/security/powerfulFeatureRestrictions/geolocation-on-sandboxed-insecure-origin.html [ Crash ]
-crbug.com/591099 http/tests/security/powerfulFeatureRestrictions/geolocation-on-secure-origin-in-insecure-origin.html [ Crash ]
-crbug.com/591099 http/tests/security/powerfulFeatureRestrictions/geolocation-on-secure-origin-in-secure-origin.html [ Crash ]
+crbug.com/591099 http/tests/security/postMessage/origin-unaffected-by-document-domain.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/powerfulFeatureRestrictions/geolocation-on-sandboxed-insecure-origin.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/powerfulFeatureRestrictions/geolocation-on-secure-origin-in-insecure-origin.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/powerfulFeatureRestrictions/geolocation-on-secure-origin-in-secure-origin.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/preload-script-crossorigin-fails-cross-origin.html [ Failure ]
-crbug.com/591099 http/tests/security/promise-realm.html [ Crash ]
+crbug.com/591099 http/tests/security/promise-realm.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/protocol-compare-case-insensitive.html [ Failure ]
-crbug.com/591099 http/tests/security/referrer-on-client-reload.html [ Crash ]
+crbug.com/591099 http/tests/security/referrer-on-client-reload.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/referrer-policy-always.html [ Failure ]
 crbug.com/591099 http/tests/security/referrer-policy-default.html [ Failure ]
 crbug.com/591099 http/tests/security/referrer-policy-https-always.html [ Failure ]
@@ -15605,32 +15613,32 @@
 crbug.com/591099 http/tests/security/referrer-policy-redirect-link.html [ Timeout ]
 crbug.com/591099 http/tests/security/referrer-policy-redirect.html [ Failure ]
 crbug.com/591099 http/tests/security/referrer-policy-rel-noreferrer.html [ Timeout ]
-crbug.com/591099 http/tests/security/referrer-policy-srcdoc-dynamic-policy.html [ Crash ]
-crbug.com/591099 http/tests/security/referrer-policy-srcdoc.html [ Crash ]
+crbug.com/591099 http/tests/security/referrer-policy-srcdoc-dynamic-policy.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/referrer-policy-srcdoc.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/referrer-policy-window-open.html [ Failure ]
-crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-cross-origin-with-origin-when-cross-origin.php [ Crash ]
-crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-cross-origin-with-origin.php [ Crash ]
-crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-downgrade-with-no-referrer-when-downgrade.https.php [ Crash ]
-crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-no-downgrade-with-no-referrer-when-downgrade.https.php [ Crash ]
-crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-no-referrer.php [ Crash ]
-crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-same-origin-with-origin-when-cross-origin.php [ Crash ]
-crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-same-origin-with-origin.php [ Crash ]
-crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-unsafe-url.https.php [ Crash ]
-crbug.com/591099 http/tests/security/referrerPolicyHeader/legacy-always.php [ Crash ]
-crbug.com/591099 http/tests/security/referrerPolicyHeader/legacy-default.php [ Crash ]
-crbug.com/591099 http/tests/security/referrerPolicyHeader/legacy-never.php [ Crash ]
-crbug.com/591099 http/tests/security/referrerPolicyHeader/legacy-origin-when-crossorigin.php [ Crash ]
-crbug.com/591099 http/tests/security/referrerPolicyHeader/referrer-policy-header-then-meta.php [ Crash ]
-crbug.com/591099 http/tests/security/referrerPolicyHeader/referrer-policy-redirect.php [ Crash ]
-crbug.com/591099 http/tests/security/sandbox-iframe-blocks-top-navigation-to-javascript.html [ Crash ]
-crbug.com/591099 http/tests/security/sandbox-iframe-blocks-top-navigation.html [ Crash ]
+crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-cross-origin-with-origin-when-cross-origin.php [ Crash Pass ]
+crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-cross-origin-with-origin.php [ Crash Pass ]
+crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-downgrade-with-no-referrer-when-downgrade.https.php [ Crash Pass ]
+crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-no-downgrade-with-no-referrer-when-downgrade.https.php [ Crash Pass ]
+crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-no-referrer.php [ Crash Pass ]
+crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-same-origin-with-origin-when-cross-origin.php [ Crash Pass ]
+crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-same-origin-with-origin.php [ Crash Pass ]
+crbug.com/591099 http/tests/security/referrerPolicyHeader/basic-header-unsafe-url.https.php [ Crash Pass ]
+crbug.com/591099 http/tests/security/referrerPolicyHeader/legacy-always.php [ Crash Pass ]
+crbug.com/591099 http/tests/security/referrerPolicyHeader/legacy-default.php [ Crash Pass ]
+crbug.com/591099 http/tests/security/referrerPolicyHeader/legacy-never.php [ Crash Pass ]
+crbug.com/591099 http/tests/security/referrerPolicyHeader/legacy-origin-when-crossorigin.php [ Crash Pass ]
+crbug.com/591099 http/tests/security/referrerPolicyHeader/referrer-policy-header-then-meta.php [ Crash Pass ]
+crbug.com/591099 http/tests/security/referrerPolicyHeader/referrer-policy-redirect.php [ Crash Pass ]
+crbug.com/591099 http/tests/security/sandbox-iframe-blocks-top-navigation-to-javascript.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/sandbox-iframe-blocks-top-navigation.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/sandbox-inherit-to-initial-document-2.html [ Failure ]
 crbug.com/591099 http/tests/security/sandbox-inherit-to-initial-document.html [ Failure ]
 crbug.com/591099 http/tests/security/sandboxed-iframe-blocks-access-from-parent.html [ Failure ]
 crbug.com/591099 http/tests/security/sandboxed-iframe-document-cookie.html [ Failure ]
 crbug.com/591099 http/tests/security/sandboxed-iframe-form-top.html [ Failure ]
 crbug.com/591099 http/tests/security/sandboxed-iframe-invalid.html [ Failure ]
-crbug.com/591099 http/tests/security/sandboxed-iframe-javascript-url.html [ Crash ]
+crbug.com/591099 http/tests/security/sandboxed-iframe-javascript-url.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/sandboxed-iframe-meta-refresh.html [ Failure ]
 crbug.com/591099 http/tests/security/sandboxed-iframe-modify-self.html [ Crash Failure ]
 crbug.com/591099 http/tests/security/sandboxed-iframe-origin-add.html [ Failure ]
@@ -15656,51 +15664,51 @@
 crbug.com/591099 http/tests/security/script-onerror-no-crossorigin-cors.html [ Failure ]
 crbug.com/591099 http/tests/security/script-onerror-no-crossorigin-no-cors.html [ Failure ]
 crbug.com/591099 http/tests/security/script-with-failed-cors-check-fails-to-load.html [ Failure ]
-crbug.com/591099 http/tests/security/secureContexts/authenticated.html [ Crash ]
-crbug.com/591099 http/tests/security/secureContexts/authenticated_sandbox.html [ Crash ]
-crbug.com/591099 http/tests/security/secureContexts/authenticated_srcdoc.html [ Crash ]
-crbug.com/591099 http/tests/security/secureContexts/unauthenticated.html [ Crash ]
-crbug.com/591099 http/tests/security/secureContexts/unauthenticated_sandbox.html [ Crash ]
-crbug.com/591099 http/tests/security/secureContexts/unauthenticated_srcdoc.html [ Crash ]
+crbug.com/591099 http/tests/security/secureContexts/authenticated.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/secureContexts/authenticated_sandbox.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/secureContexts/authenticated_srcdoc.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/secureContexts/unauthenticated.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/secureContexts/unauthenticated_sandbox.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/secureContexts/unauthenticated_srcdoc.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/shape-image-cors-allow-origin.html [ Failure ]
 crbug.com/591099 http/tests/security/shape-image-cors-data-url.html [ Failure ]
 crbug.com/591099 http/tests/security/shape-image-cors-same-origin.html [ Failure ]
-crbug.com/591099 http/tests/security/suborigins/crossorigin/suborigin-cross-origin-window-event-exception.php [ Crash ]
-crbug.com/591099 http/tests/security/suborigins/crossorigin/suborigin-cross-origin-window-open-exception.php [ Crash ]
-crbug.com/591099 http/tests/security/suborigins/suborigin-allow-same-suborigin-access.html [ Crash ]
-crbug.com/591099 http/tests/security/suborigins/suborigin-blocked-different-suborigins.html [ Crash ]
-crbug.com/591099 http/tests/security/suborigins/suborigin-blocked-not-in-suborigin-to-suborigin.php [ Crash ]
-crbug.com/591099 http/tests/security/suborigins/suborigin-change-document-domain.html [ Crash ]
-crbug.com/591099 http/tests/security/suborigins/suborigin-cookies.php [ Crash ]
-crbug.com/591099 http/tests/security/suborigins/suborigin-in-meta-disallowed.html [ Crash ]
-crbug.com/591099 http/tests/security/suborigins/suborigin-invalid-names.html [ Crash ]
-crbug.com/591099 http/tests/security/suborigins/suborigin-invalid-options.html [ Crash ]
-crbug.com/591099 http/tests/security/suborigins/suborigin-meta-set-cookie-disabled.php [ Crash ]
-crbug.com/591099 http/tests/security/suborigins/suborigin-multiple-suborigins-disallowed.php [ Crash ]
-crbug.com/591099 http/tests/security/suborigins/suborigin-postmessage.html [ Crash ]
-crbug.com/591099 http/tests/security/suborigins/suborigin-service-worker-fetch-event.html [ Crash ]
-crbug.com/591099 http/tests/security/suborigins/suborigin-service-worker-no-xorigin-caching.html [ Crash ]
-crbug.com/591099 http/tests/security/suborigins/suborigin-storage-dom-access.php [ Crash ]
-crbug.com/591099 http/tests/security/suborigins/suborigin-unsafe-cookies.php [ Crash ]
-crbug.com/591099 http/tests/security/suborigins/suborigin-unsafe-postmessage-receive.php [ Crash ]
-crbug.com/591099 http/tests/security/suborigins/suborigin-unsafe-postmessage-send.html [ Crash ]
-crbug.com/591099 http/tests/security/suborigins/suborigin-valid-names.html [ Crash ]
-crbug.com/591099 http/tests/security/suborigins/suborigin-valid-options.html [ Crash ]
+crbug.com/591099 http/tests/security/suborigins/crossorigin/suborigin-cross-origin-window-event-exception.php [ Crash Pass ]
+crbug.com/591099 http/tests/security/suborigins/crossorigin/suborigin-cross-origin-window-open-exception.php [ Crash Pass ]
+crbug.com/591099 http/tests/security/suborigins/suborigin-allow-same-suborigin-access.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/suborigins/suborigin-blocked-different-suborigins.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/suborigins/suborigin-blocked-not-in-suborigin-to-suborigin.php [ Crash Pass ]
+crbug.com/591099 http/tests/security/suborigins/suborigin-change-document-domain.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/suborigins/suborigin-cookies.php [ Crash Pass ]
+crbug.com/591099 http/tests/security/suborigins/suborigin-in-meta-disallowed.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/suborigins/suborigin-invalid-names.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/suborigins/suborigin-invalid-options.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/suborigins/suborigin-meta-set-cookie-disabled.php [ Crash Pass ]
+crbug.com/591099 http/tests/security/suborigins/suborigin-multiple-suborigins-disallowed.php [ Crash Pass ]
+crbug.com/591099 http/tests/security/suborigins/suborigin-postmessage.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/suborigins/suborigin-service-worker-fetch-event.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/suborigins/suborigin-service-worker-no-xorigin-caching.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/suborigins/suborigin-storage-dom-access.php [ Crash Pass ]
+crbug.com/591099 http/tests/security/suborigins/suborigin-unsafe-cookies.php [ Crash Pass ]
+crbug.com/591099 http/tests/security/suborigins/suborigin-unsafe-postmessage-receive.php [ Crash Pass ]
+crbug.com/591099 http/tests/security/suborigins/suborigin-unsafe-postmessage-send.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/suborigins/suborigin-valid-names.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/suborigins/suborigin-valid-options.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/subresourceIntegrity/integrity-attribute.html [ Failure ]
-crbug.com/591099 http/tests/security/subresourceIntegrity/subresource-integrity-not-enforced.html [ Crash ]
+crbug.com/591099 http/tests/security/subresourceIntegrity/subresource-integrity-not-enforced.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/subresourceIntegrity/subresource-integrity-style-allowed.html [ Failure ]
 crbug.com/591099 http/tests/security/subresourceIntegrity/subresource-integrity-style-blocked.html [ Failure ]
-crbug.com/591099 http/tests/security/svg-image-with-cached-remote-image.html [ Crash ]
+crbug.com/591099 http/tests/security/svg-image-with-cached-remote-image.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/synchronous-frame-load-in-javascript-url-inherits-correct-origin.html [ Failure ]
 crbug.com/591099 http/tests/security/text-track-crossorigin.html [ Failure ]
-crbug.com/591099 http/tests/security/upgrade-insecure-requests/form-upgrade.html [ Crash ]
-crbug.com/591099 http/tests/security/upgrade-insecure-requests/https-header-nested.html [ Crash ]
-crbug.com/591099 http/tests/security/upgrade-insecure-requests/iframe-upgrade.https.html [ Crash ]
+crbug.com/591099 http/tests/security/upgrade-insecure-requests/form-upgrade.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/upgrade-insecure-requests/https-header-nested.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/upgrade-insecure-requests/iframe-upgrade.https.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/vibration/vibrate-in-cross-origin-iframe-with-user-gesture-allowed.html [ Failure ]
 crbug.com/591099 http/tests/security/vibration/vibrate-in-same-origin-iframe-with-user-gesture-allowed.html [ Failure ]
-crbug.com/591099 http/tests/security/vibration/vibrate-on-top-page-before-during-after-user-gesture.html [ Crash ]
-crbug.com/591099 http/tests/security/video-cross-origin-readback.html [ Crash ]
-crbug.com/591099 http/tests/security/video-cross-origin-via-dom.html [ Crash ]
+crbug.com/591099 http/tests/security/vibration/vibrate-on-top-page-before-during-after-user-gesture.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/video-cross-origin-readback.html [ Crash Pass ]
+crbug.com/591099 http/tests/security/video-cross-origin-via-dom.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/video-poster-cross-origin-crash2.html [ Crash Failure ]
 crbug.com/591099 http/tests/security/webgl-cross-origin-ImageBitmap-blocked.html [ Failure ]
 crbug.com/591099 http/tests/security/window-onerror-exception-in-iframe.html [ Failure ]
@@ -15773,34 +15781,34 @@
 crbug.com/591099 http/tests/sendbeacon/beacon-detached-no-crash.html [ Failure ]
 crbug.com/591099 http/tests/sendbeacon/beacon-same-origin.html [ Failure ]
 crbug.com/591099 http/tests/serviceworker/ServiceWorkerGlobalScope/registration-attribute.html [ Failure Pass ]
-crbug.com/591099 http/tests/serviceworker/chromium/frame-detached-by-navigation.html [ Crash ]
+crbug.com/591099 http/tests/serviceworker/chromium/frame-detached-by-navigation.html [ Crash Failure ]
 crbug.com/591099 http/tests/serviceworker/chromium/resolve-after-window-close.html [ Crash Failure ]
 crbug.com/591099 http/tests/serviceworker/chromium/service-worker-gc.html [ Failure ]
 crbug.com/591099 http/tests/serviceworker/chromium/window-close-during-registration.html [ Failure ]
 crbug.com/591099 http/tests/serviceworker/webexposed/global-interface-listing-service-worker.html [ Pass Timeout ]
 crbug.com/591099 http/tests/shapes/shape-outside-image-shape-margin.html [ Failure ]
 crbug.com/591099 http/tests/shapes/shape-outside-svg-image-shape-margin.html [ Failure ]
-crbug.com/591099 http/tests/subresource_filter/image-disallowed-after-redirect.html [ Crash ]
-crbug.com/591099 http/tests/subresource_filter/image-disallowed.html [ Crash ]
-crbug.com/591099 http/tests/subresource_filter/picture-disallowed.html [ Crash ]
-crbug.com/591099 http/tests/svg/svg-in-object-in-sandboxed-iframe.html [ Crash ]
-crbug.com/591099 http/tests/svg/use-contenttype-blocked.html [ Crash ]
-crbug.com/591099 http/tests/svg/use-no-contenttype-blocked.html [ Crash ]
+crbug.com/591099 http/tests/subresource_filter/image-disallowed-after-redirect.html [ Crash Pass ]
+crbug.com/591099 http/tests/subresource_filter/image-disallowed.html [ Crash Pass ]
+crbug.com/591099 http/tests/subresource_filter/picture-disallowed.html [ Crash Pass ]
+crbug.com/591099 http/tests/svg/svg-in-object-in-sandboxed-iframe.html [ Crash Pass ]
+crbug.com/591099 http/tests/svg/use-contenttype-blocked.html [ Crash Pass ]
+crbug.com/591099 http/tests/svg/use-no-contenttype-blocked.html [ Crash Pass ]
 crbug.com/591099 http/tests/text-autosizing/narrow-iframe.html [ Failure ]
 crbug.com/591099 http/tests/text-autosizing/wide-iframe.html [ Failure ]
 crbug.com/591099 http/tests/uri/css-href.php [ Failure ]
 crbug.com/591099 http/tests/uri/escaped-entity.html [ Failure ]
 crbug.com/591099 http/tests/uri/resolve-encoding-relative.html [ Failure ]
 crbug.com/591099 http/tests/uri/utf8-path.html [ Failure ]
-crbug.com/591099 http/tests/w3c/webperf/approved/navigation-timing/html/test_performance_attributes_exist_in_object.html [ Crash ]
+crbug.com/591099 http/tests/w3c/webperf/approved/navigation-timing/html/test_performance_attributes_exist_in_object.html [ Crash Pass ]
 crbug.com/591099 http/tests/w3c/webperf/submission/Google/resource-timing/html/test_resource_ignore_failures.html [ Crash Pass ]
-crbug.com/591099 http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect.html [ Crash ]
-crbug.com/591099 http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect_chain.html [ Crash ]
-crbug.com/591099 http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect_chain_allow_timing.html [ Crash ]
-crbug.com/591099 http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect_with_timing_allow_origin.html [ Crash ]
-crbug.com/591099 http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_resource_request.html [ Crash ]
-crbug.com/591099 http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_same_origin_redirect.html [ Crash ]
-crbug.com/591099 http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_timing_allow_cross_origin_resource_request.html [ Crash ]
+crbug.com/591099 http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect.html [ Crash Pass ]
+crbug.com/591099 http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect_chain.html [ Crash Pass ]
+crbug.com/591099 http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect_chain_allow_timing.html [ Crash Pass ]
+crbug.com/591099 http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect_with_timing_allow_origin.html [ Crash Pass ]
+crbug.com/591099 http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_resource_request.html [ Crash Pass ]
+crbug.com/591099 http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_same_origin_redirect.html [ Crash Pass ]
+crbug.com/591099 http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_timing_allow_cross_origin_resource_request.html [ Crash Pass ]
 crbug.com/591099 http/tests/webaudio/autoplay-crossorigin.html [ Timeout ]
 crbug.com/591099 http/tests/webfont/fallback-font-while-loading.html [ Failure ]
 crbug.com/591099 http/tests/webfont/popup-menu-load-webfont-after-open.html [ Failure ]
@@ -15835,7 +15843,7 @@
 crbug.com/591099 http/tests/websocket/connect-error-by-no-websocket-server-closeonerror.html [ Failure ]
 crbug.com/591099 http/tests/websocket/connect-error-by-no-websocket-server-noclose.html [ Failure ]
 crbug.com/591099 http/tests/websocket/connection-throttling.html [ Failure ]
-crbug.com/591099 http/tests/websocket/construct-in-detached-frame.html [ Crash ]
+crbug.com/591099 http/tests/websocket/construct-in-detached-frame.html [ Crash Failure ]
 crbug.com/591099 http/tests/websocket/cookie-http-to-ws.pl [ Failure ]
 crbug.com/591099 http/tests/websocket/cookie-ws-to-ws.html [ Failure ]
 crbug.com/591099 http/tests/websocket/cross-origin.html [ Failure ]
@@ -15956,7 +15964,7 @@
 crbug.com/591099 http/tests/workers/worker-invalid-url.html [ Failure ]
 crbug.com/591099 http/tests/workers/worker-redirect.html [ Failure ]
 crbug.com/591099 http/tests/workers/worker-workerScriptNotThere.html [ Failure ]
-crbug.com/591099 http/tests/worklet/chromium/import-on-detached-iframe.html [ Crash ]
+crbug.com/591099 http/tests/worklet/chromium/import-on-detached-iframe.html [ Crash Pass ]
 crbug.com/591099 http/tests/xmlhttprequest/XMLHttpRequestException.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/abort-should-destroy-responseText.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/access-control-allow-lists-starting-with-comma.html [ Failure ]
@@ -15976,7 +15984,7 @@
 crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-request-invalid-status-301.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-request-invalid-status-400.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-request-invalid-status-501.html [ Failure ]
-crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-request-must-not-contain-cookie.html [ Crash ]
+crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-request-must-not-contain-cookie.html [ Crash Pass ]
 crbug.com/591099 http/tests/xmlhttprequest/access-control-response-with-body-sync.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/access-control-response-with-body.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/access-control-response-with-expose-headers.html [ Failure ]
@@ -15998,9 +16006,9 @@
 crbug.com/591099 http/tests/xmlhttprequest/cross-origin-preflight-get-response-type-blob.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/cross-origin-preflight-get.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/cross-origin-unsupported-url.html [ Failure ]
-crbug.com/591099 http/tests/xmlhttprequest/destroy-context-in-onloadstart.html [ Crash ]
+crbug.com/591099 http/tests/xmlhttprequest/destroy-context-in-onloadstart.html [ Crash Pass ]
 crbug.com/591099 http/tests/xmlhttprequest/detaching-frame-2.html [ Failure ]
-crbug.com/591099 http/tests/xmlhttprequest/detaching-frame.html [ Crash ]
+crbug.com/591099 http/tests/xmlhttprequest/detaching-frame.html [ Crash Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/docLoaderFrame.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/duplicate-revalidation-reload.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/encode-request-url-2.html [ Crash Failure ]
@@ -16013,7 +16021,7 @@
 crbug.com/591099 http/tests/xmlhttprequest/failed-auth.html [ Crash Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/filename-encoding.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/frame-load-cancelled-abort.html [ Crash Failure ]
-crbug.com/591099 http/tests/xmlhttprequest/frame-unload-abort-crash.html [ Crash ]
+crbug.com/591099 http/tests/xmlhttprequest/frame-unload-abort-crash.html [ Crash Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/get-dangerous-headers.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/getAllResponseHeaders.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/getResponseHeader.html [ Failure ]
@@ -16025,7 +16033,7 @@
 crbug.com/591099 http/tests/xmlhttprequest/methods-async.html [ Crash Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/methods-lower-case.html [ Crash Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/methods.html [ Crash Failure ]
-crbug.com/591099 http/tests/xmlhttprequest/navigation-abort-detaches-frame.html [ Crash Timeout ]
+crbug.com/591099 http/tests/xmlhttprequest/navigation-abort-detaches-frame.html [ Crash Pass Timeout ]
 crbug.com/591099 http/tests/xmlhttprequest/newline-in-request-uri.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/null-auth.php [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/onabort-event.html [ Failure ]
@@ -16115,7 +16123,7 @@
 crbug.com/591099 http/tests/xmlhttprequest/request-encoding.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/request-encoding2.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/request-encoding3.html [ Failure ]
-crbug.com/591099 http/tests/xmlhttprequest/request-encoding4.html [ Crash ]
+crbug.com/591099 http/tests/xmlhttprequest/request-encoding4.html [ Crash Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/request-from-popup.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/response-array-buffer-abort-in-loading-state.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/response-blob-abort-in-loading-state.html [ Failure ]
@@ -16321,7 +16329,7 @@
 crbug.com/591099 images/cross-fade-svg-size-diff.html [ Failure Pass ]
 crbug.com/591099 images/cross-fade-svg-size.html [ Failure Pass ]
 crbug.com/591099 images/cross-fade-tiled.html [ Failure ]
-crbug.com/591099 images/destroyed-image-load-event.html [ Crash ]
+crbug.com/591099 images/destroyed-image-load-event.html [ Crash Failure ]
 crbug.com/591099 images/drag-svg-image.html [ Failure ]
 crbug.com/591099 images/embed-does-not-propagate-dimensions-to-object-ancestor.html [ Failure Pass ]
 crbug.com/591099 images/exif-orientation-css.html [ Crash Failure ]
@@ -16337,7 +16345,7 @@
 crbug.com/591099 images/icon-0colors.html [ Failure ]
 crbug.com/591099 images/icon-decoding.html [ Failure ]
 crbug.com/591099 images/image-change-src.html [ Crash Pass ]
-crbug.com/591099 images/image-change-without-resize-shouldnt-layout.html [ Crash ]
+crbug.com/591099 images/image-change-without-resize-shouldnt-layout.html [ Crash Pass ]
 crbug.com/591099 images/image-click-scale-restore-zoomed-image.html [ Failure ]
 crbug.com/591099 images/image-css3-content-data.html [ Failure ]
 crbug.com/591099 images/image-document-write-assert.html [ Failure ]
@@ -16352,7 +16360,7 @@
 crbug.com/591099 images/image-map-zoom-alt-content.html [ Crash Failure ]
 crbug.com/591099 images/image-map-zoom.html [ Failure ]
 crbug.com/591099 images/image-page-injected-script-crash.html [ Crash Failure ]
-crbug.com/591099 images/image-use-counters.html [ Crash ]
+crbug.com/591099 images/image-use-counters.html [ Crash Pass ]
 crbug.com/591099 images/image-zoom-to-25.html [ Failure ]
 crbug.com/591099 images/image-zoom-to-500.html [ Failure ]
 crbug.com/591099 images/imagemap-circle-focus-ring.html [ Failure ]
@@ -16368,17 +16376,17 @@
 crbug.com/591099 images/imagemap-overflowing-circle-focus-ring.html [ Failure ]
 crbug.com/591099 images/imagemap-overflowing-polygon-focus-ring.html [ Failure ]
 crbug.com/591099 images/imagemap-polygon-focus-ring.html [ Failure ]
-crbug.com/591099 images/imagemap-scroll.html [ Crash ]
-crbug.com/591099 images/img-dimensions-styled.html [ Crash ]
-crbug.com/591099 images/invalid-image-url-crash.html [ Crash ]
+crbug.com/591099 images/imagemap-scroll.html [ Crash Failure ]
+crbug.com/591099 images/img-dimensions-styled.html [ Crash Pass ]
+crbug.com/591099 images/invalid-image-url-crash.html [ Crash Pass ]
 crbug.com/591099 images/jpeg-yuv-image-decoding.html [ Failure Pass ]
 crbug.com/591099 images/jpeg-yuv-progressive-canvas.html [ Failure Pass ]
 crbug.com/591099 images/jpeg-yuv-progressive-image.html [ Failure Pass ]
 crbug.com/591099 images/link-body-content-imageDimensionChanged-crash.html [ Failure ]
 crbug.com/591099 images/load-img-with-empty-src.html [ Failure ]
 crbug.com/591099 images/motion-jpeg-single-frame.html [ Failure ]
-crbug.com/591099 images/move-image-to-new-document.html [ Crash ]
-crbug.com/591099 images/multiple-inflight-error-event-crash.html [ Crash ]
+crbug.com/591099 images/move-image-to-new-document.html [ Crash Pass ]
+crbug.com/591099 images/multiple-inflight-error-event-crash.html [ Crash Pass ]
 crbug.com/591099 images/pdf-as-background.html [ Failure ]
 crbug.com/591099 images/pdf-as-tiled-background.html [ Failure ]
 crbug.com/591099 images/percent-height-image.html [ Failure ]
@@ -16397,15 +16405,15 @@
 crbug.com/591099 images/script-counter-imageDimensionChanged-crash.html [ Failure ]
 crbug.com/591099 images/sprite-no-bleed.html [ Failure ]
 crbug.com/591099 images/style-access-during-imageChanged-crash.html [ Crash Failure ]
-crbug.com/591099 images/style-access-during-imageChanged-style-freeze.html [ Crash ]
+crbug.com/591099 images/style-access-during-imageChanged-style-freeze.html [ Crash Pass ]
 crbug.com/591099 images/text-content-crash-2.html [ Failure ]
 crbug.com/591099 images/text-content-crash.html [ Failure ]
-crbug.com/591099 images/update-alt-text.html [ Crash ]
+crbug.com/591099 images/update-alt-text.html [ Crash Pass ]
 crbug.com/591099 images/viewport-in-standalone-image-document.html [ Failure ]
-crbug.com/591099 images/webgl-teximage2d.html [ Crash ]
+crbug.com/591099 images/webgl-teximage2d.html [ Crash Pass ]
 crbug.com/591099 images/webp-flip.html [ Failure ]
 crbug.com/591099 images/zoomed-img-size.html [ Failure ]
-crbug.com/591099 images/zoomed-offset-size.html [ Crash ]
+crbug.com/591099 images/zoomed-offset-size.html [ Crash Pass ]
 crbug.com/591099 inspector-enabled/console/console-uncaught-promise-no-inspector.html [ Failure ]
 crbug.com/591099 inspector-enabled/sources/debugger/linkifier.html [ Failure ]
 crbug.com/591099 inspector-enabled/sources/debugger/script-formatter-breakpoints-1.html [ Failure ]
@@ -16447,14 +16455,14 @@
 crbug.com/591099 inspector-protocol/layers/paint-profiler.js [ Failure ]
 crbug.com/591099 inspector-protocol/layout-fonts/languages-emoji-rare-glyphs.html [ Failure ]
 crbug.com/591099 inspector/agents-enable-disable.html [ Failure ]
-crbug.com/591099 inspector/animation/animation-KeyframeEffectReadOnly-crash.html [ Crash ]
+crbug.com/591099 inspector/animation/animation-KeyframeEffectReadOnly-crash.html [ Crash Failure ]
 crbug.com/591099 inspector/animation/animation-empty-web-animations.html [ Crash Failure ]
-crbug.com/591099 inspector/animation/animation-group-matching-animations.html [ Crash ]
-crbug.com/591099 inspector/animation/animation-group-matching-transitions.html [ Crash ]
-crbug.com/591099 inspector/animation/animation-group-matching.html [ Crash ]
-crbug.com/591099 inspector/animation/animation-timeline.html [ Crash ]
+crbug.com/591099 inspector/animation/animation-group-matching-animations.html [ Crash Failure ]
+crbug.com/591099 inspector/animation/animation-group-matching-transitions.html [ Crash Failure ]
+crbug.com/591099 inspector/animation/animation-group-matching.html [ Crash Failure ]
+crbug.com/591099 inspector/animation/animation-timeline.html [ Crash Failure ]
 crbug.com/591099 inspector/animation/animation-transition-setTiming-crash.html [ Crash Failure ]
-crbug.com/591099 inspector/animation/animation-web-anim-negative-start-time.html [ Crash ]
+crbug.com/591099 inspector/animation/animation-web-anim-negative-start-time.html [ Crash Failure ]
 crbug.com/591099 inspector/audits/audits-empty-stylesheet.html [ Crash Failure ]
 crbug.com/591099 inspector/audits/audits-panel-functional.html [ Crash Failure ]
 crbug.com/591099 inspector/changes/changes-highlighter.html [ Crash Failure Timeout ]
@@ -16484,9 +16492,9 @@
 crbug.com/591099 inspector/components/widget-events.html [ Failure ]
 crbug.com/591099 inspector/components/widget-focus.html [ Failure ]
 crbug.com/591099 inspector/console-document-write-from-external-script-logging.html [ Failure ]
-crbug.com/591099 inspector/console/alert-toString-exception.html [ Crash ]
+crbug.com/591099 inspector/console/alert-toString-exception.html [ Crash Failure ]
 crbug.com/591099 inspector/console/command-line-api-getEventListeners.html [ Crash Failure ]
-crbug.com/591099 inspector/console/command-line-api.html [ Crash ]
+crbug.com/591099 inspector/console/command-line-api.html [ Crash Failure ]
 crbug.com/591099 inspector/console/console-Object-overwritten.html [ Failure ]
 crbug.com/591099 inspector/console/console-api-on-call-frame.html [ Crash Failure ]
 crbug.com/591099 inspector/console/console-assert.html [ Failure ]
@@ -16500,7 +16508,7 @@
 crbug.com/591099 inspector/console/console-context-selector.html [ Crash Failure ]
 crbug.com/591099 inspector/console/console-control-characters.html [ Failure ]
 crbug.com/591099 inspector/console/console-copy-treeoutline.html [ Failure ]
-crbug.com/591099 inspector/console/console-copy-truncated-text.html [ Crash ]
+crbug.com/591099 inspector/console/console-copy-truncated-text.html [ Crash Failure ]
 crbug.com/591099 inspector/console/console-correct-suggestions.html [ Failure ]
 crbug.com/591099 inspector/console/console-custom-formatters.html [ Failure ]
 crbug.com/591099 inspector/console/console-dir-deprecated.html [ Failure ]
@@ -16516,14 +16524,14 @@
 crbug.com/591099 inspector/console/console-eval-fake.html [ Crash Failure ]
 crbug.com/591099 inspector/console/console-eval-global.html [ Failure ]
 crbug.com/591099 inspector/console/console-eval-object-literal.html [ Failure ]
-crbug.com/591099 inspector/console/console-eval-scoped.html [ Crash ]
+crbug.com/591099 inspector/console/console-eval-scoped.html [ Crash Failure ]
 crbug.com/591099 inspector/console/console-eval-syntax-error.html [ Failure ]
-crbug.com/591099 inspector/console/console-eval-throw.html [ Crash ]
+crbug.com/591099 inspector/console/console-eval-throw.html [ Crash Failure ]
 crbug.com/591099 inspector/console/console-eval-undefined-override.html [ Failure ]
 crbug.com/591099 inspector/console/console-eval.html [ Failure ]
 crbug.com/591099 inspector/console/console-export.html [ Failure ]
 crbug.com/591099 inspector/console/console-external-array.html [ Failure ]
-crbug.com/591099 inspector/console/console-filter-level-test.html [ Crash ]
+crbug.com/591099 inspector/console/console-filter-level-test.html [ Crash Failure ]
 crbug.com/591099 inspector/console/console-filter-test.html [ Failure ]
 crbug.com/591099 inspector/console/console-focus.html [ Failure ]
 crbug.com/591099 inspector/console/console-format-array-prototype.html [ Crash Failure ]
@@ -16540,7 +16548,7 @@
 crbug.com/591099 inspector/console/console-functions.html [ Failure ]
 crbug.com/591099 inspector/console/console-history-contains-requested-text.html [ Failure ]
 crbug.com/591099 inspector/console/console-last-result.html [ Failure ]
-crbug.com/591099 inspector/console/console-link-to-snippet.html [ Crash ]
+crbug.com/591099 inspector/console/console-link-to-snippet.html [ Crash Failure ]
 crbug.com/591099 inspector/console/console-linkify-message-location.html [ Failure ]
 crbug.com/591099 inspector/console/console-log-before-inspector-open.html [ Failure ]
 crbug.com/591099 inspector/console/console-log-custom-elements.html [ Failure ]
@@ -16568,11 +16576,11 @@
 crbug.com/591099 inspector/console/console-proxy.html [ Failure ]
 crbug.com/591099 inspector/console/console-repeat-count.html [ Failure ]
 crbug.com/591099 inspector/console/console-retain-autocomplete-on-typing.html [ Crash Failure ]
-crbug.com/591099 inspector/console/console-revoke-error-in-worker.html [ Crash ]
-crbug.com/591099 inspector/console/console-revoke-error.html [ Crash ]
+crbug.com/591099 inspector/console/console-revoke-error-in-worker.html [ Crash Failure ]
+crbug.com/591099 inspector/console/console-revoke-error.html [ Crash Failure ]
 crbug.com/591099 inspector/console/console-save-to-temp-var.html [ Failure ]
 crbug.com/591099 inspector/console/console-search-reveals-messages.html [ Failure ]
-crbug.com/591099 inspector/console/console-search.html [ Crash ]
+crbug.com/591099 inspector/console/console-search.html [ Crash Failure ]
 crbug.com/591099 inspector/console/console-smart-enter.html [ Failure ]
 crbug.com/591099 inspector/console/console-stack-overflow.html [ Failure ]
 crbug.com/591099 inspector/console/console-string-format.html [ Failure ]
@@ -16600,18 +16608,18 @@
 crbug.com/591099 inspector/console/function-name-in-console-message-stack.html [ Failure ]
 crbug.com/591099 inspector/console/inspect-html-all-collection.html [ Failure ]
 crbug.com/591099 inspector/console/paintworklet-console-selector.html [ Failure ]
-crbug.com/591099 inspector/console/shadow-element.html [ Crash ]
+crbug.com/591099 inspector/console/shadow-element.html [ Crash Failure ]
 crbug.com/591099 inspector/console/worker-eval-contains-stack.html [ Failure ]
 crbug.com/591099 inspector/cookie-resource-match.html [ Failure ]
-crbug.com/591099 inspector/coverage/coverage-repeated.html [ Crash ]
-crbug.com/591099 inspector/coverage/coverage-view-filter.html [ Crash ]
-crbug.com/591099 inspector/coverage/coverage-view.html [ Crash ]
-crbug.com/591099 inspector/coverage/decorations-after-script-formatter.html [ Crash ]
+crbug.com/591099 inspector/coverage/coverage-repeated.html [ Crash Failure ]
+crbug.com/591099 inspector/coverage/coverage-view-filter.html [ Crash Failure ]
+crbug.com/591099 inspector/coverage/coverage-view.html [ Crash Failure ]
+crbug.com/591099 inspector/coverage/decorations-after-script-formatter.html [ Crash Failure ]
 crbug.com/591099 inspector/coverage/gutter-css.html [ Crash Failure ]
-crbug.com/591099 inspector/coverage/gutter-html.html [ Crash ]
+crbug.com/591099 inspector/coverage/gutter-html.html [ Crash Failure ]
 crbug.com/591099 inspector/coverage/gutter-js.html [ Crash Failure ]
-crbug.com/591099 inspector/coverage/multiple-instances-merge.html [ Crash ]
-crbug.com/591099 inspector/coverage/reveal-autoformat.html [ Crash ]
+crbug.com/591099 inspector/coverage/multiple-instances-merge.html [ Crash Failure ]
+crbug.com/591099 inspector/coverage/reveal-autoformat.html [ Crash Failure ]
 crbug.com/591099 inspector/coverage/segments-merge.html [ Crash Failure ]
 crbug.com/591099 inspector/curl-command.html [ Failure ]
 crbug.com/591099 inspector/database-table-name-excaping.html [ Failure ]
@@ -16639,224 +16647,224 @@
 crbug.com/591099 inspector/editor/text-editor-smart-braces.html [ Crash Failure ]
 crbug.com/591099 inspector/editor/text-editor-token-at-position.html [ Crash Failure ]
 crbug.com/591099 inspector/editor/text-editor-word-jumps.html [ Crash Failure Timeout ]
-crbug.com/591099 inspector/elements/accessibility/autocomplete-attribute.html [ Crash Timeout ]
-crbug.com/591099 inspector/elements/accessibility/edit-aria-attributes.html [ Crash Timeout ]
-crbug.com/591099 inspector/elements/attribute-modified-ns.html [ Crash ]
-crbug.com/591099 inspector/elements/bidi-dom-tree.html [ Crash ]
-crbug.com/591099 inspector/elements/breadcrumb-updates.html [ Crash ]
-crbug.com/591099 inspector/elements/css-rule-hover-highlights-selectors.html [ Crash ]
-crbug.com/591099 inspector/elements/dom-agent-query-selector.html [ Crash ]
+crbug.com/591099 inspector/elements/accessibility/autocomplete-attribute.html [ Crash Failure Timeout ]
+crbug.com/591099 inspector/elements/accessibility/edit-aria-attributes.html [ Crash Failure Timeout ]
+crbug.com/591099 inspector/elements/attribute-modified-ns.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/bidi-dom-tree.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/breadcrumb-updates.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/css-rule-hover-highlights-selectors.html [ Crash Pass ]
+crbug.com/591099 inspector/elements/dom-agent-query-selector.html [ Crash Failure ]
 crbug.com/591099 inspector/elements/dom-search-crash.html [ Crash Failure ]
-crbug.com/591099 inspector/elements/edit/delete-from-document.html [ Crash ]
-crbug.com/591099 inspector/elements/edit/edit-dom-actions-1.html [ Crash ]
+crbug.com/591099 inspector/elements/edit/delete-from-document.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/edit/edit-dom-actions-1.html [ Crash Timeout ]
 crbug.com/591099 inspector/elements/edit/edit-dom-actions-2.html [ Crash Timeout ]
-crbug.com/591099 inspector/elements/edit/edit-dom-actions-3.html [ Crash ]
-crbug.com/591099 inspector/elements/edit/edit-dom-actions-4.html [ Crash ]
-crbug.com/591099 inspector/elements/edit/edit-dom-actions-shadow-1.html [ Crash ]
-crbug.com/591099 inspector/elements/edit/edit-dom-actions-shadow-2.html [ Crash ]
-crbug.com/591099 inspector/elements/edit/edit-style-attribute.html [ Crash ]
-crbug.com/591099 inspector/elements/edit/edit-trimmed-attribute-value.html [ Crash ]
-crbug.com/591099 inspector/elements/edit/insert-node-collapsed.html [ Crash ]
-crbug.com/591099 inspector/elements/edit/perform-undo-undo.html [ Crash ]
-crbug.com/591099 inspector/elements/edit/remove-node.html [ Crash ]
+crbug.com/591099 inspector/elements/edit/edit-dom-actions-3.html [ Crash Timeout ]
+crbug.com/591099 inspector/elements/edit/edit-dom-actions-4.html [ Crash Timeout ]
+crbug.com/591099 inspector/elements/edit/edit-dom-actions-shadow-1.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/edit/edit-dom-actions-shadow-2.html [ Crash Timeout ]
+crbug.com/591099 inspector/elements/edit/edit-style-attribute.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/edit/edit-trimmed-attribute-value.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/edit/insert-node-collapsed.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/edit/perform-undo-undo.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/edit/remove-node.html [ Crash Failure Timeout ]
 crbug.com/591099 inspector/elements/edit/set-attribute-non-html.svg [ Crash Failure ]
-crbug.com/591099 inspector/elements/edit/set-attribute.html [ Crash ]
-crbug.com/591099 inspector/elements/edit/set-outer-html-2.html [ Crash ]
-crbug.com/591099 inspector/elements/edit/set-outer-html-body.html [ Crash ]
-crbug.com/591099 inspector/elements/edit/set-outer-html-for-xhtml.xhtml [ Crash ]
-crbug.com/591099 inspector/elements/edit/set-outer-html.html [ Crash ]
-crbug.com/591099 inspector/elements/edit/shadow-dom-modify-chardata.html [ Crash ]
-crbug.com/591099 inspector/elements/edit/switch-panels-while-editing-as-html.html [ Crash ]
-crbug.com/591099 inspector/elements/edit/undo-dom-edits-2.html [ Crash ]
-crbug.com/591099 inspector/elements/edit/undo-dom-edits.html [ Crash ]
-crbug.com/591099 inspector/elements/edit/undo-set-outer-html-2.html [ Crash ]
-crbug.com/591099 inspector/elements/edit/undo-set-outer-html.html [ Crash ]
-crbug.com/591099 inspector/elements/elements-css-path.html [ Crash ]
-crbug.com/591099 inspector/elements/elements-delete-inline-style.html [ Crash ]
-crbug.com/591099 inspector/elements/elements-hide-html-comments.html [ Crash ]
-crbug.com/591099 inspector/elements/elements-img-tooltip.html [ Crash ]
-crbug.com/591099 inspector/elements/elements-inspect-iframe-from-different-domain.html [ Crash ]
-crbug.com/591099 inspector/elements/elements-panel-correct-case.html [ Crash ]
-crbug.com/591099 inspector/elements/elements-panel-limited-children.html [ Crash ]
-crbug.com/591099 inspector/elements/elements-panel-reload-assert.html [ Crash Timeout ]
-crbug.com/591099 inspector/elements/elements-panel-restore-selection-when-node-comes-later.html [ Crash ]
-crbug.com/591099 inspector/elements/elements-panel-rewrite-href.html [ Crash ]
-crbug.com/591099 inspector/elements/elements-panel-search.html [ Crash ]
-crbug.com/591099 inspector/elements/elements-panel-selection-after-delete.html [ Crash ]
-crbug.com/591099 inspector/elements/elements-panel-selection-on-refresh.html [ Crash ]
-crbug.com/591099 inspector/elements/elements-panel-structure.html [ Crash ]
-crbug.com/591099 inspector/elements/elements-panel-styles.html [ Crash ]
+crbug.com/591099 inspector/elements/edit/set-attribute.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/edit/set-outer-html-2.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/edit/set-outer-html-body.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/edit/set-outer-html-for-xhtml.xhtml [ Crash Failure ]
+crbug.com/591099 inspector/elements/edit/set-outer-html.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/edit/shadow-dom-modify-chardata.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/edit/switch-panels-while-editing-as-html.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/edit/undo-dom-edits-2.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/edit/undo-dom-edits.html [ Crash Failure Timeout ]
+crbug.com/591099 inspector/elements/edit/undo-set-outer-html-2.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/edit/undo-set-outer-html.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/elements-css-path.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/elements-delete-inline-style.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/elements-hide-html-comments.html [ Crash Pass ]
+crbug.com/591099 inspector/elements/elements-img-tooltip.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/elements-inspect-iframe-from-different-domain.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/elements-panel-correct-case.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/elements-panel-limited-children.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/elements-panel-reload-assert.html [ Crash Failure Timeout ]
+crbug.com/591099 inspector/elements/elements-panel-restore-selection-when-node-comes-later.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/elements-panel-rewrite-href.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/elements-panel-search.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/elements-panel-selection-after-delete.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/elements-panel-selection-on-refresh.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/elements-panel-structure.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/elements-panel-styles.html [ Crash Failure ]
 crbug.com/591099 inspector/elements/elements-tab-stops.html [ Crash Failure ]
-crbug.com/591099 inspector/elements/elements-treeoutline-copy.html [ Crash ]
-crbug.com/591099 inspector/elements/event-listener-sidebar-custom-framework.html [ Crash ]
-crbug.com/591099 inspector/elements/event-listener-sidebar-jquery1.html [ Crash ]
-crbug.com/591099 inspector/elements/event-listener-sidebar-jquery2.html [ Crash ]
-crbug.com/591099 inspector/elements/event-listener-sidebar-remove.html [ Crash ]
-crbug.com/591099 inspector/elements/event-listener-sidebar.html [ Crash ]
-crbug.com/591099 inspector/elements/event-listeners-about-blank.html [ Crash ]
-crbug.com/591099 inspector/elements/expand-recursively.html [ Crash ]
-crbug.com/591099 inspector/elements/hide-shortcut.html [ Crash ]
-crbug.com/591099 inspector/elements/highlight/highlight-css-shapes-outside-scroll.html [ Crash ]
-crbug.com/591099 inspector/elements/highlight/highlight-css-shapes-outside.html [ Crash ]
-crbug.com/591099 inspector/elements/highlight/highlight-dom-updates.html [ Crash ]
-crbug.com/591099 inspector/elements/highlight/highlight-node-scaled-and-scrolled.html [ Crash ]
-crbug.com/591099 inspector/elements/highlight/highlight-node-scaled.html [ Crash ]
-crbug.com/591099 inspector/elements/highlight/highlight-node-scroll.html [ Crash ]
-crbug.com/591099 inspector/elements/highlight/highlight-node-transformed.html [ Crash ]
-crbug.com/591099 inspector/elements/highlight/highlight-node.html [ Crash ]
-crbug.com/591099 inspector/elements/highlight/highlight-svg-content-inside-iframe.html [ Crash ]
-crbug.com/591099 inspector/elements/highlight/highlight-svg-root-zoomed.html [ Crash ]
-crbug.com/591099 inspector/elements/highlight/highlight-svg-root.html [ Crash ]
-crbug.com/591099 inspector/elements/iframe-load-event.html [ Crash ]
-crbug.com/591099 inspector/elements/inline-style-title.html [ Crash ]
-crbug.com/591099 inspector/elements/insert-node.html [ Crash ]
-crbug.com/591099 inspector/elements/inspect-mode-after-profiling.html [ Crash ]
-crbug.com/591099 inspector/elements/inspect-mode-shadow-text.html [ Crash ]
-crbug.com/591099 inspector/elements/inspect-pointer-events-none.html [ Crash ]
-crbug.com/591099 inspector/elements/inspect-pseudo-element.html [ Crash Timeout ]
-crbug.com/591099 inspector/elements/modify-chardata.html [ Crash ]
-crbug.com/591099 inspector/elements/move-node.html [ Crash ]
-crbug.com/591099 inspector/elements/node-reselect-on-append-child.html [ Crash ]
+crbug.com/591099 inspector/elements/elements-treeoutline-copy.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/event-listener-sidebar-custom-framework.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/event-listener-sidebar-jquery1.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/event-listener-sidebar-jquery2.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/event-listener-sidebar-remove.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/event-listener-sidebar.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/event-listeners-about-blank.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/expand-recursively.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/hide-shortcut.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/highlight/highlight-css-shapes-outside-scroll.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/highlight/highlight-css-shapes-outside.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/highlight/highlight-dom-updates.html [ Crash Timeout ]
+crbug.com/591099 inspector/elements/highlight/highlight-node-scaled-and-scrolled.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/highlight/highlight-node-scaled.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/highlight/highlight-node-scroll.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/highlight/highlight-node-transformed.html [ Crash Pass ]
+crbug.com/591099 inspector/elements/highlight/highlight-node.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/highlight/highlight-svg-content-inside-iframe.html [ Crash Pass ]
+crbug.com/591099 inspector/elements/highlight/highlight-svg-root-zoomed.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/highlight/highlight-svg-root.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/iframe-load-event.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/inline-style-title.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/insert-node.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/inspect-mode-after-profiling.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/inspect-mode-shadow-text.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/inspect-pointer-events-none.html [ Crash Timeout ]
+crbug.com/591099 inspector/elements/inspect-pseudo-element.html [ Crash Pass Timeout ]
+crbug.com/591099 inspector/elements/modify-chardata.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/move-node.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/node-reselect-on-append-child.html [ Crash Failure ]
 crbug.com/591099 inspector/elements/node-xpath.xhtml [ Crash Failure ]
-crbug.com/591099 inspector/elements/resolve-alien-node.html [ Crash ]
-crbug.com/591099 inspector/elements/resolve-node-blocked.html [ Crash ]
-crbug.com/591099 inspector/elements/reveal-whitespace-text-node.html [ Crash ]
-crbug.com/591099 inspector/elements/selected-element-changes-execution-context.html [ Crash ]
-crbug.com/591099 inspector/elements/shadow/breadcrumb-shadow-roots.html [ Crash ]
-crbug.com/591099 inspector/elements/shadow/create-shadow-root.html [ Crash Timeout ]
-crbug.com/591099 inspector/elements/shadow/elements-panel-shadow-selection-on-refresh-1.html [ Crash ]
-crbug.com/591099 inspector/elements/shadow/elements-panel-shadow-selection-on-refresh-2.html [ Crash ]
-crbug.com/591099 inspector/elements/shadow/elements-panel-shadow-selection-on-refresh-3.html [ Crash ]
-crbug.com/591099 inspector/elements/shadow/inspect-deep-shadow-element.html [ Crash ]
-crbug.com/591099 inspector/elements/shadow/reveal-shadow-dom-node.html [ Crash ]
-crbug.com/591099 inspector/elements/shadow/shadow-distribution.html [ Crash ]
-crbug.com/591099 inspector/elements/shadow/shadow-host-display-modes.html [ Crash ]
-crbug.com/591099 inspector/elements/shadow/shadow-root.html [ Crash ]
-crbug.com/591099 inspector/elements/shadow/update-shadowdom.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-1/add-new-rule-inline-style-csp.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-1/add-new-rule-invalid-selector.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-1/add-new-rule-with-style-after-body.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-1/cached-sync-computed-styles.html [ Crash ]
+crbug.com/591099 inspector/elements/resolve-alien-node.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/resolve-node-blocked.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/reveal-whitespace-text-node.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/selected-element-changes-execution-context.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/shadow/breadcrumb-shadow-roots.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/shadow/create-shadow-root.html [ Crash Failure Timeout ]
+crbug.com/591099 inspector/elements/shadow/elements-panel-shadow-selection-on-refresh-1.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/shadow/elements-panel-shadow-selection-on-refresh-2.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/shadow/elements-panel-shadow-selection-on-refresh-3.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/shadow/inspect-deep-shadow-element.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/shadow/reveal-shadow-dom-node.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/shadow/shadow-distribution.html [ Crash Timeout ]
+crbug.com/591099 inspector/elements/shadow/shadow-host-display-modes.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/shadow/shadow-root.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/shadow/update-shadowdom.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-1/add-new-rule-inline-style-csp.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-1/add-new-rule-invalid-selector.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-1/add-new-rule-with-style-after-body.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-1/cached-sync-computed-styles.html [ Crash Failure ]
 crbug.com/591099 inspector/elements/styles-1/case-sensitive-suggestions.html [ Crash Failure Timeout ]
-crbug.com/591099 inspector/elements/styles-1/color-aware-property-value-edit.html [ Crash ]
+crbug.com/591099 inspector/elements/styles-1/color-aware-property-value-edit.html [ Crash Failure ]
 crbug.com/591099 inspector/elements/styles-1/color-nicknames-lowercase.html [ Crash Failure ]
-crbug.com/591099 inspector/elements/styles-1/color-swatch.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-1/commit-selector-mark-matching.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-1/commit-selector.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-1/css-live-edit.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-1/css-outline.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-1/cssom-media-insert-crash.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-1/disable-property-workingcopy-update.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-1/dynamic-style-tag.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-1/edit-inspector-stylesheet.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-1/edit-media-text.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-1/edit-name-with-trimmed-value.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-1/edit-resource-referred-by-multiple-styletags.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-1/edit-value-inside-property.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-1/edit-value-url-with-color.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-1/edit-value-with-trimmed-url.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-1/empty-background-url.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-1/filter-matched-styles.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-2/add-import-rule.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-2/cssom-shorthand-important.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-2/filter-matched-styles-hides-separators.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-2/force-pseudo-state.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-2/get-set-stylesheet-text.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-2/import-pseudoclass-crash.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-2/inactive-properties.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-2/inherited-mixed-case-properties.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-2/inject-stylesheet.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-2/keyframes-rules.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-2/lazy-computed-style.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-2/media-emulation.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-2/media-queries.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-2/media-using-same-url.html [ Crash ]
+crbug.com/591099 inspector/elements/styles-1/color-swatch.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-1/commit-selector-mark-matching.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-1/commit-selector.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-1/css-live-edit.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-1/css-outline.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-1/cssom-media-insert-crash.html [ Crash Pass ]
+crbug.com/591099 inspector/elements/styles-1/disable-property-workingcopy-update.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-1/dynamic-style-tag.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-1/edit-inspector-stylesheet.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-1/edit-media-text.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-1/edit-name-with-trimmed-value.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-1/edit-resource-referred-by-multiple-styletags.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-1/edit-value-inside-property.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-1/edit-value-url-with-color.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-1/edit-value-with-trimmed-url.html [ Crash Failure Timeout ]
+crbug.com/591099 inspector/elements/styles-1/empty-background-url.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-1/filter-matched-styles.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-2/add-import-rule.html [ Crash Pass ]
+crbug.com/591099 inspector/elements/styles-2/cssom-shorthand-important.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-2/filter-matched-styles-hides-separators.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-2/force-pseudo-state.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-2/get-set-stylesheet-text.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-2/import-pseudoclass-crash.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-2/inactive-properties.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-2/inherited-mixed-case-properties.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-2/inject-stylesheet.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-2/keyframes-rules.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-2/lazy-computed-style.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-2/media-emulation.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-2/media-queries.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-2/media-using-same-url.html [ Crash Failure ]
 crbug.com/591099 inspector/elements/styles-2/mixed-case-color-aware-properties.html [ Failure ]
-crbug.com/591099 inspector/elements/styles-2/multiple-imports-edit-crash.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-2/page-reload-update-sidebar.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-2/parse-comments.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-2/parse-declaration-unterminated-comment.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-2/parse-declaration-with-quote.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-2/parse-utf8-bom.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-2/paste-property.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-2/perform-undo-perform-of-mergable-action.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-2/property-ui-location.html [ Crash ]
+crbug.com/591099 inspector/elements/styles-2/multiple-imports-edit-crash.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-2/page-reload-update-sidebar.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-2/parse-comments.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-2/parse-declaration-unterminated-comment.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-2/parse-declaration-with-quote.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-2/parse-utf8-bom.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-2/paste-property.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-2/perform-undo-perform-of-mergable-action.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-2/property-ui-location.html [ Crash Failure ]
 crbug.com/591099 inspector/elements/styles-2/pseudo-elements.html [ Crash Timeout ]
-crbug.com/591099 inspector/elements/styles-2/region-style-crash.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-3/computed-properties-retain-expanded.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-3/remove-shadow-host.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-3/selector-list.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-3/selector-source-data.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-3/shadow-dom-rules.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-3/simple-selector.html [ Crash ]
+crbug.com/591099 inspector/elements/styles-2/region-style-crash.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-3/computed-properties-retain-expanded.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-3/remove-shadow-host.html [ Crash Pass ]
+crbug.com/591099 inspector/elements/styles-3/selector-list.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-3/selector-source-data.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-3/shadow-dom-rules.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-3/simple-selector.html [ Crash Failure ]
 crbug.com/591099 inspector/elements/styles-3/spectrum.html [ Failure ]
-crbug.com/591099 inspector/elements/styles-3/style-autocomplete.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-3/style-rule-from-imported-stylesheet.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-3/styles-add-blank-property.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-3/styles-add-invalid-property.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-3/styles-add-new-rule-colon.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-3/styles-add-new-rule-tab.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-3/styles-add-new-rule-to-stylesheet.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-3/styles-add-new-rule.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-3/styles-cancel-editing.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-3/styles-change-node-while-editing.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-3/styles-commit-editing.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-3/styles-computed-trace.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-3/styles-disable-inherited.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-3/styles-disable-property-after-selector-edit.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-3/styles-disable-then-change.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-3/styles-disable-then-delete.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-3/styles-disable-then-enable-overriden-ua.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-3/styles-disable-then-enable.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-3/styles-variables.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/disable-last-property-without-semicolon.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/do-not-rebuild-styles-on-every-change.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/inline-style-sourcemap.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/keyframes-source-offsets.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/style-update-during-selector-edit.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/styles-do-not-detach-sourcemap-on-edits.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/styles-edit-property-after-invalid-rule.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/styles-formatting.html [ Crash ]
+crbug.com/591099 inspector/elements/styles-3/style-autocomplete.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-3/style-rule-from-imported-stylesheet.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-3/styles-add-blank-property.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-3/styles-add-invalid-property.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-3/styles-add-new-rule-colon.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-3/styles-add-new-rule-tab.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-3/styles-add-new-rule-to-stylesheet.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-3/styles-add-new-rule.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-3/styles-cancel-editing.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-3/styles-change-node-while-editing.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-3/styles-commit-editing.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-3/styles-computed-trace.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-3/styles-disable-inherited.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-3/styles-disable-property-after-selector-edit.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-3/styles-disable-then-change.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-3/styles-disable-then-delete.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-3/styles-disable-then-enable-overriden-ua.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-3/styles-disable-then-enable.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-3/styles-variables.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-4/disable-last-property-without-semicolon.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-4/do-not-rebuild-styles-on-every-change.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-4/inline-style-sourcemap.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-4/keyframes-source-offsets.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-4/style-update-during-selector-edit.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-4/styles-do-not-detach-sourcemap-on-edits.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-4/styles-edit-property-after-invalid-rule.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-4/styles-formatting.html [ Crash Failure ]
 crbug.com/591099 inspector/elements/styles-4/styles-history.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/styles-iframe.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/styles-inline-element-style-changes-should-not-force-style-recalc.html [ Crash ]
+crbug.com/591099 inspector/elements/styles-4/styles-iframe.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-4/styles-inline-element-style-changes-should-not-force-style-recalc.html [ Crash Failure ]
 crbug.com/591099 inspector/elements/styles-4/styles-invalid-color-values.html [ Crash Failure ]
-crbug.com/591099 inspector/elements/styles-4/styles-keyframes-cssom-injected.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/styles-keyframes.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/styles-live-locations-leak.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/styles-new-API.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/styles-overriden-properties.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/styles-properties-overload.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/styles-rerequest-sourcemap-on-watchdog.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/styles-should-not-force-sync-style-recalc.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/styles-source-lines-inline.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/styles-source-lines-recovery.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/styles-source-lines.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/styles-source-offsets.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/styles-update-from-js.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/styles-update-links-1.html [ Crash Timeout ]
-crbug.com/591099 inspector/elements/styles-4/styles-update-links-2.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/styles-update-links-3.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/styles-update-links-4.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/styles-url-linkify.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/styles-with-spaces-in-sourceURL.html [ Crash ]
+crbug.com/591099 inspector/elements/styles-4/styles-keyframes-cssom-injected.html [ Crash Pass ]
+crbug.com/591099 inspector/elements/styles-4/styles-keyframes.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-4/styles-live-locations-leak.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-4/styles-new-API.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-4/styles-overriden-properties.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-4/styles-properties-overload.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-4/styles-rerequest-sourcemap-on-watchdog.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-4/styles-should-not-force-sync-style-recalc.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-4/styles-source-lines-inline.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-4/styles-source-lines-recovery.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-4/styles-source-lines.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-4/styles-source-offsets.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-4/styles-update-from-js.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-4/styles-update-links-1.html [ Crash Failure Timeout ]
+crbug.com/591099 inspector/elements/styles-4/styles-update-links-2.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-4/styles-update-links-3.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-4/styles-update-links-4.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-4/styles-url-linkify.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-4/styles-with-spaces-in-sourceURL.html [ Crash Failure ]
 crbug.com/591099 inspector/elements/styles-4/stylesheet-source-url-comment.html [ Crash Failure ]
-crbug.com/591099 inspector/elements/styles-4/svg-style.xhtml [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/undo-add-new-rule.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/undo-add-property.html [ Crash ]
-crbug.com/591099 inspector/elements/styles-4/undo-add-rule-crash.html [ Crash ]
-crbug.com/591099 inspector/elements/styles/cancel-upon-invalid-property.html [ Crash ]
-crbug.com/591099 inspector/elements/styles/original-content-provider.html [ Crash ]
-crbug.com/591099 inspector/elements/styles/undo-after-cancelled-editing.html [ Crash ]
-crbug.com/591099 inspector/elements/styles/undo-change-property.html [ Crash ]
-crbug.com/591099 inspector/elements/styles/undo-property-toggle.html [ Crash ]
-crbug.com/591099 inspector/elements/styles/undo-set-selector-text.html [ Crash Timeout ]
-crbug.com/591099 inspector/elements/styles/up-down-numerics-and-colors.html [ Crash ]
-crbug.com/591099 inspector/elements/styles/updates-during-dom-traversal.html [ Crash ]
-crbug.com/591099 inspector/elements/styles/updates-throttled.html [ Crash ]
-crbug.com/591099 inspector/elements/styles/url-color-swatch.html [ Crash ]
-crbug.com/591099 inspector/elements/styles/url-multiple-collapsing.html [ Crash ]
-crbug.com/591099 inspector/elements/user-properties.html [ Crash ]
+crbug.com/591099 inspector/elements/styles-4/svg-style.xhtml [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-4/undo-add-new-rule.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-4/undo-add-property.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles-4/undo-add-rule-crash.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles/cancel-upon-invalid-property.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles/original-content-provider.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles/undo-after-cancelled-editing.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles/undo-change-property.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles/undo-property-toggle.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles/undo-set-selector-text.html [ Crash Failure Timeout ]
+crbug.com/591099 inspector/elements/styles/up-down-numerics-and-colors.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles/updates-during-dom-traversal.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles/updates-throttled.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles/url-color-swatch.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/styles/url-multiple-collapsing.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/user-properties.html [ Crash Failure ]
 crbug.com/591099 inspector/evaluate-in-page.html [ Failure ]
 crbug.com/591099 inspector/file-reader-with-network-panel.html [ Failure ]
 crbug.com/591099 inspector/file-system-mapping.html [ Failure ]
@@ -16864,7 +16872,7 @@
 crbug.com/591099 inspector/filtered-item-selection-dialog-rendering.html [ Failure ]
 crbug.com/591099 inspector/geolocation-emulation-tests.html [ Failure ]
 crbug.com/591099 inspector/help/release-note-unit.html [ Crash Failure ]
-crbug.com/591099 inspector/help/release-note.html [ Crash ]
+crbug.com/591099 inspector/help/release-note.html [ Crash Failure ]
 crbug.com/591099 inspector/import-open-inspector.html [ Failure ]
 crbug.com/591099 inspector/initial-modules-load.html [ Failure ]
 crbug.com/591099 inspector/input-event-warning.html [ Failure ]
@@ -16898,40 +16906,40 @@
 crbug.com/591099 inspector/profiler/cpu-profiler-save-load.html [ Crash Failure ]
 crbug.com/591099 inspector/profiler/cpu-profiler-stopped-removed-race.html [ Crash Failure ]
 crbug.com/591099 inspector/profiler/heap-profiler-profiling.html [ Crash Failure ]
-crbug.com/591099 inspector/profiler/heap-snapshot-comparison-dom-groups-change.html [ Crash ]
-crbug.com/591099 inspector/profiler/heap-snapshot-comparison-expansion-preserved-when-sorting.html [ Crash ]
-crbug.com/591099 inspector/profiler/heap-snapshot-comparison-show-all.html [ Crash ]
-crbug.com/591099 inspector/profiler/heap-snapshot-comparison-show-next.html [ Crash ]
-crbug.com/591099 inspector/profiler/heap-snapshot-comparison-shown-node-count-preserved-when-sorting.html [ Crash ]
-crbug.com/591099 inspector/profiler/heap-snapshot-comparison-sorting.html [ Crash ]
-crbug.com/591099 inspector/profiler/heap-snapshot-containment-expansion-preserved-when-sorting.html [ Crash ]
-crbug.com/591099 inspector/profiler/heap-snapshot-containment-show-all.html [ Crash ]
-crbug.com/591099 inspector/profiler/heap-snapshot-containment-show-next.html [ Crash ]
-crbug.com/591099 inspector/profiler/heap-snapshot-containment-shown-node-count-preserved-when-sorting.html [ Crash ]
-crbug.com/591099 inspector/profiler/heap-snapshot-containment-sorting.html [ Crash ]
-crbug.com/591099 inspector/profiler/heap-snapshot-inspect-dom-wrapper.html [ Crash ]
-crbug.com/591099 inspector/profiler/heap-snapshot-loader.html [ Crash ]
-crbug.com/591099 inspector/profiler/heap-snapshot-orphan-nodes.html [ Crash ]
-crbug.com/591099 inspector/profiler/heap-snapshot-statistics.html [ Crash ]
-crbug.com/591099 inspector/profiler/heap-snapshot-summary-expansion-preserved-when-sorting.html [ Crash ]
-crbug.com/591099 inspector/profiler/heap-snapshot-summary-retainers.html [ Crash ]
-crbug.com/591099 inspector/profiler/heap-snapshot-summary-search-by-id.html [ Crash ]
-crbug.com/591099 inspector/profiler/heap-snapshot-summary-search.html [ Crash ]
-crbug.com/591099 inspector/profiler/heap-snapshot-summary-show-all.html [ Crash ]
-crbug.com/591099 inspector/profiler/heap-snapshot-summary-show-next.html [ Crash ]
-crbug.com/591099 inspector/profiler/heap-snapshot-summary-show-ranges.html [ Crash ]
-crbug.com/591099 inspector/profiler/heap-snapshot-summary-shown-node-count-preserved-when-sorting.html [ Crash ]
-crbug.com/591099 inspector/profiler/heap-snapshot-summary-sorting-fields.html [ Crash ]
-crbug.com/591099 inspector/profiler/heap-snapshot-summary-sorting-instances.html [ Crash ]
-crbug.com/591099 inspector/profiler/heap-snapshot-summary-sorting.html [ Crash ]
-crbug.com/591099 inspector/profiler/heap-snapshot-weak-dominator.html [ Crash ]
+crbug.com/591099 inspector/profiler/heap-snapshot-comparison-dom-groups-change.html [ Crash Failure ]
+crbug.com/591099 inspector/profiler/heap-snapshot-comparison-expansion-preserved-when-sorting.html [ Crash Failure ]
+crbug.com/591099 inspector/profiler/heap-snapshot-comparison-show-all.html [ Crash Failure ]
+crbug.com/591099 inspector/profiler/heap-snapshot-comparison-show-next.html [ Crash Failure ]
+crbug.com/591099 inspector/profiler/heap-snapshot-comparison-shown-node-count-preserved-when-sorting.html [ Crash Failure ]
+crbug.com/591099 inspector/profiler/heap-snapshot-comparison-sorting.html [ Crash Failure ]
+crbug.com/591099 inspector/profiler/heap-snapshot-containment-expansion-preserved-when-sorting.html [ Crash Failure ]
+crbug.com/591099 inspector/profiler/heap-snapshot-containment-show-all.html [ Crash Failure ]
+crbug.com/591099 inspector/profiler/heap-snapshot-containment-show-next.html [ Crash Failure ]
+crbug.com/591099 inspector/profiler/heap-snapshot-containment-shown-node-count-preserved-when-sorting.html [ Crash Failure ]
+crbug.com/591099 inspector/profiler/heap-snapshot-containment-sorting.html [ Crash Failure ]
+crbug.com/591099 inspector/profiler/heap-snapshot-inspect-dom-wrapper.html [ Crash Failure ]
+crbug.com/591099 inspector/profiler/heap-snapshot-loader.html [ Crash Failure ]
+crbug.com/591099 inspector/profiler/heap-snapshot-orphan-nodes.html [ Crash Pass ]
+crbug.com/591099 inspector/profiler/heap-snapshot-statistics.html [ Crash Failure ]
+crbug.com/591099 inspector/profiler/heap-snapshot-summary-expansion-preserved-when-sorting.html [ Crash Failure ]
+crbug.com/591099 inspector/profiler/heap-snapshot-summary-retainers.html [ Crash Pass ]
+crbug.com/591099 inspector/profiler/heap-snapshot-summary-search-by-id.html [ Crash Timeout ]
+crbug.com/591099 inspector/profiler/heap-snapshot-summary-search.html [ Crash Failure ]
+crbug.com/591099 inspector/profiler/heap-snapshot-summary-show-all.html [ Crash Failure ]
+crbug.com/591099 inspector/profiler/heap-snapshot-summary-show-next.html [ Crash Failure ]
+crbug.com/591099 inspector/profiler/heap-snapshot-summary-show-ranges.html [ Crash Failure ]
+crbug.com/591099 inspector/profiler/heap-snapshot-summary-shown-node-count-preserved-when-sorting.html [ Crash Failure ]
+crbug.com/591099 inspector/profiler/heap-snapshot-summary-sorting-fields.html [ Crash Failure ]
+crbug.com/591099 inspector/profiler/heap-snapshot-summary-sorting-instances.html [ Crash Failure ]
+crbug.com/591099 inspector/profiler/heap-snapshot-summary-sorting.html [ Crash Failure ]
+crbug.com/591099 inspector/profiler/heap-snapshot-weak-dominator.html [ Crash Pass ]
 crbug.com/591099 inspector/profiler/heap-snapshot.html [ Crash Failure ]
 crbug.com/591099 inspector/profiler/temp-storage-cleaner.html [ Crash Failure ]
 crbug.com/591099 inspector/quick-open/command-menu.html [ Crash Failure ]
 crbug.com/591099 inspector/remote-object.html [ Failure ]
 crbug.com/591099 inspector/report-API-errors.html [ Failure ]
 crbug.com/591099 inspector/report-protocol-errors.html [ Failure ]
-crbug.com/591099 inspector/reveal-objects.html [ Crash ]
+crbug.com/591099 inspector/reveal-objects.html [ Crash Failure ]
 crbug.com/591099 inspector/runtime.html [ Failure ]
 crbug.com/591099 inspector/runtime/runtime-callFunctionOn.html [ Crash Failure ]
 crbug.com/591099 inspector/runtime/runtime-es6-setSymbolPropertyValue.html [ Failure ]
@@ -16939,32 +16947,32 @@
 crbug.com/591099 inspector/runtime/runtime-getProperties.html [ Failure ]
 crbug.com/591099 inspector/runtime/runtime-localStorage-getProperties.html [ Crash Failure ]
 crbug.com/591099 inspector/runtime/runtime-setPropertyValue.html [ Crash Failure ]
-crbug.com/591099 inspector/sass/test-ast-css-1.html [ Crash ]
-crbug.com/591099 inspector/sass/test-ast-css-2.html [ Crash ]
-crbug.com/591099 inspector/sass/test-ast-css-3.html [ Crash ]
-crbug.com/591099 inspector/sass/test-ast-diff-1.html [ Crash ]
-crbug.com/591099 inspector/sass/test-ast-editing-1.html [ Crash ]
-crbug.com/591099 inspector/sass/test-ast-editing-2.html [ Crash ]
-crbug.com/591099 inspector/sass/test-ast-scss-1.html [ Crash ]
-crbug.com/591099 inspector/sass/test-ast-scss-2.html [ Crash ]
-crbug.com/591099 inspector/sass/test-ast-scss-3.html [ Crash ]
-crbug.com/591099 inspector/sass/test-ast-scss-4.html [ Crash ]
-crbug.com/591099 inspector/sass/test-ast-scss-5.html [ Crash ]
-crbug.com/591099 inspector/sass/test-ast-scss-6.html [ Crash ]
-crbug.com/591099 inspector/sass/test-ast-scss-7.html [ Crash ]
+crbug.com/591099 inspector/sass/test-ast-css-1.html [ Crash Failure ]
+crbug.com/591099 inspector/sass/test-ast-css-2.html [ Crash Failure ]
+crbug.com/591099 inspector/sass/test-ast-css-3.html [ Crash Failure ]
+crbug.com/591099 inspector/sass/test-ast-diff-1.html [ Crash Failure ]
+crbug.com/591099 inspector/sass/test-ast-editing-1.html [ Crash Failure ]
+crbug.com/591099 inspector/sass/test-ast-editing-2.html [ Crash Failure ]
+crbug.com/591099 inspector/sass/test-ast-scss-1.html [ Crash Failure ]
+crbug.com/591099 inspector/sass/test-ast-scss-2.html [ Crash Failure ]
+crbug.com/591099 inspector/sass/test-ast-scss-3.html [ Crash Failure ]
+crbug.com/591099 inspector/sass/test-ast-scss-4.html [ Crash Failure ]
+crbug.com/591099 inspector/sass/test-ast-scss-5.html [ Crash Failure ]
+crbug.com/591099 inspector/sass/test-ast-scss-6.html [ Crash Failure ]
+crbug.com/591099 inspector/sass/test-ast-scss-7.html [ Crash Failure ]
 crbug.com/591099 inspector/sass/test-edit-insert-property-empty-rule.html [ Failure ]
 crbug.com/591099 inspector/sass/test-edit-insert-property.html [ Failure ]
 crbug.com/591099 inspector/sass/test-edit-remove-property.html [ Failure ]
 crbug.com/591099 inspector/sass/test-edit-set-property-text.html [ Failure ]
 crbug.com/591099 inspector/sass/test-edit-toggle-property.html [ Crash Failure ]
-crbug.com/591099 inspector/sass/test-find-node-for-position.html [ Crash ]
+crbug.com/591099 inspector/sass/test-find-node-for-position.html [ Crash Failure ]
 crbug.com/591099 inspector/sass/test-mapping-bad.html [ Crash Failure ]
 crbug.com/591099 inspector/sass/test-mapping-good.html [ Failure ]
 crbug.com/591099 inspector/sass/test-mapping-many-scss.html [ Failure ]
 crbug.com/591099 inspector/sass/test-mapping-with-cache-busting-url.html [ Crash Failure ]
-crbug.com/591099 inspector/sass/test-ssp-breaking-edits.html [ Crash ]
-crbug.com/591099 inspector/sass/test-ssp-editing.html [ Crash ]
-crbug.com/591099 inspector/sass/test-ssp-incremental-edit-invalid-value.html [ Crash ]
+crbug.com/591099 inspector/sass/test-ssp-breaking-edits.html [ Crash Failure ]
+crbug.com/591099 inspector/sass/test-ssp-editing.html [ Crash Failure ]
+crbug.com/591099 inspector/sass/test-ssp-incremental-edit-invalid-value.html [ Crash Failure ]
 crbug.com/591099 inspector/schema-get-domains-matches-agents.html [ Failure ]
 crbug.com/591099 inspector/sources/autocomplete-css.html [ Crash Failure ]
 crbug.com/591099 inspector/sources/autocomplete-general.html [ Crash Failure ]
@@ -17194,98 +17202,98 @@
 crbug.com/591099 inspector/tracing-model-ids.html [ Failure ]
 crbug.com/591099 inspector/tracing-model-storage.html [ Failure ]
 crbug.com/591099 inspector/tracing-model.html [ Failure ]
-crbug.com/591099 inspector/tracing-session-id.html [ Crash ]
-crbug.com/591099 inspector/tracing/anonymous-image-object.html [ Crash ]
+crbug.com/591099 inspector/tracing-session-id.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/anonymous-image-object.html [ Crash Failure ]
 crbug.com/591099 inspector/tracing/buffer-usage.html [ Failure ]
 crbug.com/591099 inspector/tracing/category-filter.html [ Failure ]
-crbug.com/591099 inspector/tracing/console-timeline.html [ Crash ]
-crbug.com/591099 inspector/tracing/decode-resize.html [ Crash Timeout ]
-crbug.com/591099 inspector/tracing/frame-model-instrumentation.html [ Crash ]
+crbug.com/591099 inspector/tracing/console-timeline.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/decode-resize.html [ Crash Failure Timeout ]
+crbug.com/591099 inspector/tracing/frame-model-instrumentation.html [ Crash Pass ]
 crbug.com/591099 inspector/tracing/frame-model.html [ Crash Failure ]
-crbug.com/591099 inspector/tracing/hit-test.html [ Crash ]
-crbug.com/591099 inspector/tracing/scroll-invalidations.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-js/compile-script.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-js/timeline-gc-event.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-js/timeline-injected-script-eval.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-js/timeline-js-line-level-profile.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-js/timeline-microtasks.html [ Crash ]
+crbug.com/591099 inspector/tracing/hit-test.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/scroll-invalidations.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-js/compile-script.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-js/timeline-gc-event.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-js/timeline-injected-script-eval.html [ Crash Pass ]
+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 ]
-crbug.com/591099 inspector/tracing/timeline-js/timeline-script-id.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-js/timeline-script-tag-1.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-js/timeline-script-tag-2.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-layout/timeline-layout-reason.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-layout/timeline-layout-with-invalidations.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-layout/timeline-layout.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-misc/timeline-aggregated-details.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-misc/timeline-animation-frame.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-misc/timeline-bound-function.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-misc/timeline-event-causes.html [ Crash ]
+crbug.com/591099 inspector/tracing/timeline-js/timeline-runtime-stats.html [ Crash 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 ]
+crbug.com/591099 inspector/tracing/timeline-layout/timeline-layout-reason.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-layout/timeline-layout-with-invalidations.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-layout/timeline-layout.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-misc/timeline-aggregated-details.html [ Crash Pass ]
+crbug.com/591099 inspector/tracing/timeline-misc/timeline-animation-frame.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-misc/timeline-bound-function.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-misc/timeline-event-causes.html [ Crash Failure ]
 crbug.com/591099 inspector/tracing/timeline-misc/timeline-event-details.html [ Crash Failure ]
-crbug.com/591099 inspector/tracing/timeline-misc/timeline-event-dispatch.html [ Crash ]
+crbug.com/591099 inspector/tracing/timeline-misc/timeline-event-dispatch.html [ Crash Failure ]
 crbug.com/591099 inspector/tracing/timeline-misc/timeline-filtering.html [ Crash Failure ]
-crbug.com/591099 inspector/tracing/timeline-misc/timeline-flame-chart-automatically-size-window.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-misc/timeline-grouped-invalidations.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-misc/timeline-load-event.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-misc/timeline-mark-timeline.html [ Crash ]
+crbug.com/591099 inspector/tracing/timeline-misc/timeline-flame-chart-automatically-size-window.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-misc/timeline-grouped-invalidations.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-misc/timeline-load-event.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-misc/timeline-mark-timeline.html [ Crash Failure ]
 crbug.com/591099 inspector/tracing/timeline-misc/timeline-model.html [ Crash Failure ]
-crbug.com/591099 inspector/tracing/timeline-misc/timeline-node-reference.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-misc/timeline-parse-html.html [ Crash ]
+crbug.com/591099 inspector/tracing/timeline-misc/timeline-node-reference.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-misc/timeline-parse-html.html [ Crash Failure ]
 crbug.com/591099 inspector/tracing/timeline-misc/timeline-range-stats.html [ Failure ]
-crbug.com/591099 inspector/tracing/timeline-misc/timeline-record-reload.html [ Crash ]
+crbug.com/591099 inspector/tracing/timeline-misc/timeline-record-reload.html [ Crash Failure ]
 crbug.com/591099 inspector/tracing/timeline-misc/timeline-search.html [ Failure ]
 crbug.com/591099 inspector/tracing/timeline-misc/timeline-tree-search.html [ Crash Failure ]
-crbug.com/591099 inspector/tracing/timeline-misc/timeline-trivial.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-misc/timeline-window-filter.html [ Crash ]
+crbug.com/591099 inspector/tracing/timeline-misc/timeline-trivial.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-misc/timeline-window-filter.html [ Crash Failure ]
 crbug.com/591099 inspector/tracing/timeline-network/timeline-network-resource-details.html [ Failure ]
 crbug.com/591099 inspector/tracing/timeline-network/timeline-network-resource.html [ Failure ]
-crbug.com/591099 inspector/tracing/timeline-paint/layer-tree.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-paint/paint-profiler-update.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-paint/timeline-paint-and-multiple-style-invalidations.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-paint/timeline-paint-with-layout-invalidations-on-deleted-node.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-paint/timeline-paint-with-layout-invalidations.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-paint/timeline-paint-with-style-recalc-invalidations.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-paint/timeline-paint.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-paint/update-layer-tree.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-style/parse-author-style-sheet.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-style/timeline-recalculate-styles.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-style/timeline-style-recalc-all-invalidator-types.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-style/timeline-style-recalc-with-invalidations.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-style/timeline-style-recalc-with-invalidator-invalidations.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-time/timeline-time-stamp.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-time/timeline-time.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-time/timeline-timer-fired-from-eval-call-site.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-time/timeline-timer.html [ Crash ]
-crbug.com/591099 inspector/tracing/timeline-time/timeline-usertiming.html [ Crash ]
+crbug.com/591099 inspector/tracing/timeline-paint/layer-tree.html [ Crash Pass ]
+crbug.com/591099 inspector/tracing/timeline-paint/paint-profiler-update.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-paint/timeline-paint-and-multiple-style-invalidations.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-paint/timeline-paint-with-layout-invalidations-on-deleted-node.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-paint/timeline-paint-with-layout-invalidations.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-paint/timeline-paint-with-style-recalc-invalidations.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-paint/timeline-paint.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-paint/update-layer-tree.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-style/parse-author-style-sheet.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-style/timeline-recalculate-styles.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-style/timeline-style-recalc-all-invalidator-types.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-style/timeline-style-recalc-with-invalidations.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-style/timeline-style-recalc-with-invalidator-invalidations.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-time/timeline-time-stamp.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-time/timeline-time.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-time/timeline-timer-fired-from-eval-call-site.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-time/timeline-timer.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/timeline-time/timeline-usertiming.html [ Crash Failure ]
 crbug.com/591099 inspector/tracing/tracing-timeline-load.html [ Failure ]
-crbug.com/591099 inspector/tracing/worker-events.html [ Crash ]
-crbug.com/591099 inspector/tracing/worker-js-frames.html [ Crash ]
+crbug.com/591099 inspector/tracing/worker-events.html [ Crash Failure ]
+crbug.com/591099 inspector/tracing/worker-js-frames.html [ Crash Failure ]
 crbug.com/591099 inspector/uisourcecode-revisions.html [ Failure ]
 crbug.com/591099 inspector/user-metrics.html [ Failure ]
 crbug.com/591099 inspector/version-controller.html [ Failure ]
 crbug.com/591099 inspector/workspace-mapping.html [ Failure ]
-crbug.com/591099 installedapp/getinstalledrelatedapps-iframe.html [ Crash ]
-crbug.com/591099 intersection-observer/client-rect.html [ Crash ]
-crbug.com/591099 intersection-observer/cross-origin-iframe.html [ Crash ]
+crbug.com/591099 installedapp/getinstalledrelatedapps-iframe.html [ Crash Pass ]
+crbug.com/591099 intersection-observer/client-rect.html [ Crash Pass ]
+crbug.com/591099 intersection-observer/cross-origin-iframe.html [ Crash Pass ]
 crbug.com/591099 intersection-observer/edge-inclusive-intersection.html [ Failure ]
-crbug.com/591099 intersection-observer/iframe-no-root.html [ Crash ]
-crbug.com/591099 intersection-observer/observer-in-iframe.html [ Crash ]
+crbug.com/591099 intersection-observer/iframe-no-root.html [ Crash Pass ]
+crbug.com/591099 intersection-observer/observer-in-iframe.html [ Crash Pass ]
 crbug.com/591099 intersection-observer/remove-element.html [ Failure ]
-crbug.com/591099 intersection-observer/root-margin.html [ Crash ]
-crbug.com/591099 intersection-observer/same-document-root.html [ Crash ]
-crbug.com/591099 jquery/attributes.html [ Crash ]
-crbug.com/591099 jquery/core.html [ Crash ]
-crbug.com/591099 jquery/css.html [ Crash ]
-crbug.com/591099 jquery/data.html [ Crash ]
-crbug.com/591099 jquery/deferred.html [ Crash ]
-crbug.com/591099 jquery/dimensions.html [ Crash ]
-crbug.com/591099 jquery/event.html [ Crash ]
-crbug.com/591099 jquery/manipulation.html [ Crash ]
-crbug.com/591099 jquery/offset.html [ Crash ]
-crbug.com/591099 jquery/traversing.html [ Crash ]
+crbug.com/591099 intersection-observer/root-margin.html [ Crash Pass ]
+crbug.com/591099 intersection-observer/same-document-root.html [ Crash Failure ]
+crbug.com/591099 jquery/attributes.html [ Crash Pass ]
+crbug.com/591099 jquery/core.html [ Crash Pass ]
+crbug.com/591099 jquery/css.html [ Crash Pass ]
+crbug.com/591099 jquery/data.html [ Crash Pass ]
+crbug.com/591099 jquery/deferred.html [ Crash Pass ]
+crbug.com/591099 jquery/dimensions.html [ Crash Pass ]
+crbug.com/591099 jquery/event.html [ Crash Pass ]
+crbug.com/591099 jquery/manipulation.html [ Crash Pass ]
+crbug.com/591099 jquery/offset.html [ Crash Failure ]
+crbug.com/591099 jquery/traversing.html [ Crash Pass ]
 crbug.com/591099 loader/iframe-src-change-onload-crash.html [ Failure ]
-crbug.com/591099 loader/iframe-sync-loads.html [ Crash ]
-crbug.com/591099 loader/image-loader-base.html [ Crash ]
+crbug.com/591099 loader/iframe-sync-loads.html [ Crash Pass ]
+crbug.com/591099 loader/image-loader-base.html [ Crash Pass ]
 crbug.com/591099 media/W3C/audio/canPlayType/canPlayType_application_octet_stream.html [ Failure ]
 crbug.com/591099 media/W3C/audio/canPlayType/canPlayType_application_octet_stream_with_codecs_1.html [ Failure ]
 crbug.com/591099 media/W3C/audio/canPlayType/canPlayType_application_octet_stream_with_codecs_2.html [ Failure ]
@@ -17418,327 +17426,327 @@
 crbug.com/591099 media/W3C/video/src/src_reflects_attribute_not_source_elements.html [ Failure ]
 crbug.com/591099 media/W3C/video/src/src_reflects_no_value.html [ Failure ]
 crbug.com/591099 media/W3C/video/src/src_removal_does_not_trigger_loadstart.html [ Failure ]
-crbug.com/591099 media/audio-controls-captions.html [ Crash ]
-crbug.com/591099 media/audio-controls-do-not-fade-out.html [ Crash ]
-crbug.com/591099 media/audio-delete-while-slider-thumb-clicked.html [ Crash ]
+crbug.com/591099 media/audio-controls-captions.html [ Crash Pass ]
+crbug.com/591099 media/audio-controls-do-not-fade-out.html [ Crash Pass ]
+crbug.com/591099 media/audio-delete-while-slider-thumb-clicked.html [ Crash Pass ]
 crbug.com/591099 media/audio-only-video-intrinsic-size.html [ Failure ]
-crbug.com/591099 media/auto-play-in-sandbox-with-allow-scripts.html [ Crash ]
-crbug.com/591099 media/autoplay-document-move.html [ Crash ]
-crbug.com/591099 media/autoplay-muted-conditions.html [ Crash ]
-crbug.com/591099 media/autoplay-muted.html [ Crash Timeout ]
-crbug.com/591099 media/autoplay-non-whitelisted-scope.html [ Crash ]
-crbug.com/591099 media/autoplay-whitelisted-scope.html [ Crash ]
+crbug.com/591099 media/auto-play-in-sandbox-with-allow-scripts.html [ Crash Pass ]
+crbug.com/591099 media/autoplay-document-move.html [ Crash Pass ]
+crbug.com/591099 media/autoplay-muted-conditions.html [ Crash Pass ]
+crbug.com/591099 media/autoplay-muted.html [ Crash Pass Timeout ]
+crbug.com/591099 media/autoplay-non-whitelisted-scope.html [ Crash Pass ]
+crbug.com/591099 media/autoplay-whitelisted-scope.html [ Crash Pass ]
 crbug.com/591099 media/autoplay/document-user-activation.html [ Failure ]
-crbug.com/591099 media/before-load-member-access.html [ Crash ]
-crbug.com/591099 media/broken-video.html [ Crash ]
+crbug.com/591099 media/before-load-member-access.html [ Crash Pass ]
+crbug.com/591099 media/broken-video.html [ Crash Pass ]
 crbug.com/591099 media/color-profile-video-poster-image.html [ Failure Pass ]
 crbug.com/591099 media/color-profile-video-seek-filter.html [ Failure Pass ]
 crbug.com/591099 media/color-profile-video-seek-object-fit.html [ Failure Pass ]
 crbug.com/591099 media/color-profile-video-seek.html [ Failure Pass ]
 crbug.com/591099 media/color-profile-video.html [ Failure Pass ]
-crbug.com/591099 media/constructors.html [ Crash ]
-crbug.com/591099 media/controls-css-overload.html [ Crash ]
-crbug.com/591099 media/controls-drag-timebar.html [ Crash ]
-crbug.com/591099 media/controls-right-click-on-timebar.html [ Crash ]
+crbug.com/591099 media/constructors.html [ Crash Pass ]
+crbug.com/591099 media/controls-css-overload.html [ Crash Pass ]
+crbug.com/591099 media/controls-drag-timebar.html [ Crash Pass ]
+crbug.com/591099 media/controls-right-click-on-timebar.html [ Crash Pass ]
 crbug.com/591099 media/controls-slider-appearance-crash.html [ Failure ]
-crbug.com/591099 media/controls-timeline.html [ Crash ]
-crbug.com/591099 media/controls-volume-slider-keynav.html [ Crash ]
-crbug.com/591099 media/controls-volume-slider.html [ Crash ]
-crbug.com/591099 media/controls/closed-captions-dynamic-update.html [ Crash ]
-crbug.com/591099 media/controls/closed-captions-on-off.html [ Crash ]
-crbug.com/591099 media/controls/closed-captions-single-track.html [ Crash ]
-crbug.com/591099 media/controls/closed-captions-switch-track.html [ Crash ]
-crbug.com/591099 media/controls/controls-cast-button-narrow.html [ Crash ]
-crbug.com/591099 media/controls/controls-cast-button.html [ Crash ]
-crbug.com/591099 media/controls/controls-cast-do-not-fade-out.html [ Crash ]
-crbug.com/591099 media/controls/controls-cast-overlay-slow-fade.html [ Crash ]
-crbug.com/591099 media/controls/controls-overlay-cast-button.html [ Crash ]
-crbug.com/591099 media/controls/controls-video-keynav-no-controls.html [ Crash ]
-crbug.com/591099 media/controls/controls-video-keynav.html [ Crash ]
-crbug.com/591099 media/controls/download-button-displays-with-preload-none.html [ Crash ]
-crbug.com/591099 media/controls/overflow-fully-hidden.html [ Crash ]
-crbug.com/591099 media/controls/overlay-play-button-document-move.html [ Crash ]
-crbug.com/591099 media/controls/overlay-play-button-narrow.html [ Crash ]
-crbug.com/591099 media/controls/settings-disable-controls.html [ Crash ]
-crbug.com/591099 media/controls/video-controls-overflow-menu-hide-on-click-outside.html [ Crash ]
-crbug.com/591099 media/controls/video-controls-overflow-menu-hide-on-click-panel.html [ Crash ]
-crbug.com/591099 media/controls/video-controls-overflow-menu-hide-on-click.html [ Crash ]
-crbug.com/591099 media/controls/video-controls-overflow-menu-hide-on-resize.html [ Crash ]
-crbug.com/591099 media/controls/video-controls-overflow-menu-text.html [ Crash ]
-crbug.com/591099 media/controls/video-controls-overflow-menu-visibility.html [ Crash ]
+crbug.com/591099 media/controls-timeline.html [ Crash Pass ]
+crbug.com/591099 media/controls-volume-slider-keynav.html [ Crash Pass ]
+crbug.com/591099 media/controls-volume-slider.html [ Crash Pass ]
+crbug.com/591099 media/controls/closed-captions-dynamic-update.html [ Crash Pass ]
+crbug.com/591099 media/controls/closed-captions-on-off.html [ Crash Pass ]
+crbug.com/591099 media/controls/closed-captions-single-track.html [ Crash Pass ]
+crbug.com/591099 media/controls/closed-captions-switch-track.html [ Crash Pass ]
+crbug.com/591099 media/controls/controls-cast-button-narrow.html [ Crash Pass ]
+crbug.com/591099 media/controls/controls-cast-button.html [ Crash Pass ]
+crbug.com/591099 media/controls/controls-cast-do-not-fade-out.html [ Crash Pass ]
+crbug.com/591099 media/controls/controls-cast-overlay-slow-fade.html [ Crash Pass ]
+crbug.com/591099 media/controls/controls-overlay-cast-button.html [ Crash Pass ]
+crbug.com/591099 media/controls/controls-video-keynav-no-controls.html [ Crash Pass ]
+crbug.com/591099 media/controls/controls-video-keynav.html [ Crash Pass ]
+crbug.com/591099 media/controls/download-button-displays-with-preload-none.html [ Crash Pass ]
+crbug.com/591099 media/controls/overflow-fully-hidden.html [ Crash Pass ]
+crbug.com/591099 media/controls/overlay-play-button-document-move.html [ Crash Pass ]
+crbug.com/591099 media/controls/overlay-play-button-narrow.html [ Crash Pass ]
+crbug.com/591099 media/controls/settings-disable-controls.html [ Crash Pass ]
+crbug.com/591099 media/controls/video-controls-overflow-menu-hide-on-click-outside.html [ Crash Pass ]
+crbug.com/591099 media/controls/video-controls-overflow-menu-hide-on-click-panel.html [ Crash Pass ]
+crbug.com/591099 media/controls/video-controls-overflow-menu-hide-on-click.html [ Crash Pass ]
+crbug.com/591099 media/controls/video-controls-overflow-menu-hide-on-resize.html [ Crash Pass ]
+crbug.com/591099 media/controls/video-controls-overflow-menu-text.html [ Crash Pass ]
+crbug.com/591099 media/controls/video-controls-overflow-menu-visibility.html [ Crash Pass ]
 crbug.com/591099 media/controls/video-controls-with-cast-rendering.html [ Failure ]
-crbug.com/591099 media/controls/video-enter-exit-fullscreen-while-hovering-shows-controls.html [ Crash ]
-crbug.com/591099 media/controls/video-enter-exit-fullscreen-without-hovering-doesnt-show-controls.html [ Crash ]
+crbug.com/591099 media/controls/video-enter-exit-fullscreen-while-hovering-shows-controls.html [ Crash Pass ]
+crbug.com/591099 media/controls/video-enter-exit-fullscreen-without-hovering-doesnt-show-controls.html [ Crash Pass ]
 crbug.com/591099 media/controls/video-overlay-cast-dark-rendering.html [ Failure ]
 crbug.com/591099 media/controls/video-overlay-cast-light-rendering.html [ Failure ]
-crbug.com/591099 media/controls/video-overlay-play-button.html [ Crash ]
-crbug.com/591099 media/crash-in-media-moved-to-newdocument.html [ Crash ]
-crbug.com/591099 media/csp-blocks-video.html [ Crash ]
-crbug.com/591099 media/deprecated-css-selectors.html [ Crash ]
-crbug.com/591099 media/encrypted-media/encrypted-media-lifetime-reload.html [ Crash ]
-crbug.com/591099 media/encrypted-media/encrypted-media-onencrypted.html [ Crash ]
-crbug.com/591099 media/encrypted-media/encrypted-media-playback-encrypted-and-clear-sources.html [ Crash ]
-crbug.com/591099 media/encrypted-media/encrypted-media-playback-multiple-sessions.html [ Crash ]
-crbug.com/591099 media/encrypted-media/encrypted-media-playback-setmediakeys-after-src.html [ Crash ]
-crbug.com/591099 media/encrypted-media/encrypted-media-playback-setmediakeys-before-src.html [ Crash ]
-crbug.com/591099 media/encrypted-media/encrypted-media-playback-two-videos.html [ Crash ]
-crbug.com/591099 media/encrypted-media/encrypted-media-reset-src-after-setmediakeys.html [ Crash ]
-crbug.com/591099 media/encrypted-media/encrypted-media-reset-src-during-setmediakeys.html [ Crash ]
-crbug.com/591099 media/encrypted-media/encrypted-media-setmediakeys-again-after-playback.html [ Crash ]
-crbug.com/591099 media/encrypted-media/encrypted-media-setmediakeys-again-after-resetting-src.html [ Crash ]
-crbug.com/591099 media/encrypted-media/encrypted-media-setmediakeys-at-same-time.html [ Crash ]
-crbug.com/591099 media/encrypted-media/encrypted-media-setmediakeys-multiple-times-with-different-mediakeys.html [ Crash ]
-crbug.com/591099 media/encrypted-media/encrypted-media-setmediakeys-multiple-times-with-the-same-mediakeys.html [ Crash ]
-crbug.com/591099 media/encrypted-media/encrypted-media-setmediakeys-to-multiple-video-elements.html [ Crash ]
-crbug.com/591099 media/encrypted-media/encrypted-media-setmediakeys.html [ Crash ]
-crbug.com/591099 media/encrypted-media/encrypted-media-waiting-for-a-key.html [ Crash ]
-crbug.com/591099 media/event-attributes.html [ Crash ]
+crbug.com/591099 media/controls/video-overlay-play-button.html [ Crash Pass ]
+crbug.com/591099 media/crash-in-media-moved-to-newdocument.html [ Crash Pass ]
+crbug.com/591099 media/csp-blocks-video.html [ Crash Pass ]
+crbug.com/591099 media/deprecated-css-selectors.html [ Crash Pass ]
+crbug.com/591099 media/encrypted-media/encrypted-media-lifetime-reload.html [ Crash Pass ]
+crbug.com/591099 media/encrypted-media/encrypted-media-onencrypted.html [ Crash Pass ]
+crbug.com/591099 media/encrypted-media/encrypted-media-playback-encrypted-and-clear-sources.html [ Crash Pass ]
+crbug.com/591099 media/encrypted-media/encrypted-media-playback-multiple-sessions.html [ Crash Pass ]
+crbug.com/591099 media/encrypted-media/encrypted-media-playback-setmediakeys-after-src.html [ Crash Pass ]
+crbug.com/591099 media/encrypted-media/encrypted-media-playback-setmediakeys-before-src.html [ Crash Pass ]
+crbug.com/591099 media/encrypted-media/encrypted-media-playback-two-videos.html [ Crash Pass ]
+crbug.com/591099 media/encrypted-media/encrypted-media-reset-src-after-setmediakeys.html [ Crash Pass ]
+crbug.com/591099 media/encrypted-media/encrypted-media-reset-src-during-setmediakeys.html [ Crash Pass ]
+crbug.com/591099 media/encrypted-media/encrypted-media-setmediakeys-again-after-playback.html [ Crash Pass ]
+crbug.com/591099 media/encrypted-media/encrypted-media-setmediakeys-again-after-resetting-src.html [ Crash Pass ]
+crbug.com/591099 media/encrypted-media/encrypted-media-setmediakeys-at-same-time.html [ Crash Pass ]
+crbug.com/591099 media/encrypted-media/encrypted-media-setmediakeys-multiple-times-with-different-mediakeys.html [ Crash Pass ]
+crbug.com/591099 media/encrypted-media/encrypted-media-setmediakeys-multiple-times-with-the-same-mediakeys.html [ Crash Pass ]
+crbug.com/591099 media/encrypted-media/encrypted-media-setmediakeys-to-multiple-video-elements.html [ Crash Pass ]
+crbug.com/591099 media/encrypted-media/encrypted-media-setmediakeys.html [ Crash Pass ]
+crbug.com/591099 media/encrypted-media/encrypted-media-waiting-for-a-key.html [ Crash Pass ]
+crbug.com/591099 media/event-attributes.html [ Crash Pass ]
 crbug.com/591099 media/fallback.html [ Failure ]
-crbug.com/591099 media/fullscreen-controls-visible-last.html [ Crash ]
-crbug.com/591099 media/media-can-play-mpeg4-video.html [ Crash ]
-crbug.com/591099 media/media-can-play-ogg.html [ Crash ]
-crbug.com/591099 media/media-can-play-type.html [ Crash ]
-crbug.com/591099 media/media-can-play-webm.html [ Crash ]
-crbug.com/591099 media/media-captions-no-controls.html [ Crash ]
-crbug.com/591099 media/media-controls-fit-properly-while-zoomed.html [ Crash ]
-crbug.com/591099 media/media-controls-hide-menu-stoppropagation-iframe.html [ Crash ]
-crbug.com/591099 media/media-controls-hide-menu-stoppropagation.html [ Crash ]
-crbug.com/591099 media/media-controls-invalid-url.html [ Crash ]
-crbug.com/591099 media/media-controls-overflow-hidden.html [ Crash ]
-crbug.com/591099 media/media-controls-overflow-visible.html [ Crash ]
-crbug.com/591099 media/media-controls-tap-show-controls-without-activating.html [ Crash ]
+crbug.com/591099 media/fullscreen-controls-visible-last.html [ Crash Pass ]
+crbug.com/591099 media/media-can-play-mpeg4-video.html [ Crash Pass ]
+crbug.com/591099 media/media-can-play-ogg.html [ Crash Pass ]
+crbug.com/591099 media/media-can-play-type.html [ Crash Pass ]
+crbug.com/591099 media/media-can-play-webm.html [ Crash Pass ]
+crbug.com/591099 media/media-captions-no-controls.html [ Crash Pass ]
+crbug.com/591099 media/media-controls-fit-properly-while-zoomed.html [ Crash Pass ]
+crbug.com/591099 media/media-controls-hide-menu-stoppropagation-iframe.html [ Crash Pass ]
+crbug.com/591099 media/media-controls-hide-menu-stoppropagation.html [ Crash Pass ]
+crbug.com/591099 media/media-controls-invalid-url.html [ Crash Pass ]
+crbug.com/591099 media/media-controls-overflow-hidden.html [ Crash Pass ]
+crbug.com/591099 media/media-controls-overflow-visible.html [ Crash Pass ]
+crbug.com/591099 media/media-controls-tap-show-controls-without-activating.html [ Crash Pass ]
 crbug.com/591099 media/media-document-audio-size.html [ Failure ]
-crbug.com/591099 media/media-extension-with-fragment.html [ Crash ]
+crbug.com/591099 media/media-extension-with-fragment.html [ Crash Pass ]
 crbug.com/591099 media/network-no-source-const-shadow.html [ Failure ]
-crbug.com/591099 media/no-autoplay-with-user-gesture-requirement.html [ Crash ]
-crbug.com/591099 media/remoteplayback/availability-callback-gc.html [ Crash ]
-crbug.com/591099 media/remoteplayback/prompt-twice-throws.html [ Crash ]
-crbug.com/591099 media/remoteplayback/watch-availability-throws-low-end-device.html [ Crash ]
-crbug.com/591099 media/remove-from-document-before-load.html [ Crash ]
+crbug.com/591099 media/no-autoplay-with-user-gesture-requirement.html [ Crash Pass ]
+crbug.com/591099 media/remoteplayback/availability-callback-gc.html [ Crash Pass ]
+crbug.com/591099 media/remoteplayback/prompt-twice-throws.html [ Crash Pass ]
+crbug.com/591099 media/remoteplayback/watch-availability-throws-low-end-device.html [ Crash Pass ]
+crbug.com/591099 media/remove-from-document-before-load.html [ Crash Pass ]
 crbug.com/591099 media/remove-from-document-config-controls-no-crash.html [ Crash Failure ]
-crbug.com/591099 media/remove-from-document.html [ Crash ]
+crbug.com/591099 media/remove-from-document.html [ Crash Pass ]
 crbug.com/591099 media/svg-as-image-with-media-blocked.html [ Failure ]
-crbug.com/591099 media/track/cue-style-invalidation.html [ Crash ]
-crbug.com/591099 media/track/media-element-enqueue-event-crash.html [ Crash ]
+crbug.com/591099 media/track/cue-style-invalidation.html [ Crash Pass ]
+crbug.com/591099 media/track/media-element-enqueue-event-crash.html [ Crash Pass ]
 crbug.com/591099 media/track/media-element-move-to-new-document-assert.html [ Failure ]
-crbug.com/591099 media/track/opera/track/webvtt/parsing/001.html [ Crash ]
-crbug.com/591099 media/track/regions-webvtt/vtt-region-display.html [ Crash ]
+crbug.com/591099 media/track/opera/track/webvtt/parsing/001.html [ Crash Pass ]
+crbug.com/591099 media/track/regions-webvtt/vtt-region-display.html [ Crash Pass ]
 crbug.com/591099 media/track/text-track-cue-exceptions.html [ Failure ]
-crbug.com/591099 media/track/text-track-selection-menu-add-track.html [ Crash ]
-crbug.com/591099 media/track/track-css-all-cues.html [ Crash ]
-crbug.com/591099 media/track/track-css-cue-lifetime.html [ Crash ]
-crbug.com/591099 media/track/track-css-matching-default.html [ Crash ]
-crbug.com/591099 media/track/track-css-matching-lang.html [ Crash ]
-crbug.com/591099 media/track/track-css-matching-timestamps.html [ Crash ]
-crbug.com/591099 media/track/track-css-matching.html [ Crash ]
-crbug.com/591099 media/track/track-css-property-whitelist.html [ Crash ]
-crbug.com/591099 media/track/track-css-user-settings-override-author-settings.html [ Crash ]
-crbug.com/591099 media/track/track-css-user-settings-override-internal-settings.html [ Crash ]
-crbug.com/591099 media/track/track-cue-container-rendering-position.html [ Crash ]
-crbug.com/591099 media/track/track-cue-gc-wrapper.html [ Crash ]
-crbug.com/591099 media/track/track-cue-inline-assertion-crash.html [ Crash ]
-crbug.com/591099 media/track/track-cue-mutable-fragment.html [ Crash ]
-crbug.com/591099 media/track/track-cue-mutable-text.html [ Crash ]
-crbug.com/591099 media/track/track-cue-mutable.html [ Crash ]
-crbug.com/591099 media/track/track-cue-negative-timestamp.html [ Crash ]
-crbug.com/591099 media/track/track-cue-nothing-to-render.html [ Crash ]
+crbug.com/591099 media/track/text-track-selection-menu-add-track.html [ Crash Pass ]
+crbug.com/591099 media/track/track-css-all-cues.html [ Crash Pass ]
+crbug.com/591099 media/track/track-css-cue-lifetime.html [ Crash Pass ]
+crbug.com/591099 media/track/track-css-matching-default.html [ Crash Pass ]
+crbug.com/591099 media/track/track-css-matching-lang.html [ Crash Pass ]
+crbug.com/591099 media/track/track-css-matching-timestamps.html [ Crash Pass ]
+crbug.com/591099 media/track/track-css-matching.html [ Crash Pass ]
+crbug.com/591099 media/track/track-css-property-whitelist.html [ Crash Pass ]
+crbug.com/591099 media/track/track-css-user-settings-override-author-settings.html [ Crash Pass ]
+crbug.com/591099 media/track/track-css-user-settings-override-internal-settings.html [ Crash Pass ]
+crbug.com/591099 media/track/track-cue-container-rendering-position.html [ Crash Pass ]
+crbug.com/591099 media/track/track-cue-gc-wrapper.html [ Crash Pass ]
+crbug.com/591099 media/track/track-cue-inline-assertion-crash.html [ Crash Pass ]
+crbug.com/591099 media/track/track-cue-mutable-fragment.html [ Crash Pass ]
+crbug.com/591099 media/track/track-cue-mutable-text.html [ Crash Pass ]
+crbug.com/591099 media/track/track-cue-mutable.html [ Crash Pass ]
+crbug.com/591099 media/track/track-cue-negative-timestamp.html [ Crash Pass ]
+crbug.com/591099 media/track/track-cue-nothing-to-render.html [ Crash Pass ]
 crbug.com/591099 media/track/track-cue-rendering-horizontal.html [ Failure Pass ]
-crbug.com/591099 media/track/track-cue-rendering-on-resize.html [ Crash ]
-crbug.com/591099 media/track/track-cue-rendering-overscan.html [ Crash ]
-crbug.com/591099 media/track/track-cue-rendering-rtl.html [ Crash ]
-crbug.com/591099 media/track/track-cue-rendering-snap-to-lines-not-set.html [ Crash ]
-crbug.com/591099 media/track/track-cue-rendering-tree-is-removed-properly.html [ Crash ]
+crbug.com/591099 media/track/track-cue-rendering-on-resize.html [ Crash Pass ]
+crbug.com/591099 media/track/track-cue-rendering-overscan.html [ Crash Pass ]
+crbug.com/591099 media/track/track-cue-rendering-rtl.html [ Crash Pass ]
+crbug.com/591099 media/track/track-cue-rendering-snap-to-lines-not-set.html [ Crash Pass ]
+crbug.com/591099 media/track/track-cue-rendering-tree-is-removed-properly.html [ Crash Failure ]
 crbug.com/591099 media/track/track-cue-rendering-vertical.html [ Failure Pass ]
-crbug.com/591099 media/track/track-cue-rendering-wider-than-controls.html [ Crash ]
-crbug.com/591099 media/track/track-cue-rendering-with-padding.html [ Crash ]
-crbug.com/591099 media/track/track-cue-rendering.html [ Crash ]
-crbug.com/591099 media/track/track-cues-cuechange.html [ Crash ]
-crbug.com/591099 media/track/track-cues-enter-exit.html [ Crash ]
-crbug.com/591099 media/track/track-cues-missed.html [ Crash ]
-crbug.com/591099 media/track/track-cues-pause-on-exit.html [ Crash ]
-crbug.com/591099 media/track/track-cues-seeking.html [ Crash ]
-crbug.com/591099 media/track/track-cues-sorted-before-dispatch.html [ Crash ]
-crbug.com/591099 media/track/track-default-attribute.html [ Crash Timeout ]
-crbug.com/591099 media/track/track-delete-during-setup.html [ Crash ]
-crbug.com/591099 media/track/track-disabled.html [ Crash ]
-crbug.com/591099 media/track/track-element-load-event.html [ Crash ]
-crbug.com/591099 media/track/track-id.html [ Crash ]
-crbug.com/591099 media/track/track-kind-user-preference.html [ Crash ]
-crbug.com/591099 media/track/track-kind.html [ Crash Timeout ]
-crbug.com/591099 media/track/track-language-preference.html [ Crash ]
-crbug.com/591099 media/track/track-large-timestamp.html [ Crash ]
-crbug.com/591099 media/track/track-load-error-readyState.html [ Crash Timeout ]
-crbug.com/591099 media/track/track-load-from-element-readyState.html [ Crash Timeout ]
-crbug.com/591099 media/track/track-load-from-src-readyState.html [ Crash ]
-crbug.com/591099 media/track/track-mode-disabled-crash.html [ Crash ]
-crbug.com/591099 media/track/track-mode-not-changed-by-new-track.html [ Crash ]
-crbug.com/591099 media/track/track-mode-triggers-loading.html [ Crash ]
-crbug.com/591099 media/track/track-mode.html [ Crash ]
-crbug.com/591099 media/track/track-removal-crash.html [ Crash ]
-crbug.com/591099 media/track/track-remove-active-cue-crash.html [ Crash ]
-crbug.com/591099 media/track/track-remove-by-setting-innerHTML.html [ Crash ]
-crbug.com/591099 media/track/track-selection-metadata.html [ Crash ]
-crbug.com/591099 media/track/track-text-track-cue-list.html [ Crash ]
-crbug.com/591099 media/track/track-texttracks.html [ Crash ]
-crbug.com/591099 media/track/track-webvtt-tc000-empty.html [ Crash Timeout ]
-crbug.com/591099 media/track/track-webvtt-tc001-utf8.html [ Crash ]
-crbug.com/591099 media/track/track-webvtt-tc002-bom.html [ Crash ]
-crbug.com/591099 media/track/track-webvtt-tc003-newlines.html [ Crash ]
-crbug.com/591099 media/track/track-webvtt-tc004-magic-header.html [ Crash ]
-crbug.com/591099 media/track/track-webvtt-tc005-header-comment.html [ Crash ]
-crbug.com/591099 media/track/track-webvtt-tc008-timings-no-hours.html [ Crash ]
-crbug.com/591099 media/track/track-webvtt-tc009-timings-hour.html [ Crash ]
-crbug.com/591099 media/track/track-webvtt-tc010-no-timings.html [ Crash ]
-crbug.com/591099 media/track/track-webvtt-tc016-align-positioning.html [ Crash ]
-crbug.com/591099 media/track/track-webvtt-tc017-line-position.html [ Crash ]
-crbug.com/591099 media/track/track-webvtt-tc018-align-text-line-position.html [ Crash ]
-crbug.com/591099 media/track/track-word-breaking.html [ Crash ]
+crbug.com/591099 media/track/track-cue-rendering-wider-than-controls.html [ Crash Pass ]
+crbug.com/591099 media/track/track-cue-rendering-with-padding.html [ Crash Pass ]
+crbug.com/591099 media/track/track-cue-rendering.html [ Crash Pass ]
+crbug.com/591099 media/track/track-cues-cuechange.html [ Crash Pass ]
+crbug.com/591099 media/track/track-cues-enter-exit.html [ Crash Pass ]
+crbug.com/591099 media/track/track-cues-missed.html [ Crash Pass ]
+crbug.com/591099 media/track/track-cues-pause-on-exit.html [ Crash Pass ]
+crbug.com/591099 media/track/track-cues-seeking.html [ Crash Pass ]
+crbug.com/591099 media/track/track-cues-sorted-before-dispatch.html [ Crash Pass ]
+crbug.com/591099 media/track/track-default-attribute.html [ Crash Failure Timeout ]
+crbug.com/591099 media/track/track-delete-during-setup.html [ Crash Pass ]
+crbug.com/591099 media/track/track-disabled.html [ Crash Pass ]
+crbug.com/591099 media/track/track-element-load-event.html [ Crash Pass ]
+crbug.com/591099 media/track/track-id.html [ Crash Pass ]
+crbug.com/591099 media/track/track-kind-user-preference.html [ Crash Pass ]
+crbug.com/591099 media/track/track-kind.html [ Crash Pass Timeout ]
+crbug.com/591099 media/track/track-language-preference.html [ Crash Pass ]
+crbug.com/591099 media/track/track-large-timestamp.html [ Crash Pass ]
+crbug.com/591099 media/track/track-load-error-readyState.html [ Crash Pass Timeout ]
+crbug.com/591099 media/track/track-load-from-element-readyState.html [ Crash Pass Timeout ]
+crbug.com/591099 media/track/track-load-from-src-readyState.html [ Crash Pass ]
+crbug.com/591099 media/track/track-mode-disabled-crash.html [ Crash Pass ]
+crbug.com/591099 media/track/track-mode-not-changed-by-new-track.html [ Crash Pass ]
+crbug.com/591099 media/track/track-mode-triggers-loading.html [ Crash Pass ]
+crbug.com/591099 media/track/track-mode.html [ Crash Pass ]
+crbug.com/591099 media/track/track-removal-crash.html [ Crash Pass ]
+crbug.com/591099 media/track/track-remove-active-cue-crash.html [ Crash Pass ]
+crbug.com/591099 media/track/track-remove-by-setting-innerHTML.html [ Crash Pass ]
+crbug.com/591099 media/track/track-selection-metadata.html [ Crash Pass ]
+crbug.com/591099 media/track/track-text-track-cue-list.html [ Crash Pass ]
+crbug.com/591099 media/track/track-texttracks.html [ Crash Pass ]
+crbug.com/591099 media/track/track-webvtt-tc000-empty.html [ Crash Pass Timeout ]
+crbug.com/591099 media/track/track-webvtt-tc001-utf8.html [ Crash Pass ]
+crbug.com/591099 media/track/track-webvtt-tc002-bom.html [ Crash Pass ]
+crbug.com/591099 media/track/track-webvtt-tc003-newlines.html [ Crash Pass ]
+crbug.com/591099 media/track/track-webvtt-tc004-magic-header.html [ Crash Pass ]
+crbug.com/591099 media/track/track-webvtt-tc005-header-comment.html [ Crash Pass ]
+crbug.com/591099 media/track/track-webvtt-tc008-timings-no-hours.html [ Crash Pass ]
+crbug.com/591099 media/track/track-webvtt-tc009-timings-hour.html [ Crash Pass ]
+crbug.com/591099 media/track/track-webvtt-tc010-no-timings.html [ Crash Pass ]
+crbug.com/591099 media/track/track-webvtt-tc016-align-positioning.html [ Crash Pass ]
+crbug.com/591099 media/track/track-webvtt-tc017-line-position.html [ Crash Pass ]
+crbug.com/591099 media/track/track-webvtt-tc018-align-text-line-position.html [ Crash Pass ]
+crbug.com/591099 media/track/track-word-breaking.html [ Crash Pass ]
 crbug.com/591099 media/track/vtt-cue-exceptions.html [ Failure ]
-crbug.com/591099 media/unsupported-rtsp.html [ Crash ]
-crbug.com/591099 media/unsupported-tracks.html [ Crash ]
-crbug.com/591099 media/video-append-source.html [ Crash ]
+crbug.com/591099 media/unsupported-rtsp.html [ Crash Pass ]
+crbug.com/591099 media/unsupported-tracks.html [ Crash Pass ]
+crbug.com/591099 media/video-append-source.html [ Crash Pass ]
 crbug.com/591099 media/video-aspect-ratio.html [ Failure ]
-crbug.com/591099 media/video-autoplay.html [ Crash ]
-crbug.com/591099 media/video-black-bg-in-media-document.html [ Crash ]
+crbug.com/591099 media/video-autoplay.html [ Crash Pass ]
+crbug.com/591099 media/video-black-bg-in-media-document.html [ Crash Pass ]
 crbug.com/591099 media/video-buffered-too-few-arguments.html [ Failure ]
-crbug.com/591099 media/video-buffered-unknown-duration.html [ Crash ]
-crbug.com/591099 media/video-buffered.html [ Crash ]
+crbug.com/591099 media/video-buffered-unknown-duration.html [ Crash Pass ]
+crbug.com/591099 media/video-buffered.html [ Crash Pass ]
 crbug.com/591099 media/video-canvas-alpha.html [ Failure ]
-crbug.com/591099 media/video-canvas-source.html [ Crash ]
-crbug.com/591099 media/video-canvas.html [ Crash ]
-crbug.com/591099 media/video-capture-canvas.html [ Crash ]
-crbug.com/591099 media/video-capture-preview.html [ Crash ]
+crbug.com/591099 media/video-canvas-source.html [ Crash Pass ]
+crbug.com/591099 media/video-canvas.html [ Crash Pass ]
+crbug.com/591099 media/video-capture-canvas.html [ Crash Pass ]
+crbug.com/591099 media/video-capture-preview.html [ Crash Pass ]
 crbug.com/591099 media/video-colorspace-yuv420.html [ Failure ]
 crbug.com/591099 media/video-colorspace-yuv422.html [ Failure ]
-crbug.com/591099 media/video-controls-always-visible-when-control-hovered.html [ Crash ]
-crbug.com/591099 media/video-controls-auto-hide-after-play-by-touch.html [ Crash ]
-crbug.com/591099 media/video-controls-dont-show-on-focus-when-disabled.html [ Crash ]
-crbug.com/591099 media/video-controls-download-button-not-displayed-local.html [ Crash ]
-crbug.com/591099 media/video-controls-focus-movement-on-hide.html [ Crash ]
-crbug.com/591099 media/video-controls-fullscreen-iframe-allowed.html [ Crash ]
-crbug.com/591099 media/video-controls-fullscreen-iframe-not-allowed.html [ Crash ]
-crbug.com/591099 media/video-controls-fullscreen-not-supported.html [ Crash ]
-crbug.com/591099 media/video-controls-fullscreen.html [ Crash ]
-crbug.com/591099 media/video-controls-hidden-audio.html [ Crash ]
-crbug.com/591099 media/video-controls-hide-after-touch-on-control.html [ Crash ]
-crbug.com/591099 media/video-controls-hide-on-move-outside-controls.html [ Crash ]
-crbug.com/591099 media/video-controls-in-media-document.html [ Crash ]
-crbug.com/591099 media/video-controls-labels.html [ Crash ]
-crbug.com/591099 media/video-controls-mouse-events-captured.html [ Crash ]
-crbug.com/591099 media/video-controls-muted-video-can-unmute.html [ Crash ]
-crbug.com/591099 media/video-controls-no-scripting.html [ Crash ]
-crbug.com/591099 media/video-controls-overflow-menu-closed-captions-button.html [ Crash ]
-crbug.com/591099 media/video-controls-overflow-menu-closed-captions-list-hide-on-click-outside.html [ Crash ]
-crbug.com/591099 media/video-controls-overflow-menu-last-button-visible.html [ Crash ]
-crbug.com/591099 media/video-controls-overflow-menu-mute-button.html [ Crash ]
-crbug.com/591099 media/video-controls-overflow-menu-play-button.html [ Crash ]
-crbug.com/591099 media/video-controls-show-on-focus.html [ Crash ]
+crbug.com/591099 media/video-controls-always-visible-when-control-hovered.html [ Crash Pass ]
+crbug.com/591099 media/video-controls-auto-hide-after-play-by-touch.html [ Crash Pass ]
+crbug.com/591099 media/video-controls-dont-show-on-focus-when-disabled.html [ Crash Pass ]
+crbug.com/591099 media/video-controls-download-button-not-displayed-local.html [ Crash Pass ]
+crbug.com/591099 media/video-controls-focus-movement-on-hide.html [ Crash Pass ]
+crbug.com/591099 media/video-controls-fullscreen-iframe-allowed.html [ Crash Pass ]
+crbug.com/591099 media/video-controls-fullscreen-iframe-not-allowed.html [ Crash Pass ]
+crbug.com/591099 media/video-controls-fullscreen-not-supported.html [ Crash Pass ]
+crbug.com/591099 media/video-controls-fullscreen.html [ Crash Pass ]
+crbug.com/591099 media/video-controls-hidden-audio.html [ Crash Pass ]
+crbug.com/591099 media/video-controls-hide-after-touch-on-control.html [ Crash Pass ]
+crbug.com/591099 media/video-controls-hide-on-move-outside-controls.html [ Crash Pass ]
+crbug.com/591099 media/video-controls-in-media-document.html [ Crash Pass ]
+crbug.com/591099 media/video-controls-labels.html [ Crash Pass ]
+crbug.com/591099 media/video-controls-mouse-events-captured.html [ Crash Pass ]
+crbug.com/591099 media/video-controls-muted-video-can-unmute.html [ Crash Pass ]
+crbug.com/591099 media/video-controls-no-scripting.html [ Crash Pass ]
+crbug.com/591099 media/video-controls-overflow-menu-closed-captions-button.html [ Crash Pass ]
+crbug.com/591099 media/video-controls-overflow-menu-closed-captions-list-hide-on-click-outside.html [ Crash Pass ]
+crbug.com/591099 media/video-controls-overflow-menu-last-button-visible.html [ Crash Pass ]
+crbug.com/591099 media/video-controls-overflow-menu-mute-button.html [ Crash Pass ]
+crbug.com/591099 media/video-controls-overflow-menu-play-button.html [ Crash Pass ]
+crbug.com/591099 media/video-controls-show-on-focus.html [ Crash Pass ]
 crbug.com/591099 media/video-controls-start-selection.html [ Failure ]
-crbug.com/591099 media/video-controls-toggling.html [ Crash ]
-crbug.com/591099 media/video-controls-touch-events-captured.html [ Crash ]
-crbug.com/591099 media/video-controls-track-selection-menu.html [ Crash ]
-crbug.com/591099 media/video-controls-transformed.html [ Crash ]
-crbug.com/591099 media/video-controls-visibility-multimodal-mouse-after-touch.html [ Crash ]
-crbug.com/591099 media/video-controls-visibility-multimodal-touch-after-mouse.html [ Crash ]
+crbug.com/591099 media/video-controls-toggling.html [ Crash Pass ]
+crbug.com/591099 media/video-controls-touch-events-captured.html [ Crash Pass ]
+crbug.com/591099 media/video-controls-track-selection-menu.html [ Crash Pass ]
+crbug.com/591099 media/video-controls-transformed.html [ Crash Pass ]
+crbug.com/591099 media/video-controls-visibility-multimodal-mouse-after-touch.html [ Crash Pass ]
+crbug.com/591099 media/video-controls-visibility-multimodal-touch-after-mouse.html [ Crash Pass ]
 crbug.com/591099 media/video-controls-visible-audio-only.html [ Failure ]
 crbug.com/591099 media/video-controls-with-mutation-event-handler.html [ Failure ]
-crbug.com/591099 media/video-controls-zoomed.html [ Crash ]
-crbug.com/591099 media/video-controls.html [ Crash ]
-crbug.com/591099 media/video-currentTime-before-have-metadata-media-fragment-uri.html [ Crash ]
-crbug.com/591099 media/video-currentTime-before-have-metadata.html [ Crash ]
-crbug.com/591099 media/video-currentTime-delay.html [ Crash ]
-crbug.com/591099 media/video-currentTime-set.html [ Crash ]
-crbug.com/591099 media/video-currentTime-set2.html [ Crash ]
-crbug.com/591099 media/video-currentTime.html [ Crash ]
-crbug.com/591099 media/video-delay-load-event.html [ Crash ]
-crbug.com/591099 media/video-display-aspect-ratio.html [ Crash ]
-crbug.com/591099 media/video-dom-autoplay.html [ Crash ]
-crbug.com/591099 media/video-dom-src.html [ Crash ]
-crbug.com/591099 media/video-double-seek-currentTime.html [ Crash ]
-crbug.com/591099 media/video-duration-known-after-eos.html [ Crash ]
-crbug.com/591099 media/video-enter-fullscreen-without-user-gesture.html [ Crash ]
-crbug.com/591099 media/video-error-does-not-exist.html [ Crash ]
-crbug.com/591099 media/video-force-preload-none-to-metadata-on-load.html [ Crash ]
-crbug.com/591099 media/video-force-preload-none-to-metadata-on-play.html [ Crash ]
-crbug.com/591099 media/video-intrinsic-width-height.html [ Crash ]
+crbug.com/591099 media/video-controls-zoomed.html [ Crash Pass ]
+crbug.com/591099 media/video-controls.html [ Crash Pass ]
+crbug.com/591099 media/video-currentTime-before-have-metadata-media-fragment-uri.html [ Crash Pass ]
+crbug.com/591099 media/video-currentTime-before-have-metadata.html [ Crash Pass ]
+crbug.com/591099 media/video-currentTime-delay.html [ Crash Pass ]
+crbug.com/591099 media/video-currentTime-set.html [ Crash Pass ]
+crbug.com/591099 media/video-currentTime-set2.html [ Crash Pass ]
+crbug.com/591099 media/video-currentTime.html [ Crash Pass ]
+crbug.com/591099 media/video-delay-load-event.html [ Crash Pass ]
+crbug.com/591099 media/video-display-aspect-ratio.html [ Crash Pass ]
+crbug.com/591099 media/video-dom-autoplay.html [ Crash Pass ]
+crbug.com/591099 media/video-dom-src.html [ Crash Pass ]
+crbug.com/591099 media/video-double-seek-currentTime.html [ Crash Pass ]
+crbug.com/591099 media/video-duration-known-after-eos.html [ Crash Pass ]
+crbug.com/591099 media/video-enter-fullscreen-without-user-gesture.html [ Crash Pass ]
+crbug.com/591099 media/video-error-does-not-exist.html [ Crash Pass ]
+crbug.com/591099 media/video-force-preload-none-to-metadata-on-load.html [ Crash Pass ]
+crbug.com/591099 media/video-force-preload-none-to-metadata-on-play.html [ Crash Pass ]
+crbug.com/591099 media/video-intrinsic-width-height.html [ Crash Pass ]
 crbug.com/591099 media/video-layer-crash.html [ Failure ]
-crbug.com/591099 media/video-load-networkState.html [ Crash ]
-crbug.com/591099 media/video-load-preload-none.html [ Crash ]
-crbug.com/591099 media/video-load-readyState.html [ Crash ]
-crbug.com/591099 media/video-loop-from-ended.html [ Crash ]
-crbug.com/591099 media/video-loop.html [ Crash ]
-crbug.com/591099 media/video-mouse-focus.html [ Crash ]
-crbug.com/591099 media/video-move-to-new-document-srcobject.html [ Crash ]
-crbug.com/591099 media/video-move-to-new-document.html [ Crash ]
-crbug.com/591099 media/video-muted.html [ Crash ]
-crbug.com/591099 media/video-no-autoplay.html [ Crash ]
-crbug.com/591099 media/video-no-controls-events-not-absorbed.html [ Crash ]
-crbug.com/591099 media/video-no-timeupdate-before-playback.html [ Crash ]
-crbug.com/591099 media/video-not-paused-while-looping.html [ Crash ]
-crbug.com/591099 media/video-pause-empty-events.html [ Crash ]
-crbug.com/591099 media/video-pause-immediately.html [ Crash ]
-crbug.com/591099 media/video-persistence.html [ Crash ]
-crbug.com/591099 media/video-play-empty-events.html [ Crash ]
-crbug.com/591099 media/video-play-pause-events.html [ Crash ]
-crbug.com/591099 media/video-play-pause-exception.html [ Crash ]
-crbug.com/591099 media/video-play-require-user-gesture.html [ Crash ]
-crbug.com/591099 media/video-playbackrate.html [ Crash ]
-crbug.com/591099 media/video-played-collapse.html [ Crash ]
-crbug.com/591099 media/video-played-ranges-1.html [ Crash ]
-crbug.com/591099 media/video-played-reset.html [ Crash ]
-crbug.com/591099 media/video-playing-and-pause.html [ Crash ]
+crbug.com/591099 media/video-load-networkState.html [ Crash Pass ]
+crbug.com/591099 media/video-load-preload-none.html [ Crash Pass ]
+crbug.com/591099 media/video-load-readyState.html [ Crash Pass ]
+crbug.com/591099 media/video-loop-from-ended.html [ Crash Pass ]
+crbug.com/591099 media/video-loop.html [ Crash Pass ]
+crbug.com/591099 media/video-mouse-focus.html [ Crash Pass ]
+crbug.com/591099 media/video-move-to-new-document-srcobject.html [ Crash Pass ]
+crbug.com/591099 media/video-move-to-new-document.html [ Crash Pass ]
+crbug.com/591099 media/video-muted.html [ Crash Pass ]
+crbug.com/591099 media/video-no-autoplay.html [ Crash Pass ]
+crbug.com/591099 media/video-no-controls-events-not-absorbed.html [ Crash Pass ]
+crbug.com/591099 media/video-no-timeupdate-before-playback.html [ Crash Pass ]
+crbug.com/591099 media/video-not-paused-while-looping.html [ Crash Pass ]
+crbug.com/591099 media/video-pause-empty-events.html [ Crash Pass ]
+crbug.com/591099 media/video-pause-immediately.html [ Crash Pass ]
+crbug.com/591099 media/video-persistence.html [ Crash Pass ]
+crbug.com/591099 media/video-play-empty-events.html [ Crash Pass ]
+crbug.com/591099 media/video-play-pause-events.html [ Crash Pass ]
+crbug.com/591099 media/video-play-pause-exception.html [ Crash Pass ]
+crbug.com/591099 media/video-play-require-user-gesture.html [ Crash Pass ]
+crbug.com/591099 media/video-playbackrate.html [ Crash Pass ]
+crbug.com/591099 media/video-played-collapse.html [ Crash Pass ]
+crbug.com/591099 media/video-played-ranges-1.html [ Crash Pass ]
+crbug.com/591099 media/video-played-reset.html [ Crash Pass ]
+crbug.com/591099 media/video-playing-and-pause.html [ Crash Pass ]
 crbug.com/591099 media/video-plays-past-end-of-test.html [ Failure ]
-crbug.com/591099 media/video-positive-start-time-seek-after-start-time.html [ Crash ]
-crbug.com/591099 media/video-positive-start-time-seek-before-start-time.html [ Crash ]
-crbug.com/591099 media/video-positive-start-time.html [ Crash ]
-crbug.com/591099 media/video-poster-delayed.html [ Crash ]
+crbug.com/591099 media/video-positive-start-time-seek-after-start-time.html [ Crash Pass ]
+crbug.com/591099 media/video-positive-start-time-seek-before-start-time.html [ Crash Pass ]
+crbug.com/591099 media/video-positive-start-time.html [ Crash Pass ]
+crbug.com/591099 media/video-poster-delayed.html [ Crash Pass ]
 crbug.com/591099 media/video-poster-scale.html [ Failure ]
-crbug.com/591099 media/video-poster.html [ Crash ]
-crbug.com/591099 media/video-prefixed-fullscreen.html [ Crash ]
-crbug.com/591099 media/video-preload-none-no-stalled-event.html [ Crash ]
-crbug.com/591099 media/video-remove-insert-repaints.html [ Crash ]
+crbug.com/591099 media/video-poster.html [ Crash Pass ]
+crbug.com/591099 media/video-prefixed-fullscreen.html [ Crash Pass ]
+crbug.com/591099 media/video-preload-none-no-stalled-event.html [ Crash Pass ]
+crbug.com/591099 media/video-remove-insert-repaints.html [ Crash Failure ]
 crbug.com/591099 media/video-replaces-poster.html [ Failure ]
-crbug.com/591099 media/video-scales-in-media-document.html [ Crash ]
-crbug.com/591099 media/video-seek-by-small-increment.html [ Crash ]
-crbug.com/591099 media/video-seek-no-src.html [ Crash ]
-crbug.com/591099 media/video-seek-past-end-paused.html [ Crash ]
-crbug.com/591099 media/video-seek-past-end-playing.html [ Crash ]
-crbug.com/591099 media/video-seek-to-duration-with-playbackrate-zero.html [ Crash ]
-crbug.com/591099 media/video-seekable.html [ Crash ]
-crbug.com/591099 media/video-seeking.html [ Crash ]
-crbug.com/591099 media/video-set-rate-from-pause.html [ Crash ]
-crbug.com/591099 media/video-single-valid-source.html [ Crash ]
-crbug.com/591099 media/video-size.html [ Crash ]
-crbug.com/591099 media/video-source-add-after-remove.html [ Crash ]
-crbug.com/591099 media/video-source-error-no-candidate.html [ Crash ]
-crbug.com/591099 media/video-source-error.html [ Crash ]
-crbug.com/591099 media/video-source-inserted.html [ Crash ]
-crbug.com/591099 media/video-source-load.html [ Crash ]
-crbug.com/591099 media/video-source-media.html [ Crash ]
-crbug.com/591099 media/video-source-none-supported.html [ Crash ]
-crbug.com/591099 media/video-source-type-params.html [ Crash ]
-crbug.com/591099 media/video-source-type.html [ Crash ]
-crbug.com/591099 media/video-source.html [ Crash ]
-crbug.com/591099 media/video-src-blob.html [ Crash ]
-crbug.com/591099 media/video-src-change.html [ Crash ]
-crbug.com/591099 media/video-src-empty.html [ Crash ]
-crbug.com/591099 media/video-src-invalid-poster.html [ Crash ]
-crbug.com/591099 media/video-src-invalid-remove.html [ Crash ]
-crbug.com/591099 media/video-src-none.html [ Crash ]
-crbug.com/591099 media/video-src-plus-source.html [ Crash ]
-crbug.com/591099 media/video-src-remove.html [ Crash ]
-crbug.com/591099 media/video-src-set.html [ Crash ]
-crbug.com/591099 media/video-src-source.html [ Crash ]
-crbug.com/591099 media/video-src.html [ Crash ]
-crbug.com/591099 media/video-srcobject-mediastream-src-file.html [ Crash ]
-crbug.com/591099 media/video-srcobject-mediastream.html [ Crash ]
-crbug.com/591099 media/video-timeupdate-during-playback.html [ Crash ]
+crbug.com/591099 media/video-scales-in-media-document.html [ Crash Failure ]
+crbug.com/591099 media/video-seek-by-small-increment.html [ Crash Pass ]
+crbug.com/591099 media/video-seek-no-src.html [ Crash Pass ]
+crbug.com/591099 media/video-seek-past-end-paused.html [ Crash Pass ]
+crbug.com/591099 media/video-seek-past-end-playing.html [ Crash Pass ]
+crbug.com/591099 media/video-seek-to-duration-with-playbackrate-zero.html [ Crash Pass ]
+crbug.com/591099 media/video-seekable.html [ Crash Pass ]
+crbug.com/591099 media/video-seeking.html [ Crash Pass ]
+crbug.com/591099 media/video-set-rate-from-pause.html [ Crash Pass ]
+crbug.com/591099 media/video-single-valid-source.html [ Crash Pass ]
+crbug.com/591099 media/video-size.html [ Crash Pass ]
+crbug.com/591099 media/video-source-add-after-remove.html [ Crash Pass ]
+crbug.com/591099 media/video-source-error-no-candidate.html [ Crash Pass ]
+crbug.com/591099 media/video-source-error.html [ Crash Pass ]
+crbug.com/591099 media/video-source-inserted.html [ Crash Pass ]
+crbug.com/591099 media/video-source-load.html [ Crash Pass ]
+crbug.com/591099 media/video-source-media.html [ Crash Pass ]
+crbug.com/591099 media/video-source-none-supported.html [ Crash Pass ]
+crbug.com/591099 media/video-source-type-params.html [ Crash Pass ]
+crbug.com/591099 media/video-source-type.html [ Crash Pass ]
+crbug.com/591099 media/video-source.html [ Crash Pass ]
+crbug.com/591099 media/video-src-blob.html [ Crash Pass ]
+crbug.com/591099 media/video-src-change.html [ Crash Pass ]
+crbug.com/591099 media/video-src-empty.html [ Crash Pass ]
+crbug.com/591099 media/video-src-invalid-poster.html [ Crash Pass ]
+crbug.com/591099 media/video-src-invalid-remove.html [ Crash Pass ]
+crbug.com/591099 media/video-src-none.html [ Crash Pass ]
+crbug.com/591099 media/video-src-plus-source.html [ Crash Pass ]
+crbug.com/591099 media/video-src-remove.html [ Crash Pass ]
+crbug.com/591099 media/video-src-set.html [ Crash Pass ]
+crbug.com/591099 media/video-src-source.html [ Crash Pass ]
+crbug.com/591099 media/video-src.html [ Crash Pass ]
+crbug.com/591099 media/video-srcobject-mediastream-src-file.html [ Crash Pass ]
+crbug.com/591099 media/video-srcobject-mediastream.html [ Crash Pass ]
+crbug.com/591099 media/video-timeupdate-during-playback.html [ Crash Pass ]
 crbug.com/591099 media/video-transformed.html [ Failure ]
-crbug.com/591099 media/video-volume.html [ Crash ]
-crbug.com/591099 media/video-width-height.html [ Crash ]
+crbug.com/591099 media/video-volume.html [ Crash Pass ]
+crbug.com/591099 media/video-width-height.html [ Crash Pass ]
 crbug.com/591099 media/video-zoom-controls.html [ Failure ]
 crbug.com/591099 media/video-zoom.html [ Failure ]
-crbug.com/591099 media/viewport-in-standalone-media-document.html [ Crash ]
+crbug.com/591099 media/viewport-in-standalone-media-document.html [ Crash Pass ]
 crbug.com/591099 mhtml/data-uri-font.mht [ Failure ]
 crbug.com/591099 mhtml/image_document.mht [ Failure ]
 crbug.com/591099 mhtml/invalid-bad-boundary2.mht [ Failure ]
@@ -17769,7 +17777,7 @@
 crbug.com/591099 paint/frames/frameset-with-stacking-context-and-not-stacking-context-children.html [ Failure ]
 crbug.com/591099 paint/frames/frameset-with-stacking-contexts.html [ Failure ]
 crbug.com/591099 paint/high-contrast-mode/image-filter-all/text-on-backgrounds.html [ Failure ]
-crbug.com/591099 paint/images/animated-gif-last-frame-crash.html [ Crash ]
+crbug.com/591099 paint/images/animated-gif-last-frame-crash.html [ Crash Pass ]
 crbug.com/591099 paint/inline/focus-ring-under-absolute-with-relative-continuation.html [ Failure ]
 crbug.com/591099 paint/inline/outline-offset.html [ Failure ]
 crbug.com/591099 paint/invalidation/4774354.html [ Failure ]
@@ -17889,7 +17897,7 @@
 crbug.com/591099 paint/invalidation/compositing/overflow-into-content.html [ Failure ]
 crbug.com/591099 paint/invalidation/compositing/overlap-test-with-filter.html [ Failure ]
 crbug.com/591099 paint/invalidation/compositing/page-scale-repaint.html [ Failure ]
-crbug.com/591099 paint/invalidation/compositing/remove-squashed-layer-plus-move.html [ Crash ]
+crbug.com/591099 paint/invalidation/compositing/remove-squashed-layer-plus-move.html [ Crash Failure ]
 crbug.com/591099 paint/invalidation/compositing/repaint-overflow-scrolled-squashed-content.html [ Failure ]
 crbug.com/591099 paint/invalidation/compositing/repaint-squashed-layer-in-rect.html [ Failure ]
 crbug.com/591099 paint/invalidation/compositing/repaint-via-layout-offset.html [ Failure Pass ]
@@ -17992,7 +18000,7 @@
 crbug.com/591099 paint/invalidation/fixed.html [ Failure ]
 crbug.com/591099 paint/invalidation/flexbox/repaint-column-reverse.html [ Failure ]
 crbug.com/591099 paint/invalidation/flexbox/repaint-during-resize-no-flex.html [ Failure ]
-crbug.com/591099 paint/invalidation/flexbox/repaint-on-layout.html [ Crash ]
+crbug.com/591099 paint/invalidation/flexbox/repaint-on-layout.html [ Crash Failure ]
 crbug.com/591099 paint/invalidation/flexbox/repaint-on-margin-change.html [ Failure ]
 crbug.com/591099 paint/invalidation/flexbox/repaint-opacity-change.html [ Failure ]
 crbug.com/591099 paint/invalidation/flexbox/repaint-rtl-column.html [ Failure ]
@@ -18029,6 +18037,7 @@
 crbug.com/591099 paint/invalidation/inline-block-overflow-repaint.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/inline-block-overflow.html [ Failure ]
 crbug.com/591099 paint/invalidation/inline-block-resize.html [ Failure ]
+crbug.com/591099 paint/invalidation/inline-box-overflow-repaint.html [ Failure ]
 crbug.com/591099 paint/invalidation/inline-focus.html [ Failure ]
 crbug.com/591099 paint/invalidation/inline-outline-repaint-2.html [ Failure ]
 crbug.com/591099 paint/invalidation/inline-outline-repaint.html [ Failure ]
@@ -18097,7 +18106,7 @@
 crbug.com/591099 paint/invalidation/make-children-non-inline.html [ Failure ]
 crbug.com/591099 paint/invalidation/margin.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/mask-clip-change-stacking-child.html [ Failure ]
-crbug.com/591099 paint/invalidation/media-audio-no-spurious-repaints.html [ Crash ]
+crbug.com/591099 paint/invalidation/media-audio-no-spurious-repaints.html [ Crash Pass ]
 crbug.com/591099 paint/invalidation/mix-blend-mode-separate-stacking-context.html [ Failure ]
 crbug.com/591099 paint/invalidation/multi-subsequence-composited.html [ Failure ]
 crbug.com/591099 paint/invalidation/multi-subsequence-scrolled.html [ Failure ]
@@ -18179,7 +18188,7 @@
 crbug.com/591099 paint/invalidation/relayout-fixed-position-after-scale.html [ Failure ]
 crbug.com/591099 paint/invalidation/remove-block-after-layout.html [ Failure ]
 crbug.com/591099 paint/invalidation/remove-inline-after-layout.html [ Failure ]
-crbug.com/591099 paint/invalidation/remove-inline-block-descendant-of-flex.html [ Crash ]
+crbug.com/591099 paint/invalidation/remove-inline-block-descendant-of-flex.html [ Crash Failure ]
 crbug.com/591099 paint/invalidation/remove-inline-layer-after-layout.html [ Failure ]
 crbug.com/591099 paint/invalidation/renderer-destruction-by-invalidateSelection-crash.html [ Failure ]
 crbug.com/591099 paint/invalidation/repaint-across-writing-mode-boundary.html [ Failure ]
@@ -18229,6 +18238,7 @@
 crbug.com/591099 paint/invalidation/selection-after-delete.html [ Failure ]
 crbug.com/591099 paint/invalidation/selection-after-remove.html [ Failure ]
 crbug.com/591099 paint/invalidation/selection-change-in-iframe-with-relative-parent.html [ Failure ]
+crbug.com/591099 paint/invalidation/selection-clear-after-move.html [ Failure ]
 crbug.com/591099 paint/invalidation/selection-clear.html [ Failure ]
 crbug.com/591099 paint/invalidation/selection-partial-invalidation-between-blocks.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/selection-rl.html [ Failure ]
@@ -18245,7 +18255,7 @@
 crbug.com/591099 paint/invalidation/shadow-box-resize.html [ Failure ]
 crbug.com/591099 paint/invalidation/shadow-multiple.html [ Failure ]
 crbug.com/591099 paint/invalidation/shift-relative-positioned-container-with-image-addition.html [ Failure ]
-crbug.com/591099 paint/invalidation/shift-relative-positioned-container-with-image-removal.html [ Crash ]
+crbug.com/591099 paint/invalidation/shift-relative-positioned-container-with-image-removal.html [ Crash Failure ]
 crbug.com/591099 paint/invalidation/slider-thumb-drag-release.html [ Failure ]
 crbug.com/591099 paint/invalidation/slider-thumb-float.html [ Failure ]
 crbug.com/591099 paint/invalidation/stacked-diacritics.html [ Failure ]
@@ -18290,7 +18300,7 @@
 crbug.com/591099 paint/invalidation/svg/remove-background-property-on-root.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/svg/remove-outline-property-on-root.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/svg/repaint-moving-svg-and-div.xhtml [ Failure Pass ]
-crbug.com/591099 paint/invalidation/svg/resize-svg-invalidate-children.html [ Crash ]
+crbug.com/591099 paint/invalidation/svg/resize-svg-invalidate-children.html [ Crash Failure ]
 crbug.com/591099 paint/invalidation/svg/scroll-hit-test.xhtml [ Failure ]
 crbug.com/591099 paint/invalidation/svg/scrolling-embedded-svg-file-image-repaint-problem.html [ Failure ]
 crbug.com/591099 paint/invalidation/svg/svg-background-partial-redraw.html [ Failure ]
@@ -18372,7 +18382,7 @@
 crbug.com/591099 paint/printing/print-box-shadow.html [ Failure ]
 crbug.com/591099 paint/roundedrects/circle-with-shadow.html [ Failure Pass ]
 crbug.com/591099 paint/roundedrects/input-with-rounded-rect-and-shadow.html [ Failure ]
-crbug.com/591099 paint/selection/drag-caret.html [ Crash Timeout ]
+crbug.com/591099 paint/selection/drag-caret.html [ Crash Pass Timeout ]
 crbug.com/591099 paint/selection/text-selection-editing-crash.html [ Failure ]
 crbug.com/591099 paint/selection/text-selection-inline-block-rtl.html [ Failure ]
 crbug.com/591099 paint/selection/text-selection-inline-block.html [ Failure ]
@@ -18406,22 +18416,22 @@
 crbug.com/591099 paint/theme/adjust-progress-bar-size.html [ Failure Pass ]
 crbug.com/591099 paint/transforms/percentage-transform-fractional-box-size.html [ Failure ]
 crbug.com/591099 paint/transparency/compositing-alpha-fold-crash.html [ Failure ]
-crbug.com/591099 payments/payment-request-in-iframe-allowed.html [ Crash ]
-crbug.com/591099 payments/payment-request-in-iframe-nested-allowed.html [ Crash ]
-crbug.com/591099 payments/payment-request-in-iframe-nested-not-allowed.html [ Crash ]
-crbug.com/591099 payments/payment-request-in-iframe.html [ Crash ]
+crbug.com/591099 payments/payment-request-in-iframe-allowed.html [ Crash Pass ]
+crbug.com/591099 payments/payment-request-in-iframe-nested-allowed.html [ Crash Pass ]
+crbug.com/591099 payments/payment-request-in-iframe-nested-not-allowed.html [ Crash Failure ]
+crbug.com/591099 payments/payment-request-in-iframe.html [ Crash Failure ]
 crbug.com/591099 permissionclient/image-permissions.html [ Crash Failure ]
 crbug.com/591099 permissionclient/storage-permission-detached.html [ Crash Failure ]
-crbug.com/591099 plugins/change-widget-and-click-crash.html [ Crash ]
+crbug.com/591099 plugins/change-widget-and-click-crash.html [ Crash Failure ]
 crbug.com/591099 plugins/createScriptableObject-before-start.html [ Failure ]
-crbug.com/591099 plugins/embed-attributes-active.html [ Crash ]
+crbug.com/591099 plugins/embed-attributes-active.html [ Crash Pass ]
 crbug.com/591099 plugins/embed-attributes-style.html [ Failure ]
-crbug.com/591099 plugins/empty-per-context-data.html [ Crash ]
+crbug.com/591099 plugins/empty-per-context-data.html [ Crash Failure ]
 crbug.com/591099 plugins/focus-change-1-no-change.html [ Failure ]
 crbug.com/591099 plugins/focus-change-2-change-focus.html [ Failure ]
 crbug.com/591099 plugins/focus-change-3-change-blur.html [ Failure ]
 crbug.com/591099 plugins/focus-change-4-change-focus-and-blur.html [ Failure ]
-crbug.com/591099 plugins/focus.html [ Crash ]
+crbug.com/591099 plugins/focus.html [ Crash Failure ]
 crbug.com/591099 plugins/fullscreen-plugins-dont-reload.html [ Failure ]
 crbug.com/591099 plugins/hidden-iframe-with-swf-plugin.html [ Failure ]
 crbug.com/591099 plugins/iframe-plugin-bgcolor.html [ Failure ]
@@ -18431,32 +18441,32 @@
 crbug.com/591099 plugins/mouse-click-plugin-clears-selection.html [ Crash Failure ]
 crbug.com/591099 plugins/mouse-events-fixedpos.html [ Failure ]
 crbug.com/591099 plugins/mouse-events.html [ Failure ]
-crbug.com/591099 plugins/multiple-plugins.html [ Crash ]
+crbug.com/591099 plugins/multiple-plugins.html [ Crash Failure ]
 crbug.com/591099 plugins/navigator-mimeTypes-length.html [ Failure ]
 crbug.com/591099 plugins/navigator-plugins.html [ Failure ]
-crbug.com/591099 plugins/nested-plugin-objects.html [ Crash ]
-crbug.com/591099 plugins/object-onerror-placeholder.html [ Crash ]
-crbug.com/591099 plugins/object-onfocus-mutation-crash.html [ Crash ]
-crbug.com/591099 plugins/object-onload-placeholder.html [ Crash ]
+crbug.com/591099 plugins/nested-plugin-objects.html [ Crash Pass ]
+crbug.com/591099 plugins/object-onerror-placeholder.html [ Crash Pass ]
+crbug.com/591099 plugins/object-onfocus-mutation-crash.html [ Crash Pass ]
+crbug.com/591099 plugins/object-onload-placeholder.html [ Crash Pass ]
 crbug.com/591099 plugins/overlay-scrollbar-mouse-capture.html [ Failure ]
 crbug.com/591099 plugins/override-node-method.html [ Failure ]
-crbug.com/591099 plugins/page-scale-does-not-affect-plugin-height.html [ Crash ]
-crbug.com/591099 plugins/plugin-destroyed-enumerate.html [ Crash ]
+crbug.com/591099 plugins/page-scale-does-not-affect-plugin-height.html [ Crash Pass ]
+crbug.com/591099 plugins/plugin-destroyed-enumerate.html [ Crash Failure ]
 crbug.com/591099 plugins/plugin-initiate-popup-window.html [ Timeout ]
 crbug.com/591099 plugins/plugin-javascript-access.html [ Failure ]
 crbug.com/591099 plugins/plugin-paint-test.html [ Failure ]
-crbug.com/591099 plugins/plugin-remove-readystatechange.html [ Crash ]
-crbug.com/591099 plugins/plugin-remove-subframe.html [ Crash ]
+crbug.com/591099 plugins/plugin-remove-readystatechange.html [ Crash Pass ]
+crbug.com/591099 plugins/plugin-remove-subframe.html [ Crash Failure ]
 crbug.com/591099 plugins/plugin-scriptable.html [ Failure ]
 crbug.com/591099 plugins/plugin-synthetic-event-crash.html [ Failure ]
-crbug.com/591099 plugins/re-request-touch-events-crash.html [ Crash ]
+crbug.com/591099 plugins/re-request-touch-events-crash.html [ Crash Failure ]
 crbug.com/591099 plugins/refcount-leaks.html [ Failure ]
 crbug.com/591099 plugins/release-frame-content-window.html [ Failure ]
-crbug.com/591099 plugins/request-low-latency-touch.html [ Crash ]
+crbug.com/591099 plugins/request-low-latency-touch.html [ Crash Pass ]
 crbug.com/591099 plugins/sequential-focus.html [ Failure ]
-crbug.com/591099 plugins/simple-expando.html [ Crash ]
-crbug.com/591099 plugins/tabindex.html [ Crash ]
-crbug.com/591099 plugins/type-case.html [ Crash ]
+crbug.com/591099 plugins/simple-expando.html [ Crash Pass ]
+crbug.com/591099 plugins/tabindex.html [ Crash Failure ]
+crbug.com/591099 plugins/type-case.html [ Crash Pass ]
 crbug.com/591099 plugins/webview-plugin-lifecycle.html [ Failure Pass ]
 crbug.com/591099 plugins/webview-plugin-nested-iframe-scroll.html [ Failure ]
 crbug.com/591099 plugins/webview-plugin-scroll.html [ Failure Pass ]
@@ -18464,7 +18474,7 @@
 crbug.com/591099 pointer-lock/bug90391-move-then-window-open-crash.html [ Failure ]
 crbug.com/591099 pointer-lock/lock-already-locked.html [ Failure ]
 crbug.com/591099 pointer-lock/lock-element-not-in-dom.html [ Failure ]
-crbug.com/591099 pointer-lock/locked-element-iframe-removed-from-dom.html [ Crash ]
+crbug.com/591099 pointer-lock/locked-element-iframe-removed-from-dom.html [ Crash Failure ]
 crbug.com/591099 pointer-lock/locked-element-removed-from-dom.html [ Failure ]
 crbug.com/591099 pointer-lock/mouse-event-delivery.html [ Failure ]
 crbug.com/591099 pointer-lock/pointer-lock-api.html [ Failure ]
@@ -18473,18 +18483,18 @@
 crbug.com/591099 pointer-lock/pointerlockchange-pointerlockerror-events.html [ Failure ]
 crbug.com/591099 pointer-lock/pointerlockelement-null-when-pending.html [ Failure ]
 crbug.com/591099 presentation/presentation-controller-close-connection.html [ Crash Timeout ]
-crbug.com/591099 presentation/presentation-controller-connection-closed-by-receiver.html [ Crash Timeout ]
-crbug.com/591099 presentation/presentation-controller-terminate-connection.html [ Crash Timeout ]
-crbug.com/591099 presentation/presentation-navigation-multipleurls.html [ Crash ]
-crbug.com/591099 presentation/presentation-navigation.html [ Crash ]
-crbug.com/591099 presentation/presentation-receiver-terminate-connection.html [ Crash Timeout ]
+crbug.com/591099 presentation/presentation-controller-connection-closed-by-receiver.html [ Crash Pass Timeout ]
+crbug.com/591099 presentation/presentation-controller-terminate-connection.html [ Crash Pass Timeout ]
+crbug.com/591099 presentation/presentation-navigation-multipleurls.html [ Crash Pass ]
+crbug.com/591099 presentation/presentation-navigation.html [ Crash Pass ]
+crbug.com/591099 presentation/presentation-receiver-terminate-connection.html [ Crash Pass Timeout ]
 crbug.com/591099 presentation/presentation-reconnect.html [ Crash Timeout ]
-crbug.com/591099 presentation/presentation-request-iframe-default-success.html [ Crash ]
-crbug.com/591099 presentation/presentation-request-iframe-sandbox-error.html [ Crash ]
-crbug.com/591099 presentation/presentation-request-iframe-sandbox-success.html [ Crash ]
-crbug.com/591099 presentation/presentation-start-error.html [ Crash Timeout ]
+crbug.com/591099 presentation/presentation-request-iframe-default-success.html [ Crash Pass ]
+crbug.com/591099 presentation/presentation-request-iframe-sandbox-error.html [ Crash Pass ]
+crbug.com/591099 presentation/presentation-request-iframe-sandbox-success.html [ Crash Pass ]
+crbug.com/591099 presentation/presentation-start-error.html [ Crash Pass Timeout ]
 crbug.com/591099 presentation/presentation-start.html [ Crash Timeout ]
-crbug.com/591099 presentation/presentationconnectionavailableevent-ctor-mock.html [ Crash Timeout ]
+crbug.com/591099 presentation/presentationconnectionavailableevent-ctor-mock.html [ Crash Pass Timeout ]
 crbug.com/591099 printing/absolute-position-headers-and-footers.html [ Failure ]
 crbug.com/591099 printing/absolute-positioned.html [ Failure ]
 crbug.com/591099 printing/allowed-page-breaks.html [ Failure ]
@@ -18540,28 +18550,28 @@
 crbug.com/591099 printing/thead-repeats-at-top-of-each-page-multiple-tables.html [ Failure ]
 crbug.com/591099 printing/thead-repeats-at-top-of-each-page.html [ Failure ]
 crbug.com/591099 printing/viewport-size-dependant-iframe-with-multicol-crash.html [ Failure ]
-crbug.com/591099 resize-observer/observe.html [ Crash ]
-crbug.com/591099 screen_orientation/page-visibility.html [ Crash ]
-crbug.com/591099 screen_orientation/screenorientation-detached-notify-no-crash.html [ Crash ]
-crbug.com/591099 screen_orientation/screenorientation-unsupported-no-crash.html [ Crash ]
+crbug.com/591099 resize-observer/observe.html [ Crash Pass ]
+crbug.com/591099 screen_orientation/page-visibility.html [ Crash Pass ]
+crbug.com/591099 screen_orientation/screenorientation-detached-notify-no-crash.html [ Crash Pass ]
+crbug.com/591099 screen_orientation/screenorientation-unsupported-no-crash.html [ Crash Pass ]
 crbug.com/591099 scrollbars/auto-scrollbar-fit-content.html [ Failure ]
 crbug.com/591099 scrollbars/basic-scrollbar.html [ Failure ]
 crbug.com/591099 scrollbars/border-box-rect-clips-scrollbars.html [ Failure Pass ]
 crbug.com/591099 scrollbars/custom-scrollbar-changing-style-relayout-body-scrollablearea.html [ Crash Pass Timeout ]
 crbug.com/591099 scrollbars/custom-scrollbar-enable-changes-thickness-with-iframe.html [ Failure Pass ]
-crbug.com/591099 scrollbars/custom-scrollbar-not-inherited-by-iframe.html [ Crash ]
-crbug.com/591099 scrollbars/custom-scrollbar-reconstruction-document-write.html [ Crash ]
+crbug.com/591099 scrollbars/custom-scrollbar-not-inherited-by-iframe.html [ Crash Pass ]
+crbug.com/591099 scrollbars/custom-scrollbar-reconstruction-document-write.html [ Crash Pass ]
 crbug.com/591099 scrollbars/custom-scrollbar-with-incomplete-style.html [ Failure ]
 crbug.com/591099 scrollbars/disabled-scrollbar.html [ Failure ]
 crbug.com/591099 scrollbars/hidden-iframe-scrollbar-crash.html [ Crash Failure ]
 crbug.com/591099 scrollbars/hidden-scrollbar-prevents-layout.html [ Failure ]
-crbug.com/591099 scrollbars/iframe-scrollbar-becomes-custom.html [ Crash ]
+crbug.com/591099 scrollbars/iframe-scrollbar-becomes-custom.html [ Crash Pass ]
 crbug.com/591099 scrollbars/listbox-scrollbar-combinations.html [ Failure ]
-crbug.com/591099 scrollbars/scrollable-iframe-click-gets-focus.html [ Crash ]
-crbug.com/591099 scrollbars/scrollable-iframe-remove-crash.html [ Crash ]
+crbug.com/591099 scrollbars/scrollable-iframe-click-gets-focus.html [ Crash Pass ]
+crbug.com/591099 scrollbars/scrollable-iframe-remove-crash.html [ Crash Pass ]
 crbug.com/591099 scrollbars/scrollbar-added-during-drag.html [ Timeout ]
 crbug.com/591099 scrollbars/scrollbar-buttons.html [ Failure ]
-crbug.com/591099 scrollbars/scrollbar-click-does-not-blur-content.html [ Crash ]
+crbug.com/591099 scrollbars/scrollbar-click-does-not-blur-content.html [ Crash Failure ]
 crbug.com/591099 scrollbars/scrollbar-content-crash.html [ Failure ]
 crbug.com/591099 scrollbars/scrollbar-crash-on-refresh.html [ Failure ]
 crbug.com/591099 scrollbars/scrollbar-miss-mousemove-disabled.html [ Failure ]
@@ -18573,7 +18583,7 @@
 crbug.com/591099 scrollbars/scrollbar-visibility-hidden.html [ Failure ]
 crbug.com/591099 scrollbars/scrollbars-on-positioned-content.html [ Failure ]
 crbug.com/591099 scrollbars/viewport-scrollbar-corner-with-percent-padding-crash.html [ Failure ]
-crbug.com/591099 scrollingcoordinator/donot-compute-non-fast-scrollable-region-for-hidden-frames.html [ Crash Timeout ]
+crbug.com/591099 scrollingcoordinator/donot-compute-non-fast-scrollable-region-for-hidden-frames.html [ Crash Pass Timeout ]
 crbug.com/591099 scrollingcoordinator/non-fast-scrollable-region-nested.html [ Failure ]
 crbug.com/591099 scrollingcoordinator/non-fast-scrollable-region-scaled-iframe.html [ Failure ]
 crbug.com/591099 scrollingcoordinator/non-fast-scrollable-region-transformed-iframe.html [ Failure ]
@@ -18583,41 +18593,41 @@
 crbug.com/591099 security/autocomplete-cleared-on-back.html [ Crash Failure ]
 crbug.com/591099 security/block-test-no-port.html [ Crash Failure ]
 crbug.com/591099 security/block-test.html [ Crash Failure ]
-crbug.com/591099 security/cannot-read-self-from-file.html [ Crash ]
-crbug.com/591099 sensor/accelerometer.html [ Crash ]
-crbug.com/591099 sensor/orientation-sensor.html [ Crash ]
-crbug.com/591099 shadow-dom/crashes/focus-navigation-infinite-loop.html [ Crash ]
+crbug.com/591099 security/cannot-read-self-from-file.html [ Crash Pass ]
+crbug.com/591099 sensor/accelerometer.html [ Crash Pass ]
+crbug.com/591099 sensor/orientation-sensor.html [ Crash Pass ]
+crbug.com/591099 shadow-dom/crashes/focus-navigation-infinite-loop.html [ Crash Pass ]
 crbug.com/591099 shadow-dom/css-cascade-inner-scope-important.html [ Failure ]
 crbug.com/591099 shadow-dom/css-cascade-outer-scope.html [ Failure ]
 crbug.com/591099 shadow-dom/css-cascade-slot-distributed.html [ Failure ]
-crbug.com/591099 shadow-dom/css-focus-pseudo-match-shadow-host2.html [ Crash ]
-crbug.com/591099 shadow-dom/css-focus-pseudo-match-shadow-host5.html [ Crash ]
-crbug.com/591099 shadow-dom/delegatesFocus-highlight-sibling.html [ Crash ]
+crbug.com/591099 shadow-dom/css-focus-pseudo-match-shadow-host2.html [ Crash Pass ]
+crbug.com/591099 shadow-dom/css-focus-pseudo-match-shadow-host5.html [ Crash Pass ]
+crbug.com/591099 shadow-dom/delegatesFocus-highlight-sibling.html [ Crash Pass ]
 crbug.com/591099 shadow-dom/event-composed-ua.html [ Timeout ]
-crbug.com/591099 shadow-dom/focus-method-with-delegatesFocus.html [ Crash ]
-crbug.com/591099 shadow-dom/focus-navigation-slot-fallback.html [ Crash ]
-crbug.com/591099 shadow-dom/focus-navigation-slot-nested-2levels.html [ Crash ]
-crbug.com/591099 shadow-dom/focus-navigation-slot-nested-delegatesFocus.html [ Crash ]
-crbug.com/591099 shadow-dom/focus-navigation-slot-nested.html [ Crash ]
-crbug.com/591099 shadow-dom/focus-navigation-slot-with-tabindex.html [ Crash ]
-crbug.com/591099 shadow-dom/focus-navigation-slots.html [ Crash ]
+crbug.com/591099 shadow-dom/focus-method-with-delegatesFocus.html [ Crash Pass ]
+crbug.com/591099 shadow-dom/focus-navigation-slot-fallback.html [ Crash Pass ]
+crbug.com/591099 shadow-dom/focus-navigation-slot-nested-2levels.html [ Crash Pass ]
+crbug.com/591099 shadow-dom/focus-navigation-slot-nested-delegatesFocus.html [ Crash Pass ]
+crbug.com/591099 shadow-dom/focus-navigation-slot-nested.html [ Crash Pass ]
+crbug.com/591099 shadow-dom/focus-navigation-slot-with-tabindex.html [ Crash Pass ]
+crbug.com/591099 shadow-dom/focus-navigation-slots.html [ Crash Pass ]
 crbug.com/591099 shadow-dom/focus-navigation-with-delegatesFocus.html [ Failure Timeout ]
-crbug.com/591099 shadow-dom/focus-navigation.html [ Crash ]
-crbug.com/591099 shadow-dom/focus-slide-on-shadow-host.html [ Crash ]
-crbug.com/591099 shadow-dom/focus-with-negative-index.html [ Crash ]
-crbug.com/591099 shadow-dom/nodetree-labels-node-list.html [ Crash ]
-crbug.com/591099 shadow-dom/nodetree-radio-node-list.html [ Crash ]
-crbug.com/591099 shadow-dom/pointer-lock-in-shadow.html [ Crash ]
+crbug.com/591099 shadow-dom/focus-navigation.html [ Crash Pass ]
+crbug.com/591099 shadow-dom/focus-slide-on-shadow-host.html [ Crash Pass ]
+crbug.com/591099 shadow-dom/focus-with-negative-index.html [ Crash Pass ]
+crbug.com/591099 shadow-dom/nodetree-labels-node-list.html [ Crash Pass ]
+crbug.com/591099 shadow-dom/nodetree-radio-node-list.html [ Crash Pass ]
+crbug.com/591099 shadow-dom/pointer-lock-in-shadow.html [ Crash Pass ]
 crbug.com/591099 shadow-dom/slotted-pseudo-element-in-v0-tree-crash.html [ Failure ]
-crbug.com/591099 shadow-dom/v0/event-composed-path.html [ Crash ]
+crbug.com/591099 shadow-dom/v0/event-composed-path.html [ Crash Pass ]
 crbug.com/591099 shadow-dom/v0/get-destination-insertion-points-re-distribution.html [ Failure ]
 crbug.com/591099 shadow-dom/v0/get-destination-insertion-points.html [ Failure ]
 crbug.com/591099 shadow-dom/v0/multiple-shadowroot-with-params.html [ Failure ]
-crbug.com/591099 shadow-dom/v0/pointer-lock-in-shadow.html [ Crash ]
-crbug.com/591099 shadow-dom/v0/pointer-lock-in-shadow2.html [ Crash ]
-crbug.com/591099 shadow-dom/v0/pointer-lock-in-shadow3.html [ Crash ]
-crbug.com/591099 shapedetection/detection-HTMLImageElement.html [ Crash ]
-crbug.com/591099 shapedetection/detection-options.html [ Crash ]
+crbug.com/591099 shadow-dom/v0/pointer-lock-in-shadow.html [ Crash Pass ]
+crbug.com/591099 shadow-dom/v0/pointer-lock-in-shadow2.html [ Crash Pass ]
+crbug.com/591099 shadow-dom/v0/pointer-lock-in-shadow3.html [ Crash Pass ]
+crbug.com/591099 shapedetection/detection-HTMLImageElement.html [ Crash Pass ]
+crbug.com/591099 shapedetection/detection-options.html [ Crash Pass ]
 crbug.com/591099 storage/domstorage/clear.html [ Failure ]
 crbug.com/591099 storage/domstorage/complex-keys.html [ Failure ]
 crbug.com/591099 storage/domstorage/complex-values.html [ Failure ]
@@ -18867,20 +18877,20 @@
 crbug.com/591099 storage/quota/storagequota-query-usage.html [ Failure ]
 crbug.com/591099 storage/quota/storagequota-request-quota.html [ Failure ]
 crbug.com/591099 storage/websql/close-during-stress-test.html [ Failure ]
-crbug.com/591099 storage/websql/database-removed-context-crash.html [ Crash ]
+crbug.com/591099 storage/websql/database-removed-context-crash.html [ Crash Pass ]
 crbug.com/591099 storage/websql/execute-sql-rowsAffected.html [ Failure ]
 crbug.com/591099 storage/websql/null-characters.html [ Failure ]
-crbug.com/591099 storage/websql/transaction-removed-context-crash.html [ Crash ]
-crbug.com/591099 svg/animations/accumulate-use-count.html [ Crash ]
+crbug.com/591099 storage/websql/transaction-removed-context-crash.html [ Crash Pass ]
+crbug.com/591099 svg/animations/accumulate-use-count.html [ Crash Pass ]
 crbug.com/591099 svg/animations/accumulate-values-width-animation.html [ Failure ]
-crbug.com/591099 svg/animations/add-after-load-use-counter.html [ Crash ]
+crbug.com/591099 svg/animations/add-after-load-use-counter.html [ Crash Pass ]
 crbug.com/591099 svg/animations/additive-from-to-width-animation.html [ Failure ]
 crbug.com/591099 svg/animations/additive-type-by-animation.html [ Failure Timeout ]
-crbug.com/591099 svg/animations/additive-use-count.html [ Crash ]
+crbug.com/591099 svg/animations/additive-use-count.html [ Crash Pass ]
 crbug.com/591099 svg/animations/additive-values-width-animation.html [ Failure ]
 crbug.com/591099 svg/animations/animVal-basics.html [ Timeout ]
 crbug.com/591099 svg/animations/animate-calcMode-spline-by.html [ Timeout ]
-crbug.com/591099 svg/animations/animate-calcMode-spline-crash-bad-array-length.xhtml [ Crash ]
+crbug.com/591099 svg/animations/animate-calcMode-spline-crash-bad-array-length.xhtml [ Crash Pass ]
 crbug.com/591099 svg/animations/animate-calcMode-spline-from-by.html [ Timeout ]
 crbug.com/591099 svg/animations/animate-calcMode-spline-from-to.html [ Timeout ]
 crbug.com/591099 svg/animations/animate-calcMode-spline-to.html [ Timeout ]
@@ -18922,7 +18932,7 @@
 crbug.com/591099 svg/animations/animate-insert-begin.html [ Failure ]
 crbug.com/591099 svg/animations/animate-insert-no-begin.html [ Failure ]
 crbug.com/591099 svg/animations/animate-keySplines.html [ Timeout ]
-crbug.com/591099 svg/animations/animate-keysplines-crash.html [ Crash ]
+crbug.com/591099 svg/animations/animate-keysplines-crash.html [ Crash Pass ]
 crbug.com/591099 svg/animations/animate-marker-orient-from-angle-to-angle.html [ Timeout ]
 crbug.com/591099 svg/animations/animate-marker-orient-from-angle-to-auto.html [ Timeout ]
 crbug.com/591099 svg/animations/animate-marker-orient-from-auto-to-angle.html [ Timeout ]
@@ -18944,7 +18954,7 @@
 crbug.com/591099 svg/animations/animate-path-to-animation.html [ Timeout ]
 crbug.com/591099 svg/animations/animate-setcurrenttime.html [ Failure ]
 crbug.com/591099 svg/animations/animate-text-nested-transforms.html [ Timeout ]
-crbug.com/591099 svg/animations/animate-values-whitespace.html [ Crash ]
+crbug.com/591099 svg/animations/animate-values-whitespace.html [ Crash Pass ]
 crbug.com/591099 svg/animations/animateMotion-fill-freeze.html [ Failure ]
 crbug.com/591099 svg/animations/animateMotion-fill-remove.html [ Failure ]
 crbug.com/591099 svg/animations/animateMotion-multiple.html [ Failure ]
@@ -18953,13 +18963,13 @@
 crbug.com/591099 svg/animations/animateTransform-translate-attributetype-auto.html [ Timeout ]
 crbug.com/591099 svg/animations/animateTransform-translate-invalid-attributetype.html [ Timeout ]
 crbug.com/591099 svg/animations/animation-begin-change-js.html [ Timeout ]
-crbug.com/591099 svg/animations/animation-dependency-crash.html [ Crash ]
-crbug.com/591099 svg/animations/animation-started-use-counter.html [ Crash ]
-crbug.com/591099 svg/animations/animationElementTiming-use-counter.html [ Crash ]
+crbug.com/591099 svg/animations/animation-dependency-crash.html [ Crash Pass ]
+crbug.com/591099 svg/animations/animation-started-use-counter.html [ Crash Pass ]
+crbug.com/591099 svg/animations/animationElementTiming-use-counter.html [ Crash Pass ]
 crbug.com/591099 svg/animations/attributeTypes.html [ Failure ]
-crbug.com/591099 svg/animations/begin-use-counters.html [ Crash ]
-crbug.com/591099 svg/animations/beginEndAnimationElement-use-counter.html [ Crash ]
-crbug.com/591099 svg/animations/calcMode-use-counters.html [ Crash ]
+crbug.com/591099 svg/animations/begin-use-counters.html [ Crash Pass ]
+crbug.com/591099 svg/animations/beginEndAnimationElement-use-counter.html [ Crash Pass ]
+crbug.com/591099 svg/animations/calcMode-use-counters.html [ Crash Pass ]
 crbug.com/591099 svg/animations/change-baseVal-while-animating-fill-freeze-2.html [ Failure ]
 crbug.com/591099 svg/animations/change-baseVal-while-animating-fill-freeze.html [ Failure ]
 crbug.com/591099 svg/animations/change-baseVal-while-animating-fill-remove-2.html [ Failure ]
@@ -18967,32 +18977,32 @@
 crbug.com/591099 svg/animations/change-css-property-while-animating-fill-freeze.html [ Failure ]
 crbug.com/591099 svg/animations/change-css-property-while-animating-fill-remove.html [ Failure ]
 crbug.com/591099 svg/animations/change-target-while-animating-SVG-property.html [ Failure ]
-crbug.com/591099 svg/animations/cssanimation-inactivedocument-crash.html [ Crash ]
-crbug.com/591099 svg/animations/currentTime-use-counter.html [ Crash ]
+crbug.com/591099 svg/animations/cssanimation-inactivedocument-crash.html [ Crash Pass ]
+crbug.com/591099 svg/animations/currentTime-use-counter.html [ Crash Pass ]
 crbug.com/591099 svg/animations/cyclic-syncbase.html [ Failure ]
 crbug.com/591099 svg/animations/deferred-insertion.html [ Timeout ]
 crbug.com/591099 svg/animations/discard-on-discard.html [ Failure ]
-crbug.com/591099 svg/animations/discard-on-svg-crash-2.html [ Crash ]
-crbug.com/591099 svg/animations/discard-on-svg-crash.html [ Crash ]
-crbug.com/591099 svg/animations/dynamic-modify-transform-without-baseval.html [ Crash ]
-crbug.com/591099 svg/animations/end-use-counters.html [ Crash ]
+crbug.com/591099 svg/animations/discard-on-svg-crash-2.html [ Crash Failure ]
+crbug.com/591099 svg/animations/discard-on-svg-crash.html [ Crash Pass ]
+crbug.com/591099 svg/animations/dynamic-modify-transform-without-baseval.html [ Crash Pass ]
+crbug.com/591099 svg/animations/end-use-counters.html [ Crash Pass ]
 crbug.com/591099 svg/animations/force-use-shadow-tree-recreation-while-animating.html [ Failure ]
-crbug.com/591099 svg/animations/img-tag-css-length-animation-crash.html [ Crash ]
+crbug.com/591099 svg/animations/img-tag-css-length-animation-crash.html [ Crash Pass ]
 crbug.com/591099 svg/animations/multiple-animations-ending.html [ Failure Timeout ]
 crbug.com/591099 svg/animations/multiple-animations-fill-freeze.html [ Failure ]
 crbug.com/591099 svg/animations/multiple-begin-additive-animation.html [ Failure ]
 crbug.com/591099 svg/animations/non-additive-type-by-animation.html [ Failure ]
 crbug.com/591099 svg/animations/non-additive-type-from-by-animation.html [ Failure ]
-crbug.com/591099 svg/animations/pause-setcurrenttime-unpause-before-timeline-start.html [ Crash ]
-crbug.com/591099 svg/animations/pausing-use-counter.html [ Crash ]
+crbug.com/591099 svg/animations/pause-setcurrenttime-unpause-before-timeline-start.html [ Crash Pass ]
+crbug.com/591099 svg/animations/pausing-use-counter.html [ Crash Pass ]
 crbug.com/591099 svg/animations/reinserting-svg-into-document.html [ Failure ]
 crbug.com/591099 svg/animations/remove-animation-element-while-animation-is-running.html [ Failure ]
 crbug.com/591099 svg/animations/repeatn-remove-add-animation.html [ Failure ]
-crbug.com/591099 svg/animations/script-href-no-animate.html [ Crash ]
+crbug.com/591099 svg/animations/script-href-no-animate.html [ Crash Pass ]
 crbug.com/591099 svg/animations/single-values-animation.html [ Failure ]
-crbug.com/591099 svg/animations/smil-element-target-crash-main.html [ Crash ]
+crbug.com/591099 svg/animations/smil-element-target-crash-main.html [ Crash Pass ]
 crbug.com/591099 svg/animations/smil-scheduled-in-inactive-document-crash.html [ Failure ]
-crbug.com/591099 svg/animations/svg-animation-parseValues.html [ Crash ]
+crbug.com/591099 svg/animations/svg-animation-parseValues.html [ Crash Pass ]
 crbug.com/591099 svg/animations/svg-animation-policy-none.html [ Failure ]
 crbug.com/591099 svg/animations/svg-animation-policy-once.html [ Failure ]
 crbug.com/591099 svg/animations/svgPreserveAspectRatio-animation-1.html [ Timeout ]
@@ -19071,12 +19081,12 @@
 crbug.com/591099 svg/animations/svgstring-animation-fallback-to-discrete.html [ Timeout ]
 crbug.com/591099 svg/animations/svgtransform-animation-1.html [ Timeout ]
 crbug.com/591099 svg/animations/svgtransform-animation-discrete.html [ Timeout ]
-crbug.com/591099 svg/animations/target-condition-crash.html [ Crash ]
-crbug.com/591099 svg/animations/target-move-crash.html [ Crash ]
-crbug.com/591099 svg/animations/target-move-relative-length-invalidation-crash.html [ Crash ]
+crbug.com/591099 svg/animations/target-condition-crash.html [ Crash Pass ]
+crbug.com/591099 svg/animations/target-move-crash.html [ Crash Pass ]
+crbug.com/591099 svg/animations/target-move-relative-length-invalidation-crash.html [ Crash Pass ]
 crbug.com/591099 svg/animations/use-animate-transform-and-position.html [ Timeout ]
 crbug.com/591099 svg/animations/use-animate-width-and-height.html [ Timeout ]
-crbug.com/591099 svg/animations/use-while-animating-crash.html [ Crash ]
+crbug.com/591099 svg/animations/use-while-animating-crash.html [ Crash Pass ]
 crbug.com/591099 svg/as-background-image/animated-svg-as-background.html [ Failure Pass ]
 crbug.com/591099 svg/as-background-image/background-image-preserveaspectRatio-support.html [ Failure Pass ]
 crbug.com/591099 svg/as-background-image/background-image-tiled.html [ Failure Pass ]
@@ -19094,18 +19104,18 @@
 crbug.com/591099 svg/as-background-image/svg-width-100p-as-background.html [ Failure Pass ]
 crbug.com/591099 svg/as-border-image/svg-as-border-image-2.html [ Failure ]
 crbug.com/591099 svg/as-border-image/svg-as-border-image.html [ Failure ]
-crbug.com/591099 svg/as-iframe/svg-in-iframe.html [ Crash ]
+crbug.com/591099 svg/as-iframe/svg-in-iframe.html [ Crash Pass ]
 crbug.com/591099 svg/as-image/animated-use-as-image-crash.html [ Failure ]
-crbug.com/591099 svg/as-image/data-font-in-css-crash.html [ Crash ]
-crbug.com/591099 svg/as-image/data-font-in-css-invalid-data-url-crash.html [ Crash ]
-crbug.com/591099 svg/as-image/data-font-in-css-invalid-font-crash.html [ Crash ]
+crbug.com/591099 svg/as-image/data-font-in-css-crash.html [ Crash Pass ]
+crbug.com/591099 svg/as-image/data-font-in-css-invalid-data-url-crash.html [ Crash Pass ]
+crbug.com/591099 svg/as-image/data-font-in-css-invalid-font-crash.html [ Crash Pass ]
 crbug.com/591099 svg/as-image/image-respects-deviceScaleFactor.html [ Failure ]
 crbug.com/591099 svg/as-image/image-respects-pageScaleFactor-change.html [ Failure ]
 crbug.com/591099 svg/as-image/image-respects-pageScaleFactor.html [ Failure ]
 crbug.com/591099 svg/as-image/img-preserveAspectRatio-support-1.html [ Failure Pass ]
 crbug.com/591099 svg/as-image/img-preserveAspectRatio-support-2.html [ Failure Pass ]
 crbug.com/591099 svg/as-image/same-image-two-instances.html [ Failure Pass ]
-crbug.com/591099 svg/as-image/svg-as-image-intrinsic-size.html [ Crash ]
+crbug.com/591099 svg/as-image/svg-as-image-intrinsic-size.html [ Crash Pass ]
 crbug.com/591099 svg/as-image/svg-as-image.html [ Failure ]
 crbug.com/591099 svg/as-image/svg-as-relative-image-with-explicit-size.html [ Failure ]
 crbug.com/591099 svg/as-image/svg-as-relative-image.html [ Failure ]
@@ -19121,27 +19131,27 @@
 crbug.com/591099 svg/as-object/svg-embedded-in-html-in-iframe.html [ Failure Pass Timeout ]
 crbug.com/591099 svg/canvas/canvas-default-object-sizing.html [ Failure Pass ]
 crbug.com/591099 svg/canvas/canvas-draw-image-globalalpha.html [ Failure Pass ]
-crbug.com/591099 svg/canvas/canvas-draw-image-size.html [ Crash ]
+crbug.com/591099 svg/canvas/canvas-draw-image-size.html [ Crash Pass ]
 crbug.com/591099 svg/canvas/canvas-draw-image-svg-fragment.html [ Crash Pass ]
-crbug.com/591099 svg/canvas/canvas-draw-pattern-size.html [ Crash ]
+crbug.com/591099 svg/canvas/canvas-draw-pattern-size.html [ Crash Pass ]
 crbug.com/591099 svg/canvas/canvas-draw-pattern-svg-fragment.html [ Crash Pass ]
 crbug.com/591099 svg/canvas/canvas-pattern-svg.html [ Failure ]
-crbug.com/591099 svg/canvas/image-svg-intrinsic-size.html [ Crash ]
+crbug.com/591099 svg/canvas/image-svg-intrinsic-size.html [ Crash Pass ]
 crbug.com/591099 svg/carto.net/frameless-svg-parse-error.html [ Failure ]
-crbug.com/591099 svg/clip-path/clip-path-foreign-object-crash.html [ Crash ]
+crbug.com/591099 svg/clip-path/clip-path-foreign-object-crash.html [ Crash Pass ]
 crbug.com/591099 svg/css/background-image-svg.html [ Crash Failure Pass ]
-crbug.com/591099 svg/css/baseline-shift-inherit.html [ Crash ]
+crbug.com/591099 svg/css/baseline-shift-inherit.html [ Crash Pass ]
 crbug.com/591099 svg/css/buffered-rendering.html [ Failure ]
 crbug.com/591099 svg/css/css-box-min-width.html [ Failure ]
-crbug.com/591099 svg/css/display-computed.html [ Crash ]
+crbug.com/591099 svg/css/display-computed.html [ Crash Pass ]
 crbug.com/591099 svg/css/getComputedStyle-listing.xhtml [ Failure ]
-crbug.com/591099 svg/css/getComputedStyle-svg-text-width-height.html [ Crash ]
+crbug.com/591099 svg/css/getComputedStyle-svg-text-width-height.html [ Crash Pass ]
 crbug.com/591099 svg/css/mask-type.html [ Failure ]
 crbug.com/591099 svg/css/max-height.html [ Failure ]
 crbug.com/591099 svg/css/max-width.html [ Failure ]
 crbug.com/591099 svg/css/opacity-not-supporting-percentage.html [ Failure ]
 crbug.com/591099 svg/css/parse-length.html [ Failure ]
-crbug.com/591099 svg/css/path-element.html [ Crash ]
+crbug.com/591099 svg/css/path-element.html [ Crash Pass ]
 crbug.com/591099 svg/css/rect-system-color.xhtml [ Failure ]
 crbug.com/591099 svg/css/scientific-numbers.html [ Failure ]
 crbug.com/591099 svg/css/svg-attribute-length-parsing.html [ Failure ]
@@ -19154,9 +19164,9 @@
 crbug.com/591099 svg/custom/absolute-sized-svg-in-xhtml.xhtml [ Failure ]
 crbug.com/591099 svg/custom/acid3-test-77.html [ Failure ]
 crbug.com/591099 svg/custom/anchor-on-use.svg [ Failure ]
-crbug.com/591099 svg/custom/animate-initial-pause-unpause.html [ Crash ]
-crbug.com/591099 svg/custom/animate-pause-resume.html [ Crash ]
-crbug.com/591099 svg/custom/animate-svgsvgelement.html [ Crash ]
+crbug.com/591099 svg/custom/animate-initial-pause-unpause.html [ Crash Pass ]
+crbug.com/591099 svg/custom/animate-pause-resume.html [ Crash Pass ]
+crbug.com/591099 svg/custom/animate-svgsvgelement.html [ Crash Pass ]
 crbug.com/591099 svg/custom/animation-values-parsing-error.html [ Failure ]
 crbug.com/591099 svg/custom/bad-attributeName-crash.html [ Failure ]
 crbug.com/591099 svg/custom/boundingBox.html [ Failure ]
@@ -19168,13 +19178,13 @@
 crbug.com/591099 svg/custom/crash-textPath-attributes.html [ Failure ]
 crbug.com/591099 svg/custom/createImageElement2.xhtml [ Failure ]
 crbug.com/591099 svg/custom/currentColor-on-color.html [ Failure ]
-crbug.com/591099 svg/custom/disallow-non-lengths-in-attrs.html [ Crash ]
-crbug.com/591099 svg/custom/display-none-a-does-not-stop-focus-navigation.html [ Crash ]
+crbug.com/591099 svg/custom/disallow-non-lengths-in-attrs.html [ Crash Pass ]
+crbug.com/591099 svg/custom/display-none-a-does-not-stop-focus-navigation.html [ Crash Pass ]
 crbug.com/591099 svg/custom/dominant-baseline-hanging.svg [ Failure ]
 crbug.com/591099 svg/custom/elementTimeControl-nan-crash.html [ Failure ]
 crbug.com/591099 svg/custom/embedded-svg-allowed-in-dashboard.xml [ Failure ]
 crbug.com/591099 svg/custom/embedding-external-svgs.xhtml [ Failure Pass ]
-crbug.com/591099 svg/custom/events-in-shadow-tree.html [ Crash ]
+crbug.com/591099 svg/custom/events-in-shadow-tree.html [ Crash Pass ]
 crbug.com/591099 svg/custom/external-paintserver-reference.svg [ Failure Pass ]
 crbug.com/591099 svg/custom/filter-css-transform-resolution.html [ Failure Pass ]
 crbug.com/591099 svg/custom/focus-event-handling-keyboard.xhtml [ Failure ]
@@ -19183,13 +19193,13 @@
 crbug.com/591099 svg/custom/fragment-navigation-01.html [ Failure ]
 crbug.com/591099 svg/custom/fragment-navigation-02.html [ Failure ]
 crbug.com/591099 svg/custom/frame-getSVGDocument.html [ Failure ]
-crbug.com/591099 svg/custom/getBBox-circle-has-one-zero-value.html [ Crash ]
-crbug.com/591099 svg/custom/getBBox-ellipse-has-one-zero-value.html [ Crash ]
-crbug.com/591099 svg/custom/getBBox-empty-container.html [ Crash ]
-crbug.com/591099 svg/custom/getBBox-rect-has-one-zero-value.html [ Crash ]
-crbug.com/591099 svg/custom/getBBox-use.html [ Crash ]
+crbug.com/591099 svg/custom/getBBox-circle-has-one-zero-value.html [ Crash Pass ]
+crbug.com/591099 svg/custom/getBBox-ellipse-has-one-zero-value.html [ Crash Pass ]
+crbug.com/591099 svg/custom/getBBox-empty-container.html [ Crash Pass ]
+crbug.com/591099 svg/custom/getBBox-rect-has-one-zero-value.html [ Crash Pass ]
+crbug.com/591099 svg/custom/getBBox-use.html [ Crash Pass ]
 crbug.com/591099 svg/custom/getBoundingClientRect.xhtml [ Failure ]
-crbug.com/591099 svg/custom/getClientRects.html [ Crash ]
+crbug.com/591099 svg/custom/getClientRects.html [ Crash Pass ]
 crbug.com/591099 svg/custom/getscreenctm-in-mixed-content.xhtml [ Failure ]
 crbug.com/591099 svg/custom/getscreenctm-in-mixed-content2.xhtml [ Failure ]
 crbug.com/591099 svg/custom/getscreenctm-in-scrollable-div-area-nested.xhtml [ Failure ]
@@ -19203,7 +19213,7 @@
 crbug.com/591099 svg/custom/image-parent-translation.xhtml [ Failure ]
 crbug.com/591099 svg/custom/image-rescale-clip.html [ Failure ]
 crbug.com/591099 svg/custom/image-rescale-scroll.html [ Failure ]
-crbug.com/591099 svg/custom/image-svgload-after-docload.html [ Crash ]
+crbug.com/591099 svg/custom/image-svgload-after-docload.html [ Crash Pass ]
 crbug.com/591099 svg/custom/image-with-attr-change-after-delete-crash.html [ Crash Pass ]
 crbug.com/591099 svg/custom/inline-svg-in-xhtml.xml [ Failure ]
 crbug.com/591099 svg/custom/inline-svg-use-available-width-in-stf.html [ Failure ]
@@ -19213,10 +19223,10 @@
 crbug.com/591099 svg/custom/junk-data.svg [ Failure ]
 crbug.com/591099 svg/custom/keySplines-parsing-error.html [ Failure ]
 crbug.com/591099 svg/custom/keyTimes-parsing-error.html [ Failure ]
-crbug.com/591099 svg/custom/load-image-removed-in-onload.html [ Crash ]
-crbug.com/591099 svg/custom/load-image-reparented-in-onload.html [ Crash ]
+crbug.com/591099 svg/custom/load-image-removed-in-onload.html [ Crash Pass ]
+crbug.com/591099 svg/custom/load-image-reparented-in-onload.html [ Crash Pass ]
 crbug.com/591099 svg/custom/load-non-wellformed.svg [ Failure ]
-crbug.com/591099 svg/custom/load-svgfragments-inserted-after-docload.html [ Crash ]
+crbug.com/591099 svg/custom/load-svgfragments-inserted-after-docload.html [ Crash Pass ]
 crbug.com/591099 svg/custom/manually-parsed-embedded-svg-allowed-in-dashboard.html [ Failure ]
 crbug.com/591099 svg/custom/manually-parsed-svg-allowed-in-dashboard.html [ Failure ]
 crbug.com/591099 svg/custom/marker-orient-auto.html [ Failure ]
@@ -19230,7 +19240,7 @@
 crbug.com/591099 svg/custom/object-sizing-explicit-width-height.xhtml [ Failure Pass ]
 crbug.com/591099 svg/custom/object-sizing-explicit-width.xhtml [ Failure ]
 crbug.com/591099 svg/custom/object-sizing-no-width-height.xhtml [ Failure ]
-crbug.com/591099 svg/custom/object-sizing-zero-intrinsic-width-height.html [ Crash ]
+crbug.com/591099 svg/custom/object-sizing-zero-intrinsic-width-height.html [ Crash Pass ]
 crbug.com/591099 svg/custom/object-sizing.xhtml [ Crash Failure ]
 crbug.com/591099 svg/custom/path-bad-data.svg [ Failure ]
 crbug.com/591099 svg/custom/pattern-3-step-cycle-dynamic-1.html [ Failure ]
@@ -19245,13 +19255,13 @@
 crbug.com/591099 svg/custom/pointer-events-on-svg-with-pointer.xhtml [ Failure ]
 crbug.com/591099 svg/custom/pointer-events-on-svg-without-pointer.xhtml [ Failure ]
 crbug.com/591099 svg/custom/poly-parsing-error.html [ Failure ]
-crbug.com/591099 svg/custom/removed-from-animation-crash.html [ Crash ]
+crbug.com/591099 svg/custom/removed-from-animation-crash.html [ Crash Pass ]
 crbug.com/591099 svg/custom/rootmost-svg-xy-attrs.xhtml [ Failure ]
 crbug.com/591099 svg/custom/scroll-to-svg-element-assertion.html [ Failure ]
 crbug.com/591099 svg/custom/second-inline-text.xhtml [ Failure Pass ]
 crbug.com/591099 svg/custom/simpleCDF.xml [ Failure Pass ]
-crbug.com/591099 svg/custom/size-follows-container-size.html [ Crash ]
-crbug.com/591099 svg/custom/stf-container-with-intrinsic-ratio-svg.html [ Crash ]
+crbug.com/591099 svg/custom/size-follows-container-size.html [ Crash Failure ]
+crbug.com/591099 svg/custom/stf-container-with-intrinsic-ratio-svg.html [ Crash Pass ]
 crbug.com/591099 svg/custom/svg-allowed-in-dashboard-object.html [ Failure ]
 crbug.com/591099 svg/custom/svg-createsvgtransform-type.html [ Failure ]
 crbug.com/591099 svg/custom/svg-float-border-padding.xml [ Failure ]
@@ -19260,8 +19270,8 @@
 crbug.com/591099 svg/custom/svg-fonts-no-latin-glyph.html [ Failure ]
 crbug.com/591099 svg/custom/svg-fonts-with-no-element-reference.html [ Failure Pass ]
 crbug.com/591099 svg/custom/svg-fonts-word-spacing.html [ Failure ]
-crbug.com/591099 svg/custom/svg-image-intrinsic-size-with-cssstyle-auto-dynamic-image-change.html [ Crash ]
-crbug.com/591099 svg/custom/svg-image-intrinsic-size-with-cssstyle-auto.html [ Crash ]
+crbug.com/591099 svg/custom/svg-image-intrinsic-size-with-cssstyle-auto-dynamic-image-change.html [ Crash Pass ]
+crbug.com/591099 svg/custom/svg-image-intrinsic-size-with-cssstyle-auto.html [ Crash Pass ]
 crbug.com/591099 svg/custom/svg-modify-currentTranslate.html [ Failure ]
 crbug.com/591099 svg/custom/svg-root-padding-border-margin.html [ Failure Pass ]
 crbug.com/591099 svg/custom/svg-viewBox-dynamic.html [ Failure ]
@@ -19269,7 +19279,7 @@
 crbug.com/591099 svg/custom/tabindex-order.html [ Failure ]
 crbug.com/591099 svg/custom/tearoffs-with-tearoffs.html [ Failure ]
 crbug.com/591099 svg/custom/text-match-highlight.html [ Failure ]
-crbug.com/591099 svg/custom/text-use-click-crash.xhtml [ Crash ]
+crbug.com/591099 svg/custom/text-use-click-crash.xhtml [ Crash Pass ]
 crbug.com/591099 svg/custom/text-zoom.xhtml [ Failure Pass ]
 crbug.com/591099 svg/custom/title-assertion.html [ Failure ]
 crbug.com/591099 svg/custom/touch-events.html [ Failure ]
@@ -19282,7 +19292,7 @@
 crbug.com/591099 svg/custom/use-invalid-html.xhtml [ Failure ]
 crbug.com/591099 svg/custom/use-invalid-pattern.svg [ Failure ]
 crbug.com/591099 svg/custom/use-invalid-style.svg [ Failure ]
-crbug.com/591099 svg/custom/use-invalidate-click-crash.xhtml [ Crash ]
+crbug.com/591099 svg/custom/use-invalidate-click-crash.xhtml [ Crash Pass ]
 crbug.com/591099 svg/custom/use-on-disallowed-foreign-object-1.svg [ Failure Pass ]
 crbug.com/591099 svg/custom/use-on-disallowed-foreign-object-2.svg [ Failure Pass ]
 crbug.com/591099 svg/custom/use-on-disallowed-foreign-object-3.svg [ Failure Pass ]
@@ -19293,28 +19303,28 @@
 crbug.com/591099 svg/custom/use-referencing-style-crash.svg [ Failure ]
 crbug.com/591099 svg/custom/viewport-em.svg [ Failure Pass ]
 crbug.com/591099 svg/custom/xhtml-no-svg-renderer.xhtml [ Crash Failure Pass ]
-crbug.com/591099 svg/custom/zoomed-alignment-baseline.html [ Crash ]
-crbug.com/591099 svg/custom/zoomed-baseline-shift.html [ Crash ]
-crbug.com/591099 svg/custom/zoomed-ex-em-font-sizes.html [ Crash ]
-crbug.com/591099 svg/custom/zoomed-mixed-scripts.html [ Crash ]
+crbug.com/591099 svg/custom/zoomed-alignment-baseline.html [ Crash Pass ]
+crbug.com/591099 svg/custom/zoomed-baseline-shift.html [ Crash Pass ]
+crbug.com/591099 svg/custom/zoomed-ex-em-font-sizes.html [ Crash Pass ]
+crbug.com/591099 svg/custom/zoomed-mixed-scripts.html [ Crash Pass ]
 crbug.com/591099 svg/dispatch-event-crash-on-destruct.html [ Failure ]
 crbug.com/591099 svg/dom/SVGAnimatedListPropertyTearOff-crash-2.html [ Failure ]
 crbug.com/591099 svg/dom/SVGAnimatedListPropertyTearOff-crash.html [ Failure ]
-crbug.com/591099 svg/dom/SVGAnimationElement-exceptions.html [ Crash ]
-crbug.com/591099 svg/dom/SVGGeometryElement-getPointAtLength-attached.html [ Crash ]
-crbug.com/591099 svg/dom/SVGGeometryElement-getTotalLength-attached.html [ Crash ]
-crbug.com/591099 svg/dom/SVGLength-calc-in-attr.html [ Crash ]
-crbug.com/591099 svg/dom/SVGLength-viewport-units.html [ Crash ]
-crbug.com/591099 svg/dom/SVGLengthList-appendItem.html [ Crash ]
-crbug.com/591099 svg/dom/SVGLengthList-appendItemFromClearedList.html [ Crash ]
-crbug.com/591099 svg/dom/SVGLengthList-basics.html [ Crash ]
-crbug.com/591099 svg/dom/SVGLengthList-dom-modifications.html [ Crash ]
-crbug.com/591099 svg/dom/SVGLengthList-getItem.html [ Crash ]
-crbug.com/591099 svg/dom/SVGLengthList-initialize.html [ Crash ]
-crbug.com/591099 svg/dom/SVGLengthList-insertItemBefore.html [ Crash ]
-crbug.com/591099 svg/dom/SVGLengthList-removeItem.html [ Crash ]
-crbug.com/591099 svg/dom/SVGLengthList-replaceItem.html [ Crash ]
-crbug.com/591099 svg/dom/SVGLengthList-setEmptyString.html [ Crash ]
+crbug.com/591099 svg/dom/SVGAnimationElement-exceptions.html [ Crash Pass ]
+crbug.com/591099 svg/dom/SVGGeometryElement-getPointAtLength-attached.html [ Crash Pass ]
+crbug.com/591099 svg/dom/SVGGeometryElement-getTotalLength-attached.html [ Crash Pass ]
+crbug.com/591099 svg/dom/SVGLength-calc-in-attr.html [ Crash Pass ]
+crbug.com/591099 svg/dom/SVGLength-viewport-units.html [ Crash Pass ]
+crbug.com/591099 svg/dom/SVGLengthList-appendItem.html [ Crash Pass ]
+crbug.com/591099 svg/dom/SVGLengthList-appendItemFromClearedList.html [ Crash Pass ]
+crbug.com/591099 svg/dom/SVGLengthList-basics.html [ Crash Pass ]
+crbug.com/591099 svg/dom/SVGLengthList-dom-modifications.html [ Crash Pass ]
+crbug.com/591099 svg/dom/SVGLengthList-getItem.html [ Crash Pass ]
+crbug.com/591099 svg/dom/SVGLengthList-initialize.html [ Crash Pass ]
+crbug.com/591099 svg/dom/SVGLengthList-insertItemBefore.html [ Crash Pass ]
+crbug.com/591099 svg/dom/SVGLengthList-removeItem.html [ Crash Pass ]
+crbug.com/591099 svg/dom/SVGLengthList-replaceItem.html [ Crash Pass ]
+crbug.com/591099 svg/dom/SVGLengthList-setEmptyString.html [ Crash Pass ]
 crbug.com/591099 svg/dom/SVGLocatable-getCTM-svg-root.html [ Failure ]
 crbug.com/591099 svg/dom/SVGMatrix-interface.xhtml [ Failure ]
 crbug.com/591099 svg/dom/SVGNumberList-basics.xhtml [ Failure ]
@@ -19326,25 +19336,25 @@
 crbug.com/591099 svg/dom/SVGSVGElement-intersection-enclosure.html [ Failure ]
 crbug.com/591099 svg/dom/SVGStringList-basics.xhtml [ Failure ]
 crbug.com/591099 svg/dom/SVGStringList.html [ Failure ]
-crbug.com/591099 svg/dom/SVGStyleElement.html [ Crash ]
+crbug.com/591099 svg/dom/SVGStyleElement.html [ Crash Pass ]
 crbug.com/591099 svg/dom/SVGStyleElement/disable-svg-style-element.html [ Failure ]
 crbug.com/591099 svg/dom/SVGStyleElement/style-langspace.html [ Failure ]
-crbug.com/591099 svg/dom/SVGStyledElement-pendingResource-crash.html [ Crash ]
-crbug.com/591099 svg/dom/SVGTransformList-basics.html [ Crash ]
-crbug.com/591099 svg/dom/SVGTransformList-with-existing-item.html [ Crash ]
+crbug.com/591099 svg/dom/SVGStyledElement-pendingResource-crash.html [ Crash Pass ]
+crbug.com/591099 svg/dom/SVGTransformList-basics.html [ Crash Pass ]
+crbug.com/591099 svg/dom/SVGTransformList-with-existing-item.html [ Crash Pass ]
 crbug.com/591099 svg/dom/content-model.html [ Failure ]
 crbug.com/591099 svg/dom/css-transforms.xhtml [ Failure ]
 crbug.com/591099 svg/dom/document-createEvent-mandatory-arg.html [ Failure ]
 crbug.com/591099 svg/dom/feFlood-no-in1.html [ Failure ]
 crbug.com/591099 svg/dom/frame-related-api-during-load.html [ Failure ]
 crbug.com/591099 svg/dom/getElementsByTagName-localName-matching.html [ Failure ]
-crbug.com/591099 svg/dom/getScreenCTM-ancestor-transform.html [ Crash ]
-crbug.com/591099 svg/dom/getbbox.html [ Crash ]
-crbug.com/591099 svg/dom/getscreenctm-use-with-additional-translation.html [ Crash ]
-crbug.com/591099 svg/dom/href-baseval-animval.html [ Crash ]
+crbug.com/591099 svg/dom/getScreenCTM-ancestor-transform.html [ Crash Pass ]
+crbug.com/591099 svg/dom/getbbox.html [ Crash Pass ]
+crbug.com/591099 svg/dom/getscreenctm-use-with-additional-translation.html [ Crash Pass ]
+crbug.com/591099 svg/dom/href-baseval-animval.html [ Crash Pass ]
 crbug.com/591099 svg/dom/id-reflect.html [ Failure ]
 crbug.com/591099 svg/dom/length-list-parser.html [ Failure Timeout ]
-crbug.com/591099 svg/dom/linear-gradient-default-length.html [ Crash ]
+crbug.com/591099 svg/dom/linear-gradient-default-length.html [ Crash Pass ]
 crbug.com/591099 svg/dom/method-argument-aritychecks.html [ Failure ]
 crbug.com/591099 svg/dom/method-argument-typechecks.html [ Failure ]
 crbug.com/591099 svg/dom/move-animating-svg-to-other-frame.html [ Failure ]
@@ -19360,12 +19370,12 @@
 crbug.com/591099 svg/dom/svg-element-attribute-js-null.xhtml [ Failure ]
 crbug.com/591099 svg/dom/svg-root-lengths.html [ Failure ]
 crbug.com/591099 svg/dom/svg2-inheritance.html [ Failure ]
-crbug.com/591099 svg/dom/svgangle-units.html [ Crash ]
-crbug.com/591099 svg/dom/svglength-units.html [ Crash ]
+crbug.com/591099 svg/dom/svgangle-units.html [ Crash Timeout ]
+crbug.com/591099 svg/dom/svglength-units.html [ Crash Pass ]
 crbug.com/591099 svg/dom/svgpath-getPathSegAtLength.html [ Failure ]
 crbug.com/591099 svg/dom/text-rotate-live.html [ Failure ]
-crbug.com/591099 svg/dom/title-in-shadow-tree.html [ Crash ]
-crbug.com/591099 svg/dom/tooltip-title-with-use.html [ Crash ]
+crbug.com/591099 svg/dom/title-in-shadow-tree.html [ Crash Failure ]
+crbug.com/591099 svg/dom/tooltip-title-with-use.html [ Crash Failure ]
 crbug.com/591099 svg/dom/undefined-null.html [ Failure ]
 crbug.com/591099 svg/dynamic-updates/SVG-dynamic-css-transform.html [ Failure ]
 crbug.com/591099 svg/dynamic-updates/SVGAElement-dom-href-attr.html [ Failure ]
@@ -19701,11 +19711,11 @@
 crbug.com/591099 svg/dynamic-updates/SVGUseElement-svgdom-href1-prop.html [ Failure ]
 crbug.com/591099 svg/dynamic-updates/SVGUseElement-svgdom-href2-prop.html [ Failure ]
 crbug.com/591099 svg/filters/feBlend-all-modes.html [ Failure Pass ]
-crbug.com/591099 svg/filters/feComponentTransfer-style-crash.xhtml [ Crash ]
-crbug.com/591099 svg/filters/feDisplacementMap-crash-test.xhtml [ Crash ]
+crbug.com/591099 svg/filters/feComponentTransfer-style-crash.xhtml [ Crash Pass ]
+crbug.com/591099 svg/filters/feDisplacementMap-crash-test.xhtml [ Crash Pass ]
 crbug.com/591099 svg/filters/feLight-non-lighting-parent-crash.html [ Failure ]
 crbug.com/591099 svg/filters/feTurbulence-bad-seeds.html [ Failure ]
-crbug.com/591099 svg/filters/filter-detach-crash.html [ Crash ]
+crbug.com/591099 svg/filters/filter-detach-crash.html [ Crash Pass ]
 crbug.com/591099 svg/filters/reparent-animated-filter-target.html [ Failure ]
 crbug.com/591099 svg/foreignObject/background-render-phase.html [ Failure ]
 crbug.com/591099 svg/foreignObject/body-background.svg [ Failure Pass ]
@@ -19718,10 +19728,10 @@
 crbug.com/591099 svg/foreignObject/no-crash-with-svg-content-in-html-document.svg [ Failure Pass ]
 crbug.com/591099 svg/foreignObject/svg-document-in-html-document.svg [ Failure Pass ]
 crbug.com/591099 svg/foreignObject/vertical-foreignObject.html [ Failure ]
-crbug.com/591099 svg/foreignObject/viewport-foreignobject-crash.html [ Crash ]
-crbug.com/591099 svg/hittest/clip-path-shape.html [ Crash ]
+crbug.com/591099 svg/foreignObject/viewport-foreignobject-crash.html [ Crash Pass ]
+crbug.com/591099 svg/hittest/clip-path-shape.html [ Crash Failure ]
 crbug.com/591099 svg/hittest/ellipse-hittest.html [ Failure ]
-crbug.com/591099 svg/hittest/empty-container.html [ Crash ]
+crbug.com/591099 svg/hittest/empty-container.html [ Crash Failure ]
 crbug.com/591099 svg/hittest/pointer-events-all.html [ Failure ]
 crbug.com/591099 svg/hittest/pointer-events-all2.html [ Failure ]
 crbug.com/591099 svg/hittest/rect-hittest.html [ Failure ]
@@ -19738,13 +19748,13 @@
 crbug.com/591099 svg/hittest/svg-small-path.xhtml [ Failure ]
 crbug.com/591099 svg/hittest/svg-small-viewbox.xhtml [ Failure ]
 crbug.com/591099 svg/hittest/svg-use-element-from-point.html [ Failure ]
-crbug.com/591099 svg/hittest/text-small-font-size.html [ Crash ]
-crbug.com/591099 svg/hittest/text-vertical.html [ Crash ]
+crbug.com/591099 svg/hittest/text-small-font-size.html [ Crash Failure ]
+crbug.com/591099 svg/hittest/text-vertical.html [ Crash Failure ]
 crbug.com/591099 svg/hittest/update-ellipse.html [ Failure ]
 crbug.com/591099 svg/hittest/update-rect.html [ Failure ]
-crbug.com/591099 svg/hittest/zero-length-butt-cap-path.xhtml [ Crash ]
-crbug.com/591099 svg/hittest/zero-length-round-cap-path.xhtml [ Crash ]
-crbug.com/591099 svg/hittest/zero-length-square-cap-path.xhtml [ Crash ]
+crbug.com/591099 svg/hittest/zero-length-butt-cap-path.xhtml [ Crash Failure ]
+crbug.com/591099 svg/hittest/zero-length-round-cap-path.xhtml [ Crash Failure ]
+crbug.com/591099 svg/hittest/zero-length-square-cap-path.xhtml [ Crash Failure ]
 crbug.com/591099 svg/hixie/data-types/002.xhtml [ Failure Pass ]
 crbug.com/591099 svg/hixie/error/012.xml [ Failure ]
 crbug.com/591099 svg/hixie/error/013.xml [ Failure ]
@@ -19764,7 +19774,7 @@
 crbug.com/591099 svg/hixie/rendering-model/004.xhtml [ Failure Pass ]
 crbug.com/591099 svg/in-html/by-reference.html [ Failure Pass ]
 crbug.com/591099 svg/in-html/circle.html [ Failure Pass ]
-crbug.com/591099 svg/in-html/sizing/svg-inline-vertical.html [ Crash ]
+crbug.com/591099 svg/in-html/sizing/svg-inline-vertical.html [ Crash Pass ]
 crbug.com/591099 svg/in-html/sizing/svg-inline.html [ Failure Timeout ]
 crbug.com/591099 svg/overflow/overflow-on-foreignObject.svg [ Crash Failure Pass ]
 crbug.com/591099 svg/overflow/overflow-on-outermost-svg-element-in-xhtml-auto.xhtml [ Failure ]
@@ -19773,53 +19783,53 @@
 crbug.com/591099 svg/overflow/overflow-on-outermost-svg-element-in-xhtml-scroll.xhtml [ Failure ]
 crbug.com/591099 svg/overflow/overflow-on-outermost-svg-element-in-xhtml-visible.xhtml [ Failure ]
 crbug.com/591099 svg/parser/foreign-object-case-sensitivity.html [ Failure ]
-crbug.com/591099 svg/parser/whitespace-angle-1.html [ Crash ]
-crbug.com/591099 svg/parser/whitespace-angle-2.html [ Crash ]
-crbug.com/591099 svg/parser/whitespace-angle-invalid-1.html [ Crash ]
-crbug.com/591099 svg/parser/whitespace-angle-invalid-2.html [ Crash ]
-crbug.com/591099 svg/parser/whitespace-integer.html [ Crash ]
-crbug.com/591099 svg/parser/whitespace-length-invalid-1.html [ Crash ]
-crbug.com/591099 svg/parser/whitespace-length-invalid-2.html [ Crash ]
-crbug.com/591099 svg/parser/whitespace-length-invalid-3.html [ Crash ]
-crbug.com/591099 svg/parser/whitespace-length-invalid-4.html [ Crash ]
-crbug.com/591099 svg/parser/whitespace-length.html [ Crash ]
-crbug.com/591099 svg/parser/whitespace-number.html [ Crash ]
+crbug.com/591099 svg/parser/whitespace-angle-1.html [ Crash Pass Timeout ]
+crbug.com/591099 svg/parser/whitespace-angle-2.html [ Crash Pass ]
+crbug.com/591099 svg/parser/whitespace-angle-invalid-1.html [ Crash Timeout ]
+crbug.com/591099 svg/parser/whitespace-angle-invalid-2.html [ Crash Timeout ]
+crbug.com/591099 svg/parser/whitespace-integer.html [ Crash Pass Timeout ]
+crbug.com/591099 svg/parser/whitespace-length-invalid-1.html [ Crash Timeout ]
+crbug.com/591099 svg/parser/whitespace-length-invalid-2.html [ Crash Timeout ]
+crbug.com/591099 svg/parser/whitespace-length-invalid-3.html [ Crash Timeout ]
+crbug.com/591099 svg/parser/whitespace-length-invalid-4.html [ Crash Timeout ]
+crbug.com/591099 svg/parser/whitespace-length.html [ Crash Pass Timeout ]
+crbug.com/591099 svg/parser/whitespace-number.html [ Crash Timeout ]
 crbug.com/591099 svg/stroke/empty-path.html [ Failure Pass ]
 crbug.com/591099 svg/text/bbox-with-glyph-overflow-on-path.html [ Failure ]
 crbug.com/591099 svg/text/bbox-with-glyph-overflow-zoomed.html [ Failure ]
 crbug.com/591099 svg/text/bbox-with-glyph-overflow.html [ Failure ]
-crbug.com/591099 svg/text/bidi-getcharnumatpos.html [ Crash ]
-crbug.com/591099 svg/text/bidi-getcomputedtextlength.html [ Crash ]
-crbug.com/591099 svg/text/bidi-getsubstringlength.html [ Crash ]
+crbug.com/591099 svg/text/bidi-getcharnumatpos.html [ Crash Pass ]
+crbug.com/591099 svg/text/bidi-getcomputedtextlength.html [ Crash Pass ]
+crbug.com/591099 svg/text/bidi-getsubstringlength.html [ Crash Pass ]
 crbug.com/591099 svg/text/combining-character-queries.html [ Failure Pass ]
-crbug.com/591099 svg/text/empty-text-node-crash.html [ Crash ]
+crbug.com/591099 svg/text/empty-text-node-crash.html [ Crash Pass ]
 crbug.com/591099 svg/text/foreignObject-repaint.xml [ Failure ]
 crbug.com/591099 svg/text/foreignObject-text-clipping-bug.xml [ Failure Pass ]
-crbug.com/591099 svg/text/getcharnumatposition-multiple-fragments.html [ Crash ]
-crbug.com/591099 svg/text/getextentofchar-nonbmp.html [ Crash ]
+crbug.com/591099 svg/text/getcharnumatposition-multiple-fragments.html [ Crash Pass ]
+crbug.com/591099 svg/text/getextentofchar-nonbmp.html [ Crash Pass ]
 crbug.com/591099 svg/text/invalid-glyph-crash.html [ Failure ]
-crbug.com/591099 svg/text/invalid-non-bmp-characters.html [ Crash ]
+crbug.com/591099 svg/text/invalid-non-bmp-characters.html [ Crash Pass ]
 crbug.com/591099 svg/text/lengthAdjust-text-metrics.html [ Failure ]
 crbug.com/591099 svg/text/ligature-queries.html [ Failure Pass ]
 crbug.com/591099 svg/text/scaling-font-with-geometric-precision.html [ Failure ]
-crbug.com/591099 svg/text/select-svg-text-with-collapsed-whitespace.html [ Crash ]
+crbug.com/591099 svg/text/select-svg-text-with-collapsed-whitespace.html [ Crash Failure ]
 crbug.com/591099 svg/text/select-text-inside-non-static-position.html [ Failure ]
 crbug.com/591099 svg/text/selection-background-color.xhtml [ Failure Pass ]
-crbug.com/591099 svg/text/selection-dragging-outside-1.html [ Crash ]
-crbug.com/591099 svg/text/selection-dragging-outside-2.html [ Crash ]
-crbug.com/591099 svg/text/selection-dragging-outside-3.html [ Crash ]
-crbug.com/591099 svg/text/selection-pseudo-resource-invalidation-crash.html [ Crash ]
+crbug.com/591099 svg/text/selection-dragging-outside-1.html [ Crash Failure ]
+crbug.com/591099 svg/text/selection-dragging-outside-2.html [ Crash Failure ]
+crbug.com/591099 svg/text/selection-dragging-outside-3.html [ Crash Failure ]
+crbug.com/591099 svg/text/selection-pseudo-resource-invalidation-crash.html [ Crash Pass ]
 crbug.com/591099 svg/text/selection-styles.xhtml [ Failure Pass ]
 crbug.com/591099 svg/text/small-fonts-in-html5.html [ Failure Pass ]
 crbug.com/591099 svg/text/surrogate-pair-queries.html [ Failure Pass ]
-crbug.com/591099 svg/text/svgtextcontentelement-glyphqueries-rtl.html [ Crash ]
-crbug.com/591099 svg/text/text-bbox-empty.html [ Crash ]
-crbug.com/591099 svg/text/text-bbox-of-empty-after-change.html [ Crash ]
-crbug.com/591099 svg/text/text-getSubStringLength.html [ Crash ]
+crbug.com/591099 svg/text/svgtextcontentelement-glyphqueries-rtl.html [ Crash Pass ]
+crbug.com/591099 svg/text/text-bbox-empty.html [ Crash Pass ]
+crbug.com/591099 svg/text/text-bbox-of-empty-after-change.html [ Crash Pass ]
+crbug.com/591099 svg/text/text-getSubStringLength.html [ Crash Pass ]
 crbug.com/591099 svg/text/text-repaint-rects.xhtml [ Failure ]
 crbug.com/591099 svg/text/text-style-recalc-crash.html [ Failure Pass ]
-crbug.com/591099 svg/text/textpath-reference-crash.html [ Crash ]
-crbug.com/591099 svg/text/textquery-collapsed-whitespace.html [ Crash ]
+crbug.com/591099 svg/text/textpath-reference-crash.html [ Crash Pass ]
+crbug.com/591099 svg/text/textquery-collapsed-whitespace.html [ Crash Pass ]
 crbug.com/591099 svg/text/unpaired-surrogate-with-trailing-char-crash.html [ Failure ]
 crbug.com/591099 svg/text/white-space-pre-wrap-whitespace-only-crash.html [ Failure ]
 crbug.com/591099 svg/transforms/negative-scale-value.html [ Failure ]
@@ -19827,12 +19837,12 @@
 crbug.com/591099 svg/transforms/svg-css-transforms-clip-path.xhtml [ Failure ]
 crbug.com/591099 svg/transforms/svg-css-transforms.xhtml [ Failure ]
 crbug.com/591099 svg/transforms/text-with-pattern-inside-transformed-html.xhtml [ Failure ]
-crbug.com/591099 svg/transforms/transform-boxsize-usecounter-1.html [ Crash ]
-crbug.com/591099 svg/transforms/transform-boxsize-usecounter-2.html [ Crash ]
-crbug.com/591099 svg/transforms/transform-boxsize-usecounter-3.html [ Crash ]
-crbug.com/591099 svg/transforms/transform-boxsize-usecounter-4.html [ Crash ]
-crbug.com/591099 svg/transforms/transform-boxsize-usecounter-no-trigger-1.html [ Crash ]
-crbug.com/591099 svg/transforms/transform-boxsize-usecounter-no-trigger-2.html [ Crash ]
+crbug.com/591099 svg/transforms/transform-boxsize-usecounter-1.html [ Crash Pass ]
+crbug.com/591099 svg/transforms/transform-boxsize-usecounter-2.html [ Crash Pass ]
+crbug.com/591099 svg/transforms/transform-boxsize-usecounter-3.html [ Crash Pass ]
+crbug.com/591099 svg/transforms/transform-boxsize-usecounter-4.html [ Crash Pass ]
+crbug.com/591099 svg/transforms/transform-boxsize-usecounter-no-trigger-1.html [ Crash Pass ]
+crbug.com/591099 svg/transforms/transform-boxsize-usecounter-no-trigger-2.html [ Crash Pass ]
 crbug.com/591099 svg/transforms/transform-origin-presentation-attribute.xhtml [ Failure ]
 crbug.com/591099 svg/wicd/test-rightsizing-a.xhtml [ Failure ]
 crbug.com/591099 svg/wicd/test-rightsizing-b.xhtml [ Failure ]
@@ -19866,7 +19876,7 @@
 crbug.com/591099 svg/zoom/text/zoom-hixie-mixed-009.xml [ Failure Pass ]
 crbug.com/591099 svg/zoom/text/zoom-hixie-rendering-model-004.xhtml [ Failure Pass ]
 crbug.com/591099 svg/zoom/text/zoom-svg-float-border-padding.xml [ Failure ]
-crbug.com/591099 svg/zoom/xy-getcomputedstyle.html [ Crash ]
+crbug.com/591099 svg/zoom/xy-getcomputedstyle.html [ Crash Pass ]
 crbug.com/591099 tables/hittesting/filltable-stress.html [ Pass Timeout ]
 crbug.com/591099 tables/layering/paint-test-layering-1.html [ Failure ]
 crbug.com/591099 tables/layering/paint-test-layering-2.html [ Failure ]
@@ -20178,21 +20188,21 @@
 crbug.com/591099 touchadjustment/context-menu-select-text.html [ Failure ]
 crbug.com/591099 touchadjustment/context-menu-shadow-node.html [ Failure ]
 crbug.com/591099 touchadjustment/context-menu-text-subtargets.html [ Failure ]
-crbug.com/591099 touchadjustment/context-menu.html [ Crash ]
-crbug.com/591099 touchadjustment/disabled-formelements.html [ Crash ]
+crbug.com/591099 touchadjustment/context-menu.html [ Crash Failure ]
+crbug.com/591099 touchadjustment/disabled-formelements.html [ Crash Failure ]
 crbug.com/591099 touchadjustment/editable-content.html [ Crash Failure ]
-crbug.com/591099 touchadjustment/event-triggered-widgets.html [ Crash ]
-crbug.com/591099 touchadjustment/html-label.html [ Crash ]
+crbug.com/591099 touchadjustment/event-triggered-widgets.html [ Crash Failure ]
+crbug.com/591099 touchadjustment/html-label.html [ Crash Failure ]
 crbug.com/591099 touchadjustment/iframe.html [ Failure ]
 crbug.com/591099 touchadjustment/nested-shadow-node.html [ Failure ]
 crbug.com/591099 touchadjustment/nested-touch.html [ Failure ]
-crbug.com/591099 touchadjustment/plugin.html [ Crash ]
+crbug.com/591099 touchadjustment/plugin.html [ Crash Failure ]
 crbug.com/591099 touchadjustment/pseudo-element.html [ Failure ]
 crbug.com/591099 touchadjustment/rotated-node.html [ Failure ]
 crbug.com/591099 touchadjustment/scroll-offset.html [ Failure ]
 crbug.com/591099 touchadjustment/search-cancel.html [ Crash Failure ]
 crbug.com/591099 touchadjustment/simple-shadow-dom.html [ Failure ]
-crbug.com/591099 touchadjustment/small-target-test.html [ Crash ]
+crbug.com/591099 touchadjustment/small-target-test.html [ Crash Failure ]
 crbug.com/591099 touchadjustment/touch-inlines.html [ Failure ]
 crbug.com/591099 touchadjustment/touch-links-active.html [ Failure ]
 crbug.com/591099 touchadjustment/touch-links-longpress.html [ Failure ]
@@ -20240,11 +20250,11 @@
 crbug.com/591099 transforms/mirror-transform-tiled-scaled-background.html [ Failure ]
 crbug.com/591099 transforms/no_transform_hit_testing.html [ Failure ]
 crbug.com/591099 transforms/overflow-with-transform.html [ Failure ]
-crbug.com/591099 transforms/perspective-origin-parsing.html [ Crash ]
-crbug.com/591099 transforms/rotate-parsing.html [ Crash ]
+crbug.com/591099 transforms/perspective-origin-parsing.html [ Crash Pass ]
+crbug.com/591099 transforms/rotate-parsing.html [ Crash Pass ]
 crbug.com/591099 transforms/rotated-transform-affects-scrolling-1.html [ Failure ]
 crbug.com/591099 transforms/rotated-transform-affects-scrolling-2.html [ Failure ]
-crbug.com/591099 transforms/scale-parsing.html [ Crash ]
+crbug.com/591099 transforms/scale-parsing.html [ Crash Pass ]
 crbug.com/591099 transforms/scrollIntoView-transformed.html [ Failure ]
 crbug.com/591099 transforms/shadows.html [ Failure ]
 crbug.com/591099 transforms/skew-with-unitless-zero.html [ Failure ]
@@ -20253,9 +20263,9 @@
 crbug.com/591099 transforms/transform-inherit-initial-unprefixed.html [ Failure ]
 crbug.com/591099 transforms/transform-inside-overflow-scroll.html [ Failure ]
 crbug.com/591099 transforms/transform-on-inline.html [ Failure ]
-crbug.com/591099 transforms/transform-origin-parsing.html [ Crash ]
+crbug.com/591099 transforms/transform-origin-parsing.html [ Crash Pass ]
 crbug.com/591099 transforms/transform-overflow.html [ Failure ]
-crbug.com/591099 transforms/transform-parsing.html [ Crash ]
+crbug.com/591099 transforms/transform-parsing.html [ Crash Pass ]
 crbug.com/591099 transforms/transform-positioned-ancestor.html [ Failure Pass ]
 crbug.com/591099 transforms/transform-table-row.html [ Failure Pass ]
 crbug.com/591099 transforms/transformed-caret.html [ Failure ]
@@ -20263,31 +20273,31 @@
 crbug.com/591099 transforms/transformed-focused-text-input.html [ Failure ]
 crbug.com/591099 transforms/transforms-with-opacity.html [ Failure ]
 crbug.com/591099 transforms/transforms-with-zoom.html [ Failure ]
-crbug.com/591099 transforms/translate-parsing.html [ Crash ]
+crbug.com/591099 transforms/translate-parsing.html [ Crash Pass ]
 crbug.com/591099 transitions/3d/interrupted-transition.html [ Failure ]
 crbug.com/591099 transitions/bad-transition-shorthand-crash.html [ Failure ]
-crbug.com/591099 transitions/cubic-bezier-overflow-svg-length.html [ Crash ]
+crbug.com/591099 transitions/cubic-bezier-overflow-svg-length.html [ Crash Pass ]
 crbug.com/591099 transitions/inherit-other-props-do-not-affect-transition-property.html [ Failure ]
 crbug.com/591099 transitions/inherit-other-props.html [ Failure ]
 crbug.com/591099 transitions/inherit.html [ Failure ]
-crbug.com/591099 transitions/interrupted-accelerated-transition.html [ Crash ]
+crbug.com/591099 transitions/interrupted-accelerated-transition.html [ Crash Pass ]
 crbug.com/591099 transitions/interrupted-immediately.html [ Failure ]
 crbug.com/591099 transitions/matched-transform-functions.html [ Failure ]
-crbug.com/591099 transitions/mismatched-shadow-styles.html [ Crash ]
-crbug.com/591099 transitions/no-transition-on-implicit-margins.html [ Crash ]
-crbug.com/591099 transitions/object-position-transition.html [ Crash ]
+crbug.com/591099 transitions/mismatched-shadow-styles.html [ Crash Pass ]
+crbug.com/591099 transitions/no-transition-on-implicit-margins.html [ Crash Pass ]
+crbug.com/591099 transitions/object-position-transition.html [ Crash Pass ]
 crbug.com/591099 transitions/opacity-transform-transitions-inside-iframe.html [ Failure ]
 crbug.com/591099 transitions/opacity-transition-zindex.html [ Failure Pass ]
 crbug.com/591099 transitions/override-transition-crash.html [ Failure ]
 crbug.com/591099 transitions/retargetted-transition.html [ Failure ]
 crbug.com/591099 transitions/shadow.html [ Failure ]
-crbug.com/591099 transitions/svg-layout-transition-zoom.html [ Crash ]
-crbug.com/591099 transitions/svg-layout-transition.html [ Crash ]
-crbug.com/591099 transitions/svg-transitions.html [ Crash ]
+crbug.com/591099 transitions/svg-layout-transition-zoom.html [ Crash Pass ]
+crbug.com/591099 transitions/svg-layout-transition.html [ Crash Pass ]
+crbug.com/591099 transitions/svg-transitions.html [ Crash Pass ]
 crbug.com/591099 transitions/transition-end-event-all-properties.html [ Failure ]
 crbug.com/591099 transitions/transition-end-event-attributes.html [ Failure ]
 crbug.com/591099 transitions/transition-end-event-container.html [ Failure ]
-crbug.com/591099 transitions/transition-end-event-destroy-iframe.html [ Crash ]
+crbug.com/591099 transitions/transition-end-event-destroy-iframe.html [ Crash Failure ]
 crbug.com/591099 transitions/transition-end-event-destroy-renderer.html [ Failure ]
 crbug.com/591099 transitions/transition-end-event-left.html [ Failure ]
 crbug.com/591099 transitions/transition-end-event-multiple-01.html [ Failure ]
@@ -20327,7 +20337,7 @@
 crbug.com/591099 traversal/tree-walker-003.html [ Failure ]
 crbug.com/591099 traversal/tree-walker-004.html [ Failure ]
 crbug.com/591099 traversal/tree-walker-006.html [ Failure ]
-crbug.com/591099 usb/usbDevice-iframe.html [ Crash ]
+crbug.com/591099 usb/usbDevice-iframe.html [ Crash Pass ]
 crbug.com/591099 vibration/cancel-vibration-during-pattern-vibrating.html [ Failure ]
 crbug.com/591099 vibration/vibration-detached-no-crash.html [ Failure ]
 crbug.com/591099 vibration/vibration-durations.html [ Failure ]
@@ -20335,7 +20345,7 @@
 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/fullscreen/anonymous-block-merge-crash.html [ Crash ]
+crbug.com/591099 virtual/android/fullscreen/anonymous-block-merge-crash.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 ]
@@ -20344,7 +20354,7 @@
 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 ]
+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 ]
@@ -20352,40 +20362,40 @@
 crbug.com/591099 virtual/android/fullscreen/full-screen-request-removed.html [ Failure ]
 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 ]
-crbug.com/591099 virtual/android/fullscreen/model/fully-exit-fullscreen-nested-iframe.html [ Crash ]
+crbug.com/591099 virtual/android/fullscreen/full-screen-with-flex-item.html [ Crash Failure ]
+crbug.com/591099 virtual/android/fullscreen/model/fully-exit-fullscreen-nested-iframe.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 ]
 crbug.com/591099 virtual/android/media/mediadocument/media-document-with-download-button.html [ Failure ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/2d.composite.globalAlpha.fillPath.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/2d.fillText.gradient.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/2d.text.draw.fill.maxWidth.gradient.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/2d.text.draw.fill.maxWidth.negative.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/2d.text.draw.fill.maxWidth.veryLarge.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/2d.text.draw.fill.maxWidth.verySmall.html [ Crash ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/2d.composite.globalAlpha.fillPath.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/2d.fillText.gradient.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/2d.text.draw.fill.maxWidth.gradient.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/2d.text.draw.fill.maxWidth.negative.html [ Crash Pass ]
+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-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 ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/alpha.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/arc-crash.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/arc360.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/bug544329.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-2d-clip-anti-aliasing.html [ Crash ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/access-zero-sized-canvas.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/alpha.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/arc-crash.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/arc360.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/bug544329.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-2d-clip-anti-aliasing.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-ImageBitmap-close.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-ImageBitmap-structured-clone.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-ImageBitmap-transferable.html [ Failure ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-ImageData-neutered-source.html [ Failure ]
 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 ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-alphaImageData-behavior.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-arc-zero-lineto.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-bezier-same-endpoint.html [ Crash ]
+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-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-blending-text.html [ Failure ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-closePath-single-point.html [ Crash ]
+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-image.html [ Failure ]
@@ -20404,25 +20414,25 @@
 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.html [ Failure ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-createPattern-fillRect-shadow.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-currentColor.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-direction.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-draw-canvas-on-canvas-shadow.html [ Crash ]
+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 ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-draw-canvas-on-canvas-shadow.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-drawImage-animated-images.html [ Failure ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-drawImage-animated.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-drawImage-live-video.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-drawImage-shadow.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse-360-winding.html [ Crash ]
+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-ellipse-360-winding.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 ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-empty-image-pattern.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-fillPath-alpha-shadow.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-fillPath-gradient-shadow.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-fillPath-pattern-shadow.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-fillPath-shadow.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-fillRect-gradient-shadow.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-fillRect-shadow.html [ Crash ]
+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-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-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-gradient.html [ Failure ]
@@ -20439,100 +20449,100 @@
 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 ]
+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-hides-fallback.html [ Failure ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-accessibility-test.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-basic-test.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-clear-test.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-clip-test.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-css-transform-test.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-device-pixel-ratio-test.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-event-test.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-exception-test.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-fallback-element-test-1.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-fallback-element-test-2.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-fallback-element-test-3.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-fill-rule-test.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-path2d-test.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-path2d-transform-test.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-scale-factor.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-transform-test.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-repaint.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-invalid-fillstyle.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-invalid-strokestyle.html [ Crash ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-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 ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-clear-test.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-clip-test.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-css-transform-test.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-device-pixel-ratio-test.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-event-test.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-exception-test.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-fallback-element-test-1.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-fallback-element-test-2.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-fallback-element-test-3.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-fill-rule-test.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-path2d-test.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-path2d-transform-test.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-scale-factor.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-transform-test.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-repaint.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-invalid-fillstyle.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-invalid-strokestyle.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-invalid-video.html [ Failure ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-isPointInStroke-with-path.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-isPointInStroke.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-large-dimensions.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-lineDash-input-sequence.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-lineDash-invalid.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-lineDash.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-lineWidth-intact-after-strokeRect.html [ Crash ]
+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-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-normalize-string.html [ Failure ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-path-context-clip.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-path-context-fill.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-path-context-stroke.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-path-object.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-path-with-inf-nan-dimensions.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-pattern-set-transform.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-putImageData.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-quadratic-same-endpoint.html [ Crash ]
+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 ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-path-object.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-path-with-inf-nan-dimensions.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-pattern-set-transform.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-putImageData.html [ Crash Pass ]
+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 ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-resize-after-paint.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-scale-drawImage-shadow.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-scale-fillPath-shadow.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-scale-fillRect-shadow.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-scale-shadowBlur.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-scale-strokePath-shadow.html [ Crash ]
+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.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 ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-scale-fillRect-shadow.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-scale-shadowBlur.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-scale-strokePath-shadow.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-scroll-path-into-view.html [ Failure Timeout ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-set-properties-with-non-invertible-ctm.html [ Crash ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-set-properties-with-non-invertible-ctm.html [ Crash Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-shadow-source-in.html [ Failure Pass ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-skia-excessive-size.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-strokePath-alpha-shadow.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-strokePath-cap-join.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-strokePath-gradient-shadow.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-strokePath-shadow.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-strokeRect-alpha-shadow.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-strokeRect-gradient-shadow.html [ Crash ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-skia-excessive-size.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-strokePath-alpha-shadow.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-strokePath-cap-join.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-strokePath-gradient-shadow.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-strokePath-shadow.html [ Crash Pass ]
+crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-strokeRect-alpha-shadow.html [ Crash Pass ]
+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 ]
+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-width.html [ Failure ]
 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 ]
+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/currentTransform-null.html [ Failure ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/draw-focus-if-needed-invisible-crash.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/draw-focus-if-needed-on-event.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/draw-focus-if-needed-with-path2d.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/draw-focus-if-needed.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/drawImage-with-negative-source-destination.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/fallback-content.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/feimage-with-foreignobject-taint-canvas-2.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/feimage-with-foreignobject-taint-canvas.html [ Crash ]
+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-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 ]
+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.html [ Failure ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/font-no-zoom.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/gradient-with-clip.html [ Crash ]
+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 ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/image-with-foreignobject-taint-canvas.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/painting-on-bad-canvas.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/pattern-with-transform.html [ Crash ]
+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/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/resize-while-save-active.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/set-empty-font-crash.html [ Crash ]
+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 ]
+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/toDataURL-alpha.html [ Failure ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/toDataURL-noData.html [ Crash ]
+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 ]
+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-4.html [ Failure ]
@@ -20543,12 +20553,12 @@
 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/texImage-imageBitmap-from-canvas-resize.html [ Crash ]
+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/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-viewport-parameters-preserved.html [ Failure ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/zero-size-fill-rect.html [ Crash ]
-crbug.com/591099 virtual/enable_wasm/external/wpt/wasm/wasm_local_iframe_test.html [ Crash Timeout ]
+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/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 ]
@@ -20592,7 +20602,7 @@
 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/destroyed-image-load-event.html [ Crash ]
+crbug.com/591099 virtual/exotic-color-space/images/destroyed-image-load-event.html [ Crash Failure ]
 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/exif-orientation-css.html [ Crash Failure ]
@@ -20608,7 +20618,7 @@
 crbug.com/591099 virtual/exotic-color-space/images/icon-0colors.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/icon-decoding.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/image-change-src.html [ Crash Pass ]
-crbug.com/591099 virtual/exotic-color-space/images/image-change-without-resize-shouldnt-layout.html [ Crash ]
+crbug.com/591099 virtual/exotic-color-space/images/image-change-without-resize-shouldnt-layout.html [ Crash Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/image-click-scale-restore-zoomed-image.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/image-css3-content-data.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/image-document-write-assert.html [ Failure ]
@@ -20623,7 +20633,7 @@
 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 ]
+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/imagemap-circle-focus-ring.html [ Failure ]
@@ -20639,17 +20649,17 @@
 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-polygon-focus-ring.html [ Failure ]
-crbug.com/591099 virtual/exotic-color-space/images/imagemap-scroll.html [ Crash ]
-crbug.com/591099 virtual/exotic-color-space/images/img-dimensions-styled.html [ Crash ]
-crbug.com/591099 virtual/exotic-color-space/images/invalid-image-url-crash.html [ Crash ]
+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/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/move-image-to-new-document.html [ Crash ]
-crbug.com/591099 virtual/exotic-color-space/images/multiple-inflight-error-event-crash.html [ Crash ]
+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/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 ]
@@ -20668,15 +20678,15 @@
 crbug.com/591099 virtual/exotic-color-space/images/script-counter-imageDimensionChanged-crash.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/sprite-no-bleed.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/style-access-during-imageChanged-crash.html [ Crash Failure ]
-crbug.com/591099 virtual/exotic-color-space/images/style-access-during-imageChanged-style-freeze.html [ Crash ]
+crbug.com/591099 virtual/exotic-color-space/images/style-access-during-imageChanged-style-freeze.html [ Crash Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/text-content-crash-2.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/text-content-crash.html [ Failure ]
-crbug.com/591099 virtual/exotic-color-space/images/update-alt-text.html [ Crash ]
+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 ]
+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/zoomed-img-size.html [ Failure ]
-crbug.com/591099 virtual/exotic-color-space/images/zoomed-offset-size.html [ Crash ]
+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 ]
@@ -20717,7 +20727,7 @@
 crbug.com/591099 virtual/gpu-rasterization/images/cross-fade-simple.html [ 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 ]
+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/exif-orientation-css.html [ Crash Failure ]
@@ -20733,7 +20743,7 @@
 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 ]
+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 ]
@@ -20748,7 +20758,7 @@
 crbug.com/591099 virtual/gpu-rasterization/images/image-map-zoom-alt-content.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/image-map-zoom.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/image-page-injected-script-crash.html [ Crash Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/image-use-counters.html [ Crash ]
+crbug.com/591099 virtual/gpu-rasterization/images/image-use-counters.html [ Crash Pass ]
 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 ]
@@ -20764,17 +20774,17 @@
 crbug.com/591099 virtual/gpu-rasterization/images/imagemap-overflowing-circle-focus-ring.html [ 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 ]
-crbug.com/591099 virtual/gpu-rasterization/images/img-dimensions-styled.html [ Crash ]
-crbug.com/591099 virtual/gpu-rasterization/images/invalid-image-url-crash.html [ Crash ]
+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-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/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/move-image-to-new-document.html [ Crash ]
-crbug.com/591099 virtual/gpu-rasterization/images/multiple-inflight-error-event-crash.html [ Crash ]
+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/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 ]
@@ -20793,43 +20803,43 @@
 crbug.com/591099 virtual/gpu-rasterization/images/script-counter-imageDimensionChanged-crash.html [ Failure ]
 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 ]
+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.html [ Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/update-alt-text.html [ Crash ]
+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/webgl-teximage2d.html [ Crash ]
+crbug.com/591099 virtual/gpu-rasterization/images/webgl-teximage2d.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-offset-size.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/2d.composite.globalAlpha.fillPath.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/2d.fillText.gradient.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/2d.text.draw.fill.maxWidth.gradient.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/2d.text.draw.fill.maxWidth.negative.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/2d.text.draw.fill.maxWidth.veryLarge.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/2d.text.draw.fill.maxWidth.verySmall.html [ Crash ]
+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 ]
+crbug.com/591099 virtual/gpu/fast/canvas/2d.text.draw.fill.maxWidth.gradient.html [ Crash Pass ]
+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/OffscreenCanvas-constructor-in-worker.html [ Failure ]
 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 ]
-crbug.com/591099 virtual/gpu/fast/canvas/access-zero-sized-canvas.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/alpha.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/arc-crash.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/arc360.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/bug544329.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-2d-clip-anti-aliasing.html [ Crash ]
+crbug.com/591099 virtual/gpu/fast/canvas/access-zero-sized-canvas.html [ Crash Pass ]
+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/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 ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-ImageBitmap-structured-clone.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-ImageBitmap-transferable.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-ImageData-neutered-source.html [ Crash Failure ]
 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 ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-alphaImageData-behavior.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-arc-zero-lineto.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-bezier-same-endpoint.html [ Crash ]
+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-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-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 ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-closePath-single-point.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-composite-alpha.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-composite-canvas.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-composite-image.html [ Failure ]
@@ -20848,25 +20858,25 @@
 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-createPattern-fillRect-shadow.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-currentColor.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-direction.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-draw-canvas-on-canvas-shadow.html [ Crash ]
+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.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-drawImage-live-video.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-drawImage-shadow.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-ellipse-360-winding.html [ Crash ]
+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 ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-ellipse-360-winding.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-ellipse-connecting-line.html [ Failure Pass ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-ellipse-zero-lineto.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-ellipse.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-empty-image-pattern.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-fillPath-alpha-shadow.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-fillPath-gradient-shadow.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-fillPath-pattern-shadow.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-fillPath-shadow.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-fillRect-gradient-shadow.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-fillRect-shadow.html [ Crash ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-ellipse-zero-lineto.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-ellipse.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-empty-image-pattern.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-fillPath-alpha-shadow.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-fillPath-gradient-shadow.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-fillPath-pattern-shadow.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-fillPath-shadow.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-fillRect-gradient-shadow.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-fillRect-shadow.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-filter-fill-liveness.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-filter-fill-paint-color.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-filter-fill-paint-gradient.html [ Failure ]
@@ -20883,100 +20893,100 @@
 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 ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-font-cache.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 ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-basic-test.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-clear-test.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-clip-test.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-css-transform-test.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-device-pixel-ratio-test.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-event-test.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-exception-test.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-fallback-element-test-1.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-fallback-element-test-2.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-fallback-element-test-3.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-fill-rule-test.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-path2d-test.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-path2d-transform-test.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-scale-factor.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-transform-test.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-imageSmoothingEnabled-repaint.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-imageSmoothingQuality.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-invalid-fillstyle.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-invalid-strokestyle.html [ Crash ]
+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 ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-clear-test.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-clip-test.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-css-transform-test.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-device-pixel-ratio-test.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-event-test.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-exception-test.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-fallback-element-test-1.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-fallback-element-test-2.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-fallback-element-test-3.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-fill-rule-test.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-path2d-test.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-path2d-transform-test.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-scale-factor.html [ Crash Pass ]
+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-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 ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-isPointInStroke-with-path.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-isPointInStroke.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-large-dimensions.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-lineDash-input-sequence.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-lineDash-invalid.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-lineDash.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-lineWidth-intact-after-strokeRect.html [ Crash ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-isPointInStroke-with-path.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-isPointInStroke.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-large-dimensions.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-lineDash-input-sequence.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-lineDash-invalid.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-lineDash.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-lineWidth-intact-after-strokeRect.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-lost-gpu-context.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-measure-bidi-text.html [ Failure Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-negative-size.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-normalize-string.html [ Failure ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-path-context-clip.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-path-context-fill.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-path-context-stroke.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-path-object.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-path-with-inf-nan-dimensions.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-pattern-set-transform.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-putImageData.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-quadratic-same-endpoint.html [ Crash ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-path-context-clip.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-path-context-fill.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-path-context-stroke.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-path-object.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-path-with-inf-nan-dimensions.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-pattern-set-transform.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-putImageData.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-quadratic-same-endpoint.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-render-layer.html [ Failure Pass ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-resetTransform.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-resize-after-paint.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-scale-drawImage-shadow.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-scale-fillPath-shadow.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-scale-fillRect-shadow.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-scale-shadowBlur.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-scale-strokePath-shadow.html [ Crash ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-resetTransform.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-resize-after-paint.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-scale-drawImage-shadow.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-scale-fillPath-shadow.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-scale-fillRect-shadow.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-scale-shadowBlur.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-scale-strokePath-shadow.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-scroll-path-into-view.html [ Failure Timeout ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-set-properties-with-non-invertible-ctm.html [ Crash ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-set-properties-with-non-invertible-ctm.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-shadow-source-in.html [ Failure Pass ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-skia-excessive-size.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-strokePath-alpha-shadow.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-strokePath-cap-join.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-strokePath-gradient-shadow.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-strokePath-shadow.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-strokeRect-alpha-shadow.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-strokeRect-gradient-shadow.html [ Crash ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-skia-excessive-size.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-strokePath-alpha-shadow.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-strokePath-cap-join.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-strokePath-gradient-shadow.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/canvas-strokePath-shadow.html [ Crash Pass ]
+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-space-characters.html [ Crash ]
+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-transforms-during-path.html [ Failure ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-transforms-fillRect-shadow.html [ Crash ]
+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/draw-focus-if-needed-invisible-crash.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/draw-focus-if-needed-on-event.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/draw-focus-if-needed-with-path2d.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/draw-focus-if-needed.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/drawImage-with-negative-source-destination.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/fallback-content.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/feimage-with-foreignobject-taint-canvas-2.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/feimage-with-foreignobject-taint-canvas.html [ Crash ]
+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 ]
+crbug.com/591099 virtual/gpu/fast/canvas/draw-focus-if-needed.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/drawImage-with-negative-source-destination.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/fallback-content.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/feimage-with-foreignobject-taint-canvas-2.html [ Crash Pass ]
+crbug.com/591099 virtual/gpu/fast/canvas/feimage-with-foreignobject-taint-canvas.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/fill-stroke-clip-reset-path.html [ Failure ]
-crbug.com/591099 virtual/gpu/fast/canvas/fillText-shadow.html [ Crash ]
+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 ]
-crbug.com/591099 virtual/gpu/fast/canvas/gradient-with-clip.html [ Crash ]
+crbug.com/591099 virtual/gpu/fast/canvas/font-no-zoom.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-with-foreignobject-taint-canvas-2.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/image-with-foreignobject-taint-canvas.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/painting-on-bad-canvas.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/pattern-with-transform.html [ Crash ]
+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/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 ]
-crbug.com/591099 virtual/gpu/fast/canvas/resize-while-save-active.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/set-empty-font-crash.html [ Crash ]
+crbug.com/591099 virtual/gpu/fast/canvas/resize-while-save-active.html [ Crash Pass ]
+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 ]
+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/toDataURL-alpha.html [ Failure ]
-crbug.com/591099 virtual/gpu/fast/canvas/toDataURL-noData.html [ Crash ]
+crbug.com/591099 virtual/gpu/fast/canvas/toDataURL-noData.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/toDataURL-supportedTypes.html [ Failure ]
-crbug.com/591099 virtual/gpu/fast/canvas/transformed-canvas-reset.html [ Crash ]
+crbug.com/591099 virtual/gpu/fast/canvas/transformed-canvas-reset.html [ Crash Pass ]
 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 ]
@@ -20987,11 +20997,11 @@
 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 ]
+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/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 ]
+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/text-on-backgrounds.html [ Failure ]
 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/normal-flow/block-replaced-width-006.xht [ Failure ]
@@ -21016,11 +21026,13 @@
 crbug.com/591099 virtual/layout_ng/fast/block/float/002.html [ Failure ]
 crbug.com/591099 virtual/layout_ng/fast/block/float/014.html [ Crash Failure ]
 crbug.com/591099 virtual/layout_ng/fast/block/float/017.html [ Failure ]
+crbug.com/591099 virtual/layout_ng/fast/block/float/assert-when-moving-float.html [ Failure ]
 crbug.com/591099 virtual/layout_ng/fast/block/float/formatting-context-changes.html [ Failure ]
 crbug.com/591099 virtual/layout_ng/fast/block/float/overhanging-float-add-in-static-position-block.html [ Failure Pass ]
 crbug.com/591099 virtual/layout_ng/fast/block/float/overhanging-float-add-in-static-position-block2.html [ Failure Pass ]
 crbug.com/591099 virtual/layout_ng/fast/block/float/rubybase-children-made-inline-crash.html [ Failure ]
 crbug.com/591099 virtual/layout_ng/fast/block/float/rubybase-children-moved-crash-2.html [ Crash Failure ]
+crbug.com/591099 virtual/layout_ng/fast/block/float/rubybase-children-moved-crash.html [ Failure ]
 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/inspector-protocol/network/disable-interception-midway.html [ Failure Pass Timeout ]
@@ -21032,91 +21044,91 @@
 crbug.com/591099 virtual/mojo-loading/http/tests/inspector/persistence/automapping-sourcemap.html [ Failure Pass Timeout ]
 crbug.com/591099 virtual/mojo-loading/http/tests/security/cors-rfc1918/addressspace-document-csp-appcache.html [ Failure Pass Timeout ]
 crbug.com/591099 virtual/mojo-loading/http/tests/serviceworker/ServiceWorkerGlobalScope/registration-attribute.html [ Failure Pass ]
-crbug.com/591099 virtual/mojo-localstorage/external/wpt/webstorage/event_no_duplicates.html [ Crash ]
+crbug.com/591099 virtual/mojo-localstorage/external/wpt/webstorage/event_no_duplicates.html [ Crash Pass ]
 crbug.com/591099 virtual/mojo-localstorage/external/wpt/webstorage/storage_setitem.html [ Pass Timeout ]
 crbug.com/591099 virtual/mojo-localstorage/storage/domstorage/localstorage/missing-arguments.html [ Failure ]
-crbug.com/591099 virtual/mse-1mb-buffers/http/tests/media/media-source/stream_memory_tests/mediasource-appendbuffer-quota-exceeded-1mb-buffers.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/external/wpt/remote-playback/idlharness.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/http/tests/media/controls/controls-list-add-hide.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/http/tests/media/controls/controls-list-remove-show.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/http/tests/media/controls/video-controls-overflow-menu-correct-ordering.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/http/tests/media/controls/video-controls-overflow-menu-updates-appropriately.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/closed-captions-dynamic-update.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/closed-captions-on-off.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/closed-captions-single-track.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/closed-captions-switch-track.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/controls-cast-button-narrow.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/controls-cast-button.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/controls-cast-do-not-fade-out.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/controls-cast-overlay-slow-fade.html [ Crash Timeout ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/controls-overlay-cast-button.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/controls-video-keynav-no-controls.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/controls-video-keynav.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/download-button-displays-with-preload-none.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/overflow-fully-hidden.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/overlay-play-button-document-move.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/overlay-play-button-narrow.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/settings-disable-controls.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-controls-overflow-menu-hide-on-click-outside.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-controls-overflow-menu-hide-on-click-panel.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-controls-overflow-menu-hide-on-click.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-controls-overflow-menu-hide-on-resize.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-controls-overflow-menu-text.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-controls-overflow-menu-visibility.html [ Crash ]
+crbug.com/591099 virtual/mse-1mb-buffers/http/tests/media/media-source/stream_memory_tests/mediasource-appendbuffer-quota-exceeded-1mb-buffers.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/external/wpt/remote-playback/idlharness.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/http/tests/media/controls/controls-list-add-hide.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/http/tests/media/controls/controls-list-remove-show.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/http/tests/media/controls/video-controls-overflow-menu-correct-ordering.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/http/tests/media/controls/video-controls-overflow-menu-updates-appropriately.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/closed-captions-dynamic-update.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/closed-captions-on-off.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/closed-captions-single-track.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/closed-captions-switch-track.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/controls-cast-button-narrow.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/controls-cast-button.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/controls-cast-do-not-fade-out.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/controls-cast-overlay-slow-fade.html [ Crash Pass Timeout ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/controls-overlay-cast-button.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/controls-video-keynav-no-controls.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/controls-video-keynav.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/download-button-displays-with-preload-none.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/overflow-fully-hidden.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/overlay-play-button-document-move.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/overlay-play-button-narrow.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/settings-disable-controls.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-controls-overflow-menu-hide-on-click-outside.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-controls-overflow-menu-hide-on-click-panel.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-controls-overflow-menu-hide-on-click.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-controls-overflow-menu-hide-on-resize.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-controls-overflow-menu-text.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-controls-overflow-menu-visibility.html [ Crash Pass ]
 crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-controls-with-cast-rendering.html [ Failure ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-enter-exit-fullscreen-while-hovering-shows-controls.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-enter-exit-fullscreen-without-hovering-doesnt-show-controls.html [ Crash ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-enter-exit-fullscreen-while-hovering-shows-controls.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-enter-exit-fullscreen-without-hovering-doesnt-show-controls.html [ Crash Pass ]
 crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-overlay-cast-dark-rendering.html [ Failure ]
 crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-overlay-cast-light-rendering.html [ Failure ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-overlay-play-button.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/media/remoteplayback/availability-callback-gc.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/media/remoteplayback/prompt-twice-throws.html [ Crash ]
-crbug.com/591099 virtual/new-remote-playback-pipeline/media/remoteplayback/watch-availability-throws-low-end-device.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/extendable-message-event.https.html [ Crash Timeout ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/media/controls/video-overlay-play-button.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/media/remoteplayback/availability-callback-gc.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/media/remoteplayback/prompt-twice-throws.html [ Crash Pass ]
+crbug.com/591099 virtual/new-remote-playback-pipeline/media/remoteplayback/watch-availability-throws-low-end-device.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/extendable-message-event.https.html [ Crash Pass Timeout ]
 crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/registration-attribute.https.html [ Failure Pass ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/unregister.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/update.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/activation.https.html [ Crash ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/unregister.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/update.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/activation.https.html [ Crash Pass ]
 crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/claim-fetch.https.html [ Crash Pass ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/claim-not-using-registration.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/client-id.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/clients-get-cross-origin.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/clients-get.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/clients-matchall-exact-controller.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/clients-matchall-include-uncontrolled.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/clients-matchall-order.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/clients-matchall.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/extendable-event-async-waituntil.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-canvas-tainting-cache.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-canvas-tainting.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-cors-xhr.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-event.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-frame-resource.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-mixed-content-to-inscope.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-mixed-content-to-outscope.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-request-css-images.https.html [ Crash ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/claim-not-using-registration.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/client-id.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/clients-get-cross-origin.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/clients-get.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/clients-matchall-exact-controller.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/clients-matchall-include-uncontrolled.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/clients-matchall-order.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/clients-matchall.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/extendable-event-async-waituntil.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-canvas-tainting-cache.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-canvas-tainting.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-cors-xhr.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-event.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-frame-resource.https.html [ Crash Timeout ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-mixed-content-to-inscope.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-mixed-content-to-outscope.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-request-css-images.https.html [ Crash Pass ]
 crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-request-fallback.https.html [ Crash Pass ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-request-redirect.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-response-taint.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/foreign-fetch-basics.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/foreign-fetch-cors.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/foreign-fetch-workers.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/iframe-sandbox-register-link-element.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/multi-globals/url-parsing.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/navigation-preload/redirect.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/navigation-preload/resource-timing.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/navigation-redirect-to-http.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/navigation-redirect.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/ready.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/register-closed-window.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/register-link-header.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/register-same-scope-different-script-url.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/registration-iframe.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/unregister-controller.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/unregister-then-register-new-script.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/unregister-then-register.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/windowclient-navigate.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/fetch/chromium/discarded-window.html [ Crash ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-request-redirect.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-response-taint.https.html [ Crash Timeout ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/foreign-fetch-basics.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/foreign-fetch-cors.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/foreign-fetch-workers.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/iframe-sandbox-register-link-element.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/multi-globals/url-parsing.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/navigation-preload/redirect.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/navigation-preload/resource-timing.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/navigation-redirect-to-http.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/navigation-redirect.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/ready.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/register-closed-window.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/register-link-header.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/register-same-scope-different-script-url.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/registration-iframe.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/unregister-controller.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/unregister-then-register-new-script.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/unregister-then-register.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/windowclient-navigate.https.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/fetch/chromium/discarded-window.html [ Crash Pass ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/inspector/service-workers/lazy-addeventlisteners.html [ Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/inspector/service-workers/service-worker-agents.html [ Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/inspector/service-workers/service-worker-manager.html [ Failure ]
@@ -21124,14 +21136,14 @@
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/inspector/service-workers/service-workers-bypass-for-network-redirect.html [ Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/inspector/service-workers/service-workers-force-update-on-page-load.html [ Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/inspector/service-workers/service-workers-navigation-preload.html [ Failure ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/inspector/service-workers/service-workers-redundant.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/inspector/service-workers/service-workers-view.html [ Crash ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/inspector/service-workers/service-workers-redundant.html [ Crash Failure ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/inspector/service-workers/service-workers-view.html [ Crash Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/BOM-override-script.html [ Failure ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/DOMContentLoaded-event.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/acid2-pixel.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/acid2.html [ Crash ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/DOMContentLoaded-event.html [ Crash Failure ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/acid2-pixel.html [ Crash Failure ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/acid2.html [ Crash Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/acid3.html [ Failure ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/adopt-iframe-src-attr-after-remove.html [ Crash ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/adopt-iframe-src-attr-after-remove.html [ Crash Pass ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/async-script-removed.html [ Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/async-script.html [ Crash Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/bad-charset-alias.html [ Failure ]
@@ -21146,26 +21158,26 @@
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/char-encoding-in-hidden-charset-field-with-one-field.html [ Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/char-encoding-in-text-charset-field-with-value.html [ Crash Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/char-encoding-without-charset-field.html [ Failure ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hint-accept-on-subresource.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-accept-iframe.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-accept-meta.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-accept-parent.php [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-accept.php [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-dynamic-rw-sizes.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-invalid-accept.php [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-no-accept.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-picture-source-removal.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-picture.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-preload-rw-sizes.html [ Crash ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hint-accept-on-subresource.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-accept-iframe.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-accept-meta.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-accept-parent.php [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-accept.php [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-dynamic-rw-sizes.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-invalid-accept.php [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-no-accept.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-picture-source-removal.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-picture.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/client-hints-preload-rw-sizes.html [ Crash Pass ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/copy-resolves-urls.html [ Crash Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/crash-multiple-family-fontface.html [ Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/css-reject-any-type-in-strict-mode.html [ Failure ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/delete-frame-during-readystatechange-with-gc-after-video-removal.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/delete-frame-during-readystatechange.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/detach-during-notifyDone.html [ Crash ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/delete-frame-during-readystatechange-with-gc-after-video-removal.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/delete-frame-during-readystatechange.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/detach-during-notifyDone.html [ Crash Pass ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/dns-prefetch-control.html [ Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/drag-over-iframe-invalid-source-crash.html [ Crash Failure ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/embed-image-load-outlives-gc-without-crashing.html [ Crash ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/embed-image-load-outlives-gc-without-crashing.html [ Crash Pass ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/empty-cookie.html [ Crash Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/empty-file-formdata.html [ Crash Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/empty-urls.html [ Crash Failure ]
@@ -21176,17 +21188,17 @@
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/extract-http-content-language.php [ Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/favicon-as-image.html [ Crash Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/font-face-in-multiple-segmented-faces.html [ Crash Failure ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/form-action-using-replaceChild.html [ Crash ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/form-action-using-replaceChild.html [ Crash Pass ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/form-post-textplain.html [ Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/frame-access-during-load.html [ Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/generated-content-inside-table.html [ Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/gmail-assert-on-load.html [ Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/iframe-reparenting-id-collision.html [ Failure ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/iframe404.html [ Crash ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/iframe404.html [ Crash Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/image-blocked-src-change.html [ Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/image-blocked-src-no-change.html [ Crash Failure ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/image-input-type-outlives-gc-without-crashing.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/image-load-outlives-gc-without-crashing.html [ Crash ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/image-input-type-outlives-gc-without-crashing.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/image-load-outlives-gc-without-crashing.html [ Crash Pass ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/image-onerror-no-load-event.html [ Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/javascript-url-stop-loaders.html [ Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/link-rel-prefetch.html [ Crash Failure ]
@@ -21195,14 +21207,14 @@
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/object-embedding-svg-delayed-size-negotiation.xhtml [ Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/object-image-error-with-onload.html [ Crash Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/object-image-error.html [ Crash Failure ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/object-image-load-outlives-gc-without-crashing.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/onload-remove-iframe-crash-2.html [ Crash ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/object-image-load-outlives-gc-without-crashing.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/onload-remove-iframe-crash-2.html [ Crash Pass ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/percent-sign-in-form-field-name.html [ Crash Failure ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/plugin-array-detach.html [ Crash ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/plugin-array-detach.html [ Crash Pass ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/refresh-headers.php [ Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/resource-timing-iframe-restored-from-history.html [ Failure ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/resource-timing-sizes-multipart.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/resource-timing-sizes-tags.html [ Crash ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/resource-timing-sizes-multipart.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/resource-timing-sizes-tags.html [ Crash Pass ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/script-after-slow-stylesheet-removed.html [ Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/script-defer-after-slow-stylesheet.html [ Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/script-sync-slow-scripts-onerror.html [ Failure ]
@@ -21217,10 +21229,10 @@
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/submit-post-in-utf16le.html [ Crash Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/submit-post-in-utf32be.html [ Crash Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/submit-post-in-utf32le.html [ Crash Failure ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/svg-image-load-outlives-gc-without-crashing.html [ Crash ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/svg-image-load-outlives-gc-without-crashing.html [ Crash Pass ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/uncacheable-script-repeated.html [ Crash Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/unloadable-script.html [ Failure ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/video-poster-image-load-outlives-gc-without-crashing.html [ Crash ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/video-poster-image-load-outlives-gc-without-crashing.html [ Crash Pass ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/webtiming-buffer-full-no-event.html [ Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/webtiming-cross-origin-and-back.html [ Crash Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/webtiming-cross-origin-redirect.php [ Failure ]
@@ -21229,12 +21241,12 @@
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/webtiming-resolution.html [ Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/webtiming-slow-load.php [ Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/webtiming-two-redirects.php [ Failure ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/xslt-bad-import.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/security/cookies/third-party-cookie-blocking-worker.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/security/cookies/websocket/third-party-cookie-blocked-on-cross-origin-websocket.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/security/cookies/websocket/third-party-cookie-blocked-on-same-origin-websocket.html [ Crash ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/misc/xslt-bad-import.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/security/cookies/third-party-cookie-blocking-worker.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/security/cookies/websocket/third-party-cookie-blocked-on-cross-origin-websocket.html [ Crash Pass ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/security/cookies/websocket/third-party-cookie-blocked-on-same-origin-websocket.html [ Crash Pass ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/serviceworker/ServiceWorkerGlobalScope/registration-attribute.html [ Failure Pass ]
-crbug.com/591099 virtual/off-main-thread-fetch/http/tests/serviceworker/chromium/frame-detached-by-navigation.html [ Crash ]
+crbug.com/591099 virtual/off-main-thread-fetch/http/tests/serviceworker/chromium/frame-detached-by-navigation.html [ Crash Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/serviceworker/chromium/resolve-after-window-close.html [ Crash Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/serviceworker/chromium/service-worker-gc.html [ Failure ]
 crbug.com/591099 virtual/off-main-thread-fetch/http/tests/serviceworker/chromium/window-close-during-registration.html [ Failure ]
@@ -21347,23 +21359,23 @@
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/custom-scrollbar-changing-style-relayout-div-body-scrollablearea.html [ Crash Pass Timeout ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/custom-scrollbar-display.html [ Failure ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/custom-scrollbar-enable-changes-thickness-with-iframe.html [ Failure Pass ]
-crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/custom-scrollbar-not-inherited-by-iframe.html [ Crash ]
-crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/custom-scrollbar-reconstruction-document-write.html [ Crash ]
+crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/custom-scrollbar-not-inherited-by-iframe.html [ Crash Pass ]
+crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/custom-scrollbar-reconstruction-document-write.html [ Crash Pass ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/custom-scrollbar-with-incomplete-style.html [ Failure ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/disabled-scrollbar.html [ Failure ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/hidden-iframe-scrollbar-crash.html [ Crash Failure ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/hidden-scrollbar-prevents-layout.html [ Failure ]
-crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/iframe-scrollbar-becomes-custom.html [ Crash ]
+crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/iframe-scrollbar-becomes-custom.html [ Crash Pass ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/listbox-scrollbar-combinations.html [ Failure ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/overlay-scrollbars-within-overflow-scroll.html [ Failure ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/resize-scales-with-dpi-150.html [ Failure ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/rtl-resizer-position.html [ Failure ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/rtl/overflow-scroll-rtl.html [ Failure ]
-crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollable-iframe-click-gets-focus.html [ Crash ]
-crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollable-iframe-remove-crash.html [ Crash ]
-crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbar-added-during-drag.html [ Crash ]
+crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollable-iframe-click-gets-focus.html [ Crash Pass ]
+crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollable-iframe-remove-crash.html [ Crash Pass ]
+crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbar-added-during-drag.html [ Crash Pass ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbar-buttons.html [ Failure ]
-crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbar-click-does-not-blur-content.html [ Crash ]
+crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbar-click-does-not-blur-content.html [ Crash Failure ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbar-content-crash.html [ Failure ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbar-crash-on-refresh.html [ Failure ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbar-miss-mousemove-disabled.html [ Failure ]
@@ -21375,11 +21387,11 @@
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbar-visibility-hidden.html [ Failure ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbars-on-positioned-content.html [ Failure ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/viewport-scrollbar-corner-with-percent-padding-crash.html [ Failure ]
-crbug.com/591099 virtual/rootlayerscrolls/fast/history/scroll-restoration/scroll-restoration-fragment-navigation-crossdoc.html [ Crash ]
-crbug.com/591099 virtual/rootlayerscrolls/fast/history/scroll-restoration/scroll-restoration-navigation.html [ Crash ]
+crbug.com/591099 virtual/rootlayerscrolls/fast/history/scroll-restoration/scroll-restoration-fragment-navigation-crossdoc.html [ Crash Pass ]
+crbug.com/591099 virtual/rootlayerscrolls/fast/history/scroll-restoration/scroll-restoration-navigation.html [ Crash Pass ]
 crbug.com/591099 virtual/rootlayerscrolls/fast/rootscroller/set-root-scroller.html [ Failure ]
 crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/abspos-relayout-overflow-style-change.html [ Failure ]
-crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/content-box-smaller-than-scrollbar.html [ Crash ]
+crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/content-box-smaller-than-scrollbar.html [ Crash Failure ]
 crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/custom-scrollbar-style-applied.html [ Failure ]
 crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/editor-command-scroll-page-scale.html [ Failure ]
 crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/fractional-scroll-height-chaining.html [ Failure ]
@@ -21393,7 +21405,7 @@
 crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/scroll-clears-fragment-anchor.html [ Failure ]
 crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/scroll-element-into-view.html [ Failure ]
 crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/scroll-into-view-collapsed-div.html [ Failure ]
-crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/scroll-into-view-small-size-ancestor.html [ Crash ]
+crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/scroll-into-view-small-size-ancestor.html [ Crash Pass ]
 crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/scroll-max-value.html [ Crash Failure ]
 crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/scrollable-area-frame-overflow-hidden.html [ Crash Failure ]
 crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/scrollbar-mousedown-mouseup.html [ Failure ]
@@ -21411,23 +21423,23 @@
 crbug.com/591099 virtual/rootlayerscrolls/scrollbars/custom-scrollbar-changing-style-relayout-div-body-scrollablearea.html [ Crash Pass Timeout ]
 crbug.com/591099 virtual/rootlayerscrolls/scrollbars/custom-scrollbar-display.html [ Failure ]
 crbug.com/591099 virtual/rootlayerscrolls/scrollbars/custom-scrollbar-enable-changes-thickness-with-iframe.html [ Failure Pass ]
-crbug.com/591099 virtual/rootlayerscrolls/scrollbars/custom-scrollbar-not-inherited-by-iframe.html [ Crash ]
-crbug.com/591099 virtual/rootlayerscrolls/scrollbars/custom-scrollbar-reconstruction-document-write.html [ Crash ]
+crbug.com/591099 virtual/rootlayerscrolls/scrollbars/custom-scrollbar-not-inherited-by-iframe.html [ Crash Pass ]
+crbug.com/591099 virtual/rootlayerscrolls/scrollbars/custom-scrollbar-reconstruction-document-write.html [ Crash Pass ]
 crbug.com/591099 virtual/rootlayerscrolls/scrollbars/custom-scrollbar-with-incomplete-style.html [ Failure ]
 crbug.com/591099 virtual/rootlayerscrolls/scrollbars/disabled-scrollbar.html [ Failure ]
 crbug.com/591099 virtual/rootlayerscrolls/scrollbars/hidden-iframe-scrollbar-crash.html [ Crash Failure ]
 crbug.com/591099 virtual/rootlayerscrolls/scrollbars/hidden-scrollbar-prevents-layout.html [ Failure ]
-crbug.com/591099 virtual/rootlayerscrolls/scrollbars/iframe-scrollbar-becomes-custom.html [ Crash ]
+crbug.com/591099 virtual/rootlayerscrolls/scrollbars/iframe-scrollbar-becomes-custom.html [ Crash Pass ]
 crbug.com/591099 virtual/rootlayerscrolls/scrollbars/listbox-scrollbar-combinations.html [ Failure ]
 crbug.com/591099 virtual/rootlayerscrolls/scrollbars/overlay-scrollbars-within-overflow-scroll.html [ Failure ]
 crbug.com/591099 virtual/rootlayerscrolls/scrollbars/resize-scales-with-dpi-150.html [ Failure ]
 crbug.com/591099 virtual/rootlayerscrolls/scrollbars/rtl-resizer-position.html [ Failure ]
 crbug.com/591099 virtual/rootlayerscrolls/scrollbars/rtl/overflow-scroll-rtl.html [ Failure ]
-crbug.com/591099 virtual/rootlayerscrolls/scrollbars/scrollable-iframe-click-gets-focus.html [ Crash ]
-crbug.com/591099 virtual/rootlayerscrolls/scrollbars/scrollable-iframe-remove-crash.html [ Crash ]
+crbug.com/591099 virtual/rootlayerscrolls/scrollbars/scrollable-iframe-click-gets-focus.html [ Crash Pass ]
+crbug.com/591099 virtual/rootlayerscrolls/scrollbars/scrollable-iframe-remove-crash.html [ Crash Pass ]
 crbug.com/591099 virtual/rootlayerscrolls/scrollbars/scrollbar-added-during-drag.html [ Timeout ]
 crbug.com/591099 virtual/rootlayerscrolls/scrollbars/scrollbar-buttons.html [ Failure ]
-crbug.com/591099 virtual/rootlayerscrolls/scrollbars/scrollbar-click-does-not-blur-content.html [ Crash ]
+crbug.com/591099 virtual/rootlayerscrolls/scrollbars/scrollbar-click-does-not-blur-content.html [ Crash Failure ]
 crbug.com/591099 virtual/rootlayerscrolls/scrollbars/scrollbar-content-crash.html [ Failure ]
 crbug.com/591099 virtual/rootlayerscrolls/scrollbars/scrollbar-crash-on-refresh.html [ Failure ]
 crbug.com/591099 virtual/rootlayerscrolls/scrollbars/scrollbar-miss-mousemove-disabled.html [ Failure ]
@@ -21439,7 +21451,7 @@
 crbug.com/591099 virtual/rootlayerscrolls/scrollbars/scrollbar-visibility-hidden.html [ Failure ]
 crbug.com/591099 virtual/rootlayerscrolls/scrollbars/scrollbars-on-positioned-content.html [ Failure ]
 crbug.com/591099 virtual/rootlayerscrolls/scrollbars/viewport-scrollbar-corner-with-percent-padding-crash.html [ Failure ]
-crbug.com/591099 virtual/rootlayerscrolls/scrollingcoordinator/donot-compute-non-fast-scrollable-region-for-hidden-frames.html [ Crash Timeout ]
+crbug.com/591099 virtual/rootlayerscrolls/scrollingcoordinator/donot-compute-non-fast-scrollable-region-for-hidden-frames.html [ Crash Pass Timeout ]
 crbug.com/591099 virtual/rootlayerscrolls/scrollingcoordinator/non-fast-scrollable-region-nested.html [ Failure ]
 crbug.com/591099 virtual/rootlayerscrolls/scrollingcoordinator/non-fast-scrollable-region-scaled-iframe.html [ Failure ]
 crbug.com/591099 virtual/rootlayerscrolls/scrollingcoordinator/non-fast-scrollable-region-transformed-iframe.html [ Failure ]
@@ -21473,50 +21485,50 @@
 crbug.com/591099 virtual/service-worker-navigation-preload-disabled/webexposed/global-interface-listing.html [ Timeout ]
 crbug.com/591099 virtual/service-worker-navigation-preload-disabled/webexposed/nonstable-css-properties.html [ Failure ]
 crbug.com/591099 virtual/service-worker-navigation-preload-disabled/webexposed/permissions-attribute.html [ Failure ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/extendable-message-event.https.html [ Crash Timeout ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/unregister.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/update.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/activation.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/claim-fetch.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/claim-not-using-registration.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/claim-with-redirect.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/client-id.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/clients-get-cross-origin.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/clients-get.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/clients-matchall-exact-controller.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/clients-matchall-include-uncontrolled.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/clients-matchall-order.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/clients-matchall.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/extendable-event-async-waituntil.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-canvas-tainting-cache.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-canvas-tainting.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-cors-xhr.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-event.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-frame-resource.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-mixed-content-to-inscope.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-mixed-content-to-outscope.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-request-css-images.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-request-redirect.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-response-taint.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/foreign-fetch-basics.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/foreign-fetch-cors.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/foreign-fetch-workers.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/iframe-sandbox-register-link-element.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/multi-globals/url-parsing.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/navigation-preload/redirect.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/navigation-preload/resource-timing.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/navigation-redirect-to-http.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/navigation-redirect.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/ready.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/register-closed-window.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/register-link-header.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/register-same-scope-different-script-url.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/registration-iframe.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/unregister-controller.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/unregister-then-register-new-script.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/unregister-then-register.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/windowclient-navigate.https.html [ Crash ]
-crbug.com/591099 virtual/service-worker-script-streaming/http/tests/serviceworker/chromium/frame-detached-by-navigation.html [ Crash ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/extendable-message-event.https.html [ Crash Pass Timeout ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/unregister.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/update.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/activation.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/claim-fetch.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/claim-not-using-registration.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/claim-with-redirect.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/client-id.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/clients-get-cross-origin.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/clients-get.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/clients-matchall-exact-controller.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/clients-matchall-include-uncontrolled.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/clients-matchall-order.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/clients-matchall.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/extendable-event-async-waituntil.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-canvas-tainting-cache.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-canvas-tainting.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-cors-xhr.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-event.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-frame-resource.https.html [ Crash Timeout ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-mixed-content-to-inscope.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-mixed-content-to-outscope.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-request-css-images.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-request-redirect.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/fetch-response-taint.https.html [ Crash Timeout ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/foreign-fetch-basics.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/foreign-fetch-cors.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/foreign-fetch-workers.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/iframe-sandbox-register-link-element.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/multi-globals/url-parsing.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/navigation-preload/redirect.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/navigation-preload/resource-timing.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/navigation-redirect-to-http.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/navigation-redirect.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/ready.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/register-closed-window.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/register-link-header.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/register-same-scope-different-script-url.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/registration-iframe.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/unregister-controller.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/unregister-then-register-new-script.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/unregister-then-register.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/windowclient-navigate.https.html [ Crash Pass ]
+crbug.com/591099 virtual/service-worker-script-streaming/http/tests/serviceworker/chromium/frame-detached-by-navigation.html [ Crash Failure ]
 crbug.com/591099 virtual/service-worker-script-streaming/http/tests/serviceworker/chromium/resolve-after-window-close.html [ Failure ]
 crbug.com/591099 virtual/service-worker-script-streaming/http/tests/serviceworker/chromium/service-worker-gc.html [ Failure ]
 crbug.com/591099 virtual/service-worker-script-streaming/http/tests/serviceworker/chromium/window-close-during-registration.html [ Failure ]
@@ -21533,20 +21545,20 @@
 crbug.com/591099 virtual/stable/http/tests/navigation/anchor-goback.html [ Crash Failure ]
 crbug.com/591099 virtual/stable/http/tests/navigation/back-to-slow-frame.html [ Failure ]
 crbug.com/591099 virtual/stable/http/tests/navigation/cross-origin-fragment-navigation-is-async.html [ Failure ]
-crbug.com/591099 virtual/stable/http/tests/navigation/fallback-anchor-reload.html [ Crash ]
+crbug.com/591099 virtual/stable/http/tests/navigation/fallback-anchor-reload.html [ Crash Pass ]
 crbug.com/591099 virtual/stable/http/tests/navigation/form-targets-cross-site-frame-get.html [ Crash Failure ]
 crbug.com/591099 virtual/stable/http/tests/navigation/form-targets-cross-site-frame-no-referrer.html [ Crash Failure ]
 crbug.com/591099 virtual/stable/http/tests/navigation/form-targets-cross-site-frame-post.html [ Crash Failure ]
 crbug.com/591099 virtual/stable/http/tests/navigation/form-with-enctype-targets-cross-site-frame.html [ Crash Failure ]
 crbug.com/591099 virtual/stable/http/tests/navigation/forward-to-fragment-fires-onload.html [ Crash Failure ]
 crbug.com/591099 virtual/stable/http/tests/navigation/history-back-across-form-submission-to-fragment.html [ Failure ]
-crbug.com/591099 virtual/stable/http/tests/navigation/image-load-in-subframe-unload-handler.html [ Crash ]
+crbug.com/591099 virtual/stable/http/tests/navigation/image-load-in-subframe-unload-handler.html [ Crash Pass ]
 crbug.com/591099 virtual/stable/http/tests/navigation/javascriptlink-basic.html [ Crash Failure Timeout ]
 crbug.com/591099 virtual/stable/http/tests/navigation/javascriptlink-goback.html [ Crash Failure Timeout ]
 crbug.com/591099 virtual/stable/http/tests/navigation/lockedhistory-iframe.html [ Failure ]
 crbug.com/591099 virtual/stable/http/tests/navigation/metaredirect-basic.html [ Crash Failure ]
 crbug.com/591099 virtual/stable/http/tests/navigation/metaredirect-goback.html [ Crash Failure ]
-crbug.com/591099 virtual/stable/http/tests/navigation/navigate-during-commit.html [ Crash ]
+crbug.com/591099 virtual/stable/http/tests/navigation/navigate-during-commit.html [ Crash Pass ]
 crbug.com/591099 virtual/stable/http/tests/navigation/navigation-with-detached-origin-document.html [ Crash Pass ]
 crbug.com/591099 virtual/stable/http/tests/navigation/no-referrer-reset.html [ Failure Timeout ]
 crbug.com/591099 virtual/stable/http/tests/navigation/onload-navigation-iframe-2.html [ Failure ]
@@ -21577,7 +21589,7 @@
 crbug.com/591099 virtual/stable/http/tests/navigation/success200-goback.html [ Crash Failure ]
 crbug.com/591099 virtual/stable/http/tests/navigation/success200-loadsame.html [ Crash Failure ]
 crbug.com/591099 virtual/stable/http/tests/navigation/success200-reload.html [ Crash Failure ]
-crbug.com/591099 virtual/stable/http/tests/navigation/targeted-navigation-in-unload-handler.html [ Crash ]
+crbug.com/591099 virtual/stable/http/tests/navigation/targeted-navigation-in-unload-handler.html [ Crash Pass ]
 crbug.com/591099 virtual/stable/http/tests/navigation/timerredirect-basic.html [ Crash Failure ]
 crbug.com/591099 virtual/stable/http/tests/navigation/timerredirect-goback.html [ Crash Failure ]
 crbug.com/591099 virtual/stable/http/tests/navigation/useragent.php [ Failure ]
@@ -21590,7 +21602,7 @@
 crbug.com/591099 virtual/stable/http/tests/sendbeacon/beacon-detached-no-crash.html [ Failure ]
 crbug.com/591099 virtual/stable/http/tests/sendbeacon/beacon-same-origin.html [ Failure ]
 crbug.com/591099 virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker.html [ Pass Timeout ]
-crbug.com/591099 virtual/stable/svg/transforms/stable/legacy-transform-box.html [ Crash ]
+crbug.com/591099 virtual/stable/svg/transforms/stable/legacy-transform-box.html [ Crash Pass ]
 crbug.com/591099 virtual/stable/webexposed/custom-elements.html [ Failure ]
 crbug.com/591099 virtual/stable/webexposed/element-instance-property-listing.html [ Timeout ]
 crbug.com/591099 virtual/stable/webexposed/event-target-in-prototype.html [ Failure ]
@@ -21607,105 +21619,105 @@
 crbug.com/591099 virtual/threaded/animations/animation-css-rule-types.html [ Failure ]
 crbug.com/591099 virtual/threaded/animations/animation-events-create.html [ Failure ]
 crbug.com/591099 virtual/threaded/animations/animations-parsing.html [ Timeout ]
-crbug.com/591099 virtual/threaded/animations/animations-responsive-to-color-change.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/clear-svg-animation-effects.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/composition/background-position-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/composition/caret-color-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/composition/stroke-dasharray-composition.html [ Crash ]
+crbug.com/591099 virtual/threaded/animations/animations-responsive-to-color-change.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/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/css-animation-overrides-svg-presentation-attribute-animation.html [ Crash ]
+crbug.com/591099 virtual/threaded/animations/css-animation-overrides-svg-presentation-attribute-animation.html [ Crash Pass ]
 crbug.com/591099 virtual/threaded/animations/delay-start-event.html [ Failure ]
-crbug.com/591099 virtual/threaded/animations/display-change-does-not-terminate-animation.html [ Crash ]
+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/img-element-transform.html [ Crash Timeout ]
-crbug.com/591099 virtual/threaded/animations/inline-block-transform.html [ Crash ]
+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/inline-element-animation-end-hit-test.html [ Failure ]
-crbug.com/591099 virtual/threaded/animations/interpolation/backdrop-filter-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/background-color-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/background-image-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/background-position-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/background-position-origin-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/background-size-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/border-color-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/border-image-outset-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/border-image-slice-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/border-image-source-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/border-image-width-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/border-radius-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/border-spacing-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/border-width-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/bottom-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/box-shadow-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/calc-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/caret-color-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/clip-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/color-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/filter-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/font-size-adjust-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/font-size-interpolation-unset.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/font-size-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/font-size-zoom-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/font-weight-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/height-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/line-height-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/margin-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/max-height-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/min-height-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/object-position-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/offset-rotate-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/opacity-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/outline-color-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/outline-offset-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/outline-width-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/padding-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/perspective-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/perspective-origin-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/position-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/sample-interpolation-test.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/svg-baseline-shift-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/svg-cx-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/svg-cy-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/svg-d-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/svg-fill-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/svg-fill-opacity-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/svg-flood-color-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/svg-flood-opacity-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/svg-lighting-color-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/svg-r-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/svg-rx-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/svg-ry-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/svg-stop-color-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/svg-stop-opacity-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/svg-stroke-dasharray-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/svg-stroke-dashoffset-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/svg-stroke-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/svg-stroke-miterlimit-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/svg-stroke-opacity-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/svg-stroke-width-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/text-decoration-color-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/text-shadow-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/top-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/transform-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/transform-origin-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/vertical-align-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/viewport-unit-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/webkit-background-size-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/webkit-clip-path-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/webkit-column-rule-color-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/webkit-mask-box-image-outset-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/webkit-mask-box-image-slice-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/webkit-mask-box-image-source-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/webkit-mask-box-image-width-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/webkit-mask-image-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/webkit-mask-position-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/webkit-mask-size-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/webkit-perspective-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/webkit-perspective-origin-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/webkit-text-stroke-color-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/webkit-transform-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/interpolation/webkit-transform-origin-interpolation.html [ Crash ]
+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 ]
+crbug.com/591099 virtual/threaded/animations/interpolation/background-position-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/background-position-origin-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/background-size-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/border-color-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/border-image-outset-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/border-image-slice-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/border-image-source-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/border-image-width-interpolation.html [ Crash Timeout ]
+crbug.com/591099 virtual/threaded/animations/interpolation/border-radius-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/border-spacing-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/border-width-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/bottom-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/box-shadow-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/calc-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/caret-color-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/clip-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/color-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/filter-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/font-size-adjust-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/font-size-interpolation-unset.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/font-size-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/font-size-zoom-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/font-weight-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/height-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/line-height-interpolation.html [ Crash Timeout ]
+crbug.com/591099 virtual/threaded/animations/interpolation/margin-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/max-height-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/min-height-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/object-position-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/offset-rotate-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/opacity-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/outline-color-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/outline-offset-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/outline-width-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/padding-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/perspective-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/perspective-origin-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/position-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/sample-interpolation-test.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/svg-baseline-shift-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/svg-cx-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/svg-cy-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/svg-d-interpolation.html [ Crash Timeout ]
+crbug.com/591099 virtual/threaded/animations/interpolation/svg-fill-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/svg-fill-opacity-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/svg-flood-color-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/svg-flood-opacity-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/svg-lighting-color-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/svg-r-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/svg-rx-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/svg-ry-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/svg-stop-color-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/svg-stop-opacity-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/svg-stroke-dasharray-interpolation.html [ Crash Timeout ]
+crbug.com/591099 virtual/threaded/animations/interpolation/svg-stroke-dashoffset-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/svg-stroke-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/svg-stroke-miterlimit-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/svg-stroke-opacity-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/svg-stroke-width-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/text-decoration-color-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/text-shadow-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/top-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/transform-interpolation.html [ Crash Timeout ]
+crbug.com/591099 virtual/threaded/animations/interpolation/transform-origin-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/vertical-align-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/viewport-unit-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/webkit-background-size-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/webkit-clip-path-interpolation.html [ Crash Timeout ]
+crbug.com/591099 virtual/threaded/animations/interpolation/webkit-column-rule-color-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/webkit-mask-box-image-outset-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/webkit-mask-box-image-slice-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/webkit-mask-box-image-source-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/webkit-mask-box-image-width-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/webkit-mask-image-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/webkit-mask-position-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/webkit-mask-size-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/webkit-perspective-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/webkit-perspective-origin-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/webkit-text-stroke-color-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/interpolation/webkit-transform-interpolation.html [ Crash Timeout ]
+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/negative-delay-events.html [ Failure ]
@@ -21714,7 +21726,7 @@
 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/d-responsive.html [ Crash ]
+crbug.com/591099 virtual/threaded/animations/responsive/d-responsive.html [ Crash Pass ]
 crbug.com/591099 virtual/threaded/animations/responsive/line-height-responsive.html [ Pass Timeout ]
 crbug.com/591099 virtual/threaded/animations/rotate-transform-equivalent.html [ Failure Timeout ]
 crbug.com/591099 virtual/threaded/animations/skew-notsequential-compositor.html [ Failure Timeout ]
@@ -21722,171 +21734,171 @@
 crbug.com/591099 virtual/threaded/animations/stability/animation-iteration-event-destroy-renderer.html [ Failure ]
 crbug.com/591099 virtual/threaded/animations/stability/animation-on-inline-crash.html [ Failure ]
 crbug.com/591099 virtual/threaded/animations/stability/animation-start-event-destroy-renderer.html [ Failure ]
-crbug.com/591099 virtual/threaded/animations/stability/base-render-style-crash.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/stability/checkbox-padding-animation-crash.html [ Crash ]
+crbug.com/591099 virtual/threaded/animations/stability/base-render-style-crash.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/stability/checkbox-padding-animation-crash.html [ Crash Pass ]
 crbug.com/591099 virtual/threaded/animations/stability/element-animate-float-crash.html [ Failure Pass ]
 crbug.com/591099 virtual/threaded/animations/stability/empty-keyframe-animation-composited.html [ Failure ]
 crbug.com/591099 virtual/threaded/animations/stability/empty-keyframes-composited.html [ Failure ]
 crbug.com/591099 virtual/threaded/animations/stability/empty-keyframes.html [ Failure ]
 crbug.com/591099 virtual/threaded/animations/stability/import-crash.html [ Failure ]
 crbug.com/591099 virtual/threaded/animations/stability/length-zero-percent-crash.html [ Failure Pass ]
-crbug.com/591099 virtual/threaded/animations/stability/option-element-crash.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/stability/option-opacity-inherit-crash.html [ Crash ]
+crbug.com/591099 virtual/threaded/animations/stability/option-element-crash.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/stability/option-opacity-inherit-crash.html [ Crash Pass ]
 crbug.com/591099 virtual/threaded/animations/stability/pause-crash.html [ Failure ]
-crbug.com/591099 virtual/threaded/animations/stability/svg-element-css-animation-crash.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/stability/svg-length-unittype-crash.html [ Crash ]
+crbug.com/591099 virtual/threaded/animations/stability/svg-element-css-animation-crash.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/stability/svg-length-unittype-crash.html [ Crash Pass ]
 crbug.com/591099 virtual/threaded/animations/stability/zero-duration-infinite-iterations.html [ Failure ]
 crbug.com/591099 virtual/threaded/animations/stability/zero-duration-large-start-delay.html [ Failure ]
 crbug.com/591099 virtual/threaded/animations/state-at-end-event.html [ Failure Pass Timeout ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-amplitude-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-azimuth-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-baseFrequency-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-bias-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-cx-cy-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-d-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-diffuseConstant-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-divisor-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-dx-dy-length-list-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-dx-dy-number-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-elevation-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-exponent-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-fx-fy-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-gradientTransform-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-height-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-intercept-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-k1-k2-k3-k4-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-kernelMatrix-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-kernelUnitLength-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-limitingConeAngle-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-markerHeight-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-markerWidth-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-mode-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-numOctaves-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-offset-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-order-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-orient-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-pathLength-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-patternTransform-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-points-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-pointsAtX-pointsAtY-pointsAtZ-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-r-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-radius-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-refX-refY-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-rotate-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-rx-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-scale-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-seed-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-slope-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-specularConstant-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-specularExponent-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-startOffset-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-stdDeviation-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-surfaceScale-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-tableValues-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-targetX-targetY-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-textLength-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-transform-composition-distinct.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-transform-composition-list.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-transform-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-transform-matrix.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-values-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-viewBox-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-width-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-x-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-x-list-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-x1-x2-y1-y2-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-y-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-y-list-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-z-composition.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-amplitude-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-azimuth-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-baseFrequency-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-bias-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-calc-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-class-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-clipPathUnits-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-cx-cy-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-d-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-diffuseConstant-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-divisor-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-dx-dy-length-list-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-dx-dy-number-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-edgeMode-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-elevation-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-exponent-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-filterUnits-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-fx-fy-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-gradientTransform-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-gradientUnits-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-height-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-href-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-in-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-intercept-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-k1-k2-k3-k4-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-kernelMatrix-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-kernelUnitLength-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-lengthAdjust-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-limitingConeAngle-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-markerHeight-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-markerUnits-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-markerWidth-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-maskContentUnits-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-maskUnits-interpolation.html [ Crash Timeout ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-method-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-mode-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-numOctaves-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-offset-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-operator-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-order-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-orient-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-pathLength-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-patternContentUnits-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-patternTransform-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-patternUnits-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-points-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-pointsAtX-pointsAtY-pointsAtZ-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-preserveAlpha-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-preserveAspectRatio-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-primitiveUnits-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-r-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-radius-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-refX-refY-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-result-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-rotate-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-rx-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-scale-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-seed-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-slope-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-spacing-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-specularConstant-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-specularExponent-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-spreadMethod-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-startOffset-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-stdDeviation-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-stitchTiles-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-surfaceScale-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-tableValues-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-target-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-targetX-targetY-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-textLength-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-transform-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-type-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-values-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-viewBox-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-width-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-x-list-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-x-y-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-x1-x2-y1-y2-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-xChannelSelector-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-y-list-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-z-interpolation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-responsive/svg-d-responsive.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-responsive/svg-points-responsive.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-responsive/svg-tableValues-responsive.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-responsive/svg-transform-responsive.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-attribute-responsive/svg-x-list-responsive.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-presentation-attribute-animation.html [ Crash ]
-crbug.com/591099 virtual/threaded/animations/svg-responsive-to-timing-updates.html [ Crash ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-amplitude-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-azimuth-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-baseFrequency-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-bias-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-cx-cy-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-d-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-diffuseConstant-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-divisor-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-dx-dy-length-list-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-dx-dy-number-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-elevation-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-exponent-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-fx-fy-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-gradientTransform-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-height-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-intercept-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-k1-k2-k3-k4-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-kernelMatrix-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-kernelUnitLength-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-limitingConeAngle-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-markerHeight-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-markerWidth-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-mode-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-numOctaves-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-offset-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-order-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-orient-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-pathLength-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-patternTransform-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-points-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-pointsAtX-pointsAtY-pointsAtZ-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-r-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-radius-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-refX-refY-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-rotate-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-rx-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-scale-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-seed-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-slope-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-specularConstant-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-specularExponent-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-startOffset-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-stdDeviation-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-surfaceScale-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-tableValues-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-targetX-targetY-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-textLength-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-transform-composition-distinct.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-transform-composition-list.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-transform-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-transform-matrix.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-values-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-viewBox-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-width-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-x-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-x-list-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-x1-x2-y1-y2-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-y-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-y-list-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-composition/svg-z-composition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-amplitude-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-azimuth-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-baseFrequency-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-bias-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-calc-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-class-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-clipPathUnits-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-cx-cy-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-d-interpolation.html [ Crash Timeout ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-diffuseConstant-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-divisor-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-dx-dy-length-list-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-dx-dy-number-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-edgeMode-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-elevation-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-exponent-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-filterUnits-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-fx-fy-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-gradientTransform-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-gradientUnits-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-height-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-href-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-in-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-intercept-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-k1-k2-k3-k4-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-kernelMatrix-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-kernelUnitLength-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-lengthAdjust-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-limitingConeAngle-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-markerHeight-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-markerUnits-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-markerWidth-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-maskContentUnits-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-maskUnits-interpolation.html [ Crash Pass Timeout ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-method-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-mode-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-numOctaves-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-offset-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-operator-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-order-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-orient-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-pathLength-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-patternContentUnits-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-patternTransform-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-patternUnits-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-points-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-pointsAtX-pointsAtY-pointsAtZ-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-preserveAlpha-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-preserveAspectRatio-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-primitiveUnits-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-r-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-radius-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-refX-refY-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-result-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-rotate-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-rx-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-scale-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-seed-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-slope-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-spacing-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-specularConstant-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-specularExponent-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-spreadMethod-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-startOffset-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-stdDeviation-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-stitchTiles-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-surfaceScale-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-tableValues-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-target-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-targetX-targetY-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-textLength-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-transform-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-type-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-values-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-viewBox-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-width-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-x-list-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-x-y-interpolation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-interpolation/svg-x1-x2-y1-y2-interpolation.html [ Crash Pass ]
+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/svg-attribute-responsive/svg-d-responsive.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-responsive/svg-points-responsive.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-responsive/svg-tableValues-responsive.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-responsive/svg-transform-responsive.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-attribute-responsive/svg-x-list-responsive.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-presentation-attribute-animation.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/animations/svg-responsive-to-timing-updates.html [ Crash Pass ]
 crbug.com/591099 virtual/threaded/animations/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 ]
@@ -21914,77 +21926,77 @@
 crbug.com/591099 virtual/threaded/fast/scroll-behavior/overflow-scroll-triggers-layout.html [ Failure ]
 crbug.com/591099 virtual/threaded/fast/scroll-behavior/parse-scroll-behavior.html [ Failure ]
 crbug.com/591099 virtual/threaded/fast/scroll-behavior/scroll-into-view-scrolls-layout-viewport.html [ Failure ]
-crbug.com/591099 virtual/threaded/fast/scroll-behavior/scroll-over-resizer.html [ Crash ]
+crbug.com/591099 virtual/threaded/fast/scroll-behavior/scroll-over-resizer.html [ Crash Pass ]
 crbug.com/591099 virtual/threaded/fast/scroll-behavior/smooth-scroll/fixed-background-in-iframe.html [ Failure ]
 crbug.com/591099 virtual/threaded/fast/scroll-behavior/smooth-scroll/keyboard-scroll.html [ Failure ]
 crbug.com/591099 virtual/threaded/fast/scroll-behavior/smooth-scroll/main-thread-scrolling-reason-added.html [ Failure ]
 crbug.com/591099 virtual/threaded/fast/scroll-behavior/smooth-scroll/main-thread-scrolling-reason-correctness.html [ Failure Timeout ]
-crbug.com/591099 virtual/threaded/http/tests/worklet/chromium/import-on-detached-iframe.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/anonymous-image-object.html [ Crash ]
+crbug.com/591099 virtual/threaded/http/tests/worklet/chromium/import-on-detached-iframe.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/inspector/tracing/anonymous-image-object.html [ Crash Failure ]
 crbug.com/591099 virtual/threaded/inspector/tracing/buffer-usage.html [ Failure ]
 crbug.com/591099 virtual/threaded/inspector/tracing/category-filter.html [ Failure ]
-crbug.com/591099 virtual/threaded/inspector/tracing/console-timeline.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/decode-resize.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/frame-model-instrumentation.html [ Crash ]
+crbug.com/591099 virtual/threaded/inspector/tracing/console-timeline.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/decode-resize.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/frame-model-instrumentation.html [ Crash Pass ]
 crbug.com/591099 virtual/threaded/inspector/tracing/frame-model.html [ Failure ]
-crbug.com/591099 virtual/threaded/inspector/tracing/hit-test.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/idle-callback.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/scroll-invalidations.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/compile-script.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-gc-event.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-injected-script-eval.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-js-line-level-profile.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-microtasks.html [ Crash ]
+crbug.com/591099 virtual/threaded/inspector/tracing/hit-test.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/idle-callback.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/scroll-invalidations.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/compile-script.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-gc-event.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-injected-script-eval.html [ Crash Pass ]
+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 ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-script-id.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-script-tag-1.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-js/timeline-script-tag-2.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-layout/timeline-layout-reason.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-layout/timeline-layout-with-invalidations.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-layout/timeline-layout.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-aggregated-details.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-animation-frame.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-bound-function.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-event-causes.html [ Crash ]
+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-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 ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-layout/timeline-layout-reason.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-layout/timeline-layout-with-invalidations.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-layout/timeline-layout.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-aggregated-details.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-animation-frame.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-bound-function.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-event-causes.html [ Crash Failure ]
 crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-event-details.html [ Crash Failure ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-event-dispatch.html [ Crash ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-event-dispatch.html [ Crash Failure ]
 crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-filtering.html [ Crash Failure ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-flame-chart-automatically-size-window.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-grouped-invalidations.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-load-event.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-mark-timeline.html [ Crash ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-flame-chart-automatically-size-window.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-grouped-invalidations.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-load-event.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-mark-timeline.html [ Crash Failure ]
 crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-model.html [ Crash Failure ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-node-reference.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-parse-html.html [ Crash ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-node-reference.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-parse-html.html [ Crash Failure ]
 crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-range-stats.html [ Crash Failure ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-record-reload.html [ Crash ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-record-reload.html [ Crash Failure ]
 crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-search.html [ Failure ]
 crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-tree-search.html [ Crash Failure ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-trivial.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-window-filter.html [ Crash ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-trivial.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-misc/timeline-window-filter.html [ Crash Failure ]
 crbug.com/591099 virtual/threaded/inspector/tracing/timeline-network/timeline-network-resource-details.html [ Failure ]
 crbug.com/591099 virtual/threaded/inspector/tracing/timeline-network/timeline-network-resource.html [ Failure ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-paint/paint-profiler-update.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-paint/timeline-paint-and-multiple-style-invalidations.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-paint/timeline-paint-with-layout-invalidations-on-deleted-node.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-paint/timeline-paint-with-layout-invalidations.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-paint/timeline-paint-with-style-recalc-invalidations.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-paint/timeline-paint.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-paint/update-layer-tree.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-style/parse-author-style-sheet.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-style/timeline-recalculate-styles.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-style/timeline-style-recalc-all-invalidator-types.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-style/timeline-style-recalc-with-invalidations.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-style/timeline-style-recalc-with-invalidator-invalidations.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-time/timeline-time-stamp.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-time/timeline-time.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-time/timeline-timer-fired-from-eval-call-site.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-time/timeline-timer.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/timeline-time/timeline-usertiming.html [ Crash ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-paint/paint-profiler-update.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-paint/timeline-paint-and-multiple-style-invalidations.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-paint/timeline-paint-with-layout-invalidations-on-deleted-node.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-paint/timeline-paint-with-layout-invalidations.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-paint/timeline-paint-with-style-recalc-invalidations.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-paint/timeline-paint.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-paint/update-layer-tree.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-style/parse-author-style-sheet.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-style/timeline-recalculate-styles.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-style/timeline-style-recalc-all-invalidator-types.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-style/timeline-style-recalc-with-invalidations.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-style/timeline-style-recalc-with-invalidator-invalidations.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-time/timeline-time-stamp.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-time/timeline-time.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-time/timeline-timer-fired-from-eval-call-site.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-time/timeline-timer.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/timeline-time/timeline-usertiming.html [ Crash Failure ]
 crbug.com/591099 virtual/threaded/inspector/tracing/tracing-timeline-load.html [ Failure ]
-crbug.com/591099 virtual/threaded/inspector/tracing/worker-events.html [ Crash ]
-crbug.com/591099 virtual/threaded/inspector/tracing/worker-js-frames.html [ Crash ]
+crbug.com/591099 virtual/threaded/inspector/tracing/worker-events.html [ Crash Failure ]
+crbug.com/591099 virtual/threaded/inspector/tracing/worker-js-frames.html [ Crash Failure ]
 crbug.com/591099 virtual/threaded/printing/absolute-position-headers-and-footers.html [ Failure ]
 crbug.com/591099 virtual/threaded/printing/absolute-positioned.html [ Failure ]
 crbug.com/591099 virtual/threaded/printing/allowed-page-breaks.html [ Failure ]
@@ -22042,28 +22054,28 @@
 crbug.com/591099 virtual/threaded/printing/viewport-size-dependant-iframe-with-multicol-crash.html [ Failure ]
 crbug.com/591099 virtual/threaded/transitions/3d/interrupted-transition.html [ Failure ]
 crbug.com/591099 virtual/threaded/transitions/bad-transition-shorthand-crash.html [ Failure ]
-crbug.com/591099 virtual/threaded/transitions/cubic-bezier-overflow-svg-length.html [ Crash ]
+crbug.com/591099 virtual/threaded/transitions/cubic-bezier-overflow-svg-length.html [ Crash Pass ]
 crbug.com/591099 virtual/threaded/transitions/inherit-other-props-do-not-affect-transition-property.html [ Failure ]
 crbug.com/591099 virtual/threaded/transitions/inherit-other-props.html [ Failure ]
 crbug.com/591099 virtual/threaded/transitions/inherit.html [ Failure ]
-crbug.com/591099 virtual/threaded/transitions/interrupted-accelerated-transition.html [ Crash ]
+crbug.com/591099 virtual/threaded/transitions/interrupted-accelerated-transition.html [ Crash Pass ]
 crbug.com/591099 virtual/threaded/transitions/interrupted-immediately.html [ Failure ]
 crbug.com/591099 virtual/threaded/transitions/matched-transform-functions.html [ Failure ]
-crbug.com/591099 virtual/threaded/transitions/mismatched-shadow-styles.html [ Crash ]
-crbug.com/591099 virtual/threaded/transitions/no-transition-on-implicit-margins.html [ Crash ]
-crbug.com/591099 virtual/threaded/transitions/object-position-transition.html [ Crash ]
+crbug.com/591099 virtual/threaded/transitions/mismatched-shadow-styles.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/transitions/no-transition-on-implicit-margins.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/transitions/object-position-transition.html [ Crash Pass ]
 crbug.com/591099 virtual/threaded/transitions/opacity-transform-transitions-inside-iframe.html [ Failure Timeout ]
 crbug.com/591099 virtual/threaded/transitions/opacity-transition-zindex.html [ Failure Pass Timeout ]
 crbug.com/591099 virtual/threaded/transitions/override-transition-crash.html [ Failure ]
 crbug.com/591099 virtual/threaded/transitions/retargetted-transition.html [ Failure ]
 crbug.com/591099 virtual/threaded/transitions/shadow.html [ Failure ]
-crbug.com/591099 virtual/threaded/transitions/svg-layout-transition-zoom.html [ Crash ]
-crbug.com/591099 virtual/threaded/transitions/svg-layout-transition.html [ Crash ]
-crbug.com/591099 virtual/threaded/transitions/svg-transitions.html [ Crash ]
+crbug.com/591099 virtual/threaded/transitions/svg-layout-transition-zoom.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/transitions/svg-layout-transition.html [ Crash Pass ]
+crbug.com/591099 virtual/threaded/transitions/svg-transitions.html [ Crash Pass ]
 crbug.com/591099 virtual/threaded/transitions/transition-end-event-all-properties.html [ Failure Timeout ]
 crbug.com/591099 virtual/threaded/transitions/transition-end-event-attributes.html [ Failure ]
 crbug.com/591099 virtual/threaded/transitions/transition-end-event-container.html [ Failure ]
-crbug.com/591099 virtual/threaded/transitions/transition-end-event-destroy-iframe.html [ Crash ]
+crbug.com/591099 virtual/threaded/transitions/transition-end-event-destroy-iframe.html [ Crash Failure ]
 crbug.com/591099 virtual/threaded/transitions/transition-end-event-destroy-renderer.html [ Failure ]
 crbug.com/591099 virtual/threaded/transitions/transition-end-event-left.html [ Failure ]
 crbug.com/591099 virtual/threaded/transitions/transition-end-event-multiple-01.html [ Failure Timeout ]
@@ -22097,34 +22109,34 @@
 crbug.com/591099 virtual/wheelscrolllatching/fast/events/wheel/wheelevent-in-horizontal-scrollbar-in-rtl.html [ Failure ]
 crbug.com/591099 virtual/wheelscrolllatching/fast/events/wheel/wheelevent-in-vertical-scrollbar-in-rtl.html [ Failure ]
 crbug.com/591099 virtual/wheelscrolllatching/fast/events/wheel/wheelevent-mousewheel-interaction.html [ Failure ]
-crbug.com/591099 vr/events_vrdisplayactivate.html [ Crash ]
-crbug.com/591099 vr/events_vrdisplayconnect.html [ Crash ]
-crbug.com/591099 vr/events_vrdisplaypresentchange.html [ Crash ]
-crbug.com/591099 vr/exitPresent_reject_notpresenting.html [ Crash ]
-crbug.com/591099 vr/exitPresent_resolve.html [ Crash ]
-crbug.com/591099 vr/getEyeParameters_match.html [ Crash ]
-crbug.com/591099 vr/getLayers_notpresenting.html [ Crash ]
-crbug.com/591099 vr/getLayers_presenting.html [ Crash ]
-crbug.com/591099 vr/getLayers_presenting_nondefaultbounds.html [ Crash ]
-crbug.com/591099 vr/getLayers_update.html [ Crash ]
-crbug.com/591099 vr/requestAnimationFrame_consistentTimestamps.html [ Crash ]
-crbug.com/591099 vr/requestAnimationFrame_handoff.html [ Crash ]
-crbug.com/591099 vr/requestAnimationFrame_submitFrame_combinations.html [ Crash Timeout ]
-crbug.com/591099 vr/requestPresent_reject_badleftbounds.html [ Crash ]
-crbug.com/591099 vr/requestPresent_reject_badrightbounds.html [ Crash ]
-crbug.com/591099 vr/requestPresent_reject_nogesture.html [ Crash ]
-crbug.com/591099 vr/requestPresent_reject_nolayers.html [ Crash ]
-crbug.com/591099 vr/requestPresent_reject_nosource.html [ Crash ]
-crbug.com/591099 vr/requestPresent_reject_notsupported.html [ Crash ]
-crbug.com/591099 vr/requestPresent_reject_nowebgl.html [ Crash ]
-crbug.com/591099 vr/requestPresent_reject_nullsource.html [ Crash ]
-crbug.com/591099 vr/requestPresent_reject_toomanylayers.html [ Crash ]
-crbug.com/591099 vr/requestPresent_resolve.html [ Crash ]
-crbug.com/591099 vr/requestPresent_resolve_repeatwithgesture.html [ Crash ]
-crbug.com/591099 vr/requestPresent_resolve_repeatwithoutgesture.html [ Crash ]
-crbug.com/591099 vr/requestPresent_resolve_then_reject.html [ Crash Timeout ]
-crbug.com/591099 vr/requestPresent_resolve_webgl2.html [ Crash ]
-crbug.com/591099 vr/stageParameters_match.html [ Crash ]
+crbug.com/591099 vr/events_vrdisplayactivate.html [ Crash Pass ]
+crbug.com/591099 vr/events_vrdisplayconnect.html [ Crash Pass ]
+crbug.com/591099 vr/events_vrdisplaypresentchange.html [ Crash Pass ]
+crbug.com/591099 vr/exitPresent_reject_notpresenting.html [ Crash Pass ]
+crbug.com/591099 vr/exitPresent_resolve.html [ Crash Pass ]
+crbug.com/591099 vr/getEyeParameters_match.html [ Crash Pass ]
+crbug.com/591099 vr/getLayers_notpresenting.html [ Crash Pass ]
+crbug.com/591099 vr/getLayers_presenting.html [ Crash Pass ]
+crbug.com/591099 vr/getLayers_presenting_nondefaultbounds.html [ Crash Pass ]
+crbug.com/591099 vr/getLayers_update.html [ Crash Pass ]
+crbug.com/591099 vr/requestAnimationFrame_consistentTimestamps.html [ Crash Pass ]
+crbug.com/591099 vr/requestAnimationFrame_handoff.html [ Crash Pass ]
+crbug.com/591099 vr/requestAnimationFrame_submitFrame_combinations.html [ Crash Pass Timeout ]
+crbug.com/591099 vr/requestPresent_reject_badleftbounds.html [ Crash Pass ]
+crbug.com/591099 vr/requestPresent_reject_badrightbounds.html [ Crash Pass ]
+crbug.com/591099 vr/requestPresent_reject_nogesture.html [ Crash Pass ]
+crbug.com/591099 vr/requestPresent_reject_nolayers.html [ Crash Pass ]
+crbug.com/591099 vr/requestPresent_reject_nosource.html [ Crash Pass ]
+crbug.com/591099 vr/requestPresent_reject_notsupported.html [ Crash Pass ]
+crbug.com/591099 vr/requestPresent_reject_nowebgl.html [ Crash Pass ]
+crbug.com/591099 vr/requestPresent_reject_nullsource.html [ Crash Pass ]
+crbug.com/591099 vr/requestPresent_reject_toomanylayers.html [ Crash Pass ]
+crbug.com/591099 vr/requestPresent_resolve.html [ Crash Pass ]
+crbug.com/591099 vr/requestPresent_resolve_repeatwithgesture.html [ Crash Pass ]
+crbug.com/591099 vr/requestPresent_resolve_repeatwithoutgesture.html [ Crash Pass ]
+crbug.com/591099 vr/requestPresent_resolve_then_reject.html [ Crash Pass Timeout ]
+crbug.com/591099 vr/requestPresent_resolve_webgl2.html [ Crash Pass ]
+crbug.com/591099 vr/stageParameters_match.html [ Crash Pass ]
 crbug.com/591099 webaudio/BiquadFilter/tail-time-lowpass.html [ Timeout ]
 crbug.com/591099 webaudio/OfflineAudioContext/offlineaudiocontext-detached-no-crash.html [ Failure ]
 crbug.com/591099 webaudio/ScriptProcessor/scriptprocessornode-detached-no-crash.html [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-slimming-paint-v2 b/third_party/WebKit/LayoutTests/FlagExpectations/enable-slimming-paint-v2
index ffcbead..c28216d 100644
--- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-slimming-paint-v2
+++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-slimming-paint-v2
@@ -520,11 +520,9 @@
 Bug(none) fast/canvas/OffscreenCanvas-transform-shadow-in-worker.html [ Failure ]
 Bug(none) fast/canvas/webgl/pixelated.html [ Failure ]
 Bug(none) fast/clip/nestedTransparencyClip.html [ Failure ]
-Bug(none) fast/clip/overflow-border-radius-clip.html [ Failure ]
 Bug(none) fast/clip/overflow-border-radius-combinations.html [ Failure ]
 Bug(none) fast/clip/overflow-border-radius-composited-parent.html [ Failure ]
 Bug(none) fast/clip/overflow-border-radius-composited.html [ Failure ]
-Bug(none) fast/clip/overflow-border-radius-fixed-position.html [ Failure ]
 Bug(none) fast/clip/overflow-border-radius-transformed.html [ Failure ]
 Bug(none) fast/css-generated-content/014.html [ Failure ]
 Bug(none) fast/css-generated-content/table-parts-before-and-after.html [ Failure ]
@@ -637,7 +635,6 @@
 Bug(none) fast/inline/inline-continuation-borders.html [ Failure ]
 Bug(none) fast/layers/normal-flow-hit-test.html [ Crash Failure ]
 Bug(none) fast/layers/opacity-outline.html [ Failure ]
-Bug(none) fast/layers/overflow-hidden-rounded-corners-occlusion.html [ Failure ]
 Bug(none) fast/layers/remove-layer-with-nested-stacking.html [ Skip ]
 Bug(none) fast/layers/scroll-rect-to-visible.html [ Failure ]
 Bug(none) fast/lists/008.html [ Failure ]
@@ -1006,7 +1003,6 @@
 Bug(none) paint/invalidation/svg/deep-nested-embedded-svg-size-changes-no-layout-triggers-1.html [ Failure ]
 Bug(none) paint/invalidation/svg/deep-nested-embedded-svg-size-changes-no-layout-triggers-2.html [ Failure ]
 Bug(none) paint/invalidation/svg/use-detach.svg [ Failure ]
-Bug(none) paint/background/rounded-clip-fractional-offset.html [ Failure ]
 Bug(none) paint/clipath/clip-path-with-background-and-box-behind.html [ Failure ]
 Bug(none) paint/frames/frameset-with-stacking-context-and-not-stacking-context-children.html [ Failure ]
 Bug(none) paint/frames/frameset-with-stacking-contexts.html [ Failure ]
@@ -1252,7 +1248,6 @@
 
 # Mask does not work correctly
 crbug.com/707444 svg/W3C-SVG-1.1/masking-intro-01-f.svg [ Failure ]
-crbug.com/707444 svg/as-background-image/svg-as-background-6.html [ Failure ]
 crbug.com/707444 svg/batik/masking/maskRegions.svg [ Failure ]
 crbug.com/707444 svg/custom/clamped-masking-clipping.svg [ Failure ]
 crbug.com/707444 svg/custom/clip-mask-negative-scale.svg [ Failure ]
@@ -1568,9 +1563,16 @@
 crbug.com/589265 css3/blending/mix-blend-mode-isolated-group-3.html [ Failure ]
 crbug.com/589265 css3/blending/svg-blend-exclusion.html [ Failure ]
 crbug.com/589265 css3/blending/svg-blend-screen.html [ Failure ]
+crbug.com/589265 fast/backgrounds/size/contain-and-cover-zoomed.html [ Failure ]
 crbug.com/589265 fast/css/ZeroOpacityLayers.html [ Failure ]
 crbug.com/589265 fast/css/ZeroOpacityLayers2.html [ Failure ]
+crbug.com/589265 fast/forms/datalist/input-appearance-range-with-transform.html [ Failure ]
 crbug.com/589265 fast/forms/indeterminate.html [ Failure ]
+crbug.com/589265 images/color-profile-filter.html [ Failure ]
+crbug.com/589265 paint/invalidation/svg/repaint-paintorder.svg [ Failure ]
+crbug.com/589265 paint/invalidation/svg/tabgroup.svg [ Failure ]
+crbug.com/589265 svg/W3C-SVG-1.1/animate-elem-33-t.svg [ Failure ]
+crbug.com/589265 svg/as-background-image/background-image-preserveaspectRatio-support.html [ Failure ]
 crbug.com/589265 svg/custom/small-rect-scale.svg [ Failure ]
 crbug.com/589265 svg/dynamic-updates/SVGFEBlendElement-dom-in-attr.html [ Failure ]
 crbug.com/589265 svg/dynamic-updates/SVGFEBlendElement-dom-in2-attr.html [ Failure ]
@@ -1578,6 +1580,9 @@
 crbug.com/589265 svg/dynamic-updates/SVGFEBlendElement-svgdom-in-prop.html [ Failure ]
 crbug.com/589265 svg/dynamic-updates/SVGFEBlendElement-svgdom-in2-prop.html [ Failure ]
 crbug.com/589265 svg/dynamic-updates/SVGFEBlendElement-svgdom-mode-prop.html [ Failure ]
+crbug.com/589265 svg/text/text-selection-align-01-b.svg [ Failure ]
+crbug.com/589265 svg/text/text-selection-align-05-b.svg [ Failure ]
+crbug.com/589265 svg/zoom/page/zoom-svg-as-background-with-relative-size.html [ Failure ]
 
 # Failures due to SPv2 using SkBlendMode::kDstIn to implement masks.
 # Some rounding differences is expected but none of them should be apparent.
@@ -1620,7 +1625,6 @@
 # Subpixel adjustments due to differences in compositing
 crbug.com/589265 animations/animated-filter-svg-element.html [ Failure Crash ]
 crbug.com/589265 compositing/overflow/do-not-paint-outline-into-composited-scrolling-contents.html [ Failure ]
-crbug.com/589265 fast/css/all-shorthand-first-letter.html [ Failure ]
 crbug.com/589265 fast/forms/number/number-appearance-spinbutton-layer.html [ Failure ]
 crbug.com/589265 fast/layers/add-layer-with-nested-stacking.html [ Failure ]
 crbug.com/589265 fast/layers/opacity-transforms.html [ Failure ]
@@ -1673,7 +1677,6 @@
 Bug(700530) fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-cjk.html [ Failure ]
 
 # The following debug crashes have not been triaged.
-crbug.com/702805 css3/blending/svg-blend-layer-filter.html [ Crash ]
 crbug.com/702805 virtual/threaded/compositing/visibility/overlays-persist-on-navigation.html [ Crash ]
 crbug.com/702805 svg/filters/feImage-self-referencing.html [ Crash ]
 crbug.com/702805 svg/filters/feImage-self-and-other-referencing.html [ Crash ]
@@ -1745,3 +1748,5 @@
 # reasons, in particular that the composited layerization algorithm provides
 # different results.
 Bug(none) paint/invalidation/compositing/subpixel-offset-scaled-transform-composited.html [ Failure ]
+
+crbug.com/737275 svg/as-background-image/svg-as-background-6.html [ Crash Failure ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index 6e6368b..cbf0890 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -592,7 +592,7 @@
 crbug.com/635619 virtual/layout_ng/fast/block/float/035.html [ Failure ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/add-float-back-to-anonymous-block.html [ Failure ]
 crbug.com/719615 virtual/layout_ng/fast/block/float/add-inlines-in-block-children-block.html [ Failure ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/assert-when-moving-float.html [ Crash ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/assert-when-moving-float.html [ Failure ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/avoid-floats-when-negative-margin-top-2.html [ Failure ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/avoid-floats-when-negative-margin-top-3.html [ Failure ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/avoid-floats-when-negative-margin-top-4.html [ Failure ]
@@ -673,7 +673,7 @@
 crbug.com/635619 virtual/layout_ng/fast/block/float/remove-line-above-float-above-line-crash.html [ Failure ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/rubybase-children-made-inline-crash.html [ Failure ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/rubybase-children-moved-crash-2.html [ Failure Crash ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/rubybase-children-moved-crash.html [ Crash ]
+crbug.com/635619 virtual/layout_ng/fast/block/float/rubybase-children-moved-crash.html [ Crash Failure ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/shrink-to-avoid-float-complexity.html [ Failure ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/shrink-to-fit-width.html [ Failure ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/split-inline-sibling-of-float-crash.html [ Crash ]
@@ -1527,9 +1527,6 @@
 crbug.com/321237 [ Win ] fast/multicol/span/pseudo-before-after-in-content.html [ Failure ]
 crbug.com/321237 [ Win ] fast/selectors/004.html [ Failure ]
 
-crbug.com/739514 external/wpt/html/semantics/scripting-1/the-script-element/load-error-events-2.html [ Failure ]
-crbug.com/715369 external/wpt/html/semantics/scripting-1/the-script-element/module/load-error-events-inline.html [ Failure ]
-
 crbug.com/501659 fast/xsl/xslt-missing-namespace-in-xslt.xml [ Failure ]
 
 crbug.com/501659 http/tests/security/xss-DENIED-xml-external-entity.xhtml [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/W3CImportExpectations b/third_party/WebKit/LayoutTests/W3CImportExpectations
index edbe374..634d8150 100644
--- a/third_party/WebKit/LayoutTests/W3CImportExpectations
+++ b/third_party/WebKit/LayoutTests/W3CImportExpectations
@@ -19,6 +19,8 @@
 
 ## Owners: paint-dev@chromium.org
 # external/wpt/2dcontext [ Pass ]
+## Owners: garykac@chromium.org
+# external/wpt/clipboard-apis [Pass]
 ## Owners: jsbell@chromium.org
 # external/wpt/FileAPI [ Pass ]
 ## Owners: jsbell@chromium.org
diff --git a/third_party/WebKit/LayoutTests/editing/selection/empty-cell-right-click-expected.txt b/third_party/WebKit/LayoutTests/editing/selection/empty-cell-right-click-expected.txt
deleted file mode 100644
index e0c1ba4..0000000
--- a/third_party/WebKit/LayoutTests/editing/selection/empty-cell-right-click-expected.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Before: selection type is Caret
-After: selection type is Caret
diff --git a/third_party/WebKit/LayoutTests/editing/selection/empty-cell-right-click.html b/third_party/WebKit/LayoutTests/editing/selection/empty-cell-right-click.html
deleted file mode 100644
index ed29b8c..0000000
--- a/third_party/WebKit/LayoutTests/editing/selection/empty-cell-right-click.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<html> 
-<head>
-<title>Right clicking on an empty cell should not extend the selection to the next cell.</title> 
-</head> 
-<body>
-<div contentEditable="true">
-<table border="1" cellspacing="0"><tr><td id="first" width="50" height="25pt"></td><td width="50" height="25pt"></td><td width="50" height="25pt"></td></tr></table>
-</div>
-<ul id="console"></ul>
-</body>
-<script>
-if (window.testRunner) {
-    testRunner.dumpAsText();
-    var elem = document.getElementById("first");
-    x = elem.offsetLeft + elem.offsetWidth / 2;
-    y = elem.offsetTop + elem.offsetHeight / 2;
-    eventSender.mouseMoveTo(x, y);
-    eventSender.mouseDown();
-    eventSender.mouseUp();
-
-    log("Before: selection type is " + window.getSelection().type);
-    
-    eventSender.contextClick();
-    
-    log("After: selection type is " + window.getSelection().type);
-}
-
-function log(str) {
-    var li = document.createElement("li");
-    li.appendChild(document.createTextNode(str));
-    var console = document.getElementById("console");
-    console.appendChild(li);
-}
-
-</script>
-</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-interfaces.https.html b/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-interfaces.https.html
new file mode 100644
index 0000000..a82e39f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-interfaces.https.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Clipboard IDL test</title>
+<link rel="help" href="https://w3c.github.io/clipboard-apis/">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/resources/WebIDLParser.js></script>
+<script src=/resources/idlharness.js></script>
+<script>
+'use strict';
+
+function doTest(idls) {
+  var idl_array = new IdlArray();
+  idl_array.add_untested_idls('interface Navigator {};');
+  idl_array.add_untested_idls('interface EventTarget {};');
+  for (let idl of idls) {
+    idl_array.add_idls(idl);
+  }
+  idl_array.add_objects({
+    Navigator: ['navigator'],
+    Clipboard: ['navigator.clipboard'],
+  });
+  idl_array.test();
+};
+
+function fetchText(url) {
+  return fetch(url).then((response) => response.text());
+}
+
+promise_test(() => {
+  return Promise.all(["/interfaces/clipboard.idl"].map(fetchText))
+    .then(doTest);
+}, "Test driver");
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-navigator-clipboard-basics.https.html b/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-navigator-clipboard-basics.https.html
new file mode 100644
index 0000000..3126655
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-navigator-clipboard-basics.https.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Async Clipboard basic tests</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+
+test(function() {
+  assert_not_equals(navigator.clipboard, undefined);
+  assert_true(navigator.clipboard instanceof Clipboard);
+  assert_equals(navigator.clipboard, navigator.clipboard);
+}, "navigator.clipboard exists");
+
+/* clipboard.write() */
+
+promise_test(function() {
+  var dt = new DataTransfer();
+  dt.items.add("Howdy", "text/plain");
+  return navigator.clipboard.write(dt);
+}, "navigator.clipboard.write(DataTransfer) succeeds");
+
+promise_test(function(t) {
+  return promise_rejects(t, new TypeError(),
+                         navigator.clipboard.write());
+}, "navigator.clipboard.write() fails (expect DataTransfer)");
+
+promise_test(function(t) {
+  return promise_rejects(t, new TypeError(),
+                         navigator.clipboard.write(null));
+}, "navigator.clipboard.write(null) fails (expect DataTransfer)");
+
+promise_test(function(t) {
+  return promise_rejects(t, new TypeError(),
+                         navigator.clipboard.write("Bad string"));
+}, "navigator.clipboard.write(DOMString) fails (expect DataTransfer)");
+
+
+/* clipboard.writeText() */
+
+promise_test(function() {
+  return navigator.clipboard.writeText("New clipboard text");
+}, "navigator.clipboard.writeText(DOMString) succeeds");
+
+promise_test(function(t) {
+  return promise_rejects(t, new TypeError(),
+                         navigator.clipboard.writeText());
+}, "navigator.clipboard.writeText() fails (expect DOMString)");
+
+
+/* clipboard.read() */
+
+promise_test(function() {
+  return navigator.clipboard.read()
+    .then(function(result) {
+      assert_true(result instanceof DataTransfer);
+    });
+}, "navigator.clipboard.read() succeeds");
+
+
+/* clipboard.readText() */
+
+promise_test(function() {
+  return navigator.clipboard.readText()
+    .then(function(result) {
+      assert_equals(typeof result, "string");
+    });
+}, "navigator.clipboard.readText() succeeds");
+
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-write-dttext-read-dttext-manual.https.html b/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-write-dttext-read-dttext-manual.https.html
new file mode 100644
index 0000000..1fe946a
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-write-dttext-read-dttext-manual.https.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Async Clipboard write (dt/text) -> read (dt/text) tests</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+async_test(function(t) {
+  var test_data = "Clipboard write (dt/text) -> read (dt/text) test data";
+  var cb = navigator.clipboard;
+  var dt = new DataTransfer();
+  dt.items.add(test_data, "text/plain");
+
+  cb.write(dt).then(t.step_func(() => {
+    cb.read().then(t.step_func((data) => {
+      assert_equals(data.items.length, 1);
+      data.items[0].getAsString(t.step_func((s) => {
+        assert_equals(s, test_data);
+        t.done();
+      }));
+    }), function() {
+      t.unreached_func("clipboard.read() fail");
+    });
+  }), function() {
+    t.unreached_func("clipboard.write() fail");
+  });
+}, "Verify write and read clipboard (DataTransfer/text)");
+</script>
+Note: This is a manual test because it writes/reads to the shared system
+clipboard and thus cannot be run async with other tests that might interact
+with the clipboard.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-write-dttext-read-text-manual.https.html b/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-write-dttext-read-text-manual.https.html
new file mode 100644
index 0000000..b341d92
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-write-dttext-read-text-manual.https.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Async Clipboard write (dt/text) -> readText tests</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+async_test(function(t) {
+  var test_data = "Clipboard write (dt/text) -> readText test data";
+  var cb = navigator.clipboard;
+  var dt = new DataTransfer();
+  dt.items.add(test_data, "text/plain");
+
+  cb.write(dt).then(t.step_func(() => {
+    cb.readText().then(t.step_func((data) => {
+      assert_equals(data, test_data);
+      t.done();
+    }), function() {
+      t.unreached_func("clipboard.read() fail");
+    });
+  }), function() {
+    t.unreached_func("clipboard.write() fail");
+  });
+}, "Verify write and read clipboard (DataTransfer/text)");
+</script>
+Note: This is a manual test because it writes/reads to the shared system
+clipboard and thus cannot be run async with other tests that might interact
+with the clipboard.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-write-text-read-dttext-manual.https.html b/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-write-text-read-dttext-manual.https.html
new file mode 100644
index 0000000..ab11ab9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-write-text-read-dttext-manual.https.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Async Clipboard writeText -> read (dt/text) tests</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+async_test(function(t) {
+  var test_data = "Clipboard writeText -> read(dt/text) test data";
+  var cb = navigator.clipboard;
+  cb.writeText(test_data).then(t.step_func(() => {
+    cb.read().then(t.step_func((data) => {
+      assert_equals(data.items.length, 1);
+      data.items[0].getAsString(t.step_func((s) => {
+        assert_equals(s, test_data);
+        t.done();
+      }));
+    }), function() {
+      t.unreached_func("clipboard.read() fail");
+    });
+  }), function() {
+    t.unreached_func("clipboard.writeText() fail");
+  });
+}, "Verify write and read clipboard (DOMString)");
+</script>
+Note: This is a manual test because it writes/reads to the shared system
+clipboard and thus cannot be run async with other tests that might interact
+with the clipboard.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-write-text-read-text-manual.https.html b/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-write-text-read-text-manual.https.html
new file mode 100644
index 0000000..a557216
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/clipboard-apis/async-write-text-read-text-manual.https.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Async Clipboard writeText -> readText tests</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+async_test(function(t) {
+  var test_data = "Clipboard writeText -> readText test data";
+  var cb = navigator.clipboard;
+  cb.writeText(test_data).then(t.step_func(() => {
+    cb.readText().then(t.step_func((data) => {
+      assert_equals(data, test_data);
+      t.done();
+    }), function() {
+      t.unreached_func("clipboard.readText() fail");
+    });
+  }), function() {
+    t.unreached_func("clipboard.writeText() fail");
+  });
+}, "Verify write and read clipboard (DOMString)");
+</script>
+Note: This is a manual test because it writes/reads to the shared system
+clipboard and thus cannot be run async with other tests that might interact
+with the clipboard.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/clipboard.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/clipboard.idl
new file mode 100644
index 0000000..ea969ca9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/clipboard.idl
@@ -0,0 +1,13 @@
+[SecureContext]
+interface Clipboard : EventTarget {
+  Promise<DataTransfer> read();
+  Promise<DOMString> readText();
+
+  Promise<void> write(DataTransfer data);
+  Promise<void> writeText(DOMString data);
+};
+
+[SecureContext]
+partial interface Navigator {
+  [SameObject] readonly attribute Clipboard clipboard;
+};
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webusb/usbIsochronousInTransferResult.https.html b/third_party/WebKit/LayoutTests/external/wpt/webusb/usbIsochronousInTransferResult.https.html
index da7c395..5cad38a 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/webusb/usbIsochronousInTransferResult.https.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/webusb/usbIsochronousInTransferResult.https.html
@@ -4,7 +4,6 @@
 <script>
 'use strict';
 
-
 test(t => {
   let data_view = new DataView(Uint8Array.from([1, 2, 3, 4]).buffer);
   let packet_data_view = new DataView(data_view.buffer);
diff --git a/third_party/WebKit/LayoutTests/fast/forms/validation-bubble-appearance-escape.html b/third_party/WebKit/LayoutTests/fast/forms/validation-bubble-appearance-escape.html
new file mode 100644
index 0000000..1e2b5d5
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/forms/validation-bubble-appearance-escape.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<body>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<input pattern="\d{4}" title="Please specify four digits." value="abc" style="position:absolute; bottom:600px">
+<script>
+test(() => {
+  document.querySelector('input').setCustomValidity('<script>');
+  document.querySelector('input').reportValidity();
+}, 'Showing a validation message with HTML tags should not cause a DCHECK failure.');
+</script>
+</body>
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/inspector-test.js b/third_party/WebKit/LayoutTests/http/tests/inspector/inspector-test.js
index 0d394984..c71d83c 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/inspector-test.js
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/inspector-test.js
@@ -856,7 +856,6 @@
  * @constructor
  * @param {!string} dirPath
  * @param {!string} name
- * @param {!function(?Bindings.TempFile)} callback
  */
 InspectorTest.TempFileMock = function(dirPath, name)
 {
@@ -905,9 +904,10 @@
 
     /**
      * @param {!Common.OutputStream} outputStream
-     * @param {!Bindings.OutputStreamDelegate} delegate
+     * @param {function(*)=} progress
+     * @return {!Promise<boolean>}
      */
-    copyToOutputStream: function(outputStream, delegate)
+    copyToOutputStream: function(outputStream, progress)
     {
         var name = this._name;
         var text = this._chunks.join("");
@@ -929,11 +929,11 @@
 
             cancel: function() { }
         }
-        delegate.onTransferStarted(chunkedReaderMock);
         outputStream.write(text);
-        delegate.onChunkTransferred(chunkedReaderMock);
+        if (progress)
+          progress(chunkedReaderMock);
         outputStream.close();
-        delegate.onTransferFinished(chunkedReaderMock);
+        return Promise.resolve(true);
     },
 
     remove: function() { }
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/timeline-test.js b/third_party/WebKit/LayoutTests/http/tests/inspector/timeline-test.js
index 616b8ed7..3cae88d 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/timeline-test.js
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/timeline-test.js
@@ -69,9 +69,6 @@
     return "{reason: " + cause.reason + ", stackTrace: " + stackTrace + "}";
 }
 
-InspectorTest.preloadPanel("timeline");
-Bindings.TempFile = InspectorTest.TempFileMock;
-
 InspectorTest.createTracingModel = function(events)
 {
     var model = new SDK.TracingModel(new Bindings.TempFileBackingStorage("tracing"));
@@ -302,13 +299,57 @@
     return null;
 }
 
-InspectorTest.FakeFileReader = function(input, delegate, callback)
-{
-    this._delegate = delegate;
-    this._callback = callback;
-    this._input = input;
-    this._loadedSize = 0;
-    this._fileSize = input.length;
+InspectorTest.FakeFileReader = class {
+    constructor(input, chunkSize, chunkTransferredCallback)
+    {
+        this._input = input;
+        this._loadedSize = 0;
+        this._fileSize = input.length;
+        this._chunkTransferredCallback = chunkTransferredCallback;
+    }
+
+    read(output)
+    {
+        var length = this._input.length;
+        var half = (length + 1) >> 1;
+
+        var chunk = this._input.substring(0, half);
+        this._loadedSize += chunk.length;
+        output.write(chunk);
+        if (this._chunkTransferredCallback)
+            this._chunkTransferredCallback(this);
+
+        chunk = this._input.substring(half);
+        this._loadedSize += chunk.length;
+        output.write(chunk);
+        if (this._chunkTransferredCallback)
+            this._chunkTransferredCallback(this);
+
+        output.close();
+        return Promise.resolve(true);
+    }
+
+    cancel() { }
+
+    loadedSize()
+    {
+        return this._loadedSize;
+    }
+
+    fileSize()
+    {
+        return this._fileSize;
+    }
+
+    fileName()
+    {
+        return "fakeFile";
+    }
+
+    error()
+    {
+        return null;
+    }
 };
 
 InspectorTest.dumpFrame = function(frame)
@@ -372,60 +413,11 @@
     InspectorTest.dumpFlameChartProvider(provider, includeGroups);
 }
 
-InspectorTest.FakeFileReader.prototype = {
-    start: function(output)
-    {
-        this._delegate.onTransferStarted(this);
-
-        var length = this._input.length;
-        var half = (length + 1) >> 1;
-
-        var chunk = this._input.substring(0, half);
-        this._loadedSize += chunk.length;
-        output.write(chunk);
-        this._delegate.onChunkTransferred(this);
-
-        chunk = this._input.substring(half);
-        this._loadedSize += chunk.length;
-        output.write(chunk);
-        this._delegate.onChunkTransferred(this);
-
-        output.close();
-        this._delegate.onTransferFinished(this);
-
-        this._callback();
-    },
-
-    cancel: function() { },
-
-    loadedSize: function()
-    {
-        return this._loadedSize;
-    },
-
-    fileSize: function()
-    {
-        return this._fileSize;
-    },
-
-    fileName: function()
-    {
-        return "fakeFile";
-    }
-};
-
 InspectorTest.loadTimeline = function(timelineData)
 {
-    var timeline = UI.panels.timeline;
-
-    function createFileReader(file, delegate)
-    {
-        return new InspectorTest.FakeFileReader(timelineData, delegate, timeline._saveToFile.bind(timeline));
-    }
-
-    InspectorTest.override(Timeline.TimelineLoader, "_createFileReader", createFileReader);
+    Bindings.ChunkedFileReader = InspectorTest.FakeFileReader;
     var promise = new Promise(fulfill => InspectorTest.runWhenTimelineIsReady(fulfill));
-    timeline._loadFromFile({});
+    UI.panels.timeline._loadFromFile(timelineData);
     return promise;
 }
 
diff --git a/third_party/WebKit/LayoutTests/images/color-profile-reflection.html b/third_party/WebKit/LayoutTests/images/color-profile-reflection.html
index 21f87cb4..ec58703 100644
--- a/third_party/WebKit/LayoutTests/images/color-profile-reflection.html
+++ b/third_party/WebKit/LayoutTests/images/color-profile-reflection.html
@@ -27,8 +27,7 @@
 };
 
 function done() {
-  runAfterLayoutAndPaint(function() { testRunner.notifyDone() });
+  window.testRunner.notifyDone();
 }
-
 </script>
 </html>
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/page/setDocumentContent-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/page/setDocumentContent-expected.txt
new file mode 100644
index 0000000..1c202f1
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/page/setDocumentContent-expected.txt
@@ -0,0 +1,7 @@
+Tests that Page.setDocumentContent works.
+Page enabled
+Main Frame obtained
+Document content before: <html><head></head><body><div>Привет мир</div></body></html>
+Document content set
+Document content after: <html><head></head><body><div>こんにちは世界</div></body></html>
+
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/page/setDocumentContent.js b/third_party/WebKit/LayoutTests/inspector-protocol/page/setDocumentContent.js
new file mode 100644
index 0000000..6131fa3
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/page/setDocumentContent.js
@@ -0,0 +1,18 @@
+(async function(testRunner) {
+  let {page, session, dp} = await testRunner.startHTML(`<div>Привет мир</div>`,
+      'Tests that Page.setDocumentContent works.');
+
+  await dp.Page.enable();
+  testRunner.log('Page enabled');
+
+  var resourceTreeResponse = await dp.Page.getResourceTree();
+  var mainFrameId = resourceTreeResponse.result.frameTree.frame.id;
+  testRunner.log('Main Frame obtained');
+
+  testRunner.log('Document content before: ' + await session.evaluate(() => document.documentElement.outerHTML));
+  await dp.Page.setDocumentContent({frameId: mainFrameId, html: '<div>こんにちは世界</div>'});
+  testRunner.log('Document content set');
+  testRunner.log('Document content after: ' + await session.evaluate(() => document.documentElement.outerHTML));
+
+  testRunner.completeTest();
+})
diff --git a/third_party/WebKit/LayoutTests/inspector/components/chunked-file-reader-expected.txt b/third_party/WebKit/LayoutTests/inspector/components/chunked-file-reader-expected.txt
index 05a9d67..54b6b5d 100644
--- a/third_party/WebKit/LayoutTests/inspector/components/chunked-file-reader-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/components/chunked-file-reader-expected.txt
@@ -1,7 +1,6 @@
 This tests that ChunkedFileReader properly re-assembles chunks, especially in case these contain multibyte characters.
 
-Bindings.OutputStreamDelegate.onTransferStarted() called
-Chunks transferred: 40
-Bindings.OutputStreamDelegate.onTransferFinished() called
+Read result: true
+Chunks transferred: 41
 DONE
 
diff --git a/third_party/WebKit/LayoutTests/inspector/components/chunked-file-reader.html b/third_party/WebKit/LayoutTests/inspector/components/chunked-file-reader.html
index 4226238..78a6cb0 100644
--- a/third_party/WebKit/LayoutTests/inspector/components/chunked-file-reader.html
+++ b/third_party/WebKit/LayoutTests/inspector/components/chunked-file-reader.html
@@ -4,50 +4,7 @@
 <script src="../../http/tests/inspector/inspector-test.js"></script>
 <script>
 
-function initialize_ChunkedFileReaderTest()
-{
-
-InspectorTest.TestOutputStreamDelegate = function(doneCallback)
-{
-    this._doneCallback = doneCallback;
-    this._chunkCount = 0;
-}
-
-InspectorTest.TestOutputStreamDelegate.prototype = {
-    onTransferStarted: function()
-    {
-        InspectorTest.addResult("Bindings.OutputStreamDelegate.onTransferStarted() called");
-    },
-
-    onTransferFinished: function()
-    {
-        InspectorTest.addResult("Chunks transferred: " + this._chunkCount);
-        InspectorTest.addResult("Bindings.OutputStreamDelegate.onTransferFinished() called");
-        this._doneCallback();
-    },
-
-    /**
-     * @param {!Bindings.ChunkedReader} reader
-     */
-    onChunkTransferred: function(reader)
-    {
-        this._chunkCount++;
-    },
-
-    /**
-     * @param {!Bindings.ChunkedReader} reader
-     * @param {!Event} event
-     */
-    onError: function(reader, event)
-    {
-        InspectorTest.addResult("Bindings.OutputStreamDelegate.onError() called");
-        this._doneCallback();
-    }
-};
-
-}
-
-function test()
+async function test()
 {
     var text = ["Латынь из моды вышла ныне:\n",
         "Так, если правду вам сказать,\n",
@@ -58,15 +15,17 @@
     // Most of the characters above will be encoded as 2 bytes, so make sure we use odd
     // chunk size to cause chunk boundaries sometimes to happen between chaacter bytes.
     var chunkSize = 5;
-    var reader = new Bindings.ChunkedFileReader(blob, chunkSize, new InspectorTest.TestOutputStreamDelegate(onTransferFinished));
+    var chunkCount = 0;
+    var reader = new Bindings.ChunkedFileReader(blob, chunkSize, () => ++chunkCount);
     var output = new Common.StringOutputStream();
-    reader.start(output);
-    function onTransferFinished()
-    {
-        InspectorTest.assertEquals(text.join(""), output.data(), "Read text is different from written text");
-        InspectorTest.addResult("DONE");
-        InspectorTest.completeTest();
-    }
+
+    var error = await reader.read(output);
+
+    InspectorTest.addResult("Read result: " + error);
+    InspectorTest.addResult("Chunks transferred: " + chunkCount);
+    InspectorTest.assertEquals(text.join(""), output.data(), "Read text is different from written text");
+    InspectorTest.addResult("DONE");
+    InspectorTest.completeTest();
 }
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/inspector/profiler/cpu-profiler-save-load.html b/third_party/WebKit/LayoutTests/inspector/profiler/cpu-profiler-save-load.html
index 2ee335f..c13248d7 100644
--- a/third_party/WebKit/LayoutTests/inspector/profiler/cpu-profiler-save-load.html
+++ b/third_party/WebKit/LayoutTests/inspector/profiler/cpu-profiler-save-load.html
@@ -108,13 +108,12 @@
             var profileName = file.name.substr(0, file.name.length - ".cpuprofile".length);
             InspectorTest.waitUntilProfileViewIsShown(profileName, checkLoadedContent);
             profilesPanel._loadFromFile(file);
-            var onTransferFinished = Profiler.CPUProfileHeader.prototype.onTransferFinished;
-            Profiler.CPUProfileHeader.prototype.onTransferFinished = function()
-            {
+            InspectorTest.addSniffer(Profiler.CPUProfileHeader.prototype, "updateStatus", function(statusText) {
+                if (!statusText.startsWith("Parsing"))
+                    return;
                 loadedProfileData = this._jsonifiedProfile;
-                onTransferFinished.call(this);
-                UI.panels.js_profiler.showProfile(this);
-            }
+                setTimeout(() => UI.panels.js_profiler.showProfile(this), 0);
+            }, true);
         }
 
     ]);
diff --git a/third_party/WebKit/LayoutTests/inspector/profiler/heap-snapshot-loader.html b/third_party/WebKit/LayoutTests/inspector/profiler/heap-snapshot-loader.html
index 556787f3..4a42abc 100644
--- a/third_party/WebKit/LayoutTests/inspector/profiler/heap-snapshot-loader.html
+++ b/third_party/WebKit/LayoutTests/inspector/profiler/heap-snapshot-loader.html
@@ -81,33 +81,31 @@
                 size: sourceStringified.length
             };
 
-            InspectorTest.override(Profiler.HeapProfileHeader.prototype, '_createFileReader', function(fileMock, delegate) {
-                return {
-                    start: function(receiver) {
-                        delegate.onTransferStarted(this);
-                        receiver.write(sourceStringified);
-                        delegate.onChunkTransferred(this);
-                        receiver.close();
-                        delegate.onTransferFinished(this);
-                    },
+            Bindings.ChunkedFileReader = class {
+                constructor() {}
 
-                    loadedSize: function()
-                    {
-                        return fileMock.size;
-                    },
+                read(receiver) {
+                    receiver.write(sourceStringified);
+                    receiver.close();
+                    return Promise.resolve(true);
+                }
 
-                    fileSize: function()
-                    {
-                        return fileMock.size;
-                    },
+                loadedSize()
+                {
+                    return fileMock.size;
+                }
 
-                    fileName: function()
-                    {
-                        return fileMock.name;
-                    }
-                };
-            });
-            InspectorTest.addSniffer(Profiler.HeapProfileHeader.prototype, "_snapshotReceived", function() { next(); });
+                fileSize()
+                {
+                    return fileMock.size;
+                }
+
+                fileName()
+                {
+                    return fileMock.name;
+                }
+            };
+            InspectorTest.addSniffer(Profiler.HeapProfileHeader.prototype, "_snapshotReceived", next);
             panel._loadFromFile(fileMock);
         },
 
diff --git a/third_party/WebKit/LayoutTests/inspector/throttling/mobile-throttling.html b/third_party/WebKit/LayoutTests/inspector/throttling/mobile-throttling.html
index ce09f425..a133853 100644
--- a/third_party/WebKit/LayoutTests/inspector/throttling/mobile-throttling.html
+++ b/third_party/WebKit/LayoutTests/inspector/throttling/mobile-throttling.html
@@ -3,7 +3,6 @@
 <title> Change mobile throttling setting.</title>
 <script src = "../../http/tests/inspector/inspector-test.js"></script>
 <script>
-
 function initialize_ThrottlingTest() {
   InspectorTest.preloadPanel("network");
   InspectorTest.preloadPanel("timeline");
@@ -14,8 +13,8 @@
   var deviceModeView = new Emulation.DeviceModeView();
 
   var deviceModeThrottling = deviceModeView._toolbar._throttlingConditionsItem;
-  var networkPanelThrottling = UI.panels.network._throttlingSelect;
-  var networkPanelOfflineCheckbox = UI.panels.network._offlineCheckbox.inputElement;
+  var networkPanelThrottling = UI.panels.network.throttlingSelectForTest();
+  var networkPanelOfflineCheckbox = UI.panels.network.offlineCheckboxForTest().inputElement;
   var networkConditionsDrawerThrottlingSelector =
       self.runtime.sharedInstance(Network.NetworkConfigView)._networkThrottlingSelect;
   var performancePanelNetworkThrottling = UI.panels.timeline._networkThrottlingSelect;
diff --git a/third_party/WebKit/LayoutTests/inspector/tracing/timeline-misc/timeline-flame-chart-automatically-size-window.html b/third_party/WebKit/LayoutTests/inspector/tracing/timeline-misc/timeline-flame-chart-automatically-size-window.html
index 3707495..0538d5f 100644
--- a/third_party/WebKit/LayoutTests/inspector/tracing/timeline-misc/timeline-flame-chart-automatically-size-window.html
+++ b/third_party/WebKit/LayoutTests/inspector/tracing/timeline-misc/timeline-flame-chart-automatically-size-window.html
@@ -6,7 +6,7 @@
 <script src="../resources/timeline-data.js"></script>
 <script>
 
-function test()
+async function test()
 {
     var timeline = UI.panels.timeline;
     timeline._onModeChanged();
@@ -19,7 +19,8 @@
     }
 
     timeline.requestWindowTimes = requestWindowTimesHook;
-    InspectorTest.loadTimeline(InspectorTest.timelineData()).then(() => InspectorTest.completeTest());
+    await InspectorTest.loadTimeline(InspectorTest.timelineData());
+    InspectorTest.completeTest();
 }
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/inspector/tracing/tracing-timeline-load.html b/third_party/WebKit/LayoutTests/inspector/tracing/tracing-timeline-load.html
index cc2856a..b707015 100644
--- a/third_party/WebKit/LayoutTests/inspector/tracing/tracing-timeline-load.html
+++ b/third_party/WebKit/LayoutTests/inspector/tracing/tracing-timeline-load.html
@@ -6,9 +6,9 @@
 
 function test()
 {
-    InspectorTest.TestTimelineLoaderClient = function(callback)
+    InspectorTest.TestTimelineLoaderClient = function()
     {
-        this._callback = callback;
+        this._completePromise = new Promise(resolve => this._resolve = resolve);
     }
 
     InspectorTest.TestTimelineLoaderClient.prototype = {
@@ -29,19 +29,18 @@
 
         loadingComplete: function(model)
         {
-            this.model = model;
             InspectorTest.addResult(`TimelineLoaderClient.loadingComplete(${!!model})`);
-            this._callback();
+            this._resolve(model);
         },
+
+        modelPromise: function()
+        {
+            return this._completePromise;
+        }
     }
 
-    function runTestWithDataAndCheck(input, expectedOutput, callback)
+    async function runTestWithDataAndCheck(input, expectedOutput, callback)
     {
-        function createFileReader(file, delegate)
-        {
-            return new InspectorTest.FakeFileReader(input, delegate, () => {});
-        }
-
         function checkSaveData(output)
         {
             var saveData = JSON.parse(output);
@@ -49,36 +48,24 @@
             callback();
         }
 
-        InspectorTest.override(Timeline.TimelineLoader, "_createFileReader", createFileReader);
-        var delegate = new InspectorTest.TestTimelineLoaderClient(onTimelineLoaded);
-        Timeline.TimelineLoader.loadFromFile({}, delegate);
-        async function onTimelineLoaded()
-        {
-            var saver = new Timeline.TracingTimelineSaver();
-            var stream = new InspectorTest.StringOutputStream(InspectorTest.safeWrap(checkSaveData));
-            var storage = delegate.model.backingStorage();
-            await stream.open("");
-            storage.writeToStream(stream, saver);
-        }
+        Bindings.ChunkedFileReader = InspectorTest.FakeFileReader;
+        var client = new InspectorTest.TestTimelineLoaderClient();
+        var loader = Timeline.TimelineLoader.loadFromFile(input, client);
+        var stream = new InspectorTest.StringOutputStream(InspectorTest.safeWrap(checkSaveData));
+        var model = await client.modelPromise();
+        var storage = model.backingStorage();
+        await stream.open("");
+        storage.writeToStream(stream);
     }
 
-    function runTestOnMalformedInput(input, callback)
+    async function runTestOnMalformedInput(input, callback)
     {
-        function createFileReader(file, delegate)
-        {
-            return new InspectorTest.FakeFileReader(input, delegate, () => {});
-        }
-
-        function checkLoadedData(data)
-        {
-            var model = delegate.model;
-            InspectorTest.addResult("Model is empty: " + (!model || (!model.minimumRecordTime() && !model.maximumRecordTime())));
-            callback();
-        }
-
-        InspectorTest.override(Timeline.TimelineLoader, "_createFileReader", createFileReader);
-        var delegate = new InspectorTest.TestTimelineLoaderClient(checkLoadedData);
-        Timeline.TimelineLoader.loadFromFile({}, delegate);
+        Bindings.ChunkedFileReader = InspectorTest.FakeFileReader;
+        var client = new InspectorTest.TestTimelineLoaderClient();
+        var loader = Timeline.TimelineLoader.loadFromFile(input, client);
+        var model = await client.modelPromise();
+        InspectorTest.addResult("Model is empty: " + (!model || (!model.minimumRecordTime() && !model.maximumRecordTime())));
+        callback();
     }
 
     var data = [{"args":{"number":32},"cat":"__metadata","name":"num_cpus","ph":"M","pid":32127,"tid":0,"ts":0},
diff --git a/third_party/WebKit/LayoutTests/media/controls/controls-cast-button-low-end-device.html b/third_party/WebKit/LayoutTests/media/controls/controls-cast-button-low-end-device.html
new file mode 100644
index 0000000..a21dd2ba
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/media/controls/controls-cast-button-low-end-device.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<title>media controls cast button low end device</title>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../media-file.js"></script>
+<script src="../media-controls.js"></script>
+<script src="../remoteplayback/util.js"></script>
+<video width="500"></video>
+<script>
+async_test(function(t) {
+    setIsLowEndDeviceForTest(t);
+    enableRemotePlaybackBackendForTest(t);
+
+    var video = document.querySelector("video");
+    video.controls = true;
+
+    // No idea why waiting for the metadata to load is needed (or a couple
+    // of timeouts) since the button should show with the rest of the
+    // controls with no need for metadata.
+    // NOTE: shouldn't report the availability as true unless there's a URL
+    // to fling.
+    video.onloadedmetadata = t.step_func_done(_ => {
+      assert_true(isVisible(castButton(video)));
+    });
+
+    video.src = findMediaFile("video", "../content/test");
+});
+</script>
diff --git a/third_party/WebKit/LayoutTests/media/remoteplayback/util.js b/third_party/WebKit/LayoutTests/media/remoteplayback/util.js
index 3502d1312..a38219f 100644
--- a/third_party/WebKit/LayoutTests/media/remoteplayback/util.js
+++ b/third_party/WebKit/LayoutTests/media/remoteplayback/util.js
@@ -8,3 +8,12 @@
         remotePlaybackBackendEnabledOldValue;
   });
 }
+
+function setIsLowEndDeviceForTest(t) {
+  var isLowEndDeviceOldValue = internals.isLowEndDevice();
+  internals.setIsLowEndDevice(true);
+
+  t.add_cleanup(_ => {
+    internals.setIsLowEndDevice(isLowEndDeviceOldValue);
+  });
+}
diff --git a/third_party/WebKit/LayoutTests/media/remoteplayback/watch-availability-throws-low-end-device.html b/third_party/WebKit/LayoutTests/media/remoteplayback/watch-availability-throws-low-end-device.html
index 87579191..60d46036 100644
--- a/third_party/WebKit/LayoutTests/media/remoteplayback/watch-availability-throws-low-end-device.html
+++ b/third_party/WebKit/LayoutTests/media/remoteplayback/watch-availability-throws-low-end-device.html
@@ -5,6 +5,7 @@
         <script src="../../resources/testharness.js"></script>
         <script src="../../resources/testharnessreport.js"></script>
         <script src="../media-file.js"></script>
+        <script src="util.js"></script>
     </head>
     <body>
         <script>
@@ -12,6 +13,7 @@
             // - internals.setIsLowEndDevice()
             async_test(function(t)
             {
+                enableRemotePlaybackBackendForTest(t);
                 var v = document.createElement('video');
                 v.src = findMediaFile('video', '../content/test');
                 document.body.appendChild(v);
diff --git a/third_party/WebKit/LayoutTests/paint/overflow/composited-rounded-clip-floating-element-expected.txt b/third_party/WebKit/LayoutTests/paint/overflow/composited-rounded-clip-floating-element-expected.txt
new file mode 100644
index 0000000..c0c1300
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/paint/overflow/composited-rounded-clip-floating-element-expected.txt
@@ -0,0 +1,16 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x36
+  LayoutBlockFlow {HTML} at (0,0) size 800x36
+    LayoutBlockFlow {BODY} at (8,8) size 784x20
+layer at (8,8) size 784x20
+  LayoutBlockFlow {DIV} at (0,0) size 784x20
+layer at (8,8) size 784x0
+  LayoutBlockFlow {DIV} at (0,0) size 784x0
+layer at (8,8) size 784x0
+  LayoutBlockFlow {DIV} at (0,0) size 784x0
+layer at (8,8) size 784x0
+  LayoutBlockFlow (relative positioned) {DIV} at (0,0) size 784x0
+    LayoutBlockFlow (floating) {DIV} at (0,0) size 21x20
+      LayoutText {#text} at (0,0) size 21x19
+        text run at (0,0) width 21: "test"
diff --git a/third_party/WebKit/LayoutTests/paint/overflow/composited-rounded-clip-floating-element.html b/third_party/WebKit/LayoutTests/paint/overflow/composited-rounded-clip-floating-element.html
new file mode 100644
index 0000000..169d6fb
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/paint/overflow/composited-rounded-clip-floating-element.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<!-- Passes if the word "test" is visible -->
+<div style="border-radius:2px;overflow:hidden;">
+  <div style="overflow:hidden;">
+    <div style="transform: translateZ(0);"></div>
+  </div>
+
+  <!-- This div has zero height because its child is floating. Nevertheless the
+  child should get the rounded clip mask applied to it. It is indirectly
+  composited due to overlapping the above div -->
+  <div style="position:relative;">
+    <div style="float:left">test</div>
+  </div>
+</div>
diff --git a/third_party/WebKit/LayoutTests/platform/linux/paint/overflow/composited-rounded-clip-floating-element-expected.png b/third_party/WebKit/LayoutTests/platform/linux/paint/overflow/composited-rounded-clip-floating-element-expected.png
new file mode 100644
index 0000000..6f07a96d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/paint/overflow/composited-rounded-clip-floating-element-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/paint/overflow/composited-rounded-clip-floating-element-expected.png b/third_party/WebKit/LayoutTests/platform/mac/paint/overflow/composited-rounded-clip-floating-element-expected.png
new file mode 100644
index 0000000..194cd5ea
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/paint/overflow/composited-rounded-clip-floating-element-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/paint/overflow/composited-rounded-clip-floating-element-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/paint/overflow/composited-rounded-clip-floating-element-expected.txt
new file mode 100644
index 0000000..b920092
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/paint/overflow/composited-rounded-clip-floating-element-expected.txt
@@ -0,0 +1,16 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x34
+  LayoutBlockFlow {HTML} at (0,0) size 800x34
+    LayoutBlockFlow {BODY} at (8,8) size 784x18
+layer at (8,8) size 784x18
+  LayoutBlockFlow {DIV} at (0,0) size 784x18
+layer at (8,8) size 784x0
+  LayoutBlockFlow {DIV} at (0,0) size 784x0
+layer at (8,8) size 784x0
+  LayoutBlockFlow {DIV} at (0,0) size 784x0
+layer at (8,8) size 784x0
+  LayoutBlockFlow (relative positioned) {DIV} at (0,0) size 784x0
+    LayoutBlockFlow (floating) {DIV} at (0,0) size 22.22x18
+      LayoutText {#text} at (0,0) size 23x18
+        text run at (0,0) width 23: "test"
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/webexposed/global-interface-listing-expected.txt
index 81844b5..4757310 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -615,6 +615,13 @@
     method @@iterator
     method constructor
     method item
+interface Clipboard : EventTarget
+    attribute @@toStringTag
+    method constructor
+    method read
+    method readText
+    method write
+    method writeText
 interface ClipboardEvent : Event
     attribute @@toStringTag
     getter clipboardData
diff --git a/third_party/WebKit/LayoutTests/platform/win/paint/overflow/composited-rounded-clip-floating-element-expected.png b/third_party/WebKit/LayoutTests/platform/win/paint/overflow/composited-rounded-clip-floating-element-expected.png
new file mode 100644
index 0000000..e7415340
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/paint/overflow/composited-rounded-clip-floating-element-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-expected.txt
index 6fd2bfa..65eb1cda 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -544,6 +544,13 @@
     method @@iterator
     method constructor
     method item
+interface Clipboard : EventTarget
+    attribute @@toStringTag
+    method constructor
+    method read
+    method readText
+    method write
+    method writeText
 interface ClipboardEvent : Event
     attribute @@toStringTag
     getter clipboardData
diff --git a/third_party/WebKit/LayoutTests/svg/animations/animate-linear-discrete-additive-b.svg b/third_party/WebKit/LayoutTests/svg/animations/animate-linear-discrete-additive-b.svg
index f8952627..92f14fc6 100644
--- a/third_party/WebKit/LayoutTests/svg/animations/animate-linear-discrete-additive-b.svg
+++ b/third_party/WebKit/LayoutTests/svg/animations/animate-linear-discrete-additive-b.svg
@@ -29,6 +29,8 @@
 
 function loaded() {
     document.documentElement.setCurrentTime(8);
+    // Pause the timeline to avoid it advancing before the result is sampled.
+    document.documentElement.pauseAnimations();
     if (window.testRunner)
         testRunner.notifyDone();
 }
diff --git a/third_party/WebKit/LayoutTests/svg/animations/animate-linear-discrete-additive-c.svg b/third_party/WebKit/LayoutTests/svg/animations/animate-linear-discrete-additive-c.svg
index b134383..f960e37 100644
--- a/third_party/WebKit/LayoutTests/svg/animations/animate-linear-discrete-additive-c.svg
+++ b/third_party/WebKit/LayoutTests/svg/animations/animate-linear-discrete-additive-c.svg
@@ -29,6 +29,8 @@
 
 function loaded() {
     document.documentElement.setCurrentTime(11);
+    // Pause the timeline to avoid it advancing before the result is sampled.
+    document.documentElement.pauseAnimations();
     if (window.testRunner)
         testRunner.notifyDone();
 }
diff --git a/third_party/WebKit/LayoutTests/svg/animations/animate-linear-discrete-additive.svg b/third_party/WebKit/LayoutTests/svg/animations/animate-linear-discrete-additive.svg
index 5b8310aa..587a7bd 100644
--- a/third_party/WebKit/LayoutTests/svg/animations/animate-linear-discrete-additive.svg
+++ b/third_party/WebKit/LayoutTests/svg/animations/animate-linear-discrete-additive.svg
@@ -29,6 +29,8 @@
 
 function loaded() {
     document.documentElement.setCurrentTime(3);
+    // Pause the timeline to avoid it advancing before the result is sampled.
+    document.documentElement.pauseAnimations();
     if (window.testRunner)
         testRunner.notifyDone();
 }
diff --git a/third_party/WebKit/LayoutTests/typedcssom/cssUnitValue_toMethod.html b/third_party/WebKit/LayoutTests/typedcssom/cssUnitValue_toMethod.html
index 00f1a12..bccac27 100644
--- a/third_party/WebKit/LayoutTests/typedcssom/cssUnitValue_toMethod.html
+++ b/third_party/WebKit/LayoutTests/typedcssom/cssUnitValue_toMethod.html
@@ -12,6 +12,15 @@
   'turn'
 ];
 
+let fixedLengthUnits = [
+  'px',
+  'in',
+  'cm',
+  'mm',
+  'pt',
+  'pc'
+];
+
 let conversionFactors = {
   'deg': {
     'deg': 1,
@@ -37,6 +46,59 @@
     'grad': 400,
     'turn': 1,
   },
+  // 96 px per in
+  // 2.54 cm per in
+  // 10 mm per cm
+  // 72 pt per in
+  // 6 pc per in
+  'px': {
+    'px': 1,
+    'in': 1 / 96,
+    'cm': 2.54 / 96,
+    'mm': 25.4 / 96,
+    'pt': 72 / 96,
+    'pc': 6 / 96
+  },
+  'in': {
+    'px': 96,
+    'in': 1,
+    'cm': 2.54,
+    'mm': 25.4,
+    'pt': 72,
+    'pc': 6
+  },
+  'cm': {
+    'px': 96 / 2.54,
+    'in': 1 / 2.54,
+    'cm': 1,
+    'mm': 10,
+    'pt': 72 / 2.54,
+    'pc': 6 / 2.54
+  },
+  'mm': {
+    'px': 96 / 25.4,
+    'in': 1 / 25.4,
+    'cm': 1 / 10,
+    'mm': 1,
+    'pt': 72 / 25.4,
+    'pc': 6 / 25.4
+  },
+  'pt': {
+    'px': 96 / 72,
+    'in': 1 / 72,
+    'cm': 2.54 / 72,
+    'mm': 25.4 / 72,
+    'pt': 1,
+    'pc': 6 / 72,
+  },
+  'pc': {
+    'px': 96 / 6,
+    'in': 1 / 6,
+    'cm': 2.54 / 6,
+    'mm': 25.4 / 6,
+    'pt': 72 / 6,
+    'pc': 1
+  }
 }
 
 test(() => {
@@ -65,4 +127,16 @@
   }
 }
 
+for (let unit of fixedLengthUnits) {
+  for (let toUnit of fixedLengthUnits) {
+    test(() => {
+      let unitValue = new CSSUnitValue(1, unit);
+      let result = unitValue.to(toUnit);
+      assert_approx_equals(
+          result.value, conversionFactors[unit][toUnit], EPSILON);
+      assert_equals(result.unit, toUnit);
+    }, 'Converting fixed length unit ' + unit + ' to ' + toUnit);
+  }
+}
+
 </script>
diff --git a/third_party/WebKit/LayoutTests/virtual/service-worker-navigation-preload-disabled/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/virtual/service-worker-navigation-preload-disabled/webexposed/global-interface-listing-expected.txt
index 9aa28ab3..c3fc5dc5 100644
--- a/third_party/WebKit/LayoutTests/virtual/service-worker-navigation-preload-disabled/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/virtual/service-worker-navigation-preload-disabled/webexposed/global-interface-listing-expected.txt
@@ -1025,6 +1025,13 @@
     method @@iterator
     method constructor
     method item
+interface Clipboard : EventTarget
+    attribute @@toStringTag
+    method constructor
+    method read
+    method readText
+    method write
+    method writeText
 interface ClipboardEvent : Event
     attribute @@toStringTag
     getter clipboardData
@@ -4411,6 +4418,7 @@
     getter authentication
     getter bluetooth
     getter budget
+    getter clipboard
     getter connection
     getter cookieEnabled
     getter credentials
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
index 84197b0..d72d71e 100644
--- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -1025,6 +1025,13 @@
     method @@iterator
     method constructor
     method item
+interface Clipboard : EventTarget
+    attribute @@toStringTag
+    method constructor
+    method read
+    method readText
+    method write
+    method writeText
 interface ClipboardEvent : Event
     attribute @@toStringTag
     getter clipboardData
@@ -4418,6 +4425,7 @@
     getter authentication
     getter bluetooth
     getter budget
+    getter clipboard
     getter connection
     getter cookieEnabled
     getter credentials
diff --git a/third_party/WebKit/Source/DEPS b/third_party/WebKit/Source/DEPS
index 510a74f9..2ad1573e 100644
--- a/third_party/WebKit/Source/DEPS
+++ b/third_party/WebKit/Source/DEPS
@@ -3,6 +3,7 @@
     "+base/gtest_prod_util.h",
     "+build",
     "+services/service_manager/public/cpp/connector.h",
+    "+services/service_manager/public/cpp/interface_provider.h",
     "+testing/gmock/include/gmock",
     "+testing/gtest/include/gtest",
     "+v8",
diff --git a/third_party/WebKit/Source/core/BUILD.gn b/third_party/WebKit/Source/core/BUILD.gn
index 123b123..087ea36 100644
--- a/third_party/WebKit/Source/core/BUILD.gn
+++ b/third_party/WebKit/Source/core/BUILD.gn
@@ -465,7 +465,6 @@
     "$blink_core_output_dir/css/properties/CSSPropertyAPIAnimationIterationCount.h",
     "$blink_core_output_dir/css/properties/CSSPropertyAPIAnimationName.h",
     "$blink_core_output_dir/css/properties/CSSPropertyAPIAnimationPlayState.h",
-    "$blink_core_output_dir/css/properties/CSSPropertyAPIBackgroundColor.h",
     "$blink_core_output_dir/css/properties/CSSPropertyAPIBaselineShift.h",
     "$blink_core_output_dir/css/properties/CSSPropertyAPIBorderImageOutset.h",
     "$blink_core_output_dir/css/properties/CSSPropertyAPIBorderImageRepeat.h",
@@ -478,6 +477,7 @@
     "$blink_core_output_dir/css/properties/CSSPropertyAPIClip.h",
     "$blink_core_output_dir/css/properties/CSSPropertyAPIClipPath.h",
     "$blink_core_output_dir/css/properties/CSSPropertyAPIColor.h",
+    "$blink_core_output_dir/css/properties/CSSPropertyAPIColorNoQuirks.h",
     "$blink_core_output_dir/css/properties/CSSPropertyAPIColumnCount.h",
     "$blink_core_output_dir/css/properties/CSSPropertyAPIColumnGap.h",
     "$blink_core_output_dir/css/properties/CSSPropertyAPIColumnRuleWidth.h",
diff --git a/third_party/WebKit/Source/core/DEPS b/third_party/WebKit/Source/core/DEPS
index 76e014f4..591e0d8 100644
--- a/third_party/WebKit/Source/core/DEPS
+++ b/third_party/WebKit/Source/core/DEPS
@@ -11,7 +11,6 @@
     "+platform",
     "+public/platform",
     "+public/web",
-    "+services/service_manager/public/cpp",
     "+third_party/skia/include",
     "+ui/gfx/geometry",
     "-web",
@@ -21,5 +20,6 @@
     # We do not want any new dependencies on Web(Local|Remote)FrameBase.h until
     # we resolve the control layer.
     "!core/frame/WebLocalFrameBase.h",
-    "!core/frame/WebRemoteFrameBase.h"
+    "!core/frame/WebRemoteFrameBase.h",
+    "!core/frame/WebRemoteFrameImpl.h",
 ]
diff --git a/third_party/WebKit/Source/core/animation/CSSImageInterpolationType.cpp b/third_party/WebKit/Source/core/animation/CSSImageInterpolationType.cpp
index daf53ac..c9b5048 100644
--- a/third_party/WebKit/Source/core/animation/CSSImageInterpolationType.cpp
+++ b/third_party/WebKit/Source/core/animation/CSSImageInterpolationType.cpp
@@ -38,7 +38,7 @@
       return start_;
     if (progress >= 1)
       return end_;
-    return CSSCrossfadeValue::Create(
+    return cssvalue::CSSCrossfadeValue::Create(
         start_, end_,
         CSSPrimitiveValue::Create(progress,
                                   CSSPrimitiveValue::UnitType::kNumber));
diff --git a/third_party/WebKit/Source/core/clipboard/BUILD.gn b/third_party/WebKit/Source/core/clipboard/BUILD.gn
index 7c3af33d..cebb63e 100644
--- a/third_party/WebKit/Source/core/clipboard/BUILD.gn
+++ b/third_party/WebKit/Source/core/clipboard/BUILD.gn
@@ -6,6 +6,10 @@
 
 blink_core_sources("clipboard") {
   sources = [
+    "Clipboard.cpp",
+    "Clipboard.h",
+    "ClipboardPromise.cpp",
+    "ClipboardPromise.h",
     "DataObject.cpp",
     "DataObject.h",
     "DataObjectItem.cpp",
diff --git a/third_party/WebKit/Source/core/clipboard/Clipboard.cpp b/third_party/WebKit/Source/core/clipboard/Clipboard.cpp
new file mode 100644
index 0000000..98b0ac9c
--- /dev/null
+++ b/third_party/WebKit/Source/core/clipboard/Clipboard.cpp
@@ -0,0 +1,45 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/clipboard/Clipboard.h"
+
+#include "bindings/core/v8/ScriptPromiseResolver.h"
+#include "core/clipboard/ClipboardPromise.h"
+
+namespace blink {
+
+Clipboard::Clipboard(ExecutionContext* context)
+    : ContextLifecycleObserver(context) {}
+
+ScriptPromise Clipboard::read(ScriptState* script_state) {
+  return ClipboardPromise::CreateForRead(script_state);
+}
+
+ScriptPromise Clipboard::readText(ScriptState* script_state) {
+  return ClipboardPromise::CreateForReadText(script_state);
+}
+
+ScriptPromise Clipboard::write(ScriptState* script_state, DataTransfer* data) {
+  return ClipboardPromise::CreateForWrite(script_state, data);
+}
+
+ScriptPromise Clipboard::writeText(ScriptState* script_state,
+                                   const String& data) {
+  return ClipboardPromise::CreateForWriteText(script_state, data);
+}
+
+const AtomicString& Clipboard::InterfaceName() const {
+  return EventTargetNames::Clipboard;
+}
+
+ExecutionContext* Clipboard::GetExecutionContext() const {
+  return ContextLifecycleObserver::GetExecutionContext();
+}
+
+DEFINE_TRACE(Clipboard) {
+  EventTarget::Trace(visitor);
+  ContextLifecycleObserver::Trace(visitor);
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/clipboard/Clipboard.h b/third_party/WebKit/Source/core/clipboard/Clipboard.h
new file mode 100644
index 0000000..568b45b
--- /dev/null
+++ b/third_party/WebKit/Source/core/clipboard/Clipboard.h
@@ -0,0 +1,42 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef Clipboard_h
+#define Clipboard_h
+
+#include "bindings/core/v8/ScriptPromise.h"
+#include "core/dom/ContextLifecycleObserver.h"
+#include "core/events/EventTarget.h"
+#include "platform/wtf/Noncopyable.h"
+
+namespace blink {
+
+class DataTransfer;
+class ScriptState;
+
+class Clipboard : public EventTargetWithInlineData,
+                  public ContextLifecycleObserver {
+  USING_GARBAGE_COLLECTED_MIXIN(Clipboard);
+  DEFINE_WRAPPERTYPEINFO();
+  WTF_MAKE_NONCOPYABLE(Clipboard);
+
+ public:
+  explicit Clipboard(ExecutionContext*);
+
+  ScriptPromise read(ScriptState*);
+  ScriptPromise readText(ScriptState*);
+
+  ScriptPromise write(ScriptState*, DataTransfer*);
+  ScriptPromise writeText(ScriptState*, const String&);
+
+  // EventTarget
+  const AtomicString& InterfaceName() const override;
+  ExecutionContext* GetExecutionContext() const override;
+
+  DECLARE_VIRTUAL_TRACE();
+};
+
+}  // namespace blink
+
+#endif  // Clipboard_h
diff --git a/third_party/WebKit/Source/core/clipboard/Clipboard.idl b/third_party/WebKit/Source/core/clipboard/Clipboard.idl
new file mode 100644
index 0000000..22a02471
--- /dev/null
+++ b/third_party/WebKit/Source/core/clipboard/Clipboard.idl
@@ -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.
+
+// https://w3c.github.io/clipboard-apis/#clipboard-interface
+
+[SecureContext]
+interface Clipboard : EventTarget {
+  [CallWith=ScriptState] Promise<DataTransfer> read();
+  [CallWith=ScriptState] Promise<DOMString> readText();
+
+  [CallWith=ScriptState] Promise<void> write(DataTransfer data);
+  [CallWith=ScriptState] Promise<void> writeText(DOMString data);
+};
diff --git a/third_party/WebKit/Source/core/clipboard/ClipboardPromise.cpp b/third_party/WebKit/Source/core/clipboard/ClipboardPromise.cpp
new file mode 100644
index 0000000..4a0739a
--- /dev/null
+++ b/third_party/WebKit/Source/core/clipboard/ClipboardPromise.cpp
@@ -0,0 +1,115 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/clipboard/ClipboardPromise.h"
+
+#include "bindings/core/v8/ScriptPromiseResolver.h"
+#include "core/clipboard/DataObject.h"
+#include "core/clipboard/DataTransfer.h"
+#include "core/clipboard/DataTransferItem.h"
+#include "core/clipboard/DataTransferItemList.h"
+#include "core/dom/TaskRunnerHelper.h"
+#include "platform/CrossThreadFunctional.h"
+#include "platform/clipboard/ClipboardMimeTypes.h"
+#include "public/platform/Platform.h"
+
+namespace blink {
+
+ScriptPromise ClipboardPromise::CreateForRead(ScriptState* script_state) {
+  ClipboardPromise* clipboard_promise = new ClipboardPromise(script_state);
+  clipboard_promise->GetTaskRunner()->PostTask(
+      BLINK_FROM_HERE, WTF::Bind(&ClipboardPromise::HandleRead,
+                                 WrapPersistent(clipboard_promise)));
+  return clipboard_promise->script_promise_resolver_->Promise();
+}
+
+ScriptPromise ClipboardPromise::CreateForReadText(ScriptState* script_state) {
+  ClipboardPromise* clipboard_promise = new ClipboardPromise(script_state);
+  clipboard_promise->GetTaskRunner()->PostTask(
+      BLINK_FROM_HERE, WTF::Bind(&ClipboardPromise::HandleReadText,
+                                 WrapPersistent(clipboard_promise)));
+  return clipboard_promise->script_promise_resolver_->Promise();
+}
+
+ScriptPromise ClipboardPromise::CreateForWrite(ScriptState* script_state,
+                                               DataTransfer* data) {
+  ClipboardPromise* clipboard_promise = new ClipboardPromise(script_state);
+  clipboard_promise->GetTaskRunner()->PostTask(
+      BLINK_FROM_HERE,
+      WTF::Bind(&ClipboardPromise::HandleWrite,
+                WrapPersistent(clipboard_promise), WrapPersistent(data)));
+  return clipboard_promise->script_promise_resolver_->Promise();
+}
+
+ScriptPromise ClipboardPromise::CreateForWriteText(ScriptState* script_state,
+                                                   const String& data) {
+  ClipboardPromise* clipboard_promise = new ClipboardPromise(script_state);
+  clipboard_promise->GetTaskRunner()->PostTask(
+      BLINK_FROM_HERE, WTF::Bind(&ClipboardPromise::HandleWriteText,
+                                 WrapPersistent(clipboard_promise), data));
+  return clipboard_promise->script_promise_resolver_->Promise();
+}
+
+ClipboardPromise::ClipboardPromise(ScriptState* script_state)
+    : ContextLifecycleObserver(blink::ExecutionContext::From(script_state)),
+      script_promise_resolver_(ScriptPromiseResolver::Create(script_state)),
+      buffer_(WebClipboard::kBufferStandard) {}
+
+WebTaskRunner* ClipboardPromise::GetTaskRunner() {
+  // TODO(garykac): Replace MiscPlatformAPI with TaskType specific to clipboard.
+  return TaskRunnerHelper::Get(TaskType::kMiscPlatformAPI,
+                               GetExecutionContext())
+      .Get();
+}
+
+// TODO(garykac): This currently only handles plain text.
+void ClipboardPromise::HandleRead() {
+  DCHECK(script_promise_resolver_);
+  String plain_text = Platform::Current()->Clipboard()->ReadPlainText(buffer_);
+
+  const DataTransfer::DataTransferType type =
+      DataTransfer::DataTransferType::kCopyAndPaste;
+  const DataTransferAccessPolicy access =
+      DataTransferAccessPolicy::kDataTransferReadable;
+  DataObject* data = DataObject::CreateFromString(plain_text);
+  DataTransfer* dt = DataTransfer::Create(type, access, data);
+  script_promise_resolver_->Resolve(dt);
+}
+
+void ClipboardPromise::HandleReadText() {
+  DCHECK(script_promise_resolver_);
+  String text = Platform::Current()->Clipboard()->ReadPlainText(buffer_);
+  script_promise_resolver_->Resolve(text);
+}
+
+// TODO(garykac): This currently only handles plain text.
+void ClipboardPromise::HandleWrite(DataTransfer* data) {
+  DCHECK(script_promise_resolver_);
+  size_t num_items = data->items()->length();
+  for (unsigned long i = 0; i < num_items; i++) {
+    DataTransferItem* item = data->items()->item(i);
+    DataObjectItem* objectItem = item->GetDataObjectItem();
+    if (objectItem->Kind() == DataObjectItem::kStringKind &&
+        objectItem->GetType() == kMimeTypeTextPlain) {
+      String text = objectItem->GetAsString();
+      Platform::Current()->Clipboard()->WritePlainText(text);
+      script_promise_resolver_->Resolve();
+      return;
+    }
+  }
+  script_promise_resolver_->Reject();
+}
+
+void ClipboardPromise::HandleWriteText(const String& data) {
+  DCHECK(script_promise_resolver_);
+  Platform::Current()->Clipboard()->WritePlainText(data);
+  script_promise_resolver_->Resolve();
+}
+
+DEFINE_TRACE(ClipboardPromise) {
+  visitor->Trace(script_promise_resolver_);
+  ContextLifecycleObserver::Trace(visitor);
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/clipboard/ClipboardPromise.h b/third_party/WebKit/Source/core/clipboard/ClipboardPromise.h
new file mode 100644
index 0000000..1cfd0e3
--- /dev/null
+++ b/third_party/WebKit/Source/core/clipboard/ClipboardPromise.h
@@ -0,0 +1,52 @@
+// 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 ClipboardPromise_h
+#define ClipboardPromise_h
+
+#include "bindings/core/v8/ScriptPromise.h"
+#include "core/CoreExport.h"
+#include "core/dom/ContextLifecycleObserver.h"
+#include "public/platform/WebClipboard.h"
+
+namespace blink {
+
+class DataTransfer;
+class ScriptPromiseResolver;
+
+class ClipboardPromise final
+    : public GarbageCollectedFinalized<ClipboardPromise>,
+      public ContextLifecycleObserver {
+  USING_GARBAGE_COLLECTED_MIXIN(ClipboardPromise);
+  WTF_MAKE_NONCOPYABLE(ClipboardPromise);
+
+ public:
+  virtual ~ClipboardPromise(){};
+
+  static ScriptPromise CreateForRead(ScriptState*);
+  static ScriptPromise CreateForReadText(ScriptState*);
+  static ScriptPromise CreateForWrite(ScriptState*, DataTransfer*);
+  static ScriptPromise CreateForWriteText(ScriptState*, const String&);
+
+  DECLARE_VIRTUAL_TRACE();
+
+ private:
+  ClipboardPromise(ScriptState*);
+
+  WebTaskRunner* GetTaskRunner();
+
+  void HandleRead();
+  void HandleReadText();
+
+  void HandleWrite(DataTransfer*);
+  void HandleWriteText(const String&);
+
+  Member<ScriptPromiseResolver> script_promise_resolver_;
+
+  WebClipboard::Buffer buffer_;
+};
+
+}  // namespace blink
+
+#endif  // ClipboardPromise_h
diff --git a/third_party/WebKit/Source/core/core_idl_files.gni b/third_party/WebKit/Source/core/core_idl_files.gni
index c8c5ae7..f6cc9e7 100644
--- a/third_party/WebKit/Source/core/core_idl_files.gni
+++ b/third_party/WebKit/Source/core/core_idl_files.gni
@@ -35,6 +35,7 @@
                                  "animation/KeyframeEffect.idl",
                                  "animation/KeyframeEffectReadOnly.idl",
                                  "animation/ScrollTimeline.idl",
+                                 "clipboard/Clipboard.idl",
                                  "clipboard/DataTransfer.idl",
                                  "clipboard/DataTransferItemList.idl",
                                  "css/CSS.idl",
@@ -470,6 +471,7 @@
                     "events/EventListener.idl",
                     "events/NavigatorEvents.idl",
                     "fileapi/URLFileAPI.idl",
+                    "frame/NavigatorClipboard.idl",
                     "frame/NavigatorConcurrentHardware.idl",
                     "frame/NavigatorCookies.idl",
                     "frame/NavigatorID.idl",
diff --git a/third_party/WebKit/Source/core/css/BUILD.gn b/third_party/WebKit/Source/core/css/BUILD.gn
index ca13f0d..1fb11927 100644
--- a/third_party/WebKit/Source/core/css/BUILD.gn
+++ b/third_party/WebKit/Source/core/css/BUILD.gn
@@ -381,7 +381,6 @@
     "properties/CSSPropertyAPIAnimationIterationCount.cpp",
     "properties/CSSPropertyAPIAnimationName.cpp",
     "properties/CSSPropertyAPIAnimationPlayState.cpp",
-    "properties/CSSPropertyAPIBackgroundColor.cpp",
     "properties/CSSPropertyAPIBaselineShift.cpp",
     "properties/CSSPropertyAPIBorderImageOutset.cpp",
     "properties/CSSPropertyAPIBorderImageRepeat.cpp",
@@ -394,6 +393,7 @@
     "properties/CSSPropertyAPIClip.cpp",
     "properties/CSSPropertyAPIClipPath.cpp",
     "properties/CSSPropertyAPIColor.cpp",
+    "properties/CSSPropertyAPIColorNoQuirks.cpp",
     "properties/CSSPropertyAPIColumnCount.cpp",
     "properties/CSSPropertyAPIColumnGap.cpp",
     "properties/CSSPropertyAPIColumnRuleWidth.cpp",
diff --git a/third_party/WebKit/Source/core/css/CSSCrossfadeValue.cpp b/third_party/WebKit/Source/core/css/CSSCrossfadeValue.cpp
index ec23b00..83231bb 100644
--- a/third_party/WebKit/Source/core/css/CSSCrossfadeValue.cpp
+++ b/third_party/WebKit/Source/core/css/CSSCrossfadeValue.cpp
@@ -33,6 +33,7 @@
 #include "platform/wtf/text/StringBuilder.h"
 
 namespace blink {
+namespace cssvalue {
 
 static bool SubimageIsPending(CSSValue* value) {
   if (value->IsImageValue())
@@ -302,4 +303,5 @@
   CSSImageGeneratorValue::TraceAfterDispatch(visitor);
 }
 
+}  // namespace cssvalue
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/CSSCrossfadeValue.h b/third_party/WebKit/Source/core/css/CSSCrossfadeValue.h
index 580551c..5c4eb01 100644
--- a/third_party/WebKit/Source/core/css/CSSCrossfadeValue.h
+++ b/third_party/WebKit/Source/core/css/CSSCrossfadeValue.h
@@ -37,8 +37,10 @@
 
 class CrossfadeSubimageObserverProxy;
 
+namespace cssvalue {
+
 class CORE_EXPORT CSSCrossfadeValue final : public CSSImageGeneratorValue {
-  friend class CrossfadeSubimageObserverProxy;
+  friend class blink::CrossfadeSubimageObserverProxy;
   USING_PRE_FINALIZER(CSSCrossfadeValue, Dispose);
 
  public:
@@ -116,6 +118,7 @@
 
 DEFINE_CSS_VALUE_TYPE_CASTS(CSSCrossfadeValue, IsCrossfadeValue());
 
+}  // namespace cssvalue
 }  // namespace blink
 
 #endif  // CSSCrossfadeValue_h
diff --git a/third_party/WebKit/Source/core/css/CSSHelper.h b/third_party/WebKit/Source/core/css/CSSHelper.h
index 30e5313..4cf135e 100644
--- a/third_party/WebKit/Source/core/css/CSSHelper.h
+++ b/third_party/WebKit/Source/core/css/CSSHelper.h
@@ -26,12 +26,19 @@
 
 namespace blink {
 
+const double kMillimetersPerCentimeter = 10;
+const double kCentimetersPerInch = 2.54;
+const double kMillimetersPerInch = 25.4;
+const double kPointsPerInch = 72;
+const double kPicasPerInch = 6;
+
 // These conversions are defined in css-values
 const double kCssPixelsPerInch = 96;
-const double kCssPixelsPerCentimeter = kCssPixelsPerInch / 2.54;  // 2.54 cm/in
-const double kCssPixelsPerMillimeter = kCssPixelsPerCentimeter / 10;
-const double kCssPixelsPerPoint = kCssPixelsPerInch / 72;
-const double kCssPixelsPerPica = kCssPixelsPerInch / 6;
+const double kCssPixelsPerCentimeter = kCssPixelsPerInch / kCentimetersPerInch;
+const double kCssPixelsPerMillimeter =
+    kCssPixelsPerCentimeter / kMillimetersPerCentimeter;
+const double kCssPixelsPerPoint = kCssPixelsPerInch / kPointsPerInch;
+const double kCssPixelsPerPica = kCssPixelsPerInch / kPicasPerInch;
 
 }  // namespace blink
 
diff --git a/third_party/WebKit/Source/core/css/CSSImageGeneratorValue.cpp b/third_party/WebKit/Source/core/css/CSSImageGeneratorValue.cpp
index b0f68e4..59fbd88 100644
--- a/third_party/WebKit/Source/core/css/CSSImageGeneratorValue.cpp
+++ b/third_party/WebKit/Source/core/css/CSSImageGeneratorValue.cpp
@@ -33,6 +33,8 @@
 
 namespace blink {
 
+using cssvalue::ToCSSCrossfadeValue;
+
 CSSImageGeneratorValue::CSSImageGeneratorValue(ClassType class_type)
     : CSSValue(class_type) {}
 
diff --git a/third_party/WebKit/Source/core/css/CSSProperties.json5 b/third_party/WebKit/Source/core/css/CSSProperties.json5
index 6ad074c4..6ccbd6fd 100644
--- a/third_party/WebKit/Source/core/css/CSSProperties.json5
+++ b/third_party/WebKit/Source/core/css/CSSProperties.json5
@@ -398,6 +398,8 @@
     // Other properties can depend upon high priority properties (e.g. font-size / ems)
     {
       name: "color",
+      api_class: "CSSPropertyAPIColor",
+      api_methods: ["parseSingleValue"],
       custom_all: true,
       inherited: true,
       interpolable: true,
@@ -690,7 +692,7 @@
     },
     {
       name: "background-color",
-      api_class: true,
+      api_class: "CSSPropertyAPIColor",
       api_methods: ["parseSingleValue"],
       custom_all: true,
       interpolable: true,
@@ -1302,7 +1304,7 @@
     },
     {
       name: "flood-color",
-      api_class: "CSSPropertyAPIColor",
+      api_class: "CSSPropertyAPIColorNoQuirks",
       api_methods: ["parseSingleValue"],
       converter: "ConvertColor",
       interpolable: true,
@@ -1547,7 +1549,7 @@
     },
     {
       name: "lighting-color",
-      api_class: "CSSPropertyAPIColor",
+      api_class: "CSSPropertyAPIColorNoQuirks",
       api_methods: ["parseSingleValue"],
       converter: "ConvertColor",
       interpolable: true,
@@ -2360,7 +2362,7 @@
     },
     {
       name: "stop-color",
-      api_class: "CSSPropertyAPIColor",
+      api_class: "CSSPropertyAPIColorNoQuirks",
       api_methods: ["parseSingleValue"],
       converter: "ConvertColor",
       interpolable: true,
@@ -2954,7 +2956,7 @@
     },
     {
       name: "column-rule-color",
-      api_class: "CSSPropertyAPIColor",
+      api_class: "CSSPropertyAPIColorNoQuirks",
       api_methods: ["parseSingleValue"],
       custom_all: true,
       interpolable: true,
@@ -3190,7 +3192,7 @@
     },
     {
       name: "-webkit-tap-highlight-color",
-      api_class: "CSSPropertyAPIColor",
+      api_class: "CSSPropertyAPIColorNoQuirks",
       api_methods: ["parseSingleValue"],
       converter: "ConvertColor",
       inherited: true,
@@ -3207,7 +3209,7 @@
     },
     {
       name: "-webkit-text-emphasis-color",
-      api_class: "CSSPropertyAPIColor",
+      api_class: "CSSPropertyAPIColorNoQuirks",
       api_methods: ["parseSingleValue"],
       custom_all: true,
       inherited: true,
@@ -3235,7 +3237,7 @@
     },
     {
       name: "-webkit-text-fill-color",
-      api_class: "CSSPropertyAPIColor",
+      api_class: "CSSPropertyAPIColorNoQuirks",
       api_methods: ["parseSingleValue"],
       custom_all: true,
       inherited: true,
@@ -3255,7 +3257,7 @@
     },
     {
       name: "-webkit-text-stroke-color",
-      api_class: "CSSPropertyAPIColor",
+      api_class: "CSSPropertyAPIColorNoQuirks",
       api_methods: ["parseSingleValue"],
       custom_all: true,
       inherited: true,
@@ -3427,7 +3429,7 @@
 
     {
       name: "-webkit-border-end-color",
-      api_class: "CSSPropertyAPIColor",
+      api_class: "CSSPropertyAPIColorNoQuirks",
       api_methods: ["parseSingleValue"],
       direction_aware: true,
     },
@@ -3443,7 +3445,7 @@
     },
     {
       name: "-webkit-border-start-color",
-      api_class: "CSSPropertyAPIColor",
+      api_class: "CSSPropertyAPIColorNoQuirks",
       api_methods: ["parseSingleValue"],
       direction_aware: true,
     },
@@ -3459,7 +3461,7 @@
     },
     {
       name: "-webkit-border-before-color",
-      api_class: "CSSPropertyAPIColor",
+      api_class: "CSSPropertyAPIColorNoQuirks",
       api_methods: ["parseSingleValue"],
       direction_aware: true,
     },
@@ -3475,7 +3477,7 @@
     },
     {
       name: "-webkit-border-after-color",
-      api_class: "CSSPropertyAPIColor",
+      api_class: "CSSPropertyAPIColorNoQuirks",
       api_methods: ["parseSingleValue"],
       direction_aware: true,
     },
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSUnitValue.cpp b/third_party/WebKit/Source/core/css/cssom/CSSUnitValue.cpp
index f6fe21ab..547c553 100644
--- a/third_party/WebKit/Source/core/css/cssom/CSSUnitValue.cpp
+++ b/third_party/WebKit/Source/core/css/cssom/CSSUnitValue.cpp
@@ -5,6 +5,7 @@
 #include "core/css/cssom/CSSUnitValue.h"
 
 #include "bindings/core/v8/ExceptionState.h"
+#include "core/css/CSSHelper.h"
 #include "platform/wtf/MathExtras.h"
 
 namespace blink {
@@ -84,13 +85,125 @@
   if (unit_ == unit)
     return Create(value_, unit_);
 
-  // TODO(meade): Implement other types.
+  // TODO(meade): Implement other types: time, frequency and resolution.
+  if (CSSPrimitiveValue::IsLength(unit_) && CSSPrimitiveValue::IsLength(unit)) {
+    // Only fixed lengths can be converted.
+    if (CSSPrimitiveValue::IsRelativeUnit(unit_) ||
+        CSSPrimitiveValue::IsRelativeUnit(unit))
+      return nullptr;
+    return Create(ConvertFixedLength(unit), unit);
+  }
   if (CSSPrimitiveValue::IsAngle(unit_) && CSSPrimitiveValue::IsAngle(unit))
     return Create(ConvertAngle(unit), unit);
 
   return nullptr;
 }
 
+double CSSUnitValue::ConvertFixedLength(
+    CSSPrimitiveValue::UnitType unit) const {
+  switch (unit_) {
+    case CSSPrimitiveValue::UnitType::kPixels:
+      switch (unit) {
+        case CSSPrimitiveValue::UnitType::kCentimeters:
+          return value_ / kCssPixelsPerCentimeter;
+        case CSSPrimitiveValue::UnitType::kMillimeters:
+          return value_ / kCssPixelsPerMillimeter;
+        case CSSPrimitiveValue::UnitType::kInches:
+          return value_ / kCssPixelsPerInch;
+        case CSSPrimitiveValue::UnitType::kPoints:
+          return value_ / kCssPixelsPerPoint;
+        case CSSPrimitiveValue::UnitType::kPicas:
+          return value_ / kCssPixelsPerPica;
+        default:
+          NOTREACHED();
+          return 0;
+      }
+    case CSSPrimitiveValue::UnitType::kCentimeters:
+      switch (unit) {
+        case CSSPrimitiveValue::UnitType::kPixels:
+          return value_ * kCssPixelsPerCentimeter;
+        case CSSPrimitiveValue::UnitType::kMillimeters:
+          return value_ * kMillimetersPerCentimeter;
+        case CSSPrimitiveValue::UnitType::kInches:
+          return value_ / kCentimetersPerInch;
+        case CSSPrimitiveValue::UnitType::kPoints:
+          return value_ * (kPointsPerInch / kCentimetersPerInch);
+        case CSSPrimitiveValue::UnitType::kPicas:
+          return value_ * (kPicasPerInch / kCentimetersPerInch);
+        default:
+          NOTREACHED();
+          return 0;
+      }
+    case CSSPrimitiveValue::UnitType::kMillimeters:
+      switch (unit) {
+        case CSSPrimitiveValue::UnitType::kPixels:
+          return value_ * kCssPixelsPerMillimeter;
+        case CSSPrimitiveValue::UnitType::kCentimeters:
+          return value_ / kMillimetersPerCentimeter;
+        case CSSPrimitiveValue::UnitType::kInches:
+          return value_ / (kMillimetersPerCentimeter * kCentimetersPerInch);
+        case CSSPrimitiveValue::UnitType::kPoints:
+          return value_ * (kPointsPerInch / kMillimetersPerInch);
+        case CSSPrimitiveValue::UnitType::kPicas:
+          return value_ * (kPicasPerInch / kMillimetersPerInch);
+        default:
+          NOTREACHED();
+          return 0;
+      }
+    case CSSPrimitiveValue::UnitType::kInches:
+      switch (unit) {
+        case CSSPrimitiveValue::UnitType::kPixels:
+          return value_ * kCssPixelsPerInch;
+        case CSSPrimitiveValue::UnitType::kMillimeters:
+          return value_ * kCentimetersPerInch * kMillimetersPerCentimeter;
+        case CSSPrimitiveValue::UnitType::kCentimeters:
+          return value_ * kCentimetersPerInch;
+        case CSSPrimitiveValue::UnitType::kPoints:
+          return value_ * kPointsPerInch;
+        case CSSPrimitiveValue::UnitType::kPicas:
+          return value_ * kPicasPerInch;
+        default:
+          NOTREACHED();
+          return 0;
+      }
+    case CSSPrimitiveValue::UnitType::kPoints:
+      switch (unit) {
+        case CSSPrimitiveValue::UnitType::kPixels:
+          return value_ * kCssPixelsPerPoint;
+        case CSSPrimitiveValue::UnitType::kMillimeters:
+          return value_ * (kMillimetersPerInch / kPointsPerInch);
+        case CSSPrimitiveValue::UnitType::kCentimeters:
+          return value_ * (kCentimetersPerInch / kPointsPerInch);
+        case CSSPrimitiveValue::UnitType::kInches:
+          return value_ / kPointsPerInch;
+        case CSSPrimitiveValue::UnitType::kPicas:
+          return value_ * (kPicasPerInch / kPointsPerInch);
+        default:
+          NOTREACHED();
+          return 0;
+      }
+    case CSSPrimitiveValue::UnitType::kPicas:
+      switch (unit) {
+        case CSSPrimitiveValue::UnitType::kPixels:
+          return value_ * kCssPixelsPerPica;
+        case CSSPrimitiveValue::UnitType::kMillimeters:
+          return value_ * (kMillimetersPerInch / kPicasPerInch);
+        case CSSPrimitiveValue::UnitType::kCentimeters:
+          return value_ * (kCentimetersPerInch / kPicasPerInch);
+        case CSSPrimitiveValue::UnitType::kInches:
+          return value_ / kPicasPerInch;
+        case CSSPrimitiveValue::UnitType::kPoints:
+          return value_ * (kPointsPerInch / kPicasPerInch);
+        default:
+          NOTREACHED();
+          return 0;
+      }
+    default:
+      NOTREACHED();
+      return 0;
+  }
+}
+
 double CSSUnitValue::ConvertAngle(CSSPrimitiveValue::UnitType unit) const {
   switch (unit_) {
     case CSSPrimitiveValue::UnitType::kDegrees:
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSUnitValue.h b/third_party/WebKit/Source/core/css/cssom/CSSUnitValue.h
index 4187bd174..ee35aea 100644
--- a/third_party/WebKit/Source/core/css/cssom/CSSUnitValue.h
+++ b/third_party/WebKit/Source/core/css/cssom/CSSUnitValue.h
@@ -52,6 +52,7 @@
   CSSUnitValue(double value, CSSPrimitiveValue::UnitType unit)
       : CSSNumericValue(), value_(value), unit_(unit) {}
 
+  double ConvertFixedLength(CSSPrimitiveValue::UnitType) const;
   double ConvertAngle(CSSPrimitiveValue::UnitType) const;
 
   double value_;
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
index f968a92..17ed878 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
@@ -1186,91 +1186,26 @@
                                            column_count);
 }
 
-static void CountKeywordOnlyPropertyUsage(CSSPropertyID property,
-                                          const CSSParserContext* context,
-                                          CSSValueID value_id) {
-  if (!context->IsUseCounterRecordingEnabled())
-    return;
-  switch (property) {
-    case CSSPropertyWebkitAppearance: {
-      WebFeature feature;
-      if (value_id == CSSValueNone) {
-        feature = WebFeature::kCSSValueAppearanceNone;
-      } else {
-        feature = WebFeature::kCSSValueAppearanceNotNone;
-        if (value_id == CSSValueButton)
-          feature = WebFeature::kCSSValueAppearanceButton;
-        else if (value_id == CSSValueCaret)
-          feature = WebFeature::kCSSValueAppearanceCaret;
-        else if (value_id == CSSValueCheckbox)
-          feature = WebFeature::kCSSValueAppearanceCheckbox;
-        else if (value_id == CSSValueMenulist)
-          feature = WebFeature::kCSSValueAppearanceMenulist;
-        else if (value_id == CSSValueMenulistButton)
-          feature = WebFeature::kCSSValueAppearanceMenulistButton;
-        else if (value_id == CSSValueListbox)
-          feature = WebFeature::kCSSValueAppearanceListbox;
-        else if (value_id == CSSValueRadio)
-          feature = WebFeature::kCSSValueAppearanceRadio;
-        else if (value_id == CSSValueSearchfield)
-          feature = WebFeature::kCSSValueAppearanceSearchField;
-        else if (value_id == CSSValueTextfield)
-          feature = WebFeature::kCSSValueAppearanceTextField;
-        else
-          feature = WebFeature::kCSSValueAppearanceOthers;
-      }
-      context->Count(feature);
-      break;
-    }
-
-    case CSSPropertyWebkitUserModify: {
-      switch (value_id) {
-        case CSSValueReadOnly:
-          context->Count(WebFeature::kCSSValueUserModifyReadOnly);
-          break;
-        case CSSValueReadWrite:
-          context->Count(WebFeature::kCSSValueUserModifyReadWrite);
-          break;
-        case CSSValueReadWritePlaintextOnly:
-          context->Count(WebFeature::kCSSValueUserModifyReadWritePlaintextOnly);
-          break;
-        default:
-          NOTREACHED();
-      }
-      break;
-    }
-
-    default:
-      break;
-  }
-}
 
 const CSSValue* CSSPropertyParser::ParseSingleValue(
     CSSPropertyID unresolved_property,
     CSSPropertyID current_shorthand) {
   DCHECK(context_);
-  CSSPropertyID property = resolveCSSPropertyID(unresolved_property);
-  if (CSSParserFastPaths::IsKeywordPropertyID(property)) {
-    if (!CSSParserFastPaths::IsValidKeywordPropertyAndValue(
-            property, range_.Peek().Id(), context_->Mode()))
-      return nullptr;
-    CountKeywordOnlyPropertyUsage(property, context_, range_.Peek().Id());
-    return ConsumeIdent(range_);
-  }
 
   // Gets the parsing method for our current property from the property API.
   // If it has been implemented, we call this method, otherwise we manually
   // parse this value in the switch statement below. As we implement APIs for
   // other properties, those properties will be taken out of the switch
   // statement.
-  const CSSPropertyDescriptor& css_property_desc =
-      CSSPropertyDescriptor::Get(property);
-  if (css_property_desc.parseSingleValue) {
-    return css_property_desc.parseSingleValue(
-        range_, *context_,
-        CSSParserLocalContext(isPropertyAlias(unresolved_property)));
-  }
+  bool needs_legacy_parsing = false;
+  const CSSValue* const parsed_value =
+      CSSPropertyParserHelpers::ParseLonghandViaAPI(
+          unresolved_property, current_shorthand, *context_, range_,
+          needs_legacy_parsing);
+  if (!needs_legacy_parsing)
+    return parsed_value;
 
+  CSSPropertyID property = resolveCSSPropertyID(unresolved_property);
   switch (property) {
     case CSSPropertyMaxWidth:
     case CSSPropertyMaxHeight:
@@ -1308,7 +1243,6 @@
     case CSSPropertyGridRowGap:
       return ConsumeLengthOrPercent(range_, context_->Mode(),
                                     kValueRangeNonNegative);
-    case CSSPropertyColor:
     case CSSPropertyBorderBottomColor:
     case CSSPropertyBorderLeftColor:
     case CSSPropertyBorderRightColor:
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp
index 24e8241..00fc88d 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp
@@ -18,7 +18,9 @@
 #include "core/css/CSSVariableData.h"
 #include "core/css/StyleColor.h"
 #include "core/css/parser/CSSParserContext.h"
+#include "core/css/parser/CSSParserFastPaths.h"
 #include "core/css/parser/CSSParserLocalContext.h"
+#include "core/css/properties/CSSPropertyDescriptor.h"
 #include "core/css/properties/CSSPropertyTransformUtils.h"
 #include "core/frame/UseCounter.h"
 #include "platform/RuntimeEnabledFeatures.h"
@@ -1493,6 +1495,144 @@
       range, context, CSSParserLocalContext());
 }
 
+void CountKeywordOnlyPropertyUsage(CSSPropertyID property,
+                                   const CSSParserContext& context,
+                                   CSSValueID value_id) {
+  if (!context.IsUseCounterRecordingEnabled())
+    return;
+  switch (property) {
+    case CSSPropertyWebkitAppearance: {
+      WebFeature feature;
+      if (value_id == CSSValueNone) {
+        feature = WebFeature::kCSSValueAppearanceNone;
+      } else {
+        feature = WebFeature::kCSSValueAppearanceNotNone;
+        if (value_id == CSSValueButton)
+          feature = WebFeature::kCSSValueAppearanceButton;
+        else if (value_id == CSSValueCaret)
+          feature = WebFeature::kCSSValueAppearanceCaret;
+        else if (value_id == CSSValueCheckbox)
+          feature = WebFeature::kCSSValueAppearanceCheckbox;
+        else if (value_id == CSSValueMenulist)
+          feature = WebFeature::kCSSValueAppearanceMenulist;
+        else if (value_id == CSSValueMenulistButton)
+          feature = WebFeature::kCSSValueAppearanceMenulistButton;
+        else if (value_id == CSSValueListbox)
+          feature = WebFeature::kCSSValueAppearanceListbox;
+        else if (value_id == CSSValueRadio)
+          feature = WebFeature::kCSSValueAppearanceRadio;
+        else if (value_id == CSSValueSearchfield)
+          feature = WebFeature::kCSSValueAppearanceSearchField;
+        else if (value_id == CSSValueTextfield)
+          feature = WebFeature::kCSSValueAppearanceTextField;
+        else
+          feature = WebFeature::kCSSValueAppearanceOthers;
+      }
+      context.Count(feature);
+      break;
+    }
+
+    case CSSPropertyWebkitUserModify: {
+      switch (value_id) {
+        case CSSValueReadOnly:
+          context.Count(WebFeature::kCSSValueUserModifyReadOnly);
+          break;
+        case CSSValueReadWrite:
+          context.Count(WebFeature::kCSSValueUserModifyReadWrite);
+          break;
+        case CSSValueReadWritePlaintextOnly:
+          context.Count(WebFeature::kCSSValueUserModifyReadWritePlaintextOnly);
+          break;
+        default:
+          NOTREACHED();
+      }
+      break;
+    }
+
+    default:
+      break;
+  }
+}
+
+const CSSValue* ParseLonghandViaAPI(CSSPropertyID unresolved_property,
+                                    CSSPropertyID current_shorthand,
+                                    const CSSParserContext& context,
+                                    CSSParserTokenRange& range,
+                                    bool& needs_legacy_parsing) {
+  DCHECK(!isShorthandProperty(unresolved_property));
+  needs_legacy_parsing = false;
+  CSSPropertyID property = resolveCSSPropertyID(unresolved_property);
+  if (CSSParserFastPaths::IsKeywordPropertyID(property)) {
+    if (!CSSParserFastPaths::IsValidKeywordPropertyAndValue(
+            property, range.Peek().Id(), context.Mode()))
+      return nullptr;
+    CountKeywordOnlyPropertyUsage(property, context, range.Peek().Id());
+    return ConsumeIdent(range);
+  }
+
+  const CSSPropertyDescriptor& css_property_desc =
+      CSSPropertyDescriptor::Get(property);
+  if (css_property_desc.parseSingleValue) {
+    return css_property_desc.parseSingleValue(
+        range, context,
+        CSSParserLocalContext(isPropertyAlias(unresolved_property)));
+  }
+  needs_legacy_parsing = true;
+  return nullptr;
+}
+
+bool ConsumeShorthandVia4LonghandsAPI(
+    const StylePropertyShorthand& shorthand,
+    bool important,
+    const CSSParserContext& context,
+    CSSParserTokenRange& range,
+    HeapVector<CSSProperty, 256>& properties) {
+  DCHECK_EQ(shorthand.length(), 4u);
+  const CSSPropertyID* longhands = shorthand.properties();
+  bool needs_legacy_parsing = false;
+  const CSSValue* top = ParseLonghandViaAPI(
+      longhands[0], shorthand.id(), context, range, needs_legacy_parsing);
+  DCHECK(!needs_legacy_parsing);
+
+  if (!top)
+    return false;
+
+  const CSSValue* right = ParseLonghandViaAPI(
+      longhands[1], shorthand.id(), context, range, needs_legacy_parsing);
+  DCHECK(!needs_legacy_parsing);
+
+  const CSSValue* bottom = nullptr;
+  const CSSValue* left = nullptr;
+  if (right) {
+    bottom = ParseLonghandViaAPI(longhands[2], shorthand.id(), context, range,
+                                 needs_legacy_parsing);
+    DCHECK(!needs_legacy_parsing);
+    if (bottom) {
+      left = ParseLonghandViaAPI(longhands[3], shorthand.id(), context, range,
+                                 needs_legacy_parsing);
+      DCHECK(!needs_legacy_parsing);
+    }
+  }
+
+  if (!right)
+    right = top;
+  if (!bottom)
+    bottom = top;
+  if (!left)
+    left = right;
+
+  AddProperty(longhands[0], shorthand.id(), *top, important,
+              IsImplicitProperty::kNotImplicit, properties);
+  AddProperty(longhands[1], shorthand.id(), *right, important,
+              IsImplicitProperty::kNotImplicit, properties);
+  AddProperty(longhands[2], shorthand.id(), *bottom, important,
+              IsImplicitProperty::kNotImplicit, properties);
+  AddProperty(longhands[3], shorthand.id(), *left, important,
+              IsImplicitProperty::kNotImplicit, properties);
+
+  return range.AtEnd();
+}
+
 }  // namespace CSSPropertyParserHelpers
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.h b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.h
index ef4e81bc..a2b6a6a 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.h
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.h
@@ -23,6 +23,7 @@
 class CSSStringValue;
 class CSSURIValue;
 class CSSValuePair;
+class StylePropertyShorthand;
 
 // When these functions are successful, they will consume all the relevant
 // tokens from the range and also consume any whitespace which follows. When
@@ -120,6 +121,22 @@
                  IsImplicitProperty,
                  HeapVector<CSSProperty, 256>& properties);
 
+void CountKeywordOnlyPropertyUsage(CSSPropertyID,
+                                   const CSSParserContext&,
+                                   CSSValueID);
+
+const CSSValue* ParseLonghandViaAPI(CSSPropertyID unresolved_property,
+                                    CSSPropertyID current_shorthand,
+                                    const CSSParserContext&,
+                                    CSSParserTokenRange&,
+                                    bool& needs_legacy_parsing);
+
+bool ConsumeShorthandVia4LonghandsAPI(const StylePropertyShorthand&,
+                                      bool important,
+                                      const CSSParserContext&,
+                                      CSSParserTokenRange&,
+                                      HeapVector<CSSProperty, 256>& properties);
+
 // Template implementations are at the bottom of the file for readability.
 
 template <typename... emptyBaseCase>
diff --git a/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIBackgroundColor.cpp b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIBackgroundColor.cpp
deleted file mode 100644
index 6254c51..0000000
--- a/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIBackgroundColor.cpp
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "core/css/properties/CSSPropertyAPIBackgroundColor.h"
-
-#include "core/css/parser/CSSParserContext.h"
-#include "core/css/parser/CSSParserMode.h"
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-
-namespace blink {
-
-const CSSValue* CSSPropertyAPIBackgroundColor::parseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) {
-  return CSSPropertyParserHelpers::ConsumeColor(
-      range, context.Mode(), IsQuirksModeBehavior(context.Mode()));
-}
-
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIColor.cpp b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIColor.cpp
index f4e299cf..a234938b 100644
--- a/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIColor.cpp
+++ b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIColor.cpp
@@ -5,16 +5,17 @@
 #include "core/css/properties/CSSPropertyAPIColor.h"
 
 #include "core/css/parser/CSSParserContext.h"
+#include "core/css/parser/CSSParserMode.h"
 #include "core/css/parser/CSSPropertyParserHelpers.h"
 
-class CSSParserLocalContext;
 namespace blink {
 
 const CSSValue* CSSPropertyAPIColor::parseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext& context,
     const CSSParserLocalContext&) {
-  return CSSPropertyParserHelpers::ConsumeColor(range, context.Mode());
+  return CSSPropertyParserHelpers::ConsumeColor(
+      range, context.Mode(), IsQuirksModeBehavior(context.Mode()));
 }
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIColorNoQuirks.cpp b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIColorNoQuirks.cpp
new file mode 100644
index 0000000..42662bc
--- /dev/null
+++ b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIColorNoQuirks.cpp
@@ -0,0 +1,20 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/css/properties/CSSPropertyAPIColorNoQuirks.h"
+
+#include "core/css/parser/CSSParserContext.h"
+#include "core/css/parser/CSSPropertyParserHelpers.h"
+
+class CSSParserLocalContext;
+namespace blink {
+
+const CSSValue* CSSPropertyAPIColorNoQuirks::parseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) {
+  return CSSPropertyParserHelpers::ConsumeColor(range, context.Mode());
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/dom/ClassicPendingScript.cpp b/third_party/WebKit/Source/core/dom/ClassicPendingScript.cpp
index 39ebbfa..34a8c234 100644
--- a/third_party/WebKit/Source/core/dom/ClassicPendingScript.cpp
+++ b/third_party/WebKit/Source/core/dom/ClassicPendingScript.cpp
@@ -210,6 +210,8 @@
 }
 
 bool ClassicPendingScript::WasCanceled() const {
+  if (!GetResource())
+    return false;
   return GetResource()->WasCanceled();
 }
 
diff --git a/third_party/WebKit/Source/core/dom/Document.cpp b/third_party/WebKit/Source/core/dom/Document.cpp
index 24d6081..8295d60 100644
--- a/third_party/WebKit/Source/core/dom/Document.cpp
+++ b/third_party/WebKit/Source/core/dom/Document.cpp
@@ -254,12 +254,12 @@
 #include "platform/wtf/text/CharacterNames.h"
 #include "platform/wtf/text/StringBuffer.h"
 #include "platform/wtf/text/TextEncodingRegistry.h"
-#include "public/platform/InterfaceProvider.h"
 #include "public/platform/Platform.h"
 #include "public/platform/WebAddressSpace.h"
 #include "public/platform/WebPrerenderingSupport.h"
 #include "public/platform/modules/sensitive_input_visibility/sensitive_input_visibility_service.mojom-blink.h"
 #include "public/platform/site_engagement.mojom-blink.h"
+#include "services/service_manager/public/cpp/interface_provider.h"
 
 #include <memory>
 
@@ -4718,7 +4718,7 @@
     return;
 
   mojom::blink::SensitiveInputVisibilityServicePtr sensitive_input_service_ptr;
-  GetFrame()->GetInterfaceProvider()->GetInterface(
+  GetFrame()->GetInterfaceProvider().GetInterface(
       mojo::MakeRequest(&sensitive_input_service_ptr));
   if (password_count_ > 0) {
     sensitive_input_service_ptr->PasswordFieldVisibleInInsecureContext();
diff --git a/third_party/WebKit/Source/core/dom/ElementVisibilityObserverTest.cpp b/third_party/WebKit/Source/core/dom/ElementVisibilityObserverTest.cpp
index 4abca33..8785685 100644
--- a/third_party/WebKit/Source/core/dom/ElementVisibilityObserverTest.cpp
+++ b/third_party/WebKit/Source/core/dom/ElementVisibilityObserverTest.cpp
@@ -41,8 +41,8 @@
  protected:
   void SetUp() override {
     local_frame_client_ = new StubLocalFrameClient();
-    dummy_page_holder_ = DummyPageHolder::Create(
-        IntSize(), nullptr, local_frame_client_, nullptr, nullptr);
+    dummy_page_holder_ = DummyPageHolder::Create(IntSize(), nullptr,
+                                                 local_frame_client_, nullptr);
   }
 
   void TearDown() override {
diff --git a/third_party/WebKit/Source/core/dom/README.md b/third_party/WebKit/Source/core/dom/README.md
index a9b8175..b627458 100644
--- a/third_party/WebKit/Source/core/dom/README.md
+++ b/third_party/WebKit/Source/core/dom/README.md
@@ -136,7 +136,7 @@
 - PseudoElementData
 - VisitedLinkState (HTMLLinkElement)
 
-## fullscreen (-> core/fullscreen or core/html)
+## [Fullscreen](https://fullscreen.spec.whatwg.org/) (-> core/fullscreen)
 
 - DocumentFullscreen
 - ElementFullscreen
diff --git a/third_party/WebKit/Source/core/dom/ScriptLoader.cpp b/third_party/WebKit/Source/core/dom/ScriptLoader.cpp
index b947258..82d5fa7d 100644
--- a/third_party/WebKit/Source/core/dom/ScriptLoader.cpp
+++ b/third_party/WebKit/Source/core/dom/ScriptLoader.cpp
@@ -676,22 +676,8 @@
                         ? element_document.Url()
                         : KURL();
 
-  switch (ExecuteScript(ClassicScript::Create(
-      ScriptSourceCode(element_->TextFromChildren(), script_url, position)))) {
-    case ExecuteScriptResult::kShouldFireLoadEvent:
-      // The load event is not fired because this is an inline script.
-      return true;
-
-    case ExecuteScriptResult::kShouldFireErrorEvent:
-      DispatchErrorEvent();
-      return false;
-
-    case ExecuteScriptResult::kShouldFireNone:
-      return true;
-  }
-
-  NOTREACHED();
-  return false;
+  return ExecuteScriptBlock(ClassicPendingScript::Create(element_, position),
+                            script_url);
 }
 
 bool ScriptLoader::FetchClassicScript(
@@ -910,31 +896,58 @@
   DCHECK(!will_be_parser_executed_);
   DCHECK(async_exec_type_ != ScriptRunner::kNone);
   DCHECK(pending_script_->IsExternalOrModule());
-  DCHECK_EQ(pending_script_->IsExternal(), is_external_script_);
-  bool error_occurred = false;
-  Script* script = pending_script_->GetSource(NullURL(), error_occurred);
-  const bool wasCanceled = pending_script_->WasCanceled();
-  const bool is_external = pending_script_->IsExternal();
-  DetachPendingScript();
-  if (error_occurred) {
-    DispatchErrorEvent();
-  } else if (!wasCanceled) {
-    switch (ExecuteScript(script)) {
-      case ExecuteScriptResult::kShouldFireLoadEvent:
-        if (is_external)
-          DispatchLoadEvent();
-        break;
-      case ExecuteScriptResult::kShouldFireErrorEvent:
-        DispatchErrorEvent();
-        break;
-      case ExecuteScriptResult::kShouldFireNone:
-        break;
-    }
-  }
+  PendingScript* pending_script = pending_script_;
+  pending_script_ = nullptr;
+  ExecuteScriptBlock(pending_script, NullURL());
   resource_ = nullptr;
   module_tree_client_ = nullptr;
 }
 
+// https://html.spec.whatwg.org/#execute-the-script-block
+bool ScriptLoader::ExecuteScriptBlock(PendingScript* pending_script,
+                                      const KURL& document_url) {
+  DCHECK(pending_script);
+  DCHECK_EQ(pending_script->IsExternal(), is_external_script_);
+
+  bool error_occurred = false;
+  Script* script = pending_script->GetSource(document_url, error_occurred);
+  const bool was_canceled = pending_script->WasCanceled();
+  const bool is_external = pending_script->IsExternal();
+  pending_script->Dispose();
+
+  // 2. "If the script's script is null, fire an event named error at the
+  //     element, and abort these steps."
+  if (error_occurred) {
+    DispatchErrorEvent();
+    return false;
+  }
+
+  if (was_canceled)
+    return false;
+
+  // Steps 3--7 are in ExecuteScript().
+  switch (ExecuteScript(script)) {
+    case ExecuteScriptResult::kShouldFireLoadEvent:
+      // 8. "If the script is from an external file, then fire an event named
+      //     load at the script element."
+      if (is_external)
+        DispatchLoadEvent();
+      return true;
+
+    case ExecuteScriptResult::kShouldFireErrorEvent:
+      // Consider as if "the script's script is null" retrospectively,
+      // due to CSP check failures etc., which are considered as load failure.
+      DispatchErrorEvent();
+      return false;
+
+    case ExecuteScriptResult::kShouldFireNone:
+      return true;
+  }
+
+  NOTREACHED();
+  return false;
+}
+
 void ScriptLoader::PendingScriptFinished(PendingScript* pending_script) {
   DCHECK(!will_be_parser_executed_);
   DCHECK_EQ(pending_script_, pending_script);
diff --git a/third_party/WebKit/Source/core/dom/ScriptLoader.h b/third_party/WebKit/Source/core/dom/ScriptLoader.h
index a3171bc..678a63f 100644
--- a/third_party/WebKit/Source/core/dom/ScriptLoader.h
+++ b/third_party/WebKit/Source/core/dom/ScriptLoader.h
@@ -81,6 +81,16 @@
                          TextPosition::MinimumPosition(),
                      LegacyTypeSupport = kDisallowLegacyTypeInTypeAttribute);
 
+  // https://html.spec.whatwg.org/#execute-the-script-block
+  // The single entry point of script execution.
+  // PendingScript::Dispose() is called in ExecuteScriptBlock().
+  //
+  // TODO(hiroshige): Replace ExecuteScript() calls with ExecuteScriptBlock().
+  //
+  // TODO(hiroshige): Currently this returns bool (true if success) only to
+  // preserve existing code structure around PrepareScript(). Clean up this.
+  bool ExecuteScriptBlock(PendingScript*, const KURL&);
+
   // Creates a PendingScript for external script whose fetch is started in
   // FetchClassicScript()/FetchModuleScriptTree().
   PendingScript* CreatePendingScript();
@@ -91,6 +101,8 @@
     kShouldFireNone
   };
   WARN_UNUSED_RESULT ExecuteScriptResult ExecuteScript(const Script*);
+
+  // The entry point only for ScriptRunner that wraps ExecuteScriptBlock().
   virtual void Execute();
 
   // XML parser calls these
diff --git a/third_party/WebKit/Source/core/editing/FrameSelection.cpp b/third_party/WebKit/Source/core/editing/FrameSelection.cpp
index a80dfd1..be6bbd7 100644
--- a/third_party/WebKit/Source/core/editing/FrameSelection.cpp
+++ b/third_party/WebKit/Source/core/editing/FrameSelection.cpp
@@ -947,10 +947,23 @@
   return LayoutRect(layout_selection_->SelectionBounds());
 }
 
-static IntRect AbsoluteSelectionBoundsOf(
-    const VisibleSelectionInFlatTree& selection) {
-  return ComputeTextRect(
-      EphemeralRangeInFlatTree(selection.Start(), selection.End()));
+IntRect FrameSelection::ComputeRectToScroll(
+    RevealExtentOption reveal_extent_option) {
+  const VisibleSelection& selection = ComputeVisibleSelectionInDOMTree();
+  LayoutRect rect;
+  switch (selection.GetSelectionType()) {
+    case kCaretSelection:
+      return AbsoluteCaretBounds();
+    case kRangeSelection: {
+      if (reveal_extent_option == kRevealExtent)
+        return AbsoluteCaretBoundsOf(CreateVisiblePosition(selection.Extent()));
+      layout_selection_->SetHasPendingSelection();
+      return layout_selection_->SelectionBounds();
+    }
+    default:
+      NOTREACHED();
+      return {};
+  }
 }
 
 // TODO(editing-dev): This should be done in FlatTree world.
@@ -967,23 +980,6 @@
   if (selection.GetSelectionType() == kNoSelection)
     return;
 
-  LayoutRect rect;
-  switch (selection.GetSelectionType()) {
-    case kCaretSelection:
-      rect = LayoutRect(AbsoluteCaretBounds());
-      break;
-    case kRangeSelection: {
-      rect = LayoutRect(
-          reveal_extent_option == kRevealExtent
-              ? AbsoluteCaretBoundsOf(CreateVisiblePosition(selection.Extent()))
-              : AbsoluteSelectionBoundsOf(ComputeVisibleSelectionInFlatTree()));
-      break;
-    }
-    default:
-      NOTREACHED();
-      break;
-  }
-
   // FIXME: This code only handles scrolling the startContainer's layer, but
   // the selection rect could intersect more than just that.
   if (DocumentLoader* document_loader = frame_->Loader().GetDocumentLoader())
@@ -992,7 +988,8 @@
   DCHECK(start.AnchorNode());
   DCHECK(start.AnchorNode()->GetLayoutObject());
   if (!start.AnchorNode()->GetLayoutObject()->ScrollRectToVisible(
-          rect, alignment, alignment))
+          LayoutRect(ComputeRectToScroll(reveal_extent_option)), alignment,
+          alignment))
     return;
 
   UpdateAppearance();
diff --git a/third_party/WebKit/Source/core/editing/FrameSelection.h b/third_party/WebKit/Source/core/editing/FrameSelection.h
index cccc742e..2dcf720 100644
--- a/third_party/WebKit/Source/core/editing/FrameSelection.h
+++ b/third_party/WebKit/Source/core/editing/FrameSelection.h
@@ -280,6 +280,8 @@
 
   GranularityStrategy* GetGranularityStrategy();
 
+  IntRect ComputeRectToScroll(RevealExtentOption);
+
   // Implementation of |SynchronousMutationObserver| member functions.
   void ContextDestroyed(Document*) final;
   void NodeChildrenWillBeRemoved(ContainerNode&) final;
diff --git a/third_party/WebKit/Source/core/editing/LayoutSelection.cpp b/third_party/WebKit/Source/core/editing/LayoutSelection.cpp
index bde815039..7585134d 100644
--- a/third_party/WebKit/Source/core/editing/LayoutSelection.cpp
+++ b/third_party/WebKit/Source/core/editing/LayoutSelection.cpp
@@ -322,6 +322,8 @@
   DCHECK(start_layout_object);
   DCHECK(end_layout_object);
   DCHECK(start_layout_object->View() == end_layout_object->View());
+  if (!start_layout_object || !end_layout_object)
+    return SelectionPaintRange();
 
   return SelectionPaintRange(start_layout_object,
                              start_pos.ComputeEditingOffset(),
diff --git a/third_party/WebKit/Source/core/editing/SelectionModifier.cpp b/third_party/WebKit/Source/core/editing/SelectionModifier.cpp
index 36b7d35..dbb85e8 100644
--- a/third_party/WebKit/Source/core/editing/SelectionModifier.cpp
+++ b/third_party/WebKit/Source/core/editing/SelectionModifier.cpp
@@ -179,7 +179,7 @@
 }
 
 static VisiblePosition AdjustForwardPositionForUserSelectAll(
-    VisiblePosition& position) {
+    const VisiblePosition& position) {
   Node* const root_user_select_all = EditingStrategy::RootUserSelectAllForNode(
       position.DeepEquivalent().AnchorNode());
   if (!root_user_select_all)
@@ -189,7 +189,7 @@
 }
 
 static VisiblePosition AdjustBackwardPositionForUserSelectAll(
-    VisiblePosition& position) {
+    const VisiblePosition& position) {
   Node* const root_user_select_all = EditingStrategy::RootUserSelectAllForNode(
       position.DeepEquivalent().AnchorNode());
   if (!root_user_select_all)
@@ -258,12 +258,13 @@
       pos = NextSentencePosition(pos);
       break;
     case kLineGranularity:
-      pos = NextLinePosition(
-          pos, LineDirectionPointForBlockDirectionNavigation(EXTENT));
+      pos = NextLinePosition(pos, LineDirectionPointForBlockDirectionNavigation(
+                                      selection_.Extent()));
       break;
     case kParagraphGranularity:
       pos = NextParagraphPosition(
-          pos, LineDirectionPointForBlockDirectionNavigation(EXTENT));
+          pos,
+          LineDirectionPointForBlockDirectionNavigation(selection_.Extent()));
       break;
     case kSentenceBoundary:
       pos = EndOfSentence(EndForPlatform());
@@ -348,15 +349,17 @@
       // needs to leave the selection at that line start (no need to call
       // nextLinePosition!)
       pos = EndForPlatform();
-      if (!selection_.IsRange() || !IsStartOfLine(pos))
+      if (!selection_.IsRange() || !IsStartOfLine(pos)) {
         pos = NextLinePosition(
-            pos, LineDirectionPointForBlockDirectionNavigation(START));
+            pos,
+            LineDirectionPointForBlockDirectionNavigation(selection_.Start()));
+      }
       break;
     }
     case kParagraphGranularity:
       pos = NextParagraphPosition(
           EndForPlatform(),
-          LineDirectionPointForBlockDirectionNavigation(START));
+          LineDirectionPointForBlockDirectionNavigation(selection_.Start()));
       break;
     case kSentenceBoundary:
       pos = EndOfSentence(EndForPlatform());
@@ -443,11 +446,13 @@
       break;
     case kLineGranularity:
       pos = PreviousLinePosition(
-          pos, LineDirectionPointForBlockDirectionNavigation(EXTENT));
+          pos,
+          LineDirectionPointForBlockDirectionNavigation(selection_.Extent()));
       break;
     case kParagraphGranularity:
       pos = PreviousParagraphPosition(
-          pos, LineDirectionPointForBlockDirectionNavigation(EXTENT));
+          pos,
+          LineDirectionPointForBlockDirectionNavigation(selection_.Extent()));
       break;
     case kSentenceBoundary:
       pos = StartOfSentence(StartForPlatform());
@@ -529,12 +534,12 @@
     case kLineGranularity:
       pos = PreviousLinePosition(
           StartForPlatform(),
-          LineDirectionPointForBlockDirectionNavigation(START));
+          LineDirectionPointForBlockDirectionNavigation(selection_.Start()));
       break;
     case kParagraphGranularity:
       pos = PreviousParagraphPosition(
           StartForPlatform(),
-          LineDirectionPointForBlockDirectionNavigation(START));
+          LineDirectionPointForBlockDirectionNavigation(selection_.Start()));
       break;
     case kSentenceBoundary:
       pos = StartOfSentence(StartForPlatform());
@@ -617,7 +622,8 @@
   // Note: the START position type is arbitrary because it is unused, it would
   // be the requested position type if there were no
   // xPosForVerticalArrowNavigation set.
-  LayoutUnit x = LineDirectionPointForBlockDirectionNavigation(START);
+  LayoutUnit x =
+      LineDirectionPointForBlockDirectionNavigation(selection_.Start());
 
   switch (alter) {
     case FrameSelection::kAlterationMove:
@@ -737,11 +743,13 @@
                                       : selection_.End(),
                                   selection_.Affinity());
       x_pos = LineDirectionPointForBlockDirectionNavigation(
-          direction == FrameSelection::kDirectionUp ? START : END);
+          direction == FrameSelection::kDirectionUp ? selection_.Start()
+                                                    : selection_.End());
       break;
     case FrameSelection::kAlterationExtend:
       pos = CreateVisiblePosition(selection_.Extent(), selection_.Affinity());
-      x_pos = LineDirectionPointForBlockDirectionNavigation(EXTENT);
+      x_pos =
+          LineDirectionPointForBlockDirectionNavigation(selection_.Extent());
       break;
   }
 
@@ -830,28 +838,12 @@
 }
 
 LayoutUnit SelectionModifier::LineDirectionPointForBlockDirectionNavigation(
-    EPositionType type) {
+    const Position& pos) {
   LayoutUnit x;
 
   if (selection_.IsNone())
     return x;
 
-  Position pos;
-  switch (type) {
-    case START:
-      pos = selection_.Start();
-      break;
-    case END:
-      pos = selection_.End();
-      break;
-    case BASE:
-      pos = selection_.Base();
-      break;
-    case EXTENT:
-      pos = selection_.Extent();
-      break;
-  }
-
   LocalFrame* frame = pos.GetDocument()->GetFrame();
   if (!frame)
     return x;
diff --git a/third_party/WebKit/Source/core/editing/SelectionModifier.h b/third_party/WebKit/Source/core/editing/SelectionModifier.h
index 50a0b1d..6d7b336 100644
--- a/third_party/WebKit/Source/core/editing/SelectionModifier.h
+++ b/third_party/WebKit/Source/core/editing/SelectionModifier.h
@@ -58,11 +58,6 @@
                                  VerticalDirection);
 
  private:
-  // TODO(yosin): We should move |EPositionType| to "SelectionModifier.cpp",
-  // it is only used for implementing |modify()|.
-  // TODO(yosin) We should use capitalized name for |EPositionType|.
-  enum EPositionType { START, END, BASE, EXTENT };  // NOLINT
-
   LocalFrame* GetFrame() const { return frame_; }
 
   static bool ShouldAlwaysUseDirectionalSelection(LocalFrame*);
@@ -71,7 +66,7 @@
   VisiblePosition PositionForPlatform(bool is_get_start) const;
   VisiblePosition StartForPlatform() const;
   VisiblePosition EndForPlatform() const;
-  LayoutUnit LineDirectionPointForBlockDirectionNavigation(EPositionType);
+  LayoutUnit LineDirectionPointForBlockDirectionNavigation(const Position&);
   VisiblePosition ModifyExtendingRight(TextGranularity);
   VisiblePosition ModifyExtendingForward(TextGranularity);
   VisiblePosition ModifyMovingRight(TextGranularity);
diff --git a/third_party/WebKit/Source/core/editing/VisibleSelection.cpp b/third_party/WebKit/Source/core/editing/VisibleSelection.cpp
index 1c71047e9..d7f32ba 100644
--- a/third_party/WebKit/Source/core/editing/VisibleSelection.cpp
+++ b/third_party/WebKit/Source/core/editing/VisibleSelection.cpp
@@ -478,19 +478,20 @@
   AdjustSelectionToAvoidCrossingEditingBoundaries();
   UpdateSelectionType();
 
-  if (GetSelectionType() == kRangeSelection) {
-    // "Constrain" the selection to be the smallest equivalent range of
-    // nodes. This is a somewhat arbitrary choice, but experience shows that
-    // it is useful to make to make the selection "canonical" (if only for
-    // purposes of comparing selections). This is an ideal point of the code
-    // to do this operation, since all selection changes that result in a
-    // RANGE come through here before anyone uses it.
-    // TODO(yosin) Canonicalizing is good, but haven't we already done it
-    // (when we set these two positions to |VisiblePosition|
-    // |deepEquivalent()|s above)?
-    start_ = MostForwardCaretPosition(start_);
-    end_ = MostBackwardCaretPosition(end_);
-  }
+  if (GetSelectionType() != kRangeSelection)
+    return;
+
+  // "Constrain" the selection to be the smallest equivalent range of
+  // nodes. This is a somewhat arbitrary choice, but experience shows that
+  // it is useful to make to make the selection "canonical" (if only for
+  // purposes of comparing selections). This is an ideal point of the code
+  // to do this operation, since all selection changes that result in a
+  // RANGE come through here before anyone uses it.
+  // TODO(yosin) Canonicalizing is good, but haven't we already done it
+  // (when we set these two positions to |VisiblePosition|
+  // |deepEquivalent()|s above)?
+  start_ = MostForwardCaretPosition(start_);
+  end_ = MostBackwardCaretPosition(end_);
 }
 
 template <typename Strategy>
diff --git a/third_party/WebKit/Source/core/editing/VisibleSelectionTest.cpp b/third_party/WebKit/Source/core/editing/VisibleSelectionTest.cpp
index c9e5b882..2132da9 100644
--- a/third_party/WebKit/Source/core/editing/VisibleSelectionTest.cpp
+++ b/third_party/WebKit/Source/core/editing/VisibleSelectionTest.cpp
@@ -219,6 +219,24 @@
   EXPECT_EQ(PositionInFlatTree(five, 5), selection_in_flat_tree.End());
 }
 
+// For http://wkb.ug/32622
+TEST_F(VisibleSelectionTest, ExpandUsingGranularityWithEmptyCell) {
+  SetBodyContent(
+      "<div contentEditable><table cellspacing=0><tr>"
+      "<td id='first' width='50' height='25pt'></td>"
+      "<td id='second' width='50' height='25pt'></td>"
+      "</tr></table></div>");
+  Element* const first = GetDocument().getElementById("first");
+  const VisibleSelectionInFlatTree& selection =
+      CreateVisibleSelectionWithGranularity(
+          SelectionInFlatTree::Builder()
+              .Collapse(PositionInFlatTree(first, 0))
+              .Build(),
+          kWordGranularity);
+  EXPECT_EQ(PositionInFlatTree(first, 0), selection.Start());
+  EXPECT_EQ(PositionInFlatTree(first, 0), selection.End());
+}
+
 TEST_F(VisibleSelectionTest, Initialisation) {
   SetBodyContent(LOREM_IPSUM);
 
diff --git a/third_party/WebKit/Source/core/editing/VisibleUnitsLine.cpp b/third_party/WebKit/Source/core/editing/VisibleUnitsLine.cpp
index 9ed1faa..0c90856 100644
--- a/third_party/WebKit/Source/core/editing/VisibleUnitsLine.cpp
+++ b/third_party/WebKit/Source/core/editing/VisibleUnitsLine.cpp
@@ -140,9 +140,10 @@
   return nullptr;
 }
 
-Node* PreviousLeafWithSameEditability(Node* node, EditableType editable_type) {
-  const bool editable = HasEditableStyle(*node, editable_type);
-  for (Node* runner = PreviousAtomicLeafNode(*node); runner;
+Node* PreviousLeafWithSameEditability(const Node& node,
+                                      EditableType editable_type) {
+  const bool editable = HasEditableStyle(node, editable_type);
+  for (Node* runner = PreviousAtomicLeafNode(node); runner;
        runner = PreviousAtomicLeafNode(*runner)) {
     if (editable == HasEditableStyle(*runner, editable_type))
       return runner;
@@ -270,12 +271,10 @@
 Node* FindNodeInPreviousLine(const Node& start_node,
                              const VisiblePosition& visible_position,
                              EditableType editable_type) {
-  // TODO(editing-dev): We should make |PreviousLeafWithSameEditability()| to
-  // take |const Node&|.
-  for (Node* runner = PreviousLeafWithSameEditability(
-           const_cast<Node*>(&start_node), editable_type);
+  for (Node* runner =
+           PreviousLeafWithSameEditability(start_node, editable_type);
        runner;
-       runner = PreviousLeafWithSameEditability(runner, editable_type)) {
+       runner = PreviousLeafWithSameEditability(*runner, editable_type)) {
     if (!InSameLine(*runner, visible_position))
       return runner;
   }
@@ -295,7 +294,7 @@
   Node* const previous_node =
       FindNodeInPreviousLine(*node, visible_position, editable_type);
   for (Node* runner = previous_node; runner && !runner->IsShadowRoot();
-       runner = PreviousLeafWithSameEditability(runner, editable_type)) {
+       runner = PreviousLeafWithSameEditability(*runner, editable_type)) {
     if (HighestEditableRootOfNode(*runner, editable_type) != highest_root)
       break;
 
diff --git a/third_party/WebKit/Source/core/events/EventTargetFactory.json5 b/third_party/WebKit/Source/core/events/EventTargetFactory.json5
index b9dcfb58..fe22a3cc 100644
--- a/third_party/WebKit/Source/core/events/EventTargetFactory.json5
+++ b/third_party/WebKit/Source/core/events/EventTargetFactory.json5
@@ -6,6 +6,7 @@
 
   data: [
     "core/animation/AnimationPlayer",
+    "core/clipboard/Clipboard",
     "core/css/FontFaceSet",
     "core/css/MediaQueryList",
     "core/dom/BroadcastChannel",
diff --git a/third_party/WebKit/Source/core/exported/WebDataSourceImpl.cpp b/third_party/WebKit/Source/core/exported/WebDataSourceImpl.cpp
index d2db829..0fee7de 100644
--- a/third_party/WebKit/Source/core/exported/WebDataSourceImpl.cpp
+++ b/third_party/WebKit/Source/core/exported/WebDataSourceImpl.cpp
@@ -32,6 +32,7 @@
 
 #include <memory>
 #include "core/dom/Document.h"
+#include "core/frame/LocalFrame.h"
 #include "core/loader/SubresourceFilter.h"
 #include "platform/wtf/PtrUtil.h"
 #include "public/platform/WebDocumentSubresourceFilter.h"
@@ -159,8 +160,8 @@
 
 void WebDataSourceImpl::SetSubresourceFilter(
     WebDocumentSubresourceFilter* subresource_filter) {
-  DocumentLoader::SetSubresourceFilter(
-      SubresourceFilter::Create(this, WTF::WrapUnique(subresource_filter)));
+  DocumentLoader::SetSubresourceFilter(SubresourceFilter::Create(
+      *GetFrame()->GetDocument(), WTF::WrapUnique(subresource_filter)));
 }
 
 void WebDataSourceImpl::SetServiceWorkerNetworkProvider(
diff --git a/third_party/WebKit/Source/core/exported/WebFactory.h b/third_party/WebKit/Source/core/exported/WebFactory.h
index 448bfa2..07e6208a 100644
--- a/third_party/WebKit/Source/core/exported/WebFactory.h
+++ b/third_party/WebKit/Source/core/exported/WebFactory.h
@@ -17,7 +17,6 @@
 class WebLocalFrameBase;
 class WebViewClient;
 class WebFrameClient;
-class InterfaceProvider;
 class InterfaceRegistry;
 class WebFrame;
 enum class WebTreeScopeType;
@@ -35,12 +34,10 @@
   virtual WebLocalFrameBase* CreateMainWebLocalFrameBase(
       WebView*,
       WebFrameClient*,
-      InterfaceProvider*,
       InterfaceRegistry*) const = 0;
   virtual WebLocalFrameBase* CreateWebLocalFrameBase(
       WebTreeScopeType,
       WebFrameClient*,
-      InterfaceProvider*,
       InterfaceRegistry*,
       WebFrame* opener) const = 0;
 
diff --git a/third_party/WebKit/Source/core/exported/WebRemoteFrameImpl.cpp b/third_party/WebKit/Source/core/exported/WebRemoteFrameImpl.cpp
index 6c10fbd..4cc9915 100644
--- a/third_party/WebKit/Source/core/exported/WebRemoteFrameImpl.cpp
+++ b/third_party/WebKit/Source/core/exported/WebRemoteFrameImpl.cpp
@@ -150,14 +150,13 @@
     const WebString& name,
     WebSandboxFlags sandbox_flags,
     WebFrameClient* client,
-    blink::InterfaceProvider* interface_provider,
     blink::InterfaceRegistry* interface_registry,
     WebFrame* previous_sibling,
     const WebParsedFeaturePolicy& container_policy,
     const WebFrameOwnerProperties& frame_owner_properties,
     WebFrame* opener) {
   WebLocalFrameBase* child = WebFactory::GetInstance().CreateWebLocalFrameBase(
-      scope, client, interface_provider, interface_registry, opener);
+      scope, client, interface_registry, opener);
   InsertAfter(child, previous_sibling);
   RemoteFrameOwner* owner =
       RemoteFrameOwner::Create(static_cast<SandboxFlags>(sandbox_flags),
diff --git a/third_party/WebKit/Source/core/exported/WebRemoteFrameImpl.h b/third_party/WebKit/Source/core/exported/WebRemoteFrameImpl.h
index a3b0466..dfda3013 100644
--- a/third_party/WebKit/Source/core/exported/WebRemoteFrameImpl.h
+++ b/third_party/WebKit/Source/core/exported/WebRemoteFrameImpl.h
@@ -47,7 +47,6 @@
                                   const WebString& name,
                                   WebSandboxFlags,
                                   WebFrameClient*,
-                                  blink::InterfaceProvider*,
                                   blink::InterfaceRegistry*,
                                   WebFrame* previous_sibling,
                                   const WebParsedFeaturePolicy&,
diff --git a/third_party/WebKit/Source/core/exported/WebSharedWorkerImpl.cpp b/third_party/WebKit/Source/core/exported/WebSharedWorkerImpl.cpp
index 066bca9..eaadbaa2 100644
--- a/third_party/WebKit/Source/core/exported/WebSharedWorkerImpl.cpp
+++ b/third_party/WebKit/Source/core/exported/WebSharedWorkerImpl.cpp
@@ -63,7 +63,6 @@
 #include "platform/weborigin/SecurityOrigin.h"
 #include "platform/wtf/Functional.h"
 #include "platform/wtf/PtrUtil.h"
-#include "public/platform/Platform.h"
 #include "public/platform/WebContentSettingsClient.h"
 #include "public/platform/WebMessagePortChannel.h"
 #include "public/platform/WebString.h"
@@ -140,7 +139,7 @@
   // Browser process when the worker is created (similar to
   // RenderThread::OnCreateNewView).
   main_frame_ = WebFactory::GetInstance().CreateMainWebLocalFrameBase(
-      web_view_, this, Platform::Current()->GetInterfaceProvider(), nullptr);
+      web_view_, this, nullptr);
   main_frame_->SetDevToolsAgentClient(this);
 
   // If we were asked to pause worker context on start and wait for debugger
diff --git a/third_party/WebKit/Source/core/frame/BUILD.gn b/third_party/WebKit/Source/core/frame/BUILD.gn
index 4c1d4d7b..71ba42e 100644
--- a/third_party/WebKit/Source/core/frame/BUILD.gn
+++ b/third_party/WebKit/Source/core/frame/BUILD.gn
@@ -68,6 +68,8 @@
     "Location.h",
     "Navigator.cpp",
     "Navigator.h",
+    "NavigatorClipboard.cpp",
+    "NavigatorClipboard.h",
     "NavigatorConcurrentHardware.cpp",
     "NavigatorConcurrentHardware.h",
     "NavigatorID.cpp",
diff --git a/third_party/WebKit/Source/core/frame/FrameTestHelpers.cpp b/third_party/WebKit/Source/core/frame/FrameTestHelpers.cpp
index c4f6b68..ca3c3783 100644
--- a/third_party/WebKit/Source/core/frame/FrameTestHelpers.cpp
+++ b/third_party/WebKit/Source/core/frame/FrameTestHelpers.cpp
@@ -151,8 +151,8 @@
                                     WebTreeScopeType scope,
                                     TestWebFrameClient* client) {
   auto owned_client = CreateDefaultClientIfNeeded(client);
-  WebLocalFrameBase* frame = ToWebLocalFrameBase(parent.CreateLocalChild(
-      scope, client, client->GetInterfaceProviderForTesting(), nullptr));
+  WebLocalFrameBase* frame =
+      ToWebLocalFrameBase(parent.CreateLocalChild(scope, client, nullptr));
   client->Bind(frame, std::move(owned_client));
   return frame;
 }
@@ -163,8 +163,8 @@
     std::unique_ptr<TestWebFrameClient> self_owned) {
   DCHECK(self_owned);
   TestWebFrameClient* client = self_owned.get();
-  WebLocalFrameBase* frame = ToWebLocalFrameBase(parent.CreateLocalChild(
-      scope, client, self_owned->GetInterfaceProviderForTesting(), nullptr));
+  WebLocalFrameBase* frame =
+      ToWebLocalFrameBase(parent.CreateLocalChild(scope, client, nullptr));
   client->Bind(frame, std::move(self_owned));
   return frame;
 }
@@ -174,8 +174,8 @@
   auto owned_client = CreateDefaultClientIfNeeded(client);
   WebLocalFrameBase* frame =
       ToWebLocalFrameBase(WebLocalFrame::CreateProvisional(
-          client, client->GetInterfaceProviderForTesting(), nullptr, &old_frame,
-          WebSandboxFlags::kNone, WebParsedFeaturePolicy()));
+          client, nullptr, &old_frame, WebSandboxFlags::kNone,
+          WebParsedFeaturePolicy()));
   client->Bind(frame, std::move(owned_client));
   // Create a local root, if necessary.
   std::unique_ptr<TestWebWidgetClient> owned_widget_client;
@@ -210,8 +210,8 @@
   auto owned_client = CreateDefaultClientIfNeeded(client);
   auto* frame = ToWebLocalFrameBase(parent.CreateLocalChild(
       WebTreeScopeType::kDocument, name, WebSandboxFlags::kNone, client,
-      client->GetInterfaceProviderForTesting(), nullptr, previous_sibling,
-      WebParsedFeaturePolicy(), properties, nullptr));
+      nullptr, previous_sibling, WebParsedFeaturePolicy(), properties,
+      nullptr));
   client->Bind(frame, std::move(owned_client));
 
   auto owned_widget_client = CreateDefaultClientIfNeeded(widget_client);
@@ -256,8 +256,7 @@
 
   auto owned_web_frame_client = CreateDefaultClientIfNeeded(web_frame_client);
   WebLocalFrame* frame = WebLocalFrame::CreateMainFrame(
-      web_view_, web_frame_client,
-      web_frame_client->GetInterfaceProviderForTesting(), nullptr, opener);
+      web_view_, web_frame_client, nullptr, opener);
   web_frame_client->Bind(frame, std::move(owned_web_frame_client));
 
   // TODO(dcheng): The main frame widget currently has a special case.
@@ -362,7 +361,8 @@
 
 int TestWebFrameClient::loads_in_progress_ = 0;
 
-TestWebFrameClient::TestWebFrameClient() {}
+TestWebFrameClient::TestWebFrameClient()
+    : interface_provider_(new service_manager::InterfaceProvider()) {}
 
 void TestWebFrameClient::Bind(WebLocalFrame* frame,
                               std::unique_ptr<TestWebFrameClient> self_owned) {
diff --git a/third_party/WebKit/Source/core/frame/FrameTestHelpers.h b/third_party/WebKit/Source/core/frame/FrameTestHelpers.h
index cfd52ced8..f9c1e9a 100644
--- a/third_party/WebKit/Source/core/frame/FrameTestHelpers.h
+++ b/third_party/WebKit/Source/core/frame/FrameTestHelpers.h
@@ -51,6 +51,7 @@
 #include "public/web/WebRemoteFrameClient.h"
 #include "public/web/WebSettings.h"
 #include "public/web/WebViewClient.h"
+#include "services/service_manager/public/cpp/interface_provider.h"
 
 namespace blink {
 
@@ -308,9 +309,8 @@
 
   static bool IsLoading() { return loads_in_progress_ > 0; }
 
-  // Tests can override the virtual method below to mock the interface provider.
-  virtual blink::InterfaceProvider* GetInterfaceProviderForTesting() {
-    return nullptr;
+  service_manager::InterfaceProvider* GetInterfaceProvider() override {
+    return interface_provider_.get();
   }
 
   std::unique_ptr<blink::WebURLLoader> CreateURLLoader(
@@ -326,6 +326,10 @@
   // If set to a non-null value, self-deletes on frame detach.
   std::unique_ptr<TestWebFrameClient> self_owned_;
 
+  // Use service_manager::InterfaceProvider::TestApi to provide test interfaces
+  // through this client.
+  std::unique_ptr<service_manager::InterfaceProvider> interface_provider_;
+
   // This is null from when the client is created until it is initialized with
   // Bind().
   WebLocalFrame* frame_ = nullptr;
diff --git a/third_party/WebKit/Source/core/frame/LocalFrame.cpp b/third_party/WebKit/Source/core/frame/LocalFrame.cpp
index 390f313..470ef9e 100644
--- a/third_party/WebKit/Source/core/frame/LocalFrame.cpp
+++ b/third_party/WebKit/Source/core/frame/LocalFrame.cpp
@@ -131,12 +131,9 @@
 LocalFrame* LocalFrame::Create(LocalFrameClient* client,
                                Page& page,
                                FrameOwner* owner,
-                               InterfaceProvider* interface_provider,
                                InterfaceRegistry* interface_registry) {
   LocalFrame* frame = new LocalFrame(
       client, page, owner,
-      interface_provider ? interface_provider
-                         : InterfaceProvider::GetEmptyInterfaceProvider(),
       interface_registry ? interface_registry
                          : InterfaceRegistry::GetEmptyInterfaceRegistry());
   probe::frameAttachedToParent(frame);
@@ -745,7 +742,6 @@
 inline LocalFrame::LocalFrame(LocalFrameClient* client,
                               Page& page,
                               FrameOwner* owner,
-                              InterfaceProvider* interface_provider,
                               InterfaceRegistry* interface_registry)
     : Frame(client, page, owner, LocalWindowProxyManager::Create(*this)),
       frame_scheduler_(page.GetChromeClient().CreateFrameScheduler(
@@ -765,11 +761,10 @@
       page_zoom_factor_(ParentPageZoomFactor(this)),
       text_zoom_factor_(ParentTextZoomFactor(this)),
       in_view_source_mode_(false),
-      interface_provider_(interface_provider),
       interface_registry_(interface_registry) {
   if (FrameResourceCoordinator::IsEnabled()) {
     frame_resource_coordinator_ =
-        FrameResourceCoordinator::Create(interface_provider);
+        FrameResourceCoordinator::Create(client->GetInterfaceProvider());
   }
   if (IsLocalRoot()) {
     probe_sink_ = new CoreProbeSink();
@@ -1001,6 +996,11 @@
   return false;
 }
 
+service_manager::InterfaceProvider& LocalFrame::GetInterfaceProvider() {
+  DCHECK(Client());
+  return *Client()->GetInterfaceProvider();
+}
+
 LocalFrameClient* LocalFrame::Client() const {
   return static_cast<LocalFrameClient*>(Frame::Client());
 }
diff --git a/third_party/WebKit/Source/core/frame/LocalFrame.h b/third_party/WebKit/Source/core/frame/LocalFrame.h
index 76a9adbf..7903d86 100644
--- a/third_party/WebKit/Source/core/frame/LocalFrame.h
+++ b/third_party/WebKit/Source/core/frame/LocalFrame.h
@@ -43,6 +43,10 @@
 #include "platform/scroll/ScrollTypes.h"
 #include "platform/wtf/HashSet.h"
 
+namespace service_manager {
+class InterfaceProvider;
+}
+
 namespace blink {
 
 class Color;
@@ -62,7 +66,6 @@
 class FrameSelection;
 class InputMethodController;
 class CoreProbeSink;
-class InterfaceProvider;
 class InterfaceRegistry;
 class IntPoint;
 class IntSize;
@@ -96,7 +99,6 @@
   static LocalFrame* Create(LocalFrameClient*,
                             Page&,
                             FrameOwner*,
-                            InterfaceProvider* = nullptr,
                             InterfaceRegistry* = nullptr);
 
   void Init();
@@ -225,12 +227,7 @@
 
   bool CanNavigate(const Frame&);
 
-  // This method is deprecated. Please use
-  // LocalFrameClient::GetInterfaceProvider() instead.
-  //
-  // TODO(crbug.com/726943): Remove this method.
-  InterfaceProvider* GetInterfaceProvider() { return interface_provider_; }
-
+  service_manager::InterfaceProvider& GetInterfaceProvider();
   InterfaceRegistry* GetInterfaceRegistry() { return interface_registry_; }
 
   LocalFrameClient* Client() const;
@@ -282,7 +279,6 @@
   LocalFrame(LocalFrameClient*,
              Page&,
              FrameOwner*,
-             InterfaceProvider*,
              InterfaceRegistry*);
 
   // Intentionally private to prevent redundant checks when the type is
@@ -326,7 +322,6 @@
   Member<CoreProbeSink> probe_sink_;
   Member<PerformanceMonitor> performance_monitor_;
 
-  InterfaceProvider* const interface_provider_;
   InterfaceRegistry* const interface_registry_;
 
   IntRect remote_viewport_intersection_;
diff --git a/third_party/WebKit/Source/core/frame/NavigatorClipboard.cpp b/third_party/WebKit/Source/core/frame/NavigatorClipboard.cpp
new file mode 100644
index 0000000..df12ca8
--- /dev/null
+++ b/third_party/WebKit/Source/core/frame/NavigatorClipboard.cpp
@@ -0,0 +1,42 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/frame/NavigatorClipboard.h"
+
+#include "core/clipboard/Clipboard.h"
+#include "core/dom/Document.h"
+#include "core/frame/LocalFrame.h"
+
+namespace blink {
+
+Clipboard* NavigatorClipboard::clipboard(ScriptState* script_state,
+                                         Navigator& navigator) {
+  NavigatorClipboard* supplement = static_cast<NavigatorClipboard*>(
+      Supplement<Navigator>::From(navigator, SupplementName()));
+  if (!supplement) {
+    supplement = new NavigatorClipboard(navigator);
+    ProvideTo(navigator, SupplementName(), supplement);
+  }
+
+  return supplement->clipboard_;
+}
+
+DEFINE_TRACE(NavigatorClipboard) {
+  visitor->Trace(clipboard_);
+  Supplement<Navigator>::Trace(visitor);
+}
+
+NavigatorClipboard::NavigatorClipboard(Navigator& navigator)
+    : Supplement<Navigator>(navigator) {
+  clipboard_ =
+      new Clipboard(GetSupplementable()->GetFrame()
+                        ? GetSupplementable()->GetFrame()->GetDocument()
+                        : nullptr);
+}
+
+const char* NavigatorClipboard::SupplementName() {
+  return "NavigatorClipboard";
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/frame/NavigatorClipboard.h b/third_party/WebKit/Source/core/frame/NavigatorClipboard.h
new file mode 100644
index 0000000..1d17ab4
--- /dev/null
+++ b/third_party/WebKit/Source/core/frame/NavigatorClipboard.h
@@ -0,0 +1,38 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef NavigatorClipboard_h
+#define NavigatorClipboard_h
+
+#include "core/CoreExport.h"
+#include "core/frame/Navigator.h"
+#include "platform/Supplementable.h"
+#include "platform/heap/Handle.h"
+#include "platform/wtf/Noncopyable.h"
+
+namespace blink {
+
+class Clipboard;
+class ScriptState;
+
+class NavigatorClipboard final : public GarbageCollected<NavigatorClipboard>,
+                                 public Supplement<Navigator> {
+  USING_GARBAGE_COLLECTED_MIXIN(NavigatorClipboard);
+  WTF_MAKE_NONCOPYABLE(NavigatorClipboard);
+
+ public:
+  static Clipboard* clipboard(ScriptState*, Navigator&);
+
+  DECLARE_TRACE();
+
+ private:
+  explicit NavigatorClipboard(Navigator&);
+  static const char* SupplementName();
+
+  Member<Clipboard> clipboard_;
+};
+
+}  // namespace blink
+
+#endif  // NavigatorClipboard.h
diff --git a/third_party/WebKit/Source/core/frame/NavigatorClipboard.idl b/third_party/WebKit/Source/core/frame/NavigatorClipboard.idl
new file mode 100644
index 0000000..a1ee432
--- /dev/null
+++ b/third_party/WebKit/Source/core/frame/NavigatorClipboard.idl
@@ -0,0 +1,11 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// https://w3c.github.io/clipboard-apis/#navigator-interface
+
+[RuntimeEnabled=AsyncClipboard]
+partial interface Navigator {
+  [CallWith=ScriptState, SecureContext, SameObject]
+  readonly attribute Clipboard clipboard;
+};
diff --git a/third_party/WebKit/Source/core/frame/PerformanceMonitor.cpp b/third_party/WebKit/Source/core/frame/PerformanceMonitor.cpp
index db90fa05..c7f566cc 100644
--- a/third_party/WebKit/Source/core/frame/PerformanceMonitor.cpp
+++ b/third_party/WebKit/Source/core/frame/PerformanceMonitor.cpp
@@ -226,8 +226,7 @@
   InnerReportGenericViolation(document, kBlockedParser, text, 0, nullptr);
 }
 
-void PerformanceMonitor::WillProcessTask(scheduler::TaskQueue*,
-                                         double start_time) {
+void PerformanceMonitor::WillProcessTask(double start_time) {
   // Reset m_taskExecutionContext. We don't clear this in didProcessTask
   // as it is needed in ReportTaskTime which occurs after didProcessTask.
   task_execution_context_ = nullptr;
@@ -243,9 +242,7 @@
   user_callback_ = nullptr;
 }
 
-void PerformanceMonitor::DidProcessTask(scheduler::TaskQueue*,
-                                        double start_time,
-                                        double end_time) {
+void PerformanceMonitor::DidProcessTask(double start_time, double end_time) {
   if (!enabled_)
     return;
   double layout_threshold = thresholds_[kLongLayout];
diff --git a/third_party/WebKit/Source/core/frame/PerformanceMonitor.h b/third_party/WebKit/Source/core/frame/PerformanceMonitor.h
index 7679eb1..62b7601f 100644
--- a/third_party/WebKit/Source/core/frame/PerformanceMonitor.h
+++ b/third_party/WebKit/Source/core/frame/PerformanceMonitor.h
@@ -116,10 +116,8 @@
                                    std::unique_ptr<SourceLocation>);
 
   // scheduler::TaskTimeObserver implementation
-  void WillProcessTask(scheduler::TaskQueue*, double start_time) override;
-  void DidProcessTask(scheduler::TaskQueue*,
-                      double start_time,
-                      double end_time) override;
+  void WillProcessTask(double start_time) override;
+  void DidProcessTask(double start_time, double end_time) override;
   void OnBeginNestedRunLoop() override {}
   void WillExecuteScript(ExecutionContext*);
   void DidExecuteScript();
diff --git a/third_party/WebKit/Source/core/frame/PerformanceMonitorTest.cpp b/third_party/WebKit/Source/core/frame/PerformanceMonitorTest.cpp
index 79303670..07b6f8f7 100644
--- a/third_party/WebKit/Source/core/frame/PerformanceMonitorTest.cpp
+++ b/third_party/WebKit/Source/core/frame/PerformanceMonitorTest.cpp
@@ -36,14 +36,12 @@
   }
 
   // scheduler::TaskTimeObserver implementation
-  void WillProcessTask(scheduler::TaskQueue* queue, double start_time) {
-    monitor_->WillProcessTask(queue, start_time);
+  void WillProcessTask(double start_time) {
+    monitor_->WillProcessTask(start_time);
   }
 
-  void DidProcessTask(scheduler::TaskQueue* queue,
-                      double start_time,
-                      double end_time) {
-    monitor_->DidProcessTask(queue, start_time, end_time);
+  void DidProcessTask(double start_time, double end_time) {
+    monitor_->DidProcessTask(start_time, end_time);
   }
 
   String FrameContextURL();
@@ -87,17 +85,17 @@
 }
 
 TEST_F(PerformanceMonitorTest, SingleScriptInTask) {
-  WillProcessTask(nullptr, 3719349.445172);
+  WillProcessTask(3719349.445172);
   EXPECT_EQ(0, NumUniqueFrameContextsSeen());
   WillExecuteScript(GetExecutionContext());
   EXPECT_EQ(1, NumUniqueFrameContextsSeen());
-  DidProcessTask(nullptr, 3719349.445172, 3719349.5561923);  // Long task
+  DidProcessTask(3719349.445172, 3719349.5561923);  // Long task
   EXPECT_EQ(1, NumUniqueFrameContextsSeen());
   EXPECT_EQ("https://example.com/foo", FrameContextURL());
 }
 
 TEST_F(PerformanceMonitorTest, MultipleScriptsInTask_SingleContext) {
-  WillProcessTask(nullptr, 3719349.445172);
+  WillProcessTask(3719349.445172);
   EXPECT_EQ(0, NumUniqueFrameContextsSeen());
   WillExecuteScript(GetExecutionContext());
   EXPECT_EQ(1, NumUniqueFrameContextsSeen());
@@ -105,13 +103,13 @@
 
   WillExecuteScript(GetExecutionContext());
   EXPECT_EQ(1, NumUniqueFrameContextsSeen());
-  DidProcessTask(nullptr, 3719349.445172, 3719349.5561923);  // Long task
+  DidProcessTask(3719349.445172, 3719349.5561923);  // Long task
   EXPECT_EQ(1, NumUniqueFrameContextsSeen());
   EXPECT_EQ("https://example.com/foo", FrameContextURL());
 }
 
 TEST_F(PerformanceMonitorTest, MultipleScriptsInTask_MultipleContexts) {
-  WillProcessTask(nullptr, 3719349.445172);
+  WillProcessTask(3719349.445172);
   EXPECT_EQ(0, NumUniqueFrameContextsSeen());
   WillExecuteScript(GetExecutionContext());
   EXPECT_EQ(1, NumUniqueFrameContextsSeen());
@@ -119,18 +117,18 @@
 
   WillExecuteScript(AnotherExecutionContext());
   EXPECT_EQ(2, NumUniqueFrameContextsSeen());
-  DidProcessTask(nullptr, 3719349.445172, 3719349.5561923);  // Long task
+  DidProcessTask(3719349.445172, 3719349.5561923);  // Long task
   EXPECT_EQ(2, NumUniqueFrameContextsSeen());
   EXPECT_EQ("", FrameContextURL());
 }
 
 TEST_F(PerformanceMonitorTest, NoScriptInLongTask) {
-  WillProcessTask(nullptr, 3719349.445172);
+  WillProcessTask(3719349.445172);
   WillExecuteScript(GetExecutionContext());
-  DidProcessTask(nullptr, 3719349.445172, 3719349.445182);
+  DidProcessTask(3719349.445172, 3719349.445182);
 
-  WillProcessTask(nullptr, 3719349.445172);
-  DidProcessTask(nullptr, 3719349.445172, 3719349.5561923);  // Long task
+  WillProcessTask(3719349.445172);
+  DidProcessTask(3719349.445172, 3719349.5561923);  // Long task
   // Without presence of Script, FrameContext URL is not available
   EXPECT_EQ(0, NumUniqueFrameContextsSeen());
 }
diff --git a/third_party/WebKit/Source/core/html/BUILD.gn b/third_party/WebKit/Source/core/html/BUILD.gn
index 5a97aad..97ea827 100644
--- a/third_party/WebKit/Source/core/html/BUILD.gn
+++ b/third_party/WebKit/Source/core/html/BUILD.gn
@@ -487,6 +487,10 @@
     "media/MediaError.h",
     "media/MediaFragmentURIParser.cpp",
     "media/MediaFragmentURIParser.h",
+    "media/MediaRemotingElements.cpp",
+    "media/MediaRemotingElements.h",
+    "media/MediaRemotingInterstitial.cpp",
+    "media/MediaRemotingInterstitial.h",
     "parser/AtomicHTMLToken.cpp",
     "parser/AtomicHTMLToken.h",
     "parser/BackgroundHTMLInputStream.cpp",
@@ -562,12 +566,6 @@
     "parser/XSSAuditorDelegate.h",
     "shadow/DetailsMarkerControl.cpp",
     "shadow/DetailsMarkerControl.h",
-    "shadow/MediaControlElementTypes.cpp",
-    "shadow/MediaControlElementTypes.h",
-    "shadow/MediaRemotingElements.cpp",
-    "shadow/MediaRemotingElements.h",
-    "shadow/MediaRemotingInterstitial.cpp",
-    "shadow/MediaRemotingInterstitial.h",
     "shadow/ProgressShadowElement.cpp",
     "shadow/ProgressShadowElement.h",
     "shadow/ShadowElementNames.cpp",
diff --git a/third_party/WebKit/Source/core/html/HTMLVideoElement.cpp b/third_party/WebKit/Source/core/html/HTMLVideoElement.cpp
index 6c28957..cb5bd7d 100644
--- a/third_party/WebKit/Source/core/html/HTMLVideoElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLVideoElement.cpp
@@ -38,8 +38,8 @@
 #include "core/frame/LocalDOMWindow.h"
 #include "core/frame/Settings.h"
 #include "core/html/media/MediaCustomControlsFullscreenDetector.h"
+#include "core/html/media/MediaRemotingInterstitial.h"
 #include "core/html/parser/HTMLParserIdioms.h"
-#include "core/html/shadow/MediaRemotingInterstitial.h"
 #include "core/imagebitmap/ImageBitmap.h"
 #include "core/imagebitmap/ImageBitmapOptions.h"
 #include "core/layout/LayoutImage.h"
diff --git a/third_party/WebKit/Source/core/html/forms/PasswordInputTypeTest.cpp b/third_party/WebKit/Source/core/html/forms/PasswordInputTypeTest.cpp
index 860b0b0..88d0348f 100644
--- a/third_party/WebKit/Source/core/html/forms/PasswordInputTypeTest.cpp
+++ b/third_party/WebKit/Source/core/html/forms/PasswordInputTypeTest.cpp
@@ -8,97 +8,76 @@
 #include "core/html/HTMLInputElement.h"
 #include "core/testing/DummyPageHolder.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
 #include "platform/testing/UnitTestHelpers.h"
-#include "public/platform/InterfaceProvider.h"
 #include "public/platform/modules/sensitive_input_visibility/sensitive_input_visibility_service.mojom-blink.h"
+#include "services/service_manager/public/cpp/interface_provider.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace blink {
 
-class MockInterfaceProvider : public blink::InterfaceProvider {
+class MockSensitiveInputVisibilityService
+    : public mojom::blink::SensitiveInputVisibilityService {
  public:
-  MockInterfaceProvider()
-      : mock_sensitive_input_visibility_service_(this),
-        password_field_visible_called_(false),
-        num_password_fields_invisible_calls_(0) {}
-
-  virtual ~MockInterfaceProvider() {}
-
-  void GetInterface(const char* name,
-                    mojo::ScopedMessagePipeHandle handle) override {
-    mock_sensitive_input_visibility_service_.BindRequest(
-        mojom::blink::SensitiveInputVisibilityServiceRequest(
-            std::move(handle)));
+  MockSensitiveInputVisibilityService(LocalFrame& frame) {
+    service_manager::InterfaceProvider::TestApi test_api(
+        &frame.GetInterfaceProvider());
+    test_api.SetBinderForName(
+        mojom::blink::SensitiveInputVisibilityService::Name_,
+        ConvertToBaseCallback(
+            WTF::Bind(&MockSensitiveInputVisibilityService::BindRequest,
+                      WTF::Unretained(this))));
   }
 
-  void SetPasswordFieldVisibleCalled() {
-    password_field_visible_called_ = true;
+  ~MockSensitiveInputVisibilityService() override {}
+
+  void BindRequest(mojo::ScopedMessagePipeHandle handle) {
+    binding_set_.AddBinding(
+        this, mojom::blink::SensitiveInputVisibilityServiceRequest(
+                  std::move(handle)));
   }
 
   bool PasswordFieldVisibleCalled() const {
     return password_field_visible_called_;
   }
 
-  void IncrementPasswordFieldsInvisibleCalled() {
-    ++num_password_fields_invisible_calls_;
-  }
-
   unsigned NumPasswordFieldsInvisibleCalls() const {
     return num_password_fields_invisible_calls_;
   }
 
  private:
-  class MockSensitiveInputVisibilityService
-      : public mojom::blink::SensitiveInputVisibilityService {
-   public:
-    explicit MockSensitiveInputVisibilityService(
-        MockInterfaceProvider* registry)
-        : registry_(registry) {}
-    ~MockSensitiveInputVisibilityService() override {}
+  // mojom::SensitiveInputVisibilityService
+  void PasswordFieldVisibleInInsecureContext() override {
+    password_field_visible_called_ = true;
+  }
 
-    void BindRequest(
-        mojom::blink::SensitiveInputVisibilityServiceRequest request) {
-      binding_set_.AddBinding(this, std::move(request));
-    }
+  void AllPasswordFieldsInInsecureContextInvisible() override {
+    ++num_password_fields_invisible_calls_;
+  }
 
-   private:
-    // mojom::SensitiveInputVisibilityService
-    void PasswordFieldVisibleInInsecureContext() override {
-      registry_->SetPasswordFieldVisibleCalled();
-    }
+  mojo::BindingSet<SensitiveInputVisibilityService> binding_set_;
 
-    void AllPasswordFieldsInInsecureContextInvisible() override {
-      registry_->IncrementPasswordFieldsInvisibleCalled();
-    }
-
-    mojo::BindingSet<SensitiveInputVisibilityService> binding_set_;
-    MockInterfaceProvider* const registry_;
-  };
-
-  MockSensitiveInputVisibilityService mock_sensitive_input_visibility_service_;
-  bool password_field_visible_called_;
-  unsigned num_password_fields_invisible_calls_;
+  bool password_field_visible_called_ = false;
+  unsigned num_password_fields_invisible_calls_ = 0;
 };
 
 // Tests that a Mojo message is sent when a visible password field
 // appears on the page.
 TEST(PasswordInputTypeTest, PasswordVisibilityEvent) {
-  MockInterfaceProvider interface_provider;
-  std::unique_ptr<DummyPageHolder> page_holder = DummyPageHolder::Create(
-      IntSize(2000, 2000), nullptr, nullptr, nullptr, &interface_provider);
+  std::unique_ptr<DummyPageHolder> page_holder =
+      DummyPageHolder::Create(IntSize(2000, 2000), nullptr, nullptr, nullptr);
+  MockSensitiveInputVisibilityService mock_service(page_holder->GetFrame());
   page_holder->GetDocument().body()->setInnerHTML("<input type='password'>");
   page_holder->GetDocument().View()->UpdateAllLifecyclePhases();
   blink::testing::RunPendingTasks();
-  EXPECT_TRUE(interface_provider.PasswordFieldVisibleCalled());
+  EXPECT_TRUE(mock_service.PasswordFieldVisibleCalled());
 }
 
 // Tests that a Mojo message is not sent when a visible password field
 // appears in a secure context.
 TEST(PasswordInputTypeTest, PasswordVisibilityEventInSecureContext) {
-  MockInterfaceProvider interface_provider;
-  std::unique_ptr<DummyPageHolder> page_holder = DummyPageHolder::Create(
-      IntSize(2000, 2000), nullptr, nullptr, nullptr, &interface_provider);
+  std::unique_ptr<DummyPageHolder> page_holder =
+      DummyPageHolder::Create(IntSize(2000, 2000), nullptr, nullptr, nullptr);
+  MockSensitiveInputVisibilityService mock_service(page_holder->GetFrame());
   page_holder->GetDocument().SetURL(KURL(NullURL(), "https://example.test"));
   page_holder->GetDocument().SetSecurityOrigin(
       SecurityOrigin::Create(KURL(NullURL(), "https://example.test")));
@@ -106,21 +85,21 @@
   page_holder->GetDocument().View()->UpdateAllLifecyclePhases();
   // No message should have been sent from a secure context.
   blink::testing::RunPendingTasks();
-  EXPECT_FALSE(interface_provider.PasswordFieldVisibleCalled());
+  EXPECT_FALSE(mock_service.PasswordFieldVisibleCalled());
 }
 
 // Tests that a Mojo message is sent when a previously invisible password field
 // becomes visible.
 TEST(PasswordInputTypeTest, InvisiblePasswordFieldBecomesVisible) {
-  MockInterfaceProvider interface_provider;
-  std::unique_ptr<DummyPageHolder> page_holder = DummyPageHolder::Create(
-      IntSize(2000, 2000), nullptr, nullptr, nullptr, &interface_provider);
+  std::unique_ptr<DummyPageHolder> page_holder =
+      DummyPageHolder::Create(IntSize(2000, 2000), nullptr, nullptr, nullptr);
+  MockSensitiveInputVisibilityService mock_service(page_holder->GetFrame());
   page_holder->GetDocument().body()->setInnerHTML(
       "<input type='password' style='display:none;'>");
   page_holder->GetDocument().View()->UpdateAllLifecyclePhases();
   blink::testing::RunPendingTasks();
   // The message should not be sent for a hidden password field.
-  EXPECT_FALSE(interface_provider.PasswordFieldVisibleCalled());
+  EXPECT_FALSE(mock_service.PasswordFieldVisibleCalled());
 
   // Now make the input visible.
   HTMLInputElement* input =
@@ -128,20 +107,20 @@
   input->setAttribute("style", "", ASSERT_NO_EXCEPTION);
   page_holder->GetDocument().View()->UpdateAllLifecyclePhases();
   blink::testing::RunPendingTasks();
-  EXPECT_TRUE(interface_provider.PasswordFieldVisibleCalled());
+  EXPECT_TRUE(mock_service.PasswordFieldVisibleCalled());
 }
 
 // Tests that a Mojo message is sent when a previously non-password field
 // becomes a password.
 TEST(PasswordInputTypeTest, NonPasswordFieldBecomesPassword) {
-  MockInterfaceProvider interface_provider;
-  std::unique_ptr<DummyPageHolder> page_holder = DummyPageHolder::Create(
-      IntSize(2000, 2000), nullptr, nullptr, nullptr, &interface_provider);
+  std::unique_ptr<DummyPageHolder> page_holder =
+      DummyPageHolder::Create(IntSize(2000, 2000), nullptr, nullptr, nullptr);
+  MockSensitiveInputVisibilityService mock_service(page_holder->GetFrame());
   page_holder->GetDocument().body()->setInnerHTML("<input type='text'>");
   page_holder->GetDocument().View()->UpdateAllLifecyclePhases();
   // The message should not be sent for a non-password field.
   blink::testing::RunPendingTasks();
-  EXPECT_FALSE(interface_provider.PasswordFieldVisibleCalled());
+  EXPECT_FALSE(mock_service.PasswordFieldVisibleCalled());
 
   // Now make the input a password field.
   HTMLInputElement* input =
@@ -149,22 +128,22 @@
   input->setType("password");
   page_holder->GetDocument().View()->UpdateAllLifecyclePhases();
   blink::testing::RunPendingTasks();
-  EXPECT_TRUE(interface_provider.PasswordFieldVisibleCalled());
+  EXPECT_TRUE(mock_service.PasswordFieldVisibleCalled());
 }
 
 // Tests that a Mojo message is *not* sent when a previously invisible password
 // field becomes a visible non-password field.
 TEST(PasswordInputTypeTest,
      InvisiblePasswordFieldBecomesVisibleNonPasswordField) {
-  MockInterfaceProvider interface_provider;
-  std::unique_ptr<DummyPageHolder> page_holder = DummyPageHolder::Create(
-      IntSize(2000, 2000), nullptr, nullptr, nullptr, &interface_provider);
+  std::unique_ptr<DummyPageHolder> page_holder =
+      DummyPageHolder::Create(IntSize(2000, 2000), nullptr, nullptr, nullptr);
+  MockSensitiveInputVisibilityService mock_service(page_holder->GetFrame());
   page_holder->GetDocument().body()->setInnerHTML(
       "<input type='password' style='display:none;'>");
   page_holder->GetDocument().View()->UpdateAllLifecyclePhases();
   blink::testing::RunPendingTasks();
   // The message should not be sent for a hidden password field.
-  EXPECT_FALSE(interface_provider.PasswordFieldVisibleCalled());
+  EXPECT_FALSE(mock_service.PasswordFieldVisibleCalled());
 
   // Now make the input a visible non-password field.
   HTMLInputElement* input =
@@ -173,20 +152,20 @@
   input->setAttribute("style", "", ASSERT_NO_EXCEPTION);
   page_holder->GetDocument().View()->UpdateAllLifecyclePhases();
   blink::testing::RunPendingTasks();
-  EXPECT_FALSE(interface_provider.PasswordFieldVisibleCalled());
+  EXPECT_FALSE(mock_service.PasswordFieldVisibleCalled());
 }
 
 // Tests that a Mojo message is sent when the only visible password
 // field becomes invisible.
 TEST(PasswordInputTypeTest, VisiblePasswordFieldBecomesInvisible) {
-  MockInterfaceProvider interface_provider;
-  std::unique_ptr<DummyPageHolder> page_holder = DummyPageHolder::Create(
-      IntSize(2000, 2000), nullptr, nullptr, nullptr, &interface_provider);
+  std::unique_ptr<DummyPageHolder> page_holder =
+      DummyPageHolder::Create(IntSize(2000, 2000), nullptr, nullptr, nullptr);
+  MockSensitiveInputVisibilityService mock_service(page_holder->GetFrame());
   page_holder->GetDocument().body()->setInnerHTML("<input type='password'>");
   page_holder->GetDocument().View()->UpdateAllLifecyclePhases();
   blink::testing::RunPendingTasks();
-  EXPECT_TRUE(interface_provider.PasswordFieldVisibleCalled());
-  EXPECT_EQ(0u, interface_provider.NumPasswordFieldsInvisibleCalls());
+  EXPECT_TRUE(mock_service.PasswordFieldVisibleCalled());
+  EXPECT_EQ(0u, mock_service.NumPasswordFieldsInvisibleCalls());
 
   // Now make the input invisible.
   HTMLInputElement* input =
@@ -194,20 +173,20 @@
   input->setAttribute("style", "display:none;", ASSERT_NO_EXCEPTION);
   page_holder->GetDocument().View()->UpdateAllLifecyclePhases();
   blink::testing::RunPendingTasks();
-  EXPECT_EQ(1u, interface_provider.NumPasswordFieldsInvisibleCalls());
+  EXPECT_EQ(1u, mock_service.NumPasswordFieldsInvisibleCalls());
 }
 
 // Tests that a Mojo message is sent when all visible password fields
 // become invisible.
 TEST(PasswordInputTypeTest, AllVisiblePasswordFieldBecomeInvisible) {
-  MockInterfaceProvider interface_provider;
-  std::unique_ptr<DummyPageHolder> page_holder = DummyPageHolder::Create(
-      IntSize(2000, 2000), nullptr, nullptr, nullptr, &interface_provider);
+  std::unique_ptr<DummyPageHolder> page_holder =
+      DummyPageHolder::Create(IntSize(2000, 2000), nullptr, nullptr, nullptr);
+  MockSensitiveInputVisibilityService mock_service(page_holder->GetFrame());
   page_holder->GetDocument().body()->setInnerHTML(
       "<input type='password'><input type='password'>");
   page_holder->GetDocument().View()->UpdateAllLifecyclePhases();
   blink::testing::RunPendingTasks();
-  EXPECT_EQ(0u, interface_provider.NumPasswordFieldsInvisibleCalls());
+  EXPECT_EQ(0u, mock_service.NumPasswordFieldsInvisibleCalls());
 
   // Make the first input invisible. There should be no message because
   // there is still a visible input.
@@ -216,38 +195,38 @@
   input->setAttribute("style", "display:none;", ASSERT_NO_EXCEPTION);
   page_holder->GetDocument().View()->UpdateAllLifecyclePhases();
   blink::testing::RunPendingTasks();
-  EXPECT_EQ(0u, interface_provider.NumPasswordFieldsInvisibleCalls());
+  EXPECT_EQ(0u, mock_service.NumPasswordFieldsInvisibleCalls());
 
   // When all inputs are invisible, then a message should be sent.
   input = toHTMLInputElement(page_holder->GetDocument().body()->lastChild());
   input->setAttribute("style", "display:none;", ASSERT_NO_EXCEPTION);
   page_holder->GetDocument().View()->UpdateAllLifecyclePhases();
   blink::testing::RunPendingTasks();
-  EXPECT_EQ(1u, interface_provider.NumPasswordFieldsInvisibleCalls());
+  EXPECT_EQ(1u, mock_service.NumPasswordFieldsInvisibleCalls());
 
   // If the count of visible inputs goes positive again and then back to
   // zero, a message should be sent again.
   input->setAttribute("style", "", ASSERT_NO_EXCEPTION);
   page_holder->GetDocument().View()->UpdateAllLifecyclePhases();
   blink::testing::RunPendingTasks();
-  EXPECT_EQ(1u, interface_provider.NumPasswordFieldsInvisibleCalls());
+  EXPECT_EQ(1u, mock_service.NumPasswordFieldsInvisibleCalls());
   input->setAttribute("style", "display:none;", ASSERT_NO_EXCEPTION);
   page_holder->GetDocument().View()->UpdateAllLifecyclePhases();
   blink::testing::RunPendingTasks();
-  EXPECT_EQ(2u, interface_provider.NumPasswordFieldsInvisibleCalls());
+  EXPECT_EQ(2u, mock_service.NumPasswordFieldsInvisibleCalls());
 }
 
 // Tests that a Mojo message is sent when the containing element of a
 // visible password field becomes invisible.
 TEST(PasswordInputTypeTest, PasswordFieldContainerBecomesInvisible) {
-  MockInterfaceProvider interface_provider;
-  std::unique_ptr<DummyPageHolder> page_holder = DummyPageHolder::Create(
-      IntSize(2000, 2000), nullptr, nullptr, nullptr, &interface_provider);
+  std::unique_ptr<DummyPageHolder> page_holder =
+      DummyPageHolder::Create(IntSize(2000, 2000), nullptr, nullptr, nullptr);
+  MockSensitiveInputVisibilityService mock_service(page_holder->GetFrame());
   page_holder->GetDocument().body()->setInnerHTML(
       "<div><input type='password'></div>");
   page_holder->GetDocument().View()->UpdateAllLifecyclePhases();
   blink::testing::RunPendingTasks();
-  EXPECT_EQ(0u, interface_provider.NumPasswordFieldsInvisibleCalls());
+  EXPECT_EQ(0u, mock_service.NumPasswordFieldsInvisibleCalls());
 
   // If the containing div becomes invisible, a message should be sent.
   HTMLElement* div =
@@ -255,31 +234,31 @@
   div->setAttribute("style", "display:none;", ASSERT_NO_EXCEPTION);
   page_holder->GetDocument().View()->UpdateAllLifecyclePhases();
   blink::testing::RunPendingTasks();
-  EXPECT_EQ(1u, interface_provider.NumPasswordFieldsInvisibleCalls());
+  EXPECT_EQ(1u, mock_service.NumPasswordFieldsInvisibleCalls());
 
   // If the containing div becomes visible and then invisible again, a message
   // should be sent.
   div->setAttribute("style", "", ASSERT_NO_EXCEPTION);
   page_holder->GetDocument().View()->UpdateAllLifecyclePhases();
   blink::testing::RunPendingTasks();
-  EXPECT_EQ(1u, interface_provider.NumPasswordFieldsInvisibleCalls());
+  EXPECT_EQ(1u, mock_service.NumPasswordFieldsInvisibleCalls());
   div->setAttribute("style", "display:none;", ASSERT_NO_EXCEPTION);
   page_holder->GetDocument().View()->UpdateAllLifecyclePhases();
   blink::testing::RunPendingTasks();
-  EXPECT_EQ(2u, interface_provider.NumPasswordFieldsInvisibleCalls());
+  EXPECT_EQ(2u, mock_service.NumPasswordFieldsInvisibleCalls());
 }
 
 // Tests that a Mojo message is sent when all visible password fields
 // become non-password fields.
 TEST(PasswordInputTypeTest, PasswordFieldsBecomeNonPasswordFields) {
-  MockInterfaceProvider interface_provider;
-  std::unique_ptr<DummyPageHolder> page_holder = DummyPageHolder::Create(
-      IntSize(2000, 2000), nullptr, nullptr, nullptr, &interface_provider);
+  std::unique_ptr<DummyPageHolder> page_holder =
+      DummyPageHolder::Create(IntSize(2000, 2000), nullptr, nullptr, nullptr);
+  MockSensitiveInputVisibilityService mock_service(page_holder->GetFrame());
   page_holder->GetDocument().body()->setInnerHTML(
       "<input type='password'><input type='password'>");
   page_holder->GetDocument().View()->UpdateAllLifecyclePhases();
   blink::testing::RunPendingTasks();
-  EXPECT_EQ(0u, interface_provider.NumPasswordFieldsInvisibleCalls());
+  EXPECT_EQ(0u, mock_service.NumPasswordFieldsInvisibleCalls());
 
   // Make the first input a non-password input. There should be no
   // message because there is still a visible password input.
@@ -288,22 +267,22 @@
   input->setType("text");
   page_holder->GetDocument().View()->UpdateAllLifecyclePhases();
   blink::testing::RunPendingTasks();
-  EXPECT_EQ(0u, interface_provider.NumPasswordFieldsInvisibleCalls());
+  EXPECT_EQ(0u, mock_service.NumPasswordFieldsInvisibleCalls());
 
   // When all inputs are no longer passwords, then a message should be sent.
   input = toHTMLInputElement(page_holder->GetDocument().body()->lastChild());
   input->setType("text");
   page_holder->GetDocument().View()->UpdateAllLifecyclePhases();
   blink::testing::RunPendingTasks();
-  EXPECT_EQ(1u, interface_provider.NumPasswordFieldsInvisibleCalls());
+  EXPECT_EQ(1u, mock_service.NumPasswordFieldsInvisibleCalls());
 }
 
 // Tests that only one Mojo message is sent for multiple password
 // visibility events within the same task.
 TEST(PasswordInputTypeTest, MultipleEventsInSameTask) {
-  MockInterfaceProvider interface_provider;
-  std::unique_ptr<DummyPageHolder> page_holder = DummyPageHolder::Create(
-      IntSize(2000, 2000), nullptr, nullptr, nullptr, &interface_provider);
+  std::unique_ptr<DummyPageHolder> page_holder =
+      DummyPageHolder::Create(IntSize(2000, 2000), nullptr, nullptr, nullptr);
+  MockSensitiveInputVisibilityService mock_service(page_holder->GetFrame());
   page_holder->GetDocument().body()->setInnerHTML("<input type='password'>");
   page_holder->GetDocument().View()->UpdateAllLifecyclePhases();
   // Make the password field invisible in the same task.
@@ -314,8 +293,8 @@
   blink::testing::RunPendingTasks();
   // Only a single Mojo message should have been sent, with the latest state of
   // the page (which is that no password fields are visible).
-  EXPECT_EQ(1u, interface_provider.NumPasswordFieldsInvisibleCalls());
-  EXPECT_FALSE(interface_provider.PasswordFieldVisibleCalled());
+  EXPECT_EQ(1u, mock_service.NumPasswordFieldsInvisibleCalls());
+  EXPECT_FALSE(mock_service.PasswordFieldVisibleCalled());
 }
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/html/media/MediaControls.h b/third_party/WebKit/Source/core/html/media/MediaControls.h
index b2b00db..cc5ed6c 100644
--- a/third_party/WebKit/Source/core/html/media/MediaControls.h
+++ b/third_party/WebKit/Source/core/html/media/MediaControls.h
@@ -11,7 +11,6 @@
 
 namespace blink {
 
-class Document;
 class HTMLDivElement;
 class HTMLMediaElement;
 class LayoutObject;
@@ -66,7 +65,6 @@
   // implementation and could be removed when the full implementation has moved
   // to modules.
   virtual HTMLDivElement* PanelElement() = 0;
-  virtual Document& OwnerDocument() = 0;
   virtual void OnMediaControlsEnabledChange() = 0;
 
   DECLARE_VIRTUAL_TRACE();
diff --git a/third_party/WebKit/Source/core/html/shadow/MediaRemotingElements.cpp b/third_party/WebKit/Source/core/html/media/MediaRemotingElements.cpp
similarity index 98%
rename from third_party/WebKit/Source/core/html/shadow/MediaRemotingElements.cpp
rename to third_party/WebKit/Source/core/html/media/MediaRemotingElements.cpp
index 5f774b1..4e491648 100644
--- a/third_party/WebKit/Source/core/html/shadow/MediaRemotingElements.cpp
+++ b/third_party/WebKit/Source/core/html/media/MediaRemotingElements.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/html/shadow/MediaRemotingElements.h"
+#include "core/html/media/MediaRemotingElements.h"
 
 #include "core/dom/ClientRect.h"
 #include "core/dom/ShadowRoot.h"
diff --git a/third_party/WebKit/Source/core/html/shadow/MediaRemotingElements.h b/third_party/WebKit/Source/core/html/media/MediaRemotingElements.h
similarity index 96%
rename from third_party/WebKit/Source/core/html/shadow/MediaRemotingElements.h
rename to third_party/WebKit/Source/core/html/media/MediaRemotingElements.h
index 605678e..45ac577b8 100644
--- a/third_party/WebKit/Source/core/html/shadow/MediaRemotingElements.h
+++ b/third_party/WebKit/Source/core/html/media/MediaRemotingElements.h
@@ -5,7 +5,7 @@
 #ifndef MediaRemotingElements_h
 #define MediaRemotingElements_h
 
-#include "core/html/shadow/MediaRemotingInterstitial.h"
+#include "core/html/media/MediaRemotingInterstitial.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/core/html/shadow/MediaRemotingInterstitial.cpp b/third_party/WebKit/Source/core/html/media/MediaRemotingInterstitial.cpp
similarity index 96%
rename from third_party/WebKit/Source/core/html/shadow/MediaRemotingInterstitial.cpp
rename to third_party/WebKit/Source/core/html/media/MediaRemotingInterstitial.cpp
index f38296b..073fed8 100644
--- a/third_party/WebKit/Source/core/html/shadow/MediaRemotingInterstitial.cpp
+++ b/third_party/WebKit/Source/core/html/media/MediaRemotingInterstitial.cpp
@@ -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 "core/html/shadow/MediaRemotingInterstitial.h"
+#include "core/html/media/MediaRemotingInterstitial.h"
 
 #include "core/dom/TaskRunnerHelper.h"
 #include "core/html/HTMLImageElement.h"
 #include "core/html/HTMLVideoElement.h"
-#include "core/html/shadow/MediaRemotingElements.h"
+#include "core/html/media/MediaRemotingElements.h"
 
 namespace {
 
diff --git a/third_party/WebKit/Source/core/html/shadow/MediaRemotingInterstitial.h b/third_party/WebKit/Source/core/html/media/MediaRemotingInterstitial.h
similarity index 98%
rename from third_party/WebKit/Source/core/html/shadow/MediaRemotingInterstitial.h
rename to third_party/WebKit/Source/core/html/media/MediaRemotingInterstitial.h
index 75a0d4d4..96624dc 100644
--- a/third_party/WebKit/Source/core/html/shadow/MediaRemotingInterstitial.h
+++ b/third_party/WebKit/Source/core/html/media/MediaRemotingInterstitial.h
@@ -60,6 +60,6 @@
   Member<MediaRemotingCastMessageElement> cast_text_message_;
 };
 
-}  // namespace
+}  // namespace blink
 
 #endif  // MediaRemotingInterstitial_h
diff --git a/third_party/WebKit/Source/core/html/parser/HTMLParserScriptRunner.cpp b/third_party/WebKit/Source/core/html/parser/HTMLParserScriptRunner.cpp
index 4ecbf7a..0be309118 100644
--- a/third_party/WebKit/Source/core/html/parser/HTMLParserScriptRunner.cpp
+++ b/third_party/WebKit/Source/core/html/parser/HTMLParserScriptRunner.cpp
@@ -79,16 +79,19 @@
   return value;
 }
 
-WARN_UNUSED_RESULT ScriptLoader::ExecuteScriptResult DoExecuteScript(
-    ScriptElementBase* element,
-    const Script* script,
-    const TextPosition& text_position) {
+void DoExecuteScript(PendingScript* pending_script, const KURL& document_url) {
+  ScriptElementBase* element = pending_script->GetElement();
   ScriptLoader* script_loader = element->Loader();
   DCHECK(script_loader);
-  TRACE_EVENT_WITH_FLOW1("blink", "HTMLParserScriptRunner ExecuteScript",
-                         element, TRACE_EVENT_FLAG_FLOW_IN, "data",
-                         GetTraceArgsForScriptElement(element, text_position));
-  return script_loader->ExecuteScript(script);
+  const char* const trace_event_name =
+      pending_script->ErrorOccurred()
+          ? "HTMLParserScriptRunner ExecuteScriptFailed"
+          : "HTMLParserScriptRunner ExecuteScript";
+  TRACE_EVENT_WITH_FLOW1("blink", trace_event_name, element,
+                         TRACE_EVENT_FLAG_FLOW_IN, "data",
+                         GetTraceArgsForScriptElement(
+                             element, pending_script->StartingPosition()));
+  script_loader->ExecuteScriptBlock(pending_script, document_url);
 }
 
 void TraceParserBlockingScript(const PendingScript* pending_script,
@@ -202,10 +205,6 @@
 void HTMLParserScriptRunner::ExecutePendingScriptAndDispatchEvent(
     PendingScript* pending_script,
     ScriptStreamer::Type pending_script_type) {
-  bool error_occurred = false;
-  Script* script = pending_script->GetSource(
-      DocumentURLForScriptExecution(document_), error_occurred);
-
   // Stop watching loads before executeScript to prevent recursion if the script
   // reloads itself.
   // TODO(kouhei): Consider merging this w/ pendingScript->dispose() after the
@@ -222,17 +221,12 @@
     }
   }
 
-  TextPosition script_start_position = pending_script->StartingPosition();
   double script_parser_blocking_time =
       pending_script->ParserBlockingLoadStartTime();
   ScriptElementBase* element = pending_script->GetElement();
 
   // 1. "Let the script be the pending parsing-blocking script.
   //     There is no longer a pending parsing-blocking script."
-  // Clear the pending script before possible re-entrancy from executeScript()
-  pending_script->Dispose();
-  pending_script = nullptr;
-
   if (pending_script_type == ScriptStreamer::kParsingBlocking) {
     parser_blocking_script_ = nullptr;
   }
@@ -248,31 +242,14 @@
         ignore_destructive_write_count_incrementer(document_);
 
     // 8. "Execute the script."
-    if (error_occurred) {
-      TRACE_EVENT_WITH_FLOW1(
-          "blink", "HTMLParserScriptRunner ExecuteScriptFailed", element,
-          TRACE_EVENT_FLAG_FLOW_IN, "data",
-          GetTraceArgsForScriptElement(element, script_start_position));
-      script_loader->DispatchErrorEvent();
-    } else {
-      DCHECK(IsExecutingScript());
-      if (script_parser_blocking_time > 0.0) {
-        DocumentParserTiming::From(*document_)
-            .RecordParserBlockedOnScriptLoadDuration(
-                MonotonicallyIncreasingTime() - script_parser_blocking_time,
-                script_loader->WasCreatedDuringDocumentWrite());
-      }
-      switch (DoExecuteScript(element, script, script_start_position)) {
-        case ScriptLoader::ExecuteScriptResult::kShouldFireErrorEvent:
-          script_loader->DispatchErrorEvent();
-          break;
-        case ScriptLoader::ExecuteScriptResult::kShouldFireLoadEvent:
-          element->DispatchLoadEvent();
-          break;
-        case ScriptLoader::ExecuteScriptResult::kShouldFireNone:
-          break;
-      }
+    DCHECK(IsExecutingScript());
+    if (!pending_script->ErrorOccurred() && script_parser_blocking_time > 0.0) {
+      DocumentParserTiming::From(*document_)
+          .RecordParserBlockedOnScriptLoadDuration(
+              MonotonicallyIncreasingTime() - script_parser_blocking_time,
+              script_loader->WasCreatedDuringDocumentWrite());
     }
+    DoExecuteScript(pending_script, DocumentURLForScriptExecution(document_));
 
     // 9. "Decrement the parser's script nesting level by one.
     //     If the parser's script nesting level is zero
@@ -660,22 +637,9 @@
         if (parser_blocking_script_)
           parser_blocking_script_->Dispose();
         parser_blocking_script_ = nullptr;
-        ScriptSourceCode source_code(element->TextFromChildren(),
-                                     DocumentURLForScriptExecution(document_),
-                                     script_start_position);
-        switch (DoExecuteScript(element, ClassicScript::Create(source_code),
-                                script_start_position)) {
-          case ScriptLoader::ExecuteScriptResult::kShouldFireLoadEvent:
-            // The load event is not fired because this is an inline script.
-            break;
-
-          case ScriptLoader::ExecuteScriptResult::kShouldFireErrorEvent:
-            script_loader->DispatchErrorEvent();
-            break;
-
-          case ScriptLoader::ExecuteScriptResult::kShouldFireNone:
-            break;
-        }
+        DoExecuteScript(
+            ClassicPendingScript::Create(element, script_start_position),
+            DocumentURLForScriptExecution(document_));
       }
     } else {
       // 2nd Clause of Step 23.
diff --git a/third_party/WebKit/Source/core/html/shadow/MediaControlElementTypes.cpp b/third_party/WebKit/Source/core/html/shadow/MediaControlElementTypes.cpp
deleted file mode 100644
index d78c84d..0000000
--- a/third_party/WebKit/Source/core/html/shadow/MediaControlElementTypes.cpp
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Copyright (C) 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
- * Copyright (C) 2012 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "core/html/shadow/MediaControlElementTypes.h"
-
-#include "bindings/core/v8/ExceptionState.h"
-#include "core/CSSValueKeywords.h"
-#include "core/HTMLNames.h"
-#include "core/css/StylePropertySet.h"
-#include "core/dom/Text.h"
-#include "core/events/MouseEvent.h"
-#include "core/html/HTMLLabelElement.h"
-#include "core/html/HTMLMediaElement.h"
-#include "core/html/media/MediaControls.h"
-#include "core/layout/LayoutObject.h"
-#include "platform/text/PlatformLocale.h"
-
-namespace blink {
-
-using namespace HTMLNames;
-
-class Event;
-
-const HTMLMediaElement* ToParentMediaElement(const Node* node) {
-  if (!node)
-    return nullptr;
-  const Node* media_node = node->OwnerShadowHost();
-  if (!media_node)
-    return nullptr;
-  if (!IsHTMLMediaElement(media_node))
-    return nullptr;
-
-  return ToHTMLMediaElement(media_node);
-}
-
-const HTMLMediaElement* ToParentMediaElement(
-    const LayoutObject& layout_object) {
-  return ToParentMediaElement(layout_object.GetNode());
-}
-
-MediaControlElementType GetMediaControlElementType(const Node* node) {
-  SECURITY_DCHECK(node->IsMediaControlElement());
-  const HTMLElement* element = ToHTMLElement(node);
-  if (isHTMLInputElement(*element))
-    return static_cast<const MediaControlInputElement*>(element)->DisplayType();
-  return static_cast<const MediaControlDivElement*>(element)->DisplayType();
-}
-
-MediaControlElement::MediaControlElement(MediaControls& media_controls,
-                                         MediaControlElementType display_type,
-                                         HTMLElement* element)
-    : media_controls_(&media_controls),
-      display_type_(display_type),
-      element_(element),
-      is_wanted_(true),
-      does_fit_(true) {}
-
-HTMLMediaElement& MediaControlElement::MediaElement() const {
-  return GetMediaControls().MediaElement();
-}
-
-void MediaControlElement::UpdateShownState() {
-  if (is_wanted_ && does_fit_)
-    element_->RemoveInlineStyleProperty(CSSPropertyDisplay);
-  else
-    element_->SetInlineStyleProperty(CSSPropertyDisplay, CSSValueNone);
-}
-
-void MediaControlElement::SetDoesFit(bool fits) {
-  does_fit_ = fits;
-  UpdateShownState();
-}
-
-void MediaControlElement::SetIsWanted(bool wanted) {
-  if (is_wanted_ == wanted)
-    return;
-  is_wanted_ = wanted;
-  UpdateShownState();
-}
-
-bool MediaControlElement::IsWanted() {
-  return is_wanted_;
-}
-
-void MediaControlElement::SetDisplayType(MediaControlElementType display_type) {
-  if (display_type == display_type_)
-    return;
-
-  display_type_ = display_type;
-  if (LayoutObject* object = element_->GetLayoutObject())
-    object->SetShouldDoFullPaintInvalidation();
-}
-
-void MediaControlElement::ShouldShowButtonInOverflowMenu(bool should_show) {
-  if (!HasOverflowButton())
-    return;
-  if (should_show) {
-    overflow_menu_element_->RemoveInlineStyleProperty(CSSPropertyDisplay);
-  } else {
-    overflow_menu_element_->SetInlineStyleProperty(CSSPropertyDisplay,
-                                                   CSSValueNone);
-  }
-}
-
-String MediaControlElement::GetOverflowMenuString() {
-  return MediaElement().GetLocale().QueryString(GetOverflowStringName());
-}
-
-void MediaControlElement::UpdateOverflowString() {
-  if (overflow_menu_element_ && overflow_menu_text_)
-    overflow_menu_text_->ReplaceWholeText(GetOverflowMenuString());
-}
-
-DEFINE_TRACE(MediaControlElement) {
-  visitor->Trace(media_controls_);
-  visitor->Trace(element_);
-  visitor->Trace(overflow_menu_element_);
-  visitor->Trace(overflow_menu_text_);
-}
-
-// ----------------------------
-
-MediaControlDivElement::MediaControlDivElement(
-    MediaControls& media_controls,
-    MediaControlElementType display_type)
-    : HTMLDivElement(media_controls.OwnerDocument()),
-      MediaControlElement(media_controls, display_type, this) {}
-
-DEFINE_TRACE(MediaControlDivElement) {
-  MediaControlElement::Trace(visitor);
-  HTMLDivElement::Trace(visitor);
-}
-
-// ----------------------------
-
-MediaControlInputElement::MediaControlInputElement(
-    MediaControls& media_controls,
-    MediaControlElementType display_type)
-    : HTMLInputElement(media_controls.OwnerDocument(), false),
-      MediaControlElement(media_controls, display_type, this) {}
-
-bool MediaControlInputElement::IsMouseFocusable() const {
-  return false;
-}
-
-HTMLElement* MediaControlInputElement::CreateOverflowElement(
-    MediaControls& media_controls,
-    MediaControlInputElement* button) {
-  if (!button)
-    return nullptr;
-
-  // We don't want the button visible within the overflow menu.
-  button->SetIsWanted(false);
-
-  overflow_menu_text_ = Text::Create(media_controls.OwnerDocument(),
-                                     button->GetOverflowMenuString());
-
-  HTMLLabelElement* element =
-      HTMLLabelElement::Create(media_controls.OwnerDocument());
-  element->SetShadowPseudoId(
-      AtomicString("-internal-media-controls-overflow-menu-list-item"));
-  // Appending a button to a label element ensures that clicks on the label
-  // are passed down to the button, performing the action we'd expect.
-  element->AppendChild(button);
-  element->AppendChild(overflow_menu_text_);
-  overflow_menu_element_ = element;
-  return element;
-}
-
-DEFINE_TRACE(MediaControlInputElement) {
-  MediaControlElement::Trace(visitor);
-  HTMLInputElement::Trace(visitor);
-}
-
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/html/shadow/MediaControlElementTypes.h b/third_party/WebKit/Source/core/html/shadow/MediaControlElementTypes.h
deleted file mode 100644
index 798efbb..0000000
--- a/third_party/WebKit/Source/core/html/shadow/MediaControlElementTypes.h
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Copyright (C) 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
- * Copyright (C) 2012 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef MediaControlElementTypes_h
-#define MediaControlElementTypes_h
-
-#include "core/CoreExport.h"
-#include "core/html/HTMLDivElement.h"
-#include "core/html/HTMLInputElement.h"
-#include "public/platform/WebLocalizedString.h"
-
-namespace blink {
-
-class HTMLMediaElement;
-class MediaControls;
-
-enum MediaControlElementType {
-  kMediaEnterFullscreenButton = 0,
-  kMediaMuteButton,
-  kMediaPlayButton,
-  kMediaSlider,
-  kMediaSliderThumb,
-  kMediaShowClosedCaptionsButton,
-  kMediaHideClosedCaptionsButton,
-  kMediaTextTrackList,
-  kMediaUnMuteButton,
-  kMediaPauseButton,
-  kMediaTimelineContainer,
-  kMediaCurrentTimeDisplay,
-  kMediaTimeRemainingDisplay,
-  kMediaTrackSelectionCheckmark,
-  kMediaControlsPanel,
-  kMediaVolumeSliderContainer,
-  kMediaVolumeSlider,
-  kMediaVolumeSliderThumb,
-  kMediaExitFullscreenButton,
-  kMediaOverlayPlayButton,
-  kMediaCastOffButton,
-  kMediaCastOnButton,
-  kMediaOverlayCastOffButton,
-  kMediaOverlayCastOnButton,
-  kMediaOverflowButton,
-  kMediaOverflowList,
-  kMediaDownloadButton,
-};
-
-CORE_EXPORT const HTMLMediaElement* ToParentMediaElement(const Node*);
-CORE_EXPORT const HTMLMediaElement* ToParentMediaElement(const LayoutObject&);
-
-CORE_EXPORT MediaControlElementType GetMediaControlElementType(const Node*);
-
-// ----------------------------
-
-// TODO(mustaq): The Media control elements that use MouseEvents should be
-// ported to use PointerEvents instead.
-class CORE_EXPORT MediaControlElement : public GarbageCollectedMixin {
- public:
-  // These hold the state about whether this control should be shown if
-  // space permits.  These will also show / hide as needed.
-  virtual void SetIsWanted(bool);
-  bool IsWanted();
-
-  // Tell us whether we fit or not.  This will hide / show the control as
-  // needed, also.
-  void SetDoesFit(bool);
-
-  MediaControlElementType DisplayType() const { return display_type_; }
-
-  // By default, media controls elements are not added to the overflow menu.
-  // Controls that can be added to the overflow menu should override this
-  // function and return true.
-  virtual bool HasOverflowButton() { return false; }
-
-  // If true, shows the overflow menu item if it exists. Hides it if false.
-  void ShouldShowButtonInOverflowMenu(bool);
-
-  // Returns a string representation of the media control element. Used for
-  // the overflow menu.
-  String GetOverflowMenuString();
-
-  // Updates the value of the Text string shown in the overflow menu.
-  void UpdateOverflowString();
-
-  DECLARE_VIRTUAL_TRACE();
-
- protected:
-  MediaControlElement(MediaControls&, MediaControlElementType, HTMLElement*);
-
-  MediaControls& GetMediaControls() const {
-    DCHECK(media_controls_);
-    return *media_controls_;
-  }
-  HTMLMediaElement& MediaElement() const;
-
-  void SetDisplayType(MediaControlElementType);
-
-  // Represents the overflow menu element for this media control.
-  // The Element contains the button that the user can click on, but having
-  // the button within an Element enables us to style the overflow menu.
-  // Setting this pointer is optional so it may be null.
-  Member<Element> overflow_menu_element_;
-
-  // The text representation of the button within the overflow menu.
-  Member<Text> overflow_menu_text_;
-
- private:
-  // Hide or show based on our fits / wanted state.  We want to show
-  // if and only if we're wanted and we fit.
-  void UpdateShownState();
-
-  // Returns a string representation of the media control element.
-  // Subclasses should override this method to return the string representation
-  // of the overflow button.
-  virtual WebLocalizedString::Name GetOverflowStringName() {
-    NOTREACHED();
-    return WebLocalizedString::kAXAMPMFieldText;
-  }
-
-  Member<MediaControls> media_controls_;
-  MediaControlElementType display_type_;
-  Member<HTMLElement> element_;
-  bool is_wanted_ : 1;
-  bool does_fit_ : 1;
-};
-
-// ----------------------------
-
-class CORE_EXPORT MediaControlDivElement : public HTMLDivElement,
-                                           public MediaControlElement {
-  USING_GARBAGE_COLLECTED_MIXIN(MediaControlDivElement);
-
- public:
-  DECLARE_VIRTUAL_TRACE();
-
- protected:
-  MediaControlDivElement(MediaControls&, MediaControlElementType);
-
- private:
-  bool IsMediaControlElement() const final { return true; }
-};
-
-// ----------------------------
-
-class CORE_EXPORT MediaControlInputElement : public HTMLInputElement,
-                                             public MediaControlElement {
-  USING_GARBAGE_COLLECTED_MIXIN(MediaControlInputElement);
-
- public:
-  DECLARE_VIRTUAL_TRACE();
-
-  // Creates an overflow menu element with the given button as a child.
-  HTMLElement* CreateOverflowElement(MediaControls&, MediaControlInputElement*);
-
- protected:
-  MediaControlInputElement(MediaControls&, MediaControlElementType);
-
- private:
-  virtual void UpdateDisplayType() {}
-  bool IsMediaControlElement() const final { return true; }
-  bool IsMouseFocusable() const override;
-
-  // Creates an overflow menu HTML element.
-  virtual MediaControlInputElement* CreateOverflowButton(MediaControls&) {
-    return nullptr;
-  }
-};
-
-}  // namespace blink
-
-#endif  // MediaControlElementTypes_h
diff --git a/third_party/WebKit/Source/core/html/shadow/OWNERS b/third_party/WebKit/Source/core/html/shadow/OWNERS
deleted file mode 100644
index c774e98..0000000
--- a/third_party/WebKit/Source/core/html/shadow/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-per-file Media*=mlamouri@chromium.org
diff --git a/third_party/WebKit/Source/core/inspector/DOMPatchSupport.cpp b/third_party/WebKit/Source/core/inspector/DOMPatchSupport.cpp
index afb5e8c6..c406897 100644
--- a/third_party/WebKit/Source/core/inspector/DOMPatchSupport.cpp
+++ b/third_party/WebKit/Source/core/inspector/DOMPatchSupport.cpp
@@ -56,13 +56,6 @@
 
 namespace blink {
 
-void DOMPatchSupport::PatchDocument(Document& document, const String& markup) {
-  InspectorHistory history;
-  DOMEditor dom_editor(&history);
-  DOMPatchSupport patch_support(&dom_editor, document);
-  patch_support.PatchDocument(markup);
-}
-
 DOMPatchSupport::DOMPatchSupport(DOMEditor* dom_editor, Document& document)
     : dom_editor_(dom_editor), document_(document) {}
 
diff --git a/third_party/WebKit/Source/core/inspector/DOMPatchSupport.h b/third_party/WebKit/Source/core/inspector/DOMPatchSupport.h
index 26fd66e..2e4a2ba 100644
--- a/third_party/WebKit/Source/core/inspector/DOMPatchSupport.h
+++ b/third_party/WebKit/Source/core/inspector/DOMPatchSupport.h
@@ -49,8 +49,6 @@
   WTF_MAKE_NONCOPYABLE(DOMPatchSupport);
 
  public:
-  static void PatchDocument(Document&, const String& markup);
-
   DOMPatchSupport(DOMEditor*, Document&);
 
   void PatchDocument(const String& markup);
diff --git a/third_party/WebKit/Source/core/inspector/InspectorPageAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorPageAgent.cpp
index a15af9a..8932083 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorPageAgent.cpp
+++ b/third_party/WebKit/Source/core/inspector/InspectorPageAgent.cpp
@@ -49,7 +49,6 @@
 #include "core/html/imports/HTMLImportLoader.h"
 #include "core/html/imports/HTMLImportsController.h"
 #include "core/html/parser/TextResourceDecoder.h"
-#include "core/inspector/DOMPatchSupport.h"
 #include "core/inspector/IdentifiersFactory.h"
 #include "core/inspector/InspectedFrames.h"
 #include "core/inspector/InspectorCSSAgent.h"
@@ -655,7 +654,7 @@
   Document* document = frame->GetDocument();
   if (!document)
     return Response::Error("No Document instance to set HTML for");
-  DOMPatchSupport::PatchDocument(*document, html);
+  document->SetContent(html);
   return Response::OK();
 }
 
diff --git a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_node.cc b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_node.cc
index 67957ae..596b4ee 100644
--- a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_node.cc
+++ b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_node.cc
@@ -8,6 +8,7 @@
 #include "core/layout/LayoutBlockFlow.h"
 #include "core/layout/LayoutObject.h"
 #include "core/layout/LayoutText.h"
+#include "core/layout/api/LineLayoutAPIShim.h"
 #include "core/layout/line/LineInfo.h"
 #include "core/layout/line/RootInlineBox.h"
 #include "core/layout/ng/inline/ng_bidi_paragraph.h"
@@ -148,6 +149,10 @@
       if (inline_box->GetLineLayoutItem().IsBox()) {
         LineLayoutBox box(inline_box->GetLineLayoutItem());
         box.SetLocation(inline_box->Location());
+
+        LayoutObject* layout_object = LineLayoutAPIShim::LayoutObjectFrom(box);
+        if (layout_object->IsAtomicInlineLevel())
+          ToLayoutBox(layout_object)->SetInlineBoxWrapper(inline_box);
       }
     }
 
diff --git a/third_party/WebKit/Source/core/loader/EmptyClients.h b/third_party/WebKit/Source/core/loader/EmptyClients.h
index a2ae83f..d6918dd 100644
--- a/third_party/WebKit/Source/core/loader/EmptyClients.h
+++ b/third_party/WebKit/Source/core/loader/EmptyClients.h
@@ -57,6 +57,7 @@
 #include "public/platform/WebScreenInfo.h"
 #include "public/platform/WebSpellCheckPanelHostClient.h"
 #include "public/platform/WebURLLoader.h"
+#include "services/service_manager/public/cpp/interface_provider.h"
 #include "v8/include/v8.h"
 
 /*
@@ -347,6 +348,10 @@
 
   WebCookieJar* CookieJar() const override { return 0; }
 
+  service_manager::InterfaceProvider* GetInterfaceProvider() {
+    return &interface_provider_;
+  }
+
   WebSpellCheckPanelHostClient* SpellCheckPanelHostClient() const override {
     return nullptr;
   }
@@ -373,6 +378,7 @@
   EmptyLocalFrameClient() {}
 
   ContentSettingsClient content_settings_client_;
+  service_manager::InterfaceProvider interface_provider_;
 };
 
 class CORE_EXPORT EmptyTextCheckerClient : public TextCheckerClient {
diff --git a/third_party/WebKit/Source/core/loader/FrameFetchContextTest.cpp b/third_party/WebKit/Source/core/loader/FrameFetchContextTest.cpp
index 730549d2..0776e3b 100644
--- a/third_party/WebKit/Source/core/loader/FrameFetchContextTest.cpp
+++ b/third_party/WebKit/Source/core/loader/FrameFetchContextTest.cpp
@@ -178,8 +178,8 @@
 
   void SetFilterPolicy(WebDocumentSubresourceFilter::LoadPolicy policy) {
     document->Loader()->SetSubresourceFilter(SubresourceFilter::Create(
-        document->Loader(), WTF::MakeUnique<FixedPolicySubresourceFilter>(
-                                policy, &filtered_load_callback_counter_)));
+        *document, WTF::MakeUnique<FixedPolicySubresourceFilter>(
+                       policy, &filtered_load_callback_counter_)));
   }
 
   ResourceRequestBlockedReason CanRequest() {
diff --git a/third_party/WebKit/Source/core/loader/SubresourceFilter.cpp b/third_party/WebKit/Source/core/loader/SubresourceFilter.cpp
index a5798747..3c622e9 100644
--- a/third_party/WebKit/Source/core/loader/SubresourceFilter.cpp
+++ b/third_party/WebKit/Source/core/loader/SubresourceFilter.cpp
@@ -10,6 +10,8 @@
 #include "core/dom/TaskRunnerHelper.h"
 #include "core/frame/LocalFrame.h"
 #include "core/inspector/ConsoleMessage.h"
+#include "core/loader/DocumentLoader.h"
+#include "core/workers/WorkerOrWorkletGlobalScope.h"
 #include "platform/WebTaskRunner.h"
 #include "platform/weborigin/KURL.h"
 #include "platform/wtf/text/StringBuilder.h"
@@ -34,15 +36,15 @@
 
 // static
 SubresourceFilter* SubresourceFilter::Create(
-    DocumentLoader* loader,
+    ExecutionContext& execution_context,
     std::unique_ptr<WebDocumentSubresourceFilter> filter) {
-  return new SubresourceFilter(loader, std::move(filter));
+  return new SubresourceFilter(&execution_context, std::move(filter));
 }
 
 SubresourceFilter::SubresourceFilter(
-    DocumentLoader* document_loader,
+    ExecutionContext* execution_context,
     std::unique_ptr<WebDocumentSubresourceFilter> subresource_filter)
-    : document_loader_(document_loader),
+    : execution_context_(execution_context),
       subresource_filter_(std::move(subresource_filter)) {}
 
 SubresourceFilter::~SubresourceFilter() {}
@@ -62,6 +64,9 @@
 }
 
 bool SubresourceFilter::AllowWebSocketConnection(const KURL& url) {
+  // Currently WebSocket is handled via document on the main thread.
+  DCHECK(execution_context_->IsDocument());
+
   WebDocumentSubresourceFilter::LoadPolicy load_policy =
       subresource_filter_->GetLoadPolicyForWebSocketConnect(url);
 
@@ -69,8 +74,8 @@
   // thread. Note that this unconditionally calls reportLoad unlike allowLoad,
   // because there aren't developer-invisible connections (like speculative
   // preloads) happening here.
-  RefPtr<WebTaskRunner> task_runner = TaskRunnerHelper::Get(
-      TaskType::kNetworking, document_loader_->GetFrame());
+  RefPtr<WebTaskRunner> task_runner =
+      TaskRunnerHelper::Get(TaskType::kNetworking, execution_context_);
   DCHECK(task_runner->RunsTasksInCurrentSequence());
   task_runner->PostTask(BLINK_FROM_HERE,
                         WTF::Bind(&SubresourceFilter::ReportLoad,
@@ -81,9 +86,6 @@
 void SubresourceFilter::ReportLoad(
     const KURL& resource_url,
     WebDocumentSubresourceFilter::LoadPolicy load_policy) {
-  Document* document = document_loader_->GetFrame()
-                           ? document_loader_->GetFrame()->GetDocument()
-                           : nullptr;
   switch (load_policy) {
     case WebDocumentSubresourceFilter::kAllow:
       break;
@@ -95,17 +97,28 @@
       // document wide console message, so no need to log it here.
       // TODO: Consider logging this as a kInterventionMessageSource for showing
       // warning in Lighthouse.
-      if (document && subresource_filter_->ShouldLogToConsole()) {
-        document->AddConsoleMessage(ConsoleMessage::Create(
+      if (subresource_filter_->ShouldLogToConsole()) {
+        execution_context_->AddConsoleMessage(ConsoleMessage::Create(
             kOtherMessageSource, kErrorMessageLevel,
             GetErrorStringForDisallowedLoad(resource_url)));
       }
     // fall through
     case WebDocumentSubresourceFilter::kWouldDisallow:
-      document_loader_->DidObserveLoadingBehavior(
-          kWebLoadingBehaviorSubresourceFilterMatch);
+      // TODO(csharrison): Consider posting a task to the main thread from
+      // worker thread, or adding support for DidObserveLoadingBehavior to
+      // ExecutionContext.
+      if (execution_context_->IsDocument()) {
+        if (DocumentLoader* loader = ToDocument(execution_context_)->Loader()) {
+          loader->DidObserveLoadingBehavior(
+              kWebLoadingBehaviorSubresourceFilterMatch);
+        }
+      }
       break;
   }
 }
 
+DEFINE_TRACE(SubresourceFilter) {
+  visitor->Trace(execution_context_);
+}
+
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/loader/SubresourceFilter.h b/third_party/WebKit/Source/core/loader/SubresourceFilter.h
index 53c0bf3..1ee6c3d7 100644
--- a/third_party/WebKit/Source/core/loader/SubresourceFilter.h
+++ b/third_party/WebKit/Source/core/loader/SubresourceFilter.h
@@ -8,7 +8,6 @@
 #include <memory>
 
 #include "core/CoreExport.h"
-#include "core/loader/DocumentLoader.h"
 #include "platform/heap/Handle.h"
 #include "platform/weborigin/SecurityViolationReportingPolicy.h"
 #include "public/platform/WebDocumentSubresourceFilter.h"
@@ -16,6 +15,7 @@
 
 namespace blink {
 
+class ExecutionContext;
 class KURL;
 
 // Wrapper around a WebDocumentSubresourceFilter. This class will make it easier
@@ -25,7 +25,7 @@
     : public GarbageCollectedFinalized<SubresourceFilter> {
  public:
   static SubresourceFilter* Create(
-      DocumentLoader*,
+      ExecutionContext&,
       std::unique_ptr<WebDocumentSubresourceFilter>);
   ~SubresourceFilter();
 
@@ -34,16 +34,16 @@
                  SecurityViolationReportingPolicy);
   bool AllowWebSocketConnection(const KURL&);
 
-  DEFINE_INLINE_TRACE() { visitor->Trace(document_loader_); }
+  DECLARE_VIRTUAL_TRACE();
 
  private:
-  SubresourceFilter(DocumentLoader*,
+  SubresourceFilter(ExecutionContext*,
                     std::unique_ptr<WebDocumentSubresourceFilter>);
 
   void ReportLoad(const KURL& resource_url,
                   WebDocumentSubresourceFilter::LoadPolicy);
 
-  Member<DocumentLoader> document_loader_;
+  Member<ExecutionContext> execution_context_;
   std::unique_ptr<WebDocumentSubresourceFilter> subresource_filter_;
 };
 
diff --git a/third_party/WebKit/Source/core/loader/WorkerFetchContext.cpp b/third_party/WebKit/Source/core/loader/WorkerFetchContext.cpp
index 4160cfa2..815a9957 100644
--- a/third_party/WebKit/Source/core/loader/WorkerFetchContext.cpp
+++ b/third_party/WebKit/Source/core/loader/WorkerFetchContext.cpp
@@ -8,6 +8,7 @@
 #include "core/frame/Deprecation.h"
 #include "core/frame/UseCounter.h"
 #include "core/loader/MixedContentChecker.h"
+#include "core/loader/SubresourceFilter.h"
 #include "core/probe/CoreProbes.h"
 #include "core/timing/WorkerGlobalScopePerformance.h"
 #include "core/workers/WorkerClients.h"
@@ -87,6 +88,12 @@
           TaskRunnerHelper::Get(TaskType::kUnspecedLoading, global_scope_)) {
   web_context_->InitializeOnWorkerThread(
       loading_task_runner_->ToSingleThreadTaskRunner());
+  std::unique_ptr<blink::WebDocumentSubresourceFilter> web_filter =
+      web_context_->TakeSubresourceFilter();
+  if (web_filter) {
+    subresource_filter_ =
+        SubresourceFilter::Create(global_scope, std::move(web_filter));
+  }
 }
 
 KURL WorkerFetchContext::GetFirstPartyForCookies() const {
@@ -104,8 +111,7 @@
 }
 
 SubresourceFilter* WorkerFetchContext::GetSubresourceFilter() const {
-  // TODO(horo): Implement this. (https://crbug.com/739597)
-  return nullptr;
+  return subresource_filter_.Get();
 }
 
 bool WorkerFetchContext::ShouldBlockRequestByInspector(
@@ -336,6 +342,7 @@
 
 DEFINE_TRACE(WorkerFetchContext) {
   visitor->Trace(global_scope_);
+  visitor->Trace(subresource_filter_);
   visitor->Trace(resource_fetcher_);
   BaseFetchContext::Trace(visitor);
 }
diff --git a/third_party/WebKit/Source/core/loader/WorkerFetchContext.h b/third_party/WebKit/Source/core/loader/WorkerFetchContext.h
index 6cd9bea4..aef3b71 100644
--- a/third_party/WebKit/Source/core/loader/WorkerFetchContext.h
+++ b/third_party/WebKit/Source/core/loader/WorkerFetchContext.h
@@ -13,6 +13,7 @@
 namespace blink {
 
 class ResourceFetcher;
+class SubresourceFilter;
 class WebTaskRunner;
 class WebURLLoader;
 class WebWorkerFetchContext;
@@ -111,6 +112,7 @@
 
   Member<WorkerOrWorkletGlobalScope> global_scope_;
   std::unique_ptr<WebWorkerFetchContext> web_context_;
+  Member<SubresourceFilter> subresource_filter_;
   Member<ResourceFetcher> resource_fetcher_;
   RefPtr<WebTaskRunner> loading_task_runner_;
 };
diff --git a/third_party/WebKit/Source/core/loader/resource/ImageResource.cpp b/third_party/WebKit/Source/core/loader/resource/ImageResource.cpp
index f698bae..9169c14 100644
--- a/third_party/WebKit/Source/core/loader/resource/ImageResource.cpp
+++ b/third_party/WebKit/Source/core/loader/resource/ImageResource.cpp
@@ -48,11 +48,22 @@
 #include "v8/include/v8.h"
 
 namespace blink {
+
 namespace {
+
 // The amount of time to wait before informing the clients that the image has
 // been updated (in seconds). This effectively throttles invalidations that
 // result from new data arriving for this image.
 constexpr double kFlushDelaySeconds = 1.;
+
+bool HasServerLoFiResponseHeaders(const ResourceResponse& response) {
+  return response.HttpHeaderField("chrome-proxy-content-transform")
+             .Contains("empty-image") ||
+         // Check for the legacy Server Lo-Fi response headers, since it's
+         // possible that an old Lo-Fi image could be served from the cache.
+         response.HttpHeaderField("chrome-proxy").Contains("q=low");
+}
+
 }  // namespace
 
 class ImageResource::ImageResourceInfoImpl final
@@ -429,10 +440,17 @@
     multipart_parser_ = new MultipartImageResourceParser(
         response, response.MultipartBoundary(), this);
   }
+
+  // Notify the base class that a response has been received. Note that after
+  // this call, |GetResponse()| will represent the full effective
+  // ResourceResponse, while |response| might just be a revalidation response
+  // (e.g. a 304) with a partial set of updated headers that were folded into
+  // the cached response.
   Resource::ResponseReceived(response, std::move(handle));
+
   if (RuntimeEnabledFeatures::ClientHintsEnabled()) {
     device_pixel_ratio_header_value_ =
-        this->GetResponse()
+        GetResponse()
             .HttpHeaderField(HTTPNames::Content_DPR)
             .ToFloat(&has_device_pixel_ratio_header_value_);
     if (!has_device_pixel_ratio_header_value_ ||
@@ -444,9 +462,9 @@
 
   if (placeholder_option_ ==
           PlaceholderOption::kShowAndReloadPlaceholderAlways &&
-      IsEntireResource(this->GetResponse())) {
-    if (this->GetResponse().HttpStatusCode() < 400 ||
-        this->GetResponse().HttpStatusCode() >= 600) {
+      IsEntireResource(GetResponse())) {
+    if (GetResponse().HttpStatusCode() < 400 ||
+        GetResponse().HttpStatusCode() >= 600) {
       // Don't treat a complete and broken image as a placeholder if the
       // response code is something other than a 4xx or 5xx error.
       // This is done to prevent reissuing the request in cases like
@@ -457,9 +475,44 @@
       placeholder_option_ = PlaceholderOption::kReloadPlaceholderOnDecodeError;
     }
   }
+
+  if (HasServerLoFiResponseHeaders(GetResponse())) {
+    // Ensure that the PreviewsState bit for Server Lo-Fi is set iff Chrome
+    // received the appropriate Server Lo-Fi response headers for this image.
+    //
+    // Normally, the |kServerLoFiOn| bit should already be set if Server Lo-Fi
+    // response headers are coming back, but it's possible for legacy Lo-Fi
+    // images to be served from the cache even if Chrome isn't in Lo-Fi mode.
+    // This also serves as a nice last line of defence to ensure that Server
+    // Lo-Fi images can be reloaded to show the original even if e.g. a server
+    // bug causes Lo-Fi images to be sent when they aren't expected.
+    SetPreviewsState(GetResourceRequest().GetPreviewsState() |
+                     WebURLRequest::kServerLoFiOn);
+  } else if (GetResourceRequest().GetPreviewsState() &
+             WebURLRequest::kServerLoFiOn) {
+    // If Chrome expects a Lo-Fi response, but the server decided to send the
+    // full image, then clear the Server Lo-Fi Previews state bit.
+    WebURLRequest::PreviewsState new_previews_state =
+        GetResourceRequest().GetPreviewsState();
+
+    new_previews_state &= ~WebURLRequest::kServerLoFiOn;
+    if (new_previews_state == WebURLRequest::kPreviewsUnspecified)
+      new_previews_state = WebURLRequest::kPreviewsOff;
+
+    SetPreviewsState(new_previews_state);
+  }
 }
 
 bool ImageResource::ShouldShowPlaceholder() const {
+  if (RuntimeEnabledFeatures::ClientPlaceholdersForServerLoFiEnabled() &&
+      (GetResourceRequest().GetPreviewsState() &
+       WebURLRequest::kServerLoFiOn)) {
+    // If the runtime feature is enabled, show Client Lo-Fi placeholder images
+    // in place of Server Lo-Fi responses. This is done so that all Lo-Fi images
+    // have a consistent appearance.
+    return true;
+  }
+
   switch (placeholder_option_) {
     case PlaceholderOption::kShowAndReloadPlaceholderAlways:
     case PlaceholderOption::kShowAndDoNotReloadPlaceholder:
@@ -486,27 +539,21 @@
   return false;
 }
 
-static bool IsLoFiImage(const ImageResource& resource) {
-  if (resource.IsLoaded()) {
-    return resource.GetResponse()
-               .HttpHeaderField("chrome-proxy-content-transform")
-               .Contains("empty-image") ||
-           resource.GetResponse()
-               .HttpHeaderField("chrome-proxy")
-               .Contains("q=low");
-  }
-  return resource.GetResourceRequest().GetPreviewsState() &
-         WebURLRequest::kServerLoFiOn;
-}
-
 void ImageResource::ReloadIfLoFiOrPlaceholderImage(
     ResourceFetcher* fetcher,
     ReloadLoFiOrPlaceholderPolicy policy) {
   if (policy == kReloadIfNeeded && !ShouldReloadBrokenPlaceholder())
     return;
 
+  // If the image is loaded, then the |PreviewsState::kServerLoFiOn| bit should
+  // be set iff the image has Server Lo-Fi response headers.
+  DCHECK(!IsLoaded() ||
+         HasServerLoFiResponseHeaders(GetResponse()) ==
+             static_cast<bool>(GetResourceRequest().GetPreviewsState() &
+                               WebURLRequest::kServerLoFiOn));
+
   if (placeholder_option_ == PlaceholderOption::kDoNotReloadPlaceholder &&
-      !IsLoFiImage(*this))
+      !(GetResourceRequest().GetPreviewsState() & WebURLRequest::kServerLoFiOn))
     return;
 
   // Prevent clients and observers from being notified of completion while the
diff --git a/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp b/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp
index 1d00e49..50f4449 100644
--- a/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp
+++ b/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp
@@ -32,6 +32,7 @@
 
 #include <memory>
 #include "core/loader/resource/MockImageResourceObserver.h"
+#include "platform/RuntimeEnabledFeatures.h"
 #include "platform/SharedBuffer.h"
 #include "platform/exported/WrappedResourceResponse.h"
 #include "platform/graphics/BitmapImage.h"
@@ -45,6 +46,7 @@
 #include "platform/loader/testing/MockFetchContext.h"
 #include "platform/loader/testing/MockResourceClient.h"
 #include "platform/scheduler/test/fake_web_task_runner.h"
+#include "platform/testing/RuntimeEnabledFeaturesTestHelpers.h"
 #include "platform/testing/ScopedMockedURL.h"
 #include "platform/testing/TestingPlatformSupport.h"
 #include "platform/testing/UnitTestHelpers.h"
@@ -343,6 +345,11 @@
   return ResourceFetcher::Create(context, context->GetTaskRunner());
 }
 
+using ScopedClientPlaceholderForServerLoFiForTest =
+    ScopedRuntimeEnabledFeatureForTest<
+        RuntimeEnabledFeatures::ClientPlaceholdersForServerLoFiEnabled,
+        RuntimeEnabledFeatures::SetClientPlaceholdersForServerLoFiEnabled>;
+
 TEST(ImageResourceTest, MultipartImage) {
   ResourceFetcher* fetcher = CreateFetcher();
   KURL test_url(kParsedURLString, kTestURL);
@@ -560,7 +567,23 @@
   EXPECT_TRUE(image_resource->GetContent()->GetImage()->IsBitmapImage());
 }
 
-TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderAfterFinished) {
+class ImageResourceReloadTest : public ::testing::TestWithParam<bool> {
+ public:
+  ~ImageResourceReloadTest() override {}
+
+  bool IsClientPlaceholderForServerLoFiEnabled() const { return GetParam(); }
+
+  void SetUp() override {
+    scoped_show_placeholder_.reset(
+        new ScopedClientPlaceholderForServerLoFiForTest(GetParam()));
+  }
+
+ private:
+  std::unique_ptr<ScopedClientPlaceholderForServerLoFiForTest>
+      scoped_show_placeholder_;
+};
+
+TEST_P(ImageResourceReloadTest, ReloadIfLoFiOrPlaceholderAfterFinished) {
   KURL test_url(kParsedURLString, kTestURL);
   ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath());
   ImageResource* image_resource = ImageResource::CreateForTest(test_url);
@@ -589,7 +612,10 @@
   // The observer should have been notified that the image load completed.
   EXPECT_TRUE(observer->ImageNotifyFinishedCalled());
   EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnImageNotifyFinished());
-  EXPECT_TRUE(image_resource->GetContent()->GetImage()->IsBitmapImage());
+  EXPECT_NE(IsClientPlaceholderForServerLoFiEnabled(),
+            image_resource->GetContent()->GetImage()->IsBitmapImage());
+  EXPECT_EQ(IsClientPlaceholderForServerLoFiEnabled(),
+            image_resource->ShouldShowPlaceholder());
   EXPECT_EQ(kJpegImageWidth, image_resource->GetContent()->GetImage()->width());
   EXPECT_EQ(kJpegImageHeight,
             image_resource->GetContent()->GetImage()->height());
@@ -604,7 +630,8 @@
       WebCachePolicy::kBypassingCache, false);
 }
 
-TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderAfterFinishedWithOldHeaders) {
+TEST_P(ImageResourceReloadTest,
+       ReloadIfLoFiOrPlaceholderAfterFinishedWithOldHeaders) {
   KURL test_url(kParsedURLString, kTestURL);
   ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath());
   ImageResource* image_resource = ImageResource::CreateForTest(test_url);
@@ -632,7 +659,10 @@
   // The observer should have been notified that the image load completed.
   EXPECT_TRUE(observer->ImageNotifyFinishedCalled());
   EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnImageNotifyFinished());
-  EXPECT_TRUE(image_resource->GetContent()->GetImage()->IsBitmapImage());
+  EXPECT_NE(IsClientPlaceholderForServerLoFiEnabled(),
+            image_resource->GetContent()->GetImage()->IsBitmapImage());
+  EXPECT_EQ(IsClientPlaceholderForServerLoFiEnabled(),
+            image_resource->ShouldShowPlaceholder());
   EXPECT_EQ(kJpegImageWidth, image_resource->GetContent()->GetImage()->width());
   EXPECT_EQ(kJpegImageHeight,
             image_resource->GetContent()->GetImage()->height());
@@ -647,8 +677,8 @@
       WebCachePolicy::kBypassingCache, false);
 }
 
-TEST(ImageResourceTest,
-     ReloadIfLoFiOrPlaceholderAfterFinishedWithoutLoFiHeaders) {
+TEST_P(ImageResourceReloadTest,
+       ReloadIfLoFiOrPlaceholderAfterFinishedWithoutLoFiHeaders) {
   KURL test_url(kParsedURLString, kTestURL);
   ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath());
   ResourceRequest request(test_url);
@@ -693,7 +723,7 @@
   EXPECT_TRUE(image_resource->IsLoaded());
 }
 
-TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderViaResourceFetcher) {
+TEST_P(ImageResourceReloadTest, ReloadIfLoFiOrPlaceholderViaResourceFetcher) {
   ResourceFetcher* fetcher = CreateFetcher();
 
   KURL test_url(kParsedURLString, kTestURL);
@@ -735,7 +765,39 @@
   GetMemoryCache()->Remove(image_resource);
 }
 
-TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderDuringFetch) {
+TEST_P(ImageResourceReloadTest, ReloadIfLoFiOrPlaceholderBeforeResponse) {
+  KURL test_url(kParsedURLString, kTestURL);
+  ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath());
+
+  ResourceRequest request(test_url);
+  request.SetPreviewsState(WebURLRequest::kServerLoFiOn);
+  FetchParameters fetch_params(request);
+  ResourceFetcher* fetcher = CreateFetcher();
+
+  ImageResource* image_resource = ImageResource::Fetch(fetch_params, fetcher);
+  std::unique_ptr<MockImageResourceObserver> observer =
+      MockImageResourceObserver::Create(image_resource->GetContent());
+
+  EXPECT_FALSE(image_resource->ErrorOccurred());
+  EXPECT_EQ(IsClientPlaceholderForServerLoFiEnabled(),
+            image_resource->ShouldShowPlaceholder());
+
+  // Call reloadIfLoFiOrPlaceholderImage() while the image is still loading.
+  image_resource->ReloadIfLoFiOrPlaceholderImage(fetcher,
+                                                 Resource::kReloadAlways);
+
+  EXPECT_EQ(1, observer->ImageChangedCount());
+  EXPECT_EQ(0, observer->ImageWidthOnLastImageChanged());
+  // The observer should not have been notified of completion yet, since the
+  // image is still loading.
+  EXPECT_FALSE(observer->ImageNotifyFinishedCalled());
+
+  TestThatReloadIsStartedThenServeReload(
+      test_url, image_resource, image_resource->GetContent(), observer.get(),
+      WebCachePolicy::kBypassingCache, false);
+}
+
+TEST_P(ImageResourceReloadTest, ReloadIfLoFiOrPlaceholderDuringResponse) {
   KURL test_url(kParsedURLString, kTestURL);
   ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath());
 
@@ -749,9 +811,13 @@
       MockImageResourceObserver::Create(image_resource->GetContent());
 
   // Send the image response.
+  ResourceResponse resource_response(test_url, "image/jpeg", sizeof(kJpegImage),
+                                     g_null_atom);
+  resource_response.AddHTTPHeaderField("chrome-proxy-content-transform",
+                                       "empty-image");
+
   image_resource->Loader()->DidReceiveResponse(
-      WrappedResourceResponse(ResourceResponse(
-          test_url, "image/jpeg", sizeof(kJpegImage), g_null_atom)));
+      WrappedResourceResponse(resource_response));
   image_resource->Loader()->DidReceiveData(
       reinterpret_cast<const char*>(kJpegImage), sizeof(kJpegImage));
 
@@ -761,7 +827,8 @@
   EXPECT_EQ(1, observer->ImageChangedCount());
   EXPECT_EQ(kJpegImageWidth, observer->ImageWidthOnLastImageChanged());
   EXPECT_FALSE(observer->ImageNotifyFinishedCalled());
-  EXPECT_TRUE(image_resource->GetContent()->GetImage()->IsBitmapImage());
+  EXPECT_EQ(IsClientPlaceholderForServerLoFiEnabled(),
+            image_resource->ShouldShowPlaceholder());
   EXPECT_EQ(kJpegImageWidth, image_resource->GetContent()->GetImage()->width());
   EXPECT_EQ(kJpegImageHeight,
             image_resource->GetContent()->GetImage()->height());
@@ -781,7 +848,7 @@
       WebCachePolicy::kBypassingCache, false);
 }
 
-TEST(ImageResourceTest, ReloadIfLoFiOrPlaceholderForPlaceholder) {
+TEST_P(ImageResourceReloadTest, ReloadIfLoFiOrPlaceholderForPlaceholder) {
   KURL test_url(kParsedURLString, kTestURL);
   ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath());
 
@@ -805,6 +872,10 @@
       WebCachePolicy::kBypassingCache, false);
 }
 
+INSTANTIATE_TEST_CASE_P(/* no prefix */,
+                        ImageResourceReloadTest,
+                        ::testing::Bool());
+
 TEST(ImageResourceTest, SVGImage) {
   KURL url(kParsedURLString, "http://127.0.0.1:8000/foo");
   ImageResource* image_resource = ImageResource::CreateForTest(url);
@@ -1696,7 +1767,6 @@
   // Send the image response.
   ResourceResponse resource_response(NullURL(), "image/jpeg",
                                      sizeof(kJpegImage2), g_null_atom);
-  resource_response.AddHTTPHeaderField("chrome-proxy", "q=low");
 
   image_resource->ResponseReceived(resource_response, nullptr);
 
diff --git a/third_party/WebKit/Source/core/mojo/DEPS b/third_party/WebKit/Source/core/mojo/DEPS
index e6eb1f8..a3ad469 100644
--- a/third_party/WebKit/Source/core/mojo/DEPS
+++ b/third_party/WebKit/Source/core/mojo/DEPS
@@ -1,4 +1,3 @@
 include_rules = [
   "+mojo/public/cpp/system",
-  "+services/service_manager/public/cpp",
 ]
diff --git a/third_party/WebKit/Source/core/page/PagePopupClient.cpp b/third_party/WebKit/Source/core/page/PagePopupClient.cpp
index c3debeb..a805691 100644
--- a/third_party/WebKit/Source/core/page/PagePopupClient.cpp
+++ b/third_party/WebKit/Source/core/page/PagePopupClient.cpp
@@ -75,6 +75,25 @@
   addLiteral("\"", data);
 }
 
+void PagePopupClient::AddHTMLString(const String& str, SharedBuffer* data) {
+  StringBuilder builder;
+  builder.ReserveCapacity(str.length());
+  for (unsigned i = 0; i < str.length(); ++i) {
+    if (str[i] == '&') {
+      builder.Append("&amp;");
+    } else if (str[i] == '<') {
+      builder.Append("&lt;");
+    } else if (str[i] == '\'') {
+      builder.Append("&apos;");
+    } else if (str[i] == '"') {
+      builder.Append("&quot;");
+    } else {
+      builder.Append(str[i]);
+    }
+  }
+  AddString(builder.ToString(), data);
+}
+
 void PagePopupClient::AddProperty(const char* name,
                                   const String& value,
                                   SharedBuffer* data) {
diff --git a/third_party/WebKit/Source/core/page/PagePopupClient.h b/third_party/WebKit/Source/core/page/PagePopupClient.h
index eacfa99..7a51d09a 100644
--- a/third_party/WebKit/Source/core/page/PagePopupClient.h
+++ b/third_party/WebKit/Source/core/page/PagePopupClient.h
@@ -82,6 +82,7 @@
   // Helper functions to be used in PagePopupClient::writeDocument().
   static void AddString(const String&, SharedBuffer*);
   static void AddJavaScriptString(const String&, SharedBuffer*);
+  static void AddHTMLString(const String&, SharedBuffer*);
   static void AddProperty(const char* name, const String& value, SharedBuffer*);
   static void AddProperty(const char* name, int value, SharedBuffer*);
   static void AddProperty(const char* name, unsigned value, SharedBuffer*);
diff --git a/third_party/WebKit/Source/core/page/ValidationMessageOverlayDelegate.cpp b/third_party/WebKit/Source/core/page/ValidationMessageOverlayDelegate.cpp
index a18f19f..0f69ad2 100644
--- a/third_party/WebKit/Source/core/page/ValidationMessageOverlayDelegate.cpp
+++ b/third_party/WebKit/Source/core/page/ValidationMessageOverlayDelegate.cpp
@@ -163,12 +163,12 @@
                                  ? "<div dir=ltr id=main-message>"
                                  : "<div dir=rtl id=main-message>",
                              data);
-  PagePopupClient::AddString(message_, data);
+  PagePopupClient::AddHTMLString(message_, data);
   PagePopupClient::AddString(sub_message_dir_ == TextDirection::kLtr
                                  ? "</div><div dir=ltr id=sub-message>"
                                  : "</div><div dir=rtl id=sub-message>",
                              data);
-  PagePopupClient::AddString(sub_message_, data);
+  PagePopupClient::AddHTMLString(sub_message_, data);
   PagePopupClient::AddString(
       "</div></main>"
       "<div id=outer-arrow-bottom></div>"
diff --git a/third_party/WebKit/Source/core/paint/FilterPainter.cpp b/third_party/WebKit/Source/core/paint/FilterPainter.cpp
index c86f1a6..410ceea 100644
--- a/third_party/WebKit/Source/core/paint/FilterPainter.cpp
+++ b/third_party/WebKit/Source/core/paint/FilterPainter.cpp
@@ -57,8 +57,9 @@
   if (clip_rect.Rect() != painting_info.paint_dirty_rect ||
       clip_rect.HasRadius()) {
     clip_recorder_ = WTF::WrapUnique(new LayerClipRecorder(
-        context, layer.GetLayoutObject(), DisplayItem::kClipLayerFilter,
-        clip_rect, painting_info.root_layer, LayoutPoint(), paint_flags));
+        context, layer, DisplayItem::kClipLayerFilter, clip_rect,
+        painting_info.root_layer, LayoutPoint(), paint_flags,
+        layer.GetLayoutObject()));
   }
 
   if (!context.GetPaintController().DisplayItemConstructionIsDisabled()) {
diff --git a/third_party/WebKit/Source/core/paint/LayerClipRecorder.cpp b/third_party/WebKit/Source/core/paint/LayerClipRecorder.cpp
index 9befa968..ddb33be 100644
--- a/third_party/WebKit/Source/core/paint/LayerClipRecorder.cpp
+++ b/third_party/WebKit/Source/core/paint/LayerClipRecorder.cpp
@@ -16,15 +16,16 @@
 namespace blink {
 
 LayerClipRecorder::LayerClipRecorder(GraphicsContext& graphics_context,
-                                     const LayoutBoxModelObject& layout_object,
+                                     const PaintLayer& paint_layer,
                                      DisplayItem::Type clip_type,
                                      const ClipRect& clip_rect,
                                      const PaintLayer* clip_root,
                                      const LayoutPoint& fragment_offset,
                                      PaintLayerFlags paint_flags,
+                                     const DisplayItemClient& client,
                                      BorderRadiusClippingRule rule)
     : graphics_context_(graphics_context),
-      layout_object_(layout_object),
+      client_(client),
       clip_type_(clip_type) {
   if (RuntimeEnabledFeatures::SlimmingPaintV2Enabled())
     return;
@@ -34,16 +35,16 @@
        paint_flags & kPaintLayerPaintingAncestorClippingMaskPhase);
   Vector<FloatRoundedRect> rounded_rects;
   if (clip_root && (clip_rect.HasRadius() || painting_masks)) {
-    CollectRoundedRectClips(*layout_object.Layer(), clip_root, fragment_offset,
+    CollectRoundedRectClips(paint_layer, clip_root, fragment_offset,
                             painting_masks, rule, rounded_rects);
   }
 
   graphics_context_.GetPaintController().CreateAndAppend<ClipDisplayItem>(
-      layout_object, clip_type_, snapped_clip_rect, rounded_rects);
+      client_, clip_type_, snapped_clip_rect, rounded_rects);
 }
 
-static bool InContainingBlockChain(PaintLayer* start_layer,
-                                   PaintLayer* end_layer) {
+static bool InContainingBlockChain(const PaintLayer* start_layer,
+                                   const PaintLayer* end_layer) {
   if (start_layer == end_layer)
     return true;
 
@@ -60,7 +61,7 @@
 }
 
 void LayerClipRecorder::CollectRoundedRectClips(
-    PaintLayer& paint_layer,
+    const PaintLayer& paint_layer,
     const PaintLayer* clip_root,
     const LayoutPoint& offset_within_layer,
     bool cross_composited_scrollers,
@@ -70,9 +71,9 @@
   // up our layer chain applying the clips from any layers with overflow. The
   // condition for being able to apply these clips is that the overflow object
   // be in our containing block chain so we check that also.
-  for (PaintLayer* layer = rule == kIncludeSelfForBorderRadius
-                               ? &paint_layer
-                               : paint_layer.Parent();
+  for (const PaintLayer* layer = rule == kIncludeSelfForBorderRadius
+                                     ? &paint_layer
+                                     : paint_layer.Parent();
        layer; layer = layer->Parent()) {
     // Composited scrolling layers handle border-radius clip in the compositor
     // via a mask layer. We do not want to apply a border-radius clip to the
@@ -109,7 +110,7 @@
   if (RuntimeEnabledFeatures::SlimmingPaintV2Enabled())
     return;
   graphics_context_.GetPaintController().EndItem<EndClipDisplayItem>(
-      layout_object_, DisplayItem::ClipTypeToEndClipType(clip_type_));
+      client_, DisplayItem::ClipTypeToEndClipType(clip_type_));
 }
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/paint/LayerClipRecorder.h b/third_party/WebKit/Source/core/paint/LayerClipRecorder.h
index 0a435ed3..62f33fd 100644
--- a/third_party/WebKit/Source/core/paint/LayerClipRecorder.h
+++ b/third_party/WebKit/Source/core/paint/LayerClipRecorder.h
@@ -16,7 +16,6 @@
 
 class ClipRect;
 class GraphicsContext;
-class LayoutBoxModelObject;
 
 class CORE_EXPORT LayerClipRecorder {
   USING_FAST_MALLOC(LayerClipRecorder);
@@ -43,12 +42,13 @@
   // Would be nice to clean up this.
   explicit LayerClipRecorder(
       GraphicsContext&,
-      const LayoutBoxModelObject&,
+      const PaintLayer&,
       DisplayItem::Type,
       const ClipRect&,
       const PaintLayer* clip_root,
       const LayoutPoint& fragment_offset,
       PaintLayerFlags,
+      const DisplayItemClient&,
       BorderRadiusClippingRule = kIncludeSelfForBorderRadius);
 
   ~LayerClipRecorder();
@@ -64,7 +64,7 @@
   // The BorderRadiusClippingRule defines whether clips on the PaintLayer itself
   // are included. Output is appended to rounded_rect_clips.
   static void CollectRoundedRectClips(
-      PaintLayer&,
+      const PaintLayer&,
       const PaintLayer* clip_root,
       const LayoutPoint& offset_within_layer,
       bool cross_composited_scrollers,
@@ -73,7 +73,7 @@
 
  private:
   GraphicsContext& graphics_context_;
-  const LayoutBoxModelObject& layout_object_;
+  const DisplayItemClient& client_;
   DisplayItem::Type clip_type_;
 };
 
diff --git a/third_party/WebKit/Source/core/paint/LayerClipRecorderTest.cpp b/third_party/WebKit/Source/core/paint/LayerClipRecorderTest.cpp
index 46032cf..18c0a91 100644
--- a/third_party/WebKit/Source/core/paint/LayerClipRecorderTest.cpp
+++ b/third_party/WebKit/Source/core/paint/LayerClipRecorderTest.cpp
@@ -31,9 +31,10 @@
   LayoutRect rect(1, 1, 9, 9);
   ClipRect clip_rect(rect);
   LayerClipRecorder layer_clip_recorder(
-      context, layout_view.Compositor()->RootLayer()->GetLayoutObject(),
+      context, *layout_view.Compositor()->RootLayer(),
       DisplayItem::kClipLayerForeground, clip_rect, 0, LayoutPoint(),
-      PaintLayerFlags());
+      PaintLayerFlags(),
+      layout_view.Compositor()->RootLayer()->GetLayoutObject());
 }
 
 void DrawRectInClip(GraphicsContext& context,
@@ -43,9 +44,10 @@
   IntRect rect(1, 1, 9, 9);
   ClipRect clip_rect((LayoutRect(rect)));
   LayerClipRecorder layer_clip_recorder(
-      context, layout_view.Compositor()->RootLayer()->GetLayoutObject(),
+      context, *layout_view.Compositor()->RootLayer(),
       DisplayItem::kClipLayerForeground, clip_rect, 0, LayoutPoint(),
-      PaintLayerFlags());
+      PaintLayerFlags(),
+      layout_view.Compositor()->RootLayer()->GetLayoutObject());
   if (!LayoutObjectDrawingRecorder::UseCachedDrawingIfPossible(
           context, layout_view, phase)) {
     LayoutObjectDrawingRecorder drawing_recorder(context, layout_view, phase,
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp b/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp
index 4ba3f1d..163f586 100644
--- a/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp
@@ -6,6 +6,7 @@
 
 #include "core/frame/LocalFrameView.h"
 #include "core/layout/LayoutView.h"
+#include "core/layout/compositing/CompositedLayerMapping.h"
 #include "core/paint/ClipPathClipper.h"
 #include "core/paint/FilterPainter.h"
 #include "core/paint/LayerClipRecorder.h"
@@ -780,10 +781,11 @@
         clip_rect_for_fragment.MoveBy(fragment.pagination_offset);
       clip_rect_for_fragment.Intersect(fragment.background_rect);
       if (NeedsToClip(painting_info, clip_rect_for_fragment, paint_flags)) {
-        clip_recorder.emplace(context, parent_layer->GetLayoutObject(),
+        clip_recorder.emplace(context, *parent_layer,
                               DisplayItem::kClipLayerParent,
                               clip_rect_for_fragment, painting_info.root_layer,
-                              fragment.pagination_offset, paint_flags);
+                              fragment.pagination_offset, paint_flags,
+                              parent_layer->GetLayoutObject());
       }
     }
     if (PaintFragmentByApplyingTransform(context, painting_info, paint_flags,
@@ -924,11 +926,11 @@
     Optional<LayerClipRecorder> clip_recorder;
     if (NeedsToClip(local_painting_info, fragment.background_rect,
                     paint_flags)) {
-      clip_recorder.emplace(context, paint_layer_.GetLayoutObject(),
-                            DisplayItem::kClipLayerOverflowControls,
-                            fragment.background_rect,
-                            local_painting_info.root_layer,
-                            fragment.pagination_offset, paint_flags);
+      clip_recorder.emplace(
+          context, paint_layer_, DisplayItem::kClipLayerOverflowControls,
+          fragment.background_rect, local_painting_info.root_layer,
+          fragment.pagination_offset, paint_flags,
+          paint_layer_.GetLayoutObject());
     }
 
     Optional<ScrollRecorder> scroll_recorder;
@@ -959,6 +961,7 @@
     ClipState clip_state) {
   DCHECK(paint_layer_.IsSelfPaintingLayer());
 
+  DisplayItemClient* client = &paint_layer_.GetLayoutObject();
   Optional<LayerClipRecorder> clip_recorder;
   if (clip_state != kHasClipped && painting_info.clip_to_dirty_rect &&
       (NeedsToClip(painting_info, clip_rect, paint_flags) ||
@@ -978,6 +981,10 @@
           // The ancestor is the thing that needs to clip, so do not include
           // this layer's clips.
           clipping_rule = LayerClipRecorder::kDoNotIncludeSelfForBorderRadius;
+          // The ancestor clipping mask may have a larger visual rect than
+          // paint_layer_, since it includes ancestor clips.
+          client = paint_layer_.GetCompositedLayerMapping()
+                       ->AncestorClippingMaskLayer();
           break;
         }
       default:
@@ -985,10 +992,9 @@
         break;
     }
 
-    clip_recorder.emplace(context, paint_layer_.GetLayoutObject(), clip_type,
-                          clip_rect, painting_info.root_layer,
-                          fragment.pagination_offset, paint_flags,
-                          clipping_rule);
+    clip_recorder.emplace(context, paint_layer_, clip_type, clip_rect,
+                          painting_info.root_layer, fragment.pagination_offset,
+                          paint_flags, *client, clipping_rule);
   }
 
   // If we are painting a mask for any reason and we have already processed the
@@ -996,7 +1002,7 @@
   // We know that the mask just needs the area bounded by the clip rects to be
   // filled with black.
   if (clip_recorder && phase == kPaintPhaseClippingMask) {
-    FillMaskingFragment(context, clip_rect);
+    FillMaskingFragment(context, clip_rect, *client);
     return;
   }
 
@@ -1063,11 +1069,11 @@
   if (should_clip &&
       NeedsToClip(local_painting_info, layer_fragments[0].foreground_rect,
                   paint_flags)) {
-    clip_recorder.emplace(context, paint_layer_.GetLayoutObject(),
-                          DisplayItem::kClipLayerForeground,
-                          layer_fragments[0].foreground_rect,
-                          local_painting_info.root_layer,
-                          layer_fragments[0].pagination_offset, paint_flags);
+    clip_recorder.emplace(
+        context, paint_layer_, DisplayItem::kClipLayerForeground,
+        layer_fragments[0].foreground_rect, local_painting_info.root_layer,
+        layer_fragments[0].pagination_offset, paint_flags,
+        paint_layer_.GetLayoutObject());
     clip_state = kHasClipped;
   }
 
@@ -1226,15 +1232,15 @@
 }
 
 void PaintLayerPainter::FillMaskingFragment(GraphicsContext& context,
-                                            const ClipRect& clip_rect) {
-  const LayoutObject& layout_object = paint_layer_.GetLayoutObject();
-  if (LayoutObjectDrawingRecorder::UseCachedDrawingIfPossible(
-          context, layout_object, kPaintPhaseClippingMask))
+                                            const ClipRect& clip_rect,
+                                            const DisplayItemClient& client) {
+  DisplayItem::Type type =
+      DisplayItem::PaintPhaseToDrawingType(kPaintPhaseClippingMask);
+  if (DrawingRecorder::UseCachedDrawingIfPossible(context, client, type))
     return;
 
   IntRect snapped_clip_rect = PixelSnappedIntRect(clip_rect.Rect());
-  LayoutObjectDrawingRecorder drawing_recorder(
-      context, layout_object, kPaintPhaseClippingMask, snapped_clip_rect);
+  DrawingRecorder drawing_recorder(context, client, type, snapped_clip_rect);
   context.FillRect(snapped_clip_rect, Color::kBlack);
 }
 
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerPainter.h b/third_party/WebKit/Source/core/paint/PaintLayerPainter.h
index 771aaaa4..be10a76 100644
--- a/third_party/WebKit/Source/core/paint/PaintLayerPainter.h
+++ b/third_party/WebKit/Source/core/paint/PaintLayerPainter.h
@@ -14,6 +14,7 @@
 namespace blink {
 
 class ClipRect;
+class DisplayItemClient;
 class PaintLayer;
 class GraphicsContext;
 class LayoutPoint;
@@ -136,7 +137,9 @@
                                           const PaintLayerPaintingInfo&,
                                           PaintLayerFlags);
 
-  void FillMaskingFragment(GraphicsContext&, const ClipRect&);
+  void FillMaskingFragment(GraphicsContext&,
+                           const ClipRect&,
+                           const DisplayItemClient&);
 
   static bool NeedsToClip(const PaintLayerPaintingInfo& local_painting_info,
                           const ClipRect&,
diff --git a/third_party/WebKit/Source/core/testing/DummyPageHolder.cpp b/third_party/WebKit/Source/core/testing/DummyPageHolder.cpp
index d2a9797..0a20520 100644
--- a/third_party/WebKit/Source/core/testing/DummyPageHolder.cpp
+++ b/third_party/WebKit/Source/core/testing/DummyPageHolder.cpp
@@ -46,18 +46,16 @@
     const IntSize& initial_view_size,
     Page::PageClients* page_clients,
     LocalFrameClient* local_frame_client,
-    FrameSettingOverrideFunction setting_overrider,
-    InterfaceProvider* interface_provider) {
-  return WTF::WrapUnique(
-      new DummyPageHolder(initial_view_size, page_clients, local_frame_client,
-                          setting_overrider, interface_provider));
+    FrameSettingOverrideFunction setting_overrider) {
+  return WTF::WrapUnique(new DummyPageHolder(
+      initial_view_size, page_clients, local_frame_client, setting_overrider));
 }
 
-DummyPageHolder::DummyPageHolder(const IntSize& initial_view_size,
-                                 Page::PageClients* page_clients_argument,
-                                 LocalFrameClient* local_frame_client,
-                                 FrameSettingOverrideFunction setting_overrider,
-                                 InterfaceProvider* interface_provider) {
+DummyPageHolder::DummyPageHolder(
+    const IntSize& initial_view_size,
+    Page::PageClients* page_clients_argument,
+    LocalFrameClient* local_frame_client,
+    FrameSettingOverrideFunction setting_overrider) {
   Page::PageClients page_clients;
   if (!page_clients_argument) {
     FillWithEmptyClients(page_clients);
@@ -81,8 +79,7 @@
   if (!local_frame_client_)
     local_frame_client_ = EmptyLocalFrameClient::Create();
 
-  frame_ = LocalFrame::Create(local_frame_client_.Get(), *page_, nullptr,
-                              interface_provider);
+  frame_ = LocalFrame::Create(local_frame_client_.Get(), *page_, nullptr);
   frame_->SetView(LocalFrameView::Create(*frame_, initial_view_size));
   frame_->View()->GetPage()->GetVisualViewport().SetSize(initial_view_size);
   frame_->Init();
diff --git a/third_party/WebKit/Source/core/testing/DummyPageHolder.h b/third_party/WebKit/Source/core/testing/DummyPageHolder.h
index 6c90565..b43f93d 100644
--- a/third_party/WebKit/Source/core/testing/DummyPageHolder.h
+++ b/third_party/WebKit/Source/core/testing/DummyPageHolder.h
@@ -42,7 +42,6 @@
 namespace blink {
 
 class Document;
-class InterfaceProvider;
 class IntSize;
 class LocalFrame;
 class LocalFrameView;
@@ -72,8 +71,7 @@
       const IntSize& initial_view_size = IntSize(),
       Page::PageClients* = 0,
       LocalFrameClient* = nullptr,
-      FrameSettingOverrideFunction = nullptr,
-      InterfaceProvider* = nullptr);
+      FrameSettingOverrideFunction = nullptr);
   ~DummyPageHolder();
 
   Page& GetPage() const;
@@ -85,8 +83,7 @@
   DummyPageHolder(const IntSize& initial_view_size,
                   Page::PageClients*,
                   LocalFrameClient*,
-                  FrameSettingOverrideFunction setting_overrider,
-                  InterfaceProvider* = nullptr);
+                  FrameSettingOverrideFunction setting_overrider);
 
   Persistent<Page> page_;
 
diff --git a/third_party/WebKit/Source/core/testing/Internals.cpp b/third_party/WebKit/Source/core/testing/Internals.cpp
index 7f678f2..73fae78a 100644
--- a/third_party/WebKit/Source/core/testing/Internals.cpp
+++ b/third_party/WebKit/Source/core/testing/Internals.cpp
@@ -3414,4 +3414,8 @@
   MemoryCoordinator::SetIsLowEndDeviceForTesting(is_low_end_device);
 }
 
+bool Internals::isLowEndDevice() const {
+  return MemoryCoordinator::IsLowEndDevice();
+}
+
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/testing/Internals.h b/third_party/WebKit/Source/core/testing/Internals.h
index ca564bf9..ebbf5ca 100644
--- a/third_party/WebKit/Source/core/testing/Internals.h
+++ b/third_party/WebKit/Source/core/testing/Internals.h
@@ -567,6 +567,8 @@
 
   // Overrides if the device is low-end (low on memory).
   void setIsLowEndDevice(bool);
+  // Returns if the device is low-end.
+  bool isLowEndDevice() const;
 
  private:
   explicit Internals(ExecutionContext*);
diff --git a/third_party/WebKit/Source/core/testing/Internals.idl b/third_party/WebKit/Source/core/testing/Internals.idl
index 5a9ef15..1a30806 100644
--- a/third_party/WebKit/Source/core/testing/Internals.idl
+++ b/third_party/WebKit/Source/core/testing/Internals.idl
@@ -394,4 +394,5 @@
     void crash();
 
     void setIsLowEndDevice(boolean isLowEndDevice);
+    boolean isLowEndDevice();
 };
diff --git a/third_party/WebKit/Source/core/timing/PerformanceTest.cpp b/third_party/WebKit/Source/core/timing/PerformanceTest.cpp
index c26eb671..b1d87166 100644
--- a/third_party/WebKit/Source/core/timing/PerformanceTest.cpp
+++ b/third_party/WebKit/Source/core/timing/PerformanceTest.cpp
@@ -45,7 +45,7 @@
     auto* monitor = GetFrame()->GetPerformanceMonitor();
     monitor->WillExecuteScript(GetDocument());
     monitor->DidExecuteScript();
-    monitor->DidProcessTask(nullptr, 0, 1);
+    monitor->DidProcessTask(0, 1);
   }
 
   LocalFrame* GetFrame() const { return &page_holder_->GetFrame(); }
diff --git a/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.cpp b/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.cpp
index 448d3ce..267fb29 100644
--- a/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.cpp
+++ b/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.cpp
@@ -36,7 +36,7 @@
 #include "core/HTMLNames.h"
 #include "core/XMLNSNames.h"
 #include "core/dom/CDATASection.h"
-#include "core/dom/ClassicScript.h"
+#include "core/dom/ClassicPendingScript.h"
 #include "core/dom/Comment.h"
 #include "core/dom/Document.h"
 #include "core/dom/DocumentFragment.h"
@@ -1136,18 +1136,10 @@
 
     if (script_loader->ReadyToBeParserExecuted()) {
       // 5th Clause, Step 23 of https://html.spec.whatwg.org/#prepare-a-script
-      switch (script_loader->ExecuteScript(ClassicScript::Create(
-          ScriptSourceCode(script_element_base->TextFromChildren(),
-                           GetDocument()->Url(), script_start_position_)))) {
-        case ScriptLoader::ExecuteScriptResult::kShouldFireErrorEvent:
-          script_loader->DispatchErrorEvent();
-          return;
-        case ScriptLoader::ExecuteScriptResult::kShouldFireLoadEvent:
-          // The load event is not fired because this is an inline script.
-          break;
-        case ScriptLoader::ExecuteScriptResult::kShouldFireNone:
-          break;
-      }
+      script_loader->ExecuteScriptBlock(
+          ClassicPendingScript::Create(script_element_base,
+                                       script_start_position_),
+          GetDocument()->Url());
     } else if (script_loader->WillBeParserExecuted()) {
       // 1st/2nd Clauses, Step 23 of
       // https://html.spec.whatwg.org/#prepare-a-script
diff --git a/third_party/WebKit/Source/devtools/front_end/accessibility/ARIAConfig.js b/third_party/WebKit/Source/devtools/front_end/accessibility/ARIAConfig.js
index 217f6e7..909b0136 100644
--- a/third_party/WebKit/Source/devtools/front_end/accessibility/ARIAConfig.js
+++ b/third_party/WebKit/Source/devtools/front_end/accessibility/ARIAConfig.js
@@ -1,3 +1,7 @@
+// 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.
+
 Accessibility.ARIAMetadata._config = {
   'attributes': {
     'aria-activedescendant': {'type': 'IDREF'},
@@ -5,31 +9,46 @@
     'aria-autocomplete': {'default': 'none', 'enum': ['inline', 'list', 'both', 'none'], 'type': 'token'},
     'aria-busy': {'default': 'false', 'type': 'boolean'},
     'aria-checked': {'default': 'undefined', 'enum': ['true', 'false', 'mixed', 'undefined'], 'type': 'token'},
+    'aria-colcount': {'type': 'integer'},
+    'aria-colindex': {'type': 'integer'},
+    'aria-colspan': {'type': 'integer'},
     'aria-controls': {'type': 'IDREF_list'},
+    'aria-current':
+        {'default': 'false', 'enum': ['page', 'step', 'location', 'date', 'time', 'true', 'false'], 'type': 'token'},
     'aria-describedby': {'type': 'IDREF_list'},
+    'aria-details': {'type': 'IDREF'},
     'aria-disabled': {'default': 'false', 'type': 'boolean'},
     'aria-dropeffect':
         {'default': 'none', 'enum': ['copy', 'move', 'link', 'execute', 'popup', 'none'], 'type': 'token_list'},
+    'aria-errormessage': {'type': 'IDREF'},
     'aria-expanded': {'default': 'undefined', 'enum': ['true', 'false', 'undefined'], 'type': 'token'},
     'aria-flowto': {'type': 'IDREF_list'},
     'aria-grabbed': {'default': 'undefined', 'enum': ['true', 'false', 'undefined'], 'type': 'token'},
-    'aria-haspopup': {'default': 'false', 'type': 'boolean'},
-    'aria-hidden': {'default': 'false', 'type': 'boolean'},
+    'aria-haspopup':
+        {'default': 'false', 'enum': ['false', 'true', 'menu', 'listbox', 'tree', 'grid', 'dialog'], 'type': 'token'},
+    'aria-hidden': {'default': 'undefined', 'enum': ['true', 'false', 'undefined'], 'type': 'token'},
     'aria-invalid': {'default': 'false', 'enum': ['grammar', 'false', 'spelling', 'true'], 'type': 'token'},
+    'aria-keyshortcuts': {'type': 'string'},
     'aria-label': {'type': 'string'},
     'aria-labelledby': {'type': 'IDREF_list'},
     'aria-level': {'type': 'integer'},
     'aria-live': {'default': 'off', 'enum': ['off', 'polite', 'assertive'], 'type': 'token'},
+    'aria-modal': {'default': 'false', 'type': 'boolean'},
     'aria-multiline': {'default': 'false', 'type': 'boolean'},
     'aria-multiselectable': {'default': 'false', 'type': 'boolean'},
-    'aria-orientation': {'default': 'vertical', 'enum': ['horizontal', 'vertical'], 'type': 'token'},
+    'aria-orientation': {'default': 'undefined', 'enum': ['horizontal', 'undefined', 'vertical'], 'type': 'token'},
     'aria-owns': {'type': 'IDREF_list'},
+    'aria-placeholder': {'type': 'string'},
     'aria-posinset': {'type': 'integer'},
     'aria-pressed': {'default': 'undefined', 'enum': ['true', 'false', 'mixed', 'undefined'], 'type': 'token'},
     'aria-readonly': {'default': 'false', 'type': 'boolean'},
     'aria-relevant':
         {'default': 'additions text', 'enum': ['additions', 'removals', 'text', 'all'], 'type': 'token_list'},
     'aria-required': {'default': 'false', 'type': 'boolean'},
+    'aria-roledescription': {'type': 'string'},
+    'aria-rowcount': {'type': 'integer'},
+    'aria-rowindex': {'type': 'integer'},
+    'aria-rowspan': {'type': 'integer'},
     'aria-selected': {'default': 'undefined', 'enum': ['true', 'false', 'undefined'], 'type': 'token'},
     'aria-setsize': {'type': 'integer'},
     'aria-sort': {'default': 'none', 'enum': ['ascending', 'descending', 'none', 'other'], 'type': 'token'},
@@ -40,29 +59,56 @@
     'tabindex': {'type': 'integer'}
   },
   'roles': {
-    'alert': {'nameFrom': ['author'], 'superclasses': ['region']},
-    'alertdialog': {'nameFrom': ['author'], 'superclasses': ['alert', 'dialog']},
-    'application': {'nameFrom': ['author'], 'superclasses': ['landmark']},
-    'article': {'nameFrom': ['author'], 'superclasses': ['document', 'region']},
+    'alert': {
+      'nameFrom': ['author'],
+      'superclasses': ['section'],
+      'implicitValues': {'aria-live': 'assertive', 'aria-atomic': 'true'}
+    },
+    'alertdialog': {'nameFrom': ['author'], 'superclasses': ['alert', 'dialog'], 'nameRequired': true},
+    'application': {'nameFrom': ['author'], 'superclasses': ['structure'], 'nameRequired': true},
+    'article': {
+      'nameFrom': ['author'],
+      'superclasses': ['document'],
+      'supportedAttributes': ['aria-posinset', 'aria-setsize']
+    },
     'banner': {'nameFrom': ['author'], 'superclasses': ['landmark']},
     'button': {
       'nameFrom': ['contents', 'author'],
       'superclasses': ['command'],
-      'supportedAttributes': ['aria-expanded', 'aria-pressed']
+      'supportedAttributes': ['aria-expanded', 'aria-pressed'],
+      'nameRequired': true,
+      'childrenPresentational': true
     },
-    'checkbox': {'nameFrom': ['contents', 'author'], 'requiredAttributes': ['aria-checked'], 'superclasses': ['input']},
+    'cell': {
+      'namefrom': ['contents', 'author'],
+      'scope': 'row',
+      'superclasses': ['section'],
+      'supportedAttributes': ['aria-colindex', 'aria-colspan', 'aria-rowindex', 'aria-rowspan']
+    },
+    'checkbox': {
+      'nameFrom': ['contents', 'author'],
+      'requiredAttributes': ['aria-checked'],
+      'superclasses': ['input'],
+      'supportedAttributes': ['aria-readonly'],
+      'nameRequired': true,
+      'implicitValues': {'aria-checked': false}
+    },
     'columnheader': {
       'nameFrom': ['contents', 'author'],
       'scope': ['row'],
       'superclasses': ['gridcell', 'sectionhead', 'widget'],
-      'supportedAttributes': ['aria-sort']
+      'supportedAttributes': ['aria-sort'],
+      'nameRequired': true
     },
     'combobox': {
-      'mustContain': ['listbox', 'textbox'],
+      // TODO(aboxhall): Follow up with Nektarios and Aaron regarding role on textbox
+      'mustContain': ['textbox'],
       'nameFrom': ['author'],
-      'requiredAttributes': ['aria-expanded'],
+      'requiredAttributes': ['aria-controls', 'aria-expanded'],
       'superclasses': ['select'],
-      'supportedAttributes': ['aria-autocomplete', 'aria-required']
+      'supportedAttributes': ['aria-autocomplete', 'aria-readonly', 'aria-required'],
+      'nameRequired': true,
+      'implicitValues': {'aria-expanded': 'false', 'aria-haspopup': 'listbox'}
     },
     'command': {'abstract': true, 'nameFrom': ['author'], 'superclasses': ['widget']},
     'complementary': {'nameFrom': ['author'], 'superclasses': ['landmark']},
@@ -74,74 +120,151 @@
     },
     'contentinfo': {'nameFrom': ['author'], 'superclasses': ['landmark']},
     'definition': {'nameFrom': ['author'], 'superclasses': ['section']},
-    'dialog': {'nameFrom': ['author'], 'superclasses': ['window']},
-    'directory': {'nameFrom': ['contents', 'author'], 'superclasses': ['list']},
-    'document': {'nameFrom': ['author'], 'superclasses': ['structure'], 'supportedAttributes': ['aria-expanded']},
+    'dialog': {'nameFrom': ['author'], 'superclasses': ['window'], 'nameRequired': true},
+    'directory': {'nameFrom': ['author'], 'superclasses': ['list']},
+    'document': {
+      'nameFrom': ['author'],
+      'superclasses': ['structure'],
+      'supportedAttributes': ['aria-expanded'],
+      'nameRequired': false
+    },
+    'feed': {'nameFrom': ['author'], 'superclasses': ['list'], 'mustContain': ['article'], 'nameRequired': false},
+    'figure': {'namefrom': ['author'], 'superclasses': ['section'], 'nameRequired': false},
     'form': {'nameFrom': ['author'], 'superclasses': ['landmark']},
     'grid': {
-      'mustContain': ['row', 'rowgroup', 'row'],
       'nameFrom': ['author'],
-      'superclasses': ['composite', 'region'],
-      'supportedAttributes': ['aria-level', 'aria-multiselectable', 'aria-readonly']
+      'superclasses': ['composite', 'table'],
+      // TODO(aboxhall): Figure out how to express "rowgroup --> row" here.
+      'mustContain': ['row'],
+      'supportedAttributes': ['aria-level', 'aria-multiselectable', 'aria-readonly'],
+      'nameRequired': true
     },
     'gridcell': {
       'nameFrom': ['contents', 'author'],
       'scope': ['row'],
-      'superclasses': ['section', 'widget'],
-      'supportedAttributes': ['aria-readonly', 'aria-required', 'aria-selected']
+      'superclasses': ['cell', 'widget'],
+      'supportedAttributes': ['aria-readonly', 'aria-required', 'aria-selected'],
+      'nameRequired': true
     },
     'group': {'nameFrom': ['author'], 'superclasses': ['section'], 'supportedAttributes': ['aria-activedescendant']},
-    'heading': {'superclasses': ['sectionhead'], 'supportedAttributes': ['aria-level']},
-    'img': {'nameFrom': ['author'], 'superclasses': ['section']},
+    'heading': {
+      'namefrom': ['contents', 'author'],
+      'superclasses': ['sectionhead'],
+      'supportedAttributes': ['aria-level'],
+      'nameRequired': true,
+      'implicitValues': {'aria-level': '2'}
+    },
+    'img': {'nameFrom': ['author'], 'superclasses': ['section'], 'nameRequired': true, 'childrenPresentational': true},
     'input': {'abstract': true, 'nameFrom': ['author'], 'superclasses': ['widget']},
-    'landmark': {'abstract': true, 'nameFrom': ['contents', 'author'], 'superclasses': ['region']},
-    'link': {'nameFrom': ['contents', 'author'], 'superclasses': ['command'], 'supportedAttributes': ['aria-expanded']},
-    'list': {'mustContain': ['group', 'listitem', 'listitem'], 'nameFrom': ['author'], 'superclasses': ['region']},
-    'listbox': {
-      'mustContain': ['option'],
+    'landmark': {'abstract': true, 'nameFrom': ['author'], 'superclasses': ['section'], 'nameRequired': false},
+    'link': {
+      'nameFrom': ['contents', 'author'],
+      'superclasses': ['command'],
+      'supportedAttributes': ['aria-expanded'],
+      'nameRequired': true
+    },
+    'list': {
+      // TODO(aboxhall): Figure out how to express "group --> listitem"
+      'mustContain': ['listitem'],
       'nameFrom': ['author'],
-      'superclasses': ['list', 'select'],
-      'supportedAttributes': ['aria-multiselectable', 'aria-required']
+      'superclasses': ['section'],
+      'implicitValues': {'aria-orientation': 'vertical'}
+    },
+    'listbox': {
+      'nameFrom': ['author'],
+      'superclasses': ['select'],
+      'mustContain': ['option'],
+      'supportedAttributes': ['aria-multiselectable', 'aria-readonly', 'aria-required'],
+      'nameRequired': true,
+      'implicitValues': {'aria-orientation': 'vertical'},
     },
     'listitem': {
-      'nameFrom': ['contents', 'author'],
-      'scope': ['list'],
+      'nameFrom': ['author'],
       'superclasses': ['section'],
+      'scope': ['group', 'list'],
       'supportedAttributes': ['aria-level', 'aria-posinset', 'aria-setsize']
     },
-    'log': {'nameFrom': ['author'], 'superclasses': ['region']},
+    'log': {
+      'nameFrom': ['author'],
+      'superclasses': ['section'],
+      'nameRequired': true,
+      'implicitValues': {'aria-live': 'polite'}
+    },
     'main': {'nameFrom': ['author'], 'superclasses': ['landmark']},
-    'marquee': {'superclasses': ['section']},
-    'math': {'nameFrom': ['author'], 'superclasses': ['section']},
+    'marquee': {'nameFrom': ['author'], 'superclasses': ['section'], 'nameRequired': true},
+    'math': {
+      'nameFrom': ['author'],
+      'superclasses': ['section'],
+      'nameRequired': true,
+      // TODO(aboxhall/aleventhal): this is what the spec says, but seems wrong.
+      childrenPresentational: true
+    },
     'menu': {
       'mustContain': ['group', 'menuitemradio', 'menuitem', 'menuitemcheckbox', 'menuitemradio'],
       'nameFrom': ['author'],
-      'superclasses': ['list', 'select']
+      'superclasses': ['select'],
+      'implicitValues': {'aria-orientation': 'vertical'}
     },
-    'menubar': {'nameFrom': ['author'], 'superclasses': ['menu']},
-    'menuitem': {'nameFrom': ['contents', 'author'], 'scope': ['menu', 'menubar'], 'superclasses': ['command']},
-    'menuitemcheckbox':
-        {'nameFrom': ['contents', 'author'], 'scope': ['menu', 'menubar'], 'superclasses': ['checkbox', 'menuitem']},
-    'menuitemradio': {
+    'menubar': {
+      'nameFrom': ['author'],
+      'superclasses': ['menu'],
+      // TODO(aboxhall): figure out how to express "group --> {menuitem, menuitemradio, menuitemcheckbox}"
+      'mustContain': ['menuitem', 'menuitemradio', 'menuitemcheckbox'],
+      'implicitValues': {'aria-orientation': 'horizontal'}
+    },
+    'menuitem': {
+      'nameFrom': ['contents', 'author'],
+      'scope': ['group', 'menu', 'menubar'],
+      'superclasses': ['command'],
+      'nameRequired': true
+    },
+    'menuitemcheckbox': {
       'nameFrom': ['contents', 'author'],
       'scope': ['menu', 'menubar'],
-      'superclasses': ['menuitemcheckbox', 'radio']
+      'superclasses': ['checkbox', 'menuitem'],
+      'nameRequired': true,
+      'childrenPresentational': true,
+      'implicitValues': {'aria-checked': false}
+    },
+    'menuitemradio': {
+      'nameFrom': ['contents', 'author'],
+      'scope': ['menu', 'menubar', 'group'],
+      'superclasses': ['menuitemcheckbox', 'radio'],
+      'nameRequired': true,
+      'childrenPresentational': true,
+      'implicitValues': {'aria-checked': false}
     },
     'navigation': {'nameFrom': ['author'], 'superclasses': ['landmark']},
+    'none': {'superclasses': ['structure']},
     'note': {'nameFrom': ['author'], 'superclasses': ['section']},
     'option': {
       'nameFrom': ['contents', 'author'],
+      'scope': ['listbox'],
       'superclasses': ['input'],
-      'supportedAttributes': ['aria-checked', 'aria-posinset', 'aria-selected', 'aria-setsize']
+      'requiredAttributes': ['aria-selected'],
+      'supportedAttributes': ['aria-checked', 'aria-posinset', 'aria-setsize'],
+      'nameRequired': true,
+      'childrenPresentational': true,
+      'implicitValues': {'aria-selected': 'false'}
     },
     'presentation': {'superclasses': ['structure']},
-    'progressbar': {'nameFrom': ['author'], 'superclasses': ['range']},
-    'radio': {'nameFrom': ['contents', 'author'], 'superclasses': ['checkbox', 'option']},
+    'progressbar':
+        {'nameFrom': ['author'], 'superclasses': ['range'], 'nameRequired': true, 'childrenPresentational': true},
+    'radio': {
+      'nameFrom': ['contents', 'author'],
+      'superclasses': ['input'],
+      'requiredAttributes': ['aria-checked'],
+      'supportedAttributes': ['aria-posinset', 'aria-setsize'],
+      'nameRequired': true,
+      'childrenPresentational': true,
+      'implicitValues': {'aria-checked': 'false'}
+    },
     'radiogroup': {
-      'mustContain': ['radio'],
       'nameFrom': ['author'],
       'superclasses': ['select'],
-      'supportedAttributes': ['aria-required']
+      'mustContain': ['radio'],
+      'supportedAttributes': ['aria-readonly', 'aria-required'],
+      'nameRequired': true
     },
     'range': {
       'abstract': true,
@@ -149,105 +272,169 @@
       'superclasses': ['widget'],
       'supportedAttributes': ['aria-valuemax', 'aria-valuemin', 'aria-valuenow', 'aria-valuetext']
     },
-    'region': {'nameFrom': ['author'], 'superclasses': ['section']},
+    'region': {'nameFrom': ['author'], 'superclasses': ['landmark'], 'nameRequired': true},
     'roletype': {
       'abstract': true,
       'supportedAttributes': [
-        'aria-atomic', 'aria-busy', 'aria-controls', 'aria-describedby', 'aria-disabled', 'aria-dropeffect',
-        'aria-flowto', 'aria-grabbed', 'aria-haspopup', 'aria-hidden', 'aria-invalid', 'aria-label', 'aria-labelledby',
-        'aria-live', 'aria-owns', 'aria-relevant'
+        'aria-atomic',   'aria-busy',       'aria-controls',       'aria-current', 'aria-describedby', 'aria-details',
+        'aria-disabled', 'aria-dropeffect', 'aria-errormessage',   'aria-flowto',  'aria-grabbed',     'aria-haspopup',
+        'aria-hidden',   'aria-invalid',    'aria-keyshortcuts',   'aria-label',   'aria-labelledby',  'aria-live',
+        'aria-owns',     'aria-relevant',   'aria-roledescription'
       ]
     },
     'row': {
-      'mustContain': ['columnheader', 'gridcell', 'rowheader'],
       'nameFrom': ['contents', 'author'],
-      'scope': ['grid', 'rowgroup', 'treegrid'],
       'superclasses': ['group', 'widget'],
-      'supportedAttributes': ['aria-level', 'aria-selected']
+      'mustContain': ['cell', 'columnheader', 'gridcell', 'rowheader'],
+      'scope': ['grid', 'rowgroup', 'table', 'treegrid'],
+      // TODO(aboxhall/aleventhal): This is not in the spec yet, but
+      // setsize and posinset are included here for treegrid
+      // purposes. Issue already filed on spec. Remove this comment
+      // when spec updated.
+      'supportedAttributes':
+          ['aria-colindex', 'aria-level', 'aria-rowindex', 'aria-selected', 'aria-setsize', 'aria-posinset']
     },
-    'rowgroup':
-        {'mustContain': ['row'], 'nameFrom': ['contents', 'author'], 'scope': ['grid'], 'superclasses': ['group']},
+    'rowgroup': {
+      'nameFrom': ['contents', 'author'],
+      'superclasses': ['structure'],
+      'mustContain': ['row'],
+      'scope': ['grid', 'table', 'treegrid'],
+    },
     'rowheader': {
       'nameFrom': ['contents', 'author'],
       'scope': ['row'],
-      'superclasses': ['gridcell', 'sectionhead', 'widget'],
-      'supportedAttributes': ['aria-sort']
+      'superclasses': ['cell', 'gridcell', 'sectionhead'],
+      'supportedAttributes': ['aria-sort'],
+      'nameRequired': true
     },
     'scrollbar': {
       'nameFrom': ['author'],
       'requiredAttributes': ['aria-controls', 'aria-orientation', 'aria-valuemax', 'aria-valuemin', 'aria-valuenow'],
-      'superclasses': ['input', 'range']
+      'superclasses': ['range'],
+      'nameRequired': false,
+      'childrenPresentational': true,
+      'implicitValues': {'aria-orientation': 'vertical', 'aria-valuemin': '0', 'aria-valuemax': '100'}
     },
     'search': {'nameFrom': ['author'], 'superclasses': ['landmark']},
-    'section': {
-      'abstract': true,
-      'nameFrom': ['contents', 'author'],
-      'superclasses': ['structure'],
-      'supportedAttributes': ['aria-expanded']
-    },
+    'searchbox': {'nameFrom': ['author'], 'superclasses': ['textbox'], 'nameRequired': true},
+    'section': {'abstract': true, 'superclasses': ['structure'], 'supportedAttributes': ['aria-expanded']},
     'sectionhead': {
       'abstract': true,
       'nameFrom': ['contents', 'author'],
       'superclasses': ['structure'],
       'supportedAttributes': ['aria-expanded']
     },
-    'select': {'abstract': true, 'nameFrom': ['author'], 'superclasses': ['composite', 'group', 'input']},
+    'select': {'abstract': true, 'nameFrom': ['author'], 'superclasses': ['composite', 'group']},
     'separator': {
       'nameFrom': ['author'],
+      // TODO(aboxhall): superclass depends on focusability, but
+      // doesn't affect required/supported attributes
       'superclasses': ['structure'],
-      'supportedAttributes': ['aria-expanded', 'aria-orientation']
+      // TODO(aboxhall): required attributes depend on focusability
+      'supportedAttributes': ['aria-orientation', 'aria-valuemin', 'aria-valuemax', 'aria-valuenow', 'aria-valuetext']
     },
     'slider': {
       'nameFrom': ['author'],
       'requiredAttributes': ['aria-valuemax', 'aria-valuemin', 'aria-valuenow'],
       'superclasses': ['input', 'range'],
-      'supportedAttributes': ['aria-orientation']
+      'supportedAttributes': ['aria-orientation'],
+      'nameRequired': true,
+      'childrenPresentational': true,
+      // TODO(aboxhall): aria-valuenow default is halfway between
+      // aria-valuemin and aria-valuemax
+      'implicitValues': {'aria-orientation': 'horizontal', 'aria-valuemin': '0', 'aria-valuemax': '100'}
     },
     'spinbutton': {
       'nameFrom': ['author'],
       'requiredAttributes': ['aria-valuemax', 'aria-valuemin', 'aria-valuenow'],
-      'superclasses': ['input', 'range'],
-      'supportedAttributes': ['aria-required']
+      'superclasses': ['composite', 'input', 'range'],
+      'supportedAttributes': ['aria-required', 'aria-readonly'],
+      'nameRequired': true,
+      'implicitValues': {'aria-valuenow': '0'}
     },
-    'status': {'superclasses': ['region']},
+    'status': {
+      'nameFrom': ['author'],
+      'superclasses': ['section'],
+      'implicitValues': {'aria-live': 'polite', 'aria-atomic': 'true'}
+    },
     'structure': {'abstract': true, 'superclasses': ['roletype']},
+    'switch': {
+      'nameFrom': ['contents', 'author'],
+      'superclasses': ['checkbox'],
+      'requiredAttributes': ['aria-checked'],
+      'nameRequired': true,
+      'childrenPresentational': true,
+      'implicitValues': {'aria-checked': 'false'}
+    },
     'tab': {
       'nameFrom': ['contents', 'author'],
       'scope': ['tablist'],
       'superclasses': ['sectionhead', 'widget'],
-      'supportedAttributes': ['aria-selected']
+      'supportedAttributes': ['aria-selected'],
+      'childrenPresentational': true,
+      'implicitValues': {'aria-selected': 'false'}
+    },
+    'table': {
+      'nameFrom': ['author'],
+      'superclasses': ['section'],
+      // TODO(aboxhall): Figure out how to express "rowgroup --> row"
+      'mustContain': ['row'],
+      'supportedAttributes': ['aria-colcount', 'aria-rowcount'],
+      'nameRequired': true
     },
     'tablist': {
-      'mustContain': ['tab'],
       'nameFrom': ['author'],
-      'superclasses': ['composite', 'directory'],
-      'supportedAttributes': ['aria-level']
+      'superclasses': ['composite'],
+      'mustContain': ['tab'],
+      'supportedAttributes': ['aria-level', 'aria-multiselectable', 'aria-orientation'],
+      'implicitValues': {'aria-orientation': 'horizontal'}
     },
-    'tabpanel': {'nameFrom': ['author'], 'superclasses': ['region']},
+    'tabpanel': {'nameFrom': ['author'], 'superclasses': ['section'], 'nameRequired': true},
+    'term': {'nameFrom': ['author'], 'superclasses': ['section']},
     'textbox': {
       'nameFrom': ['author'],
       'superclasses': ['input'],
-      'supportedAttributes':
-          ['aria-activedescendant', 'aria-autocomplete', 'aria-multiline', 'aria-readonly', 'aria-required']
+      'supportedAttributes': [
+        'aria-activedescendant', 'aria-autocomplete', 'aria-multiline', 'aria-placeholder', 'aria-readonly',
+        'aria-required'
+      ],
+      'nameRequired': true
     },
     'timer': {'nameFrom': ['author'], 'superclasses': ['status']},
-    'toolbar': {'nameFrom': ['author'], 'superclasses': ['group']},
-    'tooltip': {'superclasses': ['section']},
-    'tree': {
-      'mustContain': ['group', 'treeitem', 'treeitem'],
+    'toolbar': {
       'nameFrom': ['author'],
-      'superclasses': ['select'],
-      'supportedAttributes': ['aria-multiselectable', 'aria-required']
+      'superclasses': ['group'],
+      'supportedAttributes': ['aria-orientation'],
+      'implicitValues': {'aria-orientation': 'horizontal'}
     },
-    'treegrid': {'mustContain': ['row'], 'nameFrom': ['author'], 'superclasses': ['grid', 'tree']},
-    'treeitem':
-        {'nameFrom': ['contents', 'author'], 'scope': ['group', 'tree'], 'superclasses': ['listitem', 'option']},
+    'tooltip': {'nameFrom': ['contents', 'author'], 'superclasses': ['section'], 'nameRequired': true},
+    'tree': {
+      'nameFrom': ['author'],
+      'mustContain': ['group', 'treeitem'],
+      'superclasses': ['select'],
+      'supportedAttributes': ['aria-multiselectable', 'aria-required'],
+      'nameRequired': true,
+      'implicitValues': {'aria-orientation': 'vertical'}
+    },
+    'treegrid': {
+      // TODO(aboxhall): Figure out how to express "rowgroup --> row"
+      'mustContain': ['row'],
+      'nameFrom': ['author'],
+      'superclasses': ['grid', 'tree'],
+      'nameRequired': true
+    },
+    'treeitem': {
+      'nameFrom': ['contents', 'author'],
+      'scope': ['group', 'tree'],
+      'superclasses': ['listitem', 'option'],
+      'nameRequired': true
+    },
     'widget': {'abstract': true, 'superclasses': ['roletype']},
     'window': {
       'abstract': true,
       'nameFrom': ['author'],
       'superclasses': ['roletype'],
-      'supportedAttributes': ['aria-expanded']
+      'supportedAttributes': ['aria-expanded', 'aria-modal']
     }
   }
 };
diff --git a/third_party/WebKit/Source/devtools/front_end/accessibility/AXBreadcrumbsPane.js b/third_party/WebKit/Source/devtools/front_end/accessibility/AXBreadcrumbsPane.js
index 72de23e..054cef0a 100644
--- a/third_party/WebKit/Source/devtools/front_end/accessibility/AXBreadcrumbsPane.js
+++ b/third_party/WebKit/Source/devtools/front_end/accessibility/AXBreadcrumbsPane.js
@@ -10,6 +10,7 @@
     super(Common.UIString('Accessibility Tree'));
 
     this.element.classList.add('ax-subpane');
+    UI.ARIAUtils.markAsTree(this.element);
 
     this._axSidebarView = axSidebarView;
 
@@ -53,11 +54,14 @@
 
     var depth = 0;
     var breadcrumb = null;
+    var parent = null;
     for (ancestor of ancestorChain) {
       breadcrumb = new Accessibility.AXBreadcrumb(ancestor, depth, (ancestor === axNode));
-      if (ancestor.children().length)
-        breadcrumb.element().classList.add('parent');
-      this._rootElement.appendChild(breadcrumb.element());
+      if (parent)
+        parent.appendChild(breadcrumb);
+      else
+        this._rootElement.appendChild(breadcrumb.element());
+      parent = breadcrumb;
       depth++;
     }
 
@@ -68,7 +72,7 @@
 
     for (var child of axNode.children()) {
       var childBreadcrumb = new Accessibility.AXBreadcrumb(child, depth, false);
-      this._rootElement.appendChild(childBreadcrumb.element());
+      inspectedNodeBreadcrumb.appendChild(childBreadcrumb);
     }
 
     this._selectedByUser = false;
@@ -115,11 +119,11 @@
    * @return {boolean}
    */
   _preselectPrevious() {
-    var previousElement = this._preselectedBreadcrumb.element().previousSibling;
-    if (!previousElement)
+    var previousBreadcrumb = this._preselectedBreadcrumb.previousBreadcrumb();
+    if (!previousBreadcrumb)
       return false;
     this._selectedByUser = true;
-    this._setPreselectedBreadcrumb(previousElement.breadcrumb);
+    this._setPreselectedBreadcrumb(previousBreadcrumb);
     return true;
   }
 
@@ -127,11 +131,11 @@
    * @return {boolean}
    */
   _preselectNext() {
-    var nextElement = this._preselectedBreadcrumb.element().nextSibling;
-    if (!nextElement)
+    var nextBreadcrumb = this._preselectedBreadcrumb.nextBreadcrumb();
+    if (!nextBreadcrumb)
       return false;
     this._selectedByUser = true;
-    this._setPreselectedBreadcrumb(nextElement.breadcrumb);
+    this._setPreselectedBreadcrumb(nextBreadcrumb);
     return true;
   }
 
@@ -161,7 +165,7 @@
    * @param {!Event} event
    */
   _onMouseMove(event) {
-    var breadcrumbElement = event.target.enclosingNodeOrSelfWithClass('ax-node');
+    var breadcrumbElement = event.target.enclosingNodeOrSelfWithClass('ax-breadcrumb');
     if (!breadcrumbElement) {
       this._setHoveredBreadcrumb(null);
       return;
@@ -176,7 +180,7 @@
    * @param {!Event} event
    */
   _onClick(event) {
-    var breadcrumbElement = event.target.enclosingNodeOrSelfWithClass('ax-node');
+    var breadcrumbElement = event.target.enclosingNodeOrSelfWithClass('ax-breadcrumb');
     if (!breadcrumbElement) {
       this._setHoveredBreadcrumb(null);
       return;
@@ -274,22 +278,32 @@
     /** @type {!Accessibility.AccessibilityNode} */
     this._axNode = axNode;
 
-    this._element = createElementWithClass('div', 'ax-node');
+    this._element = createElementWithClass('div', 'ax-breadcrumb');
+    UI.ARIAUtils.markAsTreeitem(this._element);
     this._element.breadcrumb = this;
 
+    this._nodeElement = createElementWithClass('div', 'ax-node');
+    this._element.appendChild(this._nodeElement);
+    this._nodeWrapper = createElementWithClass('div', 'wrapper');
+    this._nodeElement.appendChild(this._nodeWrapper);
+
     this._selectionElement = createElementWithClass('div', 'selection fill');
-    this._element.appendChild(this._selectionElement);
+    this._nodeElement.appendChild(this._selectionElement);
 
-    this._nodeWrapper = createElementWithClass('span', 'wrapper');
-    this._element.appendChild(this._nodeWrapper);
+    this._childrenGroupElement = createElementWithClass('div', 'children');
+    UI.ARIAUtils.markAsGroup(this._childrenGroupElement);
+    this._element.appendChild(this._childrenGroupElement);
 
+    /** @type !Array<!Accessibility.AXBreadcrumb> */
+    this._children = [];
     this._hovered = false;
     this._preselected = false;
+    this._parent = null;
 
     this._inspected = inspected;
-    this.element().classList.toggle('inspected', inspected);
+    this._nodeElement.classList.toggle('inspected', inspected);
 
-    this._element.style.paddingLeft = (16 * depth + 4) + 'px';
+    this._nodeElement.style.paddingLeft = (16 * depth + 4) + 'px';
 
     if (this._axNode.ignored()) {
       this._appendIgnoredNodeElement();
@@ -302,10 +316,10 @@
     }
 
     if (this._axNode.hasOnlyUnloadedChildren())
-      this._element.classList.add('children-unloaded');
+      this._nodeElement.classList.add('children-unloaded');
 
     if (!this._axNode.isDOMNode())
-      this._element.classList.add('no-dom-node');
+      this._nodeElement.classList.add('no-dom-node');
   }
 
   /**
@@ -316,6 +330,24 @@
   }
 
   /**
+   * @param {!Accessibility.AXBreadcrumb} breadcrumb
+   */
+  appendChild(breadcrumb) {
+    this._children.push(breadcrumb);
+    breadcrumb.setParent(this);
+    this._nodeElement.classList.add('parent');
+    UI.ARIAUtils.setExpanded(this._element, true);
+    this._childrenGroupElement.appendChild(breadcrumb.element());
+  }
+
+  /**
+   * @param {!Accessibility.AXBreadcrumb} breadcrumb
+   */
+  setParent(breadcrumb) {
+    this._parent = breadcrumb;
+  }
+
+  /**
    * @return {boolean}
    */
   preselected() {
@@ -330,14 +362,14 @@
     if (this._preselected === preselected)
       return;
     this._preselected = preselected;
-    this.element().classList.toggle('preselected', preselected);
+    this._nodeElement.classList.toggle('preselected', preselected);
     if (preselected)
-      this.element().setAttribute('tabIndex', 0);
+      this._nodeElement.setAttribute('tabIndex', 0);
     else
-      this.element().removeAttribute('tabIndex');
+      this._nodeElement.removeAttribute('tabIndex');
     if (this._preselected) {
       if (selectedByUser)
-        this.element().focus();
+        this._nodeElement.focus();
       if (!this._inspected)
         this._axNode.highlightDOMNode();
       else
@@ -352,9 +384,9 @@
     if (this._hovered === hovered)
       return;
     this._hovered = hovered;
-    this.element().classList.toggle('hovered', hovered);
+    this._nodeElement.classList.toggle('hovered', hovered);
     if (this._hovered) {
-      this.element().classList.toggle('hovered', true);
+      this._nodeElement.classList.toggle('hovered', true);
       this._axNode.highlightDOMNode();
     }
   }
@@ -381,6 +413,29 @@
   }
 
   /**
+   * @return {?Accessibility.AXBreadcrumb}
+   */
+  nextBreadcrumb() {
+    if (this._children.length)
+      return this._children[0];
+    var nextSibling = this.element().nextSibling;
+    if (nextSibling)
+      return nextSibling.breadcrumb;
+    return null;
+  }
+
+  /**
+   * @return {?Accessibility.AXBreadcrumb}
+   */
+  previousBreadcrumb() {
+    var previousSibling = this.element().previousSibling;
+    if (previousSibling)
+      return previousSibling.breadcrumb;
+
+    return this._parent;
+  }
+
+  /**
    * @param {string} name
    */
   _appendNameElement(name) {
diff --git a/third_party/WebKit/Source/devtools/front_end/bindings/FileUtils.js b/third_party/WebKit/Source/devtools/front_end/bindings/FileUtils.js
index 454bdc8..69b9524 100644
--- a/third_party/WebKit/Source/devtools/front_end/bindings/FileUtils.js
+++ b/third_party/WebKit/Source/devtools/front_end/bindings/FileUtils.js
@@ -27,27 +27,6 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
-/**
- * @interface
- */
-Bindings.OutputStreamDelegate = function() {};
-
-Bindings.OutputStreamDelegate.prototype = {
-  onTransferStarted() {},
-
-  onTransferFinished() {},
-
-  /**
-   * @param {!Bindings.ChunkedReader} reader
-   */
-  onChunkTransferred(reader) {},
-
-  /**
-   * @param {!Bindings.ChunkedReader} reader
-   * @param {!Event} event
-   */
-  onError(reader, event) {},
-};
 
 /**
  * @interface
@@ -70,7 +49,12 @@
    */
   fileName() {},
 
-  cancel() {}
+  cancel() {},
+
+  /**
+   * @return {?FileError}
+   */
+  error() {}
 };
 
 /**
@@ -81,29 +65,33 @@
   /**
    * @param {!File} file
    * @param {number} chunkSize
-   * @param {!Bindings.OutputStreamDelegate} delegate
+   * @param {function(!Bindings.ChunkedReader)=} chunkTransferredCallback
    */
-  constructor(file, chunkSize, delegate) {
+  constructor(file, chunkSize, chunkTransferredCallback) {
     this._file = file;
     this._fileSize = file.size;
     this._loadedSize = 0;
     this._chunkSize = chunkSize;
-    this._delegate = delegate;
+    this._chunkTransferredCallback = chunkTransferredCallback;
     this._decoder = new TextDecoder();
     this._isCanceled = false;
+    /** @type {?FileError} */
+    this._error = null;
   }
 
   /**
    * @param {!Common.OutputStream} output
+   * @return {!Promise<boolean>}
    */
-  start(output) {
+  read(output) {
+    if (this._chunkTransferredCallback)
+      this._chunkTransferredCallback(this);
     this._output = output;
-
     this._reader = new FileReader();
     this._reader.onload = this._onChunkLoaded.bind(this);
-    this._reader.onerror = this._delegate.onError.bind(this._delegate, this);
-    this._delegate.onTransferStarted();
+    this._reader.onerror = this._onError.bind(this);
     this._loadChunk();
+    return new Promise(resolve => this._transferFinished = resolve);
   }
 
   /**
@@ -138,6 +126,14 @@
   }
 
   /**
+   * @override
+   * @return {?FileError}
+   */
+  error() {
+    return this._error;
+  }
+
+  /**
    * @param {!Event} event
    */
   _onChunkLoaded(event) {
@@ -154,13 +150,14 @@
     this._output.write(decodedString);
     if (this._isCanceled)
       return;
-    this._delegate.onChunkTransferred(this);
+    if (this._chunkTransferredCallback)
+      this._chunkTransferredCallback(this);
 
     if (endOfFile) {
       this._file = null;
       this._reader = null;
       this._output.close();
-      this._delegate.onTransferFinished();
+      this._transferFinished(!this._error);
       return;
     }
 
@@ -173,6 +170,14 @@
     var nextPart = this._file.slice(chunkStart, chunkEnd);
     this._reader.readAsArrayBuffer(nextPart);
   }
+
+  /**
+   * @param {!Event} event
+   */
+  _onError(event) {
+    this._error = event.target.error;
+    this._transferFinished(false);
+  }
 };
 
 /**
diff --git a/third_party/WebKit/Source/devtools/front_end/bindings/TempFile.js b/third_party/WebKit/Source/devtools/front_end/bindings/TempFile.js
index 682b71e..1ab0e33 100644
--- a/third_party/WebKit/Source/devtools/front_end/bindings/TempFile.js
+++ b/third_party/WebKit/Source/devtools/front_end/bindings/TempFile.js
@@ -143,23 +143,31 @@
 
   /**
    * @param {!Common.OutputStream} outputStream
-   * @param {!Bindings.OutputStreamDelegate} delegate
+   * @param {function(!Bindings.ChunkedReader)=} progress
+   * @return {!Promise<?FileError>}
    */
-  copyToOutputStream(outputStream, delegate) {
-    /**
-     * @param {!File} file
-     */
-    function didGetFile(file) {
-      var reader = new Bindings.ChunkedFileReader(file, 10 * 1000 * 1000, delegate);
-      reader.start(outputStream);
-    }
+  copyToOutputStream(outputStream, progress) {
+    return new Promise(resolve => {
+      this._fileEntry.file(didGetFile, didFailToGetFile);
 
-    function didFailToGetFile(error) {
-      Common.console.error('Failed to load temp file: ' + error.message);
-      outputStream.close();
-    }
+      /**
+       * @param {!File} file
+       */
+      async function didGetFile(file) {
+        var reader = new Bindings.ChunkedFileReader(file, 10 * 1000 * 1000, progress);
+        var success = await reader.read(outputStream);
+        resolve(success ? null : reader.error());
+      }
 
-    this._fileEntry.file(didGetFile, didFailToGetFile);
+      /**
+       * @param {!FileError} error
+       */
+      function didFailToGetFile(error) {
+        Common.console.error('Failed to load temp file: ' + error.message);
+        outputStream.close();
+        resolve(error);
+      }
+    });
   }
 
   remove() {
@@ -232,12 +240,12 @@
 
   /**
    * @param {!Common.OutputStream} outputStream
-   * @param {!Bindings.OutputStreamDelegate} delegate
+   * @param {function()=} progress
+   * @return {!Promise<?FileError>}
    */
-  async copyToOutputStream(outputStream, delegate) {
+  async copyToOutputStream(outputStream, progress) {
     await this._writeFinishedPromise;
-    if (this._tempFile)
-      this._tempFile.copyToOutputStream(outputStream, delegate);
+    return this._tempFile ? await this._tempFile.copyToOutputStream(outputStream, progress) : null;
   }
 
   async remove() {
@@ -364,11 +372,10 @@
 
   /**
    * @param {!Common.OutputStream} outputStream
-   * @param {!Bindings.OutputStreamDelegate} delegate
+   * @return {!Promise<?FileError>}
    */
-  writeToStream(outputStream, delegate) {
-    if (this._file)
-      this._file.copyToOutputStream(outputStream, delegate);
+  writeToStream(outputStream) {
+    return this._file ? this._file.copyToOutputStream(outputStream) : Promise.resolve(null);
   }
 };
 
diff --git a/third_party/WebKit/Source/devtools/front_end/network/NetworkPanel.js b/third_party/WebKit/Source/devtools/front_end/network/NetworkPanel.js
index 343b688..f490923 100644
--- a/third_party/WebKit/Source/devtools/front_end/network/NetworkPanel.js
+++ b/third_party/WebKit/Source/devtools/front_end/network/NetworkPanel.js
@@ -30,7 +30,6 @@
 /**
  * @implements {UI.ContextMenu.Provider}
  * @implements {UI.Searchable}
- * @unrestricted
  */
 Network.NetworkPanel = class extends UI.Panel {
   constructor() {
@@ -42,6 +41,10 @@
     this._networkRecordFilmStripSetting = Common.settings.createSetting('networkRecordFilmStripSetting', false);
     this._toggleRecordAction = /** @type {!UI.Action }*/ (UI.actionRegistry.action('network.toggle-recording'));
 
+    /** @type {number|undefined} */
+    this._pendingStopTimer;
+    /** @type {?Network.NetworkItemView} */
+    this._networkItemView = null;
     /** @type {?PerfUI.FilmStripView} */
     this._filmStripView = null;
     /** @type {?Network.NetworkPanel.FilmStripRecorder} */
@@ -93,7 +96,11 @@
     this._networkLogLargeRowsSetting.addChangeListener(this._toggleLargerRequests, this);
     this._networkRecordFilmStripSetting.addChangeListener(this._toggleRecordFilmStrip, this);
 
-    this._createToolbarButtons();
+    this._preserveLogSetting = Common.moduleSetting('network_log.preserve-log');
+
+    this._offlineCheckbox = MobileThrottling.throttlingManager().createOfflineToolbarCheckbox();
+    this._throttlingSelect = this._createThrottlingConditionsSelect();
+    this._setupToolbarButtons();
 
     this._toggleRecord(true);
     this._toggleShowOverview();
@@ -136,6 +143,20 @@
   }
 
   /**
+   * @return {!UI.ToolbarCheckbox}
+   */
+  offlineCheckboxForTest() {
+    return this._offlineCheckbox;
+  }
+
+  /**
+   * @return {!UI.ToolbarComboBox}
+   */
+  throttlingSelectForTest() {
+    return this._throttlingSelect;
+  }
+
+  /**
    * @param {!Common.Event} event
    */
   _onWindowChanged(event) {
@@ -144,12 +165,12 @@
     this._networkLogView.setWindow(startTime, endTime);
   }
 
-  _createToolbarButtons() {
+  _setupToolbarButtons() {
     this._panelToolbar.appendToolbarItem(UI.Toolbar.createActionButton(this._toggleRecordAction));
 
-    this._clearButton = new UI.ToolbarButton(Common.UIString('Clear'), 'largeicon-clear');
-    this._clearButton.addEventListener(UI.ToolbarButton.Events.Click, () => NetworkLog.networkLog.reset(), this);
-    this._panelToolbar.appendToolbarItem(this._clearButton);
+    var clearButton = new UI.ToolbarButton(Common.UIString('Clear'), 'largeicon-clear');
+    clearButton.addEventListener(UI.ToolbarButton.Events.Click, () => NetworkLog.networkLog.reset(), this);
+    this._panelToolbar.appendToolbarItem(clearButton);
     this._panelToolbar.appendSeparator();
     var recordFilmStripButton = new UI.ToolbarSettingToggle(
         this._networkRecordFilmStripSetting, 'largeicon-camera', Common.UIString('Capture screenshots'));
@@ -176,20 +197,17 @@
     }
 
     this._panelToolbar.appendSeparator();
-    this._preserveLogSetting = Common.moduleSetting('network_log.preserve-log');
     this._panelToolbar.appendToolbarItem(new UI.ToolbarSettingCheckbox(
         this._preserveLogSetting, Common.UIString('Do not clear log on page reload / navigation'),
         Common.UIString('Preserve log')));
 
-    this._disableCacheCheckbox = new UI.ToolbarSettingCheckbox(
+    var disableCacheCheckbox = new UI.ToolbarSettingCheckbox(
         Common.moduleSetting('cacheDisabled'), Common.UIString('Disable cache (while DevTools is open)'),
         Common.UIString('Disable cache'));
-    this._panelToolbar.appendToolbarItem(this._disableCacheCheckbox);
+    this._panelToolbar.appendToolbarItem(disableCacheCheckbox);
 
     this._panelToolbar.appendSeparator();
-    this._offlineCheckbox = MobileThrottling.throttlingManager().createOfflineToolbarCheckbox();
     this._panelToolbar.appendToolbarItem(this._offlineCheckbox);
-    this._throttlingSelect = this._createThrottlingConditionsSelect();
     this._panelToolbar.appendToolbarItem(this._throttlingSelect);
 
     this._panelToolbar.appendToolbarItem(new UI.ToolbarItem(this._progressBarContainer));
@@ -609,7 +627,6 @@
 
 /**
  * @implements {SDK.TracingManagerClient}
- * @unrestricted
  */
 Network.NetworkPanel.FilmStripRecorder = class {
   /**
@@ -623,6 +640,10 @@
     this._resourceTreeModel = null;
     this._timeCalculator = timeCalculator;
     this._filmStripView = filmStripView;
+    /** @type {?SDK.TracingModel} */
+    this._tracingModel = null;
+    /** @type {?function(?SDK.FilmStripModel)} */
+    this._callback = null;
   }
 
   /**
@@ -643,7 +664,7 @@
     this._tracingModel.tracingComplete();
     this._tracingManager = null;
     this._callback(new SDK.FilmStripModel(this._tracingModel, this._timeCalculator.minimumBoundary() * 1000));
-    delete this._callback;
+    this._callback = null;
     if (this._resourceTreeModel)
       this._resourceTreeModel.resumeReload();
     this._resourceTreeModel = null;
@@ -672,9 +693,8 @@
     this._tracingManager = tracingManagers[0];
     this._resourceTreeModel = this._tracingManager.target().model(SDK.ResourceTreeModel);
     if (this._tracingModel)
-      this._tracingModel.reset();
-    else
-      this._tracingModel = new SDK.TracingModel(new Bindings.TempFileBackingStorage('tracing'));
+      this._tracingModel.dispose();
+    this._tracingModel = new SDK.TracingModel(new Bindings.TempFileBackingStorage('tracing'));
     this._tracingManager.start(this, '-*,disabled-by-default-devtools.screenshot', '');
   }
 
@@ -702,7 +722,6 @@
 
 /**
  * @implements {UI.ActionDelegate}
- * @unrestricted
  */
 Network.NetworkPanel.RecordActionDelegate = class {
   /**
diff --git a/third_party/WebKit/Source/devtools/front_end/perf_ui/ChartViewport.js b/third_party/WebKit/Source/devtools/front_end/perf_ui/ChartViewport.js
index 21633d5..c0678642 100644
--- a/third_party/WebKit/Source/devtools/front_end/perf_ui/ChartViewport.js
+++ b/third_party/WebKit/Source/devtools/front_end/perf_ui/ChartViewport.js
@@ -325,6 +325,13 @@
   }
 
   /**
+   * @return {number}
+   */
+  timeToPixel() {
+    return this._offsetWidth / (this._timeWindowRight - this._timeWindowLeft);
+  }
+
+  /**
    * @param {boolean} visible
    */
   _showCursor(visible) {
diff --git a/third_party/WebKit/Source/devtools/front_end/perf_ui/FlameChart.js b/third_party/WebKit/Source/devtools/front_end/perf_ui/FlameChart.js
index 4efe917..c99673d 100644
--- a/third_party/WebKit/Source/devtools/front_end/perf_ui/FlameChart.js
+++ b/third_party/WebKit/Source/devtools/front_end/perf_ui/FlameChart.js
@@ -642,6 +642,7 @@
     var entryTotalTimes = timelineData.entryTotalTimes;
     var entryStartTimes = timelineData.entryStartTimes;
     var entryLevels = timelineData.entryLevels;
+    var timeToPixel = this._chartViewport.timeToPixel();
 
     var titleIndices = [];
     var markerIndices = [];
@@ -745,7 +746,7 @@
       var unclippedBarX = this._chartViewport.timeToPosition(entryStartTime);
       var barHeight = this._levelHeight(barLevel);
       if (this._dataProvider.decorateEntry(
-              entryIndex, context, text, barX, barY, barWidth, barHeight, unclippedBarX, this._timeToPixel))
+              entryIndex, context, text, barX, barY, barWidth, barHeight, unclippedBarX, timeToPixel))
         continue;
       if (!text || !text.length)
         continue;
@@ -935,6 +936,7 @@
     var barHeight = group.style.height;
     var entryStartTimes = this._rawTimelineData.entryStartTimes;
     var entryTotalTimes = this._rawTimelineData.entryTotalTimes;
+    var timeToPixel = this._chartViewport.timeToPixel();
 
     for (var level = group.startLevel; level < endLevel; ++level) {
       var levelIndexes = this._timelineLevels[level];
@@ -961,7 +963,7 @@
           context.fillStyle = color;
           context.fillRect(barX, y, barWidth, barHeight - 1);
           this._dataProvider.decorateEntry(
-              entryIndex, context, '', barX, y, barWidth, barHeight, unclippedBarX, this._timeToPixel);
+              entryIndex, context, '', barX, y, barWidth, barHeight, unclippedBarX, timeToPixel);
           continue;
         }
         range.append(new Common.Segment(barX, endBarX, color));
@@ -1065,6 +1067,7 @@
     var markers = this._timelineData().markers;
     var left = this._markerIndexBeforeTime(this._calculator.minimumBoundary());
     var rightBoundary = this._calculator.maximumBoundary();
+    var timeToPixel = this._chartViewport.timeToPixel();
 
     var context = /** @type {!CanvasRenderingContext2D} */ (this._canvas.getContext('2d'));
     context.save();
@@ -1076,7 +1079,7 @@
       var timestamp = markers[i].startTime();
       if (timestamp > rightBoundary)
         break;
-      markers[i].draw(context, this._calculator.computePosition(timestamp), height, this._timeToPixel);
+      markers[i].draw(context, this._calculator.computePosition(timestamp), height, timeToPixel);
     }
     context.restore();
   }
@@ -1306,9 +1309,6 @@
     var totalPixels = Math.floor(this._offsetWidth / windowWidth);
     this._pixelWindowLeft = Math.floor(totalPixels * this._windowLeft);
 
-    this._timeToPixel = totalPixels / this._totalTime;
-    this._pixelToTime = this._totalTime / totalPixels;
-
     this._chartViewport.setBoundaries(this._minimumBoundary, this._totalTime);
   }
 
@@ -1487,10 +1487,10 @@
    * @param {number} barWidth
    * @param {number} barHeight
    * @param {number} unclippedBarX
-   * @param {number} timeToPixels
+   * @param {number} timeToPixelRatio
    * @return {boolean}
    */
-  decorateEntry(entryIndex, context, text, barX, barY, barWidth, barHeight, unclippedBarX, timeToPixels) {},
+  decorateEntry(entryIndex, context, text, barX, barY, barWidth, barHeight, unclippedBarX, timeToPixelRatio) {},
 
   /**
    * @param {number} entryIndex
diff --git a/third_party/WebKit/Source/devtools/front_end/profiler/HeapSnapshotView.js b/third_party/WebKit/Source/devtools/front_end/profiler/HeapSnapshotView.js
index b4ba48f..04707a9 100644
--- a/third_party/WebKit/Source/devtools/front_end/profiler/HeapSnapshotView.js
+++ b/third_party/WebKit/Source/devtools/front_end/profiler/HeapSnapshotView.js
@@ -1316,6 +1316,8 @@
     this._loadPromise = new Promise(resolve => this._fulfillLoad = resolve);
     this._totalNumberOfChunks = 0;
     this._bufferedWriter = null;
+    /** @type {?Bindings.TempFile} */
+    this._tempFile = null;
   }
 
   /**
@@ -1359,6 +1361,9 @@
     this._didWriteToTempFile(file);
   }
 
+  /**
+   * @param {!Bindings.TempFile} tempFile
+   */
   _didWriteToTempFile(tempFile) {
     if (this._wasDisposed) {
       if (tempFile)
@@ -1470,25 +1475,39 @@
      * @param {boolean} accepted
      * @this {Profiler.HeapProfileHeader}
      */
-    function onOpen(accepted) {
+    async function onOpen(accepted) {
       if (!accepted)
         return;
-
       if (this._failedToCreateTempFile) {
         Common.console.error('Failed to open temp file with heap snapshot');
         fileOutputStream.close();
-      } else if (this._tempFile) {
-        var delegate = new Profiler.SaveSnapshotOutputStreamDelegate(this);
-        this._tempFile.copyToOutputStream(fileOutputStream, delegate);
-      } else {
-        this._onTempFileReady = onOpen.bind(this, accepted);
-        this._updateSaveProgress(0, 1);
+        return;
       }
+      if (this._tempFile) {
+        var error = await this._tempFile.copyToOutputStream(fileOutputStream, this._onChunkTransferred.bind(this));
+        if (error)
+          Common.console.error('Failed to read heap snapshot from temp file: ' + error.message);
+        this._didCompleteSnapshotTransfer();
+        return;
+      }
+      this._onTempFileReady = onOpen.bind(this, accepted);
+      this._updateSaveProgress(0, 1);
     }
   }
 
+  /**
+   * @param {!Bindings.ChunkedReader} reader
+   */
+  _onChunkTransferred(reader) {
+    this._updateSaveProgress(reader.loadedSize(), reader.fileSize());
+  }
+
+  /**
+   * @param {number} value
+   * @param {number} total
+   */
   _updateSaveProgress(value, total) {
-    var percentValue = ((total ? (value / total) : 0) * 100).toFixed(0);
+    var percentValue = ((total && value / total) * 100).toFixed(0);
     this.updateStatus(Common.UIString('Saving\u2026 %d%%', percentValue));
   }
 
@@ -1496,119 +1515,13 @@
    * @override
    * @param {!File} file
    */
-  loadFromFile(file) {
+  async loadFromFile(file) {
     this.updateStatus(Common.UIString('Loading\u2026'), true);
     this._setupWorker();
-    var delegate = new Profiler.HeapSnapshotLoadFromFileDelegate(this);
-    var fileReader = this._createFileReader(file, delegate);
-    fileReader.start(/** @type {!Common.OutputStream} */ (this._receiver));
-  }
-
-  /**
-   * @param {!File} file
-   * @param {!Profiler.HeapSnapshotLoadFromFileDelegate} delegate
-   * @return {!Bindings.ChunkedFileReader}
-   */
-  _createFileReader(file, delegate) {
-    return new Bindings.ChunkedFileReader(file, 10000000, delegate);
-  }
-};
-
-/**
- * @implements {Bindings.OutputStreamDelegate}
- * @unrestricted
- */
-Profiler.HeapSnapshotLoadFromFileDelegate = class {
-  /**
-   * @param {!Profiler.HeapProfileHeader} snapshotHeader
-   */
-  constructor(snapshotHeader) {
-    this._snapshotHeader = snapshotHeader;
-  }
-
-  /**
-   * @override
-   */
-  onTransferStarted() {
-  }
-
-  /**
-   * @override
-   * @param {!Bindings.ChunkedReader} reader
-   */
-  onChunkTransferred(reader) {
-  }
-
-  /**
-   * @override
-   */
-  onTransferFinished() {
-  }
-
-  /**
-   * @override
-   * @param {!Bindings.ChunkedReader} reader
-   * @param {!Event} e
-   */
-  onError(reader, e) {
-    var subtitle;
-    switch (e.target.error.code) {
-      case e.target.error.NOT_FOUND_ERR:
-        subtitle = Common.UIString('\'%s\' not found.', reader.fileName());
-        break;
-      case e.target.error.NOT_READABLE_ERR:
-        subtitle = Common.UIString('\'%s\' is not readable', reader.fileName());
-        break;
-      case e.target.error.ABORT_ERR:
-        return;
-      default:
-        subtitle = Common.UIString('\'%s\' error %d', reader.fileName(), e.target.error.code);
-    }
-    this._snapshotHeader.updateStatus(subtitle);
-  }
-};
-
-/**
- * @implements {Bindings.OutputStreamDelegate}
- */
-Profiler.SaveSnapshotOutputStreamDelegate = class {
-  /**
-   * @param {!Profiler.HeapProfileHeader} profileHeader
-   */
-  constructor(profileHeader) {
-    this._profileHeader = profileHeader;
-  }
-
-  /**
-   * @override
-   */
-  onTransferStarted() {
-    this._profileHeader._updateSaveProgress(0, 1);
-  }
-
-  /**
-   * @override
-   */
-  onTransferFinished() {
-    this._profileHeader._didCompleteSnapshotTransfer();
-  }
-
-  /**
-   * @override
-   * @param {!Bindings.ChunkedReader} reader
-   */
-  onChunkTransferred(reader) {
-    this._profileHeader._updateSaveProgress(reader.loadedSize(), reader.fileSize());
-  }
-
-  /**
-   * @override
-   * @param {!Bindings.ChunkedReader} reader
-   * @param {!Event} event
-   */
-  onError(reader, event) {
-    Common.console.error('Failed to read heap snapshot from temp file: ' + /** @type {!ErrorEvent} */ (event).message);
-    this.onTransferFinished();
+    var reader = new Bindings.ChunkedFileReader(file, 10000000);
+    var success = await reader.read(/** @type {!Common.OutputStream} */ (this._receiver));
+    if (!success)
+      this.updateStatus(reader.error().message);
   }
 };
 
diff --git a/third_party/WebKit/Source/devtools/front_end/profiler/ProfileHeader.js b/third_party/WebKit/Source/devtools/front_end/profiler/ProfileHeader.js
index 6dd2a45..08f9dd0 100644
--- a/third_party/WebKit/Source/devtools/front_end/profiler/ProfileHeader.js
+++ b/third_party/WebKit/Source/devtools/front_end/profiler/ProfileHeader.js
@@ -40,7 +40,7 @@
    * @return {!Profiler.ProfileSidebarTreeElement}
    */
   createSidebarTreeElement(dataDisplayDelegate) {
-    throw new Error('Needs implemented.');
+    throw new Error('Not implemented.');
   }
 
   /**
@@ -67,14 +67,14 @@
   }
 
   saveToFile() {
-    throw new Error('Needs implemented');
+    throw new Error('Not implemented');
   }
 
   /**
    * @param {!File} file
    */
   loadFromFile(file) {
-    throw new Error('Needs implemented');
+    throw new Error('Not implemented');
   }
 
   /**
diff --git a/third_party/WebKit/Source/devtools/front_end/profiler/ProfileView.js b/third_party/WebKit/Source/devtools/front_end/profiler/ProfileView.js
index 9f7df63..66840ef 100644
--- a/third_party/WebKit/Source/devtools/front_end/profiler/ProfileView.js
+++ b/third_party/WebKit/Source/devtools/front_end/profiler/ProfileView.js
@@ -383,7 +383,6 @@
 
 /**
  * @implements {Common.OutputStream}
- * @implements {Bindings.OutputStreamDelegate}
  * @unrestricted
  */
 Profiler.WritableProfileHeader = class extends Profiler.ProfileHeader {
@@ -399,54 +398,17 @@
   }
 
   /**
-   * @override
-   */
-  onTransferStarted() {
-    this._jsonifiedProfile = '';
-    this.updateStatus(Common.UIString('Loading\u2026 %s', Number.bytesToString(this._jsonifiedProfile.length)), true);
-  }
-
-  /**
-   * @override
    * @param {!Bindings.ChunkedReader} reader
    */
-  onChunkTransferred(reader) {
+  _onChunkTransferred(reader) {
     this.updateStatus(Common.UIString('Loading\u2026 %d%%', Number.bytesToString(this._jsonifiedProfile.length)));
   }
 
   /**
-   * @override
-   */
-  onTransferFinished() {
-    this.updateStatus(Common.UIString('Parsing\u2026'), true);
-    this._profile = JSON.parse(this._jsonifiedProfile);
-    this._jsonifiedProfile = null;
-    this.updateStatus(Common.UIString('Loaded'), false);
-
-    if (this.profileType().profileBeingRecorded() === this)
-      this.profileType().setProfileBeingRecorded(null);
-  }
-
-  /**
-   * @override
    * @param {!Bindings.ChunkedReader} reader
-   * @param {!Event} e
    */
-  onError(reader, e) {
-    var subtitle;
-    switch (e.target.error.code) {
-      case e.target.error.NOT_FOUND_ERR:
-        subtitle = Common.UIString('\'%s\' not found.', reader.fileName());
-        break;
-      case e.target.error.NOT_READABLE_ERR:
-        subtitle = Common.UIString('\'%s\' is not readable', reader.fileName());
-        break;
-      case e.target.error.ABORT_ERR:
-        return;
-      default:
-        subtitle = Common.UIString('\'%s\' error %d', reader.fileName(), e.target.error.code);
-    }
-    this.updateStatus(subtitle);
+  _onError(reader) {
+    this.updateStatus(Common.UIString(`File '%s' read error: %s`, reader.fileName(), reader.error().message));
   }
 
   /**
@@ -522,10 +484,24 @@
    * @override
    * @param {!File} file
    */
-  loadFromFile(file) {
+  async loadFromFile(file) {
     this.updateStatus(Common.UIString('Loading\u2026'), true);
-    var fileReader = new Bindings.ChunkedFileReader(file, 10000000, this);
-    fileReader.start(this);
+    var fileReader = new Bindings.ChunkedFileReader(file, 10000000, this._onChunkTransferred.bind(this));
+    this._jsonifiedProfile = '';
+
+    var success = await fileReader.read(this);
+    if (!success) {
+      this._onError(fileReader);
+      return;
+    }
+
+    this.updateStatus(Common.UIString('Parsing\u2026'), true);
+    this._profile = JSON.parse(this._jsonifiedProfile);
+    this._jsonifiedProfile = null;
+    this.updateStatus(Common.UIString('Loaded'), false);
+
+    if (this.profileType().profileBeingRecorded() === this)
+      this.profileType().setProfileBeingRecorded(null);
   }
 
   /**
diff --git a/third_party/WebKit/Source/devtools/front_end/profiler/ProfilesPanel.js b/third_party/WebKit/Source/devtools/front_end/profiler/ProfilesPanel.js
index 5829c1f..29059af 100644
--- a/third_party/WebKit/Source/devtools/front_end/profiler/ProfilesPanel.js
+++ b/third_party/WebKit/Source/devtools/front_end/profiler/ProfilesPanel.js
@@ -159,13 +159,13 @@
           continue;
         extensions.push(extension);
       }
-      Common.console.error(Common.UIString(
-          'Can\'t load file. Only files with extensions \'%s\' can be loaded.', extensions.join('\', \'')));
+      Common.console.error(
+          Common.UIString(`Can't load file. Only files with extensions '%s' can be loaded.`, extensions.join(`', '`)));
       return;
     }
 
     if (!!profileType.profileBeingRecorded()) {
-      Common.console.error(Common.UIString('Can\'t load profile while another profile is recording.'));
+      Common.console.error(Common.UIString(`Can't load profile while another profile is being recorded.`));
       return;
     }
 
diff --git a/third_party/WebKit/Source/devtools/front_end/timeline/PerformanceModel.js b/third_party/WebKit/Source/devtools/front_end/timeline/PerformanceModel.js
index e9139e4..14a1fa12 100644
--- a/third_party/WebKit/Source/devtools/front_end/timeline/PerformanceModel.js
+++ b/third_party/WebKit/Source/devtools/front_end/timeline/PerformanceModel.js
@@ -154,11 +154,11 @@
 
   /**
    * @param {!Common.OutputStream} stream
-   * @param {!Bindings.OutputStreamDelegate} delegate
+   * @return {!Promise<?FileError>}
    */
-  save(stream, delegate) {
+  save(stream) {
     var backingStorage = /** @type {!Bindings.TempFileBackingStorage} */ (this._tracingModel.backingStorage());
-    backingStorage.writeToStream(stream, delegate);
+    return backingStorage.writeToStream(stream);
   }
 };
 
diff --git a/third_party/WebKit/Source/devtools/front_end/timeline/TimelineLoader.js b/third_party/WebKit/Source/devtools/front_end/timeline/TimelineLoader.js
index 3f0e016..2c4ae84 100644
--- a/third_party/WebKit/Source/devtools/front_end/timeline/TimelineLoader.js
+++ b/third_party/WebKit/Source/devtools/front_end/timeline/TimelineLoader.js
@@ -1,9 +1,9 @@
 // Copyright 2016 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
+
 /**
  * @implements {Common.OutputStream}
- * @implements {Bindings.OutputStreamDelegate}
  * @unrestricted
  */
 Timeline.TimelineLoader = class {
@@ -22,7 +22,6 @@
     this._buffer = '';
     this._firstRawChunk = true;
     this._firstChunk = true;
-
     this._loadedBytes = 0;
     /** @type {number} */
     this._totalSize;
@@ -36,10 +35,13 @@
    */
   static loadFromFile(file, client) {
     var loader = new Timeline.TimelineLoader(client);
-    var fileReader = Timeline.TimelineLoader._createFileReader(file, loader);
+    var fileReader = new Bindings.ChunkedFileReader(file, Timeline.TimelineLoader.TransferChunkLengthBytes);
     loader._canceledCallback = fileReader.cancel.bind(fileReader);
     loader._totalSize = file.size;
-    fileReader.start(loader);
+    fileReader.read(loader).then(success => {
+      if (!success)
+        this._reportErrorAndCancelLoading(fileReader.error().message);
+    });
     return loader;
   }
 
@@ -49,18 +51,9 @@
    * @return {!Timeline.TimelineLoader}
    */
   static loadFromURL(url, client) {
-    var stream = new Timeline.TimelineLoader(client);
-    Host.ResourceLoader.loadAsStream(url, null, stream);
-    return stream;
-  }
-
-  /**
-   * @param {!File} file
-   * @param {!Bindings.OutputStreamDelegate} delegate
-   * @return {!Bindings.ChunkedReader}
-   */
-  static _createFileReader(file, delegate) {
-    return new Bindings.ChunkedFileReader(file, Timeline.TimelineLoader.TransferChunkLengthBytes, delegate);
+    var loader = new Timeline.TimelineLoader(client);
+    Host.ResourceLoader.loadAsStream(url, null, loader);
+    return loader;
   }
 
   cancel() {
@@ -199,46 +192,6 @@
   }
 
   /**
-   * @override
-   */
-  onTransferStarted() {
-  }
-
-  /**
-   * @override
-   * @param {!Bindings.ChunkedReader} reader
-   */
-  onChunkTransferred(reader) {
-  }
-
-  /**
-   * @override
-   */
-  onTransferFinished() {
-  }
-
-  /**
-   * @override
-   * @param {!Bindings.ChunkedReader} reader
-   * @param {!Event} event
-   */
-  onError(reader, event) {
-    switch (event.target.error.name) {
-      case 'NotFoundError':
-        this._reportErrorAndCancelLoading(Common.UIString('File "%s" not found.', reader.fileName()));
-        break;
-      case 'NotReadableError':
-        this._reportErrorAndCancelLoading(Common.UIString('File "%s" is not readable', reader.fileName()));
-        break;
-      case 'AbortError':
-        break;
-      default:
-        this._reportErrorAndCancelLoading(
-            Common.UIString('An error occurred while reading the file "%s"', reader.fileName()));
-    }
-  }
-
-  /**
    * @param {string} text
    */
   _parseCPUProfileFormat(text) {
@@ -288,39 +241,3 @@
   SkippingTail: Symbol('SkippingTail'),
   LoadingCPUProfileFormat: Symbol('LoadingCPUProfileFormat')
 };
-
-/**
- * @implements {Bindings.OutputStreamDelegate}
- * @unrestricted
- */
-Timeline.TracingTimelineSaver = class {
-  /**
-   * @override
-   */
-  onTransferStarted() {
-  }
-
-  /**
-   * @override
-   */
-  onTransferFinished() {
-  }
-
-  /**
-   * @override
-   * @param {!Bindings.ChunkedReader} reader
-   */
-  onChunkTransferred(reader) {
-  }
-
-  /**
-   * @override
-   * @param {!Bindings.ChunkedReader} reader
-   * @param {!Event} event
-   */
-  onError(reader, event) {
-    var error = event.target.error;
-    Common.console.error(
-        Common.UIString('Failed to save timeline: %s (%s, %s)', error.message, error.name, error.code));
-  }
-};
diff --git a/third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js b/third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js
index efd952c7..5a66f66f 100644
--- a/third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js
+++ b/third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js
@@ -365,7 +365,11 @@
     if (!accepted)
       return;
 
-    performanceModel.save(stream, new Timeline.TracingTimelineSaver());
+    var error = await performanceModel.save(stream);
+    if (!error)
+      return;
+    Common.console.error(
+        Common.UIString('Failed to save timeline: %s (%s, %s)', error.message, error.name, error.code));
   }
 
   async _showHistory() {
@@ -387,12 +391,8 @@
     return true;
   }
 
-  /**
-   * @return {boolean}
-   */
   _selectFileToLoad() {
     this._fileSelectorElement.click();
-    return true;
   }
 
   /**
diff --git a/third_party/WebKit/Source/devtools/front_end/timeline_model/TimelineJSProfile.js b/third_party/WebKit/Source/devtools/front_end/timeline_model/TimelineJSProfile.js
index 0d15c58..d664afff 100644
--- a/third_party/WebKit/Source/devtools/front_end/timeline_model/TimelineJSProfile.js
+++ b/third_party/WebKit/Source/devtools/front_end/timeline_model/TimelineJSProfile.js
@@ -143,18 +143,21 @@
     function filterStackFrames(stack) {
       if (showAllEvents)
         return;
-      var isPreviousFrameNative = false;
+      var previousNativeFrameName = null;
       for (var i = 0, j = 0; i < stack.length; ++i) {
         const frame = stack[i];
         const url = frame.url;
         const isNativeFrame = url && url.startsWith('native ');
         if (!showNativeFunctions && isNativeFrame)
           continue;
-        if (TimelineModel.TimelineJSProfileProcessor.isNativeRuntimeFrame(frame) && !showNativeName(frame.functionName))
+        var isNativeRuntimeFrame = TimelineModel.TimelineJSProfileProcessor.isNativeRuntimeFrame(frame);
+        if (isNativeRuntimeFrame && !showNativeName(frame.functionName))
           continue;
-        if (isPreviousFrameNative && isNativeFrame)
+        var nativeFrameName =
+            isNativeRuntimeFrame ? TimelineModel.TimelineJSProfileProcessor.nativeGroup(frame.functionName) : null;
+        if (previousNativeFrameName && previousNativeFrameName === nativeFrameName)
           continue;
-        isPreviousFrameNative = isNativeFrame;
+        previousNativeFrameName = nativeFrameName;
         stack[j++] = frame;
       }
       stack.length = j;
@@ -214,22 +217,11 @@
    * @return {?TimelineModel.TimelineJSProfileProcessor.NativeGroups}
    */
   static nativeGroup(nativeName) {
-    var map = TimelineModel.TimelineJSProfileProcessor.nativeGroup._map;
-    if (!map) {
-      const nativeGroups = TimelineModel.TimelineJSProfileProcessor.NativeGroups;
-      map = new Map([
-        ['Compile', nativeGroups.Compile], ['CompileCode', nativeGroups.Compile],
-        ['CompileCodeLazy', nativeGroups.Compile], ['CompileDeserialize', nativeGroups.Compile],
-        ['CompileEval', nativeGroups.Compile], ['CompileFullCode', nativeGroups.Compile],
-        ['CompileIgnition', nativeGroups.Compile], ['CompilerDispatcher', nativeGroups.Compile],
-        ['CompileSerialize', nativeGroups.Compile], ['ParseProgram', nativeGroups.Parse],
-        ['ParseFunction', nativeGroups.Parse], ['RecompileConcurrent', nativeGroups.Compile],
-        ['RecompileSynchronous', nativeGroups.Compile], ['ParseLazy', nativeGroups.Parse]
-      ]);
-      /** @type {!Map<string, !TimelineModel.TimelineJSProfileProcessor.NativeGroups>} */
-      TimelineModel.TimelineJSProfileProcessor.nativeGroup._map = map;
-    }
-    return map.get(nativeName) || null;
+    if (nativeName.startsWith('Parse'))
+      return TimelineModel.TimelineJSProfileProcessor.NativeGroups.Parse;
+    if (nativeName.startsWith('Compile') || nativeName.startsWith('Recompile'))
+      return TimelineModel.TimelineJSProfileProcessor.NativeGroups.Compile;
+    return null;
   }
 
   /**
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/textButton.css b/third_party/WebKit/Source/devtools/front_end/ui/textButton.css
index 0cb514c..2d40651 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui/textButton.css
+++ b/third_party/WebKit/Source/devtools/front_end/ui/textButton.css
@@ -10,7 +10,7 @@
     font-size: 12px;
     border: 1px solid rgba(0, 0, 0, 0.2);
     border-radius: 2px;
-    padding: 3px 12px;
+    padding: 0px 12px;
     font-weight: 500;
     color: #333;
     background-color: #fff;
diff --git a/third_party/WebKit/Source/modules/accessibility/AXMediaControls.cpp b/third_party/WebKit/Source/modules/accessibility/AXMediaControls.cpp
index 4446167..7058ede 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXMediaControls.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AXMediaControls.cpp
@@ -28,8 +28,10 @@
 
 #include "modules/accessibility/AXMediaControls.h"
 
+#include "core/html/HTMLInputElement.h"
 #include "core/layout/LayoutObject.h"
 #include "modules/accessibility/AXObjectCacheImpl.h"
+#include "modules/media_controls/elements/MediaControlElementsHelper.h"
 #include "modules/media_controls/elements/MediaControlTimeDisplayElement.h"
 #include "platform/text/PlatformLocale.h"
 
@@ -52,7 +54,8 @@
     AXObjectCacheImpl& ax_object_cache) {
   DCHECK(layout_object->GetNode());
 
-  switch (GetMediaControlElementType(layout_object->GetNode())) {
+  switch (MediaControlElementsHelper::GetMediaControlElementType(
+      layout_object->GetNode())) {
     case kMediaSlider:
       return AccessibilityMediaTimeline::Create(layout_object, ax_object_cache);
 
@@ -98,7 +101,8 @@
   if (!GetLayoutObject() || !GetLayoutObject()->GetNode())
     return kMediaTimelineContainer;  // Timeline container is not accessible.
 
-  return GetMediaControlElementType(GetLayoutObject()->GetNode());
+  return MediaControlElementsHelper::GetMediaControlElementType(
+      GetLayoutObject()->GetNode());
 }
 
 String AccessibilityMediaControl::TextAlternative(
diff --git a/third_party/WebKit/Source/modules/accessibility/AXMediaControls.h b/third_party/WebKit/Source/modules/accessibility/AXMediaControls.h
index 07b70bf..10324d4 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXMediaControls.h
+++ b/third_party/WebKit/Source/modules/accessibility/AXMediaControls.h
@@ -29,8 +29,8 @@
 #ifndef AXMediaControls_h
 #define AXMediaControls_h
 
-#include "core/html/shadow/MediaControlElementTypes.h"
 #include "modules/accessibility/AXSlider.h"
+#include "modules/media_controls/elements/MediaControlElementType.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp b/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp
index b806d32..54059b9 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp
@@ -63,11 +63,11 @@
 #include "core/html/TextControlElement.h"
 #include "core/html/forms/RadioInputType.h"
 #include "core/html/parser/HTMLParserIdioms.h"
-#include "core/html/shadow/MediaControlElementTypes.h"
 #include "core/layout/LayoutBlockFlow.h"
 #include "core/layout/LayoutObject.h"
 #include "core/svg/SVGElement.h"
 #include "modules/accessibility/AXObjectCacheImpl.h"
+#include "modules/media_controls/elements/MediaControlElementsHelper.h"
 #include "platform/text/PlatformLocale.h"
 #include "platform/weborigin/KURL.h"
 #include "platform/wtf/text/StringBuilder.h"
@@ -1076,7 +1076,8 @@
   if (!node)
     return true;
 
-  return isHTMLVideoElement(ToParentMediaElement(node));
+  return isHTMLVideoElement(
+      MediaControlElementsHelper::ToParentMediaElement(node));
 }
 
 bool AXNodeObject::IsEmbeddedObject() const {
diff --git a/third_party/WebKit/Source/modules/bluetooth/Bluetooth.cpp b/third_party/WebKit/Source/modules/bluetooth/Bluetooth.cpp
index 4b5f89b..dd2ba69 100644
--- a/third_party/WebKit/Source/modules/bluetooth/Bluetooth.cpp
+++ b/third_party/WebKit/Source/modules/bluetooth/Bluetooth.cpp
@@ -20,8 +20,8 @@
 #include "modules/bluetooth/BluetoothRemoteGATTCharacteristic.h"
 #include "modules/bluetooth/BluetoothUUID.h"
 #include "modules/bluetooth/RequestDeviceOptions.h"
-#include "public/platform/InterfaceProvider.h"
 #include "public/platform/Platform.h"
+#include "services/service_manager/public/cpp/interface_provider.h"
 
 namespace blink {
 
@@ -171,16 +171,11 @@
             "Must be handling a user gesture to show a permission request."));
   }
 
-  if (!service_) {
-    InterfaceProvider* interface_provider = nullptr;
-    if (context->IsDocument()) {
-      Document* document = ToDocument(context);
-      if (document->GetFrame())
-        interface_provider = document->GetFrame()->GetInterfaceProvider();
+  if (!service_ && context->IsDocument()) {
+    LocalFrame* frame = ToDocument(context)->GetFrame();
+    if (frame) {
+      frame->GetInterfaceProvider().GetInterface(mojo::MakeRequest(&service_));
     }
-
-    if (interface_provider)
-      interface_provider->GetInterface(mojo::MakeRequest(&service_));
   }
 
   if (!service_) {
diff --git a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2DTest.cpp b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2DTest.cpp
index af5bee2..6eef0d9e 100644
--- a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2DTest.cpp
+++ b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2DTest.cpp
@@ -199,9 +199,8 @@
 void CanvasRenderingContext2DTest::SetUp() {
   Page::PageClients page_clients;
   FillWithEmptyClients(page_clients);
-  dummy_page_holder_ =
-      DummyPageHolder::Create(IntSize(800, 600), &page_clients, nullptr,
-                              override_settings_function_, nullptr);
+  dummy_page_holder_ = DummyPageHolder::Create(
+      IntSize(800, 600), &page_clients, nullptr, override_settings_function_);
   document_ = &dummy_page_holder_->GetDocument();
   document_->documentElement()->setInnerHTML(
       "<body><canvas id='c'></canvas></body>");
diff --git a/third_party/WebKit/Source/modules/exported/WebEmbeddedWorkerImpl.cpp b/third_party/WebKit/Source/modules/exported/WebEmbeddedWorkerImpl.cpp
index 48ea22b2..1e29852 100644
--- a/third_party/WebKit/Source/modules/exported/WebEmbeddedWorkerImpl.cpp
+++ b/third_party/WebKit/Source/modules/exported/WebEmbeddedWorkerImpl.cpp
@@ -68,7 +68,6 @@
 #include "platform/weborigin/SecurityOrigin.h"
 #include "platform/wtf/Functional.h"
 #include "platform/wtf/PtrUtil.h"
-#include "public/platform/Platform.h"
 #include "public/platform/WebContentSettingsClient.h"
 #include "public/platform/WebURLRequest.h"
 #include "public/platform/WebWorkerFetchContext.h"
@@ -298,7 +297,7 @@
   settings->SetAllowRunningOfInsecureContent(false);
   settings->SetDataSaverEnabled(worker_start_data_.data_saver_enabled);
   main_frame_ = WebFactory::GetInstance().CreateMainWebLocalFrameBase(
-      web_view_, this, nullptr, nullptr);
+      web_view_, this, nullptr);
   main_frame_->SetDevToolsAgentClient(this);
 
   // If we were asked to wait for debugger then it is the good time to do that.
diff --git a/third_party/WebKit/Source/modules/geolocation/Geolocation.cpp b/third_party/WebKit/Source/modules/geolocation/Geolocation.cpp
index a49fea9..fba227d 100644
--- a/third_party/WebKit/Source/modules/geolocation/Geolocation.cpp
+++ b/third_party/WebKit/Source/modules/geolocation/Geolocation.cpp
@@ -40,8 +40,8 @@
 #include "modules/permissions/PermissionUtils.h"
 #include "platform/wtf/Assertions.h"
 #include "platform/wtf/CurrentTime.h"
-#include "public/platform/InterfaceProvider.h"
 #include "public/platform/Platform.h"
+#include "services/service_manager/public/cpp/interface_provider.h"
 
 namespace blink {
 namespace {
@@ -446,7 +446,7 @@
     return;
 
   geolocation_permission_ = kPermissionRequested;
-  frame->GetInterfaceProvider()->GetInterface(
+  frame->GetInterfaceProvider().GetInterface(
       mojo::MakeRequest(&permission_service_));
   permission_service_.set_connection_error_handler(
       ConvertToBaseCallback(WTF::Bind(&Geolocation::OnPermissionConnectionError,
@@ -518,7 +518,7 @@
   if (geolocation_service_)
     return;
 
-  GetFrame()->GetInterfaceProvider()->GetInterface(
+  GetFrame()->GetInterfaceProvider().GetInterface(
       mojo::MakeRequest(&geolocation_service_));
   geolocation_service_.set_connection_error_handler(ConvertToBaseCallback(
       WTF::Bind(&Geolocation::OnGeolocationConnectionError,
diff --git a/third_party/WebKit/Source/modules/imagecapture/ImageCapture.cpp b/third_party/WebKit/Source/modules/imagecapture/ImageCapture.cpp
index 00f836c1..fea051f 100644
--- a/third_party/WebKit/Source/modules/imagecapture/ImageCapture.cpp
+++ b/third_party/WebKit/Source/modules/imagecapture/ImageCapture.cpp
@@ -24,6 +24,7 @@
 #include "public/platform/Platform.h"
 #include "public/platform/WebImageCaptureFrameGrabber.h"
 #include "public/platform/WebMediaStreamTrack.h"
+#include "services/service_manager/public/cpp/interface_provider.h"
 
 namespace blink {
 
@@ -623,8 +624,7 @@
   DCHECK(stream_track_);
   DCHECK(!service_.is_bound());
 
-  GetFrame()->GetInterfaceProvider()->GetInterface(
-      mojo::MakeRequest(&service_));
+  GetFrame()->GetInterfaceProvider().GetInterface(mojo::MakeRequest(&service_));
 
   service_.set_connection_error_handler(ConvertToBaseCallback(WTF::Bind(
       &ImageCapture::OnServiceConnectionError, WrapWeakPersistent(this))));
diff --git a/third_party/WebKit/Source/modules/installedapp/InstalledAppController.cpp b/third_party/WebKit/Source/modules/installedapp/InstalledAppController.cpp
index a42d2e0..0348980 100644
--- a/third_party/WebKit/Source/modules/installedapp/InstalledAppController.cpp
+++ b/third_party/WebKit/Source/modules/installedapp/InstalledAppController.cpp
@@ -7,7 +7,7 @@
 #include "core/dom/Document.h"
 #include "core/frame/LocalFrame.h"
 #include "platform/wtf/Functional.h"
-#include "public/platform/InterfaceProvider.h"
+#include "services/service_manager/public/cpp/interface_provider.h"
 
 #include <utility>
 
@@ -105,7 +105,7 @@
   }
 
   if (!provider_) {
-    GetSupplementable()->GetInterfaceProvider()->GetInterface(
+    GetSupplementable()->GetInterfaceProvider().GetInterface(
         mojo::MakeRequest(&provider_));
     // TODO(mgiuca): Set a connection error handler. This requires a refactor to
     // work like NavigatorShare.cpp (retain a persistent list of clients to
diff --git a/third_party/WebKit/Source/modules/keyboard_lock/NavigatorKeyboardLock.cpp b/third_party/WebKit/Source/modules/keyboard_lock/NavigatorKeyboardLock.cpp
index 887f9b6..d4718b0 100644
--- a/third_party/WebKit/Source/modules/keyboard_lock/NavigatorKeyboardLock.cpp
+++ b/third_party/WebKit/Source/modules/keyboard_lock/NavigatorKeyboardLock.cpp
@@ -11,7 +11,7 @@
 #include "platform/heap/Persistent.h"
 #include "platform/wtf/Assertions.h"
 #include "platform/wtf/Functional.h"
-#include "public/platform/InterfaceProvider.h"
+#include "services/service_manager/public/cpp/interface_provider.h"
 
 namespace blink {
 
@@ -82,7 +82,7 @@
     if (!frame) {
       return false;
     }
-    frame->GetInterfaceProvider()->GetInterface(mojo::MakeRequest(&service_));
+    frame->GetInterfaceProvider().GetInterface(mojo::MakeRequest(&service_));
   }
 
   DCHECK(service_);
diff --git a/third_party/WebKit/Source/modules/media_controls/BUILD.gn b/third_party/WebKit/Source/modules/media_controls/BUILD.gn
index 77f7560..8b2e1c59 100644
--- a/third_party/WebKit/Source/modules/media_controls/BUILD.gn
+++ b/third_party/WebKit/Source/modules/media_controls/BUILD.gn
@@ -20,12 +20,19 @@
     "elements/MediaControlCastButtonElement.h",
     "elements/MediaControlCurrentTimeDisplayElement.cpp",
     "elements/MediaControlCurrentTimeDisplayElement.h",
+    "elements/MediaControlDivElement.cpp",
+    "elements/MediaControlDivElement.h",
     "elements/MediaControlDownloadButtonElement.cpp",
     "elements/MediaControlDownloadButtonElement.h",
+    "elements/MediaControlElementBase.cpp",
+    "elements/MediaControlElementBase.h",
+    "elements/MediaControlElementType.h",
     "elements/MediaControlElementsHelper.cpp",
     "elements/MediaControlElementsHelper.h",
     "elements/MediaControlFullscreenButtonElement.cpp",
     "elements/MediaControlFullscreenButtonElement.h",
+    "elements/MediaControlInputElement.cpp",
+    "elements/MediaControlInputElement.h",
     "elements/MediaControlMuteButtonElement.cpp",
     "elements/MediaControlMuteButtonElement.h",
     "elements/MediaControlOverflowMenuButtonElement.cpp",
diff --git a/third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.cpp b/third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.cpp
index 9bf2b7bd7..cabbe8b 100644
--- a/third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.cpp
+++ b/third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.cpp
@@ -1062,7 +1062,7 @@
   // won't benefit from that anwyay, we just do it here like JS will.
 
   // Controls that we'll hide / show, in order of decreasing priority.
-  MediaControlElement* elements[] = {
+  MediaControlElementBase* elements[] = {
       // Exclude m_overflowMenu; we handle it specially.
       play_button_.Get(),
       fullscreen_button_.Get(),
@@ -1085,7 +1085,7 @@
     // This prevents the wrong controls from being shown briefly
     // immediately after the first layout and paint, but before we have
     // a chance to revise them.
-    for (MediaControlElement* element : elements) {
+    for (MediaControlElementBase* element : elements) {
       if (element)
         element->SetDoesFit(false);
     }
@@ -1115,10 +1115,10 @@
   overflow_menu_->SetIsWanted(true);
   int used_width = minimum_width;
 
-  std::list<MediaControlElement*> overflow_elements;
-  MediaControlElement* first_displaced_element = nullptr;
+  std::list<MediaControlElementBase*> overflow_elements;
+  MediaControlElementBase* first_displaced_element = nullptr;
   // For each control that fits, enable it in order of decreasing priority.
-  for (MediaControlElement* element : elements) {
+  for (MediaControlElementBase* element : elements) {
     if (!element)
       continue;
     int width = minimum_width;
diff --git a/third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.h b/third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.h
index c8bba03..530b863 100644
--- a/third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.h
+++ b/third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.h
@@ -98,7 +98,6 @@
     // There is no update because only the overlay is expected to change.
     RefreshCastButtonVisibilityWithoutUpdate();
   }
-  Document& OwnerDocument() { return GetDocument(); }
 
   // Called by the fullscreen buttons to toggle fulllscreen on/off.
   void EnterFullscreen();
diff --git a/third_party/WebKit/Source/modules/media_controls/MediaControlsImplTest.cpp b/third_party/WebKit/Source/modules/media_controls/MediaControlsImplTest.cpp
index 5745aca5..6dc7898d 100644
--- a/third_party/WebKit/Source/modules/media_controls/MediaControlsImplTest.cpp
+++ b/third_party/WebKit/Source/modules/media_controls/MediaControlsImplTest.cpp
@@ -18,7 +18,6 @@
 #include "core/frame/Settings.h"
 #include "core/html/HTMLElement.h"
 #include "core/html/HTMLVideoElement.h"
-#include "core/html/shadow/MediaControlElementTypes.h"
 #include "core/input/EventHandler.h"
 #include "core/layout/LayoutObject.h"
 #include "core/loader/EmptyClients.h"
diff --git a/third_party/WebKit/Source/modules/media_controls/MediaControlsMediaEventListener.cpp b/third_party/WebKit/Source/modules/media_controls/MediaControlsMediaEventListener.cpp
index 093d15c..c51a3c1 100644
--- a/third_party/WebKit/Source/modules/media_controls/MediaControlsMediaEventListener.cpp
+++ b/third_party/WebKit/Source/modules/media_controls/MediaControlsMediaEventListener.cpp
@@ -66,12 +66,12 @@
 
     // TODO(avayvod, mlamouri): Attach can be called twice. See
     // https://crbug.com/713275.
-    if (remote_playback_availability_callback_id_ == -1) {
-      remote_playback_availability_callback_id_ =
+    if (!remote_playback_availability_callback_id_.has_value()) {
+      remote_playback_availability_callback_id_ = WTF::make_optional(
           remote->WatchAvailabilityInternal(new AvailabilityCallbackWrapper(
               WTF::Bind(&MediaControlsMediaEventListener::
                             OnRemotePlaybackAvailabilityChanged,
-                        WrapWeakPersistent(this))));
+                        WrapWeakPersistent(this)))));
     }
   }
 }
@@ -100,10 +100,12 @@
 
     // TODO(avayvod): apparently Detach() can be called without a previous
     // Attach() call. See https://crbug.com/713275 for more details.
-    if (remote_playback_availability_callback_id_ != -1) {
+    if (remote_playback_availability_callback_id_.has_value() &&
+        remote_playback_availability_callback_id_.value() !=
+            RemotePlayback::kWatchAvailabilityNotSupported) {
       remote->CancelWatchAvailabilityInternal(
-          remote_playback_availability_callback_id_);
-      remote_playback_availability_callback_id_ = -1;
+          remote_playback_availability_callback_id_.value());
+      remote_playback_availability_callback_id_.reset();
     }
   }
 }
diff --git a/third_party/WebKit/Source/modules/media_controls/MediaControlsMediaEventListener.h b/third_party/WebKit/Source/modules/media_controls/MediaControlsMediaEventListener.h
index 530d746..8c4a239 100644
--- a/third_party/WebKit/Source/modules/media_controls/MediaControlsMediaEventListener.h
+++ b/third_party/WebKit/Source/modules/media_controls/MediaControlsMediaEventListener.h
@@ -6,6 +6,7 @@
 #define MediaControlsMediaEventListener_h
 
 #include "core/events/EventListener.h"
+#include "platform/wtf/Optional.h"
 
 namespace blink {
 
@@ -39,7 +40,7 @@
   void OnRemotePlaybackAvailabilityChanged();
 
   Member<MediaControlsImpl> media_controls_;
-  int remote_playback_availability_callback_id_ = -1;
+  WTF::Optional<int> remote_playback_availability_callback_id_;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlCastButtonElement.cpp b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlCastButtonElement.cpp
index fedd97f..bab9a01 100644
--- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlCastButtonElement.cpp
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlCastButtonElement.cpp
@@ -84,14 +84,14 @@
   return true;
 }
 
-WebLocalizedString::Name
-MediaControlCastButtonElement::GetOverflowStringName() {
+WebLocalizedString::Name MediaControlCastButtonElement::GetOverflowStringName()
+    const {
   if (IsPlayingRemotely())
     return WebLocalizedString::kOverflowMenuStopCast;
   return WebLocalizedString::kOverflowMenuCast;
 }
 
-bool MediaControlCastButtonElement::HasOverflowButton() {
+bool MediaControlCastButtonElement::HasOverflowButton() const {
   return true;
 }
 
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlCastButtonElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlCastButtonElement.h
index 0d29cff..a2f859e9 100644
--- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlCastButtonElement.h
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlCastButtonElement.h
@@ -5,7 +5,7 @@
 #ifndef MediaControlCastButtonElement_h
 #define MediaControlCastButtonElement_h
 
-#include "core/html/shadow/MediaControlElementTypes.h"
+#include "modules/media_controls/elements/MediaControlInputElement.h"
 
 namespace blink {
 
@@ -26,8 +26,8 @@
 
   // MediaControlInputElement overrides.
   bool WillRespondToMouseClickEvents() override;
-  WebLocalizedString::Name GetOverflowStringName() override;
-  bool HasOverflowButton() override;
+  WebLocalizedString::Name GetOverflowStringName() const override;
+  bool HasOverflowButton() const override;
 
  private:
   // This is used for UMA histogram (Cast.Sender.Overlay). New values should
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlDivElement.cpp b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlDivElement.cpp
new file mode 100644
index 0000000..92d5e4c90
--- /dev/null
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlDivElement.cpp
@@ -0,0 +1,26 @@
+// 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 "modules/media_controls/elements/MediaControlDivElement.h"
+
+#include "modules/media_controls/MediaControlsImpl.h"
+
+namespace blink {
+
+MediaControlDivElement::MediaControlDivElement(
+    MediaControlsImpl& media_controls,
+    MediaControlElementType display_type)
+    : HTMLDivElement(media_controls.GetDocument()),
+      MediaControlElementBase(media_controls, display_type, this) {}
+
+bool MediaControlDivElement::IsMediaControlElement() const {
+  return true;
+}
+
+DEFINE_TRACE(MediaControlDivElement) {
+  HTMLDivElement::Trace(visitor);
+  MediaControlElementBase::Trace(visitor);
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlDivElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlDivElement.h
new file mode 100644
index 0000000..de305b6
--- /dev/null
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlDivElement.h
@@ -0,0 +1,32 @@
+// 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 MediaControlDivElement_h
+#define MediaControlDivElement_h
+
+#include "core/html/HTMLDivElement.h"
+#include "modules/media_controls/elements/MediaControlElementBase.h"
+
+namespace blink {
+
+class MediaControlsImpl;
+
+// MediaControlElementBase implementation based on a <div>. Used for panels, and
+// floating UI.
+class MediaControlDivElement : public HTMLDivElement,
+                               public MediaControlElementBase {
+  USING_GARBAGE_COLLECTED_MIXIN(MediaControlDivElement);
+
+  DECLARE_VIRTUAL_TRACE();
+
+ protected:
+  MediaControlDivElement(MediaControlsImpl&, MediaControlElementType);
+
+ private:
+  bool IsMediaControlElement() const final;
+};
+
+}  // namespace blink
+
+#endif  // MediaControlDivElement_h
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlDownloadButtonElement.cpp b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlDownloadButtonElement.cpp
index 2007c5d..fc58f57 100644
--- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlDownloadButtonElement.cpp
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlDownloadButtonElement.cpp
@@ -77,16 +77,16 @@
 }
 
 WebLocalizedString::Name
-MediaControlDownloadButtonElement::GetOverflowStringName() {
+MediaControlDownloadButtonElement::GetOverflowStringName() const {
   return WebLocalizedString::kOverflowMenuDownload;
 }
 
-bool MediaControlDownloadButtonElement::HasOverflowButton() {
+bool MediaControlDownloadButtonElement::HasOverflowButton() const {
   return true;
 }
 
 void MediaControlDownloadButtonElement::SetIsWanted(bool wanted) {
-  MediaControlElement::SetIsWanted(wanted);
+  MediaControlInputElement::SetIsWanted(wanted);
 
   if (!IsWanted())
     return;
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlDownloadButtonElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlDownloadButtonElement.h
index da1f7e08..ca659182 100644
--- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlDownloadButtonElement.h
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlDownloadButtonElement.h
@@ -5,7 +5,7 @@
 #ifndef MediaControlDownloadButtonElement_h
 #define MediaControlDownloadButtonElement_h
 
-#include "core/html/shadow/MediaControlElementTypes.h"
+#include "modules/media_controls/elements/MediaControlInputElement.h"
 
 namespace blink {
 
@@ -23,8 +23,8 @@
 
   // MediaControlInputElement overrides.
   // TODO(mlamouri): add WillRespondToMouseClickEvents
-  WebLocalizedString::Name GetOverflowStringName() override;
-  bool HasOverflowButton() override;
+  WebLocalizedString::Name GetOverflowStringName() const override;
+  bool HasOverflowButton() const override;
   void SetIsWanted(bool) override;
 
   DECLARE_VIRTUAL_TRACE();
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementBase.cpp b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementBase.cpp
new file mode 100644
index 0000000..d5352e8
--- /dev/null
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementBase.cpp
@@ -0,0 +1,109 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "modules/media_controls/elements/MediaControlElementBase.h"
+
+#include "core/html/HTMLMediaElement.h"
+#include "core/layout/LayoutObject.h"
+#include "modules/media_controls/MediaControlsImpl.h"
+#include "platform/text/PlatformLocale.h"
+
+namespace blink {
+
+void MediaControlElementBase::SetIsWanted(bool wanted) {
+  if (is_wanted_ == wanted)
+    return;
+
+  is_wanted_ = wanted;
+  UpdateShownState();
+}
+
+bool MediaControlElementBase::IsWanted() const {
+  return is_wanted_;
+}
+
+void MediaControlElementBase::SetDoesFit(bool fits) {
+  does_fit_ = fits;
+  UpdateShownState();
+}
+
+MediaControlElementType MediaControlElementBase::DisplayType() const {
+  return display_type_;
+}
+
+bool MediaControlElementBase::HasOverflowButton() const {
+  return false;
+}
+
+void MediaControlElementBase::ShouldShowButtonInOverflowMenu(bool should_show) {
+  if (!HasOverflowButton())
+    return;
+
+  if (should_show) {
+    overflow_menu_element_->RemoveInlineStyleProperty(CSSPropertyDisplay);
+  } else {
+    overflow_menu_element_->SetInlineStyleProperty(CSSPropertyDisplay,
+                                                   CSSValueNone);
+  }
+}
+
+String MediaControlElementBase::GetOverflowMenuString() const {
+  return MediaElement().GetLocale().QueryString(GetOverflowStringName());
+}
+
+void MediaControlElementBase::UpdateOverflowString() {
+  if (overflow_menu_element_ && overflow_menu_text_)
+    overflow_menu_text_->ReplaceWholeText(GetOverflowMenuString());
+}
+
+MediaControlElementBase::MediaControlElementBase(
+    MediaControlsImpl& media_controls,
+    MediaControlElementType display_type,
+    HTMLElement* element)
+    : media_controls_(&media_controls),
+      display_type_(display_type),
+      element_(element),
+      is_wanted_(true),
+      does_fit_(true) {}
+
+MediaControlsImpl& MediaControlElementBase::GetMediaControls() const {
+  DCHECK(media_controls_);
+  return *media_controls_;
+}
+
+HTMLMediaElement& MediaControlElementBase::MediaElement() const {
+  return GetMediaControls().MediaElement();
+}
+
+void MediaControlElementBase::SetDisplayType(
+    MediaControlElementType display_type) {
+  if (display_type == display_type_)
+    return;
+
+  display_type_ = display_type;
+  if (LayoutObject* object = element_->GetLayoutObject())
+    object->SetShouldDoFullPaintInvalidation();
+}
+
+void MediaControlElementBase::UpdateShownState() {
+  if (is_wanted_ && does_fit_)
+    element_->RemoveInlineStyleProperty(CSSPropertyDisplay);
+  else
+    element_->SetInlineStyleProperty(CSSPropertyDisplay, CSSValueNone);
+}
+
+WebLocalizedString::Name MediaControlElementBase::GetOverflowStringName()
+    const {
+  NOTREACHED();
+  return WebLocalizedString::kAXAMPMFieldText;
+}
+
+DEFINE_TRACE(MediaControlElementBase) {
+  visitor->Trace(media_controls_);
+  visitor->Trace(element_);
+  visitor->Trace(overflow_menu_element_);
+  visitor->Trace(overflow_menu_text_);
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementBase.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementBase.h
new file mode 100644
index 0000000..08c216a
--- /dev/null
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementBase.h
@@ -0,0 +1,94 @@
+// 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 MediaControlElementBase_h
+#define MediaControlElementBase_h
+
+#include "core/dom/Element.h"
+#include "modules/media_controls/elements/MediaControlElementType.h"
+#include "platform/heap/GarbageCollected.h"
+#include "platform/heap/Visitor.h"
+#include "public/platform/WebLocalizedString.h"
+
+namespace blink {
+
+class Element;
+class HTMLElement;
+class HTMLMediaElement;
+class MediaControlsImpl;
+
+// MediaControlElementBase is the base class for all the media control elements.
+// It is sub-classed by MediaControlInputElement and MediaControlDivElement
+// which are then used by the final implementations.
+class MediaControlElementBase : public GarbageCollectedMixin {
+ public:
+  // These hold the state about whether this control should be shown if
+  // space permits.  These will also show / hide as needed.
+  virtual void SetIsWanted(bool);
+  bool IsWanted() const;
+
+  // Tell us whether we fit or not.  This will hide / show the control as
+  // needed, also.
+  void SetDoesFit(bool);
+
+  // Returns the display type of the element that is set at creation.
+  MediaControlElementType DisplayType() const;
+
+  // By default, media controls elements are not added to the overflow menu.
+  // Controls that can be added to the overflow menu should override this
+  // function and return true.
+  virtual bool HasOverflowButton() const;
+
+  // If true, shows the overflow menu item if it exists. Hides it if false.
+  void ShouldShowButtonInOverflowMenu(bool);
+
+  // Returns a string representation of the media control element. Used for
+  // the overflow menu.
+  String GetOverflowMenuString() const;
+
+  // Updates the value of the Text string shown in the overflow menu.
+  void UpdateOverflowString();
+
+  DECLARE_VIRTUAL_TRACE();
+
+ protected:
+  MediaControlElementBase(MediaControlsImpl&,
+                          MediaControlElementType,
+                          HTMLElement*);
+
+  MediaControlsImpl& GetMediaControls() const;
+
+  HTMLMediaElement& MediaElement() const;
+
+  void SetDisplayType(MediaControlElementType);
+
+  // Represents the overflow menu element for this media control.
+  // The Element contains the button that the user can click on, but having
+  // the button within an Element enables us to style the overflow menu.
+  // Setting this pointer is optional so it may be null.
+  Member<Element> overflow_menu_element_;
+
+  // The text representation of the button within the overflow menu.
+  Member<Text> overflow_menu_text_;
+
+ private:
+  // Hide or show based on our fits / wanted state.  We want to show
+  // if and only if we're wanted and we fit.
+  void UpdateShownState();
+
+  // Returns a string representation of the media control element.
+  // Subclasses should override this method to return the string representation
+  // of the overflow button.
+  virtual WebLocalizedString::Name GetOverflowStringName() const;
+
+  Member<MediaControlsImpl> media_controls_;
+  MediaControlElementType display_type_;
+  Member<HTMLElement> element_;
+  bool is_wanted_ : 1;
+  bool does_fit_ : 1;
+};
+
+}  // namespace blink
+
+#endif  // MediaControlElementBase_h
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementType.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementType.h
new file mode 100644
index 0000000..3d0678f2
--- /dev/null
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementType.h
@@ -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.
+
+#ifndef MediaControlElementType_h
+#define MediaControlElementType_h
+
+// Classes sub-classing MediaControlElementBase will all have a defined type
+// from this list. It is used by code that need to know what type of media
+// control element it is interacting with.
+enum MediaControlElementType {
+  kMediaEnterFullscreenButton = 0,
+  kMediaMuteButton,
+  kMediaPlayButton,
+  kMediaSlider,
+  kMediaSliderThumb,
+  kMediaShowClosedCaptionsButton,
+  kMediaHideClosedCaptionsButton,
+  kMediaTextTrackList,
+  kMediaUnMuteButton,
+  kMediaPauseButton,
+  kMediaTimelineContainer,
+  kMediaCurrentTimeDisplay,
+  kMediaTimeRemainingDisplay,
+  kMediaTrackSelectionCheckmark,
+  kMediaControlsPanel,
+  kMediaVolumeSliderContainer,
+  kMediaVolumeSlider,
+  kMediaVolumeSliderThumb,
+  kMediaExitFullscreenButton,
+  kMediaOverlayPlayButton,
+  kMediaCastOffButton,
+  kMediaCastOnButton,
+  kMediaOverlayCastOffButton,
+  kMediaOverlayCastOnButton,
+  kMediaOverflowButton,
+  kMediaOverflowList,
+  kMediaDownloadButton,
+};
+
+#endif  // MediaControlElementType_h
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementsHelper.cpp b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementsHelper.cpp
index 0771867..0aeb5cc 100644
--- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementsHelper.cpp
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementsHelper.cpp
@@ -5,8 +5,11 @@
 #include "modules/media_controls/elements/MediaControlElementsHelper.h"
 
 #include "core/events/Event.h"
+#include "core/html/HTMLMediaElement.h"
 #include "core/layout/LayoutSlider.h"
 #include "core/layout/api/LayoutSliderItem.h"
+#include "modules/media_controls/elements/MediaControlDivElement.h"
+#include "modules/media_controls/elements/MediaControlInputElement.h"
 
 namespace blink {
 
@@ -47,4 +50,27 @@
          type == EventTypeNames::pointermove;
 }
 
+// static
+MediaControlElementType MediaControlElementsHelper::GetMediaControlElementType(
+    const Node* node) {
+  SECURITY_DCHECK(node->IsMediaControlElement());
+  const HTMLElement* element = ToHTMLElement(node);
+  if (isHTMLInputElement(*element))
+    return static_cast<const MediaControlInputElement*>(element)->DisplayType();
+  return static_cast<const MediaControlDivElement*>(element)->DisplayType();
+}
+
+// static
+const HTMLMediaElement* MediaControlElementsHelper::ToParentMediaElement(
+    const Node* node) {
+  if (!node)
+    return nullptr;
+  const Node* shadow_host = node->OwnerShadowHost();
+  if (!shadow_host)
+    return nullptr;
+
+  return IsHTMLMediaElement(shadow_host) ? ToHTMLMediaElement(shadow_host)
+                                         : nullptr;
+}
+
 }  // namespace blink
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementsHelper.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementsHelper.h
index 557ba729..d4f0f3f 100644
--- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementsHelper.h
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlElementsHelper.h
@@ -5,12 +5,16 @@
 #ifndef MediaControlElementsHelper_h
 #define MediaControlElementsHelper_h
 
+#include "modules/ModulesExport.h"
+#include "modules/media_controls/elements/MediaControlElementType.h"
 #include "platform/wtf/Allocator.h"
 
 namespace blink {
 
 class Event;
+class HTMLMediaElement;
 class LayoutObject;
+class Node;
 
 // Helper class for media control elements. It contains methods, constants or
 // concepts shared by more than one element.
@@ -23,6 +27,17 @@
   // Sliders (the volume control and timeline) need to capture some additional
   // events used when dragging the thumb.
   static bool IsUserInteractionEventForSlider(Event*, LayoutObject*);
+
+  // Returns the MediaControlElementType associated with a given |Node|. The
+  // |node| _must_ be a media control element.
+  // Exported to be used by the accessibility module.
+  MODULES_EXPORT static MediaControlElementType GetMediaControlElementType(
+      const Node*);
+
+  // Returns the media element associated with a given |node|.
+  // Exported to be used by the accessibility module.
+  MODULES_EXPORT static const HTMLMediaElement* ToParentMediaElement(
+      const Node*);
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlFullscreenButtonElement.cpp b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlFullscreenButtonElement.cpp
index d47c72f..1c3c169 100644
--- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlFullscreenButtonElement.cpp
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlFullscreenButtonElement.cpp
@@ -33,13 +33,13 @@
 }
 
 WebLocalizedString::Name
-MediaControlFullscreenButtonElement::GetOverflowStringName() {
+MediaControlFullscreenButtonElement::GetOverflowStringName() const {
   if (MediaElement().IsFullscreen())
     return WebLocalizedString::kOverflowMenuExitFullscreen;
   return WebLocalizedString::kOverflowMenuEnterFullscreen;
 }
 
-bool MediaControlFullscreenButtonElement::HasOverflowButton() {
+bool MediaControlFullscreenButtonElement::HasOverflowButton() const {
   return true;
 }
 
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlFullscreenButtonElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlFullscreenButtonElement.h
index ca4d990..edd6016 100644
--- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlFullscreenButtonElement.h
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlFullscreenButtonElement.h
@@ -5,7 +5,7 @@
 #ifndef MediaControlFullscreenButtonElement_h
 #define MediaControlFullscreenButtonElement_h
 
-#include "core/html/shadow/MediaControlElementTypes.h"
+#include "modules/media_controls/elements/MediaControlInputElement.h"
 
 namespace blink {
 
@@ -22,8 +22,8 @@
 
   // MediaControlInputElement overrides.
   bool WillRespondToMouseClickEvents() override;
-  WebLocalizedString::Name GetOverflowStringName() override;
-  bool HasOverflowButton() override;
+  WebLocalizedString::Name GetOverflowStringName() const override;
+  bool HasOverflowButton() const override;
 
  private:
   void DefaultEventHandler(Event*) override;
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlInputElement.cpp b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlInputElement.cpp
new file mode 100644
index 0000000..595547c
--- /dev/null
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlInputElement.cpp
@@ -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.
+
+#include "modules/media_controls/elements/MediaControlInputElement.h"
+
+#include "core/html/HTMLLabelElement.h"
+#include "modules/media_controls/MediaControlsImpl.h"
+
+namespace blink {
+
+HTMLElement* MediaControlInputElement::CreateOverflowElement(
+    MediaControlsImpl& media_controls,
+    MediaControlInputElement* button) {
+  if (!button)
+    return nullptr;
+
+  // We don't want the button visible within the overflow menu.
+  button->SetIsWanted(false);
+
+  overflow_menu_text_ = Text::Create(media_controls.GetDocument(),
+                                     button->GetOverflowMenuString());
+
+  HTMLLabelElement* element =
+      HTMLLabelElement::Create(media_controls.GetDocument());
+  element->SetShadowPseudoId(
+      AtomicString("-internal-media-controls-overflow-menu-list-item"));
+  // Appending a button to a label element ensures that clicks on the label
+  // are passed down to the button, performing the action we'd expect.
+  element->AppendChild(button);
+  element->AppendChild(overflow_menu_text_);
+  overflow_menu_element_ = element;
+  return element;
+}
+
+MediaControlInputElement::MediaControlInputElement(
+    MediaControlsImpl& media_controls,
+    MediaControlElementType display_type)
+    : HTMLInputElement(media_controls.GetDocument(), false),
+      MediaControlElementBase(media_controls, display_type, this) {}
+
+void MediaControlInputElement::UpdateDisplayType() {}
+
+bool MediaControlInputElement::IsMediaControlElement() const {
+  return true;
+}
+
+bool MediaControlInputElement::IsMouseFocusable() const {
+  return false;
+}
+
+DEFINE_TRACE(MediaControlInputElement) {
+  HTMLInputElement::Trace(visitor);
+  MediaControlElementBase::Trace(visitor);
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlInputElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlInputElement.h
new file mode 100644
index 0000000..a84a846
--- /dev/null
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlInputElement.h
@@ -0,0 +1,40 @@
+// 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 MediaControlInputElement_h
+#define MediaControlInputElement_h
+
+#include "core/html/HTMLInputElement.h"
+#include "modules/media_controls/elements/MediaControlElementBase.h"
+
+namespace blink {
+
+class MediaControlsImpl;
+
+// MediaControlElementBase implementation based on an <input> element. Used by
+// buttons and sliders.
+class MediaControlInputElement : public HTMLInputElement,
+                                 public MediaControlElementBase {
+  USING_GARBAGE_COLLECTED_MIXIN(MediaControlInputElement);
+
+ public:
+  // Creates an overflow menu element with the given button as a child.
+  HTMLElement* CreateOverflowElement(MediaControlsImpl&,
+                                     MediaControlInputElement*);
+
+  DECLARE_VIRTUAL_TRACE();
+
+ protected:
+  MediaControlInputElement(MediaControlsImpl&, MediaControlElementType);
+
+ private:
+  virtual void UpdateDisplayType();
+
+  bool IsMouseFocusable() const override;
+  bool IsMediaControlElement() const final;
+};
+
+}  // namespace blink
+
+#endif  // MediaControlInputElement_h
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlMuteButtonElement.cpp b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlMuteButtonElement.cpp
index c4bc997..f0d352f1 100644
--- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlMuteButtonElement.cpp
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlMuteButtonElement.cpp
@@ -34,14 +34,14 @@
   UpdateOverflowString();
 }
 
-WebLocalizedString::Name
-MediaControlMuteButtonElement::GetOverflowStringName() {
+WebLocalizedString::Name MediaControlMuteButtonElement::GetOverflowStringName()
+    const {
   if (MediaElement().muted())
     return WebLocalizedString::kOverflowMenuUnmute;
   return WebLocalizedString::kOverflowMenuMute;
 }
 
-bool MediaControlMuteButtonElement::HasOverflowButton() {
+bool MediaControlMuteButtonElement::HasOverflowButton() const {
   return true;
 }
 
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlMuteButtonElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlMuteButtonElement.h
index c70fd28a..28c3d65 100644
--- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlMuteButtonElement.h
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlMuteButtonElement.h
@@ -5,7 +5,7 @@
 #ifndef MediaControlMuteButtonElement_h
 #define MediaControlMuteButtonElement_h
 
-#include "core/html/shadow/MediaControlElementTypes.h"
+#include "modules/media_controls/elements/MediaControlInputElement.h"
 
 namespace blink {
 
@@ -19,8 +19,8 @@
   // MediaControlInputElement overrides.
   bool WillRespondToMouseClickEvents() override;
   void UpdateDisplayType() override;
-  WebLocalizedString::Name GetOverflowStringName() override;
-  bool HasOverflowButton() override;
+  WebLocalizedString::Name GetOverflowStringName() const override;
+  bool HasOverflowButton() const override;
 
  private:
   void DefaultEventHandler(Event*) override;
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverflowMenuButtonElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverflowMenuButtonElement.h
index 846e4f7..a296933 100644
--- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverflowMenuButtonElement.h
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverflowMenuButtonElement.h
@@ -5,7 +5,7 @@
 #ifndef MediaControlOverflowMenuButtonElement_h
 #define MediaControlOverflowMenuButtonElement_h
 
-#include "core/html/shadow/MediaControlElementTypes.h"
+#include "modules/media_controls/elements/MediaControlInputElement.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverflowMenuListElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverflowMenuListElement.h
index 2d3a9867..33ebc09 100644
--- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverflowMenuListElement.h
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverflowMenuListElement.h
@@ -5,7 +5,7 @@
 #ifndef MediaControlOverflowMenuListElement_h
 #define MediaControlOverflowMenuListElement_h
 
-#include "core/html/shadow/MediaControlElementTypes.h"
+#include "modules/media_controls/elements/MediaControlDivElement.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverlayEnclosureElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverlayEnclosureElement.h
index c9451c39..da808cce 100644
--- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverlayEnclosureElement.h
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverlayEnclosureElement.h
@@ -5,7 +5,7 @@
 #ifndef MediaControlOverlayEnclosureElement_h
 #define MediaControlOverlayEnclosureElement_h
 
-#include "core/html/shadow/MediaControlElementTypes.h"
+#include "modules/media_controls/elements/MediaControlDivElement.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverlayPlayButtonElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverlayPlayButtonElement.h
index 0e6b35f..f1b1ddf 100644
--- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverlayPlayButtonElement.h
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlOverlayPlayButtonElement.h
@@ -5,7 +5,7 @@
 #ifndef MediaControlOverlayPlayButtonElement_h
 #define MediaControlOverlayPlayButtonElement_h
 
-#include "core/html/shadow/MediaControlElementTypes.h"
+#include "modules/media_controls/elements/MediaControlInputElement.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPanelElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPanelElement.h
index ec9419d..3c2da324 100644
--- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPanelElement.h
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPanelElement.h
@@ -5,7 +5,7 @@
 #ifndef MediaControlPanelElement_h
 #define MediaControlPanelElement_h
 
-#include "core/html/shadow/MediaControlElementTypes.h"
+#include "modules/media_controls/elements/MediaControlDivElement.h"
 #include "platform/Timer.h"
 
 namespace blink {
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPanelEnclosureElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPanelEnclosureElement.h
index df4b385..12563e3 100644
--- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPanelEnclosureElement.h
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPanelEnclosureElement.h
@@ -5,7 +5,7 @@
 #ifndef MediaControlPanelEnclosureElement_h
 #define MediaControlPanelEnclosureElement_h
 
-#include "core/html/shadow/MediaControlElementTypes.h"
+#include "modules/media_controls/elements/MediaControlDivElement.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPlayButtonElement.cpp b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPlayButtonElement.cpp
index d7e14b7..b1862a1 100644
--- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPlayButtonElement.cpp
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPlayButtonElement.cpp
@@ -31,14 +31,14 @@
   UpdateOverflowString();
 }
 
-WebLocalizedString::Name
-MediaControlPlayButtonElement::GetOverflowStringName() {
+WebLocalizedString::Name MediaControlPlayButtonElement::GetOverflowStringName()
+    const {
   if (MediaElement().paused())
     return WebLocalizedString::kOverflowMenuPlay;
   return WebLocalizedString::kOverflowMenuPause;
 }
 
-bool MediaControlPlayButtonElement::HasOverflowButton() {
+bool MediaControlPlayButtonElement::HasOverflowButton() const {
   return true;
 }
 
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPlayButtonElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPlayButtonElement.h
index ab42606..2d32521 100644
--- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPlayButtonElement.h
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlPlayButtonElement.h
@@ -5,7 +5,7 @@
 #ifndef MediaControlPlayButtonElement_h
 #define MediaControlPlayButtonElement_h
 
-#include "core/html/shadow/MediaControlElementTypes.h"
+#include "modules/media_controls/elements/MediaControlInputElement.h"
 
 namespace blink {
 
@@ -19,8 +19,8 @@
   // MediaControlInputElement overrides.
   bool WillRespondToMouseClickEvents() override;
   void UpdateDisplayType() override;
-  WebLocalizedString::Name GetOverflowStringName() override;
-  bool HasOverflowButton() override;
+  WebLocalizedString::Name GetOverflowStringName() const override;
+  bool HasOverflowButton() const override;
 
   void OnMediaKeyboardEvent(Event* event) { DefaultEventHandler(event); }
 
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTextTrackListElement.cpp b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTextTrackListElement.cpp
index 7dc7b8b..43f9c9b 100644
--- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTextTrackListElement.cpp
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTextTrackListElement.cpp
@@ -6,6 +6,7 @@
 
 #include "core/InputTypeNames.h"
 #include "core/events/Event.h"
+#include "core/html/HTMLInputElement.h"
 #include "core/html/HTMLLabelElement.h"
 #include "core/html/HTMLMediaElement.h"
 #include "core/html/HTMLSpanElement.h"
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTextTrackListElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTextTrackListElement.h
index 4d564539..7f168a7 100644
--- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTextTrackListElement.h
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTextTrackListElement.h
@@ -5,7 +5,7 @@
 #ifndef MediaControlTextTrackListElement_h
 #define MediaControlTextTrackListElement_h
 
-#include "core/html/shadow/MediaControlElementTypes.h"
+#include "modules/media_controls/elements/MediaControlDivElement.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTimeDisplayElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTimeDisplayElement.h
index 85ab767d..2c8e56fb 100644
--- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTimeDisplayElement.h
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTimeDisplayElement.h
@@ -5,8 +5,8 @@
 #ifndef MediaControlTimeDisplayElement_h
 #define MediaControlTimeDisplayElement_h
 
-#include "core/html/shadow/MediaControlElementTypes.h"
 #include "modules/ModulesExport.h"
+#include "modules/media_controls/elements/MediaControlDivElement.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTimelineElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTimelineElement.h
index 9f3034c..c797adb 100644
--- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTimelineElement.h
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlTimelineElement.h
@@ -5,7 +5,7 @@
 #ifndef MediaControlTimelineElement_h
 #define MediaControlTimelineElement_h
 
-#include "core/html/shadow/MediaControlElementTypes.h"
+#include "modules/media_controls/elements/MediaControlInputElement.h"
 #include "modules/media_controls/elements/MediaControlTimelineMetrics.h"
 
 namespace blink {
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlToggleClosedCaptionsButtonElement.cpp b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlToggleClosedCaptionsButtonElement.cpp
index e774df1..697f2dfe 100644
--- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlToggleClosedCaptionsButtonElement.cpp
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlToggleClosedCaptionsButtonElement.cpp
@@ -34,11 +34,11 @@
 }
 
 WebLocalizedString::Name
-MediaControlToggleClosedCaptionsButtonElement::GetOverflowStringName() {
+MediaControlToggleClosedCaptionsButtonElement::GetOverflowStringName() const {
   return WebLocalizedString::kOverflowMenuCaptions;
 }
 
-bool MediaControlToggleClosedCaptionsButtonElement::HasOverflowButton() {
+bool MediaControlToggleClosedCaptionsButtonElement::HasOverflowButton() const {
   return true;
 }
 
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlToggleClosedCaptionsButtonElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlToggleClosedCaptionsButtonElement.h
index e648a95..0e7b33a 100644
--- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlToggleClosedCaptionsButtonElement.h
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlToggleClosedCaptionsButtonElement.h
@@ -5,7 +5,7 @@
 #ifndef MediaControlToggleClosedCaptionsButtonElement_h
 #define MediaControlToggleClosedCaptionsButtonElement_h
 
-#include "core/html/shadow/MediaControlElementTypes.h"
+#include "modules/media_controls/elements/MediaControlInputElement.h"
 
 namespace blink {
 
@@ -20,8 +20,8 @@
   // MediaControlInputElement overrides.
   bool WillRespondToMouseClickEvents() override;
   void UpdateDisplayType() override;
-  WebLocalizedString::Name GetOverflowStringName() override;
-  bool HasOverflowButton() override;
+  WebLocalizedString::Name GetOverflowStringName() const override;
+  bool HasOverflowButton() const override;
 
  private:
   void DefaultEventHandler(Event*) override;
diff --git a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlVolumeSliderElement.h b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlVolumeSliderElement.h
index 2e3c434..6b790b4 100644
--- a/third_party/WebKit/Source/modules/media_controls/elements/MediaControlVolumeSliderElement.h
+++ b/third_party/WebKit/Source/modules/media_controls/elements/MediaControlVolumeSliderElement.h
@@ -5,7 +5,7 @@
 #ifndef MediaControlVolumeSliderElement_h
 #define MediaControlVolumeSliderElement_h
 
-#include "core/html/shadow/MediaControlElementTypes.h"
+#include "modules/media_controls/elements/MediaControlInputElement.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/modules/mediasession/MediaSession.cpp b/third_party/WebKit/Source/modules/mediasession/MediaSession.cpp
index d1002243..2e650b0 100644
--- a/third_party/WebKit/Source/modules/mediasession/MediaSession.cpp
+++ b/third_party/WebKit/Source/modules/mediasession/MediaSession.cpp
@@ -13,8 +13,8 @@
 #include "modules/mediasession/MediaMetadata.h"
 #include "modules/mediasession/MediaMetadataSanitizer.h"
 #include "platform/wtf/Optional.h"
-#include "public/platform/InterfaceProvider.h"
 #include "public/platform/Platform.h"
+#include "services/service_manager/public/cpp/interface_provider.h"
 
 namespace blink {
 
@@ -198,15 +198,11 @@
   DCHECK(GetExecutionContext()->IsDocument())
       << "MediaSession::getService() is only available from a frame";
   Document* document = ToDocument(GetExecutionContext());
-  if (!document->GetFrame())
+  LocalFrame* frame = document->GetFrame();
+  if (!frame)
     return nullptr;
 
-  InterfaceProvider* interface_provider =
-      document->GetFrame()->GetInterfaceProvider();
-  if (!interface_provider)
-    return nullptr;
-
-  interface_provider->GetInterface(mojo::MakeRequest(&service_));
+  frame->GetInterfaceProvider().GetInterface(mojo::MakeRequest(&service_));
   if (service_.get()) {
     // Record the eTLD+1 of the frame using the API.
     Platform::Current()->RecordRapporURL("Media.Session.APIUsage.Origin",
diff --git a/third_party/WebKit/Source/modules/nfc/NFC.cpp b/third_party/WebKit/Source/modules/nfc/NFC.cpp
index fff6f4f..9d3e1aa 100644
--- a/third_party/WebKit/Source/modules/nfc/NFC.cpp
+++ b/third_party/WebKit/Source/modules/nfc/NFC.cpp
@@ -18,8 +18,8 @@
 #include "modules/nfc/NFCPushOptions.h"
 #include "modules/nfc/NFCWatchOptions.h"
 #include "platform/mojo/MojoHelper.h"
-#include "public/platform/InterfaceProvider.h"
 #include "public/platform/Platform.h"
+#include "services/service_manager/public/cpp/interface_provider.h"
 
 namespace {
 const char kJsonMimePostfix[] = "+json";
@@ -642,7 +642,7 @@
   if (!IsSupportedInContext(GetExecutionContext(), error_message))
     return;
 
-  frame->GetInterfaceProvider()->GetInterface(mojo::MakeRequest(&nfc_));
+  frame->GetInterfaceProvider().GetInterface(mojo::MakeRequest(&nfc_));
   nfc_.set_connection_error_handler(ConvertToBaseCallback(
       WTF::Bind(&NFC::OnConnectionError, WrapWeakPersistent(this))));
   device::mojom::blink::NFCClientPtr client;
diff --git a/third_party/WebKit/Source/modules/payments/BUILD.gn b/third_party/WebKit/Source/modules/payments/BUILD.gn
index 8dd3cc7..1a5de53 100644
--- a/third_party/WebKit/Source/modules/payments/BUILD.gn
+++ b/third_party/WebKit/Source/modules/payments/BUILD.gn
@@ -8,6 +8,8 @@
   sources = [
     "CanMakePaymentEvent.cpp",
     "CanMakePaymentEvent.h",
+    "CanMakePaymentRespondWithObserver.cpp",
+    "CanMakePaymentRespondWithObserver.h",
     "HTMLIFrameElementPayments.cpp",
     "HTMLIFrameElementPayments.h",
     "PaymentAddress.cpp",
@@ -18,6 +20,8 @@
     "PaymentCompleter.h",
     "PaymentEventDataConversion.cpp",
     "PaymentEventDataConversion.h",
+    "PaymentHandlerUtils.cpp",
+    "PaymentHandlerUtils.h",
     "PaymentInstruments.cpp",
     "PaymentInstruments.h",
     "PaymentManager.cpp",
diff --git a/third_party/WebKit/Source/modules/payments/CanMakePaymentRespondWithObserver.cpp b/third_party/WebKit/Source/modules/payments/CanMakePaymentRespondWithObserver.cpp
new file mode 100644
index 0000000..41c940c88
--- /dev/null
+++ b/third_party/WebKit/Source/modules/payments/CanMakePaymentRespondWithObserver.cpp
@@ -0,0 +1,63 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "modules/payments/CanMakePaymentRespondWithObserver.h"
+
+#include <v8.h>
+#include "bindings/core/v8/ScriptValue.h"
+#include "bindings/core/v8/V8BindingForCore.h"
+#include "bindings/modules/v8/V8PaymentAppResponse.h"
+#include "core/dom/ExecutionContext.h"
+#include "modules/payments/PaymentAppResponse.h"
+#include "modules/payments/PaymentHandlerUtils.h"
+#include "modules/serviceworkers/ServiceWorkerGlobalScopeClient.h"
+#include "modules/serviceworkers/WaitUntilObserver.h"
+#include "public/platform/modules/payments/WebPaymentAppResponse.h"
+
+namespace blink {
+
+CanMakePaymentRespondWithObserver::CanMakePaymentRespondWithObserver(
+    ExecutionContext* context,
+    int event_id,
+    WaitUntilObserver* observer)
+    : RespondWithObserver(context, event_id, observer) {}
+
+void CanMakePaymentRespondWithObserver::OnResponseRejected(
+    WebServiceWorkerResponseError error) {
+  PaymentHandlerUtils::ReportResponseError(GetExecutionContext(),
+                                           "CanMakePaymentEvent", error);
+
+  ServiceWorkerGlobalScopeClient::From(GetExecutionContext())
+      ->RespondToCanMakePaymentEvent(event_id_, false, event_dispatch_time_);
+}
+
+void CanMakePaymentRespondWithObserver::OnResponseFulfilled(
+    const ScriptValue& value) {
+  DCHECK(GetExecutionContext());
+  ExceptionState exception_state(value.GetIsolate(),
+                                 ExceptionState::kUnknownContext,
+                                 "PaymentRequestEvent", "respondWith");
+  bool response = ToBoolean(ToIsolate(GetExecutionContext()), value.V8Value(),
+                            exception_state);
+  if (exception_state.HadException()) {
+    exception_state.ClearException();
+    OnResponseRejected(kWebServiceWorkerResponseErrorNoV8Instance);
+    return;
+  }
+
+  ServiceWorkerGlobalScopeClient::From(GetExecutionContext())
+      ->RespondToCanMakePaymentEvent(event_id_, response, event_dispatch_time_);
+}
+
+void CanMakePaymentRespondWithObserver::OnNoResponse() {
+  DCHECK(GetExecutionContext());
+  ServiceWorkerGlobalScopeClient::From(GetExecutionContext())
+      ->RespondToCanMakePaymentEvent(event_id_, false, event_dispatch_time_);
+}
+
+DEFINE_TRACE(CanMakePaymentRespondWithObserver) {
+  RespondWithObserver::Trace(visitor);
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/modules/payments/CanMakePaymentRespondWithObserver.h b/third_party/WebKit/Source/modules/payments/CanMakePaymentRespondWithObserver.h
new file mode 100644
index 0000000..f468f70
--- /dev/null
+++ b/third_party/WebKit/Source/modules/payments/CanMakePaymentRespondWithObserver.h
@@ -0,0 +1,37 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CanMakePaymentRespondWithObserver_h
+#define CanMakePaymentRespondWithObserver_h
+
+#include "modules/ModulesExport.h"
+#include "modules/serviceworkers/RespondWithObserver.h"
+#include "public/platform/modules/serviceworker/WebServiceWorkerResponseError.h"
+
+namespace blink {
+
+class ExecutionContext;
+class ScriptValue;
+class WaitUntilObserver;
+
+// Implementation for CanMakePaymentEvent.respondWith(), which is used by the
+// payment handler to indicate whether it can respond to a payment request.
+class MODULES_EXPORT CanMakePaymentRespondWithObserver final
+    : public RespondWithObserver {
+ public:
+  CanMakePaymentRespondWithObserver(ExecutionContext*,
+                                    int event_id,
+                                    WaitUntilObserver*);
+  ~CanMakePaymentRespondWithObserver() override = default;
+
+  void OnResponseRejected(WebServiceWorkerResponseError) override;
+  void OnResponseFulfilled(const ScriptValue&) override;
+  void OnNoResponse() override;
+
+  DECLARE_VIRTUAL_TRACE();
+};
+
+}  // namespace blink
+
+#endif  // CanMakePaymentRespondWithObserver_h
diff --git a/third_party/WebKit/Source/modules/payments/PaymentHandlerUtils.cpp b/third_party/WebKit/Source/modules/payments/PaymentHandlerUtils.cpp
new file mode 100644
index 0000000..00e6b139
--- /dev/null
+++ b/third_party/WebKit/Source/modules/payments/PaymentHandlerUtils.cpp
@@ -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.
+
+#include "modules/payments/PaymentHandlerUtils.h"
+
+#include "core/dom/ExecutionContext.h"
+#include "core/inspector/ConsoleMessage.h"
+
+namespace blink {
+
+void PaymentHandlerUtils::ReportResponseError(
+    ExecutionContext* execution_context,
+    const String& event_name_prefix,
+    WebServiceWorkerResponseError error) {
+  String error_message = event_name_prefix + ".respondWith() failed: ";
+  switch (error) {
+    case kWebServiceWorkerResponseErrorPromiseRejected:
+      error_message =
+          error_message + "the promise passed to respondWith() was rejected.";
+      break;
+    case kWebServiceWorkerResponseErrorDefaultPrevented:
+      error_message =
+          error_message +
+          "preventDefault() was called without calling respondWith().";
+      break;
+    case kWebServiceWorkerResponseErrorNoV8Instance:
+      error_message = error_message +
+                      "an object that was not a PaymentResponse was passed to "
+                      "respondWith().";
+      break;
+    case kWebServiceWorkerResponseErrorUnknown:
+      error_message = error_message + "an unexpected error occurred.";
+      break;
+    case kWebServiceWorkerResponseErrorResponseTypeError:
+    case kWebServiceWorkerResponseErrorResponseTypeOpaque:
+    case kWebServiceWorkerResponseErrorResponseTypeNotBasicOrDefault:
+    case kWebServiceWorkerResponseErrorBodyUsed:
+    case kWebServiceWorkerResponseErrorResponseTypeOpaqueForClientRequest:
+    case kWebServiceWorkerResponseErrorResponseTypeOpaqueRedirect:
+    case kWebServiceWorkerResponseErrorBodyLocked:
+    case kWebServiceWorkerResponseErrorNoForeignFetchResponse:
+    case kWebServiceWorkerResponseErrorForeignFetchHeadersWithoutOrigin:
+    case kWebServiceWorkerResponseErrorForeignFetchMismatchedOrigin:
+    case kWebServiceWorkerResponseErrorRedirectedResponseForNotFollowRequest:
+    case kWebServiceWorkerResponseErrorDataPipeCreationFailed:
+      NOTREACHED();
+      error_message = error_message + "an unexpected error occurred.";
+      break;
+  }
+
+  DCHECK(execution_context);
+  execution_context->AddConsoleMessage(ConsoleMessage::Create(
+      kJSMessageSource, kWarningMessageLevel, error_message));
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/modules/payments/PaymentHandlerUtils.h b/third_party/WebKit/Source/modules/payments/PaymentHandlerUtils.h
new file mode 100644
index 0000000..1327c8d3
--- /dev/null
+++ b/third_party/WebKit/Source/modules/payments/PaymentHandlerUtils.h
@@ -0,0 +1,27 @@
+// 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 PaymentHandlerUtils_h
+#define PaymentHandlerUtils_h
+
+#include "platform/wtf/Allocator.h"
+#include "platform/wtf/text/WTFString.h"
+#include "public/platform/modules/serviceworker/WebServiceWorkerResponseError.h"
+
+namespace blink {
+
+class ExecutionContext;
+
+class PaymentHandlerUtils {
+  STATIC_ONLY(PaymentHandlerUtils);
+
+ public:
+  static void ReportResponseError(ExecutionContext*,
+                                  const String& event_name_prefix,
+                                  WebServiceWorkerResponseError);
+};
+
+}  // namespace blink
+
+#endif  // PaymentHandlerUtils_h
diff --git a/third_party/WebKit/Source/modules/payments/PaymentManager.cpp b/third_party/WebKit/Source/modules/payments/PaymentManager.cpp
index 855c429..5d13a4b 100644
--- a/third_party/WebKit/Source/modules/payments/PaymentManager.cpp
+++ b/third_party/WebKit/Source/modules/payments/PaymentManager.cpp
@@ -14,7 +14,6 @@
 #include "modules/serviceworkers/ServiceWorkerRegistration.h"
 #include "platform/bindings/ScriptState.h"
 #include "platform/mojo/MojoHelper.h"
-#include "public/platform/InterfaceProvider.h"
 #include "public/platform/Platform.h"
 
 namespace blink {
@@ -44,7 +43,7 @@
   if (context && context->IsDocument()) {
     LocalFrame* frame = ToDocument(context)->GetFrame();
     if (frame)
-      frame->GetInterfaceProvider()->GetInterface(std::move(request));
+      frame->GetInterfaceProvider().GetInterface(std::move(request));
   } else if (context && context->IsWorkerGlobalScope()) {
     WorkerThread* thread = ToWorkerGlobalScope(context)->GetThread();
     thread->GetInterfaceProvider().GetInterface(std::move(request));
diff --git a/third_party/WebKit/Source/modules/payments/PaymentRequest.cpp b/third_party/WebKit/Source/modules/payments/PaymentRequest.cpp
index cd94eb74..c90050d 100644
--- a/third_party/WebKit/Source/modules/payments/PaymentRequest.cpp
+++ b/third_party/WebKit/Source/modules/payments/PaymentRequest.cpp
@@ -45,9 +45,9 @@
 #include "platform/feature_policy/FeaturePolicy.h"
 #include "platform/mojo/MojoHelper.h"
 #include "platform/wtf/HashSet.h"
-#include "public/platform/InterfaceProvider.h"
 #include "public/platform/Platform.h"
 #include "public/platform/WebTraceLocation.h"
+#include "services/service_manager/public/cpp/interface_provider.h"
 
 namespace {
 
@@ -1033,7 +1033,7 @@
   DCHECK(shipping_type_.IsNull() || shipping_type_ == "shipping" ||
          shipping_type_ == "delivery" || shipping_type_ == "pickup");
 
-  GetFrame()->GetInterfaceProvider()->GetInterface(
+  GetFrame()->GetInterfaceProvider().GetInterface(
       mojo::MakeRequest(&payment_provider_));
   payment_provider_.set_connection_error_handler(ConvertToBaseCallback(
       WTF::Bind(&PaymentRequest::OnError, WrapWeakPersistent(this),
diff --git a/third_party/WebKit/Source/modules/payments/PaymentRequestRespondWithObserver.cpp b/third_party/WebKit/Source/modules/payments/PaymentRequestRespondWithObserver.cpp
index a9643ee..4f41e36 100644
--- a/third_party/WebKit/Source/modules/payments/PaymentRequestRespondWithObserver.cpp
+++ b/third_party/WebKit/Source/modules/payments/PaymentRequestRespondWithObserver.cpp
@@ -9,62 +9,13 @@
 #include "bindings/core/v8/V8BindingForCore.h"
 #include "bindings/modules/v8/V8PaymentAppResponse.h"
 #include "core/dom/ExecutionContext.h"
-#include "core/inspector/ConsoleMessage.h"
 #include "modules/payments/PaymentAppResponse.h"
+#include "modules/payments/PaymentHandlerUtils.h"
 #include "modules/serviceworkers/ServiceWorkerGlobalScopeClient.h"
 #include "modules/serviceworkers/WaitUntilObserver.h"
 #include "public/platform/modules/payments/WebPaymentAppResponse.h"
 
 namespace blink {
-namespace {
-
-// Returns the error message to let the developer know about the reason of the
-// unusual failures.
-const String GetMessageForResponseError(WebServiceWorkerResponseError error) {
-  String error_message =
-      "The respondWith() was rejected in PaymentRequestEvent: ";
-  switch (error) {
-    case kWebServiceWorkerResponseErrorPromiseRejected:
-      error_message = error_message + "the promise was rejected.";
-      break;
-    case kWebServiceWorkerResponseErrorDefaultPrevented:
-      error_message =
-          error_message +
-          "preventDefault() was called without calling respondWith().";
-      break;
-    case kWebServiceWorkerResponseErrorNoV8Instance:
-      error_message = error_message +
-                      "an object that was not a PaymentResponse was passed to "
-                      "respondWith().";
-      break;
-    case kWebServiceWorkerResponseErrorResponseTypeError:
-      error_message = error_message +
-                      "the promise was resolved with an error response object.";
-      break;
-    case kWebServiceWorkerResponseErrorUnknown:
-      error_message = error_message + "an unexpected error occurred.";
-      break;
-    case kWebServiceWorkerResponseErrorResponseTypeOpaque:
-    case kWebServiceWorkerResponseErrorResponseTypeNotBasicOrDefault:
-    case kWebServiceWorkerResponseErrorBodyUsed:
-    case kWebServiceWorkerResponseErrorResponseTypeOpaqueForClientRequest:
-    case kWebServiceWorkerResponseErrorResponseTypeOpaqueRedirect:
-    case kWebServiceWorkerResponseErrorBodyLocked:
-    case kWebServiceWorkerResponseErrorNoForeignFetchResponse:
-    case kWebServiceWorkerResponseErrorForeignFetchHeadersWithoutOrigin:
-    case kWebServiceWorkerResponseErrorForeignFetchMismatchedOrigin:
-    case kWebServiceWorkerResponseErrorRedirectedResponseForNotFollowRequest:
-    case kWebServiceWorkerResponseErrorDataPipeCreationFailed:
-      NOTREACHED();
-      error_message = error_message + "an unexpected error occurred.";
-      break;
-  }
-  return error_message;
-}
-
-}  // namespace
-
-PaymentRequestRespondWithObserver::~PaymentRequestRespondWithObserver() {}
 
 PaymentRequestRespondWithObserver* PaymentRequestRespondWithObserver::Create(
     ExecutionContext* context,
@@ -75,10 +26,8 @@
 
 void PaymentRequestRespondWithObserver::OnResponseRejected(
     WebServiceWorkerResponseError error) {
-  DCHECK(GetExecutionContext());
-  GetExecutionContext()->AddConsoleMessage(
-      ConsoleMessage::Create(kJSMessageSource, kWarningMessageLevel,
-                             GetMessageForResponseError(error)));
+  PaymentHandlerUtils::ReportResponseError(GetExecutionContext(),
+                                           "PaymentRequestEvent", error);
 
   WebPaymentAppResponse web_data;
   ServiceWorkerGlobalScopeClient::From(GetExecutionContext())
diff --git a/third_party/WebKit/Source/modules/payments/PaymentRequestRespondWithObserver.h b/third_party/WebKit/Source/modules/payments/PaymentRequestRespondWithObserver.h
index 9e9158133..8504d80 100644
--- a/third_party/WebKit/Source/modules/payments/PaymentRequestRespondWithObserver.h
+++ b/third_party/WebKit/Source/modules/payments/PaymentRequestRespondWithObserver.h
@@ -15,12 +15,13 @@
 class ScriptValue;
 class WaitUntilObserver;
 
-// This class observes the service worker's handling of a PaymentRequestEvent
-// and notifies the client.
+// Implementation for PaymentRequestEvent.respondWith(), which is used by the
+// payment handler to provide a payment response when the payment successfully
+// completes.
 class MODULES_EXPORT PaymentRequestRespondWithObserver final
     : public RespondWithObserver {
  public:
-  virtual ~PaymentRequestRespondWithObserver();
+  ~PaymentRequestRespondWithObserver() override = default;
 
   static PaymentRequestRespondWithObserver* Create(ExecutionContext*,
                                                    int event_id,
diff --git a/third_party/WebKit/Source/modules/permissions/PermissionUtils.cpp b/third_party/WebKit/Source/modules/permissions/PermissionUtils.cpp
index 97a18f4..c2b0614d 100644
--- a/third_party/WebKit/Source/modules/permissions/PermissionUtils.cpp
+++ b/third_party/WebKit/Source/modules/permissions/PermissionUtils.cpp
@@ -7,10 +7,8 @@
 #include "core/dom/Document.h"
 #include "core/dom/ExecutionContext.h"
 #include "core/frame/LocalFrame.h"
-#include "core/frame/LocalFrameClient.h"
 #include "core/workers/WorkerGlobalScope.h"
 #include "core/workers/WorkerThread.h"
-#include "public/platform/InterfaceProvider.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
 
 namespace blink {
@@ -34,7 +32,7 @@
   if (!frame)
     return false;
 
-  frame->GetInterfaceProvider()->GetInterface(std::move(request));
+  frame->GetInterfaceProvider().GetInterface(std::move(request));
   return true;
 }
 
diff --git a/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.cpp b/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.cpp
index ffafadd..f5f0c8d 100644
--- a/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.cpp
+++ b/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.cpp
@@ -73,6 +73,10 @@
   return KURL(kParsedURLString, "remote-playback://" + encoded_source_info);
 }
 
+bool IsBackgroundAvailabilityMonitoringDisabled() {
+  return MemoryCoordinator::IsLowEndDevice();
+}
+
 }  // anonymous namespace
 
 // static
@@ -108,15 +112,14 @@
     return promise;
   }
 
-  if (MemoryCoordinator::IsLowEndDevice()) {
+  int id = WatchAvailabilityInternal(new AvailabilityCallbackWrapper(callback));
+  if (id == kWatchAvailabilityNotSupported) {
     resolver->Reject(DOMException::Create(
         kNotSupportedError,
         "Availability monitoring is not supported on this device."));
     return promise;
   }
 
-  int id = WatchAvailabilityInternal(new AvailabilityCallbackWrapper(callback));
-
   // TODO(avayvod): Currently the availability is tracked for each media element
   // as soon as it's created, we probably want to limit that to when the
   // page/element is visible (see https://crbug.com/597281) and has default
@@ -234,6 +237,11 @@
 
 int RemotePlayback::WatchAvailabilityInternal(
     AvailabilityCallbackWrapper* callback) {
+  if (RuntimeEnabledFeatures::RemotePlaybackBackendEnabled() &&
+      IsBackgroundAvailabilityMonitoringDisabled()) {
+    return kWatchAvailabilityNotSupported;
+  }
+
   int id;
   do {
     id = GetExecutionContext()->CircularSequentialID();
@@ -352,6 +360,9 @@
 void RemotePlayback::SourceChanged(const WebURL& source) {
   DCHECK(RuntimeEnabledFeatures::NewRemotePlaybackPipelineEnabled());
 
+  if (IsBackgroundAvailabilityMonitoringDisabled())
+    return;
+
   WebURL current_url =
       availability_urls_.IsEmpty() ? WebURL() : availability_urls_[0];
   WebURL new_url = GetAvailabilityUrl(source);
@@ -377,6 +388,12 @@
 }
 
 bool RemotePlayback::RemotePlaybackAvailable() const {
+  if (IsBackgroundAvailabilityMonitoringDisabled() &&
+      RuntimeEnabledFeatures::RemotePlaybackBackendEnabled() &&
+      !media_element_->currentSrc().IsEmpty()) {
+    return true;
+  }
+
   return availability_ == WebRemotePlaybackAvailability::kDeviceAvailable;
 }
 
@@ -450,6 +467,9 @@
 }
 
 void RemotePlayback::MaybeStartListeningForAvailability() {
+  if (IsBackgroundAvailabilityMonitoringDisabled())
+    return;
+
   if (!RuntimeEnabledFeatures::RemotePlaybackBackendEnabled())
     return;
 
diff --git a/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.h b/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.h
index 70ac0b39..79f7b820 100644
--- a/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.h
+++ b/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.h
@@ -39,6 +39,10 @@
   USING_GARBAGE_COLLECTED_MIXIN(RemotePlayback);
 
  public:
+  // Result of WatchAvailabilityInternal that means availability is not
+  // supported.
+  static const int kWatchAvailabilityNotSupported = -1;
+
   static RemotePlayback* Create(HTMLMediaElement&);
 
   // Notifies this object that disableRemotePlayback attribute was set on the
@@ -72,6 +76,8 @@
   void PromptInternal();
 
   // The implementation of watchAvailability() and cancelWatchAvailability().
+  // Can return kWatchAvailabilityNotSupported to indicate the availability
+  // monitoring is disabled. RemotePlaybackAvailable() will return true then.
   int WatchAvailabilityInternal(AvailabilityCallbackWrapper*);
   bool CancelWatchAvailabilityInternal(int id);
 
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeClient.cpp b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeClient.cpp
index 23f41f0..5b3178ae 100644
--- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeClient.cpp
+++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeClient.cpp
@@ -154,6 +154,13 @@
       fetch_event_id, response, stream_handle, event_dispatch_time);
 }
 
+void ServiceWorkerGlobalScopeClient::RespondToCanMakePaymentEvent(
+    int event_id,
+    bool response,
+    double event_dispatch_time) {
+  client_.RespondToCanMakePaymentEvent(event_id, response, event_dispatch_time);
+}
+
 void ServiceWorkerGlobalScopeClient::RespondToPaymentRequestEvent(
     int event_id,
     const WebPaymentAppResponse& response,
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeClient.h b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeClient.h
index 51eb4ad1..8718788 100644
--- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeClient.h
+++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeClient.h
@@ -107,6 +107,9 @@
                                              const WebServiceWorkerResponse&,
                                              WebServiceWorkerStreamHandle*,
                                              double event_dispatch_time);
+  void RespondToCanMakePaymentEvent(int event_id,
+                                    bool can_make_payment,
+                                    double event_dispatch_time);
   void RespondToPaymentRequestEvent(int event_id,
                                     const WebPaymentAppResponse&,
                                     double event_dispatch_time);
diff --git a/third_party/WebKit/Source/modules/shapedetection/BarcodeDetector.cpp b/third_party/WebKit/Source/modules/shapedetection/BarcodeDetector.cpp
index a4b60bb..c6864e1 100644
--- a/third_party/WebKit/Source/modules/shapedetection/BarcodeDetector.cpp
+++ b/third_party/WebKit/Source/modules/shapedetection/BarcodeDetector.cpp
@@ -11,7 +11,6 @@
 #include "core/workers/WorkerThread.h"
 #include "modules/imagecapture/Point2D.h"
 #include "modules/shapedetection/DetectedBarcode.h"
-#include "public/platform/InterfaceProvider.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
 
 namespace blink {
@@ -25,7 +24,7 @@
   if (context->IsDocument()) {
     LocalFrame* frame = ToDocument(context)->GetFrame();
     if (frame)
-      frame->GetInterfaceProvider()->GetInterface(std::move(request));
+      frame->GetInterfaceProvider().GetInterface(std::move(request));
   } else {
     WorkerThread* thread = ToWorkerGlobalScope(context)->GetThread();
     thread->GetInterfaceProvider().GetInterface(std::move(request));
diff --git a/third_party/WebKit/Source/modules/shapedetection/FaceDetector.cpp b/third_party/WebKit/Source/modules/shapedetection/FaceDetector.cpp
index f14dc03..269b5eee 100644
--- a/third_party/WebKit/Source/modules/shapedetection/FaceDetector.cpp
+++ b/third_party/WebKit/Source/modules/shapedetection/FaceDetector.cpp
@@ -13,7 +13,6 @@
 #include "modules/shapedetection/DetectedFace.h"
 #include "modules/shapedetection/FaceDetectorOptions.h"
 #include "modules/shapedetection/Landmark.h"
-#include "public/platform/InterfaceProvider.h"
 #include "public/platform/Platform.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "services/shape_detection/public/interfaces/facedetection_provider.mojom-blink.h"
@@ -38,7 +37,7 @@
   if (context->IsDocument()) {
     LocalFrame* frame = ToDocument(context)->GetFrame();
     if (frame)
-      frame->GetInterfaceProvider()->GetInterface(std::move(request));
+      frame->GetInterfaceProvider().GetInterface(std::move(request));
   } else {
     WorkerThread* thread = ToWorkerGlobalScope(context)->GetThread();
     thread->GetInterfaceProvider().GetInterface(std::move(request));
diff --git a/third_party/WebKit/Source/modules/shapedetection/TextDetector.cpp b/third_party/WebKit/Source/modules/shapedetection/TextDetector.cpp
index 09fb158..edb855a 100644
--- a/third_party/WebKit/Source/modules/shapedetection/TextDetector.cpp
+++ b/third_party/WebKit/Source/modules/shapedetection/TextDetector.cpp
@@ -10,7 +10,6 @@
 #include "core/html/canvas/CanvasImageSource.h"
 #include "core/workers/WorkerThread.h"
 #include "modules/shapedetection/DetectedText.h"
-#include "public/platform/InterfaceProvider.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
 
 namespace blink {
@@ -24,7 +23,7 @@
   if (context->IsDocument()) {
     LocalFrame* frame = ToDocument(context)->GetFrame();
     if (frame)
-      frame->GetInterfaceProvider()->GetInterface(std::move(request));
+      frame->GetInterfaceProvider().GetInterface(std::move(request));
   } else {
     WorkerThread* thread = ToWorkerGlobalScope(context)->GetThread();
     thread->GetInterfaceProvider().GetInterface(std::move(request));
diff --git a/third_party/WebKit/Source/modules/vr/VRController.cpp b/third_party/WebKit/Source/modules/vr/VRController.cpp
index 5e4191e..c51cdd8 100644
--- a/third_party/WebKit/Source/modules/vr/VRController.cpp
+++ b/third_party/WebKit/Source/modules/vr/VRController.cpp
@@ -10,9 +10,8 @@
 #include "core/frame/LocalFrame.h"
 #include "modules/vr/NavigatorVR.h"
 #include "modules/vr/VRGetDevicesCallback.h"
-#include "public/platform/InterfaceProvider.h"
-
 #include "platform/wtf/Assertions.h"
+#include "services/service_manager/public/cpp/interface_provider.h"
 
 namespace blink {
 
@@ -21,7 +20,7 @@
       navigator_vr_(navigator_vr),
       display_synced_(false),
       binding_(this) {
-  navigator_vr->GetDocument()->GetFrame()->GetInterfaceProvider()->GetInterface(
+  navigator_vr->GetDocument()->GetFrame()->GetInterfaceProvider().GetInterface(
       mojo::MakeRequest(&service_));
   service_.set_connection_error_handler(ConvertToBaseCallback(
       WTF::Bind(&VRController::Dispose, WrapWeakPersistent(this))));
diff --git a/third_party/WebKit/Source/modules/wake_lock/ScreenWakeLock.cpp b/third_party/WebKit/Source/modules/wake_lock/ScreenWakeLock.cpp
index 697ab8b0..231e83d 100644
--- a/third_party/WebKit/Source/modules/wake_lock/ScreenWakeLock.cpp
+++ b/third_party/WebKit/Source/modules/wake_lock/ScreenWakeLock.cpp
@@ -9,7 +9,7 @@
 #include "core/frame/Screen.h"
 #include "core/page/PageVisibilityState.h"
 #include "platform/RuntimeEnabledFeatures.h"
-#include "public/platform/InterfaceProvider.h"
+#include "services/service_manager/public/cpp/interface_provider.h"
 
 namespace blink {
 
@@ -67,8 +67,7 @@
       PageVisibilityObserver(frame.GetPage()),
       keep_awake_(false) {
   DCHECK(!service_.is_bound());
-  DCHECK(frame.GetInterfaceProvider());
-  frame.GetInterfaceProvider()->GetInterface(mojo::MakeRequest(&service_));
+  frame.GetInterfaceProvider().GetInterface(mojo::MakeRequest(&service_));
 }
 
 bool ScreenWakeLock::keepAwake() const {
diff --git a/third_party/WebKit/Source/modules/wake_lock/ScreenWakeLockTest.cpp b/third_party/WebKit/Source/modules/wake_lock/ScreenWakeLockTest.cpp
index ed9eb27..43dbff2 100644
--- a/third_party/WebKit/Source/modules/wake_lock/ScreenWakeLockTest.cpp
+++ b/third_party/WebKit/Source/modules/wake_lock/ScreenWakeLockTest.cpp
@@ -13,10 +13,10 @@
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "platform/testing/URLTestHelpers.h"
 #include "platform/testing/UnitTestHelpers.h"
-#include "public/platform/InterfaceProvider.h"
 #include "public/platform/Platform.h"
 #include "public/platform/WebPageVisibilityState.h"
 #include "public/platform/WebURLLoaderMockFactory.h"
+#include "services/service_manager/public/cpp/interface_provider.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 #include <memory>
@@ -27,63 +27,41 @@
 using device::mojom::blink::WakeLock;
 using device::mojom::blink::WakeLockRequest;
 
-// This class allows binding interface requests to a MockWakeLock.
-class MockInterfaceProvider : public InterfaceProvider {
+// A mock WakeLock used to intercept calls to the mojo methods.
+class MockWakeLock : public WakeLock {
  public:
-  MockInterfaceProvider() : wake_lock_status_(false) {}
-  ~MockInterfaceProvider() {}
+  MockWakeLock() : binding_(this) {}
+  ~MockWakeLock() = default;
 
-  void GetInterface(const char* name, mojo::ScopedMessagePipeHandle) override;
-
-  bool WakeLockStatus() const { return wake_lock_status_; }
-  void SetWakeLockStatus(bool status) { wake_lock_status_ = status; }
-
- private:
-  // A mock WakeLock used to intercept calls to the mojo methods.
-  class MockWakeLock : public WakeLock {
-   public:
-    MockWakeLock(MockInterfaceProvider* registry, WakeLockRequest request)
-        : binding_(this, std::move(request)), registry_(registry) {}
-    ~MockWakeLock() {}
-
-   private:
-    // mojom::WakeLock
-    void RequestWakeLock() override { registry_->SetWakeLockStatus(true); }
-    void CancelWakeLock() override { registry_->SetWakeLockStatus(false); }
-    void AddClient(device::mojom::blink::WakeLockRequest wake_lock) override {}
-    void ChangeType(device::mojom::WakeLockType type,
-                    ChangeTypeCallback callback) override {}
-    void HasWakeLockForTests(HasWakeLockForTestsCallback callback) override {}
-
-    mojo::Binding<WakeLock> binding_;
-    MockInterfaceProvider* const registry_;
-  };
-  std::unique_ptr<MockWakeLock> mock_wake_lock_;
-
-  bool wake_lock_status_;
-};
-
-void MockInterfaceProvider::GetInterface(const char* name,
-                                         mojo::ScopedMessagePipeHandle handle) {
-  mock_wake_lock_.reset(
-      new MockWakeLock(this, WakeLockRequest(std::move(handle))));
-}
-
-// A TestWebFrameClient to allow overriding the interfaceProvider() with a mock.
-class TestWebFrameClient : public FrameTestHelpers::TestWebFrameClient {
- public:
-  ~TestWebFrameClient() override = default;
-  InterfaceProvider* GetInterfaceProviderForTesting() override {
-    return &interface_provider_;
+  void Bind(mojo::ScopedMessagePipeHandle handle) {
+    binding_.Bind(WakeLockRequest(std::move(handle)));
   }
 
+  bool WakeLockStatus() { return wake_lock_status_; }
+
  private:
-  MockInterfaceProvider interface_provider_;
+  // mojom::WakeLock
+  void RequestWakeLock() override { wake_lock_status_ = true; }
+  void CancelWakeLock() override { wake_lock_status_ = false; }
+  void AddClient(device::mojom::blink::WakeLockRequest wake_lock) override {}
+  void ChangeType(device::mojom::WakeLockType type,
+                  ChangeTypeCallback callback) override {}
+  void HasWakeLockForTests(HasWakeLockForTestsCallback callback) override {}
+
+  mojo::Binding<WakeLock> binding_;
+  bool wake_lock_status_ = false;
 };
 
 class ScreenWakeLockTest : public ::testing::Test {
  protected:
   void SetUp() override {
+    service_manager::InterfaceProvider::TestApi test_api(
+        test_web_frame_client_.GetInterfaceProvider());
+    test_api.SetBinderForName(
+        WakeLock::Name_,
+        ConvertToBaseCallback(
+            WTF::Bind(&MockWakeLock::Bind, WTF::Unretained(&mock_wake_lock_))));
+
     web_view_helper_.Initialize(&test_web_frame_client_);
     URLTestHelpers::RegisterMockedURLLoadFromBase(
         WebString::FromUTF8("http://example.com/"), testing::CoreTestDataPath(),
@@ -106,8 +84,8 @@
 
   LocalFrame* GetFrame() {
     DCHECK(web_view_helper_.WebView());
-    DCHECK(web_view_helper_.LocalMainFrame());
-    return web_view_helper_.LocalMainFrame()->GetFrame();
+    DCHECK(web_view_helper_.WebView()->MainFrameImpl());
+    return web_view_helper_.WebView()->MainFrameImpl()->GetFrame();
   }
 
   Screen* GetScreen() {
@@ -121,11 +99,7 @@
     return ScreenWakeLock::keepAwake(*GetScreen());
   }
 
-  bool ClientKeepScreenAwake() {
-    return static_cast<MockInterfaceProvider*>(
-               test_web_frame_client_.GetInterfaceProviderForTesting())
-        ->WakeLockStatus();
-  }
+  bool ClientKeepScreenAwake() { return mock_wake_lock_.WakeLockStatus(); }
 
   void SetKeepAwake(bool keepAwake) {
     DCHECK(GetScreen());
@@ -152,8 +126,10 @@
 
   // Order of these members is important as we need to make sure that
   // test_web_frame_client_ outlives web_view_helper_ (destruction order)
-  TestWebFrameClient test_web_frame_client_;
+  FrameTestHelpers::TestWebFrameClient test_web_frame_client_;
   FrameTestHelpers::WebViewHelper web_view_helper_;
+
+  MockWakeLock mock_wake_lock_;
 };
 
 TEST_F(ScreenWakeLockTest, setAndReset) {
diff --git a/third_party/WebKit/Source/modules/webauth/WebAuthentication.cpp b/third_party/WebKit/Source/modules/webauth/WebAuthentication.cpp
index b2f17e44..4ef1510 100644
--- a/third_party/WebKit/Source/modules/webauth/WebAuthentication.cpp
+++ b/third_party/WebKit/Source/modules/webauth/WebAuthentication.cpp
@@ -16,7 +16,7 @@
 #include "modules/webauth/ScopedCredential.h"
 #include "modules/webauth/ScopedCredentialOptions.h"
 #include "modules/webauth/ScopedCredentialParameters.h"
-#include "public/platform/InterfaceProvider.h"
+#include "services/service_manager/public/cpp/interface_provider.h"
 
 namespace {
 const char kNoAuthenticatorError[] = "Authenticator unavailable.";
@@ -258,7 +258,7 @@
       return ScriptPromise::RejectWithDOMException(
           script_state, DOMException::Create(kNotSupportedError));
     }
-    GetFrame()->GetInterfaceProvider()->GetInterface(
+    GetFrame()->GetInterfaceProvider().GetInterface(
         mojo::MakeRequest(&authenticator_));
 
     authenticator_.set_connection_error_handler(ConvertToBaseCallback(
diff --git a/third_party/WebKit/Source/modules/webshare/NavigatorShare.cpp b/third_party/WebKit/Source/modules/webshare/NavigatorShare.cpp
index 667432a..d72ce8c 100644
--- a/third_party/WebKit/Source/modules/webshare/NavigatorShare.cpp
+++ b/third_party/WebKit/Source/modules/webshare/NavigatorShare.cpp
@@ -14,8 +14,8 @@
 #include "modules/webshare/ShareData.h"
 #include "platform/bindings/V8ThrowException.h"
 #include "platform/mojo/MojoHelper.h"
-#include "public/platform/InterfaceProvider.h"
 #include "public/platform/Platform.h"
+#include "services/service_manager/public/cpp/interface_provider.h"
 
 namespace blink {
 
@@ -124,7 +124,7 @@
   if (!service_) {
     LocalFrame* frame = doc->GetFrame();
     DCHECK(frame);
-    frame->GetInterfaceProvider()->GetInterface(mojo::MakeRequest(&service_));
+    frame->GetInterfaceProvider().GetInterface(mojo::MakeRequest(&service_));
     service_.set_connection_error_handler(ConvertToBaseCallback(WTF::Bind(
         &NavigatorShare::OnConnectionError, WrapWeakPersistent(this))));
     DCHECK(service_);
diff --git a/third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannel.cpp b/third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannel.cpp
index 686b901..535ce3f 100644
--- a/third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannel.cpp
+++ b/third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannel.cpp
@@ -36,7 +36,6 @@
 #include "core/fileapi/FileReaderLoader.h"
 #include "core/fileapi/FileReaderLoaderClient.h"
 #include "core/frame/LocalFrame.h"
-#include "core/frame/LocalFrameClient.h"
 #include "core/frame/WebLocalFrameBase.h"
 #include "core/inspector/ConsoleMessage.h"
 #include "core/loader/BaseFetchContext.h"
@@ -61,11 +60,11 @@
 #include "platform/weborigin/SecurityOrigin.h"
 #include "platform/wtf/Functional.h"
 #include "platform/wtf/PtrUtil.h"
-#include "public/platform/InterfaceProvider.h"
 #include "public/platform/Platform.h"
 #include "public/platform/WebSocketHandshakeThrottle.h"
 #include "public/platform/WebTraceLocation.h"
 #include "public/platform/WebURL.h"
+#include "services/service_manager/public/cpp/interface_provider.h"
 
 namespace blink {
 
@@ -282,7 +281,7 @@
   mojom::blink::WebSocketPtr socket_ptr;
   auto socket_request = mojo::MakeRequest(&socket_ptr);
   if (GetDocument() && GetDocument()->GetFrame()) {
-    GetDocument()->GetFrame()->GetInterfaceProvider()->GetInterface(
+    GetDocument()->GetFrame()->GetInterfaceProvider().GetInterface(
         std::move(socket_request));
   }
 
diff --git a/third_party/WebKit/Source/modules/webusb/DEPS b/third_party/WebKit/Source/modules/webusb/DEPS
index a455f6b..1e6ebea1 100644
--- a/third_party/WebKit/Source/modules/webusb/DEPS
+++ b/third_party/WebKit/Source/modules/webusb/DEPS
@@ -1,5 +1,4 @@
 include_rules = [
   "+device/usb/public/interfaces",
   "+mojo/public/cpp/bindings",
-  "+services/service_manager/public/cpp",
 ]
diff --git a/third_party/WebKit/Source/modules/webusb/USB.cpp b/third_party/WebKit/Source/modules/webusb/USB.cpp
index db85429..602dced 100644
--- a/third_party/WebKit/Source/modules/webusb/USB.cpp
+++ b/third_party/WebKit/Source/modules/webusb/USB.cpp
@@ -10,7 +10,6 @@
 #include "core/dom/Document.h"
 #include "core/dom/ExceptionCode.h"
 #include "core/dom/UserGestureIndicator.h"
-#include "core/frame/LocalFrameClient.h"
 #include "device/usb/public/interfaces/device.mojom-blink.h"
 #include "modules/EventTargetModules.h"
 #include "modules/webusb/USBConnectionEvent.h"
@@ -125,7 +124,7 @@
   }
 
   if (!chooser_service_) {
-    GetFrame()->Client()->GetInterfaceProvider()->GetInterface(
+    GetFrame()->GetInterfaceProvider().GetInterface(
         mojo::MakeRequest(&chooser_service_));
     chooser_service_.set_connection_error_handler(
         ConvertToBaseCallback(WTF::Bind(&USB::OnChooserServiceConnectionError,
@@ -272,7 +271,7 @@
     return;
 
   DCHECK(GetFrame());
-  GetFrame()->Client()->GetInterfaceProvider()->GetInterface(
+  GetFrame()->GetInterfaceProvider().GetInterface(
       mojo::MakeRequest(&device_manager_));
   device_manager_.set_connection_error_handler(ConvertToBaseCallback(WTF::Bind(
       &USB::OnDeviceManagerConnectionError, WrapWeakPersistent(this))));
diff --git a/third_party/WebKit/Source/platform/BUILD.gn b/third_party/WebKit/Source/platform/BUILD.gn
index 93a78d7..74bbce27 100644
--- a/third_party/WebKit/Source/platform/BUILD.gn
+++ b/third_party/WebKit/Source/platform/BUILD.gn
@@ -1283,6 +1283,8 @@
     "scheduler/base/queueing_time_estimator.h",
     "scheduler/base/real_time_domain.cc",
     "scheduler/base/real_time_domain.h",
+    "scheduler/base/task_queue.cc",
+    "scheduler/base/task_queue.h",
     "scheduler/base/task_queue_impl.cc",
     "scheduler/base/task_queue_impl.h",
     "scheduler/base/task_queue_manager.cc",
@@ -1328,8 +1330,12 @@
     "scheduler/child/worker_global_scope_scheduler.h",
     "scheduler/child/worker_scheduler.cc",
     "scheduler/child/worker_scheduler.h",
+    "scheduler/child/worker_scheduler_helper.cc",
+    "scheduler/child/worker_scheduler_helper.h",
     "scheduler/child/worker_scheduler_impl.cc",
     "scheduler/child/worker_scheduler_impl.h",
+    "scheduler/child/worker_task_queue.cc",
+    "scheduler/child/worker_task_queue.h",
     "scheduler/renderer/auto_advancing_virtual_time_domain.cc",
     "scheduler/renderer/auto_advancing_virtual_time_domain.h",
     "scheduler/renderer/budget_pool.cc",
@@ -1340,6 +1346,10 @@
     "scheduler/renderer/deadline_task_runner.h",
     "scheduler/renderer/idle_time_estimator.cc",
     "scheduler/renderer/idle_time_estimator.h",
+    "scheduler/renderer/main_thread_scheduler_helper.cc",
+    "scheduler/renderer/main_thread_scheduler_helper.h",
+    "scheduler/renderer/main_thread_task_queue.cc",
+    "scheduler/renderer/main_thread_task_queue.h",
     "scheduler/renderer/render_widget_scheduling_state.cc",
     "scheduler/renderer/render_widget_signals.cc",
     "scheduler/renderer/render_widget_signals.h",
@@ -1709,6 +1719,7 @@
     "graphics/gpu/DrawingBufferTestHelpers.h",
     "network/mime/MockMimeRegistry.h",
     "scheduler/base/task_queue_manager_delegate_for_test.cc",
+    "scheduler/base/task_queue_manager_delegate_for_test.h",
     "scheduler/base/test_task_time_observer.h",
     "scheduler/base/test_time_source.cc",
     "scheduler/base/test_time_source.h",
@@ -1720,6 +1731,8 @@
     "scheduler/test/lazy_scheduler_message_loop_delegate_for_tests.cc",
     "scheduler/test/lazy_scheduler_message_loop_delegate_for_tests.h",
     "scheduler/test/renderer_scheduler_test_support.cc",
+    "scheduler/test/test_task_queue.cc",
+    "scheduler/test/test_task_queue.h",
     "scroll/ScrollbarTestSuite.h",
     "testing/CompositorTest.cpp",
     "testing/CompositorTest.h",
@@ -1876,6 +1889,7 @@
     "graphics/RecordingImageBufferSurfaceTest.cpp",
     "graphics/compositing/ContentLayerClientImplTest.cpp",
     "graphics/compositing/PaintArtifactCompositorTest.cpp",
+    "graphics/compositing/PaintChunksToCcLayerTest.cpp",
     "graphics/filters/ImageFilterBuilderTest.cpp",
     "graphics/gpu/DrawingBufferTest.cpp",
     "graphics/gpu/SharedGpuContextTest.cpp",
@@ -2061,8 +2075,6 @@
 
 test("blink_platform_perftests") {
   sources = [
-    "scheduler/base/task_queue_manager_delegate_for_test.cc",
-    "scheduler/base/task_queue_manager_delegate_for_test.h",
     "scheduler/base/task_queue_manager_perftest.cc",
     "testing/BlinkPerfTestSuite.cpp",
     "testing/BlinkPerfTestSuite.h",
@@ -2078,6 +2090,7 @@
 
   deps = [
     ":platform",
+    ":test_support",
     "//base",
     "//base/test:test_support",
     "//testing/gtest",
diff --git a/third_party/WebKit/Source/platform/DEPS b/third_party/WebKit/Source/platform/DEPS
index 4edbeed..c243c07 100644
--- a/third_party/WebKit/Source/platform/DEPS
+++ b/third_party/WebKit/Source/platform/DEPS
@@ -37,7 +37,6 @@
     "+mozilla",
     "+platform",
     "+public/platform",
-    "+services/service_manager/public/interfaces",
     "+skia/ext",
     "+third_party/ced/src/compact_enc_det/compact_enc_det.h",
     "+third_party/khronos",
diff --git a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.json5 b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.json5
index f329ba1..cb12eb6 100644
--- a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.json5
+++ b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.json5
@@ -80,6 +80,10 @@
       status: "stable",
     },
     {
+      name: "AsyncClipboard",
+      status: "experimental",
+    },
+    {
       name: "AudioOutputDevices",
       status: "stable",
     },
@@ -156,6 +160,9 @@
       status: "stable",
     },
     {
+      name: "ClientPlaceholdersForServerLoFi",
+    },
+    {
       name: "CoalescedEvents",
       status: "stable",
     },
diff --git a/third_party/WebKit/Source/platform/TimerTest.cpp b/third_party/WebKit/Source/platform/TimerTest.cpp
index b3cf96a9..6d50da8 100644
--- a/third_party/WebKit/Source/platform/TimerTest.cpp
+++ b/third_party/WebKit/Source/platform/TimerTest.cpp
@@ -10,6 +10,7 @@
 #include "platform/scheduler/base/task_queue_impl.h"
 #include "platform/scheduler/child/web_scheduler.h"
 #include "platform/scheduler/child/web_task_runner_impl.h"
+#include "platform/scheduler/renderer/main_thread_task_queue.h"
 #include "platform/scheduler/renderer/renderer_scheduler_impl.h"
 #include "platform/scheduler/renderer/web_view_scheduler.h"
 #include "platform/testing/TestingPlatformSupport.h"
@@ -538,7 +539,7 @@
 TEST_F(TimerTest, UserSuppliedWebTaskRunner) {
   scoped_refptr<scheduler::TaskQueue> task_runner(
       platform_->GetRendererScheduler()->NewTimerTaskQueue(
-          scheduler::TaskQueue::QueueType::TEST));
+          scheduler::MainThreadTaskQueue::QueueType::TEST));
   RefPtr<scheduler::WebTaskRunnerImpl> web_task_runner =
       scheduler::WebTaskRunnerImpl::Create(task_runner);
   TimerForTest<TimerTest> timer(web_task_runner, this,
@@ -626,7 +627,7 @@
 
   scoped_refptr<scheduler::TaskQueue> task_runner1(
       platform_->GetRendererScheduler()->NewTimerTaskQueue(
-          scheduler::TaskQueue::QueueType::TEST));
+          scheduler::MainThreadTaskQueue::QueueType::TEST));
   RefPtr<scheduler::WebTaskRunnerImpl> web_task_runner1 =
       scheduler::WebTaskRunnerImpl::Create(task_runner1);
   TaskObserver task_observer1(web_task_runner1, &run_order);
@@ -634,7 +635,7 @@
 
   scoped_refptr<scheduler::TaskQueue> task_runner2(
       platform_->GetRendererScheduler()->NewTimerTaskQueue(
-          scheduler::TaskQueue::QueueType::TEST));
+          scheduler::MainThreadTaskQueue::QueueType::TEST));
   RefPtr<scheduler::WebTaskRunnerImpl> web_task_runner2 =
       scheduler::WebTaskRunnerImpl::Create(task_runner2);
   TaskObserver task_observer2(web_task_runner2, &run_order);
@@ -666,7 +667,7 @@
 
   scoped_refptr<scheduler::TaskQueue> task_runner1(
       platform_->GetRendererScheduler()->NewTimerTaskQueue(
-          scheduler::TaskQueue::QueueType::TEST));
+          scheduler::MainThreadTaskQueue::QueueType::TEST));
   RefPtr<scheduler::WebTaskRunnerImpl> web_task_runner1 =
       scheduler::WebTaskRunnerImpl::Create(task_runner1);
   TaskObserver task_observer1(web_task_runner1, &run_order);
@@ -674,7 +675,7 @@
 
   scoped_refptr<scheduler::TaskQueue> task_runner2(
       platform_->GetRendererScheduler()->NewTimerTaskQueue(
-          scheduler::TaskQueue::QueueType::TEST));
+          scheduler::MainThreadTaskQueue::QueueType::TEST));
   RefPtr<scheduler::WebTaskRunnerImpl> web_task_runner2 =
       scheduler::WebTaskRunnerImpl::Create(task_runner2);
   TaskObserver task_observer2(web_task_runner2, &run_order);
@@ -708,13 +709,13 @@
 TEST_F(TimerTest, MoveToNewTaskRunnerWithoutTasks) {
   scoped_refptr<scheduler::TaskQueue> task_runner1(
       platform_->GetRendererScheduler()->NewTimerTaskQueue(
-          scheduler::TaskQueue::QueueType::TEST));
+          scheduler::MainThreadTaskQueue::QueueType::TEST));
   RefPtr<scheduler::WebTaskRunnerImpl> web_task_runner1 =
       scheduler::WebTaskRunnerImpl::Create(task_runner1);
 
   scoped_refptr<scheduler::TaskQueue> task_runner2(
       platform_->GetRendererScheduler()->NewTimerTaskQueue(
-          scheduler::TaskQueue::QueueType::TEST));
+          scheduler::MainThreadTaskQueue::QueueType::TEST));
   RefPtr<scheduler::WebTaskRunnerImpl> web_task_runner2 =
       scheduler::WebTaskRunnerImpl::Create(task_runner2);
 
diff --git a/third_party/WebKit/Source/platform/exported/WebRuntimeFeatures.cpp b/third_party/WebKit/Source/platform/exported/WebRuntimeFeatures.cpp
index 8ab62d4..bc0e908 100644
--- a/third_party/WebKit/Source/platform/exported/WebRuntimeFeatures.cpp
+++ b/third_party/WebKit/Source/platform/exported/WebRuntimeFeatures.cpp
@@ -422,4 +422,8 @@
   RuntimeEnabledFeatures::SetWebAuthEnabled(enable);
 }
 
+void WebRuntimeFeatures::EnableClientPlaceholdersForServerLoFi(bool enable) {
+  RuntimeEnabledFeatures::SetClientPlaceholdersForServerLoFiEnabled(enable);
+}
+
 }  // namespace blink
diff --git a/third_party/WebKit/Source/platform/graphics/DEPS b/third_party/WebKit/Source/platform/graphics/DEPS
index 7dcab9c..767e09e6 100644
--- a/third_party/WebKit/Source/platform/graphics/DEPS
+++ b/third_party/WebKit/Source/platform/graphics/DEPS
@@ -8,6 +8,7 @@
     "+base/threading/thread_checker.h",
     "+cc",
     "-cc/blink",
+    "+components/viz/common/quads",
     "+gpu/command_buffer/client/gles2_interface.h",
     "+gpu/command_buffer/client/gpu_memory_buffer_manager.h",
     "+gpu/command_buffer/common/capabilities.h",
diff --git a/third_party/WebKit/Source/platform/graphics/Gradient.cpp b/third_party/WebKit/Source/platform/graphics/Gradient.cpp
index 477657d..5d34b39 100644
--- a/third_party/WebKit/Source/platform/graphics/Gradient.cpp
+++ b/third_party/WebKit/Source/platform/graphics/Gradient.cpp
@@ -129,7 +129,7 @@
   }
 }
 
-std::unique_ptr<PaintShader> Gradient::CreateShaderInternal(
+sk_sp<PaintShader> Gradient::CreateShaderInternal(
     const SkMatrix& local_matrix) {
   SortStopsIfNecessary();
   DCHECK(stops_sorted_);
@@ -159,7 +159,7 @@
   uint32_t flags = color_interpolation_ == ColorInterpolation::kPremultiplied
                        ? SkGradientShader::kInterpolateColorsInPremul_Flag
                        : 0;
-  std::unique_ptr<PaintShader> shader =
+  sk_sp<PaintShader> shader =
       CreateShader(colors, pos, tile, flags, local_matrix, colors.back());
   DCHECK(shader);
 
@@ -175,7 +175,7 @@
     cached_shader_ = CreateShaderInternal(local_matrix);
   }
 
-  flags.setShader(WTF::MakeUnique<PaintShader>(*cached_shader_));
+  flags.setShader(cached_shader_);
 
   // Legacy behavior: gradients are always dithered.
   flags.setDither(true);
@@ -194,13 +194,12 @@
         p1_(p1) {}
 
  protected:
-  std::unique_ptr<PaintShader> CreateShader(
-      const ColorBuffer& colors,
-      const OffsetBuffer& pos,
-      SkShader::TileMode tile_mode,
-      uint32_t flags,
-      const SkMatrix& local_matrix,
-      SkColor fallback_color) const override {
+  sk_sp<PaintShader> CreateShader(const ColorBuffer& colors,
+                                  const OffsetBuffer& pos,
+                                  SkShader::TileMode tile_mode,
+                                  uint32_t flags,
+                                  const SkMatrix& local_matrix,
+                                  SkColor fallback_color) const override {
     SkPoint pts[2] = {p0_.Data(), p1_.Data()};
     return PaintShader::MakeLinearGradient(
         pts, colors.data(), pos.data(), static_cast<int>(colors.size()),
@@ -229,13 +228,12 @@
         aspect_ratio_(aspect_ratio) {}
 
  protected:
-  std::unique_ptr<PaintShader> CreateShader(
-      const ColorBuffer& colors,
-      const OffsetBuffer& pos,
-      SkShader::TileMode tile_mode,
-      uint32_t flags,
-      const SkMatrix& local_matrix,
-      SkColor fallback_color) const override {
+  sk_sp<PaintShader> CreateShader(const ColorBuffer& colors,
+                                  const OffsetBuffer& pos,
+                                  SkShader::TileMode tile_mode,
+                                  uint32_t flags,
+                                  const SkMatrix& local_matrix,
+                                  SkColor fallback_color) const override {
     SkTCopyOnFirstWrite<SkMatrix> adjusted_local_matrix(local_matrix);
     if (aspect_ratio_ != 1) {
       // CSS3 elliptical gradients: apply the elliptical scaling at the
@@ -282,13 +280,12 @@
         angle_(angle) {}
 
  protected:
-  std::unique_ptr<PaintShader> CreateShader(
-      const ColorBuffer& colors,
-      const OffsetBuffer& pos,
-      SkShader::TileMode tile_mode,
-      uint32_t flags,
-      const SkMatrix& local_matrix,
-      SkColor fallback_color) const override {
+  sk_sp<PaintShader> CreateShader(const ColorBuffer& colors,
+                                  const OffsetBuffer& pos,
+                                  SkShader::TileMode tile_mode,
+                                  uint32_t flags,
+                                  const SkMatrix& local_matrix,
+                                  SkColor fallback_color) const override {
     DCHECK_NE(tile_mode, SkShader::kMirror_TileMode);
 
     // Skia's sweep gradient angles are relative to the x-axis, not the y-axis.
diff --git a/third_party/WebKit/Source/platform/graphics/Gradient.h b/third_party/WebKit/Source/platform/graphics/Gradient.h
index 19f952a..eab3f275 100644
--- a/third_party/WebKit/Source/platform/graphics/Gradient.h
+++ b/third_party/WebKit/Source/platform/graphics/Gradient.h
@@ -102,16 +102,15 @@
 
   using ColorBuffer = Vector<SkColor, 8>;
   using OffsetBuffer = Vector<SkScalar, 8>;
-  virtual std::unique_ptr<PaintShader> CreateShader(const ColorBuffer&,
-                                                    const OffsetBuffer&,
-                                                    SkShader::TileMode,
-                                                    uint32_t flags,
-                                                    const SkMatrix&,
-                                                    SkColor) const = 0;
+  virtual sk_sp<PaintShader> CreateShader(const ColorBuffer&,
+                                          const OffsetBuffer&,
+                                          SkShader::TileMode,
+                                          uint32_t flags,
+                                          const SkMatrix&,
+                                          SkColor) const = 0;
 
  private:
-  std::unique_ptr<PaintShader> CreateShaderInternal(
-      const SkMatrix& local_matrix);
+  sk_sp<PaintShader> CreateShaderInternal(const SkMatrix& local_matrix);
 
   sk_sp<SkColorFilter> color_filter_;
 
@@ -125,7 +124,7 @@
   Vector<ColorStop, 2> stops_;
   bool stops_sorted_;
 
-  mutable std::unique_ptr<PaintShader> cached_shader_;
+  mutable sk_sp<PaintShader> cached_shader_;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/platform/graphics/Image.cpp b/third_party/WebKit/Source/platform/graphics/Image.cpp
index a49261b..4e4d26c4b 100644
--- a/third_party/WebKit/Source/platform/graphics/Image.cpp
+++ b/third_party/WebKit/Source/platform/graphics/Image.cpp
@@ -228,12 +228,12 @@
 
 namespace {
 
-std::unique_ptr<PaintShader> CreatePatternShader(const PaintImage& image,
-                                                 const SkMatrix& shader_matrix,
-                                                 const PaintFlags& paint,
-                                                 const FloatSize& spacing,
-                                                 SkShader::TileMode tmx,
-                                                 SkShader::TileMode tmy) {
+sk_sp<PaintShader> CreatePatternShader(const PaintImage& image,
+                                       const SkMatrix& shader_matrix,
+                                       const PaintFlags& paint,
+                                       const FloatSize& spacing,
+                                       SkShader::TileMode tmx,
+                                       SkShader::TileMode tmy) {
   if (spacing.IsZero()) {
     return PaintShader::MakeImage(image.sk_image(), tmx, tmy, &shader_matrix);
   }
diff --git a/third_party/WebKit/Source/platform/graphics/ImagePattern.cpp b/third_party/WebKit/Source/platform/graphics/ImagePattern.cpp
index dbf9de5..25de65b1 100644
--- a/third_party/WebKit/Source/platform/graphics/ImagePattern.cpp
+++ b/third_party/WebKit/Source/platform/graphics/ImagePattern.cpp
@@ -29,8 +29,7 @@
   return local_matrix != previous_local_matrix_;
 }
 
-std::unique_ptr<PaintShader> ImagePattern::CreateShader(
-    const SkMatrix& local_matrix) {
+sk_sp<PaintShader> ImagePattern::CreateShader(const SkMatrix& local_matrix) {
   if (!tile_image_) {
     return PaintShader::MakeColor(SK_ColorTRANSPARENT);
   }
diff --git a/third_party/WebKit/Source/platform/graphics/ImagePattern.h b/third_party/WebKit/Source/platform/graphics/ImagePattern.h
index ed52189..a9c0ffb 100644
--- a/third_party/WebKit/Source/platform/graphics/ImagePattern.h
+++ b/third_party/WebKit/Source/platform/graphics/ImagePattern.h
@@ -20,7 +20,7 @@
   bool IsTextureBacked() const override;
 
  protected:
-  std::unique_ptr<PaintShader> CreateShader(const SkMatrix&) override;
+  sk_sp<PaintShader> CreateShader(const SkMatrix&) override;
   bool IsLocalMatrixChanged(const SkMatrix&) const override;
 
  private:
diff --git a/third_party/WebKit/Source/platform/graphics/OffscreenCanvasFrameDispatcherImpl.cpp b/third_party/WebKit/Source/platform/graphics/OffscreenCanvasFrameDispatcherImpl.cpp
index 36286e71..e6f773c 100644
--- a/third_party/WebKit/Source/platform/graphics/OffscreenCanvasFrameDispatcherImpl.cpp
+++ b/third_party/WebKit/Source/platform/graphics/OffscreenCanvasFrameDispatcherImpl.cpp
@@ -6,6 +6,7 @@
 
 #include "cc/output/compositor_frame.h"
 #include "cc/quads/texture_draw_quad.h"
+#include "components/viz/common/quads/resource_format.h"
 #include "gpu/command_buffer/client/gles2_interface.h"
 #include "platform/CrossThreadFunctional.h"
 #include "platform/Histogram.h"
@@ -275,7 +276,7 @@
 
   cc::TransferableResource resource;
   resource.id = next_resource_id_;
-  resource.format = cc::ResourceFormat::RGBA_8888;
+  resource.format = viz::ResourceFormat::RGBA_8888;
   resource.size = gfx::Size(width_, height_);
   // This indicates the filtering on the resource inherently, not the desired
   // filtering effect on the quad.
diff --git a/third_party/WebKit/Source/platform/graphics/PaintRecordPattern.cpp b/third_party/WebKit/Source/platform/graphics/PaintRecordPattern.cpp
index c3b59885..34c0ed6 100644
--- a/third_party/WebKit/Source/platform/graphics/PaintRecordPattern.cpp
+++ b/third_party/WebKit/Source/platform/graphics/PaintRecordPattern.cpp
@@ -33,7 +33,7 @@
 
 PaintRecordPattern::~PaintRecordPattern() {}
 
-std::unique_ptr<PaintShader> PaintRecordPattern::CreateShader(
+sk_sp<PaintShader> PaintRecordPattern::CreateShader(
     const SkMatrix& local_matrix) {
   return PaintShader::MakePaintRecord(
       tile_record_, tile_record_bounds_, SkShader::kRepeat_TileMode,
diff --git a/third_party/WebKit/Source/platform/graphics/PaintRecordPattern.h b/third_party/WebKit/Source/platform/graphics/PaintRecordPattern.h
index 3d826a63..fe3d95d 100644
--- a/third_party/WebKit/Source/platform/graphics/PaintRecordPattern.h
+++ b/third_party/WebKit/Source/platform/graphics/PaintRecordPattern.h
@@ -21,7 +21,7 @@
   ~PaintRecordPattern() override;
 
  protected:
-  std::unique_ptr<PaintShader> CreateShader(const SkMatrix&) override;
+  sk_sp<PaintShader> CreateShader(const SkMatrix&) override;
 
  private:
   PaintRecordPattern(sk_sp<PaintRecord>,
diff --git a/third_party/WebKit/Source/platform/graphics/Pattern.cpp b/third_party/WebKit/Source/platform/graphics/Pattern.cpp
index 53cf3a8..181339a 100644
--- a/third_party/WebKit/Source/platform/graphics/Pattern.cpp
+++ b/third_party/WebKit/Source/platform/graphics/Pattern.cpp
@@ -59,7 +59,7 @@
   if (!cached_shader_ || IsLocalMatrixChanged(local_matrix))
     cached_shader_ = CreateShader(local_matrix);
 
-  flags.setShader(WTF::MakeUnique<PaintShader>(*cached_shader_));
+  flags.setShader(cached_shader_);
 }
 
 bool Pattern::IsLocalMatrixChanged(const SkMatrix& local_matrix) const {
diff --git a/third_party/WebKit/Source/platform/graphics/Pattern.h b/third_party/WebKit/Source/platform/graphics/Pattern.h
index f939b5e..1db8d22 100644
--- a/third_party/WebKit/Source/platform/graphics/Pattern.h
+++ b/third_party/WebKit/Source/platform/graphics/Pattern.h
@@ -72,13 +72,13 @@
   virtual bool IsTextureBacked() const { return false; }
 
  protected:
-  virtual std::unique_ptr<PaintShader> CreateShader(const SkMatrix&) = 0;
+  virtual sk_sp<PaintShader> CreateShader(const SkMatrix&) = 0;
   virtual bool IsLocalMatrixChanged(const SkMatrix&) const;
 
   RepeatMode repeat_mode_;
 
   Pattern(RepeatMode);
-  mutable std::unique_ptr<PaintShader> cached_shader_;
+  mutable sk_sp<PaintShader> cached_shader_;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositorTest.cpp b/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositorTest.cpp
index d265df4..eca0d14 100644
--- a/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositorTest.cpp
+++ b/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositorTest.cpp
@@ -1478,7 +1478,7 @@
     rects_with_color.push_back(
         RectWithColor(FloatRect(0, 0, 100, 100), Color::kWhite));
     rects_with_color.push_back(
-        RectWithColor(FloatRect(40, 50, 50, 60), Color(Color::kBlack)));
+        RectWithColor(FloatRect(40, 50, 10, 10), Color(Color::kBlack)));
     rects_with_color.push_back(
         RectWithColor(FloatRect(0, 0, 200, 300), Color::kGray));
     const cc::Layer* layer = ContentLayerAt(0);
diff --git a/third_party/WebKit/Source/platform/graphics/compositing/PaintChunksToCcLayer.cpp b/third_party/WebKit/Source/platform/graphics/compositing/PaintChunksToCcLayer.cpp
index 44f49632..21ee964e 100644
--- a/third_party/WebKit/Source/platform/graphics/compositing/PaintChunksToCcLayer.cpp
+++ b/third_party/WebKit/Source/platform/graphics/compositing/PaintChunksToCcLayer.cpp
@@ -19,210 +19,341 @@
 
 namespace {
 
-// Applies the clips between |localState| and |ancestorState| into a single
-// combined cc::FloatClipDisplayItem on |ccList|.
-static void ApplyClipsBetweenStates(const PropertyTreeState& local_state,
-                                    const PropertyTreeState& ancestor_state,
-                                    cc::DisplayItemList& cc_list,
-                                    Vector<int>& needed_restores) {
-  DCHECK(local_state.Transform() == ancestor_state.Transform());
-#if DCHECK_IS_ON()
-  const TransformPaintPropertyNode* transform_node =
-      local_state.Clip()->LocalTransformSpace();
-  if (transform_node != ancestor_state.Transform()) {
-    const TransformationMatrix& local_to_ancestor_matrix =
-        GeometryMapper::SourceToDestinationProjection(
-            transform_node, ancestor_state.Transform());
-    // Clips are only in descendant spaces that are transformed by one
-    // or more scrolls.
-    DCHECK(local_to_ancestor_matrix.IsIdentityOrTranslation());
-  }
-#endif
-
-  const FloatClipRect& combined_clip =
-      GeometryMapper::LocalToAncestorClipRect(local_state, ancestor_state);
-  bool antialias = false;
-
-  {
-    cc::PaintOpBuffer* buffer = cc_list.StartPaint();
-    buffer->push<cc::SaveOp>();
-    buffer->push<cc::ClipRectOp>(combined_clip.Rect(), SkClipOp::kIntersect,
-                                 antialias);
-    cc_list.EndPaintOfPairedBegin();
-  }
-  needed_restores.push_back(1);
-}
-
-static void RecordPairedBeginDisplayItems(
-    const Vector<PropertyTreeState>& paired_states,
-    const PropertyTreeState& pending_layer_state,
-    cc::DisplayItemList& cc_list,
-    Vector<int>& needed_restores) {
-  PropertyTreeState mapped_clip_destination_space = pending_layer_state;
-  PropertyTreeState clip_space = pending_layer_state;
-  bool has_clip = false;
-
-  for (Vector<PropertyTreeState>::const_reverse_iterator paired_state =
-           paired_states.rbegin();
-       paired_state != paired_states.rend(); ++paired_state) {
-    switch (paired_state->GetInnermostNode()) {
-      case PropertyTreeState::kTransform: {
-        if (has_clip) {
-          ApplyClipsBetweenStates(clip_space, mapped_clip_destination_space,
-                                  cc_list, needed_restores);
-          has_clip = false;
-        }
-        mapped_clip_destination_space = *paired_state;
-        clip_space = *paired_state;
-
-        TransformationMatrix matrix = paired_state->Transform()->Matrix();
-        matrix.ApplyTransformOrigin(paired_state->Transform()->Origin());
-
-        SkMatrix skmatrix =
-            static_cast<SkMatrix>(TransformationMatrix::ToSkMatrix44(matrix));
-        {
-          cc::PaintOpBuffer* buffer = cc_list.StartPaint();
-          buffer->push<cc::SaveOp>();
-          buffer->push<cc::ConcatOp>(skmatrix);
-          cc_list.EndPaintOfPairedBegin();
-        }
-        needed_restores.push_back(1);
-        break;
-      }
-      case PropertyTreeState::kClip: {
-        // Clips are handled in |applyClips| when ending the iterator, or
-        // transitioning between transform spaces. Here we store off the
-        // PropertyTreeState of the first found clip, under the transform of
-        // pairedState->transform(). All subsequent clips before applying the
-        // transform will be applied in applyClips.
-        clip_space = *paired_state;
-        has_clip = true;
-#if DCHECK_IS_ON()
-        if (paired_state->Clip()->LocalTransformSpace() !=
-            paired_state->Transform()) {
-          const TransformationMatrix& local_transform_matrix =
-              paired_state->Effect()->LocalTransformSpace()->Matrix();
-          // Clips are only in descendant spaces that are transformed by scroll.
-          DCHECK(local_transform_matrix.IsIdentityOrTranslation());
-        }
-#endif
-        break;
-      }
-      case PropertyTreeState::kEffect: {
-        // TODO(chrishtr): skip effect and/or compositing display items if
-        // not necessary.
-
-        FloatRect clip_rect =
-            paired_state->Effect()->OutputClip()->ClipRect().Rect();
-        // TODO(chrishtr): specify origin of the filter.
-        FloatPoint filter_origin;
-        if (paired_state->Effect()->LocalTransformSpace() !=
-            paired_state->Transform()) {
-          const TransformPaintPropertyNode* transform_node =
-              paired_state->Effect()->LocalTransformSpace();
-          const TransformationMatrix& local_to_ancestor_matrix =
-              GeometryMapper::SourceToDestinationProjection(
-                  transform_node, paired_state->Transform());
-          // Effects are only in descendant spaces that are transformed by one
-          // or more scrolls.
-          DCHECK(local_to_ancestor_matrix.IsIdentityOrTranslation());
-
-          clip_rect = local_to_ancestor_matrix.MapRect(clip_rect);
-          filter_origin = local_to_ancestor_matrix.MapPoint(filter_origin);
-        }
-
-        {
-          cc::PaintFlags flags;
-          flags.setBlendMode(paired_state->Effect()->BlendMode());
-          // TODO(ajuma): This should really be rounding instead of flooring the
-          // alpha value, but that breaks slimming paint reftests.
-          flags.setAlpha(static_cast<uint8_t>(
-              gfx::ToFlooredInt(255 * paired_state->Effect()->Opacity())));
-          flags.setColorFilter(
-              GraphicsContext::WebCoreColorFilterToSkiaColorFilter(
-                  paired_state->Effect()->GetColorFilter()));
-
-          cc::PaintOpBuffer* buffer = cc_list.StartPaint();
-          // TODO(chrishtr): compute bounds as necessary.
-          buffer->push<cc::SaveLayerOp>(nullptr, &flags);
-          cc_list.EndPaintOfPairedBegin();
-        }
-        needed_restores.push_back(1);
-
-        {
-          cc::PaintOpBuffer* buffer = cc_list.StartPaint();
-
-          buffer->push<cc::SaveOp>();
-          buffer->push<cc::TranslateOp>(filter_origin.X(), filter_origin.Y());
-
-          cc::PaintFlags flags;
-          flags.setImageFilter(cc::RenderSurfaceFilters::BuildImageFilter(
-              paired_state->Effect()->Filter().AsCcFilterOperations(),
-              gfx::SizeF(clip_rect.Width(), clip_rect.Height())));
-
-          SkRect layer_bounds = clip_rect;
-          layer_bounds.offset(-filter_origin.X(), -filter_origin.Y());
-          buffer->push<cc::SaveLayerOp>(&layer_bounds, &flags);
-          buffer->push<cc::TranslateOp>(-filter_origin.X(), -filter_origin.Y());
-
-          cc_list.EndPaintOfPairedBegin();
-        }
-        // The SaveOp+SaveLayerOp above are grouped such that they share a
-        // visual rect, so group the two restores in the same way so we don't
-        // have a mismatch in the number of EndPaintOfPairedBegin() vs
-        // EndPaintOfPairedEnd().
-        needed_restores.push_back(2);
-        break;
-      }
-      case PropertyTreeState::kNone:
-        break;
-    }
-  }
-
-  if (has_clip) {
-    ApplyClipsBetweenStates(clip_space, mapped_clip_destination_space, cc_list,
-                            needed_restores);
-  }
-}
-
-static void RecordPairedEndDisplayItems(const Vector<int>& needed_restores,
-                                        cc::DisplayItemList& cc_list) {
-  // TODO(danakj): This loop could use base::Reversed once it's allowed here.
-  for (auto it = needed_restores.rbegin(); it != needed_restores.rend(); ++it) {
-    cc::PaintOpBuffer* buffer = cc_list.StartPaint();
-    int num_restores = *it;
-    for (int i = 0; i < num_restores; ++i)
-      buffer->push<cc::RestoreOp>();
-    cc_list.EndPaintOfPairedEnd();
-  }
-}
-
 constexpr gfx::Rect g_large_rect(-200000, -200000, 400000, 400000);
-static void AppendDisplayItemToCcDisplayItemList(
-    const DisplayItem& display_item,
-    cc::DisplayItemList& cc_list) {
+void AppendDisplayItemToCcDisplayItemList(const DisplayItem& display_item,
+                                          cc::DisplayItemList& list) {
   DCHECK(DisplayItem::IsDrawingType(display_item.GetType()));
-  if (DisplayItem::IsDrawingType(display_item.GetType())) {
-    const auto& drawing_display_item =
-        static_cast<const DrawingDisplayItem&>(display_item);
-    sk_sp<const cc::PaintOpBuffer> record =
-        drawing_display_item.GetPaintRecord();
-    if (!record)
-      return;
-    // In theory we would pass the bounds of the record, previously done as:
-    // gfx::Rect bounds = gfx::SkIRectToRect(record->cullRect().roundOut());
-    // or use the visual rect directly. However, clip content layers attempt
-    // to raster in a different space than that of the visual rects. We'll be
-    // reworking visual rects further for SPv2, so for now we just pass a
-    // visual rect large enough to make sure items raster.
-    {
-      cc::PaintOpBuffer* buffer = cc_list.StartPaint();
-      buffer->push<cc::DrawRecordOp>(std::move(record));
-      cc_list.EndPaintOfUnpaired(g_large_rect);
+
+  sk_sp<const PaintRecord> record =
+      static_cast<const DrawingDisplayItem&>(display_item).GetPaintRecord();
+  if (!record)
+    return;
+  cc::PaintOpBuffer* buffer = list.StartPaint();
+  buffer->push<cc::DrawRecordOp>(std::move(record));
+  // TODO(trchen): Pass correct visual rect here.
+  // The visual rect of the item can be used by cc to skip replaying items
+  // that can't be seen. To workaround a space conversion bug, the optimization
+  // is suppressed by passing a large rect.
+  list.EndPaintOfUnpaired(g_large_rect);
+}
+
+void AppendRestore(cc::DisplayItemList& list, size_t n) {
+  cc::PaintOpBuffer* buffer = list.StartPaint();
+  while (n--)
+    buffer->push<cc::RestoreOp>();
+  list.EndPaintOfPairedEnd();
+}
+
+class ConversionContext {
+ public:
+  ConversionContext(const PropertyTreeState& layer_state,
+                    cc::DisplayItemList& cc_list)
+      : current_transform_(layer_state.Transform()),
+        current_clip_(layer_state.Clip()),
+        current_effect_(layer_state.Effect()),
+        cc_list_(cc_list) {}
+  ~ConversionContext();
+
+  // The main function of this class. It converts a list of paint chunks into
+  // non-pair display items, and paint properties associated with them are
+  // implemented by paired display items.
+  // This is done by closing and opening paired items to adjust the current
+  // property state to the chunk's state when each chunk is consumed.
+  // Note that the clip/effect state is "lazy" in the sense that it stays
+  // in whatever state the last chunk left with, and only adjusted when
+  // a new chunk is consumed. The class implemented a few helpers to manage
+  // state switching so that paired display items are nested properly.
+  //
+  // State management example (transform tree omitted).
+  // Corresponds to unit test PaintChunksToCcLayerTest.InterleavedClipEffect:
+  //   Clip tree: C0 <-- C1 <-- C2 <-- C3 <-- C4
+  //   Effect tree: E0(clip=C0) <-- E1(clip=C2) <-- E2(clip=C4)
+  //   Layer state: C0, E0
+  //   Paint chunks: P0(C3, E0), P1(C4, E2), P2(C3, E1), P3(C4, E0)
+  // Initialization:
+  //   The current state is initalized with the layer state, and starts with
+  //   an empty state stack.
+  //   current_clip = C0
+  //   current_effect = E0
+  //   state_stack = []
+  // When P0 is consumed, C1, C2 and C3 need to be applied to the state:
+  //   Output: Begin_C1 Begin_C2 Begin_C3 Draw_P0
+  //   current_clip = C3
+  //   state_stack = [C0, C1, C2]
+  // When P1 is consumed, C3 needs to be closed before E1 can be entered,
+  // then C3 and C4 need to be entered before E2 can be entered:
+  //   Output: End_C3 Begin_E1 Begin_C3 Begin_C4 Begin_E2 Draw_P1
+  //   current_clip = C4
+  //   current_effect = E2
+  //   state_stack = [C0, C1, E0, C2, C3, E1]
+  // When P2 is consumed, E2 then C4 need to be exited:
+  //   Output: End_E2 End_C4 Draw_P2
+  //   current_clip = C3
+  //   current_effect = E1
+  //   state_stack = [C0, C1, E0, C2]
+  // When P3 is consumed, C3 must exit before E1 can be exited, then we can
+  // enter C3 and C4:
+  //   Output: End_C3 End_E1 Enter_C3 Enter_C4 Draw_P3
+  //   current_clip = C4
+  //   current_effect = E0
+  //   state_stack = [C0, C1, C2, C3]
+  // At last, close all pushed states to balance pairs (this happens when the
+  // context object is destructed):
+  //   Output: End_C4 End_C3 End_C2 End_C1
+  void Convert(const Vector<const PaintChunk*>&, const DisplayItemList&);
+
+ private:
+  // Switch the current clip to the target state, staying in the same effect.
+  // It is no-op if the context is already in the target state.
+  // Otherwise zero or more clips will be popped from or pushed onto the
+  // current state stack.
+  // INPUT:
+  // The target clip must be a descendant of the input clip of current effect.
+  // OUTPUT:
+  // The current transform may be changed.
+  // The current clip will change to the target clip.
+  // The current effect will not change.
+  void SwitchToClip(const ClipPaintPropertyNode*);
+
+  // Switch the current effect to the target state.
+  // It is no-op if the context is already in the target state.
+  // Otherwise zero or more effect effects will be popped from or pushed onto
+  // the state stack. As effects getting popped from the stack, clips applied
+  // on top of them will be popped as well. Also clips will be pushed at
+  // appropriate steps to apply output clip to newly pushed effects.
+  // INPUT:
+  // The target effect must be a descendant of the layer's effect.
+  // OUTPUT:
+  // The current transform may be changed.
+  // The current clip may be changed, and is guaranteed to be a descendant of
+  // the output clip of the target effect.
+  // The current effect will change to the target effect.
+  void SwitchToEffect(const EffectPaintPropertyNode*);
+
+  const TransformPaintPropertyNode* current_transform_;
+  const ClipPaintPropertyNode* current_clip_;
+  const EffectPaintPropertyNode* current_effect_;
+
+  // State stack.
+  // The size of the stack is the number of nested paired items that are
+  // currently nested. Note that this is a "restore stack", i.e. the top
+  // element does not represent the current state, but the state prior to
+  // applying the last paired begin.
+  struct StateEntry {
+    // Remembers the type of paired begin that caused a state to be saved.
+    // This is useful for emitting corresponding paired end.
+    enum class PairedType : char { kClip, kEffect } type;
+
+    const TransformPaintPropertyNode* transform;
+    const ClipPaintPropertyNode* clip;
+    const EffectPaintPropertyNode* effect;
+  };
+  Vector<StateEntry> state_stack_;
+
+  cc::DisplayItemList& cc_list_;
+};
+
+ConversionContext::~ConversionContext() {
+  for (size_t i = state_stack_.size(); i--;) {
+    if (state_stack_[i].type == StateEntry::PairedType::kClip) {
+      AppendRestore(cc_list_, 1);
+    } else {
+      DCHECK_EQ(StateEntry::PairedType::kEffect, state_stack_[i].type);
+      AppendRestore(cc_list_, 2);
     }
   }
 }
 
+void ConversionContext::SwitchToClip(const ClipPaintPropertyNode* target_clip) {
+  if (target_clip == current_clip_)
+    return;
+
+  // Step 1: Exit all clips until the lowest common ancestor is found.
+  const ClipPaintPropertyNode* lca_clip =
+      &LowestCommonAncestor(*target_clip, *current_clip_);
+  while (current_clip_ != lca_clip) {
+    DCHECK(state_stack_.size() &&
+           state_stack_.back().type == StateEntry::PairedType::kClip)
+        << "Error: Chunk has a clip that escaped its effect's clip.";
+    if (!state_stack_.size() ||
+        state_stack_.back().type != StateEntry::PairedType::kClip)
+      break;
+    StateEntry& previous_state = state_stack_.back();
+    current_transform_ = previous_state.transform;
+    current_clip_ = previous_state.clip;
+    DCHECK_EQ(previous_state.effect, current_effect_);
+    state_stack_.pop_back();
+    AppendRestore(cc_list_, 1);
+  }
+
+  // Step 2: Collect all clips between the target clip and the current clip.
+  // At this point the current clip must be an ancestor of the target.
+  Vector<const ClipPaintPropertyNode*, 1u> pending_clips;
+  for (const ClipPaintPropertyNode* clip = target_clip; clip != current_clip_;
+       clip = clip->Parent()) {
+    // This should never happen unless the DCHECK in step 1 failed.
+    if (!clip)
+      break;
+    pending_clips.push_back(clip);
+  }
+
+  // Step 3: Now apply the list of clips in top-down order.
+  for (size_t i = pending_clips.size(); i--;) {
+    const ClipPaintPropertyNode* sub_clip = pending_clips[i];
+    DCHECK_EQ(current_clip_, sub_clip->Parent());
+
+    // Step 3a: Switch CTM to the clip's local space then apply clip.
+    cc::PaintOpBuffer* buffer = cc_list_.StartPaint();
+    buffer->push<cc::SaveOp>();
+    const TransformPaintPropertyNode* target_transform =
+        sub_clip->LocalTransformSpace();
+    if (current_transform_ != target_transform) {
+      buffer->push<cc::ConcatOp>(
+          static_cast<SkMatrix>(TransformationMatrix::ToSkMatrix44(
+              GeometryMapper::SourceToDestinationProjection(
+                  target_transform, current_transform_))));
+    }
+    buffer->push<cc::ClipRectOp>(
+        static_cast<SkRect>(sub_clip->ClipRect().Rect()), SkClipOp::kIntersect,
+        false);
+    if (sub_clip->ClipRect().IsRounded()) {
+      buffer->push<cc::ClipRRectOp>(static_cast<SkRRect>(sub_clip->ClipRect()),
+                                    SkClipOp::kIntersect, true);
+    }
+    cc_list_.EndPaintOfPairedBegin();
+
+    // Step 3b: Adjust state and push previous state onto clip stack.
+    state_stack_.emplace_back(StateEntry{StateEntry::PairedType::kClip,
+                                         current_transform_, current_clip_,
+                                         current_effect_});
+    current_transform_ = target_transform;
+    current_clip_ = sub_clip;
+  }
+}
+
+void ConversionContext::SwitchToEffect(
+    const EffectPaintPropertyNode* target_effect) {
+  if (target_effect == current_effect_)
+    return;
+
+  // Step 1: Exit all effects until the lowest common ancestor is found.
+  const EffectPaintPropertyNode* lca_effect =
+      &LowestCommonAncestor(*target_effect, *current_effect_);
+  while (current_effect_ != lca_effect) {
+    DCHECK(state_stack_.size()) << "Error: Chunk layerized into a layer with "
+                                   "an effect that's too deep.";
+    if (!state_stack_.size())
+      break;
+
+    StateEntry& previous_state = state_stack_.back();
+    if (previous_state.type == StateEntry::PairedType::kClip) {
+      AppendRestore(cc_list_, 1);
+    } else {
+      DCHECK_EQ(StateEntry::PairedType::kEffect, previous_state.type);
+      AppendRestore(cc_list_, 2);
+    }
+    current_transform_ = previous_state.transform;
+    current_clip_ = previous_state.clip;
+    current_effect_ = previous_state.effect;
+    state_stack_.pop_back();
+  }
+
+  // Step 2: Collect all effects between the target effect and the current
+  // effect. At this point the current effect must be an ancestor of the target.
+  Vector<const EffectPaintPropertyNode*, 1u> pending_effects;
+  for (const EffectPaintPropertyNode* effect = target_effect;
+       effect != current_effect_; effect = effect->Parent()) {
+    // This should never happen unless the DCHECK in step 1 failed.
+    if (!effect)
+      break;
+    pending_effects.push_back(effect);
+  }
+
+  // Step 3: Now apply the list of effects in top-down order.
+  for (size_t i = pending_effects.size(); i--;) {
+    const EffectPaintPropertyNode* sub_effect = pending_effects[i];
+    DCHECK_EQ(current_effect_, sub_effect->Parent());
+
+    // Step 3a: Before each effect can be applied, we must enter its output
+    // clip first.
+    SwitchToClip(sub_effect->OutputClip());
+
+    // Step 3b: Apply non-spatial effects first, adjust CTM, then apply spatial
+    // effects. Strictly speaking the CTM shall be appled first, it is done
+    // in this particular order only to save one SaveOp.
+    // TODO(trchen): Omit one of the SaveLayerOp if no-op.
+    cc::PaintOpBuffer* buffer = cc_list_.StartPaint();
+
+    cc::PaintFlags flags;
+    flags.setBlendMode(sub_effect->BlendMode());
+    // TODO(ajuma): This should really be rounding instead of flooring the
+    // alpha value, but that breaks slimming paint reftests.
+    flags.setAlpha(
+        static_cast<uint8_t>(gfx::ToFlooredInt(255 * sub_effect->Opacity())));
+    flags.setColorFilter(GraphicsContext::WebCoreColorFilterToSkiaColorFilter(
+        sub_effect->GetColorFilter()));
+    buffer->push<cc::SaveLayerOp>(nullptr, &flags);
+
+    const TransformPaintPropertyNode* target_transform =
+        sub_effect->LocalTransformSpace();
+    if (current_transform_ != target_transform) {
+      buffer->push<cc::ConcatOp>(
+          static_cast<SkMatrix>(TransformationMatrix::ToSkMatrix44(
+              GeometryMapper::SourceToDestinationProjection(
+                  target_transform, current_transform_))));
+    }
+
+    // TODO(chrishtr): specify origin of the filter.
+    FloatPoint filter_origin;
+    buffer->push<cc::TranslateOp>(filter_origin.X(), filter_origin.Y());
+    // The size parameter is only used to computed the origin of zoom
+    // operation, which we never generate.
+    gfx::SizeF empty;
+    cc::PaintFlags filter_flags;
+    filter_flags.setImageFilter(cc::RenderSurfaceFilters::BuildImageFilter(
+        sub_effect->Filter().AsCcFilterOperations(), empty));
+    buffer->push<cc::SaveLayerOp>(nullptr, &filter_flags);
+    buffer->push<cc::TranslateOp>(-filter_origin.X(), -filter_origin.Y());
+
+    cc_list_.EndPaintOfPairedBegin();
+
+    // Step 3c: Adjust state and push previous state onto effect stack.
+    // TODO(trchen): Change input clip to expansion hint once implemented.
+    const ClipPaintPropertyNode* input_clip = current_clip_;
+    state_stack_.emplace_back(StateEntry{StateEntry::PairedType::kEffect,
+                                         current_transform_, current_clip_,
+                                         current_effect_});
+    current_transform_ = target_transform;
+    current_clip_ = input_clip;
+    current_effect_ = sub_effect;
+  }
+}
+
+void ConversionContext::Convert(const Vector<const PaintChunk*>& paint_chunks,
+                                const DisplayItemList& display_items) {
+  for (auto chunk_it = paint_chunks.begin(); chunk_it != paint_chunks.end();
+       chunk_it++) {
+    const PaintChunk& chunk = **chunk_it;
+    const PropertyTreeState& chunk_state = chunk.properties.property_tree_state;
+    SwitchToEffect(chunk_state.Effect());
+    SwitchToClip(chunk_state.Clip());
+    bool transformed = chunk_state.Transform() != current_transform_;
+    if (transformed) {
+      cc::PaintOpBuffer* buffer = cc_list_.StartPaint();
+      buffer->push<cc::SaveOp>();
+      buffer->push<cc::ConcatOp>(
+          static_cast<SkMatrix>(TransformationMatrix::ToSkMatrix44(
+              GeometryMapper::SourceToDestinationProjection(
+                  chunk_state.Transform(), current_transform_))));
+      cc_list_.EndPaintOfPairedBegin();
+    }
+    for (const auto& item : display_items.ItemsInPaintChunk(chunk))
+      AppendDisplayItemToCcDisplayItemList(item, cc_list_);
+    if (transformed)
+      AppendRestore(cc_list_, 1);
+  }
+}
+
 }  // unnamed namespace
 
 scoped_refptr<cc::DisplayItemList> PaintChunksToCcLayer::Convert(
@@ -241,36 +372,10 @@
     cc_list->EndPaintOfPairedBegin();
   }
 
-  for (const auto* paint_chunk : paint_chunks) {
-    const PropertyTreeState* state =
-        &paint_chunk->properties.property_tree_state;
-    PropertyTreeStateIterator iterator(*state);
-    Vector<PropertyTreeState> paired_states;
-    for (; state && *state != layer_state; state = iterator.Next()) {
-      if (state->GetInnermostNode() != PropertyTreeState::kNone)
-        paired_states.push_back(*state);
-    }
+  ConversionContext(layer_state, *cc_list).Convert(paint_chunks, display_items);
 
-    // TODO(chrishtr): we can avoid some extra paired display items if
-    // multiple PaintChunks share them. We can also collapse clips between
-    // transforms into single clips in the same way that PaintLayerClipper does.
-    Vector<int> needed_restores;
-
-    RecordPairedBeginDisplayItems(paired_states, layer_state, *cc_list,
-                                  needed_restores);
-
-    for (const auto& display_item :
-         display_items.ItemsInPaintChunk(*paint_chunk))
-      AppendDisplayItemToCcDisplayItemList(display_item, *cc_list);
-
-    RecordPairedEndDisplayItems(needed_restores, *cc_list);
-  }
-
-  if (need_translate) {
-    cc::PaintOpBuffer* buffer = cc_list->StartPaint();
-    buffer->push<cc::RestoreOp>();
-    cc_list->EndPaintOfPairedEnd();
-  }
+  if (need_translate)
+    AppendRestore(*cc_list, 1);
 
   if (under_invalidation_checking_params) {
     auto& params = *under_invalidation_checking_params;
diff --git a/third_party/WebKit/Source/platform/graphics/compositing/PaintChunksToCcLayerTest.cpp b/third_party/WebKit/Source/platform/graphics/compositing/PaintChunksToCcLayerTest.cpp
new file mode 100644
index 0000000..db3ba00
--- /dev/null
+++ b/third_party/WebKit/Source/platform/graphics/compositing/PaintChunksToCcLayerTest.cpp
@@ -0,0 +1,375 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "platform/graphics/compositing/PaintChunksToCcLayer.h"
+
+#include <initializer_list>
+
+#include "cc/paint/display_item_list.h"
+#include "cc/paint/paint_op_buffer.h"
+#include "platform/graphics/paint/ClipPaintPropertyNode.h"
+#include "platform/graphics/paint/DisplayItemList.h"
+#include "platform/graphics/paint/DrawingDisplayItem.h"
+#include "platform/graphics/paint/EffectPaintPropertyNode.h"
+#include "platform/graphics/paint/PaintChunk.h"
+#include "platform/graphics/paint/TransformPaintPropertyNode.h"
+#include "platform/testing/FakeDisplayItemClient.h"
+#include "platform/testing/PaintPropertyTestHelpers.h"
+#include "platform/testing/RuntimeEnabledFeaturesTestHelpers.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace blink {
+namespace {
+
+using testing::CreateOpacityOnlyEffect;
+
+class PaintChunksToCcLayerTest : public ::testing::Test,
+                                 private ScopedSlimmingPaintV2ForTest {
+ protected:
+  PaintChunksToCcLayerTest() : ScopedSlimmingPaintV2ForTest(true) {}
+};
+
+const char* GetOpName(cc::PaintOpType op) {
+  if (op == cc::PaintOpType::ClipRect)
+    return "ClipRect";
+  if (op == cc::PaintOpType::Concat)
+    return "Concat";
+  if (op == cc::PaintOpType::DrawRecord)
+    return "DrawRecord";
+  if (op == cc::PaintOpType::Save)
+    return "Save";
+  if (op == cc::PaintOpType::SaveLayer)
+    return "SaveLayer";
+  if (op == cc::PaintOpType::Restore)
+    return "Restore";
+  NOTREACHED();
+  return "ERROR";
+}
+
+// A simple matcher that only looks for a few ops, ignoring all else.
+// Recognized ops: ClipRect, Concat, DrawRecord, Save, SaveLayer, Restore.
+class PaintRecordMatcher
+    : public ::testing::MatcherInterface<const cc::PaintOpBuffer&> {
+ public:
+  static ::testing::Matcher<const cc::PaintOpBuffer&> Make(
+      std::initializer_list<cc::PaintOpType> args) {
+    return ::testing::MakeMatcher(new PaintRecordMatcher(args));
+  }
+  PaintRecordMatcher(std::initializer_list<cc::PaintOpType> args)
+      : expected_ops_(args) {}
+
+  bool MatchAndExplain(
+      const cc::PaintOpBuffer& buffer,
+      ::testing::MatchResultListener* listener) const override {
+    auto next = expected_ops_.begin();
+    for (cc::PaintOpBuffer::Iterator it(&buffer); it; ++it) {
+      cc::PaintOpType op = (*it)->GetType();
+      switch (op) {
+        case cc::PaintOpType::ClipRect:
+        case cc::PaintOpType::Concat:
+        case cc::PaintOpType::DrawRecord:
+        case cc::PaintOpType::Save:
+        case cc::PaintOpType::SaveLayer:
+        case cc::PaintOpType::Restore:
+          if (next == expected_ops_.end()) {
+            if (listener->IsInterested()) {
+              *listener << "unexpected op " << GetOpName(op) << " at index "
+                        << it.op_idx() << ", expecting end of list.";
+            }
+            return false;
+          }
+          if (*next == op) {
+            next++;
+            continue;
+          }
+          if (listener->IsInterested()) {
+            *listener << "unexpected op " << GetOpName(op) << " at index "
+                      << it.op_idx() << ", expecting " << GetOpName(*next)
+                      << "(#" << (next - expected_ops_.begin()) << ").";
+          }
+          return false;
+        default:
+          continue;
+      }
+    }
+    if (next == expected_ops_.end())
+      return true;
+    if (listener->IsInterested()) {
+      *listener << "unexpected end of list, expecting " << GetOpName(*next)
+                << "(#" << (next - expected_ops_.begin()) << ").";
+    }
+    return false;
+  }
+  void DescribeTo(::std::ostream* os) const override {
+    *os << "[";
+    bool first = true;
+    for (auto op : expected_ops_) {
+      if (first)
+        first = false;
+      else
+        *os << ", ";
+      *os << GetOpName(op);
+    }
+    *os << "]";
+  }
+
+ private:
+  Vector<cc::PaintOpType> expected_ops_;
+};
+
+// Convenient shorthands.
+const TransformPaintPropertyNode* t0() {
+  return TransformPaintPropertyNode::Root();
+}
+const ClipPaintPropertyNode* c0() {
+  return ClipPaintPropertyNode::Root();
+}
+const EffectPaintPropertyNode* e0() {
+  return EffectPaintPropertyNode::Root();
+}
+
+PaintChunk::Id DefaultId() {
+  DEFINE_STATIC_LOCAL(FakeDisplayItemClient, fake_client, ());
+  return PaintChunk::Id(fake_client, DisplayItem::kDrawingFirst);
+}
+
+struct TestChunks {
+  Vector<PaintChunk> chunks;
+  DisplayItemList items = DisplayItemList(0);
+
+  void AddChunk(const TransformPaintPropertyNode* t,
+                const ClipPaintPropertyNode* c,
+                const EffectPaintPropertyNode* e) {
+    size_t i = items.size();
+    auto record = sk_make_sp<PaintRecord>();
+    record->push<cc::NoopOp>();
+    items.AllocateAndConstruct<DrawingDisplayItem>(
+        DefaultId().client, DefaultId().type, std::move(record),
+        FloatRect(-200000, -200000, 400000, 400000));
+    chunks.emplace_back(i, i + 1, DefaultId(), PropertyTreeState(t, c, e));
+  }
+
+  Vector<const PaintChunk*> GetChunkList() const {
+    Vector<const PaintChunk*> result;
+    for (const PaintChunk& chunk : chunks)
+      result.push_back(&chunk);
+    return result;
+  }
+};
+
+TEST_F(PaintChunksToCcLayerTest, EffectGroupingSimple) {
+  // This test verifies effects are applied as a group.
+  RefPtr<EffectPaintPropertyNode> e1 = CreateOpacityOnlyEffect(e0(), 0.5f);
+  TestChunks chunks;
+  chunks.AddChunk(t0(), c0(), e1.Get());
+  chunks.AddChunk(t0(), c0(), e1.Get());
+
+  sk_sp<PaintRecord> output =
+      PaintChunksToCcLayer::Convert(chunks.GetChunkList(),
+                                    PropertyTreeState(t0(), c0(), e0()),
+                                    gfx::Vector2dF(), chunks.items)
+          ->ReleaseAsRecord();
+  EXPECT_THAT(
+      output,
+      Pointee(PaintRecordMatcher::Make(
+          {cc::PaintOpType::SaveLayer, cc::PaintOpType::SaveLayer,  // <e1>
+           cc::PaintOpType::DrawRecord,                             // <p0/>
+           cc::PaintOpType::DrawRecord,                             // <p1/>
+           cc::PaintOpType::Restore, cc::PaintOpType::Restore})));  // </e1>
+}
+
+TEST_F(PaintChunksToCcLayerTest, EffectGroupingNested) {
+  // This test verifies nested effects are grouped properly.
+  RefPtr<EffectPaintPropertyNode> e1 = CreateOpacityOnlyEffect(e0(), 0.5f);
+  RefPtr<EffectPaintPropertyNode> e2 = CreateOpacityOnlyEffect(e1.Get(), 0.5f);
+  RefPtr<EffectPaintPropertyNode> e3 = CreateOpacityOnlyEffect(e1.Get(), 0.5f);
+  TestChunks chunks;
+  chunks.AddChunk(t0(), c0(), e2.Get());
+  chunks.AddChunk(t0(), c0(), e3.Get());
+
+  sk_sp<PaintRecord> output =
+      PaintChunksToCcLayer::Convert(chunks.GetChunkList(),
+                                    PropertyTreeState(t0(), c0(), e0()),
+                                    gfx::Vector2dF(), chunks.items)
+          ->ReleaseAsRecord();
+  EXPECT_THAT(
+      output,
+      Pointee(PaintRecordMatcher::Make(
+          {cc::PaintOpType::SaveLayer, cc::PaintOpType::SaveLayer,  // <e1>
+           cc::PaintOpType::SaveLayer, cc::PaintOpType::SaveLayer,  // <e2>
+           cc::PaintOpType::DrawRecord,                             // <p0/>
+           cc::PaintOpType::Restore, cc::PaintOpType::Restore,      // </e2>
+           cc::PaintOpType::SaveLayer, cc::PaintOpType::SaveLayer,  // <e3>
+           cc::PaintOpType::DrawRecord,                             // <p1/>
+           cc::PaintOpType::Restore, cc::PaintOpType::Restore,      // </e3>
+           cc::PaintOpType::Restore, cc::PaintOpType::Restore})));  // </e1>
+}
+
+TEST_F(PaintChunksToCcLayerTest, InterleavedClipEffect) {
+  // This test verifies effects are enclosed by their output clips.
+  // It is the same as the example made in the class comments of
+  // ConversionContext.
+  // Refer to PaintChunksToCcLayer.cpp for detailed explanation.
+  // (Search "State management example".)
+  RefPtr<ClipPaintPropertyNode> c1 = ClipPaintPropertyNode::Create(
+      c0(), t0(), FloatRoundedRect(0.f, 0.f, 1.f, 1.f));
+  RefPtr<ClipPaintPropertyNode> c2 = ClipPaintPropertyNode::Create(
+      c1.Get(), t0(), FloatRoundedRect(0.f, 0.f, 1.f, 1.f));
+  RefPtr<ClipPaintPropertyNode> c3 = ClipPaintPropertyNode::Create(
+      c2.Get(), t0(), FloatRoundedRect(0.f, 0.f, 1.f, 1.f));
+  RefPtr<ClipPaintPropertyNode> c4 = ClipPaintPropertyNode::Create(
+      c3.Get(), t0(), FloatRoundedRect(0.f, 0.f, 1.f, 1.f));
+  RefPtr<EffectPaintPropertyNode> e1 = EffectPaintPropertyNode::Create(
+      e0(), t0(), c2.Get(), ColorFilter(), CompositorFilterOperations(), 0.5f,
+      SkBlendMode::kSrcOver);
+  RefPtr<EffectPaintPropertyNode> e2 = EffectPaintPropertyNode::Create(
+      e1.Get(), t0(), c4.Get(), ColorFilter(), CompositorFilterOperations(),
+      0.5f, SkBlendMode::kSrcOver);
+  TestChunks chunks;
+  chunks.AddChunk(t0(), c3.Get(), e0());
+  chunks.AddChunk(t0(), c4.Get(), e2.Get());
+  chunks.AddChunk(t0(), c3.Get(), e1.Get());
+  chunks.AddChunk(t0(), c4.Get(), e0());
+
+  sk_sp<PaintRecord> output =
+      PaintChunksToCcLayer::Convert(chunks.GetChunkList(),
+                                    PropertyTreeState(t0(), c0(), e0()),
+                                    gfx::Vector2dF(), chunks.items)
+          ->ReleaseAsRecord();
+  EXPECT_THAT(
+      output,
+      Pointee(PaintRecordMatcher::Make(
+          {cc::PaintOpType::Save,       cc::PaintOpType::ClipRect,   // <c1>
+           cc::PaintOpType::Save,       cc::PaintOpType::ClipRect,   // <c2>
+           cc::PaintOpType::Save,       cc::PaintOpType::ClipRect,   // <c3>
+           cc::PaintOpType::DrawRecord,                              // <p0/>
+           cc::PaintOpType::Restore,                                 // </c3>
+           cc::PaintOpType::SaveLayer,  cc::PaintOpType::SaveLayer,  // <e1>
+           cc::PaintOpType::Save,       cc::PaintOpType::ClipRect,   // <c3>
+           cc::PaintOpType::Save,       cc::PaintOpType::ClipRect,   // <c4>
+           cc::PaintOpType::SaveLayer,  cc::PaintOpType::SaveLayer,  // <e2>
+           cc::PaintOpType::DrawRecord,                              // <p1/>
+           cc::PaintOpType::Restore,    cc::PaintOpType::Restore,    // </e2>
+           cc::PaintOpType::Restore,                                 // </c4>
+           cc::PaintOpType::DrawRecord,                              // <p2/>
+           cc::PaintOpType::Restore,                                 // </c3>
+           cc::PaintOpType::Restore,    cc::PaintOpType::Restore,    // </e1>
+           cc::PaintOpType::Save,       cc::PaintOpType::ClipRect,   // <c3>
+           cc::PaintOpType::Save,       cc::PaintOpType::ClipRect,   // <c4>
+           cc::PaintOpType::DrawRecord,                              // <p3/>
+           cc::PaintOpType::Restore,                                 // </c4>
+           cc::PaintOpType::Restore,                                 // </c3>
+           cc::PaintOpType::Restore,                                 // </c2>
+           cc::PaintOpType::Restore})));                             // </c1>
+}
+
+TEST_F(PaintChunksToCcLayerTest, ClipSpaceInversion) {
+  // This test verifies chunks that have a shallower transform state than
+  // its clip can still be painted. The infamous CSS corner case:
+  // <div style="position:absolute; clip:rect(...)">
+  //     <div style="position:fixed;">Clipped but not scroll along.</div>
+  // </div>
+  RefPtr<TransformPaintPropertyNode> t1 = TransformPaintPropertyNode::Create(
+      t0(), TransformationMatrix().Scale(2.f), FloatPoint3D());
+  RefPtr<ClipPaintPropertyNode> c1 = ClipPaintPropertyNode::Create(
+      c0(), t1.Get(), FloatRoundedRect(0.f, 0.f, 1.f, 1.f));
+  TestChunks chunks;
+  chunks.AddChunk(t0(), c1.Get(), e0());
+
+  sk_sp<PaintRecord> output =
+      PaintChunksToCcLayer::Convert(chunks.GetChunkList(),
+                                    PropertyTreeState(t0(), c0(), e0()),
+                                    gfx::Vector2dF(), chunks.items)
+          ->ReleaseAsRecord();
+  EXPECT_THAT(output,
+              Pointee(PaintRecordMatcher::Make(
+                  {cc::PaintOpType::Save, cc::PaintOpType::Concat,  // <t1
+                   cc::PaintOpType::ClipRect,                       //  c1>
+                   cc::PaintOpType::Save, cc::PaintOpType::Concat,  // <t1^-1>
+                   cc::PaintOpType::DrawRecord,                     // <p0/>
+                   cc::PaintOpType::Restore,                        // </t1^-1>
+                   cc::PaintOpType::Restore})));                    // </c1 t1>
+}
+
+TEST_F(PaintChunksToCcLayerTest, EffectSpaceInversion) {
+  // This test verifies chunks that have a shallower transform state than
+  // its effect can still be painted. The infamous CSS corner case:
+  // <div style="overflow:scroll">
+  //     <div style="opacity:0.5">
+  //         <div style="position:absolute;">Transparent but not scroll
+  //         along.</div>
+  //     </div>
+  // </div>
+  RefPtr<TransformPaintPropertyNode> t1 = TransformPaintPropertyNode::Create(
+      t0(), TransformationMatrix().Scale(2.f), FloatPoint3D());
+  RefPtr<EffectPaintPropertyNode> e1 = EffectPaintPropertyNode::Create(
+      e0(), t1.Get(), c0(), ColorFilter(), CompositorFilterOperations(), 0.5f,
+      SkBlendMode::kSrcOver);
+  TestChunks chunks;
+  chunks.AddChunk(t0(), c0(), e1.Get());
+
+  sk_sp<PaintRecord> output =
+      PaintChunksToCcLayer::Convert(chunks.GetChunkList(),
+                                    PropertyTreeState(t0(), c0(), e0()),
+                                    gfx::Vector2dF(), chunks.items)
+          ->ReleaseAsRecord();
+  EXPECT_THAT(
+      output,
+      Pointee(PaintRecordMatcher::Make(
+          {cc::PaintOpType::SaveLayer, cc::PaintOpType::Concat,     // <t1
+           cc::PaintOpType::SaveLayer,                              //  e1>
+           cc::PaintOpType::Save, cc::PaintOpType::Concat,          // <t1^-1>
+           cc::PaintOpType::DrawRecord,                             // <p0/>
+           cc::PaintOpType::Restore,                                // </t1^-1>
+           cc::PaintOpType::Restore, cc::PaintOpType::Restore})));  // </e1 t1>
+}
+
+TEST_F(PaintChunksToCcLayerTest, NonRootLayerSimple) {
+  // This test verifies a layer with composited property state does not
+  // apply properties again internally.
+  RefPtr<TransformPaintPropertyNode> t1 = TransformPaintPropertyNode::Create(
+      t0(), TransformationMatrix().Scale(2.f), FloatPoint3D());
+  RefPtr<ClipPaintPropertyNode> c1 = ClipPaintPropertyNode::Create(
+      c0(), t0(), FloatRoundedRect(0.f, 0.f, 1.f, 1.f));
+  RefPtr<EffectPaintPropertyNode> e1 = CreateOpacityOnlyEffect(e0(), 0.5f);
+  TestChunks chunks;
+  chunks.AddChunk(t1.Get(), c1.Get(), e1.Get());
+
+  sk_sp<PaintRecord> output =
+      PaintChunksToCcLayer::Convert(
+          chunks.GetChunkList(),
+          PropertyTreeState(t1.Get(), c1.Get(), e1.Get()), gfx::Vector2dF(),
+          chunks.items)
+          ->ReleaseAsRecord();
+  EXPECT_THAT(output,
+              Pointee(PaintRecordMatcher::Make({cc::PaintOpType::DrawRecord})));
+}
+
+TEST_F(PaintChunksToCcLayerTest, NonRootLayerTransformEscape) {
+  // This test verifies chunks that have a shallower transform state than the
+  // layer can still be painted.
+  RefPtr<TransformPaintPropertyNode> t1 = TransformPaintPropertyNode::Create(
+      t0(), TransformationMatrix().Scale(2.f), FloatPoint3D());
+  RefPtr<ClipPaintPropertyNode> c1 = ClipPaintPropertyNode::Create(
+      c0(), t0(), FloatRoundedRect(0.f, 0.f, 1.f, 1.f));
+  RefPtr<EffectPaintPropertyNode> e1 = CreateOpacityOnlyEffect(e0(), 0.5f);
+  TestChunks chunks;
+  chunks.AddChunk(t0(), c1.Get(), e1.Get());
+
+  sk_sp<PaintRecord> output =
+      PaintChunksToCcLayer::Convert(
+          chunks.GetChunkList(),
+          PropertyTreeState(t1.Get(), c1.Get(), e1.Get()), gfx::Vector2dF(),
+          chunks.items)
+          ->ReleaseAsRecord();
+  EXPECT_THAT(output,
+              Pointee(PaintRecordMatcher::Make(
+                  {cc::PaintOpType::Save, cc::PaintOpType::Concat,  // <t1^-1>
+                   cc::PaintOpType::DrawRecord,                     // <p0/>
+                   cc::PaintOpType::Restore})));                    // </t1^-1>
+}
+
+}  // namespace
+}  // namespace blink
diff --git a/third_party/WebKit/Source/platform/instrumentation/resource_coordinator/FrameResourceCoordinator.cpp b/third_party/WebKit/Source/platform/instrumentation/resource_coordinator/FrameResourceCoordinator.cpp
index 2729c5f..23627c7 100644
--- a/third_party/WebKit/Source/platform/instrumentation/resource_coordinator/FrameResourceCoordinator.cpp
+++ b/third_party/WebKit/Source/platform/instrumentation/resource_coordinator/FrameResourceCoordinator.cpp
@@ -4,10 +4,9 @@
 
 #include "platform/instrumentation/resource_coordinator/FrameResourceCoordinator.h"
 
-#include "public/platform/InterfaceProvider.h"
-#include "public/platform/Platform.h"
 #include "services/resource_coordinator/public/cpp/resource_coordinator_features.h"
 #include "services/resource_coordinator/public/interfaces/coordination_unit_provider.mojom-blink.h"
+#include "services/service_manager/public/cpp/interface_provider.h"
 
 namespace blink {
 
@@ -24,12 +23,12 @@
 
 // static
 FrameResourceCoordinator* FrameResourceCoordinator::Create(
-    InterfaceProvider* interface_provider) {
+    service_manager::InterfaceProvider* interface_provider) {
   return new FrameResourceCoordinator(interface_provider);
 }
 
 FrameResourceCoordinator::FrameResourceCoordinator(
-    InterfaceProvider* interface_provider) {
+    service_manager::InterfaceProvider* interface_provider) {
   interface_provider->GetInterface(mojo::MakeRequest(&service_));
 
   service_.set_connection_error_handler(
diff --git a/third_party/WebKit/Source/platform/instrumentation/resource_coordinator/FrameResourceCoordinator.h b/third_party/WebKit/Source/platform/instrumentation/resource_coordinator/FrameResourceCoordinator.h
index 51e405dd..810706f09 100644
--- a/third_party/WebKit/Source/platform/instrumentation/resource_coordinator/FrameResourceCoordinator.h
+++ b/third_party/WebKit/Source/platform/instrumentation/resource_coordinator/FrameResourceCoordinator.h
@@ -8,9 +8,11 @@
 #include "platform/heap/Handle.h"
 #include "services/resource_coordinator/public/interfaces/coordination_unit.mojom-blink.h"
 
-namespace blink {
-
+namespace service_manager {
 class InterfaceProvider;
+}
+
+namespace blink {
 
 class PLATFORM_EXPORT FrameResourceCoordinator final
     : public GarbageCollectedFinalized<FrameResourceCoordinator> {
@@ -18,14 +20,14 @@
 
  public:
   static bool IsEnabled();
-  static FrameResourceCoordinator* Create(InterfaceProvider*);
+  static FrameResourceCoordinator* Create(service_manager::InterfaceProvider*);
   virtual ~FrameResourceCoordinator();
   void SendEvent(const resource_coordinator::mojom::blink::EventType&);
 
   DECLARE_TRACE();
 
  private:
-  explicit FrameResourceCoordinator(InterfaceProvider*);
+  explicit FrameResourceCoordinator(service_manager::InterfaceProvider*);
 
   resource_coordinator::mojom::blink::CoordinationUnitPtr service_;
 };
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcherTest.cpp b/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcherTest.cpp
index 5dd391e..adaf7bc 100644
--- a/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcherTest.cpp
+++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcherTest.cpp
@@ -614,7 +614,7 @@
   EXPECT_TRUE(fetcher->ContainsAsPreload(resource1));
   Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests();
 
-  // The second preload fetch returnes the first preload.
+  // The second preload fetch returns the first preload.
   Resource* resource2 = MockResource::Fetch(fetch_params_for_preload, fetcher);
   EXPECT_TRUE(fetcher->ContainsAsPreload(resource1));
   EXPECT_TRUE(resource1->IsPreloaded());
@@ -645,7 +645,7 @@
   EXPECT_TRUE(fetcher->ContainsAsPreload(resource1));
   Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests();
 
-  // The second preload fetch returnes the first preload.
+  // The second preload fetch returns the first preload.
   Resource* resource2 = MockResource::Fetch(fetch_params_for_preload, fetcher);
   EXPECT_TRUE(fetcher->ContainsAsPreload(resource1));
   EXPECT_TRUE(resource1->IsPreloaded());
@@ -681,7 +681,7 @@
   EXPECT_TRUE(fetcher->ContainsAsPreload(resource1));
   Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests();
 
-  // The second preload fetch returnes the first preload.
+  // The second preload fetch returns the first preload.
   Resource* resource2 =
       MockResource::Fetch(fetch_params_for_link_preload, fetcher);
   EXPECT_TRUE(fetcher->ContainsAsPreload(resource1));
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue.cc b/third_party/WebKit/Source/platform/scheduler/base/task_queue.cc
new file mode 100644
index 0000000..ad00471
--- /dev/null
+++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue.cc
@@ -0,0 +1,128 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "platform/scheduler/base/task_queue.h"
+
+#include "platform/scheduler/base/task_queue_impl.h"
+
+namespace blink {
+namespace scheduler {
+
+TaskQueue::TaskQueue(std::unique_ptr<internal::TaskQueueImpl> impl)
+    : impl_(std::move(impl)) {}
+
+TaskQueue::~TaskQueue() {}
+
+void TaskQueue::UnregisterTaskQueue() {
+  impl_->UnregisterTaskQueue(this);
+}
+
+bool TaskQueue::RunsTasksInCurrentSequence() const {
+  return impl_->RunsTasksInCurrentSequence();
+}
+
+bool TaskQueue::PostDelayedTask(const tracked_objects::Location& from_here,
+                                base::OnceClosure task,
+                                base::TimeDelta delay) {
+  return impl_->PostDelayedTask(from_here, std::move(task), delay);
+}
+
+bool TaskQueue::PostNonNestableDelayedTask(
+    const tracked_objects::Location& from_here,
+    base::OnceClosure task,
+    base::TimeDelta delay) {
+  return impl_->PostNonNestableDelayedTask(from_here, std::move(task), delay);
+}
+
+std::unique_ptr<TaskQueue::QueueEnabledVoter>
+TaskQueue::CreateQueueEnabledVoter() {
+  return impl_->CreateQueueEnabledVoter(this);
+}
+
+bool TaskQueue::IsQueueEnabled() const {
+  return impl_->IsQueueEnabled();
+}
+
+bool TaskQueue::IsEmpty() const {
+  return impl_->IsEmpty();
+}
+
+size_t TaskQueue::GetNumberOfPendingTasks() const {
+  return impl_->GetNumberOfPendingTasks();
+}
+
+bool TaskQueue::HasTaskToRunImmediately() const {
+  return impl_->HasTaskToRunImmediately();
+}
+
+base::Optional<base::TimeTicks> TaskQueue::GetNextScheduledWakeUp() {
+  return impl_->GetNextScheduledWakeUp();
+}
+
+void TaskQueue::SetQueuePriority(TaskQueue::QueuePriority priority) {
+  impl_->SetQueuePriority(priority);
+}
+
+TaskQueue::QueuePriority TaskQueue::GetQueuePriority() const {
+  return impl_->GetQueuePriority();
+}
+
+void TaskQueue::AddTaskObserver(
+    base::MessageLoop::TaskObserver* task_observer) {
+  impl_->AddTaskObserver(task_observer);
+}
+
+void TaskQueue::RemoveTaskObserver(
+    base::MessageLoop::TaskObserver* task_observer) {
+  impl_->RemoveTaskObserver(task_observer);
+}
+
+void TaskQueue::SetTimeDomain(TimeDomain* time_domain) {
+  impl_->SetTimeDomain(time_domain);
+}
+
+TimeDomain* TaskQueue::GetTimeDomain() const {
+  return impl_->GetTimeDomain();
+}
+
+void TaskQueue::SetBlameContext(
+    base::trace_event::BlameContext* blame_context) {
+  impl_->SetBlameContext(blame_context);
+}
+
+void TaskQueue::InsertFence(InsertFencePosition position) {
+  impl_->InsertFence(position);
+}
+
+void TaskQueue::RemoveFence() {
+  impl_->RemoveFence();
+}
+
+bool TaskQueue::HasFence() const {
+  return impl_->HasFence();
+}
+
+bool TaskQueue::BlockedByFence() const {
+  return impl_->BlockedByFence();
+}
+
+const char* TaskQueue::GetName() const {
+  return impl_->GetName();
+}
+
+void TaskQueue::SetObserver(Observer* observer) {
+  if (observer) {
+    // Observer is guaranteed to outlive TaskQueue and TaskQueueImpl lifecycle
+    // is controlled by |this|.
+    impl_->SetOnNextWakeUpChangedCallback(
+        base::Bind(&TaskQueue::Observer::OnQueueNextWakeUpChanged,
+                   base::Unretained(observer), base::Unretained(this)));
+  } else {
+    impl_->SetOnNextWakeUpChangedCallback(
+        base::Callback<void(base::TimeTicks)>());
+  }
+}
+
+}  // namespace scheduler
+}  // namespace blink
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue.h b/third_party/WebKit/Source/platform/scheduler/base/task_queue.h
index 237aef3..27c0652 100644
--- a/third_party/WebKit/Source/platform/scheduler/base/task_queue.h
+++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue.h
@@ -9,6 +9,8 @@
 #include "base/message_loop/message_loop.h"
 #include "base/optional.h"
 #include "base/single_thread_task_runner.h"
+#include "base/synchronization/lock.h"
+#include "base/threading/platform_thread.h"
 #include "base/time/time.h"
 #include "platform/PlatformExport.h"
 
@@ -21,12 +23,14 @@
 namespace blink {
 namespace scheduler {
 
+namespace internal {
+class TaskQueueImpl;
+}
+
 class TimeDomain;
 
 class PLATFORM_EXPORT TaskQueue : public base::SingleThreadTaskRunner {
  public:
-  TaskQueue() {}
-
   class PLATFORM_EXPORT Observer {
    public:
     virtual ~Observer() {}
@@ -46,7 +50,7 @@
 
   // Unregisters the task queue after which no tasks posted to it will run and
   // the TaskQueueManager's reference to it will be released soon.
-  virtual void UnregisterTaskQueue() = 0;
+  virtual void UnregisterTaskQueue();
 
   enum QueuePriority {
     // Queues with control priority will run before any other queue, and will
@@ -74,33 +78,10 @@
   // Can be called on any thread.
   static const char* PriorityToString(QueuePriority priority);
 
-  enum class QueueType {
-    // Keep TaskQueue::NameForQueueType in sync.
-    // This enum is used for a histogram and it should not be re-numbered.
-    CONTROL = 0,
-    DEFAULT = 1,
-    DEFAULT_LOADING = 2,
-    DEFAULT_TIMER = 3,
-    UNTHROTTLED = 4,
-    FRAME_LOADING = 5,
-    FRAME_TIMER = 6,
-    FRAME_UNTHROTTLED = 7,
-    COMPOSITOR = 8,
-    IDLE = 9,
-    TEST = 10,
-
-    COUNT = 11
-  };
-
-  // Returns name of the given queue type. Returned string has application
-  // lifetime.
-  static const char* NameForQueueType(QueueType queue_type);
-
-  // Options for constructing a TaskQueue. Once set the |name| and
-  // |should_monitor_quiescence| are immutable.
+  // Options for constructing a TaskQueue.
   struct Spec {
-    explicit Spec(QueueType type)
-        : type(type),
+    explicit Spec(const char* name)
+        : name(name),
           should_monitor_quiescence(false),
           time_domain(nullptr),
           should_notify_observers(true),
@@ -127,7 +108,7 @@
       return *this;
     }
 
-    QueueType type;
+    const char* name;
     bool should_monitor_quiescence;
     TimeDomain* time_domain;
     bool should_notify_observers;
@@ -156,59 +137,53 @@
   // TaskQueue is enabled. The TaskQueue will be enabled if there are no voters
   // or if all agree it should be enabled.
   // NOTE this must be called on the thread this TaskQueue was created by.
-  virtual std::unique_ptr<QueueEnabledVoter> CreateQueueEnabledVoter() = 0;
+  std::unique_ptr<QueueEnabledVoter> CreateQueueEnabledVoter();
 
   // NOTE this must be called on the thread this TaskQueue was created by.
-  virtual bool IsQueueEnabled() const = 0;
+  bool IsQueueEnabled() const;
 
   // Returns true if the queue is completely empty.
-  virtual bool IsEmpty() const = 0;
+  bool IsEmpty() const;
 
   // Returns the number of pending tasks in the queue.
-  virtual size_t GetNumberOfPendingTasks() const = 0;
+  size_t GetNumberOfPendingTasks() const;
 
   // Returns true if the queue has work that's ready to execute now.
   // NOTE: this must be called on the thread this TaskQueue was created by.
-  virtual bool HasTaskToRunImmediately() const = 0;
+  bool HasTaskToRunImmediately() const;
 
   // Returns requested run time of next scheduled wake-up for a delayed task
   // which is not ready to run. If there are no such tasks or the queue is
   // disabled (by a QueueEnabledVoter) it returns base::nullopt.
   // NOTE: this must be called on the thread this TaskQueue was created by.
-  virtual base::Optional<base::TimeTicks> GetNextScheduledWakeUp() = 0;
+  base::Optional<base::TimeTicks> GetNextScheduledWakeUp();
 
   // Can be called on any thread.
-  virtual QueueType GetQueueType() const = 0;
-
-  // Can be called on any thread.
-  virtual const char* GetName() const = 0;
+  virtual const char* GetName() const;
 
   // Set the priority of the queue to |priority|. NOTE this must be called on
   // the thread this TaskQueue was created by.
-  virtual void SetQueuePriority(QueuePriority priority) = 0;
+  void SetQueuePriority(QueuePriority priority);
 
   // Returns the current queue priority.
-  virtual QueuePriority GetQueuePriority() const = 0;
+  QueuePriority GetQueuePriority() const;
 
   // These functions can only be called on the same thread that the task queue
   // manager executes its tasks on.
-  virtual void AddTaskObserver(
-      base::MessageLoop::TaskObserver* task_observer) = 0;
-  virtual void RemoveTaskObserver(
-      base::MessageLoop::TaskObserver* task_observer) = 0;
+  void AddTaskObserver(base::MessageLoop::TaskObserver* task_observer);
+  void RemoveTaskObserver(base::MessageLoop::TaskObserver* task_observer);
 
   // Set the blame context which is entered and left while executing tasks from
   // this task queue. |blame_context| must be null or outlive this task queue.
   // Must be called on the thread this TaskQueue was created by.
-  virtual void SetBlameContext(
-      base::trace_event::BlameContext* blame_context) = 0;
+  void SetBlameContext(base::trace_event::BlameContext* blame_context);
 
   // Removes the task queue from the previous TimeDomain and adds it to
   // |domain|.  This is a moderately expensive operation.
-  virtual void SetTimeDomain(TimeDomain* domain) = 0;
+  void SetTimeDomain(TimeDomain* domain);
 
   // Returns the queue's current TimeDomain.  Can be called from any thread.
-  virtual TimeDomain* GetTimeDomain() const = 0;
+  TimeDomain* GetTimeDomain() const;
 
   enum class InsertFencePosition {
     NOW,  // Tasks posted on the queue up till this point further may run.
@@ -221,21 +196,41 @@
   // removed or a subsequent fence has unblocked some tasks within the queue.
   // Note: delayed tasks get their enqueue order set once their delay has
   // expired, and non-delayed tasks get their enqueue order set when posted.
-  virtual void InsertFence(InsertFencePosition position) = 0;
+  void InsertFence(InsertFencePosition position);
 
   // Removes any previously added fence and unblocks execution of any tasks
   // blocked by it.
-  virtual void RemoveFence() = 0;
+  void RemoveFence();
 
-  virtual bool HasFence() const = 0;
+  bool HasFence() const;
 
   // Returns true if the queue has a fence which is blocking execution of tasks.
-  virtual bool BlockedByFence() const = 0;
+  bool BlockedByFence() const;
 
-  virtual void SetObserver(Observer* observer) = 0;
+  void SetObserver(Observer* observer);
+
+  // base::SingleThreadTaskRunner implementation
+  bool RunsTasksInCurrentSequence() const override;
+  bool PostDelayedTask(const tracked_objects::Location& from_here,
+                       base::OnceClosure task,
+                       base::TimeDelta delay) override;
+  bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
+                                  base::OnceClosure task,
+                                  base::TimeDelta delay) override;
 
  protected:
-  ~TaskQueue() override {}
+  explicit TaskQueue(std::unique_ptr<internal::TaskQueueImpl> impl);
+  ~TaskQueue() override;
+
+  internal::TaskQueueImpl* GetTaskQueueImpl() const { return impl_.get(); }
+
+ private:
+  friend class internal::TaskQueueImpl;
+  friend class TaskQueueManager;
+
+  friend class TaskQueueThrottlerTest;
+
+  const std::unique_ptr<internal::TaskQueueImpl> impl_;
 
   DISALLOW_COPY_AND_ASSIGN(TaskQueue);
 };
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc b/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc
index 8063c89c..b16bea2b 100644
--- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc
+++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc
@@ -20,40 +20,7 @@
 namespace scheduler {
 
 // static
-const char* TaskQueue::NameForQueueType(TaskQueue::QueueType queue_type) {
-  switch (queue_type) {
-    case TaskQueue::QueueType::CONTROL:
-      return "control_tq";
-    case TaskQueue::QueueType::DEFAULT:
-      return "default_tq";
-    case TaskQueue::QueueType::DEFAULT_LOADING:
-      return "default_loading_tq";
-    case TaskQueue::QueueType::DEFAULT_TIMER:
-      return "default_timer_tq";
-    case TaskQueue::QueueType::UNTHROTTLED:
-      return "unthrottled_tq";
-    case TaskQueue::QueueType::FRAME_LOADING:
-      return "frame_loading_tq";
-    case TaskQueue::QueueType::FRAME_TIMER:
-      return "frame_timer_tq";
-    case TaskQueue::QueueType::FRAME_UNTHROTTLED:
-      return "frame_unthrottled_tq";
-    case TaskQueue::QueueType::COMPOSITOR:
-      return "compositor_tq";
-    case TaskQueue::QueueType::IDLE:
-      return "idle_tq";
-    case TaskQueue::QueueType::TEST:
-      return "test_tq";
-    case TaskQueue::QueueType::COUNT:
-      DCHECK(false);
-      return nullptr;
-  }
-  DCHECK(false);
-  return nullptr;
-}
-
-// static
-const char* TaskQueue::PriorityToString(QueuePriority priority) {
+const char* TaskQueue::PriorityToString(TaskQueue::QueuePriority priority) {
   switch (priority) {
     case CONTROL_PRIORITY:
       return "control";
@@ -75,11 +42,10 @@
 
 TaskQueueImpl::TaskQueueImpl(TaskQueueManager* task_queue_manager,
                              TimeDomain* time_domain,
-                             const Spec& spec)
-    : thread_id_(base::PlatformThread::CurrentId()),
+                             const TaskQueue::Spec& spec)
+    : name_(spec.name),
+      thread_id_(base::PlatformThread::CurrentId()),
       any_thread_(task_queue_manager, time_domain),
-      type_(spec.type),
-      name_(NameForQueueType(spec.type)),
       main_thread_only_(task_queue_manager, this, time_domain),
       should_monitor_quiescence_(spec.should_monitor_quiescence),
       should_notify_observers_(spec.should_notify_observers),
@@ -141,9 +107,7 @@
 
 TaskQueueImpl::AnyThread::AnyThread(TaskQueueManager* task_queue_manager,
                                     TimeDomain* time_domain)
-    : task_queue_manager(task_queue_manager),
-      time_domain(time_domain),
-      observer(nullptr) {}
+    : task_queue_manager(task_queue_manager), time_domain(time_domain) {}
 
 TaskQueueImpl::AnyThread::~AnyThread() {}
 
@@ -153,7 +117,6 @@
     TimeDomain* time_domain)
     : task_queue_manager(task_queue_manager),
       time_domain(time_domain),
-      observer(nullptr),
       delayed_work_queue(
           new WorkQueue(task_queue, "delayed", WorkQueue::QueueType::DELAYED)),
       immediate_work_queue(new WorkQueue(task_queue,
@@ -163,31 +126,39 @@
       is_enabled_refcount(0),
       voter_refcount(0),
       blame_context(nullptr),
-      current_fence(0) {}
+      current_fence(0),
+      is_enabled_for_test(true) {}
 
 TaskQueueImpl::MainThreadOnly::~MainThreadOnly() {}
 
-void TaskQueueImpl::UnregisterTaskQueue() {
+void TaskQueueImpl::UnregisterTaskQueue(scoped_refptr<TaskQueue> task_queue) {
   base::AutoLock lock(any_thread_lock_);
   base::AutoLock immediate_incoming_queue_lock(immediate_incoming_queue_lock_);
   if (main_thread_only().time_domain)
     main_thread_only().time_domain->UnregisterQueue(this);
   if (!any_thread().task_queue_manager)
     return;
+
+  main_thread_only().on_task_completed_handler = OnTaskCompletedHandler();
   any_thread().time_domain = nullptr;
   main_thread_only().time_domain = nullptr;
-  any_thread().task_queue_manager->UnregisterTaskQueue(this);
+  any_thread().task_queue_manager->UnregisterTaskQueue(task_queue);
 
   any_thread().task_queue_manager = nullptr;
   main_thread_only().task_queue_manager = nullptr;
-  any_thread().observer = nullptr;
-  main_thread_only().observer = nullptr;
+  any_thread().on_next_wake_up_changed_callback = OnNextWakeUpChangedCallback();
+  main_thread_only().on_next_wake_up_changed_callback =
+      OnNextWakeUpChangedCallback();
   main_thread_only().delayed_incoming_queue = std::priority_queue<Task>();
   immediate_incoming_queue().clear();
   main_thread_only().immediate_work_queue.reset();
   main_thread_only().delayed_work_queue.reset();
 }
 
+const char* TaskQueueImpl::GetName() const {
+  return name_;
+}
+
 bool TaskQueueImpl::RunsTasksInCurrentSequence() const {
   return base::PlatformThread::CurrentId() == thread_id_;
 }
@@ -304,12 +275,10 @@
   int thread_hop_task_sequence_number =
       any_thread().task_queue_manager->GetNextSequenceNumber();
   PushOntoImmediateIncomingQueueLocked(
-     FROM_HERE,
-     base::Bind(&TaskQueueImpl::ScheduleDelayedWorkTask, this,
-                base::Passed(&pending_task)),
-     base::TimeTicks(),
-     thread_hop_task_sequence_number,
-     false);
+      FROM_HERE,
+      base::Bind(&TaskQueueImpl::ScheduleDelayedWorkTask,
+                 base::Unretained(this), base::Passed(&pending_task)),
+      base::TimeTicks(), thread_hop_task_sequence_number, false);
 }
 
 void TaskQueueImpl::ScheduleDelayedWorkTask(Task pending_task) {
@@ -361,8 +330,8 @@
         (!IsQueueEnabled() || main_thread_only().current_fence);
     any_thread().task_queue_manager->OnQueueHasIncomingImmediateWork(
         this, sequence_number, queue_is_blocked);
-    if (any_thread().observer)
-      any_thread().observer->OnQueueNextWakeUpChanged(this, desired_run_time);
+    if (!any_thread().on_next_wake_up_changed_callback.is_null())
+      any_thread().on_next_wake_up_changed_callback.Run(desired_run_time);
   }
 
   TraceQueueSize();
@@ -479,22 +448,14 @@
                      main_thread_only().delayed_incoming_queue.size());
 }
 
-const char* TaskQueueImpl::GetName() const {
-  return name_;
-}
-
-TaskQueue::QueueType TaskQueueImpl::GetQueueType() const {
-  return type_;
-}
-
-void TaskQueueImpl::SetQueuePriority(QueuePriority priority) {
+void TaskQueueImpl::SetQueuePriority(TaskQueue::QueuePriority priority) {
   if (!main_thread_only().task_queue_manager || priority == GetQueuePriority())
     return;
   main_thread_only().task_queue_manager->selector_.SetQueuePriority(this,
                                                                     priority);
 }
 
-TaskQueueImpl::QueuePriority TaskQueueImpl::GetQueuePriority() const {
+TaskQueue::QueuePriority TaskQueueImpl::GetQueuePriority() const {
   size_t set_index = immediate_work_queue()->work_queue_set_index();
   DCHECK_EQ(set_index, delayed_work_queue()->work_queue_set_index());
   return static_cast<TaskQueue::QueuePriority>(set_index);
@@ -548,7 +509,7 @@
     QueueAsValueInto(main_thread_only().delayed_incoming_queue, now, state);
     state->EndArray();
   }
-  state->SetString("priority", PriorityToString(GetQueuePriority()));
+  state->SetString("priority", TaskQueue::PriorityToString(GetQueuePriority()));
   state->EndDictionary();
 }
 
@@ -762,18 +723,19 @@
 }
 
 TaskQueueImpl::QueueEnabledVoterImpl::QueueEnabledVoterImpl(
-    TaskQueueImpl* task_queue)
+    scoped_refptr<TaskQueue> task_queue)
     : task_queue_(task_queue), enabled_(true) {}
 
 TaskQueueImpl::QueueEnabledVoterImpl::~QueueEnabledVoterImpl() {
-  task_queue_->RemoveQueueEnabledVoter(this);
+  if (task_queue_->GetTaskQueueImpl())
+    task_queue_->GetTaskQueueImpl()->RemoveQueueEnabledVoter(this);
 }
 
 void TaskQueueImpl::QueueEnabledVoterImpl::SetQueueEnabled(bool enabled) {
   if (enabled_ == enabled)
     return;
 
-  task_queue_->OnQueueEnabledVoteChanged(enabled);
+  task_queue_->GetTaskQueueImpl()->OnQueueEnabledVoteChanged(enabled);
   enabled_ = enabled;
 }
 
@@ -798,8 +760,10 @@
 }
 
 bool TaskQueueImpl::IsQueueEnabled() const {
-  return main_thread_only().is_enabled_refcount ==
-         main_thread_only().voter_refcount;
+  // By default is_enabled_refcount and voter_refcount both equal zero.
+  return (main_thread_only().is_enabled_refcount ==
+          main_thread_only().voter_refcount) &&
+         main_thread_only().is_enabled_for_test;
 }
 
 void TaskQueueImpl::OnQueueEnabledVoteChanged(bool enabled) {
@@ -823,10 +787,11 @@
     return;
 
   if (enable) {
-    if (HasPendingImmediateWork() && main_thread_only().observer) {
+    if (HasPendingImmediateWork() &&
+        !main_thread_only().on_next_wake_up_changed_callback.is_null()) {
       // Delayed work notification will be issued via time domain.
-      main_thread_only().observer->OnQueueNextWakeUpChanged(this,
-                                                            base::TimeTicks());
+      main_thread_only().on_next_wake_up_changed_callback.Run(
+          base::TimeTicks());
     }
 
     ScheduleDelayedWorkInTimeDomain(main_thread_only().time_domain->Now());
@@ -841,11 +806,12 @@
   }
 }
 
-std::unique_ptr<TaskQueueImpl::QueueEnabledVoter>
-TaskQueueImpl::CreateQueueEnabledVoter() {
+std::unique_ptr<TaskQueue::QueueEnabledVoter>
+TaskQueueImpl::CreateQueueEnabledVoter(scoped_refptr<TaskQueue> task_queue) {
+  DCHECK_EQ(task_queue->GetTaskQueueImpl(), this);
   main_thread_only().voter_refcount++;
   main_thread_only().is_enabled_refcount++;
-  return base::MakeUnique<QueueEnabledVoterImpl>(this);
+  return base::MakeUnique<QueueEnabledVoterImpl>(task_queue);
 }
 
 void TaskQueueImpl::SweepCanceledDelayedTasks(base::TimeTicks now) {
@@ -882,17 +848,18 @@
   immediate_incoming_queue().push_back(std::move(task));
 }
 
-void TaskQueueImpl::SetObserver(Observer* observer) {
+void TaskQueueImpl::SetOnNextWakeUpChangedCallback(
+    TaskQueueImpl::OnNextWakeUpChangedCallback callback) {
 #if DCHECK_IS_ON()
-  if (observer) {
-    DCHECK(!main_thread_only().observer) << "Can't assign two different "
-                                            "observers to "
-                                            "blink::scheduler::TaskQueue";
+  if (callback) {
+    DCHECK(main_thread_only().on_next_wake_up_changed_callback.is_null())
+        << "Can't assign two different observers to "
+           "blink::scheduler::TaskQueue";
   }
 #endif
   base::AutoLock lock(any_thread_lock_);
-  any_thread().observer = observer;
-  main_thread_only().observer = observer;
+  any_thread().on_next_wake_up_changed_callback = callback;
+  main_thread_only().on_next_wake_up_changed_callback = callback;
 }
 
 void TaskQueueImpl::ScheduleDelayedWorkInTimeDomain(base::TimeTicks now) {
@@ -913,12 +880,13 @@
 
   // If queue has immediate work an appropriate notification has already
   // been issued.
-  if (!scheduled_time_domain_wake_up || !main_thread_only().observer ||
+  if (!scheduled_time_domain_wake_up ||
+      main_thread_only().on_next_wake_up_changed_callback.is_null() ||
       HasPendingImmediateWork())
     return;
 
-  main_thread_only().observer->OnQueueNextWakeUpChanged(
-      this, scheduled_time_domain_wake_up.value());
+  main_thread_only().on_next_wake_up_changed_callback.Run(
+      scheduled_time_domain_wake_up.value());
 }
 
 bool TaskQueueImpl::HasPendingImmediateWork() {
@@ -933,6 +901,22 @@
   return !immediate_incoming_queue().empty();
 }
 
+void TaskQueueImpl::SetOnTaskCompletedHandler(
+    TaskQueueImpl::OnTaskCompletedHandler handler) {
+  main_thread_only().on_task_completed_handler = std::move(handler);
+}
+
+void TaskQueueImpl::OnTaskCompleted(base::TimeTicks start,
+                                    base::TimeTicks end) {
+  if (!main_thread_only().on_task_completed_handler.is_null())
+    main_thread_only().on_task_completed_handler.Run(start, end);
+}
+
+void TaskQueueImpl::SetQueueEnabledForTest(bool enabled) {
+  main_thread_only().is_enabled_for_test = enabled;
+  EnableOrDisableWithSelector(IsQueueEnabled());
+}
+
 }  // namespace internal
 }  // namespace scheduler
 }  // namespace blink
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.h b/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.h
index 77fbf79..1ae5094 100644
--- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.h
+++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.h
@@ -12,6 +12,7 @@
 
 #include "base/callback.h"
 #include "base/macros.h"
+#include "base/memory/weak_ptr.h"
 #include "base/message_loop/message_loop.h"
 #include "base/pending_task.h"
 #include "base/threading/thread_checker.h"
@@ -58,11 +59,13 @@
 // queue is selected, it round-robins between the immediate_work_queue and
 // delayed_work_queue.  The reason for this is we want to make sure delayed
 // tasks (normally the most common type) don't starve out immediate work.
-class PLATFORM_EXPORT TaskQueueImpl final : public TaskQueue {
+class PLATFORM_EXPORT TaskQueueImpl {
  public:
   TaskQueueImpl(TaskQueueManager* task_queue_manager,
                 TimeDomain* time_domain,
-                const Spec& spec);
+                const TaskQueue::Spec& spec);
+
+  ~TaskQueueImpl();
 
   // Represents a time at which a task wants to run. Tasks scheduled for the
   // same point in time will be ordered by their sequence numbers.
@@ -130,36 +133,42 @@
     EnqueueOrder enqueue_order_;
   };
 
+  using OnNextWakeUpChangedCallback = base::Callback<void(base::TimeTicks)>;
+  using OnTaskCompletedHandler =
+      base::Callback<void(base::TimeTicks, base::TimeTicks)>;
+
   // TaskQueue implementation.
-  void UnregisterTaskQueue() override;
-  bool RunsTasksInCurrentSequence() const override;
+  const char* GetName() const;
+  bool RunsTasksInCurrentSequence() const;
   bool PostDelayedTask(const tracked_objects::Location& from_here,
                        base::OnceClosure task,
-                       base::TimeDelta delay) override;
+                       base::TimeDelta delay);
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
                                   base::OnceClosure task,
-                                  base::TimeDelta delay) override;
-  std::unique_ptr<QueueEnabledVoter> CreateQueueEnabledVoter() override;
-  bool IsQueueEnabled() const override;
-  bool IsEmpty() const override;
-  size_t GetNumberOfPendingTasks() const override;
-  bool HasTaskToRunImmediately() const override;
-  base::Optional<base::TimeTicks> GetNextScheduledWakeUp() override;
-  void SetQueuePriority(QueuePriority priority) override;
-  QueuePriority GetQueuePriority() const override;
-  void AddTaskObserver(base::MessageLoop::TaskObserver* task_observer) override;
-  void RemoveTaskObserver(
-      base::MessageLoop::TaskObserver* task_observer) override;
-  void SetTimeDomain(TimeDomain* time_domain) override;
-  TimeDomain* GetTimeDomain() const override;
-  void SetBlameContext(base::trace_event::BlameContext* blame_context) override;
-  void InsertFence(InsertFencePosition position) override;
-  void RemoveFence() override;
-  bool HasFence() const override;
-  bool BlockedByFence() const override;
-  const char* GetName() const override;
-  QueueType GetQueueType() const override;
-  void SetObserver(Observer* observer) override;
+                                  base::TimeDelta delay);
+  // Require a reference to enclosing task queue for lifetime control.
+  std::unique_ptr<TaskQueue::QueueEnabledVoter> CreateQueueEnabledVoter(
+      scoped_refptr<TaskQueue> owning_task_queue);
+  bool IsQueueEnabled() const;
+  bool IsEmpty() const;
+  size_t GetNumberOfPendingTasks() const;
+  bool HasTaskToRunImmediately() const;
+  base::Optional<base::TimeTicks> GetNextScheduledWakeUp();
+  void SetQueuePriority(TaskQueue::QueuePriority priority);
+  TaskQueue::QueuePriority GetQueuePriority() const;
+  void AddTaskObserver(base::MessageLoop::TaskObserver* task_observer);
+  void RemoveTaskObserver(base::MessageLoop::TaskObserver* task_observer);
+  void SetTimeDomain(TimeDomain* time_domain);
+  TimeDomain* GetTimeDomain() const;
+  void SetBlameContext(base::trace_event::BlameContext* blame_context);
+  void InsertFence(TaskQueue::InsertFencePosition position);
+  void RemoveFence();
+  bool HasFence() const;
+  bool BlockedByFence() const;
+  // Implementation of TaskQueue::SetObserver.
+  void SetOnNextWakeUpChangedCallback(OnNextWakeUpChangedCallback callback);
+
+  void UnregisterTaskQueue(scoped_refptr<TaskQueue> task_queue);
 
   // Returns true if a (potentially hypothetical) task with the specified
   // |enqueue_order| could run on the queue. Must be called from the main
@@ -228,26 +237,37 @@
   void PushImmediateIncomingTaskForTest(TaskQueueImpl::Task&& task);
   EnqueueOrder GetFenceForTest() const;
 
-  class QueueEnabledVoterImpl : public QueueEnabledVoter {
+  class QueueEnabledVoterImpl : public TaskQueue::QueueEnabledVoter {
    public:
-    explicit QueueEnabledVoterImpl(TaskQueueImpl* task_queue);
+    explicit QueueEnabledVoterImpl(scoped_refptr<TaskQueue> task_queue);
     ~QueueEnabledVoterImpl() override;
 
     // QueueEnabledVoter implementation.
     void SetQueueEnabled(bool enabled) override;
 
-    TaskQueueImpl* GetTaskQueueForTest() const { return task_queue_.get(); }
+    TaskQueueImpl* GetTaskQueueForTest() const {
+      return task_queue_->GetTaskQueueImpl();
+    }
 
    private:
     friend class TaskQueueImpl;
 
-    scoped_refptr<TaskQueueImpl> task_queue_;
+    scoped_refptr<TaskQueue> task_queue_;
     bool enabled_;
   };
 
   // Iterates over |delayed_incoming_queue| removing canceled tasks.
   void SweepCanceledDelayedTasks(base::TimeTicks now);
 
+  // Allows wrapping TaskQueue to set a handler to subscribe for notifications
+  // about completed tasks.
+  void SetOnTaskCompletedHandler(OnTaskCompletedHandler handler);
+  void OnTaskCompleted(base::TimeTicks start, base::TimeTicks end);
+
+  // Disables queue for testing purposes, when a QueueEnabledVoter can't be
+  // constructed due to not having TaskQueue.
+  void SetQueueEnabledForTest(bool enabled);
+
  private:
   friend class WorkQueue;
   friend class WorkQueueTest;
@@ -266,7 +286,8 @@
     // main thread, so it should be locked before accessing from other threads.
     TaskQueueManager* task_queue_manager;
     TimeDomain* time_domain;
-    Observer* observer;
+    // Callback corresponding to TaskQueue::Observer::OnQueueNextChanged.
+    OnNextWakeUpChangedCallback on_next_wake_up_changed_callback;
   };
 
   struct MainThreadOnly {
@@ -280,7 +301,8 @@
     // See description inside struct AnyThread for details.
     TaskQueueManager* task_queue_manager;
     TimeDomain* time_domain;
-    Observer* observer;
+    // Callback corresponding to TaskQueue::Observer::OnQueueNextChanged.
+    OnNextWakeUpChangedCallback on_next_wake_up_changed_callback;
 
     std::unique_ptr<WorkQueue> delayed_work_queue;
     std::unique_ptr<WorkQueue> immediate_work_queue;
@@ -293,10 +315,11 @@
     base::trace_event::BlameContext* blame_context;  // Not owned.
     EnqueueOrder current_fence;
     base::Optional<base::TimeTicks> scheduled_time_domain_wake_up;
+    OnTaskCompletedHandler on_task_completed_handler;
+    // If false, queue will be disabled. Used only for tests.
+    bool is_enabled_for_test;
   };
 
-  ~TaskQueueImpl() override;
-
   bool PostImmediateTaskImpl(const tracked_objects::Location& from_here,
                              base::OnceClosure task,
                              TaskType task_type);
@@ -354,6 +377,8 @@
   // Schedules delayed work on time domain and calls the observer.
   void ScheduleDelayedWorkInTimeDomain(base::TimeTicks now);
 
+  const char* name_;
+
   const base::PlatformThreadId thread_id_;
 
   mutable base::Lock any_thread_lock_;
@@ -367,9 +392,6 @@
     return any_thread_;
   }
 
-  const QueueType type_;
-  const char* const name_;
-
   base::ThreadChecker main_thread_checker_;
   MainThreadOnly main_thread_only_;
   MainThreadOnly& main_thread_only() {
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.cc b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.cc
index d409fcf..0108188 100644
--- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.cc
+++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.cc
@@ -17,6 +17,7 @@
 #include "platform/scheduler/base/task_time_observer.h"
 #include "platform/scheduler/base/work_queue.h"
 #include "platform/scheduler/base/work_queue_sets.h"
+#include "platform/wtf/PtrUtil.h"
 
 namespace blink {
 namespace scheduler {
@@ -106,19 +107,18 @@
   time_domains_.erase(time_domain);
 }
 
-scoped_refptr<internal::TaskQueueImpl> TaskQueueManager::NewTaskQueue(
+std::unique_ptr<internal::TaskQueueImpl> TaskQueueManager::CreateTaskQueueImpl(
     const TaskQueue::Spec& spec) {
-  TRACE_EVENT1("renderer.scheduler", "TaskQueueManager::NewTaskQueue",
-               "queue_name", TaskQueue::NameForQueueType(spec.type));
   DCHECK(main_thread_checker_.CalledOnValidThread());
   TimeDomain* time_domain =
       spec.time_domain ? spec.time_domain : real_time_domain_.get();
   DCHECK(time_domains_.find(time_domain) != time_domains_.end());
-  scoped_refptr<internal::TaskQueueImpl> queue(
-      make_scoped_refptr(new internal::TaskQueueImpl(this, time_domain, spec)));
-  queues_.insert(queue);
-  selector_.AddQueue(queue.get());
-  return queue;
+  return WTF::MakeUnique<internal::TaskQueueImpl>(this, time_domain, spec);
+}
+
+void TaskQueueManager::RegisterTaskQueue(scoped_refptr<TaskQueue> task_queue) {
+  queues_.insert(task_queue);
+  selector_.AddQueue(task_queue->GetTaskQueueImpl());
 }
 
 void TaskQueueManager::SetObserver(Observer* observer) {
@@ -127,23 +127,22 @@
 }
 
 void TaskQueueManager::UnregisterTaskQueue(
-    scoped_refptr<internal::TaskQueueImpl> task_queue) {
+    scoped_refptr<TaskQueue> task_queue) {
   TRACE_EVENT1("renderer.scheduler", "TaskQueueManager::UnregisterTaskQueue",
                "queue_name", task_queue->GetName());
   DCHECK(main_thread_checker_.CalledOnValidThread());
-  if (observer_)
-    observer_->OnUnregisterTaskQueue(task_queue);
 
   // Add |task_queue| to |queues_to_delete_| so we can prevent it from being
   // freed while any of our structures hold hold a raw pointer to it.
   queues_to_delete_.insert(task_queue);
   queues_.erase(task_queue);
 
-  selector_.RemoveQueue(task_queue.get());
+  selector_.RemoveQueue(task_queue->GetTaskQueueImpl());
 
   {
     base::AutoLock lock(any_thread_lock_);
-    any_thread().has_incoming_immediate_work.erase(task_queue.get());
+    any_thread().has_incoming_immediate_work.erase(
+        task_queue->GetTaskQueueImpl());
   }
 }
 
@@ -516,7 +515,7 @@
     if (notify_time_observers) {
       task_start_time = MonotonicTimeInSeconds(time_before_task.Now());
       for (auto& observer : task_time_observers_)
-        observer.WillProcessTask(queue, task_start_time);
+        observer.WillProcessTask(task_start_time);
     }
   }
 
@@ -541,8 +540,13 @@
     if (task_start_time) {
       *time_after_task = real_time_domain()->Now();
       double task_end_time = MonotonicTimeInSeconds(*time_after_task);
+
+      queue->OnTaskCompleted(
+          base::TimeTicks() + base::TimeDelta::FromSecondsD(task_start_time),
+          base::TimeTicks() + base::TimeDelta::FromSecondsD(task_end_time));
+
       for (auto& observer : task_time_observers_)
-        observer.DidProcessTask(queue, task_start_time, task_end_time);
+        observer.DidProcessTask(task_start_time, task_end_time);
     }
 
     for (auto& observer : task_observers_)
@@ -639,7 +643,7 @@
   base::TimeTicks now = real_time_domain()->CreateLazyNow().Now();
   state->BeginArray("queues");
   for (auto& queue : queues_)
-    queue->AsValueInto(now, state.get());
+    queue->GetTaskQueueImpl()->AsValueInto(now, state.get());
   state->EndArray();
   state->BeginDictionary("selector");
   selector_.AsValueInto(state.get());
@@ -683,10 +687,8 @@
     internal::WorkQueue* work_queue) {
   DCHECK(main_thread_checker_.CalledOnValidThread());
   DCHECK(!work_queue->Empty());
-  if (observer_) {
-    observer_->OnTriedToExecuteBlockedTask(*work_queue->task_queue(),
-                                           *work_queue->GetFrontTask());
-  }
+  if (observer_)
+    observer_->OnTriedToExecuteBlockedTask();
 }
 
 bool TaskQueueManager::HasImmediateWorkForTesting() const {
@@ -701,11 +703,12 @@
 
 void TaskQueueManager::SweepCanceledDelayedTasks() {
   std::map<TimeDomain*, base::TimeTicks> time_domain_now;
-  for (const scoped_refptr<internal::TaskQueueImpl>& queue : queues_) {
+  for (const auto& queue : queues_) {
     TimeDomain* time_domain = queue->GetTimeDomain();
     if (time_domain_now.find(time_domain) == time_domain_now.end())
       time_domain_now.insert(std::make_pair(time_domain, time_domain->Now()));
-    queue->SweepCanceledDelayedTasks(time_domain_now[time_domain]);
+    queue->GetTaskQueueImpl()->SweepCanceledDelayedTasks(
+        time_domain_now[time_domain]);
   }
 }
 
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.h b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.h
index dd8e9a18..5e86eda7 100644
--- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.h
+++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.h
@@ -36,9 +36,10 @@
 
 class LazyNow;
 class RealTimeDomain;
-class TimeDomain;
+class TaskQueue;
 class TaskQueueManagerDelegate;
 class TaskTimeObserver;
+class TimeDomain;
 
 // The task queue manager provides N task queues and a selector interface for
 // choosing which task queue to service next. Each task queue consists of two
@@ -98,23 +99,22 @@
   // last call to GetAndClearSystemIsQuiescentBit.
   bool GetAndClearSystemIsQuiescentBit();
 
-  // Creates a task queue with the given |spec|.  Must be called on the thread
-  // this class was created on.
-  scoped_refptr<internal::TaskQueueImpl> NewTaskQueue(
-      const TaskQueue::Spec& spec);
+  // Creates a task queue with the given type, |spec| and args. Must be called
+  // on the thread this class was created on.
+  template <typename TaskQueueType, typename... Args>
+  scoped_refptr<TaskQueueType> CreateTaskQueue(const TaskQueue::Spec& spec,
+                                               Args&&... args) {
+    scoped_refptr<TaskQueueType> task_queue(new TaskQueueType(
+        CreateTaskQueueImpl(spec), std::forward<Args>(args)...));
+    RegisterTaskQueue(task_queue);
+    return task_queue;
+  }
 
   class PLATFORM_EXPORT Observer {
    public:
     virtual ~Observer() {}
 
-    // Called when |queue| is unregistered.
-    virtual void OnUnregisterTaskQueue(
-        const scoped_refptr<TaskQueue>& queue) = 0;
-
-    // Called when the manager tried to execute a task from a disabled
-    // queue. See TaskQueue::Spec::SetShouldReportWhenExecutionBlocked.
-    virtual void OnTriedToExecuteBlockedTask(const TaskQueue& queue,
-                                             const base::PendingTask& task) = 0;
+    virtual void OnTriedToExecuteBlockedTask() = 0;
   };
 
   // Called once to set the Observer. This function is called on the main
@@ -135,7 +135,7 @@
 
   // Returns the currently executing TaskQueue if any. Must be called on the
   // thread this class was created on.
-  TaskQueue* currently_executing_task_queue() const {
+  internal::TaskQueueImpl* currently_executing_task_queue() const {
     DCHECK(main_thread_checker_.CalledOnValidThread());
     return currently_executing_task_queue_;
   }
@@ -227,7 +227,7 @@
   };
 
   // Unregisters a TaskQueue previously created by |NewTaskQueue()|.
-  void UnregisterTaskQueue(scoped_refptr<internal::TaskQueueImpl> task_queue);
+  void UnregisterTaskQueue(scoped_refptr<TaskQueue> task_queue);
 
   // TaskQueueSelector::Observer implementation:
   void OnTaskQueueEnabled(internal::TaskQueueImpl* queue) override;
@@ -312,14 +312,18 @@
   void ReloadEmptyWorkQueues(
       const IncomingImmediateWorkMap& queues_to_reload) const;
 
+  std::unique_ptr<internal::TaskQueueImpl> CreateTaskQueueImpl(
+      const TaskQueue::Spec& spec);
+  void RegisterTaskQueue(scoped_refptr<TaskQueue> task_queue);
+
   std::set<TimeDomain*> time_domains_;
   std::unique_ptr<RealTimeDomain> real_time_domain_;
 
-  std::set<scoped_refptr<internal::TaskQueueImpl>> queues_;
+  std::set<scoped_refptr<TaskQueue>> queues_;
 
   // We have to be careful when deleting a queue because some of the code uses
   // raw pointers and doesn't expect the rug to be pulled out from underneath.
-  std::set<scoped_refptr<internal::TaskQueueImpl>> queues_to_delete_;
+  std::set<scoped_refptr<TaskQueue>> queues_to_delete_;
 
   internal::EnqueueOrderGenerator enqueue_order_generator_;
   base::debug::TaskAnnotator task_annotator_;
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_perftest.cc b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_perftest.cc
index 4c33e1d2..c93d4246 100644
--- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_perftest.cc
+++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_perftest.cc
@@ -21,6 +21,7 @@
 #include "platform/scheduler/base/test_task_time_observer.h"
 #include "platform/scheduler/base/virtual_time_domain.h"
 #include "platform/scheduler/base/work_queue_sets.h"
+#include "platform/scheduler/test/test_task_queue.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/perf/perf_test.h"
 
@@ -93,9 +94,8 @@
     manager_->RegisterTimeDomain(virtual_time_domain_.get());
 
     for (size_t i = 0; i < num_queues; i++) {
-      queues_.push_back(manager_->NewTaskQueue(
-          TaskQueue::Spec(TaskQueue::QueueType::TEST)
-              .SetTimeDomain(virtual_time_domain_.get())));
+      queues_.push_back(manager_->CreateTaskQueue<TestTaskQueue>(
+          TaskQueue::Spec("test").SetTimeDomain(virtual_time_domain_.get())));
     }
   }
 
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_unittest.cc b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_unittest.cc
index 5ab22a8..13115f9 100644
--- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_unittest.cc
+++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_unittest.cc
@@ -31,6 +31,7 @@
 #include "platform/scheduler/base/virtual_time_domain.h"
 #include "platform/scheduler/base/work_queue.h"
 #include "platform/scheduler/base/work_queue_sets.h"
+#include "platform/scheduler/test/test_task_queue.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
 using ::testing::AnyNumber;
@@ -89,6 +90,19 @@
   void DeleteTaskQueueManager() { manager_.reset(); }
 
  protected:
+  scoped_refptr<TestTaskQueue> CreateTaskQueueWithSpec(TaskQueue::Spec spec) {
+    return manager_->CreateTaskQueue<TestTaskQueue>(spec);
+  }
+
+  scoped_refptr<TestTaskQueue> CreateTaskQueue() {
+    return CreateTaskQueueWithSpec(TaskQueue::Spec("test"));
+  }
+
+  scoped_refptr<TestTaskQueue> CreateTaskQueueWithMonitoredQuiescence() {
+    return CreateTaskQueueWithSpec(
+        TaskQueue::Spec("test").SetShouldMonitorQuiescence(true));
+  }
+
   void InitializeWithClock(size_t num_queues,
                            std::unique_ptr<base::TickClock> test_time_source) {
     test_task_runner_ = make_scoped_refptr(
@@ -100,8 +114,7 @@
     manager_ = base::MakeUnique<TaskQueueManagerForTest>(main_task_runner_);
 
     for (size_t i = 0; i < num_queues; i++)
-      runners_.push_back(
-          manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST)));
+      runners_.push_back(CreateTaskQueue());
   }
 
   void Initialize(size_t num_queues) {
@@ -121,8 +134,7 @@
             base::WrapUnique(new TestTimeSource(now_src_.get()))));
 
     for (size_t i = 0; i < num_queues; i++)
-      runners_.push_back(
-          manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST)));
+      runners_.push_back(CreateTaskQueue());
   }
 
   void WakeUpReadyDelayedQueues(LazyNow lazy_now) {
@@ -187,7 +199,7 @@
   scoped_refptr<TaskQueueManagerDelegateForTest> main_task_runner_;
   scoped_refptr<cc::OrderedSimpleTaskRunner> test_task_runner_;
   std::unique_ptr<TaskQueueManagerForTest> manager_;
-  std::vector<scoped_refptr<internal::TaskQueueImpl>> runners_;
+  std::vector<scoped_refptr<TestTaskQueue>> runners_;
   TestTaskTimeObserver test_task_time_observer_;
 };
 
@@ -222,8 +234,7 @@
   manager_->AddTaskTimeObserver(&test_task_time_observer_);
 
   for (size_t i = 0; i < 3; i++)
-    runners_.push_back(
-        manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST)));
+    runners_.push_back(CreateTaskQueue());
 
   runners_[0]->PostTask(FROM_HERE, base::Bind(&NopTask));
   runners_[0]->PostTask(FROM_HERE, base::Bind(&NopTask));
@@ -252,8 +263,7 @@
           base::WrapUnique(test_count_uses_time_source)));
   manager_->AddTaskTimeObserver(&test_task_time_observer_);
 
-  runners_.push_back(
-      manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST)));
+  runners_.push_back(CreateTaskQueue());
 
   std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop;
   for (int i = 0; i <= 6; ++i) {
@@ -365,12 +375,13 @@
   EXPECT_TRUE(runners_[0]->HasTaskToRunImmediately());
 
   // Move the task into the |immediate_work_queue|.
-  EXPECT_TRUE(runners_[0]->immediate_work_queue()->Empty());
+  EXPECT_TRUE(runners_[0]->GetTaskQueueImpl()->immediate_work_queue()->Empty());
   std::unique_ptr<TaskQueue::QueueEnabledVoter> voter =
       runners_[0]->CreateQueueEnabledVoter();
   voter->SetQueueEnabled(false);
   test_task_runner_->RunUntilIdle();
-  EXPECT_FALSE(runners_[0]->immediate_work_queue()->Empty());
+  EXPECT_FALSE(
+      runners_[0]->GetTaskQueueImpl()->immediate_work_queue()->Empty());
   EXPECT_TRUE(runners_[0]->HasTaskToRunImmediately());
 
   // Run the task, making the queue empty.
@@ -392,7 +403,7 @@
 
   // Move the task into the |delayed_work_queue|.
   WakeUpReadyDelayedQueues(LazyNow(now_src_.get()));
-  EXPECT_FALSE(runners_[0]->delayed_work_queue()->Empty());
+  EXPECT_FALSE(runners_[0]->GetTaskQueueImpl()->delayed_work_queue()->Empty());
   EXPECT_TRUE(runners_[0]->HasTaskToRunImmediately());
 
   // Run the task, making the queue empty.
@@ -1099,15 +1110,9 @@
 TEST_F(TaskQueueManagerTest, GetAndClearSystemIsQuiescentBit) {
   Initialize(3u);
 
-  scoped_refptr<internal::TaskQueueImpl> queue0 =
-      manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST)
-                                 .SetShouldMonitorQuiescence(true));
-  scoped_refptr<internal::TaskQueueImpl> queue1 =
-      manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST)
-                                 .SetShouldMonitorQuiescence(true));
-  scoped_refptr<internal::TaskQueueImpl> queue2 =
-      manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST)
-                                 .SetShouldMonitorQuiescence(false));
+  scoped_refptr<TaskQueue> queue0 = CreateTaskQueueWithMonitoredQuiescence();
+  scoped_refptr<TaskQueue> queue1 = CreateTaskQueueWithMonitoredQuiescence();
+  scoped_refptr<TaskQueue> queue2 = CreateTaskQueue();
 
   EXPECT_TRUE(manager_->GetAndClearSystemIsQuiescentBit());
 
@@ -1329,12 +1334,9 @@
 TEST_F(TaskQueueManagerTest, NewTaskQueues) {
   Initialize(1u);
 
-  scoped_refptr<internal::TaskQueueImpl> queue1 =
-      manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST));
-  scoped_refptr<internal::TaskQueueImpl> queue2 =
-      manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST));
-  scoped_refptr<internal::TaskQueueImpl> queue3 =
-      manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST));
+  scoped_refptr<TaskQueue> queue1 = CreateTaskQueue();
+  scoped_refptr<TaskQueue> queue2 = CreateTaskQueue();
+  scoped_refptr<TaskQueue> queue3 = CreateTaskQueue();
 
   ASSERT_NE(queue1, queue2);
   ASSERT_NE(queue1, queue3);
@@ -1352,12 +1354,9 @@
 TEST_F(TaskQueueManagerTest, UnregisterTaskQueue) {
   Initialize(1u);
 
-  scoped_refptr<internal::TaskQueueImpl> queue1 =
-      manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST));
-  scoped_refptr<internal::TaskQueueImpl> queue2 =
-      manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST));
-  scoped_refptr<internal::TaskQueueImpl> queue3 =
-      manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST));
+  scoped_refptr<TaskQueue> queue1 = CreateTaskQueue();
+  scoped_refptr<TaskQueue> queue2 = CreateTaskQueue();
+  scoped_refptr<TaskQueue> queue3 = CreateTaskQueue();
 
   ASSERT_NE(queue1, queue2);
   ASSERT_NE(queue1, queue3);
@@ -1394,7 +1393,7 @@
 }
 
 namespace {
-void UnregisterQueue(scoped_refptr<internal::TaskQueueImpl> queue) {
+void UnregisterQueue(scoped_refptr<TaskQueue> queue) {
   queue->UnregisterTaskQueue();
 }
 }
@@ -1417,38 +1416,19 @@
 
 class MockObserver : public TaskQueueManager::Observer {
  public:
-  MOCK_METHOD1(OnUnregisterTaskQueue,
-               void(const scoped_refptr<TaskQueue>& queue));
-  MOCK_METHOD2(OnTriedToExecuteBlockedTask,
-               void(const TaskQueue& queue, const base::PendingTask& task));
+  MOCK_METHOD0(OnTriedToExecuteBlockedTask, void());
 };
 
 }  // namespace
 
-TEST_F(TaskQueueManagerTest, OnUnregisterTaskQueue) {
-  Initialize(0u);
-
-  MockObserver observer;
-  manager_->SetObserver(&observer);
-
-  scoped_refptr<internal::TaskQueueImpl> task_queue =
-      manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST));
-
-  EXPECT_CALL(observer, OnUnregisterTaskQueue(_)).Times(1);
-  task_queue->UnregisterTaskQueue();
-
-  manager_->SetObserver(nullptr);
-}
-
 TEST_F(TaskQueueManagerTest, OnTriedToExecuteBlockedTask) {
   Initialize(0u);
 
   MockObserver observer;
   manager_->SetObserver(&observer);
 
-  scoped_refptr<internal::TaskQueueImpl> task_queue =
-      manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST)
-                                 .SetShouldReportWhenExecutionBlocked(true));
+  scoped_refptr<TaskQueue> task_queue = CreateTaskQueueWithSpec(
+      TaskQueue::Spec("test").SetShouldReportWhenExecutionBlocked(true));
   std::unique_ptr<TaskQueue::QueueEnabledVoter> voter =
       task_queue->CreateQueueEnabledVoter();
 
@@ -1460,7 +1440,7 @@
   voter->SetQueueEnabled(true);
   voter->SetQueueEnabled(false);
 
-  EXPECT_CALL(observer, OnTriedToExecuteBlockedTask(_, _)).Times(1);
+  EXPECT_CALL(observer, OnTriedToExecuteBlockedTask()).Times(1);
   test_task_runner_->RunPendingTasks();
 
   manager_->SetObserver(nullptr);
@@ -1472,28 +1452,22 @@
   MockObserver observer;
   manager_->SetObserver(&observer);
 
-  scoped_refptr<internal::TaskQueueImpl> task_queue =
-      manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST)
-                                 .SetShouldReportWhenExecutionBlocked(true));
+  scoped_refptr<TaskQueue> task_queue = CreateTaskQueueWithSpec(
+      TaskQueue::Spec("test").SetShouldReportWhenExecutionBlocked(true));
   task_queue->PostTask(FROM_HERE, base::Bind(&NopTask));
 
-  EXPECT_CALL(observer, OnTriedToExecuteBlockedTask(_, _)).Times(0);
+  EXPECT_CALL(observer, OnTriedToExecuteBlockedTask()).Times(0);
   test_task_runner_->RunPendingTasks();
 
   manager_->SetObserver(nullptr);
 }
 
-void HasOneRefTask(std::vector<bool>* log, internal::TaskQueueImpl* tq) {
-  log->push_back(tq->HasOneRef());
-}
-
 TEST_F(TaskQueueManagerTest, UnregisterTaskQueueInNestedLoop) {
   InitializeWithRealMessageLoop(1u);
 
   // We retain a reference to the task queue even when the manager has deleted
   // its reference.
-  scoped_refptr<internal::TaskQueueImpl> task_queue =
-      manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST));
+  scoped_refptr<TaskQueue> task_queue = CreateTaskQueue();
 
   std::vector<bool> log;
   std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop;
@@ -1503,31 +1477,20 @@
   // reference until the nested run loop exits.
   // NB: This first HasOneRefTask is a sanity check.
   tasks_to_post_from_nested_loop.push_back(
-      std::make_pair(base::Bind(&HasOneRefTask, base::Unretained(&log),
+      std::make_pair(base::Bind(&NopTask), true));
+  tasks_to_post_from_nested_loop.push_back(
+      std::make_pair(base::Bind(&TaskQueue::UnregisterTaskQueue,
                                 base::Unretained(task_queue.get())),
                      true));
   tasks_to_post_from_nested_loop.push_back(
-      std::make_pair(base::Bind(&internal::TaskQueueImpl::UnregisterTaskQueue,
-                                base::Unretained(task_queue.get())),
-                     true));
-  tasks_to_post_from_nested_loop.push_back(
-      std::make_pair(base::Bind(&HasOneRefTask, base::Unretained(&log),
-                                base::Unretained(task_queue.get())),
-                     true));
+      std::make_pair(base::Bind(&NopTask), true));
   runners_[0]->PostTask(
       FROM_HERE, base::Bind(&PostFromNestedRunloop, message_loop_.get(),
                             base::RetainedRef(runners_[0]),
                             base::Unretained(&tasks_to_post_from_nested_loop)));
   base::RunLoop().RunUntilIdle();
 
-  // Add a final call to HasOneRefTask.  This gives the manager a chance to
-  // release its reference, and checks that it has.
-  runners_[0]->PostTask(FROM_HERE,
-                        base::Bind(&HasOneRefTask, base::Unretained(&log),
-                                   base::Unretained(task_queue.get())));
-  base::RunLoop().RunUntilIdle();
-
-  EXPECT_THAT(log, ElementsAre(false, false, true));
+  // Just make sure that we don't crash.
 }
 
 TEST_F(TaskQueueManagerTest, TimeDomainsAreIndependant) {
@@ -1708,7 +1671,7 @@
   Mock::VerifyAndClearExpectations(&observer);
 
   // Unless the immediate work queue is emptied.
-  runners_[0]->ReloadImmediateWorkQueueIfEmpty();
+  runners_[0]->GetTaskQueueImpl()->ReloadImmediateWorkQueueIfEmpty();
   EXPECT_CALL(observer,
               OnQueueNextWakeUpChanged(runners_[0].get(), base::TimeTicks()));
   runners_[0]->PostTask(FROM_HERE, base::Bind(&NopTask));
@@ -1930,7 +1893,7 @@
 
 class QuadraticTask {
  public:
-  QuadraticTask(scoped_refptr<internal::TaskQueueImpl> task_queue,
+  QuadraticTask(scoped_refptr<TaskQueue> task_queue,
                 base::TimeDelta delay,
                 base::SimpleTestTickClock* now_src)
       : count_(0), task_queue_(task_queue), delay_(delay), now_src_(now_src) {}
@@ -1956,7 +1919,7 @@
 
  private:
   int count_;
-  scoped_refptr<internal::TaskQueueImpl> task_queue_;
+  scoped_refptr<TaskQueue> task_queue_;
   base::TimeDelta delay_;
   base::Callback<bool()> should_exit_;
   base::SimpleTestTickClock* now_src_;
@@ -1964,7 +1927,7 @@
 
 class LinearTask {
  public:
-  LinearTask(scoped_refptr<internal::TaskQueueImpl> task_queue,
+  LinearTask(scoped_refptr<TaskQueue> task_queue,
              base::TimeDelta delay,
              base::SimpleTestTickClock* now_src)
       : count_(0), task_queue_(task_queue), delay_(delay), now_src_(now_src) {}
@@ -1987,7 +1950,7 @@
 
  private:
   int count_;
-  scoped_refptr<internal::TaskQueueImpl> task_queue_;
+  scoped_refptr<TaskQueue> task_queue_;
   base::TimeDelta delay_;
   base::Callback<bool()> should_exit_;
   base::SimpleTestTickClock* now_src_;
@@ -2117,7 +2080,7 @@
 namespace {
 void CurrentlyExecutingTaskQueueTestTask(
     TaskQueueManager* task_queue_manager,
-    std::vector<TaskQueue*>* task_sources) {
+    std::vector<internal::TaskQueueImpl*>* task_sources) {
   task_sources->push_back(task_queue_manager->currently_executing_task_queue());
 }
 }
@@ -2125,17 +2088,18 @@
 TEST_F(TaskQueueManagerTest, CurrentlyExecutingTaskQueue_TaskRunning) {
   Initialize(2u);
 
-  internal::TaskQueueImpl* queue0 = runners_[0].get();
-  internal::TaskQueueImpl* queue1 = runners_[1].get();
+  TestTaskQueue* queue0 = runners_[0].get();
+  TestTaskQueue* queue1 = runners_[1].get();
 
-  std::vector<TaskQueue*> task_sources;
+  std::vector<internal::TaskQueueImpl*> task_sources;
   queue0->PostTask(FROM_HERE, base::Bind(&CurrentlyExecutingTaskQueueTestTask,
                                          manager_.get(), &task_sources));
   queue1->PostTask(FROM_HERE, base::Bind(&CurrentlyExecutingTaskQueueTestTask,
                                          manager_.get(), &task_sources));
   test_task_runner_->RunUntilIdle();
 
-  EXPECT_THAT(task_sources, ElementsAre(queue0, queue1));
+  EXPECT_THAT(task_sources, ElementsAre(queue0->GetTaskQueueImpl(),
+                                        queue1->GetTaskQueueImpl()));
   EXPECT_EQ(nullptr, manager_->currently_executing_task_queue());
 }
 
@@ -2143,12 +2107,12 @@
 void RunloopCurrentlyExecutingTaskQueueTestTask(
     base::MessageLoop* message_loop,
     TaskQueueManager* task_queue_manager,
-    std::vector<TaskQueue*>* task_sources,
-    std::vector<std::pair<base::Closure, TaskQueue*>>* tasks) {
+    std::vector<internal::TaskQueueImpl*>* task_sources,
+    std::vector<std::pair<base::Closure, TestTaskQueue*>>* tasks) {
   base::MessageLoop::ScopedNestableTaskAllower allow(message_loop);
   task_sources->push_back(task_queue_manager->currently_executing_task_queue());
 
-  for (std::pair<base::Closure, TaskQueue*>& pair : *tasks) {
+  for (std::pair<base::Closure, TestTaskQueue*>& pair : *tasks) {
     pair.second->PostTask(FROM_HERE, pair.first);
   }
 
@@ -2160,12 +2124,12 @@
 TEST_F(TaskQueueManagerTest, CurrentlyExecutingTaskQueue_NestedLoop) {
   InitializeWithRealMessageLoop(3u);
 
-  TaskQueue* queue0 = runners_[0].get();
-  TaskQueue* queue1 = runners_[1].get();
-  TaskQueue* queue2 = runners_[2].get();
+  TestTaskQueue* queue0 = runners_[0].get();
+  TestTaskQueue* queue1 = runners_[1].get();
+  TestTaskQueue* queue2 = runners_[2].get();
 
-  std::vector<TaskQueue*> task_sources;
-  std::vector<std::pair<base::Closure, TaskQueue*>>
+  std::vector<internal::TaskQueueImpl*> task_sources;
+  std::vector<std::pair<base::Closure, TestTaskQueue*>>
       tasks_to_post_from_nested_loop;
   tasks_to_post_from_nested_loop.push_back(
       std::make_pair(base::Bind(&CurrentlyExecutingTaskQueueTestTask,
@@ -2182,7 +2146,10 @@
                             &tasks_to_post_from_nested_loop));
 
   base::RunLoop().RunUntilIdle();
-  EXPECT_THAT(task_sources, ElementsAre(queue0, queue1, queue2, queue0));
+  EXPECT_THAT(
+      task_sources,
+      ElementsAre(queue0->GetTaskQueueImpl(), queue1->GetTaskQueueImpl(),
+                  queue2->GetTaskQueueImpl(), queue0->GetTaskQueueImpl()));
   EXPECT_EQ(nullptr, manager_->currently_executing_task_queue());
 }
 
@@ -2233,7 +2200,7 @@
   using trace_analyzer::Query;
 
   InitializeWithRealMessageLoop(1u);
-  TaskQueue* queue = runners_[0].get();
+  TestTaskQueue* queue = runners_[0].get();
 
   StartTracing();
   {
@@ -2459,8 +2426,7 @@
 TEST_F(TaskQueueManagerTest, UnregisterQueueBeforeEnabledVoterDeleted) {
   Initialize(1u);
 
-  scoped_refptr<internal::TaskQueueImpl> queue =
-      manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST));
+  scoped_refptr<TaskQueue> queue = CreateTaskQueue();
 
   std::unique_ptr<TaskQueue::QueueEnabledVoter> voter =
       queue->CreateQueueEnabledVoter();
@@ -2475,8 +2441,7 @@
 TEST_F(TaskQueueManagerTest, UnregisterQueueBeforeDisabledVoterDeleted) {
   Initialize(1u);
 
-  scoped_refptr<internal::TaskQueueImpl> queue =
-      manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST));
+  scoped_refptr<TaskQueue> queue = CreateTaskQueue();
 
   std::unique_ptr<TaskQueue::QueueEnabledVoter> voter =
       queue->CreateQueueEnabledVoter();
@@ -2736,10 +2701,9 @@
 }
 
 namespace {
-void MessageLoopTaskWithDelayedQuit(
-    base::MessageLoop* message_loop,
-    base::SimpleTestTickClock* now_src,
-    scoped_refptr<internal::TaskQueueImpl> task_queue) {
+void MessageLoopTaskWithDelayedQuit(base::MessageLoop* message_loop,
+                                    base::SimpleTestTickClock* now_src,
+                                    scoped_refptr<TaskQueue> task_queue) {
   base::MessageLoop::ScopedNestableTaskAllower allow(message_loop);
   base::RunLoop run_loop;
   task_queue->PostDelayedTask(FROM_HERE, run_loop.QuitClosure(),
@@ -2760,10 +2724,9 @@
 }
 
 namespace {
-void MessageLoopTaskWithImmediateQuit(
-    base::MessageLoop* message_loop,
-    base::Closure non_nested_quit_closure,
-    scoped_refptr<internal::TaskQueueImpl> task_queue) {
+void MessageLoopTaskWithImmediateQuit(base::MessageLoop* message_loop,
+                                      base::Closure non_nested_quit_closure,
+                                      scoped_refptr<TaskQueue> task_queue) {
   base::MessageLoop::ScopedNestableTaskAllower allow(message_loop);
 
   base::RunLoop run_loop;
@@ -2794,31 +2757,31 @@
   Initialize(1u);
 
   EnqueueOrder enqueue_order = GetNextSequenceNumber();
-  EXPECT_TRUE(runners_[0]->CouldTaskRun(enqueue_order));
+  EXPECT_TRUE(runners_[0]->GetTaskQueueImpl()->CouldTaskRun(enqueue_order));
 
   std::unique_ptr<TaskQueue::QueueEnabledVoter> voter =
       runners_[0]->CreateQueueEnabledVoter();
   voter->SetQueueEnabled(false);
-  EXPECT_FALSE(runners_[0]->CouldTaskRun(enqueue_order));
+  EXPECT_FALSE(runners_[0]->GetTaskQueueImpl()->CouldTaskRun(enqueue_order));
 
   voter->SetQueueEnabled(true);
-  EXPECT_TRUE(runners_[0]->CouldTaskRun(enqueue_order));
+  EXPECT_TRUE(runners_[0]->GetTaskQueueImpl()->CouldTaskRun(enqueue_order));
 }
 
 TEST_F(TaskQueueManagerTest, CouldTaskRun_Fence) {
   Initialize(1u);
 
   EnqueueOrder enqueue_order = GetNextSequenceNumber();
-  EXPECT_TRUE(runners_[0]->CouldTaskRun(enqueue_order));
+  EXPECT_TRUE(runners_[0]->GetTaskQueueImpl()->CouldTaskRun(enqueue_order));
 
   runners_[0]->InsertFence(TaskQueue::InsertFencePosition::NOW);
-  EXPECT_TRUE(runners_[0]->CouldTaskRun(enqueue_order));
+  EXPECT_TRUE(runners_[0]->GetTaskQueueImpl()->CouldTaskRun(enqueue_order));
 
   runners_[0]->InsertFence(TaskQueue::InsertFencePosition::BEGINNING_OF_TIME);
-  EXPECT_FALSE(runners_[0]->CouldTaskRun(enqueue_order));
+  EXPECT_FALSE(runners_[0]->GetTaskQueueImpl()->CouldTaskRun(enqueue_order));
 
   runners_[0]->RemoveFence();
-  EXPECT_TRUE(runners_[0]->CouldTaskRun(enqueue_order));
+  EXPECT_TRUE(runners_[0]->GetTaskQueueImpl()->CouldTaskRun(enqueue_order));
 }
 
 TEST_F(TaskQueueManagerTest, CouldTaskRun_FenceBeforeThenAfter) {
@@ -2827,10 +2790,10 @@
   runners_[0]->InsertFence(TaskQueue::InsertFencePosition::NOW);
 
   EnqueueOrder enqueue_order = GetNextSequenceNumber();
-  EXPECT_FALSE(runners_[0]->CouldTaskRun(enqueue_order));
+  EXPECT_FALSE(runners_[0]->GetTaskQueueImpl()->CouldTaskRun(enqueue_order));
 
   runners_[0]->InsertFence(TaskQueue::InsertFencePosition::NOW);
-  EXPECT_TRUE(runners_[0]->CouldTaskRun(enqueue_order));
+  EXPECT_TRUE(runners_[0]->GetTaskQueueImpl()->CouldTaskRun(enqueue_order));
 }
 
 TEST_F(TaskQueueManagerTest, DelayedDoWorkNotPostedForDisabledQueue) {
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_selector_unittest.cc b/third_party/WebKit/Source/platform/scheduler/base/task_queue_selector_unittest.cc
index 96f1c6c..9bf2ad2 100644
--- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_selector_unittest.cc
+++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_selector_unittest.cc
@@ -98,35 +98,16 @@
 
   static void TestFunction() {}
 
-  void EnableQueue(TaskQueue::QueueEnabledVoter* voter) {
-    TaskQueueImpl::QueueEnabledVoterImpl* voter_impl =
-        static_cast<TaskQueueImpl::QueueEnabledVoterImpl*>(voter);
-
-    voter_impl->SetQueueEnabled(true);
-
-    ASSERT_TRUE(voter_impl->GetTaskQueueForTest()->IsQueueEnabled());
-    selector_.EnableQueue(voter_impl->GetTaskQueueForTest());
-  }
-
-  void DisableQueue(TaskQueue::QueueEnabledVoter* voter) {
-    TaskQueueImpl::QueueEnabledVoterImpl* voter_impl =
-        static_cast<TaskQueueImpl::QueueEnabledVoterImpl*>(voter);
-
-    voter_impl->SetQueueEnabled(false);
-    ASSERT_FALSE(voter_impl->GetTaskQueueForTest()->IsQueueEnabled());
-    selector_.DisableQueue(voter_impl->GetTaskQueueForTest());
-  }
-
  protected:
   void SetUp() final {
     virtual_time_domain_ = base::WrapUnique<VirtualTimeDomain>(
         new VirtualTimeDomain(base::TimeTicks()));
     for (size_t i = 0; i < kTaskQueueCount; i++) {
-      scoped_refptr<TaskQueueImpl> task_queue = make_scoped_refptr(
-          new TaskQueueImpl(nullptr, virtual_time_domain_.get(),
-                            TaskQueue::Spec(TaskQueue::QueueType::TEST)));
+      std::unique_ptr<TaskQueueImpl> task_queue =
+          base::MakeUnique<TaskQueueImpl>(nullptr, virtual_time_domain_.get(),
+                                          TaskQueue::Spec("test"));
       selector_.AddQueue(task_queue.get());
-      task_queues_.push_back(task_queue);
+      task_queues_.push_back(std::move(task_queue));
     }
     for (size_t i = 0; i < kTaskQueueCount; i++) {
       EXPECT_EQ(TaskQueue::NORMAL_PRIORITY, task_queues_[i]->GetQueuePriority())
@@ -136,27 +117,26 @@
   }
 
   void TearDown() final {
-    for (scoped_refptr<TaskQueueImpl>& task_queue : task_queues_) {
-      task_queue->UnregisterTaskQueue();
+    for (std::unique_ptr<TaskQueueImpl>& task_queue : task_queues_) {
       // Note since this test doesn't have a TaskQueueManager we need to
       // manually remove |task_queue| from the |selector_|.  Normally
       // UnregisterTaskQueue would do that.
       selector_.RemoveQueue(task_queue.get());
+      task_queue->UnregisterTaskQueue(nullptr);
     }
   }
 
-  scoped_refptr<TaskQueueImpl> NewTaskQueueWithBlockReporting() {
-    return make_scoped_refptr(
-        new TaskQueueImpl(nullptr, virtual_time_domain_.get(),
-                          TaskQueue::Spec(TaskQueue::QueueType::TEST)
-                              .SetShouldReportWhenExecutionBlocked(true)));
+  std::unique_ptr<TaskQueueImpl> NewTaskQueueWithBlockReporting() {
+    return base::MakeUnique<TaskQueueImpl>(
+        nullptr, virtual_time_domain_.get(),
+        TaskQueue::Spec("test").SetShouldReportWhenExecutionBlocked(true));
   }
 
   const size_t kTaskQueueCount = 5;
   base::Closure test_closure_;
   TaskQueueSelectorForTest selector_;
   std::unique_ptr<VirtualTimeDomain> virtual_time_domain_;
-  std::vector<scoped_refptr<TaskQueueImpl>> task_queues_;
+  std::vector<std::unique_ptr<TaskQueueImpl>> task_queues_;
   std::map<TaskQueueImpl*, size_t> queue_to_index_map_;
 };
 
@@ -202,13 +182,13 @@
 }
 
 TEST_F(TaskQueueSelectorTest, TestObserverWithEnabledQueue) {
-  std::unique_ptr<TaskQueue::QueueEnabledVoter> voter1 =
-      task_queues_[1]->CreateQueueEnabledVoter();
-  DisableQueue(voter1.get());
+  task_queues_[1]->SetQueueEnabledForTest(false);
+  selector_.DisableQueue(task_queues_[1].get());
   MockObserver mock_observer;
   selector_.SetTaskQueueSelectorObserver(&mock_observer);
   EXPECT_CALL(mock_observer, OnTaskQueueEnabled(_)).Times(1);
-  EnableQueue(voter1.get());
+  task_queues_[1]->SetQueueEnabledForTest(true);
+  selector_.EnableQueue(task_queues_[1].get());
 }
 
 TEST_F(TaskQueueSelectorTest,
@@ -226,33 +206,31 @@
 
   size_t queue_order[] = {0, 1, 2, 3, 4};
   PushTasks(queue_order, 5);
-  std::unique_ptr<TaskQueue::QueueEnabledVoter> voter2 =
-      task_queues_[2]->CreateQueueEnabledVoter();
-  std::unique_ptr<TaskQueue::QueueEnabledVoter> voter4 =
-      task_queues_[4]->CreateQueueEnabledVoter();
-  DisableQueue(voter2.get());
-  DisableQueue(voter4.get());
+  task_queues_[2]->SetQueueEnabledForTest(false);
+  selector_.DisableQueue(task_queues_[2].get());
+  task_queues_[4]->SetQueueEnabledForTest(false);
+  selector_.DisableQueue(task_queues_[4].get());
   // Disabling a queue should not affect its priority.
   EXPECT_EQ(TaskQueue::NORMAL_PRIORITY, task_queues_[2]->GetQueuePriority());
   EXPECT_EQ(TaskQueue::NORMAL_PRIORITY, task_queues_[4]->GetQueuePriority());
   EXPECT_THAT(PopTasks(), ::testing::ElementsAre(0, 1, 3));
 
   EXPECT_CALL(mock_observer, OnTaskQueueEnabled(_)).Times(2);
-  EnableQueue(voter2.get());
+  task_queues_[2]->SetQueueEnabledForTest(true);
+  selector_.EnableQueue(task_queues_[2].get());
   selector_.SetQueuePriority(task_queues_[2].get(),
                              TaskQueue::BEST_EFFORT_PRIORITY);
-  EXPECT_THAT(PopTasks(), ::testing::ElementsAre(2));
-  EnableQueue(voter4.get());
-  EXPECT_THAT(PopTasks(), ::testing::ElementsAre(4));
+  EXPECT_THAT(PopTasks(), testing::ElementsAre(2));
+  task_queues_[4]->SetQueueEnabledForTest(true);
+  selector_.EnableQueue(task_queues_[4].get());
+  EXPECT_THAT(PopTasks(), testing::ElementsAre(4));
 }
 
 TEST_F(TaskQueueSelectorTest, TestDisableChangePriorityThenEnable) {
   EXPECT_TRUE(task_queues_[2]->delayed_work_queue()->Empty());
   EXPECT_TRUE(task_queues_[2]->immediate_work_queue()->Empty());
 
-  std::unique_ptr<TaskQueue::QueueEnabledVoter> voter2 =
-      task_queues_[2]->CreateQueueEnabledVoter();
-  DisableQueue(voter2.get());
+  task_queues_[2]->SetQueueEnabledForTest(false);
   selector_.SetQueuePriority(task_queues_[2].get(), TaskQueue::HIGH_PRIORITY);
 
   size_t queue_order[] = {0, 1, 2, 3, 4};
@@ -260,7 +238,7 @@
 
   EXPECT_TRUE(task_queues_[2]->delayed_work_queue()->Empty());
   EXPECT_FALSE(task_queues_[2]->immediate_work_queue()->Empty());
-  EnableQueue(voter2.get());
+  task_queues_[2]->SetQueueEnabledForTest(true);
 
   EXPECT_EQ(TaskQueue::HIGH_PRIORITY, task_queues_[2]->GetQueuePriority());
   EXPECT_THAT(PopTasks(), ::testing::ElementsAre(2, 0, 1, 3, 4));
@@ -273,15 +251,15 @@
   // Test only disabled queues.
   size_t queue_order[] = {0};
   PushTasks(queue_order, 1);
-  std::unique_ptr<TaskQueue::QueueEnabledVoter> voter0 =
-      task_queues_[0]->CreateQueueEnabledVoter();
-  DisableQueue(voter0.get());
+  task_queues_[0]->SetQueueEnabledForTest(false);
+  selector_.DisableQueue(task_queues_[0].get());
   EXPECT_FALSE(selector_.SelectWorkQueueToService(&chosen_work_queue));
 
   // These tests are unusual since there's no TQM. To avoid a later DCHECK when
   // deleting the task queue, we re-enable the queue here so the selector
   // doesn't get out of sync.
-  EnableQueue(voter0.get());
+  task_queues_[0]->SetQueueEnabledForTest(true);
+  selector_.EnableQueue(task_queues_[0].get());
 }
 
 TEST_F(TaskQueueSelectorTest, TestAge) {
@@ -456,12 +434,10 @@
 
   EXPECT_CALL(mock_observer, OnTaskQueueEnabled(_)).Times(1);
 
-  scoped_refptr<TaskQueueImpl> task_queue(NewTaskQueueWithBlockReporting());
+  std::unique_ptr<TaskQueueImpl> task_queue(NewTaskQueueWithBlockReporting());
   selector.AddQueue(task_queue.get());
-  std::unique_ptr<TaskQueue::QueueEnabledVoter> voter =
-      task_queue->CreateQueueEnabledVoter();
 
-  voter->SetQueueEnabled(false);
+  task_queue->SetQueueEnabledForTest(false);
   selector.DisableQueue(task_queue.get());
 
   TaskQueueImpl::Task task(FROM_HERE, test_closure_, base::TimeTicks(), 0,
@@ -473,10 +449,10 @@
   EXPECT_CALL(mock_observer, OnTriedToSelectBlockedWorkQueue(_)).Times(1);
   EXPECT_FALSE(selector.SelectWorkQueueToService(&chosen_work_queue));
 
-  voter.reset();
+  task_queue->SetQueueEnabledForTest(true);
   selector.EnableQueue(task_queue.get());
-  task_queue->UnregisterTaskQueue();
   selector.RemoveQueue(task_queue.get());
+  task_queue->UnregisterTaskQueue(nullptr);
 }
 
 TEST_F(TaskQueueSelectorTest, TestObserverWithTwoBlockedQueues) {
@@ -484,17 +460,13 @@
   MockObserver mock_observer;
   selector.SetTaskQueueSelectorObserver(&mock_observer);
 
-  scoped_refptr<TaskQueueImpl> task_queue(NewTaskQueueWithBlockReporting());
-  scoped_refptr<TaskQueueImpl> task_queue2(NewTaskQueueWithBlockReporting());
+  std::unique_ptr<TaskQueueImpl> task_queue(NewTaskQueueWithBlockReporting());
+  std::unique_ptr<TaskQueueImpl> task_queue2(NewTaskQueueWithBlockReporting());
   selector.AddQueue(task_queue.get());
   selector.AddQueue(task_queue2.get());
-  std::unique_ptr<TaskQueue::QueueEnabledVoter> voter =
-      task_queue->CreateQueueEnabledVoter();
-  std::unique_ptr<TaskQueue::QueueEnabledVoter> voter2 =
-      task_queue2->CreateQueueEnabledVoter();
 
-  voter->SetQueueEnabled(false);
-  voter2->SetQueueEnabled(false);
+  task_queue->SetQueueEnabledForTest(false);
+  task_queue2->SetQueueEnabledForTest(false);
   selector.DisableQueue(task_queue.get());
   selector.DisableQueue(task_queue2.get());
 
@@ -517,20 +489,20 @@
 
   EXPECT_CALL(mock_observer, OnTaskQueueEnabled(_)).Times(2);
 
-  voter.reset();
+  task_queue->SetQueueEnabledForTest(true);
   selector.EnableQueue(task_queue.get());
 
   // Removing the second queue and selecting again should result in another
   // notification.
-  task_queue->UnregisterTaskQueue();
   selector.RemoveQueue(task_queue.get());
+  task_queue->UnregisterTaskQueue(nullptr);
   EXPECT_CALL(mock_observer, OnTriedToSelectBlockedWorkQueue(_)).Times(1);
   EXPECT_FALSE(selector.SelectWorkQueueToService(&chosen_work_queue));
 
-  voter2.reset();
+  task_queue2->SetQueueEnabledForTest(true);
   selector.EnableQueue(task_queue2.get());
-  task_queue2->UnregisterTaskQueue();
   selector.RemoveQueue(task_queue2.get());
+  task_queue2->UnregisterTaskQueue(nullptr);
 }
 
 struct ChooseOldestWithPriorityTestParam {
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_time_observer.h b/third_party/WebKit/Source/platform/scheduler/base/task_time_observer.h
index 50db881..85b0ad9 100644
--- a/third_party/WebKit/Source/platform/scheduler/base/task_time_observer.h
+++ b/third_party/WebKit/Source/platform/scheduler/base/task_time_observer.h
@@ -11,8 +11,6 @@
 namespace blink {
 namespace scheduler {
 
-class TaskQueue;
-
 // TaskTimeObserver provides an API for observing completion of renderer tasks.
 class PLATFORM_EXPORT TaskTimeObserver {
  public:
@@ -20,17 +18,13 @@
   virtual ~TaskTimeObserver() {}
 
   // Callback to be called when task is about to start.
-  // |task_queue| - TaskQueue on which this task will run,
   // |start_time| - time in seconds when task started to run,
-  virtual void WillProcessTask(TaskQueue* task_queue, double start_time) = 0;
+  virtual void WillProcessTask(double start_time) = 0;
 
   // Callback to be called when task is completed.
-  // |task_queue| - TaskQueue on which this task was run,
   // |start_time| - time in seconds when task started to run,
   // |end_time| - time in seconds when task was completed.
-  virtual void DidProcessTask(TaskQueue* task_queue,
-                              double start_time,
-                              double end_time) = 0;
+  virtual void DidProcessTask(double start_time, double end_time) = 0;
 
   // Callback to be called when we enter a nested run loop.
   virtual void OnBeginNestedRunLoop() = 0;
diff --git a/third_party/WebKit/Source/platform/scheduler/base/test_task_time_observer.h b/third_party/WebKit/Source/platform/scheduler/base/test_task_time_observer.h
index 53538b9..794a6617 100644
--- a/third_party/WebKit/Source/platform/scheduler/base/test_task_time_observer.h
+++ b/third_party/WebKit/Source/platform/scheduler/base/test_task_time_observer.h
@@ -13,10 +13,8 @@
 
 class TestTaskTimeObserver : public TaskTimeObserver {
  public:
-  void WillProcessTask(TaskQueue* task_queue, double start_time) override {}
-  void DidProcessTask(TaskQueue* task_queue,
-                      double start_time,
-                      double end_time) override {}
+  void WillProcessTask(double start_time) override {}
+  void DidProcessTask(double start_time, double end_time) override {}
   void OnBeginNestedRunLoop() override {}
 };
 
diff --git a/third_party/WebKit/Source/platform/scheduler/base/time_domain.cc b/third_party/WebKit/Source/platform/scheduler/base/time_domain.cc
index 66b7bae..1194263 100644
--- a/third_party/WebKit/Source/platform/scheduler/base/time_domain.cc
+++ b/third_party/WebKit/Source/platform/scheduler/base/time_domain.cc
@@ -113,7 +113,8 @@
   return true;
 }
 
-bool TimeDomain::NextScheduledTaskQueue(TaskQueue** out_task_queue) const {
+bool TimeDomain::NextScheduledTaskQueue(
+    internal::TaskQueueImpl** out_task_queue) const {
   DCHECK(main_thread_checker_.CalledOnValidThread());
   if (delayed_wake_up_queue_.empty())
     return false;
diff --git a/third_party/WebKit/Source/platform/scheduler/base/time_domain.h b/third_party/WebKit/Source/platform/scheduler/base/time_domain.h
index 19cec2d..cb2dd61a 100644
--- a/third_party/WebKit/Source/platform/scheduler/base/time_domain.h
+++ b/third_party/WebKit/Source/platform/scheduler/base/time_domain.h
@@ -69,7 +69,7 @@
 
   // If there is a scheduled delayed task, |out_task_queue| is set to the queue
   // the next task was posted to and it returns true.  Returns false otherwise.
-  bool NextScheduledTaskQueue(TaskQueue** out_task_queue) const;
+  bool NextScheduledTaskQueue(internal::TaskQueueImpl** out_task_queue) const;
 
   // Schedules a call to TaskQueueImpl::WakeUpForDelayedWork when this
   // TimeDomain reaches |delayed_run_time|.  This supersedes any previously
diff --git a/third_party/WebKit/Source/platform/scheduler/base/time_domain_unittest.cc b/third_party/WebKit/Source/platform/scheduler/base/time_domain_unittest.cc
index d77dee24..196185d 100644
--- a/third_party/WebKit/Source/platform/scheduler/base/time_domain_unittest.cc
+++ b/third_party/WebKit/Source/platform/scheduler/base/time_domain_unittest.cc
@@ -68,14 +68,13 @@
  public:
   void SetUp() final {
     time_domain_ = base::WrapUnique(CreateMockTimeDomain());
-    task_queue_ = make_scoped_refptr(new internal::TaskQueueImpl(
-        nullptr, time_domain_.get(),
-        TaskQueue::Spec(TaskQueue::QueueType::TEST)));
+    task_queue_ = base::MakeUnique<internal::TaskQueueImpl>(
+        nullptr, time_domain_.get(), TaskQueue::Spec("test"));
   }
 
   void TearDown() final {
     if (task_queue_)
-      task_queue_->UnregisterTaskQueue();
+      task_queue_->UnregisterTaskQueue(nullptr);
   }
 
   virtual MockTimeDomain* CreateMockTimeDomain() {
@@ -83,7 +82,7 @@
   }
 
   std::unique_ptr<MockTimeDomain> time_domain_;
-  scoped_refptr<internal::TaskQueueImpl> task_queue_;
+  std::unique_ptr<internal::TaskQueueImpl> task_queue_;
 };
 
 TEST_F(TimeDomainTest, ScheduleDelayedWork) {
@@ -97,7 +96,7 @@
   EXPECT_TRUE(time_domain_->NextScheduledRunTime(&next_scheduled_runtime));
   EXPECT_EQ(delayed_runtime, next_scheduled_runtime);
 
-  TaskQueue* next_task_queue;
+  internal::TaskQueueImpl* next_task_queue;
   EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue));
   EXPECT_EQ(task_queue_.get(), next_task_queue);
   Mock::VerifyAndClearExpectations(time_domain_.get());
@@ -135,17 +134,17 @@
 }
 
 TEST_F(TimeDomainTest, RequestWakeUpAt_OnlyCalledForEarlierTasks) {
-  scoped_refptr<internal::TaskQueueImpl> task_queue2 = make_scoped_refptr(
-      new internal::TaskQueueImpl(nullptr, time_domain_.get(),
-                                  TaskQueue::Spec(TaskQueue::QueueType::TEST)));
+  std::unique_ptr<internal::TaskQueueImpl> task_queue2 =
+      base::MakeUnique<internal::TaskQueueImpl>(nullptr, time_domain_.get(),
+                                                TaskQueue::Spec("test"));
 
-  scoped_refptr<internal::TaskQueueImpl> task_queue3 = make_scoped_refptr(
-      new internal::TaskQueueImpl(nullptr, time_domain_.get(),
-                                  TaskQueue::Spec(TaskQueue::QueueType::TEST)));
+  std::unique_ptr<internal::TaskQueueImpl> task_queue3 =
+      base::MakeUnique<internal::TaskQueueImpl>(nullptr, time_domain_.get(),
+                                                TaskQueue::Spec("test"));
 
-  scoped_refptr<internal::TaskQueueImpl> task_queue4 = make_scoped_refptr(
-      new internal::TaskQueueImpl(nullptr, time_domain_.get(),
-                                  TaskQueue::Spec(TaskQueue::QueueType::TEST)));
+  std::unique_ptr<internal::TaskQueueImpl> task_queue4 =
+      base::MakeUnique<internal::TaskQueueImpl>(nullptr, time_domain_.get(),
+                                                TaskQueue::Spec("test"));
 
   base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(10);
   base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(20);
@@ -173,15 +172,15 @@
 
   EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, _));
   EXPECT_CALL(*time_domain_.get(), CancelWakeUpAt(_)).Times(2);
-  task_queue2->UnregisterTaskQueue();
-  task_queue3->UnregisterTaskQueue();
-  task_queue4->UnregisterTaskQueue();
+  task_queue2->UnregisterTaskQueue(nullptr);
+  task_queue3->UnregisterTaskQueue(nullptr);
+  task_queue4->UnregisterTaskQueue(nullptr);
 }
 
 TEST_F(TimeDomainTest, UnregisterQueue) {
-  scoped_refptr<internal::TaskQueueImpl> task_queue2_ = make_scoped_refptr(
-      new internal::TaskQueueImpl(nullptr, time_domain_.get(),
-                                  TaskQueue::Spec(TaskQueue::QueueType::TEST)));
+  std::unique_ptr<internal::TaskQueueImpl> task_queue2_ =
+      base::MakeUnique<internal::TaskQueueImpl>(nullptr, time_domain_.get(),
+                                                TaskQueue::Spec("test"));
 
   base::TimeTicks now = time_domain_->Now();
   base::TimeTicks wake_up1 = now + base::TimeDelta::FromMilliseconds(10);
@@ -190,7 +189,7 @@
   base::TimeTicks wake_up2 = now + base::TimeDelta::FromMilliseconds(100);
   time_domain_->ScheduleDelayedWork(task_queue2_.get(), {wake_up2, 0}, now);
 
-  TaskQueue* next_task_queue;
+  internal::TaskQueueImpl* next_task_queue;
   EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue));
   EXPECT_EQ(task_queue_.get(), next_task_queue);
 
@@ -200,7 +199,7 @@
   EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, wake_up2)).Times(1);
 
   time_domain_->UnregisterQueue(task_queue_.get());
-  task_queue_ = scoped_refptr<internal::TaskQueueImpl>();
+  task_queue_ = std::unique_ptr<internal::TaskQueueImpl>();
   EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue));
   EXPECT_EQ(task_queue2_.get(), next_task_queue);
 
@@ -243,9 +242,9 @@
   EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, delayed_runtime));
   EXPECT_CALL(*time_domain_.get(), CancelWakeUpAt(delayed_runtime));
 
-  scoped_refptr<internal::TaskQueueImpl> task_queue2 = make_scoped_refptr(
-      new internal::TaskQueueImpl(nullptr, time_domain_.get(),
-                                  TaskQueue::Spec(TaskQueue::QueueType::TEST)));
+  std::unique_ptr<internal::TaskQueueImpl> task_queue2 =
+      base::MakeUnique<internal::TaskQueueImpl>(nullptr, time_domain_.get(),
+                                                TaskQueue::Spec("test"));
 
   time_domain_->ScheduleDelayedWork(task_queue2.get(),
                                     {delayed_runtime, ++sequence_num}, now);
@@ -257,11 +256,11 @@
 
   // The second task queue should wake up first since it has a lower sequence
   // number.
-  TaskQueue* next_task_queue;
+  internal::TaskQueueImpl* next_task_queue;
   EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue));
   EXPECT_EQ(task_queue2.get(), next_task_queue);
 
-  task_queue2->UnregisterTaskQueue();
+  task_queue2->UnregisterTaskQueue(nullptr);
 }
 
 TEST_F(TimeDomainTest, CancelDelayedWork) {
@@ -271,7 +270,7 @@
   EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, run_time));
   time_domain_->ScheduleDelayedWork(task_queue_.get(), {run_time, 0}, now);
 
-  TaskQueue* next_task_queue;
+  internal::TaskQueueImpl* next_task_queue;
   EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue));
   EXPECT_EQ(task_queue_.get(), next_task_queue);
 
@@ -281,9 +280,9 @@
 }
 
 TEST_F(TimeDomainTest, CancelDelayedWork_TwoQueues) {
-  scoped_refptr<internal::TaskQueueImpl> task_queue2 = make_scoped_refptr(
-      new internal::TaskQueueImpl(nullptr, time_domain_.get(),
-                                  TaskQueue::Spec(TaskQueue::QueueType::TEST)));
+  std::unique_ptr<internal::TaskQueueImpl> task_queue2 =
+      base::MakeUnique<internal::TaskQueueImpl>(nullptr, time_domain_.get(),
+                                                TaskQueue::Spec("test"));
 
   base::TimeTicks now = time_domain_->Now();
   base::TimeTicks run_time1 = now + base::TimeDelta::FromMilliseconds(20);
@@ -296,7 +295,7 @@
   time_domain_->ScheduleDelayedWork(task_queue2.get(), {run_time2, 0}, now);
   Mock::VerifyAndClearExpectations(time_domain_.get());
 
-  TaskQueue* next_task_queue;
+  internal::TaskQueueImpl* next_task_queue;
   EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue));
   EXPECT_EQ(task_queue_.get(), next_task_queue);
 
@@ -318,7 +317,7 @@
   EXPECT_CALL(*time_domain_.get(), CancelWakeUpAt(_)).Times(AnyNumber());
 
   // Tidy up.
-  task_queue2->UnregisterTaskQueue();
+  task_queue2->UnregisterTaskQueue(nullptr);
 }
 
 }  // namespace scheduler
diff --git a/third_party/WebKit/Source/platform/scheduler/base/work_queue_unittest.cc b/third_party/WebKit/Source/platform/scheduler/base/work_queue_unittest.cc
index 4941dbe..1835001 100644
--- a/third_party/WebKit/Source/platform/scheduler/base/work_queue_unittest.cc
+++ b/third_party/WebKit/Source/platform/scheduler/base/work_queue_unittest.cc
@@ -24,9 +24,8 @@
  public:
   void SetUp() override {
     time_domain_.reset(new RealTimeDomain());
-    task_queue_ = make_scoped_refptr(
-        new TaskQueueImpl(nullptr, time_domain_.get(),
-                          TaskQueue::Spec(TaskQueue::QueueType::TEST)));
+    task_queue_ = base::MakeUnique<TaskQueueImpl>(nullptr, time_domain_.get(),
+                                                  TaskQueue::Spec("test"));
 
     work_queue_.reset(new WorkQueue(task_queue_.get(), "test",
                                     WorkQueue::QueueType::IMMEDIATE));
@@ -45,7 +44,7 @@
   }
 
   std::unique_ptr<RealTimeDomain> time_domain_;
-  scoped_refptr<TaskQueueImpl> task_queue_;
+  std::unique_ptr<TaskQueueImpl> task_queue_;
   std::unique_ptr<WorkQueue> work_queue_;
   std::unique_ptr<WorkQueueSets> work_queue_sets_;
   std::unique_ptr<TaskQueueImpl::TaskDeque> incoming_queue_;
diff --git a/third_party/WebKit/Source/platform/scheduler/child/compositor_worker_scheduler.cc b/third_party/WebKit/Source/platform/scheduler/child/compositor_worker_scheduler.cc
index 10522bcb..5d293ea 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/compositor_worker_scheduler.cc
+++ b/third_party/WebKit/Source/platform/scheduler/child/compositor_worker_scheduler.cc
@@ -20,15 +20,15 @@
 CompositorWorkerScheduler::CompositorWorkerScheduler(
     base::Thread* thread,
     scoped_refptr<SchedulerTqmDelegate> main_task_runner)
-    : WorkerScheduler(WTF::MakeUnique<SchedulerHelper>(main_task_runner)),
+    : WorkerScheduler(WTF::MakeUnique<WorkerSchedulerHelper>(main_task_runner)),
       thread_(thread) {}
 
 CompositorWorkerScheduler::~CompositorWorkerScheduler() {}
 
 void CompositorWorkerScheduler::Init() {}
 
-scoped_refptr<TaskQueue> CompositorWorkerScheduler::DefaultTaskQueue() {
-  return helper_->DefaultTaskQueue();
+scoped_refptr<WorkerTaskQueue> CompositorWorkerScheduler::DefaultTaskQueue() {
+  return helper_->DefaultWorkerTaskQueue();
 }
 
 scoped_refptr<base::SingleThreadTaskRunner>
diff --git a/third_party/WebKit/Source/platform/scheduler/child/compositor_worker_scheduler.h b/third_party/WebKit/Source/platform/scheduler/child/compositor_worker_scheduler.h
index e42cdec1..ba2393a 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/compositor_worker_scheduler.h
+++ b/third_party/WebKit/Source/platform/scheduler/child/compositor_worker_scheduler.h
@@ -32,7 +32,7 @@
 
   // WorkerScheduler:
   void Init() override;
-  scoped_refptr<TaskQueue> DefaultTaskQueue() override;
+  scoped_refptr<WorkerTaskQueue> DefaultTaskQueue() override;
 
   // ChildScheduler:
   scoped_refptr<base::SingleThreadTaskRunner> DefaultTaskRunner() override;
diff --git a/third_party/WebKit/Source/platform/scheduler/child/idle_canceled_delayed_task_sweeper_unittest.cc b/third_party/WebKit/Source/platform/scheduler/child/idle_canceled_delayed_task_sweeper_unittest.cc
index d106333..c2a20ad 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/idle_canceled_delayed_task_sweeper_unittest.cc
+++ b/third_party/WebKit/Source/platform/scheduler/child/idle_canceled_delayed_task_sweeper_unittest.cc
@@ -13,6 +13,7 @@
 #include "platform/scheduler/child/idle_helper.h"
 #include "platform/scheduler/child/scheduler_helper.h"
 #include "platform/scheduler/child/scheduler_tqm_delegate_for_test.h"
+#include "platform/scheduler/renderer/main_thread_scheduler_helper.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace blink {
@@ -36,15 +37,18 @@
         delegate_(SchedulerTqmDelegateForTest::Create(
             mock_task_runner_,
             base::WrapUnique(new TestTimeSource(clock_.get())))),
-        scheduler_helper_(new SchedulerHelper(delegate_)),
+        scheduler_helper_(new MainThreadSchedulerHelper(delegate_, nullptr)),
         idle_helper_(new IdleHelper(scheduler_helper_.get(),
                                     this,
                                     "test",
-                                    base::TimeDelta::FromSeconds(30))),
+                                    base::TimeDelta::FromSeconds(30),
+                                    scheduler_helper_->NewTaskQueue(
+                                        MainThreadTaskQueue::QueueType::TEST,
+                                        TaskQueue::Spec("test_idle_tq")))),
         idle_canceled_delayed_taks_sweeper_(
             new IdleCanceledDelayedTaskSweeper(scheduler_helper_.get(),
                                                idle_helper_->IdleTaskRunner())),
-        default_task_queue_(scheduler_helper_->DefaultTaskQueue()) {
+        default_task_queue_(scheduler_helper_->DefaultMainThreadTaskQueue()) {
     clock_->Advance(base::TimeDelta::FromMicroseconds(5000));
   }
 
@@ -73,7 +77,7 @@
   scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_;
 
   scoped_refptr<SchedulerTqmDelegateForTest> delegate_;
-  std::unique_ptr<SchedulerHelper> scheduler_helper_;
+  std::unique_ptr<MainThreadSchedulerHelper> scheduler_helper_;
   std::unique_ptr<IdleHelper> idle_helper_;
   std::unique_ptr<IdleCanceledDelayedTaskSweeper>
       idle_canceled_delayed_taks_sweeper_;
diff --git a/third_party/WebKit/Source/platform/scheduler/child/idle_helper.cc b/third_party/WebKit/Source/platform/scheduler/child/idle_helper.cc
index f16a09a..1132e8a 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/idle_helper.cc
+++ b/third_party/WebKit/Source/platform/scheduler/child/idle_helper.cc
@@ -20,14 +20,12 @@
     SchedulerHelper* helper,
     Delegate* delegate,
     const char* idle_period_tracing_name,
-    base::TimeDelta required_quiescence_duration_before_long_idle_period)
+    base::TimeDelta required_quiescence_duration_before_long_idle_period,
+    scoped_refptr<TaskQueue> idle_queue)
     : helper_(helper),
       delegate_(delegate),
-      idle_queue_(
-          helper_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::IDLE))),
-      state_(helper,
-             delegate,
-             idle_period_tracing_name),
+      idle_queue_(std::move(idle_queue)),
+      state_(helper, delegate, idle_period_tracing_name),
       required_quiescence_duration_before_long_idle_period_(
           required_quiescence_duration_before_long_idle_period),
       is_shutdown_(false),
diff --git a/third_party/WebKit/Source/platform/scheduler/child/idle_helper.h b/third_party/WebKit/Source/platform/scheduler/child/idle_helper.h
index a1335c5c..aec0d27 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/idle_helper.h
+++ b/third_party/WebKit/Source/platform/scheduler/child/idle_helper.h
@@ -91,7 +91,8 @@
       SchedulerHelper* helper,
       Delegate* delegate,
       const char* idle_period_tracing_name,
-      base::TimeDelta required_quiescence_duration_before_long_idle_period);
+      base::TimeDelta required_quiescence_duration_before_long_idle_period,
+      scoped_refptr<TaskQueue> idle_queue);
   ~IdleHelper() override;
 
   // Prevents any further idle tasks from running.
diff --git a/third_party/WebKit/Source/platform/scheduler/child/idle_helper_unittest.cc b/third_party/WebKit/Source/platform/scheduler/child/idle_helper_unittest.cc
index 8901a29..d5e9161 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/idle_helper_unittest.cc
+++ b/third_party/WebKit/Source/platform/scheduler/child/idle_helper_unittest.cc
@@ -21,6 +21,7 @@
 #include "platform/scheduler/child/scheduler_helper.h"
 #include "platform/scheduler/child/scheduler_tqm_delegate_for_test.h"
 #include "platform/scheduler/child/scheduler_tqm_delegate_impl.h"
+#include "platform/scheduler/child/worker_scheduler_helper.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -158,11 +159,13 @@
  public:
   explicit IdleHelperForTest(
       SchedulerHelper* scheduler_helper,
-      base::TimeDelta required_quiescence_duration_before_long_idle_period)
+      base::TimeDelta required_quiescence_duration_before_long_idle_period,
+      scoped_refptr<TaskQueue> idle_task_runner)
       : IdleHelper(scheduler_helper,
                    this,
                    "TestSchedulerIdlePeriod",
-                   required_quiescence_duration_before_long_idle_period) {}
+                   required_quiescence_duration_before_long_idle_period,
+                   idle_task_runner) {}
 
   ~IdleHelperForTest() override {}
 
@@ -192,11 +195,12 @@
             message_loop,
             mock_task_runner_,
             base::WrapUnique(new TestTimeSource(clock_.get())))),
-        scheduler_helper_(new SchedulerHelper(main_task_runner_)),
+        scheduler_helper_(new WorkerSchedulerHelper(main_task_runner_)),
         idle_helper_(new IdleHelperForTest(
             scheduler_helper_.get(),
-            required_quiescence_duration_before_long_idle_period)),
-        default_task_runner_(scheduler_helper_->DefaultTaskQueue()),
+            required_quiescence_duration_before_long_idle_period,
+            scheduler_helper_->NewTaskQueue(TaskQueue::Spec("idle_test")))),
+        default_task_runner_(scheduler_helper_->DefaultWorkerTaskQueue()),
         idle_task_runner_(idle_helper_->IdleTaskRunner()) {
     clock_->Advance(base::TimeDelta::FromMicroseconds(5000));
   }
@@ -292,7 +296,7 @@
   std::unique_ptr<base::MessageLoop> message_loop_;
 
   scoped_refptr<SchedulerTqmDelegate> main_task_runner_;
-  std::unique_ptr<SchedulerHelper> scheduler_helper_;
+  std::unique_ptr<WorkerSchedulerHelper> scheduler_helper_;
   std::unique_ptr<IdleHelperForTest> idle_helper_;
   scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_;
   scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner_;
diff --git a/third_party/WebKit/Source/platform/scheduler/child/scheduler_helper.cc b/third_party/WebKit/Source/platform/scheduler/child/scheduler_helper.cc
index b0a71c95..2fa8cd8d 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/scheduler_helper.cc
+++ b/third_party/WebKit/Source/platform/scheduler/child/scheduler_helper.cc
@@ -15,26 +15,19 @@
 
 SchedulerHelper::SchedulerHelper(
     scoped_refptr<SchedulerTqmDelegate> task_queue_manager_delegate)
-    : SchedulerHelper(task_queue_manager_delegate,
-                      TaskQueue::Spec(TaskQueue::QueueType::DEFAULT)
-                          .SetShouldMonitorQuiescence(true)) {}
-
-SchedulerHelper::SchedulerHelper(
-    scoped_refptr<SchedulerTqmDelegate> task_queue_manager_delegate,
-    TaskQueue::Spec default_task_queue_spec)
     : task_queue_manager_delegate_(task_queue_manager_delegate),
       task_queue_manager_(new TaskQueueManager(task_queue_manager_delegate)),
-      control_task_queue_(
-          NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::CONTROL)
-                           .SetShouldNotifyObservers(false))),
-      default_task_queue_(NewTaskQueue(default_task_queue_spec)),
       observer_(nullptr) {
-  control_task_queue_->SetQueuePriority(TaskQueue::CONTROL_PRIORITY);
-
   task_queue_manager_->SetWorkBatchSize(4);
+}
+
+void SchedulerHelper::InitDefaultQueues(
+    scoped_refptr<TaskQueue> default_task_queue,
+    scoped_refptr<TaskQueue> control_task_queue) {
+  control_task_queue->SetQueuePriority(TaskQueue::CONTROL_PRIORITY);
 
   DCHECK(task_queue_manager_delegate_);
-  task_queue_manager_delegate_->SetDefaultTaskRunner(default_task_queue_.get());
+  task_queue_manager_delegate_->SetDefaultTaskRunner(default_task_queue);
 }
 
 SchedulerHelper::~SchedulerHelper() {
@@ -58,21 +51,6 @@
       record_task_delay_histograms);
 }
 
-scoped_refptr<TaskQueue> SchedulerHelper::NewTaskQueue(
-    const TaskQueue::Spec& spec) {
-  DCHECK(task_queue_manager_.get());
-  return task_queue_manager_->NewTaskQueue(spec);
-}
-
-scoped_refptr<TaskQueue> SchedulerHelper::DefaultTaskQueue() {
-  CheckOnValidThread();
-  return default_task_queue_;
-}
-
-scoped_refptr<TaskQueue> SchedulerHelper::ControlTaskQueue() {
-  return control_task_queue_;
-}
-
 size_t SchedulerHelper::GetNumberOfPendingTasks() const {
   return task_queue_manager_->GetNumberOfPendingTasks();
 }
@@ -156,23 +134,9 @@
     task_queue_manager_->UnregisterTimeDomain(time_domain);
 }
 
-void SchedulerHelper::OnUnregisterTaskQueue(
-    const scoped_refptr<TaskQueue>& queue) {
+void SchedulerHelper::OnTriedToExecuteBlockedTask() {
   if (observer_)
-    observer_->OnUnregisterTaskQueue(queue);
-}
-
-void SchedulerHelper::OnTriedToExecuteBlockedTask(
-    const TaskQueue& queue,
-    const base::PendingTask& task) {
-  if (observer_)
-    observer_->OnTriedToExecuteBlockedTask(queue, task);
-}
-
-TaskQueue* SchedulerHelper::CurrentlyExecutingTaskQueue() const {
-  if (!task_queue_manager_)
-    return nullptr;
-  return task_queue_manager_->currently_executing_task_queue();
+    observer_->OnTriedToExecuteBlockedTask();
 }
 
 }  // namespace scheduler
diff --git a/third_party/WebKit/Source/platform/scheduler/child/scheduler_helper.h b/third_party/WebKit/Source/platform/scheduler/child/scheduler_helper.h
index f4329de..ce645c81 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/scheduler_helper.h
+++ b/third_party/WebKit/Source/platform/scheduler/child/scheduler_helper.h
@@ -23,9 +23,6 @@
  public:
   explicit SchedulerHelper(
       scoped_refptr<SchedulerTqmDelegate> task_queue_manager_delegate);
-  explicit SchedulerHelper(
-      scoped_refptr<SchedulerTqmDelegate> task_queue_manager_delegate,
-      TaskQueue::Spec default_task_queue_spec);
   ~SchedulerHelper() override;
 
   // There is a small overhead to recording task delay histograms, we may not
@@ -33,17 +30,15 @@
   void SetRecordTaskDelayHistograms(bool record_task_delay_histograms);
 
   // TaskQueueManager::Observer implementation:
-  void OnUnregisterTaskQueue(const scoped_refptr<TaskQueue>& queue) override;
-  void OnTriedToExecuteBlockedTask(const TaskQueue& queue,
-                                   const base::PendingTask& task) override;
+  void OnTriedToExecuteBlockedTask() override;
 
   // Returns the default task queue.
-  scoped_refptr<TaskQueue> DefaultTaskQueue();
+  virtual scoped_refptr<TaskQueue> DefaultTaskQueue() = 0;
 
   // Returns the control task queue.  Tasks posted to this queue are executed
   // with the highest priority. Care must be taken to avoid starvation of other
   // task queues.
-  scoped_refptr<TaskQueue> ControlTaskQueue();
+  virtual scoped_refptr<TaskQueue> ControlTaskQueue() = 0;
 
   // Adds or removes a task observer from the scheduler. The observer will be
   // notified before and after every executed task. These functions can only be
@@ -66,21 +61,13 @@
     DCHECK(thread_checker_.CalledOnValidThread());
   }
 
-  // Creates a new TaskQueue with the given |spec|.
-  scoped_refptr<TaskQueue> NewTaskQueue(const TaskQueue::Spec& spec);
-
   class PLATFORM_EXPORT Observer {
    public:
     virtual ~Observer() {}
 
-    // Called when |queue| is unregistered.
-    virtual void OnUnregisterTaskQueue(
-        const scoped_refptr<TaskQueue>& queue) = 0;
-
     // Called when the scheduler tried to execute a task from a disabled
     // queue. See TaskQueue::Spec::SetShouldReportWhenExecutionBlocked.
-    virtual void OnTriedToExecuteBlockedTask(const TaskQueue& queue,
-                                             const base::PendingTask& task) = 0;
+    virtual void OnTriedToExecuteBlockedTask() = 0;
   };
 
   // Called once to set the Observer. This function is called on the main
@@ -97,7 +84,6 @@
   void UnregisterTimeDomain(TimeDomain* time_domain);
   const scoped_refptr<SchedulerTqmDelegate>& scheduler_tqm_delegate() const;
   bool GetAndClearSystemIsQuiescentBit();
-  TaskQueue* CurrentlyExecutingTaskQueue() const;
 
   size_t GetNumberOfPendingTasks() const;
 
@@ -105,14 +91,16 @@
   void SetWorkBatchSizeForTesting(size_t work_batch_size);
   TaskQueueManager* GetTaskQueueManagerForTesting();
 
- private:
-  friend class SchedulerHelperTest;
+ protected:
+  void InitDefaultQueues(scoped_refptr<TaskQueue> default_task_queue,
+                         scoped_refptr<TaskQueue> control_task_queue);
 
   base::ThreadChecker thread_checker_;
   scoped_refptr<SchedulerTqmDelegate> task_queue_manager_delegate_;
   std::unique_ptr<TaskQueueManager> task_queue_manager_;
-  scoped_refptr<TaskQueue> control_task_queue_;
-  scoped_refptr<TaskQueue> default_task_queue_;
+
+ private:
+  friend class SchedulerHelperTest;
 
   Observer* observer_;  // NOT OWNED
 
diff --git a/third_party/WebKit/Source/platform/scheduler/child/scheduler_helper_unittest.cc b/third_party/WebKit/Source/platform/scheduler/child/scheduler_helper_unittest.cc
index f3dae923..2b5537e 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/scheduler_helper_unittest.cc
+++ b/third_party/WebKit/Source/platform/scheduler/child/scheduler_helper_unittest.cc
@@ -15,6 +15,7 @@
 #include "platform/scheduler/base/task_queue.h"
 #include "platform/scheduler/base/test_time_source.h"
 #include "platform/scheduler/child/scheduler_tqm_delegate_for_test.h"
+#include "platform/scheduler/child/worker_scheduler_helper.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -55,8 +56,8 @@
         main_task_runner_(SchedulerTqmDelegateForTest::Create(
             mock_task_runner_,
             base::WrapUnique(new TestTimeSource(clock_.get())))),
-        scheduler_helper_(new SchedulerHelper(main_task_runner_)),
-        default_task_runner_(scheduler_helper_->DefaultTaskQueue()) {
+        scheduler_helper_(new WorkerSchedulerHelper(main_task_runner_)),
+        default_task_runner_(scheduler_helper_->DefaultWorkerTaskQueue()) {
     clock_->Advance(base::TimeDelta::FromMicroseconds(5000));
   }
 
@@ -86,7 +87,7 @@
   scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_;
 
   scoped_refptr<SchedulerTqmDelegateForTest> main_task_runner_;
-  std::unique_ptr<SchedulerHelper> scheduler_helper_;
+  std::unique_ptr<WorkerSchedulerHelper> scheduler_helper_;
   scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_;
 
   DISALLOW_COPY_AND_ASSIGN(SchedulerHelperTest);
@@ -130,18 +131,18 @@
 
 TEST_F(SchedulerHelperTest, DefaultTaskRunnerRegistration) {
   EXPECT_EQ(main_task_runner_->default_task_runner(),
-            scheduler_helper_->DefaultTaskQueue());
+            scheduler_helper_->DefaultWorkerTaskQueue());
   scheduler_helper_->Shutdown();
   EXPECT_EQ(nullptr, main_task_runner_->default_task_runner());
 }
 
 TEST_F(SchedulerHelperTest, GetNumberOfPendingTasks) {
   std::vector<std::string> run_order;
-  scheduler_helper_->DefaultTaskQueue()->PostTask(
+  scheduler_helper_->DefaultWorkerTaskQueue()->PostTask(
       FROM_HERE, base::Bind(&AppendToVectorTestTask, &run_order, "D1"));
-  scheduler_helper_->DefaultTaskQueue()->PostTask(
+  scheduler_helper_->DefaultWorkerTaskQueue()->PostTask(
       FROM_HERE, base::Bind(&AppendToVectorTestTask, &run_order, "D2"));
-  scheduler_helper_->ControlTaskQueue()->PostTask(
+  scheduler_helper_->ControlWorkerTaskQueue()->PostTask(
       FROM_HERE, base::Bind(&AppendToVectorTestTask, &run_order, "C1"));
   EXPECT_EQ(3U, scheduler_helper_->GetNumberOfPendingTasks());
   RunUntilIdle();
@@ -162,8 +163,8 @@
   MockTaskObserver observer;
   scheduler_helper_->AddTaskObserver(&observer);
 
-  scheduler_helper_->DefaultTaskQueue()->PostTask(FROM_HERE,
-                                                  base::Bind(&NopTask));
+  scheduler_helper_->DefaultWorkerTaskQueue()->PostTask(FROM_HERE,
+                                                        base::Bind(&NopTask));
 
   EXPECT_CALL(observer, WillProcessTask(_)).Times(1);
   EXPECT_CALL(observer, DidProcessTask(_)).Times(1);
@@ -174,8 +175,8 @@
   MockTaskObserver observer;
   scheduler_helper_->AddTaskObserver(&observer);
 
-  scheduler_helper_->ControlTaskQueue()->PostTask(FROM_HERE,
-                                                  base::Bind(&NopTask));
+  scheduler_helper_->ControlWorkerTaskQueue()->PostTask(FROM_HERE,
+                                                        base::Bind(&NopTask));
 
   EXPECT_CALL(observer, WillProcessTask(_)).Times(0);
   EXPECT_CALL(observer, DidProcessTask(_)).Times(0);
@@ -186,34 +187,17 @@
 
 class MockObserver : public SchedulerHelper::Observer {
  public:
-  MOCK_METHOD1(OnUnregisterTaskQueue,
-               void(const scoped_refptr<TaskQueue>& queue));
-  MOCK_METHOD2(OnTriedToExecuteBlockedTask,
-               void(const TaskQueue& queue, const base::PendingTask& task));
+  MOCK_METHOD0(OnTriedToExecuteBlockedTask, void());
 };
 
 }  // namespace
 
-TEST_F(SchedulerHelperTest, OnUnregisterTaskQueue) {
-  MockObserver observer;
-  scheduler_helper_->SetObserver(&observer);
-
-  scoped_refptr<TaskQueue> task_queue = scheduler_helper_->NewTaskQueue(
-      TaskQueue::Spec(TaskQueue::QueueType::TEST));
-
-  EXPECT_CALL(observer, OnUnregisterTaskQueue(_)).Times(1);
-  task_queue->UnregisterTaskQueue();
-
-  scheduler_helper_->SetObserver(nullptr);
-}
-
 TEST_F(SchedulerHelperTest, OnTriedToExecuteBlockedTask) {
   MockObserver observer;
   scheduler_helper_->SetObserver(&observer);
 
   scoped_refptr<TaskQueue> task_queue = scheduler_helper_->NewTaskQueue(
-      TaskQueue::Spec(TaskQueue::QueueType::TEST)
-          .SetShouldReportWhenExecutionBlocked(true));
+      TaskQueue::Spec("test").SetShouldReportWhenExecutionBlocked(true));
   std::unique_ptr<TaskQueue::QueueEnabledVoter> voter =
       task_queue->CreateQueueEnabledVoter();
   voter->SetQueueEnabled(false);
@@ -224,7 +208,7 @@
   voter->SetQueueEnabled(true);
   voter->SetQueueEnabled(false);
 
-  EXPECT_CALL(observer, OnTriedToExecuteBlockedTask(_, _)).Times(1);
+  EXPECT_CALL(observer, OnTriedToExecuteBlockedTask()).Times(1);
   RunUntilIdle();
 
   scheduler_helper_->SetObserver(nullptr);
diff --git a/third_party/WebKit/Source/platform/scheduler/child/worker_global_scope_scheduler.cc b/third_party/WebKit/Source/platform/scheduler/child/worker_global_scope_scheduler.cc
index 7178a0b..af790692 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/worker_global_scope_scheduler.cc
+++ b/third_party/WebKit/Source/platform/scheduler/child/worker_global_scope_scheduler.cc
@@ -11,9 +11,7 @@
 
 WorkerGlobalScopeScheduler::WorkerGlobalScopeScheduler(
     WorkerScheduler* worker_scheduler) {
-  scoped_refptr<TaskQueue> task_queue =
-      worker_scheduler->CreateUnthrottledTaskRunner(
-          TaskQueue::QueueType::UNTHROTTLED);
+  scoped_refptr<TaskQueue> task_queue = worker_scheduler->CreateTaskRunner();
   unthrottled_task_runner_ = WebTaskRunnerImpl::Create(std::move(task_queue));
 }
 
diff --git a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler.cc b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler.cc
index d3ca3a9..d0fa1a6 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler.cc
+++ b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler.cc
@@ -14,7 +14,7 @@
 namespace blink {
 namespace scheduler {
 
-WorkerScheduler::WorkerScheduler(std::unique_ptr<SchedulerHelper> helper)
+WorkerScheduler::WorkerScheduler(std::unique_ptr<WorkerSchedulerHelper> helper)
     : helper_(std::move(helper)) {}
 
 WorkerScheduler::~WorkerScheduler() {}
@@ -25,14 +25,11 @@
   return base::WrapUnique(new WorkerSchedulerImpl(std::move(main_task_runner)));
 }
 
-scoped_refptr<TaskQueue> WorkerScheduler::CreateUnthrottledTaskRunner(
-    TaskQueue::QueueType queue_type) {
+scoped_refptr<WorkerTaskQueue> WorkerScheduler::CreateTaskRunner() {
   helper_->CheckOnValidThread();
-  scoped_refptr<TaskQueue> unthrottled_task_queue(
-      helper_->NewTaskQueue(TaskQueue::Spec(queue_type)
-                                .SetShouldMonitorQuiescence(true)
-                                .SetTimeDomain(nullptr)));
-  return unthrottled_task_queue;
+  return helper_->NewTaskQueue(TaskQueue::Spec("worker_tq")
+                                   .SetShouldMonitorQuiescence(true)
+                                   .SetTimeDomain(nullptr));
 }
 
 }  // namespace scheduler
diff --git a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler.h b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler.h
index 1e55375..0b434e2 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler.h
+++ b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler.h
@@ -11,7 +11,8 @@
 #include "base/message_loop/message_loop.h"
 #include "platform/PlatformExport.h"
 #include "platform/scheduler/base/task_queue.h"
-#include "platform/scheduler/child/scheduler_helper.h"
+#include "platform/scheduler/child/worker_scheduler_helper.h"
+#include "platform/scheduler/child/worker_task_queue.h"
 #include "public/platform/scheduler/child/child_scheduler.h"
 #include "public/platform/scheduler/child/single_thread_idle_task_runner.h"
 
@@ -27,19 +28,18 @@
 
   // Blink should use WorkerScheduler::DefaultTaskQueue instead of
   // ChildScheduler::DefaultTaskRunner.
-  virtual scoped_refptr<TaskQueue> DefaultTaskQueue() = 0;
+  virtual scoped_refptr<WorkerTaskQueue> DefaultTaskQueue() = 0;
 
   // Must be called before the scheduler can be used. Does any post construction
   // initialization needed such as initializing idle period detection.
   virtual void Init() = 0;
 
-  scoped_refptr<TaskQueue> CreateUnthrottledTaskRunner(
-      TaskQueue::QueueType queue_type);
+  scoped_refptr<WorkerTaskQueue> CreateTaskRunner();
 
  protected:
-  explicit WorkerScheduler(std::unique_ptr<SchedulerHelper> helper);
+  explicit WorkerScheduler(std::unique_ptr<WorkerSchedulerHelper> helper);
 
-  std::unique_ptr<SchedulerHelper> helper_;
+  std::unique_ptr<WorkerSchedulerHelper> helper_;
 
   DISALLOW_COPY_AND_ASSIGN(WorkerScheduler);
 };
diff --git a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_helper.cc b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_helper.cc
new file mode 100644
index 0000000..1b43c03
--- /dev/null
+++ b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_helper.cc
@@ -0,0 +1,47 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "platform/scheduler/child/worker_scheduler_helper.h"
+
+#include "platform/scheduler/child/scheduler_tqm_delegate.h"
+#include "platform/scheduler/child/worker_task_queue.h"
+
+namespace blink {
+namespace scheduler {
+
+WorkerSchedulerHelper::WorkerSchedulerHelper(
+    scoped_refptr<SchedulerTqmDelegate> task_queue_manager_delegate)
+    : SchedulerHelper(task_queue_manager_delegate),
+      default_task_queue_(NewTaskQueue(TaskQueue::Spec("worker_default_tq")
+                                           .SetShouldMonitorQuiescence(true))),
+      control_task_queue_(NewTaskQueue(TaskQueue::Spec("worker_control_tq")
+                                           .SetShouldNotifyObservers(false))) {
+  InitDefaultQueues(default_task_queue_, control_task_queue_);
+}
+
+WorkerSchedulerHelper::~WorkerSchedulerHelper() {}
+
+scoped_refptr<WorkerTaskQueue> WorkerSchedulerHelper::DefaultWorkerTaskQueue() {
+  return default_task_queue_;
+}
+
+scoped_refptr<TaskQueue> WorkerSchedulerHelper::DefaultTaskQueue() {
+  return default_task_queue_;
+}
+
+scoped_refptr<WorkerTaskQueue> WorkerSchedulerHelper::ControlWorkerTaskQueue() {
+  return control_task_queue_;
+}
+
+scoped_refptr<TaskQueue> WorkerSchedulerHelper::ControlTaskQueue() {
+  return control_task_queue_;
+}
+
+scoped_refptr<WorkerTaskQueue> WorkerSchedulerHelper::NewTaskQueue(
+    const TaskQueue::Spec& spec) {
+  return task_queue_manager_->CreateTaskQueue<WorkerTaskQueue>(spec);
+}
+
+}  // namespace scheduler
+}  // namespace blink
diff --git a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_helper.h b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_helper.h
new file mode 100644
index 0000000..7598407b
--- /dev/null
+++ b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_helper.h
@@ -0,0 +1,40 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_CHILD_WORKER_SCHEDULER_HELPER_H_
+#define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_CHILD_WORKER_SCHEDULER_HELPER_H_
+
+#include "platform/scheduler/child/scheduler_helper.h"
+
+#include "platform/scheduler/child/worker_task_queue.h"
+
+namespace blink {
+namespace scheduler {
+
+class PLATFORM_EXPORT WorkerSchedulerHelper : public SchedulerHelper {
+ public:
+  explicit WorkerSchedulerHelper(
+      scoped_refptr<SchedulerTqmDelegate> task_queue_manager_delegate);
+  ~WorkerSchedulerHelper() override;
+
+  scoped_refptr<WorkerTaskQueue> NewTaskQueue(const TaskQueue::Spec& spec);
+
+  scoped_refptr<WorkerTaskQueue> DefaultWorkerTaskQueue();
+  scoped_refptr<WorkerTaskQueue> ControlWorkerTaskQueue();
+
+ protected:
+  scoped_refptr<TaskQueue> DefaultTaskQueue() override;
+  scoped_refptr<TaskQueue> ControlTaskQueue() override;
+
+ protected:
+  const scoped_refptr<WorkerTaskQueue> default_task_queue_;
+  const scoped_refptr<WorkerTaskQueue> control_task_queue_;
+
+  DISALLOW_COPY_AND_ASSIGN(WorkerSchedulerHelper);
+};
+
+}  // namespace scheduler
+}  // namespace blink
+
+#endif  // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_CHILD_WORKER_SCHEDULER_HELPER_H_
diff --git a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.cc
index 196009b4..3d66f3c 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.cc
+++ b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.cc
@@ -12,6 +12,7 @@
 #include "platform/scheduler/base/task_queue.h"
 #include "platform/scheduler/base/time_converter.h"
 #include "platform/scheduler/child/scheduler_tqm_delegate.h"
+#include "platform/scheduler/child/worker_scheduler_helper.h"
 #include "platform/wtf/PtrUtil.h"
 
 namespace blink {
@@ -38,11 +39,12 @@
 
 WorkerSchedulerImpl::WorkerSchedulerImpl(
     scoped_refptr<SchedulerTqmDelegate> main_task_runner)
-    : WorkerScheduler(WTF::MakeUnique<SchedulerHelper>(main_task_runner)),
+    : WorkerScheduler(WTF::MakeUnique<WorkerSchedulerHelper>(main_task_runner)),
       idle_helper_(helper_.get(),
                    this,
                    "WorkerSchedulerIdlePeriod",
-                   base::TimeDelta::FromMilliseconds(300)),
+                   base::TimeDelta::FromMilliseconds(300),
+                   helper_->NewTaskQueue(TaskQueue::Spec("worker_idle_tq"))),
       idle_canceled_delayed_task_sweeper_(helper_.get(),
                                           idle_helper_.IdleTaskRunner()),
       load_tracker_(helper_->scheduler_tqm_delegate()->NowTicks(),
@@ -71,12 +73,12 @@
 scoped_refptr<base::SingleThreadTaskRunner>
 WorkerSchedulerImpl::DefaultTaskRunner() {
   DCHECK(initialized_);
-  return helper_->DefaultTaskQueue();
+  return helper_->DefaultWorkerTaskQueue();
 }
 
-scoped_refptr<TaskQueue> WorkerSchedulerImpl::DefaultTaskQueue() {
+scoped_refptr<WorkerTaskQueue> WorkerSchedulerImpl::DefaultTaskQueue() {
   DCHECK(initialized_);
-  return helper_->DefaultTaskQueue();
+  return helper_->DefaultWorkerTaskQueue();
 }
 
 scoped_refptr<SingleThreadIdleTaskRunner>
@@ -135,12 +137,9 @@
   return idle_helper_.CurrentIdleTaskDeadline();
 }
 
-void WorkerSchedulerImpl::WillProcessTask(TaskQueue* task_queue,
-                                          double start_time) {}
+void WorkerSchedulerImpl::WillProcessTask(double start_time) {}
 
-void WorkerSchedulerImpl::DidProcessTask(TaskQueue* task_queue,
-                                         double start_time,
-                                         double end_time) {
+void WorkerSchedulerImpl::DidProcessTask(double start_time, double end_time) {
   DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, task_time_counter,
                                   ("WorkerThread.Task.Time", 0, 10000000, 50));
   task_time_counter.Count((end_time - start_time) *
diff --git a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.h b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.h
index a14e776..0fdc4f2 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.h
+++ b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.h
@@ -29,7 +29,7 @@
 
   // WorkerScheduler implementation:
   scoped_refptr<base::SingleThreadTaskRunner> DefaultTaskRunner() override;
-  scoped_refptr<TaskQueue> DefaultTaskQueue() override;
+  scoped_refptr<WorkerTaskQueue> DefaultTaskQueue() override;
   scoped_refptr<SingleThreadIdleTaskRunner> IdleTaskRunner() override;
   bool CanExceedIdleDeadlineIfRequired() const override;
   bool ShouldYieldForHighPriorityWork() override;
@@ -40,10 +40,8 @@
   void Shutdown() override;
 
   // TaskTimeObserver implementation:
-  void WillProcessTask(TaskQueue* task_queue, double start_time) override;
-  void DidProcessTask(TaskQueue* task_queue,
-                      double start_time,
-                      double end_time) override;
+  void WillProcessTask(double start_time) override;
+  void DidProcessTask(double start_time, double end_time) override;
   void OnBeginNestedRunLoop() override;
 
   SchedulerHelper* GetSchedulerHelperForTesting();
diff --git a/third_party/WebKit/Source/platform/scheduler/child/worker_task_queue.cc b/third_party/WebKit/Source/platform/scheduler/child/worker_task_queue.cc
new file mode 100644
index 0000000..423dd6e
--- /dev/null
+++ b/third_party/WebKit/Source/platform/scheduler/child/worker_task_queue.cc
@@ -0,0 +1,18 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "platform/scheduler/child/worker_task_queue.h"
+
+#include "platform/scheduler/base/task_queue_impl.h"
+
+namespace blink {
+namespace scheduler {
+
+WorkerTaskQueue::WorkerTaskQueue(std::unique_ptr<internal::TaskQueueImpl> impl)
+    : TaskQueue(std::move(impl)) {}
+
+WorkerTaskQueue::~WorkerTaskQueue() {}
+
+}  // namespace scheduler
+}  // namespace blink
diff --git a/third_party/WebKit/Source/platform/scheduler/child/worker_task_queue.h b/third_party/WebKit/Source/platform/scheduler/child/worker_task_queue.h
new file mode 100644
index 0000000..c6945512
--- /dev/null
+++ b/third_party/WebKit/Source/platform/scheduler/child/worker_task_queue.h
@@ -0,0 +1,22 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_CHILD_WORKER_TASK_QUEUE_H_
+#define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_CHILD_WORKER_TASK_QUEUE_H_
+
+#include "platform/scheduler/base/task_queue.h"
+
+namespace blink {
+namespace scheduler {
+
+class PLATFORM_EXPORT WorkerTaskQueue : public TaskQueue {
+ public:
+  explicit WorkerTaskQueue(std::unique_ptr<internal::TaskQueueImpl> impl);
+  ~WorkerTaskQueue() override;
+};
+
+}  // namespace scheduler
+}  // namespace blink
+
+#endif  // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_CHILD_WORKER_TASK_QUEUE_H_
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/auto_advancing_virtual_time_domain_unittest.cc b/third_party/WebKit/Source/platform/scheduler/renderer/auto_advancing_virtual_time_domain_unittest.cc
index b6b847e7..bd25f1df 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/auto_advancing_virtual_time_domain_unittest.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/auto_advancing_virtual_time_domain_unittest.cc
@@ -11,6 +11,7 @@
 #include "platform/scheduler/base/test_task_time_observer.h"
 #include "platform/scheduler/base/test_time_source.h"
 #include "platform/scheduler/child/scheduler_tqm_delegate_for_test.h"
+#include "platform/scheduler/test/test_task_queue.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -35,7 +36,7 @@
     manager_ = base::MakeUnique<TaskQueueManager>(main_task_runner_);
     manager_->AddTaskTimeObserver(&test_task_time_observer_);
     task_queue_ =
-        manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST));
+        manager_->CreateTaskQueue<TestTaskQueue>(TaskQueue::Spec("test"));
     initial_time_ = clock_->NowTicks();
     auto_advancing_time_domain_.reset(
         new AutoAdvancingVirtualTimeDomain(initial_time_));
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool_unittest.cc b/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool_unittest.cc
index 5e2c42b..2f1e7252 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool_unittest.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool_unittest.cc
@@ -134,7 +134,7 @@
       task_queue_throttler_->CreateWakeUpBudgetPool("test");
 
   scoped_refptr<TaskQueue> queue =
-      scheduler_->NewTimerTaskQueue(TaskQueue::QueueType::TEST);
+      scheduler_->NewTimerTaskQueue(MainThreadTaskQueue::QueueType::TEST);
 
   pool->SetWakeUpRate(0.1);
   pool->SetWakeUpDuration(base::TimeDelta::FromMilliseconds(10));
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/idle_time_estimator_unittest.cc b/third_party/WebKit/Source/platform/scheduler/renderer/idle_time_estimator_unittest.cc
index e770040..7c087a4f 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/idle_time_estimator_unittest.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/idle_time_estimator_unittest.cc
@@ -5,12 +5,15 @@
 #include "platform/scheduler/renderer/idle_time_estimator.h"
 
 #include "base/memory/ptr_util.h"
+#include "base/memory/ref_counted.h"
 #include "base/test/simple_test_tick_clock.h"
 #include "cc/test/ordered_simple_task_runner.h"
+#include "platform/scheduler/base/task_queue.h"
 #include "platform/scheduler/base/task_queue_manager.h"
 #include "platform/scheduler/base/test_task_time_observer.h"
 #include "platform/scheduler/base/test_time_source.h"
 #include "platform/scheduler/child/scheduler_tqm_delegate_for_test.h"
+#include "platform/scheduler/test/test_task_queue.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -46,8 +49,8 @@
     main_task_runner_ = SchedulerTqmDelegateForTest::Create(
         mock_task_runner_, base::MakeUnique<TestTimeSource>(clock_.get()));
     manager_ = base::MakeUnique<TaskQueueManager>(main_task_runner_);
-    compositor_task_queue_ = manager_->NewTaskQueue(
-        TaskQueue::Spec(TaskQueue::QueueType::COMPOSITOR));
+    compositor_task_queue_ =
+        manager_->CreateTaskQueue<TestTaskQueue>(TaskQueue::Spec("test_tq"));
     estimator_.reset(new IdleTimeEstimatorForTest(
         compositor_task_queue_, test_time_source_.get(), 10, 50));
   }
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_scheduler_helper.cc b/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_scheduler_helper.cc
new file mode 100644
index 0000000..c8e59e0
--- /dev/null
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_scheduler_helper.cc
@@ -0,0 +1,59 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "platform/scheduler/renderer/main_thread_scheduler_helper.h"
+
+#include "platform/scheduler/child/scheduler_tqm_delegate.h"
+#include "platform/scheduler/renderer/main_thread_task_queue.h"
+
+namespace blink {
+namespace scheduler {
+
+MainThreadSchedulerHelper::MainThreadSchedulerHelper(
+    scoped_refptr<SchedulerTqmDelegate> task_queue_manager_delegate,
+    RendererSchedulerImpl* renderer_scheduler)
+    : SchedulerHelper(task_queue_manager_delegate),
+      renderer_scheduler_(renderer_scheduler),
+      default_task_queue_(
+          NewTaskQueue(MainThreadTaskQueue::QueueType::DEFAULT,
+                       MainThreadTaskQueue::CreateSpecForType(
+                           MainThreadTaskQueue::QueueType::DEFAULT)
+                           .SetShouldMonitorQuiescence(true))),
+      control_task_queue_(
+          NewTaskQueue(MainThreadTaskQueue::QueueType::CONTROL,
+                       MainThreadTaskQueue::CreateSpecForType(
+                           MainThreadTaskQueue::QueueType::CONTROL)
+                           .SetShouldNotifyObservers(false))) {
+  InitDefaultQueues(default_task_queue_, control_task_queue_);
+}
+
+MainThreadSchedulerHelper::~MainThreadSchedulerHelper() {}
+
+scoped_refptr<MainThreadTaskQueue>
+MainThreadSchedulerHelper::DefaultMainThreadTaskQueue() {
+  return default_task_queue_;
+}
+
+scoped_refptr<TaskQueue> MainThreadSchedulerHelper::DefaultTaskQueue() {
+  return default_task_queue_;
+}
+
+scoped_refptr<MainThreadTaskQueue>
+MainThreadSchedulerHelper::ControlMainThreadTaskQueue() {
+  return control_task_queue_;
+}
+
+scoped_refptr<TaskQueue> MainThreadSchedulerHelper::ControlTaskQueue() {
+  return control_task_queue_;
+}
+
+scoped_refptr<MainThreadTaskQueue> MainThreadSchedulerHelper::NewTaskQueue(
+    MainThreadTaskQueue::QueueType type,
+    const TaskQueue::Spec& spec) {
+  return task_queue_manager_->CreateTaskQueue<MainThreadTaskQueue>(
+      spec, type, renderer_scheduler_);
+}
+
+}  // namespace scheduler
+}  // namespace blink
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_scheduler_helper.h b/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_scheduler_helper.h
new file mode 100644
index 0000000..bf70cf1
--- /dev/null
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_scheduler_helper.h
@@ -0,0 +1,47 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_MAIN_THREAD_SCHEDULER_HELPER_H_
+#define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_MAIN_THREAD_SCHEDULER_HELPER_H_
+
+#include "platform/scheduler/child/scheduler_helper.h"
+
+#include "platform/scheduler/renderer/main_thread_task_queue.h"
+
+namespace blink {
+namespace scheduler {
+
+class RendererSchedulerImpl;
+
+class PLATFORM_EXPORT MainThreadSchedulerHelper : public SchedulerHelper {
+ public:
+  MainThreadSchedulerHelper(
+      scoped_refptr<SchedulerTqmDelegate> task_queue_manager_delegate,
+      RendererSchedulerImpl* renderer_scheduler);
+  ~MainThreadSchedulerHelper() override;
+
+  scoped_refptr<MainThreadTaskQueue> NewTaskQueue(
+      MainThreadTaskQueue::QueueType type,
+      const TaskQueue::Spec& spec);
+
+  scoped_refptr<MainThreadTaskQueue> DefaultMainThreadTaskQueue();
+  scoped_refptr<MainThreadTaskQueue> ControlMainThreadTaskQueue();
+
+ protected:
+  scoped_refptr<TaskQueue> DefaultTaskQueue() override;
+  scoped_refptr<TaskQueue> ControlTaskQueue() override;
+
+ private:
+  RendererSchedulerImpl* renderer_scheduler_;  // NOT OWNED
+
+  const scoped_refptr<MainThreadTaskQueue> default_task_queue_;
+  const scoped_refptr<MainThreadTaskQueue> control_task_queue_;
+
+  DISALLOW_COPY_AND_ASSIGN(MainThreadSchedulerHelper);
+};
+
+}  // namespace scheduler
+}  // namespace blink
+
+#endif  // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_MAIN_THREAD_SCHEDULER_HELPER_H_
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_task_queue.cc b/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_task_queue.cc
new file mode 100644
index 0000000..15fb1a0
--- /dev/null
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_task_queue.cc
@@ -0,0 +1,80 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "platform/scheduler/renderer/main_thread_task_queue.h"
+
+#include "platform/scheduler/base/task_queue_impl.h"
+#include "platform/scheduler/renderer/renderer_scheduler_impl.h"
+
+namespace blink {
+namespace scheduler {
+
+// static
+const char* MainThreadTaskQueue::NameForQueueType(
+    MainThreadTaskQueue::QueueType queue_type) {
+  switch (queue_type) {
+    case MainThreadTaskQueue::QueueType::CONTROL:
+      return "control_tq";
+    case MainThreadTaskQueue::QueueType::DEFAULT:
+      return "default_tq";
+    case MainThreadTaskQueue::QueueType::DEFAULT_LOADING:
+      return "default_loading_tq";
+    case MainThreadTaskQueue::QueueType::DEFAULT_TIMER:
+      return "default_timer_tq";
+    case MainThreadTaskQueue::QueueType::UNTHROTTLED:
+      return "unthrottled_tq";
+    case MainThreadTaskQueue::QueueType::FRAME_LOADING:
+      return "frame_loading_tq";
+    case MainThreadTaskQueue::QueueType::FRAME_TIMER:
+      return "frame_timer_tq";
+    case MainThreadTaskQueue::QueueType::FRAME_UNTHROTTLED:
+      return "frame_unthrottled_tq";
+    case MainThreadTaskQueue::QueueType::COMPOSITOR:
+      return "compositor_tq";
+    case MainThreadTaskQueue::QueueType::IDLE:
+      return "idle_tq";
+    case MainThreadTaskQueue::QueueType::TEST:
+      return "test_tq";
+    case MainThreadTaskQueue::QueueType::COUNT:
+      NOTREACHED();
+      return nullptr;
+  }
+  NOTREACHED();
+  return nullptr;
+}
+
+// static
+TaskQueue::Spec MainThreadTaskQueue::CreateSpecForType(
+    MainThreadTaskQueue::QueueType queue_type) {
+  return TaskQueue::Spec(NameForQueueType(queue_type));
+}
+
+MainThreadTaskQueue::MainThreadTaskQueue(
+    std::unique_ptr<internal::TaskQueueImpl> impl,
+    MainThreadTaskQueue::QueueType queue_type,
+    RendererSchedulerImpl* renderer_scheduler)
+    : TaskQueue(std::move(impl)),
+      queue_type_(queue_type),
+      renderer_scheduler_(renderer_scheduler) {
+  GetTaskQueueImpl()->SetOnTaskCompletedHandler(base::Bind(
+      &MainThreadTaskQueue::OnTaskCompleted, base::Unretained(this)));
+}
+
+MainThreadTaskQueue::~MainThreadTaskQueue() {}
+
+void MainThreadTaskQueue::OnTaskCompleted(base::TimeTicks start,
+                                          base::TimeTicks end) {
+  renderer_scheduler_->OnTaskCompleted(this, start, end);
+}
+
+void MainThreadTaskQueue::UnregisterTaskQueue() {
+  if (renderer_scheduler_) {
+    // RendererScheduler can be null in tests.
+    renderer_scheduler_->OnUnregisterTaskQueue(this);
+  }
+  TaskQueue::UnregisterTaskQueue();
+}
+
+}  // namespace scheduler
+}  // namespace blink
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_task_queue.h b/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_task_queue.h
new file mode 100644
index 0000000..09bbe24
--- /dev/null
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_task_queue.h
@@ -0,0 +1,69 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_MAIN_THREAD_TASK_QUEUE_H_
+#define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_MAIN_THREAD_TASK_QUEUE_H_
+
+#include "platform/scheduler/base/task_queue.h"
+
+namespace blink {
+namespace scheduler {
+
+class RendererSchedulerImpl;
+
+class PLATFORM_EXPORT MainThreadTaskQueue : public TaskQueue {
+ public:
+  enum class QueueType {
+    // Keep MainThreadTaskQueue::NameForQueueType in sync.
+    // This enum is used for a histogram and it should not be re-numbered.
+    CONTROL = 0,
+    DEFAULT = 1,
+    DEFAULT_LOADING = 2,
+    DEFAULT_TIMER = 3,
+    UNTHROTTLED = 4,
+    FRAME_LOADING = 5,
+    FRAME_TIMER = 6,
+    FRAME_UNTHROTTLED = 7,
+    COMPOSITOR = 8,
+    IDLE = 9,
+    TEST = 10,
+
+    COUNT = 11
+  };
+
+  // Returns name of the given queue type. Returned string has application
+  // lifetime.
+  static const char* NameForQueueType(QueueType queue_type);
+
+  // Create spec with correct name for given type.
+  static TaskQueue::Spec CreateSpecForType(QueueType queue_type);
+
+  ~MainThreadTaskQueue() override;
+
+  QueueType queue_type() const { return queue_type_; }
+
+  void OnTaskCompleted(base::TimeTicks start, base::TimeTicks end);
+
+  // Override base method to notify RendererScheduler about unregistered queue.
+  void UnregisterTaskQueue() override;
+
+ private:
+  MainThreadTaskQueue(std::unique_ptr<internal::TaskQueueImpl> impl,
+                      QueueType queue_type,
+                      RendererSchedulerImpl* renderer_scheduler);
+
+  friend class TaskQueueManager;
+
+  QueueType queue_type_;
+
+  // Needed to notify renderer scheduler about completed tasks.
+  RendererSchedulerImpl* renderer_scheduler_;  // NOT OWNED
+
+  DISALLOW_COPY_AND_ASSIGN(MainThreadTaskQueue);
+};
+
+}  // namespace scheduler
+}  // namespace blink
+
+#endif  // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_MAIN_THREAD_TASK_QUEUE_H_
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
index c0dcae2..e5e244f 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
@@ -89,24 +89,30 @@
 
 RendererSchedulerImpl::RendererSchedulerImpl(
     scoped_refptr<SchedulerTqmDelegate> main_task_runner)
-    : helper_(main_task_runner),
-      idle_helper_(&helper_,
-                   this,
-                   "RendererSchedulerIdlePeriod",
-                   base::TimeDelta()),
+    : helper_(main_task_runner, this),
+      idle_helper_(
+          &helper_,
+          this,
+          "RendererSchedulerIdlePeriod",
+          base::TimeDelta(),
+          helper_.NewTaskQueue(MainThreadTaskQueue::QueueType::IDLE,
+                               MainThreadTaskQueue::CreateSpecForType(
+                                   MainThreadTaskQueue::QueueType::IDLE))),
       idle_canceled_delayed_task_sweeper_(&helper_,
                                           idle_helper_.IdleTaskRunner()),
       render_widget_scheduler_signals_(this),
-      control_task_queue_(helper_.ControlTaskQueue()),
+      control_task_queue_(helper_.ControlMainThreadTaskQueue()),
       compositor_task_queue_(
-          helper_.NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::COMPOSITOR)
+          helper_.NewTaskQueue(MainThreadTaskQueue::QueueType::COMPOSITOR,
+                               MainThreadTaskQueue::CreateSpecForType(
+                                   MainThreadTaskQueue::QueueType::COMPOSITOR)
                                    .SetShouldMonitorQuiescence(true))),
       compositor_task_queue_enabled_voter_(
           compositor_task_queue_->CreateQueueEnabledVoter()),
       delayed_update_policy_runner_(
           base::Bind(&RendererSchedulerImpl::UpdatePolicy,
                      base::Unretained(this)),
-          helper_.ControlTaskQueue()),
+          helper_.ControlMainThreadTaskQueue()),
       seqlock_queueing_time_estimator_(
           QueueingTimeEstimator(this, kQueueingTimeWindowDuration, 20)),
       main_thread_only_(this,
@@ -122,9 +128,9 @@
       &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr()));
 
   default_loading_task_queue_ =
-      NewLoadingTaskQueue(TaskQueue::QueueType::DEFAULT_LOADING);
+      NewLoadingTaskQueue(MainThreadTaskQueue::QueueType::DEFAULT_LOADING);
   default_timer_task_queue_ =
-      NewTimerTaskQueue(TaskQueue::QueueType::DEFAULT_TIMER);
+      NewTimerTaskQueue(MainThreadTaskQueue::QueueType::DEFAULT_TIMER);
 
   TRACE_EVENT_OBJECT_CREATED_WITH_ID(
       TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler",
@@ -173,7 +179,7 @@
 
 RendererSchedulerImpl::MainThreadOnly::MainThreadOnly(
     RendererSchedulerImpl* renderer_scheduler_impl,
-    const scoped_refptr<TaskQueue>& compositor_task_runner,
+    const scoped_refptr<MainThreadTaskQueue>& compositor_task_runner,
     base::TickClock* time_source,
     base::TimeTicks now)
     : loading_task_cost_estimator(time_source,
@@ -293,7 +299,7 @@
 
 scoped_refptr<base::SingleThreadTaskRunner>
 RendererSchedulerImpl::DefaultTaskRunner() {
-  return helper_.DefaultTaskQueue();
+  return helper_.DefaultMainThreadTaskQueue();
 }
 
 scoped_refptr<base::SingleThreadTaskRunner>
@@ -319,44 +325,46 @@
   return default_timer_task_queue_;
 }
 
-scoped_refptr<TaskQueue> RendererSchedulerImpl::DefaultTaskQueue() {
-  return helper_.DefaultTaskQueue();
+scoped_refptr<MainThreadTaskQueue> RendererSchedulerImpl::DefaultTaskQueue() {
+  return helper_.DefaultMainThreadTaskQueue();
 }
 
-scoped_refptr<TaskQueue> RendererSchedulerImpl::CompositorTaskQueue() {
+scoped_refptr<MainThreadTaskQueue>
+RendererSchedulerImpl::CompositorTaskQueue() {
   helper_.CheckOnValidThread();
   return compositor_task_queue_;
 }
 
-scoped_refptr<TaskQueue> RendererSchedulerImpl::LoadingTaskQueue() {
+scoped_refptr<MainThreadTaskQueue> RendererSchedulerImpl::LoadingTaskQueue() {
   helper_.CheckOnValidThread();
   return default_loading_task_queue_;
 }
 
-scoped_refptr<TaskQueue> RendererSchedulerImpl::TimerTaskQueue() {
+scoped_refptr<MainThreadTaskQueue> RendererSchedulerImpl::TimerTaskQueue() {
   helper_.CheckOnValidThread();
   return default_timer_task_queue_;
 }
 
-scoped_refptr<TaskQueue> RendererSchedulerImpl::ControlTaskQueue() {
+scoped_refptr<MainThreadTaskQueue> RendererSchedulerImpl::ControlTaskQueue() {
   helper_.CheckOnValidThread();
-  return helper_.ControlTaskQueue();
+  return helper_.ControlMainThreadTaskQueue();
 }
 
-scoped_refptr<TaskQueue> RendererSchedulerImpl::VirtualTimeControlTaskQueue() {
+scoped_refptr<MainThreadTaskQueue>
+RendererSchedulerImpl::VirtualTimeControlTaskQueue() {
   helper_.CheckOnValidThread();
   return virtual_time_control_task_queue_;
 }
 
-scoped_refptr<TaskQueue> RendererSchedulerImpl::NewLoadingTaskQueue(
-    TaskQueue::QueueType queue_type) {
+scoped_refptr<MainThreadTaskQueue> RendererSchedulerImpl::NewLoadingTaskQueue(
+    MainThreadTaskQueue::QueueType queue_type) {
   helper_.CheckOnValidThread();
-  scoped_refptr<TaskQueue> loading_task_queue(helper_.NewTaskQueue(
-      TaskQueue::Spec(queue_type)
-          .SetShouldMonitorQuiescence(true)
-          .SetTimeDomain(GetMainThreadOnly().use_virtual_time
-                             ? GetVirtualTimeDomain()
-                             : nullptr)));
+  scoped_refptr<MainThreadTaskQueue> loading_task_queue(helper_.NewTaskQueue(
+      queue_type, MainThreadTaskQueue::CreateSpecForType(queue_type)
+                      .SetShouldMonitorQuiescence(true)
+                      .SetTimeDomain(GetMainThreadOnly().use_virtual_time
+                                         ? GetVirtualTimeDomain()
+                                         : nullptr)));
   auto insert_result = loading_task_runners_.insert(std::make_pair(
       loading_task_queue, loading_task_queue->CreateQueueEnabledVoter()));
   insert_result.first->second->SetQueueEnabled(
@@ -374,17 +382,17 @@
   return loading_task_queue;
 }
 
-scoped_refptr<TaskQueue> RendererSchedulerImpl::NewTimerTaskQueue(
-    TaskQueue::QueueType queue_type) {
+scoped_refptr<MainThreadTaskQueue> RendererSchedulerImpl::NewTimerTaskQueue(
+    MainThreadTaskQueue::QueueType queue_type) {
   helper_.CheckOnValidThread();
   // TODO(alexclarke): Consider using ApplyTaskQueuePolicy() for brevity.
-  scoped_refptr<TaskQueue> timer_task_queue(helper_.NewTaskQueue(
-      TaskQueue::Spec(queue_type)
-          .SetShouldMonitorQuiescence(true)
-          .SetShouldReportWhenExecutionBlocked(true)
-          .SetTimeDomain(GetMainThreadOnly().use_virtual_time
-                             ? GetVirtualTimeDomain()
-                             : nullptr)));
+  scoped_refptr<MainThreadTaskQueue> timer_task_queue(helper_.NewTaskQueue(
+      queue_type, MainThreadTaskQueue::CreateSpecForType(queue_type)
+                      .SetShouldMonitorQuiescence(true)
+                      .SetShouldReportWhenExecutionBlocked(true)
+                      .SetTimeDomain(GetMainThreadOnly().use_virtual_time
+                                         ? GetVirtualTimeDomain()
+                                         : nullptr)));
   auto insert_result = timer_task_runners_.insert(std::make_pair(
       timer_task_queue, timer_task_queue->CreateQueueEnabledVoter()));
   insert_result.first->second->SetQueueEnabled(
@@ -403,15 +411,17 @@
   return timer_task_queue;
 }
 
-scoped_refptr<TaskQueue> RendererSchedulerImpl::NewUnthrottledTaskQueue(
-    TaskQueue::QueueType queue_type) {
+scoped_refptr<MainThreadTaskQueue>
+RendererSchedulerImpl::NewUnthrottledTaskQueue(
+    MainThreadTaskQueue::QueueType queue_type) {
   helper_.CheckOnValidThread();
-  scoped_refptr<TaskQueue> unthrottled_task_queue(helper_.NewTaskQueue(
-      TaskQueue::Spec(queue_type)
-          .SetShouldMonitorQuiescence(true)
-          .SetTimeDomain(GetMainThreadOnly().use_virtual_time
-                             ? GetVirtualTimeDomain()
-                             : nullptr)));
+  scoped_refptr<MainThreadTaskQueue> unthrottled_task_queue(
+      helper_.NewTaskQueue(
+          queue_type, MainThreadTaskQueue::CreateSpecForType(queue_type)
+                          .SetShouldMonitorQuiescence(true)
+                          .SetTimeDomain(GetMainThreadOnly().use_virtual_time
+                                             ? GetVirtualTimeDomain()
+                                             : nullptr)));
   unthrottled_task_runners_.insert(unthrottled_task_queue);
   return unthrottled_task_queue;
 }
@@ -422,7 +432,7 @@
 }
 
 void RendererSchedulerImpl::OnUnregisterTaskQueue(
-    const scoped_refptr<TaskQueue>& task_queue) {
+    const scoped_refptr<MainThreadTaskQueue>& task_queue) {
   if (task_queue_throttler_)
     task_queue_throttler_->UnregisterTaskQueue(task_queue.get());
 
@@ -1272,7 +1282,7 @@
   // TODO(alexclarke): We shouldn't have to prioritize the default queue, but it
   // appears to be necessary since the order of loading tasks and IPCs (which
   // are mostly dispatched on the default queue) need to be preserved.
-  ApplyTaskQueuePolicy(helper_.DefaultTaskQueue().get(), nullptr,
+  ApplyTaskQueuePolicy(helper_.DefaultMainThreadTaskQueue().get(), nullptr,
                        GetMainThreadOnly().current_policy.default_queue_policy,
                        new_policy.default_queue_policy);
   if (GetMainThreadOnly().rail_mode_observer &&
@@ -1298,7 +1308,7 @@
 }
 
 void RendererSchedulerImpl::ApplyTaskQueuePolicy(
-    TaskQueue* task_queue,
+    MainThreadTaskQueue* task_queue,
     TaskQueue::QueueEnabledVoter* task_queue_enabled_voter,
     const TaskQueuePolicy& old_task_queue_policy,
     const TaskQueuePolicy& new_task_queue_policy) const {
@@ -1426,7 +1436,8 @@
   return true;
 }
 
-SchedulerHelper* RendererSchedulerImpl::GetSchedulerHelperForTesting() {
+MainThreadSchedulerHelper*
+RendererSchedulerImpl::GetSchedulerHelperForTesting() {
   return &helper_;
 }
 
@@ -1886,9 +1897,7 @@
     web_view_scheduler->ReportIntervention(message);
 }
 
-void RendererSchedulerImpl::OnTriedToExecuteBlockedTask(
-    const TaskQueue& queue,
-    const base::PendingTask& task) {
+void RendererSchedulerImpl::OnTriedToExecuteBlockedTask() {
   if (GetMainThreadOnly().current_use_case == UseCase::TOUCHSTART ||
       GetMainThreadOnly().longest_jank_free_task_duration <
           base::TimeDelta::FromMilliseconds(kRailsResponseTimeMillis) ||
@@ -1928,8 +1937,7 @@
   }
 }
 
-void RendererSchedulerImpl::WillProcessTask(TaskQueue* task_queue,
-                                            double start_time) {
+void RendererSchedulerImpl::WillProcessTask(double start_time) {
   base::TimeTicks start_time_ticks =
       MonotonicTimeInSecondsToTimeTicks(start_time);
   GetMainThreadOnly().current_task_start_time = start_time_ticks;
@@ -1938,26 +1946,24 @@
   seqlock_queueing_time_estimator_.seqlock.WriteEnd();
 }
 
-void RendererSchedulerImpl::DidProcessTask(TaskQueue* task_queue,
-                                           double start_time,
-                                           double end_time) {
+void RendererSchedulerImpl::DidProcessTask(double start_time, double end_time) {
   DCHECK_LE(start_time, end_time);
   // TODO(scheduler-dev): Remove conversions when Blink starts using
   // base::TimeTicks instead of doubles for time.
-  base::TimeTicks start_time_ticks =
-      MonotonicTimeInSecondsToTimeTicks(start_time);
   base::TimeTicks end_time_ticks = MonotonicTimeInSecondsToTimeTicks(end_time);
 
   seqlock_queueing_time_estimator_.seqlock.WriteBegin();
   seqlock_queueing_time_estimator_.data.OnTopLevelTaskCompleted(end_time_ticks);
   seqlock_queueing_time_estimator_.seqlock.WriteEnd();
+}
 
-  task_queue_throttler()->OnTaskRunTimeReported(task_queue, start_time_ticks,
-                                                end_time_ticks);
+void RendererSchedulerImpl::OnTaskCompleted(MainThreadTaskQueue* queue,
+                                            base::TimeTicks start,
+                                            base::TimeTicks end) {
+  task_queue_throttler()->OnTaskRunTimeReported(queue, start, end);
 
   // TODO(altimin): Per-page metrics should also be considered.
-  RecordTaskMetrics(task_queue->GetQueueType(), start_time_ticks,
-                    end_time_ticks);
+  RecordTaskMetrics(queue->queue_type(), start, end);
 }
 
 namespace {
@@ -1975,9 +1981,10 @@
 
 }  // namespace
 
-void RendererSchedulerImpl::RecordTaskMetrics(TaskQueue::QueueType queue_type,
-                                              base::TimeTicks start_time,
-                                              base::TimeTicks end_time) {
+void RendererSchedulerImpl::RecordTaskMetrics(
+    MainThreadTaskQueue::QueueType queue_type,
+    base::TimeTicks start_time,
+    base::TimeTicks end_time) {
   base::TimeDelta duration = end_time - start_time;
   if (duration > kLongTaskDiscardingThreshold)
     return;
@@ -1994,9 +2001,10 @@
 
   // TODO(altimin): See whether this metric is still useful after
   // adding RendererScheduler.TaskDurationPerQueueType.
-  UMA_HISTOGRAM_ENUMERATION("RendererScheduler.NumberOfTasksPerQueueType2",
-                            static_cast<int>(queue_type),
-                            static_cast<int>(TaskQueue::QueueType::COUNT));
+  UMA_HISTOGRAM_ENUMERATION(
+      "RendererScheduler.NumberOfTasksPerQueueType2",
+      static_cast<int>(queue_type),
+      static_cast<int>(MainThreadTaskQueue::QueueType::COUNT));
 
   GetMainThreadOnly().task_duration_reporter.RecordTask(queue_type, duration);
 
@@ -2171,12 +2179,15 @@
 
   // The |unthrottled_task_runners_| are not actively managed by UpdatePolicy().
   AutoAdvancingVirtualTimeDomain* time_domain = GetVirtualTimeDomain();
-  for (const scoped_refptr<TaskQueue>& task_queue : unthrottled_task_runners_)
+  for (const scoped_refptr<MainThreadTaskQueue>& task_queue :
+       unthrottled_task_runners_)
     task_queue->SetTimeDomain(time_domain);
 
   DCHECK(!virtual_time_control_task_queue_);
   virtual_time_control_task_queue_ =
-      helper_.NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::CONTROL));
+      helper_.NewTaskQueue(MainThreadTaskQueue::QueueType::CONTROL,
+                           MainThreadTaskQueue::CreateSpecForType(
+                               MainThreadTaskQueue::QueueType::CONTROL));
   virtual_time_control_task_queue_->SetQueuePriority(
       TaskQueue::CONTROL_PRIORITY);
   virtual_time_control_task_queue_->SetTimeDomain(time_domain);
@@ -2189,7 +2200,8 @@
 
   RealTimeDomain* time_domain = real_time_domain();
   // The |unthrottled_task_runners_| are not actively managed by UpdatePolicy().
-  for (const scoped_refptr<TaskQueue>& task_queue : unthrottled_task_runners_)
+  for (const scoped_refptr<MainThreadTaskQueue>& task_queue :
+       unthrottled_task_runners_)
     task_queue->SetTimeDomain(time_domain);
   virtual_time_control_task_queue_->UnregisterTaskQueue();
   virtual_time_control_task_queue_ = nullptr;
@@ -2210,7 +2222,8 @@
          now;
 }
 
-void RendererSchedulerImpl::AddQueueToWakeUpBudgetPool(TaskQueue* queue) {
+void RendererSchedulerImpl::AddQueueToWakeUpBudgetPool(
+    MainThreadTaskQueue* queue) {
   if (!GetMainThreadOnly().wake_up_budget_pool) {
     GetMainThreadOnly().wake_up_budget_pool =
         task_queue_throttler()->CreateWakeUpBudgetPool("renderer_wake_up_pool");
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.h b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.h
index c9929be..e14c904 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.h
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.h
@@ -20,9 +20,10 @@
 #include "platform/scheduler/base/thread_load_tracker.h"
 #include "platform/scheduler/child/idle_canceled_delayed_task_sweeper.h"
 #include "platform/scheduler/child/idle_helper.h"
-#include "platform/scheduler/child/scheduler_helper.h"
 #include "platform/scheduler/renderer/deadline_task_runner.h"
 #include "platform/scheduler/renderer/idle_time_estimator.h"
+#include "platform/scheduler/renderer/main_thread_scheduler_helper.h"
+#include "platform/scheduler/renderer/main_thread_task_queue.h"
 #include "platform/scheduler/renderer/render_widget_signals.h"
 #include "platform/scheduler/renderer/task_cost_estimator.h"
 #include "platform/scheduler/renderer/task_duration_metric_reporter.h"
@@ -46,7 +47,7 @@
 class PLATFORM_EXPORT RendererSchedulerImpl
     : public RendererScheduler,
       public IdleHelper::Delegate,
-      public SchedulerHelper::Observer,
+      public MainThreadSchedulerHelper::Observer,
       public RenderWidgetSignals::Observer,
       public TaskTimeObserver,
       public QueueingTimeEstimator::Client,
@@ -134,15 +135,11 @@
       bool has_visible_render_widget_with_touch_handler) override;
 
   // SchedulerHelper::Observer implementation:
-  void OnUnregisterTaskQueue(const scoped_refptr<TaskQueue>& queue) override;
-  void OnTriedToExecuteBlockedTask(const TaskQueue& queue,
-                                   const base::PendingTask& task) override;
+  void OnTriedToExecuteBlockedTask() override;
 
   // TaskTimeObserver implementation:
-  void WillProcessTask(TaskQueue* task_queue, double start_time) override;
-  void DidProcessTask(TaskQueue* task_queue,
-                      double start_time,
-                      double end_time) override;
+  void WillProcessTask(double start_time) override;
+  void DidProcessTask(double start_time, double end_time) override;
   void OnBeginNestedRunLoop() override;
 
   // QueueingTimeEstimator::Client implementation:
@@ -150,28 +147,30 @@
       base::TimeDelta queueing_time,
       base::TimeTicks window_start_time) override;
 
-  scoped_refptr<TaskQueue> DefaultTaskQueue();
-  scoped_refptr<TaskQueue> CompositorTaskQueue();
-  scoped_refptr<TaskQueue> LoadingTaskQueue();
-  scoped_refptr<TaskQueue> TimerTaskQueue();
+  scoped_refptr<MainThreadTaskQueue> DefaultTaskQueue();
+  scoped_refptr<MainThreadTaskQueue> CompositorTaskQueue();
+  scoped_refptr<MainThreadTaskQueue> LoadingTaskQueue();
+  scoped_refptr<MainThreadTaskQueue> TimerTaskQueue();
 
   // Returns a new loading task queue. This queue is intended for tasks related
   // to resource dispatch, foreground HTML parsing, etc...
-  scoped_refptr<TaskQueue> NewLoadingTaskQueue(TaskQueue::QueueType queue_type);
+  scoped_refptr<MainThreadTaskQueue> NewLoadingTaskQueue(
+      MainThreadTaskQueue::QueueType queue_type);
 
   // Returns a new timer task queue. This queue is intended for DOM Timers.
-  scoped_refptr<TaskQueue> NewTimerTaskQueue(TaskQueue::QueueType queue_type);
+  scoped_refptr<MainThreadTaskQueue> NewTimerTaskQueue(
+      MainThreadTaskQueue::QueueType queue_type);
 
   // Returns a task queue for tasks which should never get throttled.
-  scoped_refptr<TaskQueue> NewUnthrottledTaskQueue(
-      TaskQueue::QueueType queue_type);
+  scoped_refptr<MainThreadTaskQueue> NewUnthrottledTaskQueue(
+      MainThreadTaskQueue::QueueType queue_type);
 
   // Returns a task queue where tasks run at the highest possible priority.
-  scoped_refptr<TaskQueue> ControlTaskQueue();
+  scoped_refptr<MainThreadTaskQueue> ControlTaskQueue();
 
   // A control task queue which also respects virtual time. Only available if
   // virtual time has been enabled.
-  scoped_refptr<TaskQueue> VirtualTimeControlTaskQueue();
+  scoped_refptr<MainThreadTaskQueue> VirtualTimeControlTaskQueue();
 
   void RegisterTimeDomain(TimeDomain* time_domain);
   void UnregisterTimeDomain(TimeDomain* time_domain);
@@ -207,7 +206,7 @@
                                 bool is_main_frame);
 
   // Test helpers.
-  SchedulerHelper* GetSchedulerHelperForTesting();
+  MainThreadSchedulerHelper* GetSchedulerHelperForTesting();
   TaskCostEstimator* GetLoadingTaskCostEstimatorForTesting();
   TaskCostEstimator* GetTimerTaskCostEstimatorForTesting();
   IdleTimeEstimator* GetIdleTimeEstimatorForTesting();
@@ -234,6 +233,12 @@
 
   void OnFirstMeaningfulPaint();
 
+  void OnUnregisterTaskQueue(const scoped_refptr<MainThreadTaskQueue>& queue);
+
+  void OnTaskCompleted(MainThreadTaskQueue* queue,
+                       base::TimeTicks start,
+                       base::TimeTicks end);
+
   // base::trace_event::TraceLog::EnabledStateObserver implementation:
   void OnTraceLogEnabled() override;
   void OnTraceLogDisabled() override;
@@ -416,7 +421,7 @@
   void BroadcastIntervention(const std::string& message);
 
   void ApplyTaskQueuePolicy(
-      TaskQueue* task_queue,
+      MainThreadTaskQueue* task_queue,
       TaskQueue::QueueEnabledVoter* task_queue_enabled_voter,
       const TaskQueuePolicy& old_task_queue_policy,
       const TaskQueuePolicy& new_task_queue_policy) const;
@@ -426,33 +431,33 @@
 
   bool ShouldDisableThrottlingBecauseOfAudio(base::TimeTicks now);
 
-  void AddQueueToWakeUpBudgetPool(TaskQueue* queue);
+  void AddQueueToWakeUpBudgetPool(MainThreadTaskQueue* queue);
 
-  void RecordTaskMetrics(TaskQueue::QueueType queue_type,
+  void RecordTaskMetrics(MainThreadTaskQueue::QueueType queue_type,
                          base::TimeTicks start_time,
                          base::TimeTicks end_time);
 
-  SchedulerHelper helper_;
+  MainThreadSchedulerHelper helper_;
   IdleHelper idle_helper_;
   IdleCanceledDelayedTaskSweeper idle_canceled_delayed_task_sweeper_;
   std::unique_ptr<TaskQueueThrottler> task_queue_throttler_;
   RenderWidgetSignals render_widget_scheduler_signals_;
 
-  const scoped_refptr<TaskQueue> control_task_queue_;
-  const scoped_refptr<TaskQueue> compositor_task_queue_;
-  scoped_refptr<TaskQueue> virtual_time_control_task_queue_;
+  const scoped_refptr<MainThreadTaskQueue> control_task_queue_;
+  const scoped_refptr<MainThreadTaskQueue> compositor_task_queue_;
+  scoped_refptr<MainThreadTaskQueue> virtual_time_control_task_queue_;
   std::unique_ptr<TaskQueue::QueueEnabledVoter>
       compositor_task_queue_enabled_voter_;
 
   using TaskQueueVoterMap =
-      std::map<scoped_refptr<TaskQueue>,
+      std::map<scoped_refptr<MainThreadTaskQueue>,
                std::unique_ptr<TaskQueue::QueueEnabledVoter>>;
 
   TaskQueueVoterMap loading_task_runners_;
   TaskQueueVoterMap timer_task_runners_;
-  std::set<scoped_refptr<TaskQueue>> unthrottled_task_runners_;
-  scoped_refptr<TaskQueue> default_loading_task_queue_;
-  scoped_refptr<TaskQueue> default_timer_task_queue_;
+  std::set<scoped_refptr<MainThreadTaskQueue>> unthrottled_task_runners_;
+  scoped_refptr<MainThreadTaskQueue> default_loading_task_queue_;
+  scoped_refptr<MainThreadTaskQueue> default_timer_task_queue_;
 
   // Note |virtual_time_domain_| is lazily created.
   std::unique_ptr<AutoAdvancingVirtualTimeDomain> virtual_time_domain_;
@@ -471,10 +476,11 @@
   // (the accessors) for the following data members.
 
   struct MainThreadOnly {
-    MainThreadOnly(RendererSchedulerImpl* renderer_scheduler_impl,
-                   const scoped_refptr<TaskQueue>& compositor_task_runner,
-                   base::TickClock* time_source,
-                   base::TimeTicks now);
+    MainThreadOnly(
+        RendererSchedulerImpl* renderer_scheduler_impl,
+        const scoped_refptr<MainThreadTaskQueue>& compositor_task_runner,
+        base::TickClock* time_source,
+        base::TimeTicks now);
     ~MainThreadOnly();
 
     TaskCostEstimator loading_task_cost_estimator;
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl_unittest.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl_unittest.cc
index 556ffba..9d0c2094 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl_unittest.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl_unittest.cc
@@ -563,8 +563,8 @@
     double start = (clock_->NowTicks() - base::TimeTicks()).InSecondsF();
     clock_->Advance(base::TimeDelta::FromSecondsD(duration));
     double end = (clock_->NowTicks() - base::TimeTicks()).InSecondsF();
-    scheduler_->WillProcessTask(scheduler_->TimerTaskQueue().get(), start);
-    scheduler_->DidProcessTask(scheduler_->TimerTaskQueue().get(), start, end);
+    scheduler_->WillProcessTask(start);
+    scheduler_->DidProcessTask(start, end);
   }
 
   void GetQueueingTimeEstimatorLock() {
@@ -3702,7 +3702,8 @@
   // task runner.
   SimulateCompositorGestureStart(TouchEventPolicy::SEND_TOUCH_START);
   scoped_refptr<TaskQueue> unthrottled_task_runner =
-      scheduler_->NewUnthrottledTaskQueue(TaskQueue::QueueType::UNTHROTTLED);
+      scheduler_->NewUnthrottledTaskQueue(
+          MainThreadTaskQueue::QueueType::UNTHROTTLED);
 
   size_t timer_count = 0;
   size_t unthrottled_count = 0;
@@ -3746,11 +3747,11 @@
   scheduler_->EnableVirtualTime();
 
   scoped_refptr<TaskQueue> loading_tq =
-      scheduler_->NewLoadingTaskQueue(TaskQueue::QueueType::TEST);
+      scheduler_->NewLoadingTaskQueue(MainThreadTaskQueue::QueueType::TEST);
   scoped_refptr<TaskQueue> timer_tq =
-      scheduler_->NewTimerTaskQueue(TaskQueue::QueueType::TEST);
+      scheduler_->NewTimerTaskQueue(MainThreadTaskQueue::QueueType::TEST);
   scoped_refptr<TaskQueue> unthrottled_tq =
-      scheduler_->NewUnthrottledTaskQueue(TaskQueue::QueueType::TEST);
+      scheduler_->NewUnthrottledTaskQueue(MainThreadTaskQueue::QueueType::TEST);
 
   EXPECT_EQ(scheduler_->DefaultTaskQueue()->GetTimeDomain(),
             scheduler_->GetVirtualTimeDomain());
@@ -3772,24 +3773,26 @@
   EXPECT_EQ(unthrottled_tq->GetTimeDomain(),
             scheduler_->GetVirtualTimeDomain());
 
-  EXPECT_EQ(scheduler_->NewLoadingTaskQueue(TaskQueue::QueueType::TEST)
+  EXPECT_EQ(
+      scheduler_->NewLoadingTaskQueue(MainThreadTaskQueue::QueueType::TEST)
+          ->GetTimeDomain(),
+      scheduler_->GetVirtualTimeDomain());
+  EXPECT_EQ(scheduler_->NewTimerTaskQueue(MainThreadTaskQueue::QueueType::TEST)
                 ->GetTimeDomain(),
             scheduler_->GetVirtualTimeDomain());
-  EXPECT_EQ(scheduler_->NewTimerTaskQueue(TaskQueue::QueueType::TEST)
-                ->GetTimeDomain(),
-            scheduler_->GetVirtualTimeDomain());
-  EXPECT_EQ(scheduler_->NewUnthrottledTaskQueue(TaskQueue::QueueType::TEST)
-                ->GetTimeDomain(),
-            scheduler_->GetVirtualTimeDomain());
+  EXPECT_EQ(
+      scheduler_->NewUnthrottledTaskQueue(MainThreadTaskQueue::QueueType::TEST)
+          ->GetTimeDomain(),
+      scheduler_->GetVirtualTimeDomain());
 }
 
 TEST_F(RendererSchedulerImplTest, DisableVirtualTimeForTesting) {
   scheduler_->EnableVirtualTime();
 
   scoped_refptr<TaskQueue> timer_tq =
-      scheduler_->NewTimerTaskQueue(TaskQueue::QueueType::TEST);
+      scheduler_->NewTimerTaskQueue(MainThreadTaskQueue::QueueType::TEST);
   scoped_refptr<TaskQueue> unthrottled_tq =
-      scheduler_->NewUnthrottledTaskQueue(TaskQueue::QueueType::TEST);
+      scheduler_->NewUnthrottledTaskQueue(MainThreadTaskQueue::QueueType::TEST);
 
   scheduler_->DisableVirtualTimeForTesting();
   EXPECT_EQ(scheduler_->DefaultTaskQueue()->GetTimeDomain(),
@@ -3931,7 +3934,6 @@
       scheduler_->MainThreadSeemsUnresponsive(responsiveness_threshold()));
   clock_->Advance(base::TimeDelta::FromSecondsD(2));
   scheduler_->WillProcessTask(
-      scheduler_->TimerTaskQueue().get(),
       (clock_->NowTicks() - base::TimeTicks()).InSecondsF());
   EXPECT_FALSE(
       scheduler_->MainThreadSeemsUnresponsive(responsiveness_threshold()));
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/task_duration_metric_reporter.cc b/third_party/WebKit/Source/platform/scheduler/renderer/task_duration_metric_reporter.cc
index d0f1f45..49f004a 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/task_duration_metric_reporter.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/task_duration_metric_reporter.cc
@@ -13,8 +13,8 @@
     : TaskDurationMetricReporter(base::Histogram::FactoryGet(
           metric_name,
           1,
-          static_cast<int>(TaskQueue::QueueType::COUNT),
-          static_cast<int>(TaskQueue::QueueType::COUNT) + 1,
+          static_cast<int>(MainThreadTaskQueue::QueueType::COUNT),
+          static_cast<int>(MainThreadTaskQueue::QueueType::COUNT) + 1,
           base::HistogramBase::kUmaTargetedHistogramFlag)) {}
 
 TaskDurationMetricReporter::TaskDurationMetricReporter(
@@ -23,8 +23,9 @@
 
 TaskDurationMetricReporter::~TaskDurationMetricReporter() {}
 
-void TaskDurationMetricReporter::RecordTask(TaskQueue::QueueType queue_type,
-                                            base::TimeDelta duration) {
+void TaskDurationMetricReporter::RecordTask(
+    MainThreadTaskQueue::QueueType queue_type,
+    base::TimeDelta duration) {
   // Report only whole milliseconds to avoid overflow.
   base::TimeDelta& unreported_duration =
       unreported_task_duration_[static_cast<int>(queue_type)];
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/task_duration_metric_reporter.h b/third_party/WebKit/Source/platform/scheduler/renderer/task_duration_metric_reporter.h
index f305e7f..c5790c38 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/task_duration_metric_reporter.h
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/task_duration_metric_reporter.h
@@ -11,7 +11,7 @@
 #include "base/macros.h"
 #include "base/time/time.h"
 #include "platform/PlatformExport.h"
-#include "platform/scheduler/base/task_queue.h"
+#include "platform/scheduler/renderer/main_thread_task_queue.h"
 
 namespace base {
 class HistogramBase;
@@ -27,7 +27,7 @@
   explicit TaskDurationMetricReporter(const char* metric_name);
   ~TaskDurationMetricReporter();
 
-  void RecordTask(TaskQueue::QueueType queue_type,
+  void RecordTask(MainThreadTaskQueue::QueueType queue_type,
                   base::TimeDelta time_duration);
 
  private:
@@ -35,7 +35,8 @@
 
   TaskDurationMetricReporter(base::HistogramBase* histogram);
 
-  std::array<base::TimeDelta, static_cast<size_t>(TaskQueue::QueueType::COUNT)>
+  std::array<base::TimeDelta,
+             static_cast<size_t>(MainThreadTaskQueue::QueueType::COUNT)>
       unreported_task_duration_;
   base::HistogramBase* task_duration_per_queue_type_histogram_;
 
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/task_duration_metric_reporter_unittest.cc b/third_party/WebKit/Source/platform/scheduler/renderer/task_duration_metric_reporter_unittest.cc
index 4e7a63f..be6a216d 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/task_duration_metric_reporter_unittest.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/task_duration_metric_reporter_unittest.cc
@@ -57,22 +57,22 @@
   TaskDurationMetricReporter metric_reporter(&histogram);
 
   EXPECT_CALL(histogram, AddCount(2, 3));
-  metric_reporter.RecordTask(static_cast<TaskQueue::QueueType>(2),
+  metric_reporter.RecordTask(static_cast<MainThreadTaskQueue::QueueType>(2),
                              base::TimeDelta::FromMicroseconds(3400));
   Mock::VerifyAndClearExpectations(&histogram);
 
   EXPECT_CALL(histogram, AddCount(_, _)).Times(0);
-  metric_reporter.RecordTask(static_cast<TaskQueue::QueueType>(2),
+  metric_reporter.RecordTask(static_cast<MainThreadTaskQueue::QueueType>(2),
                              base::TimeDelta::FromMicroseconds(300));
   Mock::VerifyAndClearExpectations(&histogram);
 
   EXPECT_CALL(histogram, AddCount(2, 1));
-  metric_reporter.RecordTask(static_cast<TaskQueue::QueueType>(2),
+  metric_reporter.RecordTask(static_cast<MainThreadTaskQueue::QueueType>(2),
                              base::TimeDelta::FromMicroseconds(800));
   Mock::VerifyAndClearExpectations(&histogram);
 
   EXPECT_CALL(histogram, AddCount(2, 16));
-  metric_reporter.RecordTask(static_cast<TaskQueue::QueueType>(2),
+  metric_reporter.RecordTask(static_cast<MainThreadTaskQueue::QueueType>(2),
                              base::TimeDelta::FromMicroseconds(15600));
   Mock::VerifyAndClearExpectations(&histogram);
 }
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler_unittest.cc b/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler_unittest.cc
index cd39aa3..80f44e3 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler_unittest.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler_unittest.cc
@@ -52,16 +52,6 @@
   }
 }
 
-bool IsQueueBlocked(TaskQueue* task_queue) {
-  internal::TaskQueueImpl* task_queue_impl =
-      reinterpret_cast<internal::TaskQueueImpl*>(task_queue);
-  if (!task_queue_impl->IsQueueEnabled())
-    return true;
-  return task_queue_impl->GetFenceForTest() ==
-         static_cast<internal::EnqueueOrder>(
-             internal::EnqueueOrderValues::BLOCKING_FENCE);
-}
-
 // Test clock which simulates passage of time by automatically
 // advancing time with each call to Now().
 class AutoAdvancingTestClock : public base::SimpleTestTickClock {
@@ -99,7 +89,8 @@
         mock_task_runner_, base::MakeUnique<TestTimeSource>(clock_.get()));
     scheduler_.reset(new RendererSchedulerImpl(delegate_));
     task_queue_throttler_ = scheduler_->task_queue_throttler();
-    timer_queue_ = scheduler_->NewTimerTaskQueue(TaskQueue::QueueType::TEST);
+    timer_queue_ =
+        scheduler_->NewTimerTaskQueue(MainThreadTaskQueue::QueueType::TEST);
   }
 
   void TearDown() override {
@@ -130,6 +121,15 @@
     mock_task_runner_->RunUntilIdle();
   }
 
+  bool IsQueueBlocked(TaskQueue* task_queue) {
+    internal::TaskQueueImpl* task_queue_impl = task_queue->GetTaskQueueImpl();
+    if (!task_queue_impl->IsQueueEnabled())
+      return true;
+    return task_queue_impl->GetFenceForTest() ==
+           static_cast<internal::EnqueueOrder>(
+               internal::EnqueueOrderValues::BLOCKING_FENCE);
+  }
+
  protected:
   virtual std::unique_ptr<AutoAdvancingTestClock> CreateClock() {
     return base::MakeUnique<AutoAdvancingTestClock>(base::TimeDelta());
@@ -745,7 +745,7 @@
   std::vector<base::TimeTicks> run_times;
 
   scoped_refptr<TaskQueue> second_queue =
-      scheduler_->NewTimerTaskQueue(TaskQueue::QueueType::TEST);
+      scheduler_->NewTimerTaskQueue(MainThreadTaskQueue::QueueType::TEST);
 
   CPUTimeBudgetPool* pool =
       task_queue_throttler_->CreateCPUTimeBudgetPool("test");
@@ -1070,7 +1070,7 @@
   std::vector<base::TimeTicks> run_times;
 
   scoped_refptr<TaskQueue> second_queue =
-      scheduler_->NewTimerTaskQueue(TaskQueue::QueueType::TEST);
+      scheduler_->NewTimerTaskQueue(MainThreadTaskQueue::QueueType::TEST);
 
   task_queue_throttler_->IncreaseThrottleRefCount(timer_queue_.get());
   task_queue_throttler_->IncreaseThrottleRefCount(second_queue.get());
@@ -1106,7 +1106,7 @@
   std::vector<base::TimeTicks> run_times;
 
   scoped_refptr<TaskQueue> second_queue =
-      scheduler_->NewTimerTaskQueue(TaskQueue::QueueType::TEST);
+      scheduler_->NewTimerTaskQueue(MainThreadTaskQueue::QueueType::TEST);
 
   CPUTimeBudgetPool* pool1 =
       task_queue_throttler_->CreateCPUTimeBudgetPool("test");
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.cc
index 15094cd..35341de 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.cc
@@ -147,7 +147,7 @@
   DCHECK(parent_web_view_scheduler_);
   if (!loading_web_task_runner_) {
     loading_task_queue_ = renderer_scheduler_->NewLoadingTaskQueue(
-        TaskQueue::QueueType::FRAME_LOADING);
+        MainThreadTaskQueue::QueueType::FRAME_LOADING);
     loading_task_queue_->SetBlameContext(blame_context_);
     loading_queue_enabled_voter_ =
         loading_task_queue_->CreateQueueEnabledVoter();
@@ -161,7 +161,7 @@
   DCHECK(parent_web_view_scheduler_);
   if (!timer_web_task_runner_) {
     timer_task_queue_ = renderer_scheduler_->NewTimerTaskQueue(
-        TaskQueue::QueueType::FRAME_TIMER);
+        MainThreadTaskQueue::QueueType::FRAME_TIMER);
     timer_task_queue_->SetBlameContext(blame_context_);
     timer_queue_enabled_voter_ = timer_task_queue_->CreateQueueEnabledVoter();
     timer_queue_enabled_voter_->SetQueueEnabled(!frame_suspended_);
@@ -188,7 +188,7 @@
     // TODO(altimin): Split FRAME_UNTHROTTLED into FRAME_UNTHROTTLED and
     // FRAME_UNSUSPENDED.
     suspendable_task_queue_ = renderer_scheduler_->NewTimerTaskQueue(
-        TaskQueue::QueueType::FRAME_UNTHROTTLED);
+        MainThreadTaskQueue::QueueType::FRAME_UNTHROTTLED);
     suspendable_task_queue_->SetBlameContext(blame_context_);
     suspendable_web_task_runner_ =
         WebTaskRunnerImpl::Create(suspendable_task_queue_);
@@ -203,7 +203,7 @@
   DCHECK(parent_web_view_scheduler_);
   if (!unthrottled_web_task_runner_) {
     unthrottled_task_queue_ = renderer_scheduler_->NewUnthrottledTaskQueue(
-        TaskQueue::QueueType::FRAME_UNTHROTTLED);
+        MainThreadTaskQueue::QueueType::FRAME_UNTHROTTLED);
     unthrottled_task_queue_->SetBlameContext(blame_context_);
     unthrottled_web_task_runner_ =
         WebTaskRunnerImpl::Create(unthrottled_task_queue_);
@@ -217,7 +217,7 @@
   if (!unthrottled_but_blockable_web_task_runner_) {
     unthrottled_but_blockable_task_queue_ =
         renderer_scheduler_->NewTimerTaskQueue(
-            TaskQueue::QueueType::FRAME_UNTHROTTLED);
+            MainThreadTaskQueue::QueueType::FRAME_UNTHROTTLED);
     unthrottled_but_blockable_task_queue_->SetBlameContext(blame_context_);
     unthrottled_but_blockable_web_task_runner_ =
         WebTaskRunnerImpl::Create(unthrottled_but_blockable_task_queue_);
diff --git a/third_party/WebKit/Source/platform/scheduler/test/test_task_queue.cc b/third_party/WebKit/Source/platform/scheduler/test/test_task_queue.cc
new file mode 100644
index 0000000..53338a6
--- /dev/null
+++ b/third_party/WebKit/Source/platform/scheduler/test/test_task_queue.cc
@@ -0,0 +1,18 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "platform/scheduler/test/test_task_queue.h"
+
+#include "platform/scheduler/base/task_queue_impl.h"
+
+namespace blink {
+namespace scheduler {
+
+TestTaskQueue::TestTaskQueue(std::unique_ptr<internal::TaskQueueImpl> impl)
+    : TaskQueue(std::move(impl)) {}
+
+TestTaskQueue::~TestTaskQueue() {}
+
+}  // namespace scheduler
+}  // namespace blink
diff --git a/third_party/WebKit/Source/platform/scheduler/test/test_task_queue.h b/third_party/WebKit/Source/platform/scheduler/test/test_task_queue.h
new file mode 100644
index 0000000..260979f
--- /dev/null
+++ b/third_party/WebKit/Source/platform/scheduler/test/test_task_queue.h
@@ -0,0 +1,24 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_TEST_TEST_TASK_QUEUE_H_
+#define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_TEST_TEST_TASK_QUEUE_H_
+
+#include "platform/scheduler/base/task_queue.h"
+
+namespace blink {
+namespace scheduler {
+
+class TestTaskQueue : public TaskQueue {
+ public:
+  explicit TestTaskQueue(std::unique_ptr<internal::TaskQueueImpl> impl);
+  ~TestTaskQueue() override;
+
+  using TaskQueue::GetTaskQueueImpl;
+};
+
+}  // namespace scheduler
+}  // namespace blink
+
+#endif  // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_TEST_TEST_TASK_QUEUE_H_
diff --git a/third_party/WebKit/Source/platform/testing/PictureMatchers.cpp b/third_party/WebKit/Source/platform/testing/PictureMatchers.cpp
index f39a0bf..07567bd 100644
--- a/third_party/WebKit/Source/platform/testing/PictureMatchers.cpp
+++ b/third_party/WebKit/Source/platform/testing/PictureMatchers.cpp
@@ -17,11 +17,6 @@
 
 namespace {
 
-struct QuadWithColor {
-  FloatQuad quad;
-  Color color;
-};
-
 class DrawsRectangleCanvas : public SkCanvas {
  public:
   DrawsRectangleCanvas()
@@ -29,26 +24,27 @@
         save_count_(0),
         alpha_(255),
         alpha_save_layer_count_(-1) {}
-  const Vector<QuadWithColor>& QuadsWithColor() const { return quads_; }
+  const Vector<RectWithColor>& RectsWithColor() const { return rects_; }
 
   void onDrawRect(const SkRect& rect, const SkPaint& paint) override {
-    SkRect clipped_rect(rect);
-    for (Vector<ClipAndIndex>::const_reverse_iterator clip = clips_.rbegin();
-         clip != clips_.rend(); clip++) {
-      if (SkRect::Intersects(rect, clip->rect))
-        CHECK(clipped_rect.intersect(clip->rect));
-    }
     SkPoint quad[4];
-    getTotalMatrix().mapRectToQuad(quad, clipped_rect);
-    QuadWithColor quad_with_color;
-    quad_with_color.quad = FloatQuad(quad);
+    getTotalMatrix().mapRectToQuad(quad, rect);
+
+    SkRect device_rect;
+    device_rect.set(quad, 4);
+    SkIRect device_clip_bounds;
+    FloatRect clipped_rect;
+    if (getDeviceClipBounds(&device_clip_bounds) &&
+        device_rect.intersect(SkRect::Make(device_clip_bounds)))
+      clipped_rect = device_rect;
 
     unsigned paint_alpha = static_cast<unsigned>(paint.getAlpha());
     SkPaint paint_with_alpha(paint);
     paint_with_alpha.setAlpha(static_cast<U8CPU>(alpha_ * paint_alpha / 255));
-    quad_with_color.color = Color(paint_with_alpha.getColor());
-    quads_.push_back(quad_with_color);
-    SkCanvas::onDrawRect(clipped_rect, paint);
+    Color color = Color(paint_with_alpha.getColor());
+
+    rects_.emplace_back(clipped_rect, color);
+    SkCanvas::onDrawRect(rect, paint);
   }
 
   SkCanvas::SaveLayerStrategy getSaveLayerStrategy(
@@ -70,8 +66,6 @@
 
   void willRestore() override {
     DCHECK_GT(save_count_, 0);
-    if (clips_.size() && save_count_ == clips_.back().save_count)
-      clips_.pop_back();
     if (alpha_save_layer_count_ == save_count_) {
       alpha_ = 255;
       alpha_save_layer_count_ = -1;
@@ -80,24 +74,8 @@
     SkCanvas::willRestore();
   }
 
-  void onClipRect(const SkRect& rect,
-                  SkClipOp op,
-                  ClipEdgeStyle style) override {
-    ClipAndIndex clip_struct;
-    clip_struct.rect = rect;
-    clip_struct.save_count = save_count_;
-    clips_.push_back(clip_struct);
-    SkCanvas::onClipRect(rect, op, style);
-  }
-
-  struct ClipAndIndex {
-    SkRect rect;
-    int save_count;
-  };
-
  private:
-  Vector<QuadWithColor> quads_;
-  Vector<ClipAndIndex> clips_;
+  Vector<RectWithColor> rects_;
   int save_count_;
   unsigned alpha_;
   int alpha_save_layer_count_;
@@ -114,24 +92,24 @@
       ::testing::MatchResultListener* listener) const override {
     DrawsRectangleCanvas canvas;
     picture.playback(&canvas);
-    const auto& quads = canvas.QuadsWithColor();
-    if (quads.size() != rects_with_color_.size()) {
-      *listener << "which draws " << quads.size() << " quads";
+    const auto& actual_rects = canvas.RectsWithColor();
+    if (actual_rects.size() != rects_with_color_.size()) {
+      *listener << "which draws " << actual_rects.size() << " rects";
       return false;
     }
 
-    for (unsigned index = 0; index < quads.size(); index++) {
-      const auto& quad_with_color = quads[index];
-      const auto& rect_with_color = rects_with_color_[index];
+    for (unsigned index = 0; index < actual_rects.size(); index++) {
+      const auto& actual_rect_with_color = actual_rects[index];
+      const auto& expect_rect_with_color = rects_with_color_[index];
 
-      const FloatRect& rect = quad_with_color.quad.BoundingBox();
-      if (EnclosingIntRect(rect) != EnclosingIntRect(rect_with_color.rect) ||
-          quad_with_color.color != rect_with_color.color) {
+      if (EnclosingIntRect(actual_rect_with_color.rect) !=
+              EnclosingIntRect(expect_rect_with_color.rect) ||
+          actual_rect_with_color.color != expect_rect_with_color.color) {
         if (listener->IsInterested()) {
           *listener << "at index " << index << " which draws ";
-          PrintTo(rect, listener->stream());
+          PrintTo(actual_rect_with_color.rect, listener->stream());
           *listener << " with color "
-                    << quad_with_color.color.Serialized().Ascii().data()
+                    << actual_rect_with_color.color.Serialized().Ascii().data()
                     << "\n";
         }
         return false;
diff --git a/third_party/WebKit/Source/platform/wtf/HashMap.h b/third_party/WebKit/Source/platform/wtf/HashMap.h
index 2eb7921..cdc1d92 100644
--- a/third_party/WebKit/Source/platform/wtf/HashMap.h
+++ b/third_party/WebKit/Source/platform/wtf/HashMap.h
@@ -39,8 +39,9 @@
 };
 
 // Note: empty or deleted key values are not allowed, using them may lead to
-// undefined behavior.  For pointer keys this means that null pointers are not
-// allowed unless you supply custom key traits.
+// undefined behavior. For pointer keys this means that null pointers are not
+// allowed; for integer keys 0 or -1 can't be used as a key. This restriction
+// can be lifted if you supply custom key traits.
 template <typename KeyArg,
           typename MappedArg,
           typename HashArg = typename DefaultHash<KeyArg>::Hash,
diff --git a/third_party/WebKit/Source/platform/wtf/HashSet.h b/third_party/WebKit/Source/platform/wtf/HashSet.h
index 1729e0d8..b4c11c8 100644
--- a/third_party/WebKit/Source/platform/wtf/HashSet.h
+++ b/third_party/WebKit/Source/platform/wtf/HashSet.h
@@ -30,8 +30,9 @@
 struct IdentityExtractor;
 
 // Note: empty or deleted values are not allowed, using them may lead to
-// undefined behavior.  For pointer valuess this means that null pointers are
-// not allowed unless you supply custom traits.
+// undefined behavior. For pointer keys this means that null pointers are not
+// allowed; for integer keys 0 or -1 can't be used as a key. This restriction
+// can be lifted if you supply custom key traits.
 template <typename ValueArg,
           typename HashArg = typename DefaultHash<ValueArg>::Hash,
           typename TraitsArg = HashTraits<ValueArg>,
diff --git a/third_party/WebKit/Source/web/WebFactoryImpl.cpp b/third_party/WebKit/Source/web/WebFactoryImpl.cpp
index 0a76029..45d9449 100644
--- a/third_party/WebKit/Source/web/WebFactoryImpl.cpp
+++ b/third_party/WebKit/Source/web/WebFactoryImpl.cpp
@@ -26,19 +26,18 @@
 WebLocalFrameBase* WebFactoryImpl::CreateMainWebLocalFrameBase(
     WebView* web_view,
     WebFrameClient* client,
-    InterfaceProvider* provider,
     InterfaceRegistry* registry) const {
-  return WebLocalFrameImpl::CreateMainFrame(web_view, client, provider,
-                                            registry, nullptr, g_empty_atom,
+  return WebLocalFrameImpl::CreateMainFrame(web_view, client, registry, nullptr,
+                                            g_empty_atom,
                                             WebSandboxFlags::kNone);
 }
 
 WebLocalFrameBase* WebFactoryImpl::CreateWebLocalFrameBase(
     WebTreeScopeType type,
     WebFrameClient* client,
-    InterfaceProvider* provider,
     InterfaceRegistry* registry,
     WebFrame* opener) const {
-  return WebLocalFrameImpl::Create(type, client, provider, registry, opener);
+  return WebLocalFrameImpl::Create(type, client, registry, opener);
 }
-}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/web/WebFactoryImpl.h b/third_party/WebKit/Source/web/WebFactoryImpl.h
index 674a7a5d..9219769 100644
--- a/third_party/WebKit/Source/web/WebFactoryImpl.h
+++ b/third_party/WebKit/Source/web/WebFactoryImpl.h
@@ -24,11 +24,9 @@
   WebLocalFrameBase* CreateMainWebLocalFrameBase(
       WebView*,
       WebFrameClient*,
-      InterfaceProvider*,
       InterfaceRegistry*) const override;
   WebLocalFrameBase* CreateWebLocalFrameBase(WebTreeScopeType,
                                              WebFrameClient*,
-                                             InterfaceProvider*,
                                              InterfaceRegistry*,
                                              WebFrame* opener) const override;
 };
diff --git a/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp b/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
index f6317cf7..13dec4e 100644
--- a/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
+++ b/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
@@ -1496,36 +1496,31 @@
 WebLocalFrame* WebLocalFrame::CreateMainFrame(
     WebView* web_view,
     WebFrameClient* client,
-    InterfaceProvider* interface_provider,
     InterfaceRegistry* interface_registry,
     WebFrame* opener,
     const WebString& name,
     WebSandboxFlags sandbox_flags) {
   return WebLocalFrameImpl::CreateMainFrame(
-      web_view, client, interface_provider, interface_registry, opener, name,
-      sandbox_flags);
+      web_view, client, interface_registry, opener, name, sandbox_flags);
 }
 
 WebLocalFrame* WebLocalFrame::CreateProvisional(
     WebFrameClient* client,
-    InterfaceProvider* interface_provider,
     InterfaceRegistry* interface_registry,
     WebRemoteFrame* old_web_frame,
     WebSandboxFlags flags,
     WebParsedFeaturePolicy container_policy) {
-  return WebLocalFrameImpl::CreateProvisional(client, interface_provider,
-                                              interface_registry, old_web_frame,
-                                              flags, container_policy);
+  return WebLocalFrameImpl::CreateProvisional(
+      client, interface_registry, old_web_frame, flags, container_policy);
 }
 
 WebLocalFrameImpl* WebLocalFrameImpl::Create(
     WebTreeScopeType scope,
     WebFrameClient* client,
-    blink::InterfaceProvider* interface_provider,
     blink::InterfaceRegistry* interface_registry,
     WebFrame* opener) {
-  WebLocalFrameImpl* frame = new WebLocalFrameImpl(
-      scope, client, interface_provider, interface_registry);
+  WebLocalFrameImpl* frame =
+      new WebLocalFrameImpl(scope, client, interface_registry);
   frame->SetOpener(opener);
   return frame;
 }
@@ -1533,14 +1528,12 @@
 WebLocalFrameImpl* WebLocalFrameImpl::CreateMainFrame(
     WebView* web_view,
     WebFrameClient* client,
-    InterfaceProvider* interface_provider,
     InterfaceRegistry* interface_registry,
     WebFrame* opener,
     const WebString& name,
     WebSandboxFlags sandbox_flags) {
-  WebLocalFrameImpl* frame =
-      new WebLocalFrameImpl(WebTreeScopeType::kDocument, client,
-                            interface_provider, interface_registry);
+  WebLocalFrameImpl* frame = new WebLocalFrameImpl(WebTreeScopeType::kDocument,
+                                                   client, interface_registry);
   frame->SetOpener(opener);
   Page& page = *static_cast<WebViewBase*>(web_view)->GetPage();
   DCHECK(!page.MainFrame());
@@ -1553,14 +1546,13 @@
 
 WebLocalFrameImpl* WebLocalFrameImpl::CreateProvisional(
     WebFrameClient* client,
-    blink::InterfaceProvider* interface_provider,
     blink::InterfaceRegistry* interface_registry,
     WebRemoteFrame* old_web_frame,
     WebSandboxFlags flags,
     WebParsedFeaturePolicy container_policy) {
   DCHECK(client);
-  WebLocalFrameImpl* web_frame = new WebLocalFrameImpl(
-      old_web_frame, client, interface_provider, interface_registry);
+  WebLocalFrameImpl* web_frame =
+      new WebLocalFrameImpl(old_web_frame, client, interface_registry);
   Frame* old_frame = ToWebRemoteFrameImpl(old_web_frame)->GetFrame();
   web_frame->SetParent(old_web_frame->Parent());
   web_frame->SetOpener(old_web_frame->Opener());
@@ -1593,10 +1585,9 @@
 WebLocalFrameImpl* WebLocalFrameImpl::CreateLocalChild(
     WebTreeScopeType scope,
     WebFrameClient* client,
-    blink::InterfaceProvider* interface_provider,
     blink::InterfaceRegistry* interface_registry) {
-  WebLocalFrameImpl* frame = new WebLocalFrameImpl(
-      scope, client, interface_provider, interface_registry);
+  WebLocalFrameImpl* frame =
+      new WebLocalFrameImpl(scope, client, interface_registry);
   AppendChild(frame);
   return frame;
 }
@@ -1604,14 +1595,12 @@
 WebLocalFrameImpl::WebLocalFrameImpl(
     WebTreeScopeType scope,
     WebFrameClient* client,
-    blink::InterfaceProvider* interface_provider,
     blink::InterfaceRegistry* interface_registry)
     : WebLocalFrameBase(scope),
       local_frame_client_impl_(LocalFrameClientImpl::Create(this)),
       client_(client),
       autofill_client_(0),
       input_events_scale_factor_for_emulation_(1),
-      interface_provider_(interface_provider),
       interface_registry_(interface_registry),
       web_dev_tools_frontend_(0),
       input_method_controller_(*this),
@@ -1626,13 +1615,11 @@
 WebLocalFrameImpl::WebLocalFrameImpl(
     WebRemoteFrame* old_web_frame,
     WebFrameClient* client,
-    blink::InterfaceProvider* interface_provider,
     blink::InterfaceRegistry* interface_registry)
     : WebLocalFrameImpl(old_web_frame->InShadowTree()
                             ? WebTreeScopeType::kShadow
                             : WebTreeScopeType::kDocument,
                         client,
-                        interface_provider,
                         interface_registry) {}
 
 WebLocalFrameImpl::~WebLocalFrameImpl() {
@@ -1664,7 +1651,7 @@
                                             FrameOwner* owner,
                                             const AtomicString& name) {
   SetCoreFrame(LocalFrame::Create(local_frame_client_impl_.Get(), page, owner,
-                                  interface_provider_, interface_registry_));
+                                  interface_registry_));
   frame_->Tree().SetName(name);
   // We must call init() after frame_ is assigned because it is referenced
   // during init().
diff --git a/third_party/WebKit/Source/web/WebLocalFrameImpl.h b/third_party/WebKit/Source/web/WebLocalFrameImpl.h
index b1e67a0..4695423 100644
--- a/third_party/WebKit/Source/web/WebLocalFrameImpl.h
+++ b/third_party/WebKit/Source/web/WebLocalFrameImpl.h
@@ -241,7 +241,6 @@
   // WebLocalFrame methods:
   WebLocalFrameImpl* CreateLocalChild(WebTreeScopeType,
                                       WebFrameClient*,
-                                      blink::InterfaceProvider*,
                                       blink::InterfaceRegistry*) override;
   void SetAutofillClient(WebAutofillClient*) override;
   WebAutofillClient* AutofillClient() override;
@@ -335,18 +334,15 @@
 
   static WebLocalFrameImpl* Create(WebTreeScopeType,
                                    WebFrameClient*,
-                                   InterfaceProvider*,
                                    InterfaceRegistry*,
                                    WebFrame* opener);
   static WebLocalFrameImpl* CreateMainFrame(WebView*,
                                             WebFrameClient*,
-                                            InterfaceProvider*,
                                             InterfaceRegistry*,
                                             WebFrame* opener,
                                             const WebString& name,
                                             WebSandboxFlags);
   static WebLocalFrameImpl* CreateProvisional(WebFrameClient*,
-                                              InterfaceProvider*,
                                               InterfaceRegistry*,
                                               WebRemoteFrame*,
                                               WebSandboxFlags,
@@ -458,11 +454,9 @@
 
   WebLocalFrameImpl(WebTreeScopeType,
                     WebFrameClient*,
-                    blink::InterfaceProvider*,
                     blink::InterfaceRegistry*);
   WebLocalFrameImpl(WebRemoteFrame*,
                     WebFrameClient*,
-                    blink::InterfaceProvider*,
                     blink::InterfaceRegistry*);
 
   // Inherited from WebFrame, but intentionally hidden: it never makes sense
@@ -518,7 +512,6 @@
   float input_events_scale_factor_for_emulation_;
 
   // Borrowed pointers to Mojo objects.
-  blink::InterfaceProvider* interface_provider_;
   blink::InterfaceRegistry* interface_registry_;
 
   WebDevToolsFrontendImpl* web_dev_tools_frontend_;
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/common_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/common_unittest.py
index 56c3d1d..0bd1c15e5 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/common_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/common_unittest.py
@@ -83,16 +83,16 @@
     def test_commit_that_has_open_pr_is_exportable(self):
         commit = MockChromiumCommit(MockHost(), change_id='Change-Id: I00decade')
         github = MockWPTGitHub(pull_requests=[
-            PullRequest('PR1', 1, 'body\nChange-Id: I00c0ffee', 'closed'),
-            PullRequest('PR2', 2, 'body\nChange-Id: I00decade', 'open'),
+            PullRequest('PR1', 1, 'body\nChange-Id: I00c0ffee', 'closed', []),
+            PullRequest('PR2', 2, 'body\nChange-Id: I00decade', 'open', []),
         ])
         self.assertTrue(is_exportable(commit, MockLocalWPT(), github))
 
     def test_commit_that_has_closed_pr_is_not_exportable(self):
         commit = MockChromiumCommit(MockHost(), change_id='Change-Id: I00decade')
         github = MockWPTGitHub(pull_requests=[
-            PullRequest('PR1', 1, 'body\nChange-Id: I00c0ffee', 'closed'),
-            PullRequest('PR2', 2, 'body\nChange-Id: I00decade', 'closed'),
+            PullRequest('PR1', 1, 'body\nChange-Id: I00c0ffee', 'closed', []),
+            PullRequest('PR2', 2, 'body\nChange-Id: I00decade', 'closed', []),
         ])
         self.assertFalse(is_exportable(commit, MockLocalWPT(), github))
 
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_exporter.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_exporter.py
index 6c894c8..25bb5a7 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_exporter.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_exporter.py
@@ -89,8 +89,9 @@
             _log.info('[dry_run] Would have attempted to merge PR')
             return
 
-        _log.info('Removing provisional label...')
-        self.wpt_github.remove_label(pull_request.number, PROVISIONAL_PR_LABEL)
+        if PROVISIONAL_PR_LABEL in pull_request.labels:
+            _log.info('Removing provisional label "%s"...', PROVISIONAL_PR_LABEL)
+            self.wpt_github.remove_label(pull_request.number, PROVISIONAL_PR_LABEL)
 
         _log.info('Attempting to merge...')
 
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_exporter_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_exporter_unittest.py
index 3ca537b..0355827 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_exporter_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_exporter_unittest.py
@@ -28,7 +28,7 @@
         test_exporter = TestExporter(host, 'gh-username', 'gh-token', gerrit_user=None,
                                      gerrit_token=None, dry_run=True)
         test_exporter.wpt_github = MockWPTGitHub(pull_requests=[
-            PullRequest(title='title1', number=1234, body='', state='open'),
+            PullRequest(title='title1', number=1234, body='', state='open', labels=[]),
         ])
         test_exporter.gerrit = MockGerritAPI(host, 'gerrit-username', 'gerrit-token')
         test_exporter.get_exportable_commits = lambda: [
@@ -115,19 +115,22 @@
                 title='Open PR',
                 number=1234,
                 body='rutabaga\nCr-Commit-Position: refs/heads/master@{#458475}',
-                state='open'
+                state='open',
+                labels=['do not merge yet']
             ),
             PullRequest(
                 title='Merged PR',
                 number=2345,
                 body='rutabaga\nCr-Commit-Position: refs/heads/master@{#458477}',
-                state='closed'
+                state='closed',
+                labels=[]
             ),
             PullRequest(
                 title='Open PR',
                 number=3456,
                 body='rutabaga\nCr-Commit-Position: refs/heads/master@{#458478}',
-                state='open'
+                state='open',
+                labels=[]  # It's important that this is empty.
             ),
         ], unsuccessful_merge_index=0)
         test_exporter.gerrit = MockGerritAPI(host, 'gerrit-username', 'gerrit-token')
@@ -148,7 +151,9 @@
             'add_label "chromium-export"',
             'pr_with_position',
             'pr_with_position',
-            'remove_label "do not merge yet"',
+            # Testing the lack of remove_label here. The exporter should not
+            # try to remove the provisional label from PRs it has already
+            # removed it from.
             'get_pr_branch',
             'merge_pull_request',
             'delete_remote_branch',
@@ -199,7 +204,8 @@
                                      gerrit_token=None, dry_run=False)
         test_exporter.wpt_github = MockWPTGitHub(pull_requests=[
             PullRequest(title='title1', number=1234,
-                        body='description\nWPT-Export-Revision: 1', state='open'),
+                        body='description\nWPT-Export-Revision: 1',
+                        state='open', labels=[]),
         ])
         test_exporter.get_exportable_commits = lambda: []
         test_exporter.gerrit = MockGerritAPI(host, 'gerrit-username', 'gerrit-token')
@@ -228,7 +234,8 @@
                                      gerrit_token=None, dry_run=False)
         test_exporter.wpt_github = MockWPTGitHub(pull_requests=[
             PullRequest(title='title1', number=1234,
-                        body='description\nWPT-Export-Revision: 1', state='open'),
+                        body='description\nWPT-Export-Revision: 1',
+                        state='open', labels=[]),
         ])
         test_exporter.get_exportable_commits = lambda: []
         test_exporter.gerrit = MockGerritAPI(host, 'gerrit-username', 'gerrit-token')
@@ -277,7 +284,7 @@
         test_exporter.wpt_github = MockWPTGitHub(pull_requests=[
             PullRequest(title='title1', number=1234,
                         body='description\nWPT-Export-Revision: 9\nChange-Id: decafbad',
-                        state='open'),
+                        state='open', labels=['do not merge yet']),
         ])
         test_exporter.get_exportable_commits = lambda: [
             ChromiumCommit(host, sha='c881563d734a86f7d9cd57ac509653a61c45c240'),
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer_unittest.py
index 6641d7a..38727022 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer_unittest.py
@@ -20,7 +20,7 @@
     def test_main_abort_on_exportable_commit_if_open_pr_found(self):
         host = MockHost()
         wpt_github = MockWPTGitHub(pull_requests=[
-            PullRequest('Title', 5, 'Commit body\nChange-Id: Iba5eba11', 'open'),
+            PullRequest('Title', 5, 'Commit body\nChange-Id: Iba5eba11', 'open', []),
         ])
         importer = TestImporter(host, wpt_github=wpt_github)
         importer.exportable_but_not_exported_commits = lambda _: [
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/wpt_github.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/wpt_github.py
index ff5e090..b2f099f 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/wpt_github.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/wpt_github.py
@@ -123,11 +123,15 @@
             WPT_GH_ORG,
             WPT_GH_REPO_NAME,
             number,
-            label,
+            urllib2.quote(label),
         )
+
         _, status_code = self.request(path, method='DELETE')
-        if status_code != 204:
-            raise GitHubError('Received non-204 status code attempting to delete remote branch: {}'.format(status_code))
+        # The GitHub API documentation claims that this endpoint returns a 204
+        # on success. However in reality it returns a 200.
+        # https://developer.github.com/v3/issues/labels/#remove-a-label-from-an-issue
+        if status_code not in (200, 204):
+            raise GitHubError('Received non-200 status code attempting to delete label: {}'.format(status_code))
 
     def in_flight_pull_requests(self):
         path = '/search/issues?q=repo:{}/{}%20is:open%20type:pr%20label:{}'.format(
@@ -142,11 +146,13 @@
             raise Exception('Non-200 status code (%s): %s' % (status_code, data))
 
     def make_pr_from_item(self, item):
+        labels = [label['name'] for label in item['labels']]
         return PullRequest(
             title=item['title'],
             number=item['number'],
             body=item['body'],
-            state=item['state'])
+            state=item['state'],
+            labels=labels)
 
     @memoized
     def all_pull_requests(self):
@@ -267,4 +273,4 @@
     pass
 
 
-PullRequest = namedtuple('PullRequest', ['title', 'number', 'body', 'state'])
+PullRequest = namedtuple('PullRequest', ['title', 'number', 'body', 'state', 'labels'])
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/wpt_github_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/wpt_github_unittest.py
index 5d32b44c..d30d7bdf 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/wpt_github_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/wpt_github_unittest.py
@@ -34,9 +34,9 @@
         with self.assertRaises(MergeError):
             self.wpt_github.merge_pull_request(5678)
 
-    def test_remove_label_throws_github_error_on_non_204(self):
+    def test_remove_label_throws_github_error_on_non_200_or_204(self):
         self.wpt_github.host.web.responses = [
-            {'status_code': 200},
+            {'status_code': 201},
         ]
 
         with self.assertRaises(GitHubError):
diff --git a/third_party/WebKit/public/platform/WebDocumentSubresourceFilter.h b/third_party/WebKit/public/platform/WebDocumentSubresourceFilter.h
index 25f6e8c..9ec6052 100644
--- a/third_party/WebKit/public/platform/WebDocumentSubresourceFilter.h
+++ b/third_party/WebKit/public/platform/WebDocumentSubresourceFilter.h
@@ -13,6 +13,14 @@
 
 class WebDocumentSubresourceFilter {
  public:
+  // This builder class is created on the main thread and passed to a worker
+  // thread to create the subresource filter for the worker thread.
+  class Builder {
+   public:
+    virtual ~Builder() {}
+    virtual std::unique_ptr<WebDocumentSubresourceFilter> Build() = 0;
+  };
+
   enum LoadPolicy { kAllow, kDisallow, kWouldDisallow };
 
   virtual ~WebDocumentSubresourceFilter() {}
diff --git a/third_party/WebKit/public/platform/WebRuntimeFeatures.h b/third_party/WebKit/public/platform/WebRuntimeFeatures.h
index 89c42a6..1ce4008 100644
--- a/third_party/WebKit/public/platform/WebRuntimeFeatures.h
+++ b/third_party/WebKit/public/platform/WebRuntimeFeatures.h
@@ -162,6 +162,7 @@
   BLINK_PLATFORM_EXPORT static void EnableMediaControlsOverlayPlayButton(bool);
   BLINK_PLATFORM_EXPORT static void EnableRemotePlaybackBackend(bool);
   BLINK_PLATFORM_EXPORT static void EnableMediaCastOverlayButton(bool);
+  BLINK_PLATFORM_EXPORT static void EnableClientPlaceholdersForServerLoFi(bool);
 
  private:
   WebRuntimeFeatures();
diff --git a/third_party/WebKit/public/platform/WebWorkerFetchContext.h b/third_party/WebKit/public/platform/WebWorkerFetchContext.h
index d325f0d..ee5cb9f 100644
--- a/third_party/WebKit/public/platform/WebWorkerFetchContext.h
+++ b/third_party/WebKit/public/platform/WebWorkerFetchContext.h
@@ -5,7 +5,10 @@
 #ifndef WebWorkerFetchContext_h
 #define WebWorkerFetchContext_h
 
+#include <memory>
+
 #include "public/platform/WebApplicationCacheHost.h"
+#include "public/platform/WebDocumentSubresourceFilter.h"
 #include "public/platform/WebURL.h"
 
 namespace base {
@@ -16,6 +19,7 @@
 
 class WebURLLoader;
 class WebURLRequest;
+class WebDocumentSubresourceFilter;
 
 // WebWorkerFetchContext is a per-worker object created on the main thread,
 // passed to a worker (dedicated, shared and service worker) and initialized on
@@ -60,6 +64,20 @@
   virtual int ApplicationCacheHostID() const {
     return WebApplicationCacheHost::kAppCacheNoHostId;
   }
+
+  // Sets the builder object of WebDocumentSubresourceFilter on the main thread
+  // which will be used in TakeSubresourceFilter() to create a
+  // WebDocumentSubresourceFilter on the worker thread.
+  virtual void SetSubresourceFilterBuilder(
+      std::unique_ptr<WebDocumentSubresourceFilter::Builder>) {}
+
+  // Creates a WebDocumentSubresourceFilter on the worker thread using the
+  // WebDocumentSubresourceFilter::Builder which is set on the main thread.
+  // This method should only be called once.
+  virtual std::unique_ptr<WebDocumentSubresourceFilter>
+  TakeSubresourceFilter() {
+    return nullptr;
+  }
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/public/web/WebFrameClient.h b/third_party/WebKit/public/web/WebFrameClient.h
index c16217eb..92a7365 100644
--- a/third_party/WebKit/public/web/WebFrameClient.h
+++ b/third_party/WebKit/public/web/WebFrameClient.h
@@ -193,8 +193,9 @@
   virtual BlameContext* GetFrameBlameContext() { return nullptr; }
 
   // Returns an InterfaceProvider the frame can use to request interfaces from
-  // the browser.
+  // the browser. This method may not return nullptr.
   virtual service_manager::InterfaceProvider* GetInterfaceProvider() {
+    NOTREACHED();
     return nullptr;
   }
 
diff --git a/third_party/WebKit/public/web/WebLocalFrame.h b/third_party/WebKit/public/web/WebLocalFrame.h
index 8e4c158..7b9db02e 100644
--- a/third_party/WebKit/public/web/WebLocalFrame.h
+++ b/third_party/WebKit/public/web/WebLocalFrame.h
@@ -27,7 +27,6 @@
 
 namespace blink {
 
-class InterfaceProvider;
 class InterfaceRegistry;
 class WebAssociatedURLLoader;
 class WebAutofillClient;
@@ -77,7 +76,6 @@
   BLINK_EXPORT static WebLocalFrame* CreateMainFrame(
       WebView*,
       WebFrameClient*,
-      blink::InterfaceProvider*,
       blink::InterfaceRegistry*,
       WebFrame* opener = nullptr,
       const WebString& name = WebString(),
@@ -102,7 +100,6 @@
   // frame.
   BLINK_EXPORT static WebLocalFrame* CreateProvisional(
       WebFrameClient*,
-      blink::InterfaceProvider*,
       blink::InterfaceRegistry*,
       WebRemoteFrame*,
       WebSandboxFlags,
@@ -113,7 +110,6 @@
   // it's no longer needed.
   virtual WebLocalFrame* CreateLocalChild(WebTreeScopeType,
                                           WebFrameClient*,
-                                          blink::InterfaceProvider*,
                                           blink::InterfaceRegistry*) = 0;
 
   // Returns the WebFrame associated with the current V8 context. This
diff --git a/third_party/WebKit/public/web/WebRemoteFrame.h b/third_party/WebKit/public/web/WebRemoteFrame.h
index 13482bc..7c78c3e 100644
--- a/third_party/WebKit/public/web/WebRemoteFrame.h
+++ b/third_party/WebKit/public/web/WebRemoteFrame.h
@@ -15,7 +15,6 @@
 namespace blink {
 
 enum class WebTreeScopeType;
-class InterfaceProvider;
 class InterfaceRegistry;
 class WebFrameClient;
 class WebLayer;
@@ -44,7 +43,6 @@
                                           const WebString& name,
                                           WebSandboxFlags,
                                           WebFrameClient*,
-                                          blink::InterfaceProvider*,
                                           blink::InterfaceRegistry*,
                                           WebFrame* previous_sibling,
                                           const WebParsedFeaturePolicy&,
diff --git a/third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextClient.h b/third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextClient.h
index 689ba8f..2251c02f 100644
--- a/third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextClient.h
+++ b/third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextClient.h
@@ -188,6 +188,9 @@
       const WebServiceWorkerResponse& response,
       WebServiceWorkerStreamHandle* body_as_stream,
       double event_dispatch_time) {}
+  virtual void RespondToCanMakePaymentEvent(int event_id,
+                                            bool can_make_payment,
+                                            double event_dispatch_time) {}
   virtual void RespondToPaymentRequestEvent(
       int event_id,
       const WebPaymentAppResponse& response,
diff --git a/third_party/axe-core/LICENSE b/third_party/axe-core/LICENSE
new file mode 100644
index 0000000..be2cc4df
--- /dev/null
+++ b/third_party/axe-core/LICENSE
@@ -0,0 +1,362 @@
+Mozilla Public License, version 2.0
+
+1. Definitions
+
+1.1. "Contributor"
+
+     means each individual or legal entity that creates, contributes to the
+     creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+
+     means the combination of the Contributions of others (if any) used by a
+     Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+
+     means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+
+     means Source Code Form to which the initial Contributor has attached the
+     notice in Exhibit A, the Executable Form of such Source Code Form, and
+     Modifications of such Source Code Form, in each case including portions
+     thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+     means
+
+     a. that the initial Contributor has attached the notice described in
+        Exhibit B to the Covered Software; or
+
+     b. that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the terms of
+        a Secondary License.
+
+1.6. "Executable Form"
+
+     means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+
+     means a work that combines Covered Software with other material, in a
+     separate file or files, that is not Covered Software.
+
+1.8. "License"
+
+     means this document.
+
+1.9. "Licensable"
+
+     means having the right to grant, to the maximum extent possible, whether
+     at the time of the initial grant or subsequently, any and all of the
+     rights conveyed by this License.
+
+1.10. "Modifications"
+
+     means any of the following:
+
+     a. any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered Software; or
+
+     b. any new file in Source Code Form that contains any Covered Software.
+
+1.11. "Patent Claims" of a Contributor
+
+      means any patent claim(s), including without limitation, method,
+      process, and apparatus claims, in any patent Licensable by such
+      Contributor that would be infringed, but for the grant of the License,
+      by the making, using, selling, offering for sale, having made, import,
+      or transfer of either its Contributions or its Contributor Version.
+
+1.12. "Secondary License"
+
+      means either the GNU General Public License, Version 2.0, the GNU Lesser
+      General Public License, Version 2.1, the GNU Affero General Public
+      License, Version 3.0, or any later versions of those licenses.
+
+1.13. "Source Code Form"
+
+      means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+
+      means an individual or a legal entity exercising rights under this
+      License. For legal entities, "You" includes any entity that controls, is
+      controlled by, or is under common control with You. For purposes of this
+      definition, "control" means (a) the power, direct or indirect, to cause
+      the direction or management of such entity, whether by contract or
+      otherwise, or (b) ownership of more than fifty percent (50%) of the
+      outstanding shares or beneficial ownership of such entity.
+
+
+2. License Grants and Conditions
+
+2.1. Grants
+
+     Each Contributor hereby grants You a world-wide, royalty-free,
+     non-exclusive license:
+
+     a. under intellectual property rights (other than patent or trademark)
+        Licensable by such Contributor to use, reproduce, make available,
+        modify, display, perform, distribute, and otherwise exploit its
+        Contributions, either on an unmodified basis, with Modifications, or
+        as part of a Larger Work; and
+
+     b. under Patent Claims of such Contributor to make, use, sell, offer for
+        sale, have made, import, and otherwise transfer either its
+        Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+     The licenses granted in Section 2.1 with respect to any Contribution
+     become effective for each Contribution on the date the Contributor first
+     distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+     The licenses granted in this Section 2 are the only rights granted under
+     this License. No additional rights or licenses will be implied from the
+     distribution or licensing of Covered Software under this License.
+     Notwithstanding Section 2.1(b) above, no patent license is granted by a
+     Contributor:
+
+     a. for any code that a Contributor has removed from Covered Software; or
+
+     b. for infringements caused by: (i) Your and any other third party's
+        modifications of Covered Software, or (ii) the combination of its
+        Contributions with other software (except as part of its Contributor
+        Version); or
+
+     c. under Patent Claims infringed by Covered Software in the absence of
+        its Contributions.
+
+     This License does not grant any rights in the trademarks, service marks,
+     or logos of any Contributor (except as may be necessary to comply with
+     the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+     No Contributor makes additional grants as a result of Your choice to
+     distribute the Covered Software under a subsequent version of this
+     License (see Section 10.2) or under the terms of a Secondary License (if
+     permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+     Each Contributor represents that the Contributor believes its
+     Contributions are its original creation(s) or it has sufficient rights to
+     grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+     This License is not intended to limit any rights You have under
+     applicable copyright doctrines of fair use, fair dealing, or other
+     equivalents.
+
+2.7. Conditions
+
+     Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in
+     Section 2.1.
+
+
+3. Responsibilities
+
+3.1. Distribution of Source Form
+
+     All distribution of Covered Software in Source Code Form, including any
+     Modifications that You create or to which You contribute, must be under
+     the terms of this License. You must inform recipients that the Source
+     Code Form of the Covered Software is governed by the terms of this
+     License, and how they can obtain a copy of this License. You may not
+     attempt to alter or restrict the recipients' rights in the Source Code
+     Form.
+
+3.2. Distribution of Executable Form
+
+     If You distribute Covered Software in Executable Form then:
+
+     a. such Covered Software must also be made available in Source Code Form,
+        as described in Section 3.1, and You must inform recipients of the
+        Executable Form how they can obtain a copy of such Source Code Form by
+        reasonable means in a timely manner, at a charge no more than the cost
+        of distribution to the recipient; and
+
+     b. You may distribute such Executable Form under the terms of this
+        License, or sublicense it under different terms, provided that the
+        license for the Executable Form does not attempt to limit or alter the
+        recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+     You may create and distribute a Larger Work under terms of Your choice,
+     provided that You also comply with the requirements of this License for
+     the Covered Software. If the Larger Work is a combination of Covered
+     Software with a work governed by one or more Secondary Licenses, and the
+     Covered Software is not Incompatible With Secondary Licenses, this
+     License permits You to additionally distribute such Covered Software
+     under the terms of such Secondary License(s), so that the recipient of
+     the Larger Work may, at their option, further distribute the Covered
+     Software under the terms of either this License or such Secondary
+     License(s).
+
+3.4. Notices
+
+     You may not remove or alter the substance of any license notices
+     (including copyright notices, patent notices, disclaimers of warranty, or
+     limitations of liability) contained within the Source Code Form of the
+     Covered Software, except that You may alter any license notices to the
+     extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+     You may choose to offer, and to charge a fee for, warranty, support,
+     indemnity or liability obligations to one or more recipients of Covered
+     Software. However, You may do so only on Your own behalf, and not on
+     behalf of any Contributor. You must make it absolutely clear that any
+     such warranty, support, indemnity, or liability obligation is offered by
+     You alone, and You hereby agree to indemnify every Contributor for any
+     liability incurred by such Contributor as a result of warranty, support,
+     indemnity or liability terms You offer. You may include additional
+     disclaimers of warranty and limitations of liability specific to any
+     jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+
+   If it is impossible for You to comply with any of the terms of this License
+   with respect to some or all of the Covered Software due to statute,
+   judicial order, or regulation then You must: (a) comply with the terms of
+   this License to the maximum extent possible; and (b) describe the
+   limitations and the code they affect. Such description must be placed in a
+   text file included with all distributions of the Covered Software under
+   this License. Except to the extent prohibited by statute or regulation,
+   such description must be sufficiently detailed for a recipient of ordinary
+   skill to be able to understand it.
+
+5. Termination
+
+5.1. The rights granted under this License will terminate automatically if You
+     fail to comply with any of its terms. However, if You become compliant,
+     then the rights granted under this License from a particular Contributor
+     are reinstated (a) provisionally, unless and until such Contributor
+     explicitly and finally terminates Your grants, and (b) on an ongoing
+     basis, if such Contributor fails to notify You of the non-compliance by
+     some reasonable means prior to 60 days after You have come back into
+     compliance. Moreover, Your grants from a particular Contributor are
+     reinstated on an ongoing basis if such Contributor notifies You of the
+     non-compliance by some reasonable means, this is the first time You have
+     received notice of non-compliance with this License from such
+     Contributor, and You become compliant prior to 30 days after Your receipt
+     of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+     infringement claim (excluding declaratory judgment actions,
+     counter-claims, and cross-claims) alleging that a Contributor Version
+     directly or indirectly infringes any patent, then the rights granted to
+     You by any and all Contributors for the Covered Software under Section
+     2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user
+     license agreements (excluding distributors and resellers) which have been
+     validly granted by You or Your distributors under this License prior to
+     termination shall survive termination.
+
+6. Disclaimer of Warranty
+
+   Covered Software is provided under this License on an "as is" basis,
+   without warranty of any kind, either expressed, implied, or statutory,
+   including, without limitation, warranties that the Covered Software is free
+   of defects, merchantable, fit for a particular purpose or non-infringing.
+   The entire risk as to the quality and performance of the Covered Software
+   is with You. Should any Covered Software prove defective in any respect,
+   You (not any Contributor) assume the cost of any necessary servicing,
+   repair, or correction. This disclaimer of warranty constitutes an essential
+   part of this License. No use of  any Covered Software is authorized under
+   this License except under this disclaimer.
+
+7. Limitation of Liability
+
+   Under no circumstances and under no legal theory, whether tort (including
+   negligence), contract, or otherwise, shall any Contributor, or anyone who
+   distributes Covered Software as permitted above, be liable to You for any
+   direct, indirect, special, incidental, or consequential damages of any
+   character including, without limitation, damages for lost profits, loss of
+   goodwill, work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses, even if such party shall have been
+   informed of the possibility of such damages. This limitation of liability
+   shall not apply to liability for death or personal injury resulting from
+   such party's negligence to the extent applicable law prohibits such
+   limitation. Some jurisdictions do not allow the exclusion or limitation of
+   incidental or consequential damages, so this exclusion and limitation may
+   not apply to You.
+
+8. Litigation
+
+   Any litigation relating to this License may be brought only in the courts
+   of a jurisdiction where the defendant maintains its principal place of
+   business and such litigation shall be governed by laws of that
+   jurisdiction, without reference to its conflict-of-law provisions. Nothing
+   in this Section shall prevent a party's ability to bring cross-claims or
+   counter-claims.
+
+9. Miscellaneous
+
+   This License represents the complete agreement concerning the subject
+   matter hereof. If any provision of this License is held to be
+   unenforceable, such provision shall be reformed only to the extent
+   necessary to make it enforceable. Any law or regulation which provides that
+   the language of a contract shall be construed against the drafter shall not
+   be used to construe this License against a Contributor.
+
+
+10. Versions of the License
+
+10.1. New Versions
+
+      Mozilla Foundation is the license steward. Except as provided in Section
+      10.3, no one other than the license steward has the right to modify or
+      publish new versions of this License. Each version will be given a
+      distinguishing version number.
+
+10.2. Effect of New Versions
+
+      You may distribute the Covered Software under the terms of the version
+      of the License under which You originally received the Covered Software,
+      or under the terms of any subsequent version published by the license
+      steward.
+
+10.3. Modified Versions
+
+      If you create software not governed by this License, and you want to
+      create a new license for such software, you may create and use a
+      modified version of this License if you rename the license and remove
+      any references to the name of the license steward (except to note that
+      such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+      Licenses If You choose to distribute Source Code Form that is
+      Incompatible With Secondary Licenses under the terms of this version of
+      the License, the notice described in Exhibit B of this License must be
+      attached.
+
+Exhibit A - Source Code Form License Notice
+
+      This Source Code Form is subject to the
+      terms of the Mozilla Public License, v.
+      2.0. If a copy of the MPL was not
+      distributed with this file, You can
+      obtain one at
+      http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular file,
+then You may include the notice in a location (such as a LICENSE file in a
+relevant directory) where a recipient would be likely to look for such a
+notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+
+      This Source Code Form is "Incompatible
+      With Secondary Licenses", as defined by
+      the Mozilla Public License, v. 2.0.
diff --git a/third_party/axe-core/OWNERS b/third_party/axe-core/OWNERS
new file mode 100644
index 0000000..1877266f
--- /dev/null
+++ b/third_party/axe-core/OWNERS
@@ -0,0 +1,2 @@
+aboxhall@chromium.org
+hcarmona@chromium.org
diff --git a/third_party/axe-core/README.chromium b/third_party/axe-core/README.chromium
new file mode 100644
index 0000000..6bd3e1bb
--- /dev/null
+++ b/third_party/axe-core/README.chromium
@@ -0,0 +1,20 @@
+Name: AXE-CORE Accessibility Audit
+Short Name: axe-core
+URL: https://github.com/dequelabs/axe-core/
+Version: 0
+Date: Sun Jun 18 19:21:36 2017 -0400
+Revision: 1986520cdca8ed0f208d2cbd918829b27266a374
+License: MPL 2.0
+License File: LICENSE
+Security Critical: no
+
+Description:
+Accessibility engine for automated Web UI testing. This will be used to run
+automated accessibility tests in web-ui.
+
+Local Modifications:
+  1 Checked out the origin/shadowDOM branch
+  2 Created build
+  3 New files:
+      README.chromium
+      OWNERS
diff --git a/third_party/axe-core/axe.js b/third_party/axe-core/axe.js
new file mode 100644
index 0000000..19c2cbf
--- /dev/null
+++ b/third_party/axe-core/axe.js
@@ -0,0 +1,9454 @@
+/*! aXe v2.3.1
+ * Copyright (c) 2017 Deque Systems, Inc.
+ *
+ * Your use of this Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This entire copyright notice must appear in every copy of this file you
+ * distribute or in any file that contains substantial portions of this source
+ * code.
+ */
+(function axeFunction(window) {
+  var global = window;
+  var document = window.document;
+  'use strict';
+  var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function(obj) {
+    return typeof obj;
+  } : function(obj) {
+    return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj;
+  };
+  var axe = axe || {};
+  axe.version = '2.3.1';
+  if (typeof define === 'function' && define.amd) {
+    define([], function() {
+      'use strict';
+      return axe;
+    });
+  }
+  if ((typeof module === 'undefined' ? 'undefined' : _typeof(module)) === 'object' && module.exports && typeof axeFunction.toString === 'function') {
+    axe.source = '(' + axeFunction.toString() + ')(typeof window === "object" ? window : this);';
+    module.exports = axe;
+  }
+  if (typeof window.getComputedStyle === 'function') {
+    window.axe = axe;
+  }
+  var commons;
+  function SupportError(error) {
+    this.name = 'SupportError';
+    this.cause = error.cause;
+    this.message = '`' + error.cause + '` - feature unsupported in your environment.';
+    if (error.ruleId) {
+      this.ruleId = error.ruleId;
+      this.message += ' Skipping ' + this.ruleId + ' rule.';
+    }
+    this.stack = new Error().stack;
+  }
+  SupportError.prototype = Object.create(Error.prototype);
+  SupportError.prototype.constructor = SupportError;
+  'use strict';
+  var utils = axe.utils = {};
+  'use strict';
+  var helpers = {};
+  'use strict';
+  var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function(obj) {
+    return typeof obj;
+  } : function(obj) {
+    return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj;
+  };
+  function getDefaultConfiguration(audit) {
+    'use strict';
+    var config;
+    if (audit) {
+      config = axe.utils.clone(audit);
+      config.commons = audit.commons;
+    } else {
+      config = {};
+    }
+    config.reporter = config.reporter || null;
+    config.rules = config.rules || [];
+    config.checks = config.checks || [];
+    config.data = Object.assign({
+      checks: {},
+      rules: {}
+    }, config.data);
+    return config;
+  }
+  function unpackToObject(collection, audit, method) {
+    'use strict';
+    var i, l;
+    for (i = 0, l = collection.length; i < l; i++) {
+      audit[method](collection[i]);
+    }
+  }
+  function Audit(audit) {
+    this.brand = 'axe';
+    this.application = 'axeAPI';
+    this.tagExclude = [ 'experimental' ];
+    this.defaultConfig = audit;
+    this._init();
+  }
+  Audit.prototype._init = function() {
+    var audit = getDefaultConfiguration(this.defaultConfig);
+    axe.commons = commons = audit.commons;
+    this.reporter = audit.reporter;
+    this.commands = {};
+    this.rules = [];
+    this.checks = {};
+    unpackToObject(audit.rules, this, 'addRule');
+    unpackToObject(audit.checks, this, 'addCheck');
+    this.data = {};
+    this.data.checks = audit.data && audit.data.checks || {};
+    this.data.rules = audit.data && audit.data.rules || {};
+    this.data.failureSummaries = audit.data && audit.data.failureSummaries || {};
+    this.data.incompleteFallbackMessage = audit.data && audit.data.incompleteFallbackMessage || '';
+    this._constructHelpUrls();
+  };
+  Audit.prototype.registerCommand = function(command) {
+    'use strict';
+    this.commands[command.id] = command.callback;
+  };
+  Audit.prototype.addRule = function(spec) {
+    'use strict';
+    if (spec.metadata) {
+      this.data.rules[spec.id] = spec.metadata;
+    }
+    var rule = this.getRule(spec.id);
+    if (rule) {
+      rule.configure(spec);
+    } else {
+      this.rules.push(new Rule(spec, this));
+    }
+  };
+  Audit.prototype.addCheck = function(spec) {
+    'use strict';
+    var metadata = spec.metadata;
+    if ((typeof metadata === 'undefined' ? 'undefined' : _typeof(metadata)) === 'object') {
+      this.data.checks[spec.id] = metadata;
+      if (_typeof(metadata.messages) === 'object') {
+        Object.keys(metadata.messages).filter(function(prop) {
+          return metadata.messages.hasOwnProperty(prop) && typeof metadata.messages[prop] === 'string';
+        }).forEach(function(prop) {
+          if (metadata.messages[prop].indexOf('function') === 0) {
+            metadata.messages[prop] = new Function('return ' + metadata.messages[prop] + ';')();
+          }
+        });
+      }
+    }
+    if (this.checks[spec.id]) {
+      this.checks[spec.id].configure(spec);
+    } else {
+      this.checks[spec.id] = new Check(spec);
+    }
+  };
+  Audit.prototype.run = function(context, options, resolve, reject) {
+    'use strict';
+    this.validateOptions(options);
+    axe._tree = axe.utils.getFlattenedTree(document.body);
+    var q = axe.utils.queue();
+    this.rules.forEach(function(rule) {
+      if (axe.utils.ruleShouldRun(rule, context, options)) {
+        if (options.performanceTimer) {
+          var markEnd = 'mark_rule_end_' + rule.id;
+          var markStart = 'mark_rule_start_' + rule.id;
+          axe.utils.performanceTimer.mark(markStart);
+        }
+        q.defer(function(res, rej) {
+          rule.run(context, options, function(out) {
+            if (options.performanceTimer) {
+              axe.utils.performanceTimer.mark(markEnd);
+              axe.utils.performanceTimer.measure('rule_' + rule.id, markStart, markEnd);
+            }
+            res(out);
+          }, function(err) {
+            if (!options.debug) {
+              var errResult = Object.assign(new RuleResult(rule), {
+                result: axe.constants.CANTTELL,
+                description: 'An error occured while running this rule',
+                message: err.message,
+                help: err.stack || err.message,
+                error: err
+              });
+              res(errResult);
+            } else {
+              rej(err);
+            }
+          });
+        });
+      }
+    });
+    q.then(function(results) {
+      axe._tree = undefined;
+      resolve(results.filter(function(result) {
+        return !!result;
+      }));
+    }).catch(reject);
+  };
+  Audit.prototype.after = function(results, options) {
+    'use strict';
+    var rules = this.rules;
+    return results.map(function(ruleResult) {
+      var rule = axe.utils.findBy(rules, 'id', ruleResult.id);
+      return rule.after(ruleResult, options);
+    });
+  };
+  Audit.prototype.getRule = function(ruleId) {
+    return this.rules.find(function(rule) {
+      return rule.id === ruleId;
+    });
+  };
+  Audit.prototype.validateOptions = function(options) {
+    'use strict';
+    var audit = this;
+    if (_typeof(options.runOnly) === 'object') {
+      var only = options.runOnly;
+      if (only.type === 'rule' && Array.isArray(only.value)) {
+        only.value.forEach(function(ruleId) {
+          if (!audit.getRule(ruleId)) {
+            throw new Error('unknown rule `' + ruleId + '` in options.runOnly');
+          }
+        });
+      } else if (Array.isArray(only.value) && only.value.length > 0) {
+        var tags = [].concat(only.value);
+        audit.rules.forEach(function(rule) {
+          var tagPos, i, l;
+          if (!tags) {
+            return;
+          }
+          for (i = 0, l = rule.tags.length; i < l; i++) {
+            tagPos = tags.indexOf(rule.tags[i]);
+            if (tagPos !== -1) {
+              tags.splice(tagPos, 1);
+            }
+          }
+        });
+        if (tags.length !== 0) {
+          throw new Error('could not find tags `' + tags.join('`, `') + '`');
+        }
+      }
+    }
+    if (_typeof(options.rules) === 'object') {
+      Object.keys(options.rules).forEach(function(ruleId) {
+        if (!audit.getRule(ruleId)) {
+          throw new Error('unknown rule `' + ruleId + '` in options.rules');
+        }
+      });
+    }
+    return options;
+  };
+  Audit.prototype.setBranding = function(branding) {
+    'use strict';
+    var previous = {
+      brand: this.brand,
+      application: this.application
+    };
+    if (branding && branding.hasOwnProperty('brand') && branding.brand && typeof branding.brand === 'string') {
+      this.brand = branding.brand;
+    }
+    if (branding && branding.hasOwnProperty('application') && branding.application && typeof branding.application === 'string') {
+      this.application = branding.application;
+    }
+    this._constructHelpUrls(previous);
+  };
+  function getHelpUrl(_ref, ruleId, version) {
+    var brand = _ref.brand, application = _ref.application;
+    return axe.constants.helpUrlBase + brand + '/' + (version || axe.version.substring(0, axe.version.lastIndexOf('.'))) + '/' + ruleId + '?application=' + application;
+  }
+  Audit.prototype._constructHelpUrls = function() {
+    var _this = this;
+    var previous = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
+    var version = axe.version.substring(0, axe.version.lastIndexOf('.'));
+    this.rules.forEach(function(rule) {
+      if (!_this.data.rules[rule.id]) {
+        _this.data.rules[rule.id] = {};
+      }
+      var metaData = _this.data.rules[rule.id];
+      if (typeof metaData.helpUrl !== 'string' || previous && metaData.helpUrl === getHelpUrl(previous, rule.id, version)) {
+        metaData.helpUrl = getHelpUrl(_this, rule.id, version);
+      }
+    });
+  };
+  Audit.prototype.resetRulesAndChecks = function() {
+    'use strict';
+    this._init();
+  };
+  'use strict';
+  function CheckResult(check) {
+    'use strict';
+    this.id = check.id;
+    this.data = null;
+    this.relatedNodes = [];
+    this.result = null;
+  }
+  'use strict';
+  function createExecutionContext(spec) {
+    'use strict';
+    if (typeof spec === 'string') {
+      return new Function('return ' + spec + ';')();
+    }
+    return spec;
+  }
+  function Check(spec) {
+    if (spec) {
+      this.id = spec.id;
+      this.configure(spec);
+    }
+  }
+  Check.prototype.enabled = true;
+  Check.prototype.run = function(node, options, resolve, reject) {
+    'use strict';
+    options = options || {};
+    var enabled = options.hasOwnProperty('enabled') ? options.enabled : this.enabled, checkOptions = options.options || this.options;
+    if (enabled) {
+      var checkResult = new CheckResult(this);
+      var checkHelper = axe.utils.checkHelper(checkResult, options, resolve, reject);
+      var result;
+      try {
+        result = this.evaluate.call(checkHelper, node.actualNode, checkOptions, node);
+      } catch (e) {
+        reject(e);
+        return;
+      }
+      if (!checkHelper.isAsync) {
+        checkResult.result = result;
+        setTimeout(function() {
+          resolve(checkResult);
+        }, 0);
+      }
+    } else {
+      resolve(null);
+    }
+  };
+  Check.prototype.configure = function(spec) {
+    var _this = this;
+    [ 'options', 'enabled' ].filter(function(prop) {
+      return spec.hasOwnProperty(prop);
+    }).forEach(function(prop) {
+      return _this[prop] = spec[prop];
+    });
+    [ 'evaluate', 'after' ].filter(function(prop) {
+      return spec.hasOwnProperty(prop);
+    }).forEach(function(prop) {
+      return _this[prop] = createExecutionContext(spec[prop]);
+    });
+  };
+  'use strict';
+  var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function(obj) {
+    return typeof obj;
+  } : function(obj) {
+    return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj;
+  };
+  function pushUniqueFrame(collection, frame) {
+    'use strict';
+    if (axe.utils.isHidden(frame)) {
+      return;
+    }
+    var fr = axe.utils.findBy(collection, 'node', frame);
+    if (!fr) {
+      collection.push({
+        node: frame,
+        include: [],
+        exclude: []
+      });
+    }
+  }
+  function pushUniqueFrameSelector(context, type, selectorArray) {
+    'use strict';
+    context.frames = context.frames || [];
+    var result, frame;
+    var frames = document.querySelectorAll(selectorArray.shift());
+    frameloop: for (var i = 0, l = frames.length; i < l; i++) {
+      frame = frames[i];
+      for (var j = 0, l2 = context.frames.length; j < l2; j++) {
+        if (context.frames[j].node === frame) {
+          context.frames[j][type].push(selectorArray);
+          break frameloop;
+        }
+      }
+      result = {
+        node: frame,
+        include: [],
+        exclude: []
+      };
+      if (selectorArray) {
+        result[type].push(selectorArray);
+      }
+      context.frames.push(result);
+    }
+  }
+  function normalizeContext(context) {
+    'use strict';
+    if (context && (typeof context === 'undefined' ? 'undefined' : _typeof(context)) === 'object' || context instanceof NodeList) {
+      if (context instanceof Node) {
+        return {
+          include: [ context ],
+          exclude: []
+        };
+      }
+      if (context.hasOwnProperty('include') || context.hasOwnProperty('exclude')) {
+        return {
+          include: context.include && +context.include.length ? context.include : [ document ],
+          exclude: context.exclude || []
+        };
+      }
+      if (context.length === +context.length) {
+        return {
+          include: context,
+          exclude: []
+        };
+      }
+    }
+    if (typeof context === 'string') {
+      return {
+        include: [ context ],
+        exclude: []
+      };
+    }
+    return {
+      include: [ document ],
+      exclude: []
+    };
+  }
+  function parseSelectorArray(context, type) {
+    'use strict';
+    var item, result = [], nodeList;
+    for (var i = 0, l = context[type].length; i < l; i++) {
+      item = context[type][i];
+      if (typeof item === 'string') {
+        nodeList = Array.from(document.querySelectorAll(item));
+        result = result.concat(nodeList.map(function(node) {
+          return axe.utils.getFlattenedTree(node)[0];
+        }));
+        break;
+      } else if (item && item.length && !(item instanceof Node)) {
+        if (item.length > 1) {
+          pushUniqueFrameSelector(context, type, item);
+        } else {
+          nodeList = Array.from(document.querySelectorAll(item[0]));
+          result = result.concat(nodeList.map(function(node) {
+            return axe.utils.getFlattenedTree(node)[0];
+          }));
+        }
+      } else if (item instanceof Node) {
+        result.push(axe.utils.getFlattenedTree(item)[0]);
+      }
+    }
+    return result.filter(function(r) {
+      return r;
+    });
+  }
+  function validateContext(context) {
+    'use strict';
+    if (context.include.length === 0) {
+      if (context.frames.length === 0) {
+        var env = axe.utils.respondable.isInFrame() ? 'frame' : 'page';
+        return new Error('No elements found for include in ' + env + ' Context');
+      }
+      context.frames.forEach(function(frame, i) {
+        if (frame.include.length === 0) {
+          return new Error('No elements found for include in Context of frame ' + i);
+        }
+      });
+    }
+  }
+  function Context(spec) {
+    'use strict';
+    var self = this;
+    this.frames = [];
+    this.initiator = spec && typeof spec.initiator === 'boolean' ? spec.initiator : true;
+    this.page = false;
+    spec = normalizeContext(spec);
+    this.exclude = spec.exclude;
+    this.include = spec.include;
+    this.include = parseSelectorArray(this, 'include');
+    this.exclude = parseSelectorArray(this, 'exclude');
+    axe.utils.select('frame, iframe', this).forEach(function(frame) {
+      if (isNodeInContext(frame, self)) {
+        pushUniqueFrame(self.frames, frame.actualNode);
+      }
+    });
+    if (this.include.length === 1 && this.include[0].actualNode === document.documentElement) {
+      this.page = true;
+    }
+    var err = validateContext(this);
+    if (err instanceof Error) {
+      throw err;
+    }
+  }
+  'use strict';
+  function RuleResult(rule) {
+    'use strict';
+    this.id = rule.id;
+    this.result = axe.constants.NA;
+    this.pageLevel = rule.pageLevel;
+    this.impact = null;
+    this.nodes = [];
+  }
+  'use strict';
+  function Rule(spec, parentAudit) {
+    'use strict';
+    this._audit = parentAudit;
+    this.id = spec.id;
+    this.selector = spec.selector || '*';
+    this.excludeHidden = typeof spec.excludeHidden === 'boolean' ? spec.excludeHidden : true;
+    this.enabled = typeof spec.enabled === 'boolean' ? spec.enabled : true;
+    this.pageLevel = typeof spec.pageLevel === 'boolean' ? spec.pageLevel : false;
+    this.any = spec.any || [];
+    this.all = spec.all || [];
+    this.none = spec.none || [];
+    this.tags = spec.tags || [];
+    if (spec.matches) {
+      this.matches = createExecutionContext(spec.matches);
+    }
+  }
+  Rule.prototype.matches = function() {
+    'use strict';
+    return true;
+  };
+  Rule.prototype.gather = function(context) {
+    'use strict';
+    var elements = axe.utils.select(this.selector, context);
+    if (this.excludeHidden) {
+      return elements.filter(function(element) {
+        return !axe.utils.isHidden(element.actualNode);
+      });
+    }
+    return elements;
+  };
+  Rule.prototype.runChecks = function(type, node, options, resolve, reject) {
+    'use strict';
+    var self = this;
+    var checkQueue = axe.utils.queue();
+    this[type].forEach(function(c) {
+      var check = self._audit.checks[c.id || c];
+      var option = axe.utils.getCheckOption(check, self.id, options);
+      checkQueue.defer(function(res, rej) {
+        check.run(node, option, res, rej);
+      });
+    });
+    checkQueue.then(function(results) {
+      results = results.filter(function(check) {
+        return check;
+      });
+      resolve({
+        type: type,
+        results: results
+      });
+    }).catch(reject);
+  };
+  Rule.prototype.run = function(context, options, resolve, reject) {
+    var _this = this;
+    var q = axe.utils.queue();
+    var ruleResult = new RuleResult(this);
+    var nodes = void 0;
+    try {
+      nodes = this.gather(context).filter(function(node) {
+        return _this.matches(node.actualNode);
+      });
+    } catch (error) {
+      reject(new SupportError({
+        cause: error,
+        ruleId: this.id
+      }));
+      return;
+    }
+    if (options.performanceTimer) {
+      axe.log('gather (', nodes.length, '):', axe.utils.performanceTimer.timeElapsed() + 'ms');
+    }
+    nodes.forEach(function(node) {
+      q.defer(function(resolveNode, rejectNode) {
+        var checkQueue = axe.utils.queue();
+        checkQueue.defer(function(res, rej) {
+          _this.runChecks('any', node, options, res, rej);
+        });
+        checkQueue.defer(function(res, rej) {
+          _this.runChecks('all', node, options, res, rej);
+        });
+        checkQueue.defer(function(res, rej) {
+          _this.runChecks('none', node, options, res, rej);
+        });
+        checkQueue.then(function(results) {
+          if (results.length) {
+            var hasResults = false, result = {};
+            results.forEach(function(r) {
+              var res = r.results.filter(function(result) {
+                return result;
+              });
+              result[r.type] = res;
+              if (res.length) {
+                hasResults = true;
+              }
+            });
+            if (hasResults) {
+              result.node = new axe.utils.DqElement(node.actualNode, options);
+              ruleResult.nodes.push(result);
+            }
+          }
+          resolveNode();
+        }).catch(function(err) {
+          return rejectNode(err);
+        });
+      });
+    });
+    q.then(function() {
+      return resolve(ruleResult);
+    }).catch(function(error) {
+      return reject(error);
+    });
+  };
+  function findAfterChecks(rule) {
+    'use strict';
+    return axe.utils.getAllChecks(rule).map(function(c) {
+      var check = rule._audit.checks[c.id || c];
+      return check && typeof check.after === 'function' ? check : null;
+    }).filter(Boolean);
+  }
+  function findCheckResults(nodes, checkID) {
+    'use strict';
+    var checkResults = [];
+    nodes.forEach(function(nodeResult) {
+      var checks = axe.utils.getAllChecks(nodeResult);
+      checks.forEach(function(checkResult) {
+        if (checkResult.id === checkID) {
+          checkResults.push(checkResult);
+        }
+      });
+    });
+    return checkResults;
+  }
+  function filterChecks(checks) {
+    'use strict';
+    return checks.filter(function(check) {
+      return check.filtered !== true;
+    });
+  }
+  function sanitizeNodes(result) {
+    'use strict';
+    var checkTypes = [ 'any', 'all', 'none' ];
+    var nodes = result.nodes.filter(function(detail) {
+      var length = 0;
+      checkTypes.forEach(function(type) {
+        detail[type] = filterChecks(detail[type]);
+        length += detail[type].length;
+      });
+      return length > 0;
+    });
+    if (result.pageLevel && nodes.length) {
+      nodes = [ nodes.reduce(function(a, b) {
+        if (a) {
+          checkTypes.forEach(function(type) {
+            a[type].push.apply(a[type], b[type]);
+          });
+          return a;
+        }
+      }) ];
+    }
+    return nodes;
+  }
+  Rule.prototype.after = function(result, options) {
+    'use strict';
+    var afterChecks = findAfterChecks(this);
+    var ruleID = this.id;
+    afterChecks.forEach(function(check) {
+      var beforeResults = findCheckResults(result.nodes, check.id);
+      var option = axe.utils.getCheckOption(check, ruleID, options);
+      var afterResults = check.after(beforeResults, option);
+      beforeResults.forEach(function(item) {
+        if (afterResults.indexOf(item) === -1) {
+          item.filtered = true;
+        }
+      });
+    });
+    result.nodes = sanitizeNodes(result);
+    return result;
+  };
+  Rule.prototype.configure = function(spec) {
+    'use strict';
+    if (spec.hasOwnProperty('selector')) {
+      this.selector = spec.selector;
+    }
+    if (spec.hasOwnProperty('excludeHidden')) {
+      this.excludeHidden = typeof spec.excludeHidden === 'boolean' ? spec.excludeHidden : true;
+    }
+    if (spec.hasOwnProperty('enabled')) {
+      this.enabled = typeof spec.enabled === 'boolean' ? spec.enabled : true;
+    }
+    if (spec.hasOwnProperty('pageLevel')) {
+      this.pageLevel = typeof spec.pageLevel === 'boolean' ? spec.pageLevel : false;
+    }
+    if (spec.hasOwnProperty('any')) {
+      this.any = spec.any;
+    }
+    if (spec.hasOwnProperty('all')) {
+      this.all = spec.all;
+    }
+    if (spec.hasOwnProperty('none')) {
+      this.none = spec.none;
+    }
+    if (spec.hasOwnProperty('tags')) {
+      this.tags = spec.tags;
+    }
+    if (spec.hasOwnProperty('matches')) {
+      if (typeof spec.matches === 'string') {
+        this.matches = new Function('return ' + spec.matches + ';')();
+      } else {
+        this.matches = spec.matches;
+      }
+    }
+  };
+  'use strict';
+  (function(axe) {
+    var definitions = [ {
+      name: 'NA',
+      value: 'inapplicable',
+      priority: 0,
+      group: 'inapplicable'
+    }, {
+      name: 'PASS',
+      value: 'passed',
+      priority: 1,
+      group: 'passes'
+    }, {
+      name: 'CANTTELL',
+      value: 'cantTell',
+      priority: 2,
+      group: 'incomplete'
+    }, {
+      name: 'FAIL',
+      value: 'failed',
+      priority: 3,
+      group: 'violations'
+    } ];
+    var constants = {
+      helpUrlBase: 'https://dequeuniversity.com/rules/',
+      results: [],
+      resultGroups: [],
+      resultGroupMap: {},
+      impact: Object.freeze([ 'minor', 'moderate', 'serious', 'critical' ])
+    };
+    definitions.forEach(function(definition) {
+      var name = definition.name;
+      var value = definition.value;
+      var priority = definition.priority;
+      var group = definition.group;
+      constants[name] = value;
+      constants[name + '_PRIO'] = priority;
+      constants[name + '_GROUP'] = group;
+      constants.results[priority] = value;
+      constants.resultGroups[priority] = group;
+      constants.resultGroupMap[value] = group;
+    });
+    Object.freeze(constants.results);
+    Object.freeze(constants.resultGroups);
+    Object.freeze(constants.resultGroupMap);
+    Object.freeze(constants);
+    Object.defineProperty(axe, 'constants', {
+      value: constants,
+      enumerable: true,
+      configurable: false,
+      writable: false
+    });
+  })(axe);
+  'use strict';
+  var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function(obj) {
+    return typeof obj;
+  } : function(obj) {
+    return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj;
+  };
+  axe.log = function() {
+    'use strict';
+    if ((typeof console === 'undefined' ? 'undefined' : _typeof(console)) === 'object' && console.log) {
+      Function.prototype.apply.call(console.log, console, arguments);
+    }
+  };
+  'use strict';
+  var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function(obj) {
+    return typeof obj;
+  } : function(obj) {
+    return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj;
+  };
+  axe.a11yCheck = function(context, options, callback) {
+    'use strict';
+    if (typeof options === 'function') {
+      callback = options;
+      options = {};
+    }
+    if (!options || (typeof options === 'undefined' ? 'undefined' : _typeof(options)) !== 'object') {
+      options = {};
+    }
+    var audit = axe._audit;
+    if (!audit) {
+      throw new Error('No audit configured');
+    }
+    options.reporter = options.reporter || audit.reporter || 'v2';
+    if (options.performanceTimer) {
+      axe.utils.performanceTimer.start();
+    }
+    var reporter = axe.getReporter(options.reporter);
+    axe._runRules(context, options, function(results) {
+      var res = reporter(results, options, callback);
+      if (res !== undefined) {
+        if (options.performanceTimer) {
+          axe.utils.performanceTimer.end();
+        }
+        callback(res);
+      }
+    }, axe.log);
+  };
+  'use strict';
+  function cleanupPlugins(resolve, reject) {
+    'use strict';
+    if (!axe._audit) {
+      throw new Error('No audit configured');
+    }
+    var q = axe.utils.queue();
+    var cleanupErrors = [];
+    Object.keys(axe.plugins).forEach(function(key) {
+      q.defer(function(res) {
+        var rej = function rej(err) {
+          cleanupErrors.push(err);
+          res();
+        };
+        try {
+          axe.plugins[key].cleanup(res, rej);
+        } catch (err) {
+          rej(err);
+        }
+      });
+    });
+    axe.utils.toArray(document.querySelectorAll('frame, iframe')).forEach(function(frame) {
+      q.defer(function(res, rej) {
+        return axe.utils.sendCommandToFrame(frame, {
+          command: 'cleanup-plugin'
+        }, res, rej);
+      });
+    });
+    q.then(function(results) {
+      if (cleanupErrors.length === 0) {
+        resolve(results);
+      } else {
+        reject(cleanupErrors);
+      }
+    }).catch(reject);
+  }
+  axe.cleanup = cleanupPlugins;
+  'use strict';
+  function configureChecksRulesAndBranding(spec) {
+    'use strict';
+    var audit;
+    audit = axe._audit;
+    if (!audit) {
+      throw new Error('No audit configured');
+    }
+    if (spec.reporter && (typeof spec.reporter === 'function' || reporters[spec.reporter])) {
+      audit.reporter = spec.reporter;
+    }
+    if (spec.checks) {
+      spec.checks.forEach(function(check) {
+        audit.addCheck(check);
+      });
+    }
+    if (spec.rules) {
+      spec.rules.forEach(function(rule) {
+        audit.addRule(rule);
+      });
+    }
+    if (typeof spec.branding !== 'undefined') {
+      audit.setBranding(spec.branding);
+    } else {
+      audit._constructHelpUrls();
+    }
+    if (spec.tagExclude) {
+      audit.tagExclude = spec.tagExclude;
+    }
+  }
+  axe.configure = configureChecksRulesAndBranding;
+  'use strict';
+  axe.getRules = function(tags) {
+    'use strict';
+    tags = tags || [];
+    var matchingRules = !tags.length ? axe._audit.rules : axe._audit.rules.filter(function(item) {
+      return !!tags.filter(function(tag) {
+        return item.tags.indexOf(tag) !== -1;
+      }).length;
+    });
+    var ruleData = axe._audit.data.rules || {};
+    return matchingRules.map(function(matchingRule) {
+      var rd = ruleData[matchingRule.id] || {};
+      return {
+        ruleId: matchingRule.id,
+        description: rd.description,
+        help: rd.help,
+        helpUrl: rd.helpUrl,
+        tags: matchingRule.tags
+      };
+    });
+  };
+  'use strict';
+  function runCommand(data, keepalive, callback) {
+    'use strict';
+    var resolve = callback;
+    var reject = function reject(err) {
+      if (err instanceof Error === false) {
+        err = new Error(err);
+      }
+      callback(err);
+    };
+    var context = data && data.context || {};
+    if (context.include && !context.include.length) {
+      context.include = [ document ];
+    }
+    var options = data && data.options || {};
+    switch (data.command) {
+     case 'rules':
+      return runRules(context, options, resolve, reject);
+
+     case 'cleanup-plugin':
+      return cleanupPlugins(resolve, reject);
+
+     default:
+      if (axe._audit && axe._audit.commands && axe._audit.commands[data.command]) {
+        return axe._audit.commands[data.command](data, callback);
+      }
+    }
+  }
+  axe._load = function(audit) {
+    'use strict';
+    axe.utils.respondable.subscribe('axe.ping', function(data, keepalive, respond) {
+      respond({
+        axe: true
+      });
+    });
+    axe.utils.respondable.subscribe('axe.start', runCommand);
+    axe._audit = new Audit(audit);
+  };
+  'use strict';
+  var axe = axe || {};
+  axe.plugins = {};
+  function Plugin(spec) {
+    'use strict';
+    this._run = spec.run;
+    this._collect = spec.collect;
+    this._registry = {};
+    spec.commands.forEach(function(command) {
+      axe._audit.registerCommand(command);
+    });
+  }
+  Plugin.prototype.run = function() {
+    'use strict';
+    return this._run.apply(this, arguments);
+  };
+  Plugin.prototype.collect = function() {
+    'use strict';
+    return this._collect.apply(this, arguments);
+  };
+  Plugin.prototype.cleanup = function(done) {
+    'use strict';
+    var q = axe.utils.queue();
+    var that = this;
+    Object.keys(this._registry).forEach(function(key) {
+      q.defer(function(done) {
+        that._registry[key].cleanup(done);
+      });
+    });
+    q.then(function() {
+      done();
+    });
+  };
+  Plugin.prototype.add = function(impl) {
+    'use strict';
+    this._registry[impl.id] = impl;
+  };
+  axe.registerPlugin = function(plugin) {
+    'use strict';
+    axe.plugins[plugin.id] = new Plugin(plugin);
+  };
+  'use strict';
+  var reporters = {};
+  var defaultReporter;
+  axe.getReporter = function(reporter) {
+    'use strict';
+    if (typeof reporter === 'string' && reporters[reporter]) {
+      return reporters[reporter];
+    }
+    if (typeof reporter === 'function') {
+      return reporter;
+    }
+    return defaultReporter;
+  };
+  axe.addReporter = function registerReporter(name, cb, isDefault) {
+    'use strict';
+    reporters[name] = cb;
+    if (isDefault) {
+      defaultReporter = cb;
+    }
+  };
+  'use strict';
+  function resetConfiguration() {
+    'use strict';
+    var audit = axe._audit;
+    if (!audit) {
+      throw new Error('No audit configured');
+    }
+    audit.resetRulesAndChecks();
+  }
+  axe.reset = resetConfiguration;
+  'use strict';
+  function runRules(context, options, resolve, reject) {
+    'use strict';
+    try {
+      context = new Context(context);
+    } catch (e) {
+      return reject(e);
+    }
+    var q = axe.utils.queue();
+    var audit = axe._audit;
+    if (options.performanceTimer) {
+      axe.utils.performanceTimer.auditStart();
+    }
+    if (context.frames.length && options.iframes !== false) {
+      q.defer(function(res, rej) {
+        axe.utils.collectResultsFromFrames(context, options, 'rules', null, res, rej);
+      });
+    }
+    q.defer(function(res, rej) {
+      audit.run(context, options, res, rej);
+    });
+    q.then(function(data) {
+      try {
+        if (options.performanceTimer) {
+          axe.utils.performanceTimer.auditEnd();
+        }
+        var results = axe.utils.mergeResults(data.map(function(d) {
+          return {
+            results: d
+          };
+        }));
+        if (context.initiator) {
+          results = audit.after(results, options);
+          results.forEach(axe.utils.publishMetaData);
+          results = results.map(axe.utils.finalizeRuleResult);
+        }
+        try {
+          resolve(results);
+        } catch (e) {
+          axe.log(e);
+        }
+      } catch (e) {
+        reject(e);
+      }
+    }).catch(reject);
+  }
+  axe._runRules = runRules;
+  'use strict';
+  var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function(obj) {
+    return typeof obj;
+  } : function(obj) {
+    return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj;
+  };
+  function isContext(potential) {
+    'use strict';
+    switch (true) {
+     case typeof potential === 'string':
+     case Array.isArray(potential):
+     case Node && potential instanceof Node:
+     case NodeList && potential instanceof NodeList:
+      return true;
+
+     case (typeof potential === 'undefined' ? 'undefined' : _typeof(potential)) !== 'object':
+      return false;
+
+     case potential.include !== undefined:
+     case potential.exclude !== undefined:
+     case typeof potential.length === 'number':
+      return true;
+
+     default:
+      return false;
+    }
+  }
+  var noop = function noop() {};
+  function normalizeRunParams(context, options, callback) {
+    'use strict';
+    var typeErr = new TypeError('axe.run arguments are invalid');
+    if (!isContext(context)) {
+      if (callback !== undefined) {
+        throw typeErr;
+      }
+      callback = options;
+      options = context;
+      context = document;
+    }
+    if ((typeof options === 'undefined' ? 'undefined' : _typeof(options)) !== 'object') {
+      if (callback !== undefined) {
+        throw typeErr;
+      }
+      callback = options;
+      options = {};
+    }
+    if (typeof callback !== 'function' && callback !== undefined) {
+      throw typeErr;
+    }
+    return {
+      context: context,
+      options: options,
+      callback: callback || noop
+    };
+  }
+  axe.run = function(context, options, callback) {
+    'use strict';
+    if (!axe._audit) {
+      throw new Error('No audit configured');
+    }
+    var args = normalizeRunParams(context, options, callback);
+    context = args.context;
+    options = args.options;
+    callback = args.callback;
+    options.reporter = options.reporter || axe._audit.reporter || 'v1';
+    if (options.performanceTimer) {
+      axe.utils.performanceTimer.start();
+    }
+    var p = void 0;
+    var reject = noop;
+    var resolve = noop;
+    if (window.Promise && callback === noop) {
+      p = new Promise(function(_resolve, _reject) {
+        reject = _reject;
+        resolve = _resolve;
+      });
+    }
+    axe._runRules(context, options, function(rawResults) {
+      var respond = function respond(results) {
+        try {
+          callback(null, results);
+        } catch (e) {
+          axe.log(e);
+        }
+        resolve(results);
+      };
+      if (options.performanceTimer) {
+        axe.utils.performanceTimer.end();
+      }
+      try {
+        var reporter = axe.getReporter(options.reporter);
+        var results = reporter(rawResults, options, respond);
+        if (results !== undefined) {
+          respond(results);
+        }
+      } catch (err) {
+        callback(err);
+        reject(err);
+      }
+    }, function(err) {
+      callback(err);
+      reject(err);
+    });
+    return p;
+  };
+  'use strict';
+  helpers.failureSummary = function failureSummary(nodeData) {
+    'use strict';
+    var failingChecks = {};
+    failingChecks.none = nodeData.none.concat(nodeData.all);
+    failingChecks.any = nodeData.any;
+    return Object.keys(failingChecks).map(function(key) {
+      if (!failingChecks[key].length) {
+        return;
+      }
+      var sum = axe._audit.data.failureSummaries[key];
+      if (sum && typeof sum.failureMessage === 'function') {
+        return sum.failureMessage(failingChecks[key].map(function(check) {
+          return check.message || '';
+        }));
+      }
+    }).filter(function(i) {
+      return i !== undefined;
+    }).join('\n\n');
+  };
+  'use strict';
+  helpers.incompleteFallbackMessage = function incompleteFallbackMessage() {
+    'use strict';
+    return axe._audit.data.incompleteFallbackMessage();
+  };
+  'use strict';
+  var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function(obj) {
+    return typeof obj;
+  } : function(obj) {
+    return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj;
+  };
+  function normalizeRelatedNodes(node, options) {
+    'use strict';
+    [ 'any', 'all', 'none' ].forEach(function(type) {
+      if (!Array.isArray(node[type])) {
+        return;
+      }
+      node[type].filter(function(checkRes) {
+        return Array.isArray(checkRes.relatedNodes);
+      }).forEach(function(checkRes) {
+        checkRes.relatedNodes = checkRes.relatedNodes.map(function(relatedNode) {
+          var res = {
+            html: relatedNode.source
+          };
+          if (options.elementRef && !relatedNode.fromFrame) {
+            res.element = relatedNode.element;
+          }
+          if (options.selectors !== false || relatedNode.fromFrame) {
+            res.target = relatedNode.selector;
+          }
+          if (options.xpath) {
+            res.xpath = relatedNode.xpath;
+          }
+          return res;
+        });
+      });
+    });
+  }
+  var resultKeys = axe.constants.resultGroups;
+  helpers.processAggregate = function(results, options) {
+    var resultObject = axe.utils.aggregateResult(results);
+    resultObject.timestamp = new Date().toISOString();
+    resultObject.url = window.location.href;
+    resultKeys.forEach(function(key) {
+      resultObject[key] = (resultObject[key] || []).map(function(ruleResult) {
+        ruleResult = Object.assign({}, ruleResult);
+        if (Array.isArray(ruleResult.nodes) && ruleResult.nodes.length > 0) {
+          ruleResult.nodes = ruleResult.nodes.map(function(subResult) {
+            if (_typeof(subResult.node) === 'object') {
+              subResult.html = subResult.node.source;
+              if (options.elementRef && !subResult.node.fromFrame) {
+                subResult.element = subResult.node.element;
+              }
+              if (options.selectors !== false || subResult.node.fromFrame) {
+                subResult.target = subResult.node.selector;
+              }
+              if (options.xpath) {
+                subResult.xpath = subResult.node.xpath;
+              }
+            }
+            delete subResult.result;
+            delete subResult.node;
+            normalizeRelatedNodes(subResult, options);
+            return subResult;
+          });
+        }
+        resultKeys.forEach(function(key) {
+          return delete ruleResult[key];
+        });
+        delete ruleResult.pageLevel;
+        delete ruleResult.result;
+        return ruleResult;
+      });
+    });
+    return resultObject;
+  };
+  'use strict';
+  axe.addReporter('na', function(results, options, callback) {
+    'use strict';
+    if (typeof options === 'function') {
+      callback = options;
+      options = {};
+    }
+    var out = helpers.processAggregate(results, options);
+    callback({
+      violations: out.violations,
+      passes: out.passes,
+      incomplete: out.incomplete,
+      inapplicable: out.inapplicable,
+      timestamp: out.timestamp,
+      url: out.url
+    });
+  });
+  'use strict';
+  axe.addReporter('no-passes', function(results, options, callback) {
+    'use strict';
+    if (typeof options === 'function') {
+      callback = options;
+      options = {};
+    }
+    var out = helpers.processAggregate(results, options);
+    callback({
+      violations: out.violations,
+      timestamp: out.timestamp,
+      url: out.url
+    });
+  });
+  'use strict';
+  axe.addReporter('raw', function(results, options, callback) {
+    'use strict';
+    if (typeof options === 'function') {
+      callback = options;
+      options = {};
+    }
+    callback(results);
+  });
+  'use strict';
+  axe.addReporter('v1', function(results, options, callback) {
+    'use strict';
+    if (typeof options === 'function') {
+      callback = options;
+      options = {};
+    }
+    var out = helpers.processAggregate(results, options);
+    out.violations.forEach(function(result) {
+      return result.nodes.forEach(function(nodeResult) {
+        nodeResult.failureSummary = helpers.failureSummary(nodeResult);
+      });
+    });
+    callback({
+      violations: out.violations,
+      passes: out.passes,
+      incomplete: out.incomplete,
+      inapplicable: out.inapplicable,
+      timestamp: out.timestamp,
+      url: out.url
+    });
+  });
+  'use strict';
+  axe.addReporter('v2', function(results, options, callback) {
+    'use strict';
+    if (typeof options === 'function') {
+      callback = options;
+      options = {};
+    }
+    var out = helpers.processAggregate(results, options);
+    callback({
+      violations: out.violations,
+      passes: out.passes,
+      incomplete: out.incomplete,
+      inapplicable: out.inapplicable,
+      timestamp: out.timestamp,
+      url: out.url
+    });
+  }, true);
+  'use strict';
+  axe.utils.aggregate = function(map, values, initial) {
+    values = values.slice();
+    if (initial) {
+      values.push(initial);
+    }
+    var sorting = values.map(function(val) {
+      return map.indexOf(val);
+    }).sort();
+    return map[sorting.pop()];
+  };
+  'use strict';
+  var checkMap = [];
+  checkMap[axe.constants.PASS_PRIO] = true;
+  checkMap[axe.constants.CANTTELL_PRIO] = null;
+  checkMap[axe.constants.FAIL_PRIO] = false;
+  var checkTypes = [ 'any', 'all', 'none' ];
+  function anyAllNone(obj, functor) {
+    return checkTypes.reduce(function(out, type) {
+      out[type] = (obj[type] || []).map(function(val) {
+        return functor(val, type);
+      });
+      return out;
+    }, {});
+  }
+  axe.utils.aggregateChecks = function(nodeResOriginal) {
+    var nodeResult = Object.assign({}, nodeResOriginal);
+    anyAllNone(nodeResult, function(check, type) {
+      var i = checkMap.indexOf(check.result);
+      check.priority = i !== -1 ? i : axe.constants.CANTTELL_PRIO;
+      if (type === 'none') {
+        check.priority = 4 - check.priority;
+      }
+    });
+    var priorities = anyAllNone(nodeResult, function(c) {
+      return c.priority;
+    });
+    nodeResult.priority = Math.max(priorities.all.reduce(function(a, b) {
+      return Math.max(a, b);
+    }, 0), priorities.none.reduce(function(a, b) {
+      return Math.max(a, b);
+    }, 0), priorities.any.reduce(function(a, b) {
+      return Math.min(a, b);
+    }, 4) % 4);
+    var impacts = [];
+    checkTypes.forEach(function(type) {
+      nodeResult[type] = nodeResult[type].filter(function(check) {
+        return check.priority === nodeResult.priority;
+      });
+      nodeResult[type].forEach(function(check) {
+        return impacts.push(check.impact);
+      });
+    });
+    if (nodeResult.priority === axe.constants.FAIL_PRIO) {
+      nodeResult.impact = axe.utils.aggregate(axe.constants.impact, impacts);
+    } else {
+      nodeResult.impact = null;
+    }
+    anyAllNone(nodeResult, function(c) {
+      delete c.result;
+      delete c.priority;
+    });
+    nodeResult.result = axe.constants.results[nodeResult.priority];
+    delete nodeResult.priority;
+    return nodeResult;
+  };
+  'use strict';
+  function copyToGroup(resultObject, subResult, group) {
+    var resultCopy = Object.assign({}, subResult);
+    resultCopy.nodes = (resultCopy[group] || []).concat();
+    axe.constants.resultGroups.forEach(function(group) {
+      delete resultCopy[group];
+    });
+    resultObject[group].push(resultCopy);
+  }
+  axe.utils.aggregateResult = function(results) {
+    var resultObject = {};
+    axe.constants.resultGroups.forEach(function(groupName) {
+      return resultObject[groupName] = [];
+    });
+    results.forEach(function(subResult) {
+      if (subResult.error) {
+        copyToGroup(resultObject, subResult, axe.constants.CANTTELL_GROUP);
+      } else if (subResult.result === axe.constants.NA) {
+        copyToGroup(resultObject, subResult, axe.constants.NA_GROUP);
+      } else {
+        axe.constants.resultGroups.forEach(function(group) {
+          if (Array.isArray(subResult[group]) && subResult[group].length > 0) {
+            copyToGroup(resultObject, subResult, group);
+          }
+        });
+      }
+    });
+    return resultObject;
+  };
+  'use strict';
+  (function() {
+    axe.utils.aggregateRule = function(subResults) {
+      var ruleResult = {};
+      subResults = subResults.map(function(subResult) {
+        if (subResult.any && subResult.all && subResult.none) {
+          return axe.utils.aggregateChecks(subResult);
+        } else if (Array.isArray(subResult.node)) {
+          return axe.utils.finalizeRuleResult(subResult);
+        } else {
+          throw new TypeError('Invalid Result type');
+        }
+      });
+      var resultList = subResults.map(function(node) {
+        return node.result;
+      });
+      ruleResult.result = axe.utils.aggregate(axe.constants.results, resultList, ruleResult.result);
+      axe.constants.resultGroups.forEach(function(group) {
+        return ruleResult[group] = [];
+      });
+      subResults.forEach(function(subResult) {
+        var groupName = axe.constants.resultGroupMap[subResult.result];
+        ruleResult[groupName].push(subResult);
+      });
+      var failGroup = axe.constants.FAIL_GROUP;
+      if (ruleResult[failGroup].length > 0) {
+        var impactList = ruleResult[failGroup].map(function(failure) {
+          return failure.impact;
+        });
+        ruleResult.impact = axe.utils.aggregate(axe.constants.impact, impactList) || null;
+      } else {
+        ruleResult.impact = null;
+      }
+      return ruleResult;
+    };
+  })();
+  'use strict';
+  function areStylesSet(el, styles, stopAt) {
+    'use strict';
+    var styl = window.getComputedStyle(el, null);
+    var set = false;
+    if (!styl) {
+      return false;
+    }
+    styles.forEach(function(att) {
+      if (styl.getPropertyValue(att.property) === att.value) {
+        set = true;
+      }
+    });
+    if (set) {
+      return true;
+    }
+    if (el.nodeName.toUpperCase() === stopAt.toUpperCase() || !el.parentNode) {
+      return false;
+    }
+    return areStylesSet(el.parentNode, styles, stopAt);
+  }
+  axe.utils.areStylesSet = areStylesSet;
+  'use strict';
+  axe.utils.checkHelper = function checkHelper(checkResult, options, resolve, reject) {
+    'use strict';
+    return {
+      isAsync: false,
+      async: function async() {
+        this.isAsync = true;
+        return function(result) {
+          if (result instanceof Error === false) {
+            checkResult.value = result;
+            resolve(checkResult);
+          } else {
+            reject(result);
+          }
+        };
+      },
+      data: function data(_data) {
+        checkResult.data = _data;
+      },
+      relatedNodes: function relatedNodes(nodes) {
+        nodes = nodes instanceof Node ? [ nodes ] : axe.utils.toArray(nodes);
+        checkResult.relatedNodes = nodes.map(function(element) {
+          return new axe.utils.DqElement(element, options);
+        });
+      }
+    };
+  };
+  'use strict';
+  var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function(obj) {
+    return typeof obj;
+  } : function(obj) {
+    return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj;
+  };
+  axe.utils.clone = function(obj) {
+    'use strict';
+    var index, length, out = obj;
+    if (obj !== null && (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object') {
+      if (Array.isArray(obj)) {
+        out = [];
+        for (index = 0, length = obj.length; index < length; index++) {
+          out[index] = axe.utils.clone(obj[index]);
+        }
+      } else {
+        out = {};
+        for (index in obj) {
+          out[index] = axe.utils.clone(obj[index]);
+        }
+      }
+    }
+    return out;
+  };
+  'use strict';
+  function err(message, node) {
+    'use strict';
+    return new Error(message + ': ' + axe.utils.getSelector(node));
+  }
+  axe.utils.sendCommandToFrame = function(node, parameters, resolve, reject) {
+    'use strict';
+    var win = node.contentWindow;
+    if (!win) {
+      axe.log('Frame does not have a content window', node);
+      resolve(null);
+      return;
+    }
+    var timeout = setTimeout(function() {
+      timeout = setTimeout(function() {
+        var errMsg = err('No response from frame', node);
+        if (!parameters.debug) {
+          axe.log(errMsg);
+          resolve(null);
+        } else {
+          reject(errMsg);
+        }
+      }, 0);
+    }, 500);
+    axe.utils.respondable(win, 'axe.ping', null, undefined, function() {
+      clearTimeout(timeout);
+      timeout = setTimeout(function() {
+        reject(err('Axe in frame timed out', node));
+      }, 3e4);
+      axe.utils.respondable(win, 'axe.start', parameters, undefined, function(data) {
+        clearTimeout(timeout);
+        if (data instanceof Error === false) {
+          resolve(data);
+        } else {
+          reject(data);
+        }
+      });
+    });
+  };
+  function collectResultsFromFrames(context, options, command, parameter, resolve, reject) {
+    'use strict';
+    var q = axe.utils.queue();
+    var frames = context.frames;
+    frames.forEach(function(frame) {
+      var params = {
+        options: options,
+        command: command,
+        parameter: parameter,
+        context: {
+          initiator: false,
+          page: context.page,
+          include: frame.include || [],
+          exclude: frame.exclude || []
+        }
+      };
+      q.defer(function(res, rej) {
+        var node = frame.node;
+        axe.utils.sendCommandToFrame(node, params, function(data) {
+          if (data) {
+            return res({
+              results: data,
+              frameElement: node,
+              frame: axe.utils.getSelector(node)
+            });
+          }
+          res(null);
+        }, rej);
+      });
+    });
+    q.then(function(data) {
+      resolve(axe.utils.mergeResults(data, options));
+    }).catch(reject);
+  }
+  axe.utils.collectResultsFromFrames = collectResultsFromFrames;
+  'use strict';
+  axe.utils.contains = function(node, otherNode) {
+    'use strict';
+    function containsShadowChild(node, otherNode) {
+      if (node.shadowId === otherNode.shadowId) {
+        return true;
+      }
+      return !!node.children.find(function(child) {
+        return containsShadowChild(child, otherNode);
+      });
+    }
+    if (node.shadowId || otherNode.shadowId) {
+      return containsShadowChild(node, otherNode);
+    }
+    if (typeof node.actualNode.contains === 'function') {
+      return node.actualNode.contains(otherNode.actualNode);
+    }
+    return !!(node.actualNode.compareDocumentPosition(otherNode.actualNode) & 16);
+  };
+  'use strict';
+  (function(axe) {
+    /*!
+  * The copyright below covers the code within this function block only
+  *
+  * Copyright (c) 2013 Dulin Marat
+  * 
+  * Permission is hereby granted, free of charge, to any person obtaining a copy
+  * of this software and associated documentation files (the "Software"), to deal
+  * in the Software without restriction, including without limitation the rights
+  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  * copies of the Software, and to permit persons to whom the Software is
+  * furnished to do so, subject to the following conditions:
+  * 
+  * The above copyright notice and this permission notice shall be included in
+  * all copies or substantial portions of the Software.
+  * 
+  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+  * THE SOFTWARE.
+  */
+    function CssSelectorParser() {
+      this.pseudos = {};
+      this.attrEqualityMods = {};
+      this.ruleNestingOperators = {};
+      this.substitutesEnabled = false;
+    }
+    CssSelectorParser.prototype.registerSelectorPseudos = function(name) {
+      for (var j = 0, len = arguments.length; j < len; j++) {
+        name = arguments[j];
+        this.pseudos[name] = 'selector';
+      }
+      return this;
+    };
+    CssSelectorParser.prototype.unregisterSelectorPseudos = function(name) {
+      for (var j = 0, len = arguments.length; j < len; j++) {
+        name = arguments[j];
+        delete this.pseudos[name];
+      }
+      return this;
+    };
+    CssSelectorParser.prototype.registerNumericPseudos = function(name) {
+      for (var j = 0, len = arguments.length; j < len; j++) {
+        name = arguments[j];
+        this.pseudos[name] = 'numeric';
+      }
+      return this;
+    };
+    CssSelectorParser.prototype.unregisterNumericPseudos = function(name) {
+      for (var j = 0, len = arguments.length; j < len; j++) {
+        name = arguments[j];
+        delete this.pseudos[name];
+      }
+      return this;
+    };
+    CssSelectorParser.prototype.registerNestingOperators = function(operator) {
+      for (var j = 0, len = arguments.length; j < len; j++) {
+        operator = arguments[j];
+        this.ruleNestingOperators[operator] = true;
+      }
+      return this;
+    };
+    CssSelectorParser.prototype.unregisterNestingOperators = function(operator) {
+      for (var j = 0, len = arguments.length; j < len; j++) {
+        operator = arguments[j];
+        delete this.ruleNestingOperators[operator];
+      }
+      return this;
+    };
+    CssSelectorParser.prototype.registerAttrEqualityMods = function(mod) {
+      for (var j = 0, len = arguments.length; j < len; j++) {
+        mod = arguments[j];
+        this.attrEqualityMods[mod] = true;
+      }
+      return this;
+    };
+    CssSelectorParser.prototype.unregisterAttrEqualityMods = function(mod) {
+      for (var j = 0, len = arguments.length; j < len; j++) {
+        mod = arguments[j];
+        delete this.attrEqualityMods[mod];
+      }
+      return this;
+    };
+    CssSelectorParser.prototype.enableSubstitutes = function() {
+      this.substitutesEnabled = true;
+      return this;
+    };
+    CssSelectorParser.prototype.disableSubstitutes = function() {
+      this.substitutesEnabled = false;
+      return this;
+    };
+    function isIdentStart(c) {
+      return c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c === '-' || c === '_';
+    }
+    function isIdent(c) {
+      return c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9' || c === '-' || c === '_';
+    }
+    function isHex(c) {
+      return c >= 'a' && c <= 'f' || c >= 'A' && c <= 'F' || c >= '0' && c <= '9';
+    }
+    function isDecimal(c) {
+      return c >= '0' && c <= '9';
+    }
+    function isAttrMatchOperator(chr) {
+      return chr === '=' || chr === '^' || chr === '$' || chr === '*' || chr === '~';
+    }
+    var identSpecialChars = {
+      '!': true,
+      '"': true,
+      '#': true,
+      $: true,
+      '%': true,
+      '&': true,
+      '\'': true,
+      '(': true,
+      ')': true,
+      '*': true,
+      '+': true,
+      ',': true,
+      '.': true,
+      '/': true,
+      ';': true,
+      '<': true,
+      '=': true,
+      '>': true,
+      '?': true,
+      '@': true,
+      '[': true,
+      '\\': true,
+      ']': true,
+      '^': true,
+      '`': true,
+      '{': true,
+      '|': true,
+      '}': true,
+      '~': true
+    };
+    var strReplacementsRev = {
+      '\n': '\\n',
+      '\r': '\\r',
+      '\t': '\\t',
+      '\f': '\\f',
+      '\v': '\\v'
+    };
+    var singleQuoteEscapeChars = {
+      n: '\n',
+      r: '\r',
+      t: '\t',
+      f: '\f',
+      '\\': '\\',
+      '\'': '\''
+    };
+    var doubleQuotesEscapeChars = {
+      n: '\n',
+      r: '\r',
+      t: '\t',
+      f: '\f',
+      '\\': '\\',
+      '"': '"'
+    };
+    function ParseContext(str, pos, pseudos, attrEqualityMods, ruleNestingOperators, substitutesEnabled) {
+      var chr, getIdent, getStr, l, skipWhitespace;
+      l = str.length;
+      chr = null;
+      getStr = function getStr(quote, escapeTable) {
+        var esc, hex, result;
+        result = '';
+        pos++;
+        chr = str.charAt(pos);
+        while (pos < l) {
+          if (chr === quote) {
+            pos++;
+            return result;
+          } else if (chr === '\\') {
+            pos++;
+            chr = str.charAt(pos);
+            if (chr === quote) {
+              result += quote;
+            } else if (esc = escapeTable[chr]) {
+              result += esc;
+            } else if (isHex(chr)) {
+              hex = chr;
+              pos++;
+              chr = str.charAt(pos);
+              while (isHex(chr)) {
+                hex += chr;
+                pos++;
+                chr = str.charAt(pos);
+              }
+              if (chr === ' ') {
+                pos++;
+                chr = str.charAt(pos);
+              }
+              result += String.fromCharCode(parseInt(hex, 16));
+              continue;
+            } else {
+              result += chr;
+            }
+          } else {
+            result += chr;
+          }
+          pos++;
+          chr = str.charAt(pos);
+        }
+        return result;
+      };
+      getIdent = function getIdent() {
+        var result = '';
+        chr = str.charAt(pos);
+        while (pos < l) {
+          if (isIdent(chr)) {
+            result += chr;
+          } else if (chr === '\\') {
+            pos++;
+            if (pos >= l) {
+              throw Error('Expected symbol but end of file reached.');
+            }
+            chr = str.charAt(pos);
+            if (identSpecialChars[chr]) {
+              result += chr;
+            } else if (isHex(chr)) {
+              var hex = chr;
+              pos++;
+              chr = str.charAt(pos);
+              while (isHex(chr)) {
+                hex += chr;
+                pos++;
+                chr = str.charAt(pos);
+              }
+              if (chr === ' ') {
+                pos++;
+                chr = str.charAt(pos);
+              }
+              result += String.fromCharCode(parseInt(hex, 16));
+              continue;
+            } else {
+              result += chr;
+            }
+          } else {
+            return result;
+          }
+          pos++;
+          chr = str.charAt(pos);
+        }
+        return result;
+      };
+      skipWhitespace = function skipWhitespace() {
+        chr = str.charAt(pos);
+        var result = false;
+        while (chr === ' ' || chr === '\t' || chr === '\n' || chr === '\r' || chr === '\f') {
+          result = true;
+          pos++;
+          chr = str.charAt(pos);
+        }
+        return result;
+      };
+      this.parse = function() {
+        var res = this.parseSelector();
+        if (pos < l) {
+          throw Error('Rule expected but "' + str.charAt(pos) + '" found.');
+        }
+        return res;
+      };
+      this.parseSelector = function() {
+        var res;
+        var selector = res = this.parseSingleSelector();
+        chr = str.charAt(pos);
+        while (chr === ',') {
+          pos++;
+          skipWhitespace();
+          if (res.type !== 'selectors') {
+            res = {
+              type: 'selectors',
+              selectors: [ selector ]
+            };
+          }
+          selector = this.parseSingleSelector();
+          if (!selector) {
+            throw Error('Rule expected after ",".');
+          }
+          res.selectors.push(selector);
+        }
+        return res;
+      };
+      this.parseSingleSelector = function() {
+        skipWhitespace();
+        var selector = {
+          type: 'ruleSet'
+        };
+        var rule = this.parseRule();
+        if (!rule) {
+          return null;
+        }
+        var currentRule = selector;
+        while (rule) {
+          rule.type = 'rule';
+          currentRule.rule = rule;
+          currentRule = rule;
+          skipWhitespace();
+          chr = str.charAt(pos);
+          if (pos >= l || chr === ',' || chr === ')') {
+            break;
+          }
+          if (ruleNestingOperators[chr]) {
+            var op = chr;
+            pos++;
+            skipWhitespace();
+            rule = this.parseRule();
+            if (!rule) {
+              throw Error('Rule expected after "' + op + '".');
+            }
+            rule.nestingOperator = op;
+          } else {
+            rule = this.parseRule();
+            if (rule) {
+              rule.nestingOperator = null;
+            }
+          }
+        }
+        return selector;
+      };
+      this.parseRule = function() {
+        var rule = null;
+        while (pos < l) {
+          chr = str.charAt(pos);
+          if (chr === '*') {
+            pos++;
+            (rule = rule || {}).tagName = '*';
+          } else if (isIdentStart(chr) || chr === '\\') {
+            (rule = rule || {}).tagName = getIdent();
+          } else if (chr === '.') {
+            pos++;
+            rule = rule || {};
+            (rule.classNames = rule.classNames || []).push(getIdent());
+          } else if (chr === '#') {
+            pos++;
+            (rule = rule || {}).id = getIdent();
+          } else if (chr === '[') {
+            pos++;
+            skipWhitespace();
+            var attr = {
+              name: getIdent()
+            };
+            skipWhitespace();
+            if (chr === ']') {
+              pos++;
+            } else {
+              var operator = '';
+              if (attrEqualityMods[chr]) {
+                operator = chr;
+                pos++;
+                chr = str.charAt(pos);
+              }
+              if (pos >= l) {
+                throw Error('Expected "=" but end of file reached.');
+              }
+              if (chr !== '=') {
+                throw Error('Expected "=" but "' + chr + '" found.');
+              }
+              attr.operator = operator + '=';
+              pos++;
+              skipWhitespace();
+              var attrValue = '';
+              attr.valueType = 'string';
+              if (chr === '"') {
+                attrValue = getStr('"', doubleQuotesEscapeChars);
+              } else if (chr === '\'') {
+                attrValue = getStr('\'', singleQuoteEscapeChars);
+              } else if (substitutesEnabled && chr === '$') {
+                pos++;
+                attrValue = getIdent();
+                attr.valueType = 'substitute';
+              } else {
+                while (pos < l) {
+                  if (chr === ']') {
+                    break;
+                  }
+                  attrValue += chr;
+                  pos++;
+                  chr = str.charAt(pos);
+                }
+                attrValue = attrValue.trim();
+              }
+              skipWhitespace();
+              if (pos >= l) {
+                throw Error('Expected "]" but end of file reached.');
+              }
+              if (chr !== ']') {
+                throw Error('Expected "]" but "' + chr + '" found.');
+              }
+              pos++;
+              attr.value = attrValue;
+            }
+            rule = rule || {};
+            (rule.attrs = rule.attrs || []).push(attr);
+          } else if (chr === ':') {
+            pos++;
+            var pseudoName = getIdent();
+            var pseudo = {
+              name: pseudoName
+            };
+            if (chr === '(') {
+              pos++;
+              var value = '';
+              skipWhitespace();
+              if (pseudos[pseudoName] === 'selector') {
+                pseudo.valueType = 'selector';
+                value = this.parseSelector();
+              } else {
+                pseudo.valueType = pseudos[pseudoName] || 'string';
+                if (chr === '"') {
+                  value = getStr('"', doubleQuotesEscapeChars);
+                } else if (chr === '\'') {
+                  value = getStr('\'', singleQuoteEscapeChars);
+                } else if (substitutesEnabled && chr === '$') {
+                  pos++;
+                  value = getIdent();
+                  pseudo.valueType = 'substitute';
+                } else {
+                  while (pos < l) {
+                    if (chr === ')') {
+                      break;
+                    }
+                    value += chr;
+                    pos++;
+                    chr = str.charAt(pos);
+                  }
+                  value = value.trim();
+                }
+                skipWhitespace();
+              }
+              if (pos >= l) {
+                throw Error('Expected ")" but end of file reached.');
+              }
+              if (chr !== ')') {
+                throw Error('Expected ")" but "' + chr + '" found.');
+              }
+              pos++;
+              pseudo.value = value;
+            }
+            rule = rule || {};
+            (rule.pseudos = rule.pseudos || []).push(pseudo);
+          } else {
+            break;
+          }
+        }
+        return rule;
+      };
+      return this;
+    }
+    CssSelectorParser.prototype.parse = function(str) {
+      var context = new ParseContext(str, 0, this.pseudos, this.attrEqualityMods, this.ruleNestingOperators, this.substitutesEnabled);
+      return context.parse();
+    };
+    CssSelectorParser.prototype.escapeIdentifier = function(s) {
+      var result = '';
+      var i = 0;
+      var len = s.length;
+      while (i < len) {
+        var chr = s.charAt(i);
+        if (identSpecialChars[chr]) {
+          result += '\\' + chr;
+        } else {
+          if (!(chr === '_' || chr === '-' || chr >= 'A' && chr <= 'Z' || chr >= 'a' && chr <= 'z' || i !== 0 && chr >= '0' && chr <= '9')) {
+            var charCode = chr.charCodeAt(0);
+            if ((charCode & 63488) === 55296) {
+              var extraCharCode = s.charCodeAt(i++);
+              if ((charCode & 64512) !== 55296 || (extraCharCode & 64512) !== 56320) {
+                throw Error('UCS-2(decode): illegal sequence');
+              }
+              charCode = ((charCode & 1023) << 10) + (extraCharCode & 1023) + 65536;
+            }
+            result += '\\' + charCode.toString(16) + ' ';
+          } else {
+            result += chr;
+          }
+        }
+        i++;
+      }
+      return result;
+    };
+    CssSelectorParser.prototype.escapeStr = function(s) {
+      var result = '';
+      var i = 0;
+      var len = s.length;
+      var chr, replacement;
+      while (i < len) {
+        chr = s.charAt(i);
+        if (chr === '"') {
+          chr = '\\"';
+        } else if (chr === '\\') {
+          chr = '\\\\';
+        } else if (replacement = strReplacementsRev[chr]) {
+          chr = replacement;
+        }
+        result += chr;
+        i++;
+      }
+      return '"' + result + '"';
+    };
+    CssSelectorParser.prototype.render = function(path) {
+      return this._renderEntity(path).trim();
+    };
+    CssSelectorParser.prototype._renderEntity = function(entity) {
+      var currentEntity, parts, res;
+      res = '';
+      switch (entity.type) {
+       case 'ruleSet':
+        currentEntity = entity.rule;
+        parts = [];
+        while (currentEntity) {
+          if (currentEntity.nestingOperator) {
+            parts.push(currentEntity.nestingOperator);
+          }
+          parts.push(this._renderEntity(currentEntity));
+          currentEntity = currentEntity.rule;
+        }
+        res = parts.join(' ');
+        break;
+
+       case 'selectors':
+        res = entity.selectors.map(this._renderEntity, this).join(', ');
+        break;
+
+       case 'rule':
+        if (entity.tagName) {
+          if (entity.tagName === '*') {
+            res = '*';
+          } else {
+            res = this.escapeIdentifier(entity.tagName);
+          }
+        }
+        if (entity.id) {
+          res += '#' + this.escapeIdentifier(entity.id);
+        }
+        if (entity.classNames) {
+          res += entity.classNames.map(function(cn) {
+            return '.' + this.escapeIdentifier(cn);
+          }, this).join('');
+        }
+        if (entity.attrs) {
+          res += entity.attrs.map(function(attr) {
+            if (attr.operator) {
+              if (attr.valueType === 'substitute') {
+                return '[' + this.escapeIdentifier(attr.name) + attr.operator + '$' + attr.value + ']';
+              } else {
+                return '[' + this.escapeIdentifier(attr.name) + attr.operator + this.escapeStr(attr.value) + ']';
+              }
+            } else {
+              return '[' + this.escapeIdentifier(attr.name) + ']';
+            }
+          }, this).join('');
+        }
+        if (entity.pseudos) {
+          res += entity.pseudos.map(function(pseudo) {
+            if (pseudo.valueType) {
+              if (pseudo.valueType === 'selector') {
+                return ':' + this.escapeIdentifier(pseudo.name) + '(' + this._renderEntity(pseudo.value) + ')';
+              } else if (pseudo.valueType === 'substitute') {
+                return ':' + this.escapeIdentifier(pseudo.name) + '($' + pseudo.value + ')';
+              } else if (pseudo.valueType === 'numeric') {
+                return ':' + this.escapeIdentifier(pseudo.name) + '(' + pseudo.value + ')';
+              } else {
+                return ':' + this.escapeIdentifier(pseudo.name) + '(' + this.escapeIdentifier(pseudo.value) + ')';
+              }
+            } else {
+              return ':' + this.escapeIdentifier(pseudo.name);
+            }
+          }, this).join('');
+        }
+        break;
+
+       default:
+        throw Error('Unknown entity type: "' + entity.type(+'".'));
+      }
+      return res;
+    };
+    var parser = new CssSelectorParser();
+    parser.registerNestingOperators('>');
+    axe.utils.cssParser = parser;
+  })(axe);
+  'use strict';
+  function truncate(str, maxLength) {
+    maxLength = maxLength || 300;
+    if (str.length > maxLength) {
+      var index = str.indexOf('>');
+      str = str.substring(0, index + 1);
+    }
+    return str;
+  }
+  function getSource(element) {
+    var source = element.outerHTML;
+    if (!source && typeof XMLSerializer === 'function') {
+      source = new XMLSerializer().serializeToString(element);
+    }
+    return truncate(source || '');
+  }
+  function DqElement(element, options, spec) {
+    this._fromFrame = !!spec;
+    this.spec = spec || {};
+    if (options && options.absolutePaths) {
+      this._options = {
+        toRoot: true
+      };
+    }
+    this.source = this.spec.source !== undefined ? this.spec.source : getSource(element);
+    this._element = element;
+  }
+  DqElement.prototype = {
+    get selector() {
+      return this.spec.selector || [ axe.utils.getSelector(this.element, this._options) ];
+    },
+    get xpath() {
+      return this.spec.xpath || [ axe.utils.getXpath(this.element) ];
+    },
+    get element() {
+      return this._element;
+    },
+    get fromFrame() {
+      return this._fromFrame;
+    },
+    toJSON: function toJSON() {
+      'use strict';
+      return {
+        selector: this.selector,
+        source: this.source,
+        xpath: this.xpath
+      };
+    }
+  };
+  DqElement.fromFrame = function(node, options, frame) {
+    node.selector.unshift(frame.selector);
+    node.xpath.unshift(frame.xpath);
+    return new axe.utils.DqElement(frame.element, options, node);
+  };
+  axe.utils.DqElement = DqElement;
+  'use strict';
+  axe.utils.matchesSelector = function() {
+    'use strict';
+    var method;
+    function getMethod(win) {
+      var index, candidate, elProto = win.Element.prototype, candidates = [ 'matches', 'matchesSelector', 'mozMatchesSelector', 'webkitMatchesSelector', 'msMatchesSelector' ], length = candidates.length;
+      for (index = 0; index < length; index++) {
+        candidate = candidates[index];
+        if (elProto[candidate]) {
+          return candidate;
+        }
+      }
+    }
+    return function(node, selector) {
+      if (!method || !node[method]) {
+        method = getMethod(node.ownerDocument.defaultView);
+      }
+      return node[method](selector);
+    };
+  }();
+  'use strict';
+  axe.utils.escapeSelector = function(value) {
+    'use strict';
+    var string = String(value);
+    var length = string.length;
+    var index = -1;
+    var codeUnit;
+    var result = '';
+    var firstCodeUnit = string.charCodeAt(0);
+    while (++index < length) {
+      codeUnit = string.charCodeAt(index);
+      if (codeUnit == 0) {
+        throw new Error('INVALID_CHARACTER_ERR');
+      }
+      if (codeUnit >= 1 && codeUnit <= 31 || codeUnit >= 127 && codeUnit <= 159 || index == 0 && codeUnit >= 48 && codeUnit <= 57 || index == 1 && codeUnit >= 48 && codeUnit <= 57 && firstCodeUnit == 45) {
+        result += '\\' + codeUnit.toString(16) + ' ';
+        continue;
+      }
+      if (index == 1 && codeUnit == 45 && firstCodeUnit == 45) {
+        result += '\\' + string.charAt(index);
+        continue;
+      }
+      if (codeUnit >= 128 || codeUnit == 45 || codeUnit == 95 || codeUnit >= 48 && codeUnit <= 57 || codeUnit >= 65 && codeUnit <= 90 || codeUnit >= 97 && codeUnit <= 122) {
+        result += string.charAt(index);
+        continue;
+      }
+      result += '\\' + string.charAt(index);
+    }
+    return result;
+  };
+  'use strict';
+  axe.utils.extendMetaData = function(to, from) {
+    Object.assign(to, from);
+    Object.keys(from).filter(function(prop) {
+      return typeof from[prop] === 'function';
+    }).forEach(function(prop) {
+      to[prop] = null;
+      try {
+        to[prop] = from[prop](to);
+      } catch (e) {}
+    });
+  };
+  'use strict';
+  axe.utils.finalizeRuleResult = function(ruleResult) {
+    Object.assign(ruleResult, axe.utils.aggregateRule(ruleResult.nodes));
+    delete ruleResult.nodes;
+    return ruleResult;
+  };
+  'use strict';
+  var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function(obj) {
+    return typeof obj;
+  } : function(obj) {
+    return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj;
+  };
+  axe.utils.findBy = function(array, key, value) {
+    if (Array.isArray(array)) {
+      return array.find(function(obj) {
+        return (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && obj[key] === value;
+      });
+    }
+  };
+  'use strict';
+  var axe = axe || {
+    utils: {}
+  };
+  function virtualDOMfromNode(node, shadowId) {
+    return {
+      shadowId: shadowId,
+      children: [],
+      actualNode: node
+    };
+  }
+  function getSlotChildren(node) {
+    var retVal = [];
+    node = node.firstChild;
+    while (node) {
+      retVal.push(node);
+      node = node.nextSibling;
+    }
+    return retVal;
+  }
+  axe.utils.getFlattenedTree = function(node, shadowId) {
+    var retVal, realArray, nodeName;
+    function reduceShadowDOM(res, child) {
+      var replacements = axe.utils.getFlattenedTree(child, shadowId);
+      if (replacements) {
+        res = res.concat(replacements);
+      }
+      return res;
+    }
+    if (node.documentElement) {
+      node = node.documentElement;
+    }
+    nodeName = node.nodeName.toLowerCase();
+    if (node.shadowRoot && nodeName !== 'marquee') {
+      shadowId = 'a' + Math.random().toString().substring(2);
+      realArray = Array.from(node.shadowRoot.childNodes);
+      return realArray.reduce(reduceShadowDOM, []);
+    } else {
+      if (nodeName === 'content') {
+        realArray = Array.from(node.getDistributedNodes());
+        return realArray.reduce(reduceShadowDOM, []);
+      } else if (nodeName === 'slot') {
+        realArray = Array.from(node.assignedNodes());
+        if (!realArray.length) {
+          realArray = getSlotChildren(node);
+        }
+        var styl = window.getComputedStyle(node);
+        if (false && styl.display !== 'contents') {
+          retVal = virtualDOMfromNode(node, shadowId);
+          retVal.children = realArray.reduce(reduceShadowDOM, []);
+          return [ retVal ];
+        } else {
+          return realArray.reduce(reduceShadowDOM, []);
+        }
+      } else {
+        if (node.nodeType === 1) {
+          retVal = virtualDOMfromNode(node, shadowId);
+          realArray = Array.from(node.childNodes);
+          retVal.children = realArray.reduce(reduceShadowDOM, []);
+          return [ retVal ];
+        } else if (node.nodeType === 3) {
+          return [ virtualDOMfromNode(node) ];
+        }
+        return undefined;
+      }
+    }
+  };
+  axe.utils.getNodeFromTree = function(vNode, node) {
+    var found;
+    vNode.children.forEach(function(candidate) {
+      var retVal;
+      if (candidate.actualNode === node) {
+        found = candidate;
+      } else {
+        retVal = axe.utils.getNodeFromTree(candidate, node);
+        if (retVal) {
+          found = retVal;
+        }
+      }
+    });
+    return found;
+  };
+  'use strict';
+  axe.utils.getAllChecks = function getAllChecks(object) {
+    'use strict';
+    var result = [];
+    return result.concat(object.any || []).concat(object.all || []).concat(object.none || []);
+  };
+  'use strict';
+  axe.utils.getCheckOption = function(check, ruleID, options) {
+    var ruleCheckOption = ((options.rules && options.rules[ruleID] || {}).checks || {})[check.id];
+    var checkOption = (options.checks || {})[check.id];
+    var enabled = check.enabled;
+    var opts = check.options;
+    if (checkOption) {
+      if (checkOption.hasOwnProperty('enabled')) {
+        enabled = checkOption.enabled;
+      }
+      if (checkOption.hasOwnProperty('options')) {
+        opts = checkOption.options;
+      }
+    }
+    if (ruleCheckOption) {
+      if (ruleCheckOption.hasOwnProperty('enabled')) {
+        enabled = ruleCheckOption.enabled;
+      }
+      if (ruleCheckOption.hasOwnProperty('options')) {
+        opts = ruleCheckOption.options;
+      }
+    }
+    return {
+      enabled: enabled,
+      options: opts,
+      absolutePaths: options.absolutePaths
+    };
+  };
+  'use strict';
+  var _slicedToArray = function() {
+    function sliceIterator(arr, i) {
+      var _arr = [];
+      var _n = true;
+      var _d = false;
+      var _e = undefined;
+      try {
+        for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
+          _arr.push(_s.value);
+          if (i && _arr.length === i) {
+            break;
+          }
+        }
+      } catch (err) {
+        _d = true;
+        _e = err;
+      } finally {
+        try {
+          if (!_n && _i['return']) {
+            _i['return']();
+          }
+        } finally {
+          if (_d) {
+            throw _e;
+          }
+        }
+      }
+      return _arr;
+    }
+    return function(arr, i) {
+      if (Array.isArray(arr)) {
+        return arr;
+      } else if (Symbol.iterator in Object(arr)) {
+        return sliceIterator(arr, i);
+      } else {
+        throw new TypeError('Invalid attempt to destructure non-iterable instance');
+      }
+    };
+  }();
+  function isMostlyNumbers() {
+    var str = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+    return str.length !== 0 && (str.match(/[0-9]/g) || '').length >= str.length / 2;
+  }
+  function splitString(str, splitIndex) {
+    return [ str.substring(0, splitIndex), str.substring(splitIndex) ];
+  }
+  function uriParser(url) {
+    var original = url;
+    var protocol = '', domain = '', port = '', path = '', query = '', hash = '';
+    if (url.includes('#')) {
+      var _splitString = splitString(url, url.indexOf('#'));
+      var _splitString2 = _slicedToArray(_splitString, 2);
+      url = _splitString2[0];
+      hash = _splitString2[1];
+    }
+    if (url.includes('?')) {
+      var _splitString3 = splitString(url, url.indexOf('?'));
+      var _splitString4 = _slicedToArray(_splitString3, 2);
+      url = _splitString4[0];
+      query = _splitString4[1];
+    }
+    if (url.includes('://')) {
+      var _url$split = url.split('://');
+      var _url$split2 = _slicedToArray(_url$split, 2);
+      protocol = _url$split2[0];
+      url = _url$split2[1];
+      var _splitString5 = splitString(url, url.indexOf('/'));
+      var _splitString6 = _slicedToArray(_splitString5, 2);
+      domain = _splitString6[0];
+      url = _splitString6[1];
+    } else if (url.substr(0, 2) === '//') {
+      url = url.substr(2);
+      var _splitString7 = splitString(url, url.indexOf('/'));
+      var _splitString8 = _slicedToArray(_splitString7, 2);
+      domain = _splitString8[0];
+      url = _splitString8[1];
+    }
+    if (domain.substr(0, 4) === 'www.') {
+      domain = domain.substr(4);
+    }
+    if (domain && domain.includes(':')) {
+      var _splitString9 = splitString(domain, domain.indexOf(':'));
+      var _splitString10 = _slicedToArray(_splitString9, 2);
+      domain = _splitString10[0];
+      port = _splitString10[1];
+    }
+    path = url;
+    return {
+      original: original,
+      protocol: protocol,
+      domain: domain,
+      port: port,
+      path: path,
+      query: query,
+      hash: hash
+    };
+  }
+  axe.utils.getFriendlyUriEnd = function getFriendlyUriEnd() {
+    var uri = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+    if (uri.length <= 1 || uri.substr(0, 5) === 'data:' || uri.substr(0, 11) === 'javascript:' || uri.includes('?')) {
+      return;
+    }
+    var currentDomain = options.currentDomain, _options$maxLength = options.maxLength, maxLength = _options$maxLength === undefined ? 25 : _options$maxLength;
+    var _uriParser = uriParser(uri), path = _uriParser.path, domain = _uriParser.domain, hash = _uriParser.hash;
+    var pathEnd = path.substr(path.substr(0, path.length - 2).lastIndexOf('/') + 1);
+    if (hash) {
+      if (pathEnd && (pathEnd + hash).length <= maxLength) {
+        return pathEnd + hash;
+      } else if (pathEnd.length < 2 && hash.length > 2 && hash.length <= maxLength) {
+        return hash;
+      } else {
+        return;
+      }
+    } else if (domain && domain.length < maxLength && path.length <= 1) {
+      return domain + path;
+    }
+    if (path === '/' + pathEnd && domain && currentDomain && domain !== currentDomain && (domain + path).length <= maxLength) {
+      return domain + path;
+    }
+    var lastDotIndex = pathEnd.lastIndexOf('.');
+    if ((lastDotIndex === -1 || lastDotIndex > 1) && (lastDotIndex !== -1 || pathEnd.length > 2) && pathEnd.length <= maxLength && !pathEnd.match(/index(\.[a-zA-Z]{2-4})?/) && !isMostlyNumbers(pathEnd)) {
+      return pathEnd;
+    }
+  };
+  'use strict';
+  function _toConsumableArray(arr) {
+    if (Array.isArray(arr)) {
+      for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {
+        arr2[i] = arr[i];
+      }
+      return arr2;
+    } else {
+      return Array.from(arr);
+    }
+  }
+  var escapeSelector = axe.utils.escapeSelector;
+  function isUncommonClassName(className) {
+    return ![ 'focus', 'hover', 'hidden', 'visible', 'dirty', 'touched', 'valid', 'disable', 'enable', 'active', 'col-' ].find(function(str) {
+      return className.includes(str);
+    });
+  }
+  function getDistinctClassList(elm) {
+    if (!elm.classList || elm.classList.length === 0) {
+      return [];
+    }
+    var siblings = elm.parentNode && Array.from(elm.parentNode.children || '') || [];
+    return siblings.reduce(function(classList, childElm) {
+      if (elm === childElm) {
+        return classList;
+      } else {
+        return classList.filter(function(classItem) {
+          return !childElm.classList.contains(classItem);
+        });
+      }
+    }, Array.from(elm.classList).filter(isUncommonClassName));
+  }
+  var commonNodes = [ 'div', 'span', 'p', 'b', 'i', 'u', 'strong', 'em', 'h2', 'h3' ];
+  function getNthChildString(elm, selector) {
+    var siblings = elm.parentNode && Array.from(elm.parentNode.children || '') || [];
+    var hasMatchingSiblings = siblings.find(function(sibling) {
+      return sibling !== elm && axe.utils.matchesSelector(sibling, selector);
+    });
+    if (hasMatchingSiblings) {
+      var nthChild = 1 + siblings.indexOf(elm);
+      return ':nth-child(' + nthChild + ')';
+    } else {
+      return '';
+    }
+  }
+  var createSelector = {
+    getElmId: function getElmId(elm) {
+      if (!elm.id) {
+        return;
+      }
+      var doc = elm.getRootNode && elm.getRootNode() || document;
+      var id = '#' + escapeSelector(elm.id || '');
+      if (!id.match(/player_uid_/) && doc.querySelectorAll(id).length === 1) {
+        return id;
+      }
+    },
+    getCustomElm: function getCustomElm(elm, _ref) {
+      var isCustomElm = _ref.isCustomElm, nodeName = _ref.nodeName;
+      if (isCustomElm) {
+        return nodeName;
+      }
+    },
+    getElmRoleProp: function getElmRoleProp(elm) {
+      if (elm.hasAttribute('role')) {
+        return '[role="' + escapeSelector(elm.getAttribute('role')) + '"]';
+      }
+    },
+    getUncommonElm: function getUncommonElm(elm, _ref2) {
+      var isCommonElm = _ref2.isCommonElm, isCustomElm = _ref2.isCustomElm, nodeName = _ref2.nodeName;
+      if (!isCommonElm && !isCustomElm) {
+        nodeName = escapeSelector(nodeName);
+        if (nodeName === 'input' && elm.hasAttribute('type')) {
+          nodeName += '[type="' + elm.type + '"]';
+        }
+        return nodeName;
+      }
+    },
+    getElmNameProp: function getElmNameProp(elm) {
+      if (!elm.id && elm.name) {
+        return '[name="' + escapeSelector(elm.name) + '"]';
+      }
+    },
+    getDistinctClass: function getDistinctClass(elm, _ref3) {
+      var distinctClassList = _ref3.distinctClassList;
+      if (distinctClassList.length > 0 && distinctClassList.length < 3) {
+        return '.' + distinctClassList.map(escapeSelector).join('.');
+      }
+    },
+    getFileRefProp: function getFileRefProp(elm) {
+      var attr = void 0;
+      if (elm.hasAttribute('href')) {
+        attr = 'href';
+      } else if (elm.hasAttribute('src')) {
+        attr = 'src';
+      } else {
+        return;
+      }
+      var friendlyUriEnd = axe.utils.getFriendlyUriEnd(elm.getAttribute(attr));
+      if (friendlyUriEnd) {
+        return '[' + attr + '$="' + encodeURI(friendlyUriEnd) + '"]';
+      }
+    },
+    getCommonName: function getCommonName(elm, _ref4) {
+      var nodeName = _ref4.nodeName, isCommonElm = _ref4.isCommonElm;
+      if (isCommonElm) {
+        return nodeName;
+      }
+    }
+  };
+  function getElmFeatures(elm, featureCount) {
+    var nodeName = elm.nodeName.toLowerCase();
+    var classList = Array.from(elm.classList) || [];
+    var props = {
+      nodeName: nodeName,
+      classList: classList,
+      isCustomElm: nodeName.includes('-'),
+      isCommonElm: commonNodes.includes(nodeName),
+      distinctClassList: getDistinctClassList(elm)
+    };
+    return [ createSelector.getCustomElm, createSelector.getElmRoleProp, createSelector.getUncommonElm, createSelector.getElmNameProp, createSelector.getDistinctClass, createSelector.getFileRefProp, createSelector.getCommonName ].reduce(function(features, func) {
+      if (features.length === featureCount) {
+        return features;
+      }
+      var feature = func(elm, props);
+      if (feature) {
+        if (!feature[0].match(/[a-z]/)) {
+          features.push(feature);
+        } else {
+          features.unshift(feature);
+        }
+      }
+      return features;
+    }, []);
+  }
+  function generateSelector(elm, options, doc) {
+    var selector = void 0, addParent = void 0;
+    var _options$isUnique = options.isUnique, isUnique = _options$isUnique === undefined ? false : _options$isUnique;
+    var idSelector = createSelector.getElmId(elm);
+    var _options$featureCount = options.featureCount, featureCount = _options$featureCount === undefined ? 2 : _options$featureCount, _options$minDepth = options.minDepth, minDepth = _options$minDepth === undefined ? 1 : _options$minDepth, _options$toRoot = options.toRoot, toRoot = _options$toRoot === undefined ? false : _options$toRoot, _options$childSelecto = options.childSelectors, childSelectors = _options$childSelecto === undefined ? [] : _options$childSelecto;
+    if (idSelector) {
+      selector = idSelector;
+      isUnique = true;
+    } else {
+      selector = getElmFeatures(elm, featureCount).join('');
+      selector += getNthChildString(elm, selector);
+      isUnique = options.isUnique || doc.querySelectorAll(selector).length === 1;
+      if (!isUnique && elm === document.documentElement) {
+        selector += ':root';
+      }
+      addParent = minDepth !== 0 || !isUnique;
+    }
+    var selectorParts = [ selector ].concat(_toConsumableArray(childSelectors));
+    if (elm.parentElement && elm.parentElement.nodeType !== 11 && (toRoot || addParent)) {
+      return generateSelector(elm.parentNode, {
+        toRoot: toRoot,
+        isUnique: isUnique,
+        childSelectors: selectorParts,
+        featureCount: 1,
+        minDepth: minDepth - 1
+      }, doc);
+    } else {
+      return selectorParts.join(' > ');
+    }
+  }
+  axe.utils.getSelector = function createUniqueSelector(elm) {
+    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+    if (!elm) {
+      return '';
+    }
+    var doc = elm.getRootNode && elm.getRootNode() || document;
+    if (doc.nodeType === 11) {
+      var stack = [];
+      while (doc.nodeType === 11) {
+        stack.push({
+          elm: elm,
+          doc: doc
+        });
+        elm = doc.host;
+        doc = elm.getRootNode();
+      }
+      stack.push({
+        elm: elm,
+        doc: doc
+      });
+      return stack.reverse().map(function(comp) {
+        return generateSelector(comp.elm, options, comp.doc);
+      });
+    } else {
+      return generateSelector(elm, options, doc);
+    }
+  };
+  'use strict';
+  function getXPathArray(node, path) {
+    var sibling, count;
+    if (!node) {
+      return [];
+    }
+    if (!path && node.nodeType === 9) {
+      path = [ {
+        str: 'html'
+      } ];
+      return path;
+    }
+    path = path || [];
+    if (node.parentNode && node.parentNode !== node) {
+      path = getXPathArray(node.parentNode, path);
+    }
+    if (node.previousSibling) {
+      count = 1;
+      sibling = node.previousSibling;
+      do {
+        if (sibling.nodeType === 1 && sibling.nodeName === node.nodeName) {
+          count++;
+        }
+        sibling = sibling.previousSibling;
+      } while (sibling);
+      if (count === 1) {
+        count = null;
+      }
+    } else if (node.nextSibling) {
+      sibling = node.nextSibling;
+      do {
+        if (sibling.nodeType === 1 && sibling.nodeName === node.nodeName) {
+          count = 1;
+          sibling = null;
+        } else {
+          count = null;
+          sibling = sibling.previousSibling;
+        }
+      } while (sibling);
+    }
+    if (node.nodeType === 1) {
+      var element = {};
+      element.str = node.nodeName.toLowerCase();
+      if (node.getAttribute && node.getAttribute('id') && node.ownerDocument.querySelectorAll('#' + axe.utils.escapeSelector(node.id)).length === 1) {
+        element.id = node.getAttribute('id');
+      }
+      if (count > 1) {
+        element.count = count;
+      }
+      path.push(element);
+    }
+    return path;
+  }
+  function xpathToString(xpathArray) {
+    return xpathArray.reduce(function(str, elm) {
+      if (elm.id) {
+        return '/' + elm.str + '[@id=\'' + elm.id + '\']';
+      } else {
+        return str + ('/' + elm.str) + (elm.count > 0 ? '[' + elm.count + ']' : '');
+      }
+    }, '');
+  }
+  axe.utils.getXpath = function getXpath(node) {
+    var xpathArray = getXPathArray(node);
+    return xpathToString(xpathArray);
+  };
+  'use strict';
+  var styleSheet;
+  function injectStyle(style) {
+    'use strict';
+    if (styleSheet && styleSheet.parentNode) {
+      if (styleSheet.styleSheet === undefined) {
+        styleSheet.appendChild(document.createTextNode(style));
+      } else {
+        styleSheet.styleSheet.cssText += style;
+      }
+      return styleSheet;
+    }
+    if (!style) {
+      return;
+    }
+    var head = document.head || document.getElementsByTagName('head')[0];
+    styleSheet = document.createElement('style');
+    styleSheet.type = 'text/css';
+    if (styleSheet.styleSheet === undefined) {
+      styleSheet.appendChild(document.createTextNode(style));
+    } else {
+      styleSheet.styleSheet.cssText = style;
+    }
+    head.appendChild(styleSheet);
+    return styleSheet;
+  }
+  axe.utils.injectStyle = injectStyle;
+  'use strict';
+  axe.utils.isHidden = function isHidden(el, recursed) {
+    'use strict';
+    var parent;
+    if (el.nodeType === 9) {
+      return false;
+    }
+    if (el.nodeType === 11) {
+      el = el.host;
+    }
+    var style = window.getComputedStyle(el, null);
+    if (!style || !el.parentNode || style.getPropertyValue('display') === 'none' || !recursed && style.getPropertyValue('visibility') === 'hidden' || el.getAttribute('aria-hidden') === 'true') {
+      return true;
+    }
+    parent = el.assignedSlot ? el.assignedSlot : el.parentNode;
+    return axe.utils.isHidden(parent, true);
+  };
+  'use strict';
+  function pushFrame(resultSet, options, frameElement, frameSelector) {
+    'use strict';
+    var frameXpath = axe.utils.getXpath(frameElement);
+    var frameSpec = {
+      element: frameElement,
+      selector: frameSelector,
+      xpath: frameXpath
+    };
+    resultSet.forEach(function(res) {
+      res.node = axe.utils.DqElement.fromFrame(res.node, options, frameSpec);
+      var checks = axe.utils.getAllChecks(res);
+      if (checks.length) {
+        checks.forEach(function(check) {
+          check.relatedNodes = check.relatedNodes.map(function(node) {
+            return axe.utils.DqElement.fromFrame(node, options, frameSpec);
+          });
+        });
+      }
+    });
+  }
+  function spliceNodes(target, to) {
+    'use strict';
+    var firstFromFrame = to[0].node, sorterResult, t;
+    for (var i = 0, l = target.length; i < l; i++) {
+      t = target[i].node;
+      sorterResult = axe.utils.nodeSorter({
+        actualNode: t.element
+      }, {
+        actualNode: firstFromFrame.element
+      });
+      if (sorterResult > 0 || sorterResult === 0 && firstFromFrame.selector.length < t.selector.length) {
+        target.splice.apply(target, [ i, 0 ].concat(to));
+        return;
+      }
+    }
+    target.push.apply(target, to);
+  }
+  function normalizeResult(result) {
+    'use strict';
+    if (!result || !result.results) {
+      return null;
+    }
+    if (!Array.isArray(result.results)) {
+      return [ result.results ];
+    }
+    if (!result.results.length) {
+      return null;
+    }
+    return result.results;
+  }
+  axe.utils.mergeResults = function mergeResults(frameResults, options) {
+    'use strict';
+    var result = [];
+    frameResults.forEach(function(frameResult) {
+      var results = normalizeResult(frameResult);
+      if (!results || !results.length) {
+        return;
+      }
+      results.forEach(function(ruleResult) {
+        if (ruleResult.nodes && frameResult.frame) {
+          pushFrame(ruleResult.nodes, options, frameResult.frameElement, frameResult.frame);
+        }
+        var res = axe.utils.findBy(result, 'id', ruleResult.id);
+        if (!res) {
+          result.push(ruleResult);
+        } else {
+          if (ruleResult.nodes.length) {
+            spliceNodes(res.nodes, ruleResult.nodes);
+          }
+        }
+      });
+    });
+    return result;
+  };
+  'use strict';
+  axe.utils.nodeSorter = function nodeSorter(a, b) {
+    'use strict';
+    if (a.actualNode === b.actualNode) {
+      return 0;
+    }
+    if (a.actualNode.compareDocumentPosition(b.actualNode) & 4) {
+      return -1;
+    }
+    return 1;
+  };
+  'use strict';
+  utils.performanceTimer = function() {
+    'use strict';
+    function now() {
+      if (window.performance && window.performance) {
+        return window.performance.now();
+      }
+    }
+    var originalTime = null;
+    var lastRecordedTime = now();
+    return {
+      start: function start() {
+        this.mark('mark_axe_start');
+      },
+      end: function end() {
+        this.mark('mark_axe_end');
+        this.measure('axe', 'mark_axe_start', 'mark_axe_end');
+        this.logMeasures('axe');
+      },
+      auditStart: function auditStart() {
+        this.mark('mark_audit_start');
+      },
+      auditEnd: function auditEnd() {
+        this.mark('mark_audit_end');
+        this.measure('audit_start_to_end', 'mark_audit_start', 'mark_audit_end');
+        this.logMeasures();
+      },
+      mark: function mark(markName) {
+        if (window.performance && window.performance.mark !== undefined) {
+          window.performance.mark(markName);
+        }
+      },
+      measure: function measure(measureName, startMark, endMark) {
+        if (window.performance && window.performance.measure !== undefined) {
+          window.performance.measure(measureName, startMark, endMark);
+        }
+      },
+      logMeasures: function logMeasures(measureName) {
+        function log(req) {
+          axe.log('Measure ' + req.name + ' took ' + req.duration + 'ms');
+        }
+        if (window.performance && window.performance.getEntriesByType !== undefined) {
+          var measures = window.performance.getEntriesByType('measure');
+          for (var i = 0; i < measures.length; ++i) {
+            var req = measures[i];
+            if (req.name === measureName) {
+              log(req);
+              return;
+            }
+            log(req);
+          }
+        }
+      },
+      timeElapsed: function timeElapsed() {
+        return now() - lastRecordedTime;
+      },
+      reset: function reset() {
+        if (!originalTime) {
+          originalTime = now();
+        }
+        lastRecordedTime = now();
+      }
+    };
+  }();
+  'use strict';
+  if (typeof Object.assign !== 'function') {
+    (function() {
+      Object.assign = function(target) {
+        'use strict';
+        if (target === undefined || target === null) {
+          throw new TypeError('Cannot convert undefined or null to object');
+        }
+        var output = Object(target);
+        for (var index = 1; index < arguments.length; index++) {
+          var source = arguments[index];
+          if (source !== undefined && source !== null) {
+            for (var nextKey in source) {
+              if (source.hasOwnProperty(nextKey)) {
+                output[nextKey] = source[nextKey];
+              }
+            }
+          }
+        }
+        return output;
+      };
+    })();
+  }
+  if (!Array.prototype.find) {
+    Array.prototype.find = function(predicate) {
+      if (this === null) {
+        throw new TypeError('Array.prototype.find called on null or undefined');
+      }
+      if (typeof predicate !== 'function') {
+        throw new TypeError('predicate must be a function');
+      }
+      var list = Object(this);
+      var length = list.length >>> 0;
+      var thisArg = arguments[1];
+      var value;
+      for (var i = 0; i < length; i++) {
+        value = list[i];
+        if (predicate.call(thisArg, value, i, list)) {
+          return value;
+        }
+      }
+      return undefined;
+    };
+  }
+  axe.utils.pollyfillElementsFromPoint = function() {
+    if (document.elementsFromPoint) {
+      return document.elementsFromPoint;
+    }
+    if (document.msElementsFromPoint) {
+      return document.msElementsFromPoint;
+    }
+    var usePointer = function() {
+      var element = document.createElement('x');
+      element.style.cssText = 'pointer-events:auto';
+      return element.style.pointerEvents === 'auto';
+    }();
+    var cssProp = usePointer ? 'pointer-events' : 'visibility';
+    var cssDisableVal = usePointer ? 'none' : 'hidden';
+    var style = document.createElement('style');
+    style.innerHTML = usePointer ? '* { pointer-events: all }' : '* { visibility: visible }';
+    return function(x, y) {
+      var current, i, d;
+      var elements = [];
+      var previousPointerEvents = [];
+      document.head.appendChild(style);
+      while ((current = document.elementFromPoint(x, y)) && elements.indexOf(current) === -1) {
+        elements.push(current);
+        previousPointerEvents.push({
+          value: current.style.getPropertyValue(cssProp),
+          priority: current.style.getPropertyPriority(cssProp)
+        });
+        current.style.setProperty(cssProp, cssDisableVal, 'important');
+      }
+      for (i = previousPointerEvents.length; !!(d = previousPointerEvents[--i]); ) {
+        elements[i].style.setProperty(cssProp, d.value ? d.value : '', d.priority);
+      }
+      document.head.removeChild(style);
+      return elements;
+    };
+  };
+  if (typeof window.addEventListener === 'function') {
+    document.elementsFromPoint = axe.utils.pollyfillElementsFromPoint();
+  }
+  if (!Array.prototype.includes) {
+    Array.prototype.includes = function(searchElement) {
+      'use strict';
+      var O = Object(this);
+      var len = parseInt(O.length, 10) || 0;
+      if (len === 0) {
+        return false;
+      }
+      var n = parseInt(arguments[1], 10) || 0;
+      var k;
+      if (n >= 0) {
+        k = n;
+      } else {
+        k = len + n;
+        if (k < 0) {
+          k = 0;
+        }
+      }
+      var currentElement;
+      while (k < len) {
+        currentElement = O[k];
+        if (searchElement === currentElement || searchElement !== searchElement && currentElement !== currentElement) {
+          return true;
+        }
+        k++;
+      }
+      return false;
+    };
+  }
+  if (!Array.prototype.some) {
+    Array.prototype.some = function(fun) {
+      'use strict';
+      if (this == null) {
+        throw new TypeError('Array.prototype.some called on null or undefined');
+      }
+      if (typeof fun !== 'function') {
+        throw new TypeError();
+      }
+      var t = Object(this);
+      var len = t.length >>> 0;
+      var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
+      for (var i = 0; i < len; i++) {
+        if (i in t && fun.call(thisArg, t[i], i, t)) {
+          return true;
+        }
+      }
+      return false;
+    };
+  }
+  if (!Array.from) {
+    Array.from = function() {
+      var toStr = Object.prototype.toString;
+      var isCallable = function isCallable(fn) {
+        return typeof fn === 'function' || toStr.call(fn) === '[object Function]';
+      };
+      var toInteger = function toInteger(value) {
+        var number = Number(value);
+        if (isNaN(number)) {
+          return 0;
+        }
+        if (number === 0 || !isFinite(number)) {
+          return number;
+        }
+        return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));
+      };
+      var maxSafeInteger = Math.pow(2, 53) - 1;
+      var toLength = function toLength(value) {
+        var len = toInteger(value);
+        return Math.min(Math.max(len, 0), maxSafeInteger);
+      };
+      return function from(arrayLike) {
+        var C = this;
+        var items = Object(arrayLike);
+        if (arrayLike == null) {
+          throw new TypeError('Array.from requires an array-like object - not null or undefined');
+        }
+        var mapFn = arguments.length > 1 ? arguments[1] : void undefined;
+        var T;
+        if (typeof mapFn !== 'undefined') {
+          if (!isCallable(mapFn)) {
+            throw new TypeError('Array.from: when provided, the second argument must be a function');
+          }
+          if (arguments.length > 2) {
+            T = arguments[2];
+          }
+        }
+        var len = toLength(items.length);
+        var A = isCallable(C) ? Object(new C(len)) : new Array(len);
+        var k = 0;
+        var kValue;
+        while (k < len) {
+          kValue = items[k];
+          if (mapFn) {
+            A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k);
+          } else {
+            A[k] = kValue;
+          }
+          k += 1;
+        }
+        A.length = len;
+        return A;
+      };
+    }();
+  }
+  if (!String.prototype.includes) {
+    String.prototype.includes = function(search, start) {
+      if (typeof start !== 'number') {
+        start = 0;
+      }
+      if (start + search.length > this.length) {
+        return false;
+      } else {
+        return this.indexOf(search, start) !== -1;
+      }
+    };
+  }
+  'use strict';
+  var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function(obj) {
+    return typeof obj;
+  } : function(obj) {
+    return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj;
+  };
+  function getIncompleteReason(checkData, messages) {
+    function getDefaultMsg(messages) {
+      if (messages.incomplete && messages.incomplete.default) {
+        return messages.incomplete.default;
+      } else {
+        return helpers.incompleteFallbackMessage();
+      }
+    }
+    if (checkData && checkData.missingData) {
+      try {
+        var msg = messages.incomplete[checkData.missingData[0].reason];
+        if (!msg) {
+          throw new Error();
+        }
+        return msg;
+      } catch (e) {
+        if (typeof checkData.missingData === 'string') {
+          return messages.incomplete[checkData.missingData];
+        } else {
+          return getDefaultMsg(messages);
+        }
+      }
+    } else {
+      return getDefaultMsg(messages);
+    }
+  }
+  function extender(checksData, shouldBeTrue) {
+    'use strict';
+    return function(check) {
+      var sourceData = checksData[check.id] || {};
+      var messages = sourceData.messages || {};
+      var data = Object.assign({}, sourceData);
+      delete data.messages;
+      if (check.result === undefined) {
+        if (_typeof(messages.incomplete) === 'object') {
+          data.message = function() {
+            return getIncompleteReason(check.data, messages);
+          };
+        } else {
+          data.message = messages.incomplete;
+        }
+      } else {
+        data.message = check.result === shouldBeTrue ? messages.pass : messages.fail;
+      }
+      axe.utils.extendMetaData(check, data);
+    };
+  }
+  axe.utils.publishMetaData = function(ruleResult) {
+    'use strict';
+    var checksData = axe._audit.data.checks || {};
+    var rulesData = axe._audit.data.rules || {};
+    var rule = axe.utils.findBy(axe._audit.rules, 'id', ruleResult.id) || {};
+    ruleResult.tags = axe.utils.clone(rule.tags || []);
+    var shouldBeTrue = extender(checksData, true);
+    var shouldBeFalse = extender(checksData, false);
+    ruleResult.nodes.forEach(function(detail) {
+      detail.any.forEach(shouldBeTrue);
+      detail.all.forEach(shouldBeTrue);
+      detail.none.forEach(shouldBeFalse);
+    });
+    axe.utils.extendMetaData(ruleResult, axe.utils.clone(rulesData[ruleResult.id] || {}));
+  };
+  'use strict';
+  var convertExpressions = function convertExpressions() {};
+  var matchExpressions = function matchExpressions() {};
+  function matchesTag(node, exp) {
+    return node.nodeType === 1 && (exp.tag === '*' || node.nodeName.toLowerCase() === exp.tag);
+  }
+  function matchesClasses(node, exp) {
+    return !exp.classes || exp.classes.reduce(function(result, cl) {
+      return result && node.className && node.className.match(cl.regexp);
+    }, true);
+  }
+  function matchesAttributes(node, exp) {
+    return !exp.attributes || exp.attributes.reduce(function(result, att) {
+      var nodeAtt = node.getAttribute(att.key);
+      return result && nodeAtt !== null && (!att.value || att.test(nodeAtt));
+    }, true);
+  }
+  function matchesId(node, exp) {
+    return !exp.id || node.id === exp.id;
+  }
+  function matchesPseudos(target, exp) {
+    if (!exp.pseudos || exp.pseudos.reduce(function(result, pseudo) {
+      if (pseudo.name === 'not') {
+        return result && !matchExpressions([ target ], pseudo.expressions, false).length;
+      }
+      throw new Error('the pseudo selector ' + pseudo.name + ' has not yet been implemented');
+    }, true)) {
+      return true;
+    }
+    return false;
+  }
+  function matchSelector(targets, exp, recurse) {
+    var result = [];
+    targets = Array.isArray(targets) ? targets : [ targets ];
+    targets.forEach(function(target) {
+      if (matchesTag(target.actualNode, exp) && matchesClasses(target.actualNode, exp) && matchesAttributes(target.actualNode, exp) && matchesId(target.actualNode, exp) && matchesPseudos(target, exp)) {
+        result.push(target);
+      }
+      if (recurse) {
+        result = result.concat(matchSelector(target.children.filter(function(child) {
+          return !exp.id || child.shadowId === target.shadowId;
+        }), exp, recurse));
+      }
+    });
+    return result;
+  }
+  var escapeRegExp = function() {
+    /*! Credit: XRegExp 0.6.1 (c) 2007-2008 Steven Levithan <http://stevenlevithan.com/regex/xregexp/> MIT License */
+    var from = /(?=[\-\[\]{}()*+?.\\\^$|,#\s])/g;
+    var to = '\\';
+    return function(string) {
+      return string.replace(from, to);
+    };
+  }();
+  var reUnescape = /\\/g;
+  function convertAttributes(atts) {
+    /*! Credit Mootools Copyright Mootools, MIT License */
+    if (!atts) {
+      return;
+    }
+    return atts.map(function(att) {
+      var attributeKey = att.name.replace(reUnescape, '');
+      var attributeValue = (att.value || '').replace(reUnescape, '');
+      var test, regexp;
+      switch (att.operator) {
+       case '^=':
+        regexp = new RegExp('^' + escapeRegExp(attributeValue));
+        break;
+
+       case '$=':
+        regexp = new RegExp(escapeRegExp(attributeValue) + '$');
+        break;
+
+       case '~=':
+        regexp = new RegExp('(^|\\s)' + escapeRegExp(attributeValue) + '(\\s|$)');
+        break;
+
+       case '|=':
+        regexp = new RegExp('^' + escapeRegExp(attributeValue) + '(-|$)');
+        break;
+
+       case '=':
+        test = function test(value) {
+          return attributeValue === value;
+        };
+        break;
+
+       case '*=':
+        test = function test(value) {
+          return value && value.indexOf(attributeValue) > -1;
+        };
+        break;
+
+       case '!=':
+        test = function test(value) {
+          return attributeValue !== value;
+        };
+        break;
+
+       default:
+        test = function test(value) {
+          return !!value;
+        };
+      }
+      if (attributeValue === '' && /^[*$^]=$/.test(att.operator)) {
+        test = function test() {
+          return false;
+        };
+      }
+      if (!test) {
+        test = function test(value) {
+          return value && regexp.test(value);
+        };
+      }
+      return {
+        key: attributeKey,
+        value: attributeValue,
+        test: test
+      };
+    });
+  }
+  function convertClasses(classes) {
+    if (!classes) {
+      return;
+    }
+    return classes.map(function(className) {
+      className = className.replace(reUnescape, '');
+      return {
+        value: className,
+        regexp: new RegExp('(^|\\s)' + escapeRegExp(className) + '(\\s|$)')
+      };
+    });
+  }
+  function convertPseudos(pseudos) {
+    if (!pseudos) {
+      return;
+    }
+    return pseudos.map(function(p) {
+      var expressions;
+      if (p.name === 'not') {
+        expressions = axe.utils.cssParser.parse(p.value);
+        expressions = expressions.selectors ? expressions.selectors : [ expressions ];
+        expressions = convertExpressions(expressions);
+      }
+      return {
+        name: p.name,
+        expressions: expressions,
+        value: p.value
+      };
+    });
+  }
+  convertExpressions = function convertExpressions(expressions) {
+    return expressions.map(function(exp) {
+      var newExp = [];
+      var rule = exp.rule;
+      while (rule) {
+        newExp.push({
+          tag: rule.tagName ? rule.tagName.toLowerCase() : '*',
+          combinator: rule.nestingOperator ? rule.nestingOperator : ' ',
+          id: rule.id,
+          attributes: convertAttributes(rule.attrs),
+          classes: convertClasses(rule.classNames),
+          pseudos: convertPseudos(rule.pseudos)
+        });
+        rule = rule.rule;
+      }
+      return newExp;
+    });
+  };
+  matchExpressions = function matchExpressions(domTree, expressions, recurse) {
+    return expressions.reduce(function(collected, exprArr) {
+      var candidates = domTree;
+      exprArr.forEach(function(exp, index) {
+        recurse = exp.combinator === '>' ? false : recurse;
+        if ([ ' ', '>' ].indexOf(exp.combinator) === -1) {
+          throw new Error('axe.utils.querySelectorAll does not support the combinator: ' + exp.combinator);
+        }
+        candidates = candidates.reduce(function(result, node) {
+          return result.concat(matchSelector(index ? node.children : node, exp, recurse));
+        }, []);
+      });
+      return collected.concat(candidates);
+    }, []);
+  };
+  axe.utils.querySelectorAll = function(domTree, selector) {
+    domTree = Array.isArray(domTree) ? domTree : [ domTree ];
+    var expressions = axe.utils.cssParser.parse(selector);
+    expressions = expressions.selectors ? expressions.selectors : [ expressions ];
+    expressions = convertExpressions(expressions);
+    return matchExpressions(domTree, expressions, true);
+  };
+  'use strict';
+  var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function(obj) {
+    return typeof obj;
+  } : function(obj) {
+    return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj;
+  };
+  (function() {
+    'use strict';
+    function noop() {}
+    function funcGuard(f) {
+      if (typeof f !== 'function') {
+        throw new TypeError('Queue methods require functions as arguments');
+      }
+    }
+    function queue() {
+      var tasks = [];
+      var started = 0;
+      var remaining = 0;
+      var completeQueue = noop;
+      var complete = false;
+      var err;
+      var defaultFail = function defaultFail(e) {
+        err = e;
+        setTimeout(function() {
+          if (err !== undefined && err !== null) {
+            axe.log('Uncaught error (of queue)', err);
+          }
+        }, 1);
+      };
+      var failed = defaultFail;
+      function createResolve(i) {
+        return function(r) {
+          tasks[i] = r;
+          remaining -= 1;
+          if (!remaining && completeQueue !== noop) {
+            complete = true;
+            completeQueue(tasks);
+          }
+        };
+      }
+      function abort(msg) {
+        completeQueue = noop;
+        failed(msg);
+        return tasks;
+      }
+      function pop() {
+        var length = tasks.length;
+        for (;started < length; started++) {
+          var task = tasks[started];
+          try {
+            task.call(null, createResolve(started), abort);
+          } catch (e) {
+            abort(e);
+          }
+        }
+      }
+      var q = {
+        defer: function defer(fn) {
+          if ((typeof fn === 'undefined' ? 'undefined' : _typeof(fn)) === 'object' && fn.then && fn.catch) {
+            var defer = fn;
+            fn = function fn(resolve, reject) {
+              defer.then(resolve).catch(reject);
+            };
+          }
+          funcGuard(fn);
+          if (err !== undefined) {
+            return;
+          } else if (complete) {
+            throw new Error('Queue already completed');
+          }
+          tasks.push(fn);
+          ++remaining;
+          pop();
+          return q;
+        },
+        then: function then(fn) {
+          funcGuard(fn);
+          if (completeQueue !== noop) {
+            throw new Error('queue `then` already set');
+          }
+          if (!err) {
+            completeQueue = fn;
+            if (!remaining) {
+              complete = true;
+              completeQueue(tasks);
+            }
+          }
+          return q;
+        },
+        catch: function _catch(fn) {
+          funcGuard(fn);
+          if (failed !== defaultFail) {
+            throw new Error('queue `catch` already set');
+          }
+          if (!err) {
+            failed = fn;
+          } else {
+            fn(err);
+            err = null;
+          }
+          return q;
+        },
+        abort: abort
+      };
+      return q;
+    }
+    axe.utils.queue = queue;
+  })();
+  'use strict';
+  var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function(obj) {
+    return typeof obj;
+  } : function(obj) {
+    return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj;
+  };
+  (function(exports) {
+    'use strict';
+    var messages = {}, subscribers = {};
+    function _getSource() {
+      var application = 'axe', version = '', src;
+      if (typeof axe !== 'undefined' && axe._audit && !axe._audit.application) {
+        application = axe._audit.application;
+      }
+      if (typeof axe !== 'undefined') {
+        version = axe.version;
+      }
+      src = application + '.' + version;
+      return src;
+    }
+    function verify(postedMessage) {
+      if ((typeof postedMessage === 'undefined' ? 'undefined' : _typeof(postedMessage)) === 'object' && typeof postedMessage.uuid === 'string' && postedMessage._respondable === true) {
+        var messageSource = _getSource();
+        return postedMessage._source === messageSource || postedMessage._source === 'axe.x.y.z' || messageSource === 'axe.x.y.z';
+      }
+      return false;
+    }
+    function post(win, topic, message, uuid, keepalive, callback) {
+      var error;
+      if (message instanceof Error) {
+        error = {
+          name: message.name,
+          message: message.message,
+          stack: message.stack
+        };
+        message = undefined;
+      }
+      var data = {
+        uuid: uuid,
+        topic: topic,
+        message: message,
+        error: error,
+        _respondable: true,
+        _source: _getSource(),
+        _keepalive: keepalive
+      };
+      if (typeof callback === 'function') {
+        messages[uuid] = callback;
+      }
+      win.postMessage(JSON.stringify(data), '*');
+    }
+    function respondable(win, topic, message, keepalive, callback) {
+      var id = uuid.v1();
+      post(win, topic, message, id, keepalive, callback);
+    }
+    respondable.subscribe = function(topic, callback) {
+      subscribers[topic] = callback;
+    };
+    respondable.isInFrame = function(win) {
+      win = win || window;
+      return !!win.frameElement;
+    };
+    function createResponder(source, topic, uuid) {
+      return function(message, keepalive, callback) {
+        post(source, topic, message, uuid, keepalive, callback);
+      };
+    }
+    function publish(target, data, keepalive) {
+      var topic = data.topic;
+      var subscriber = subscribers[topic];
+      if (subscriber) {
+        var responder = createResponder(target, null, data.uuid);
+        subscriber(data.message, keepalive, responder);
+      }
+    }
+    function buildErrorObject(error) {
+      var msg = error.message || 'Unknown error occurred';
+      var ErrConstructor = window[error.name] || Error;
+      if (error.stack) {
+        msg += '\n' + error.stack.replace(error.message, '');
+      }
+      return new ErrConstructor(msg);
+    }
+    function parseMessage(dataString) {
+      var data;
+      if (typeof dataString !== 'string') {
+        return;
+      }
+      try {
+        data = JSON.parse(dataString);
+      } catch (ex) {}
+      if (!verify(data)) {
+        return;
+      }
+      if (_typeof(data.error) === 'object') {
+        data.error = buildErrorObject(data.error);
+      } else {
+        data.error = undefined;
+      }
+      return data;
+    }
+    if (typeof window.addEventListener === 'function') {
+      window.addEventListener('message', function(e) {
+        var data = parseMessage(e.data);
+        if (!data) {
+          return;
+        }
+        var uuid = data.uuid;
+        var keepalive = data._keepalive;
+        var callback = messages[uuid];
+        if (callback) {
+          var result = data.error || data.message;
+          var responder = createResponder(e.source, data.topic, uuid);
+          callback(result, keepalive, responder);
+          if (!keepalive) {
+            delete messages[uuid];
+          }
+        }
+        if (!data.error) {
+          try {
+            publish(e.source, data, keepalive);
+          } catch (err) {
+            post(e.source, data.topic, err, uuid, false);
+          }
+        }
+      }, false);
+    }
+    exports.respondable = respondable;
+  })(utils);
+  'use strict';
+  function matchTags(rule, runOnly) {
+    'use strict';
+    var include, exclude, matching;
+    var defaultExclude = axe._audit && axe._audit.tagExclude ? axe._audit.tagExclude : [];
+    if (runOnly.include || runOnly.exclude) {
+      include = runOnly.include || [];
+      include = Array.isArray(include) ? include : [ include ];
+      exclude = runOnly.exclude || [];
+      exclude = Array.isArray(exclude) ? exclude : [ exclude ];
+      exclude = exclude.concat(defaultExclude.filter(function(tag) {
+        return include.indexOf(tag) === -1;
+      }));
+    } else {
+      include = Array.isArray(runOnly) ? runOnly : [ runOnly ];
+      exclude = defaultExclude.filter(function(tag) {
+        return include.indexOf(tag) === -1;
+      });
+    }
+    matching = include.some(function(tag) {
+      return rule.tags.indexOf(tag) !== -1;
+    });
+    if (matching || include.length === 0 && rule.enabled !== false) {
+      return exclude.every(function(tag) {
+        return rule.tags.indexOf(tag) === -1;
+      });
+    } else {
+      return false;
+    }
+  }
+  axe.utils.ruleShouldRun = function(rule, context, options) {
+    'use strict';
+    var runOnly = options.runOnly || {};
+    var ruleOptions = (options.rules || {})[rule.id];
+    if (rule.pageLevel && !context.page) {
+      return false;
+    } else if (runOnly.type === 'rule') {
+      return runOnly.values.indexOf(rule.id) !== -1;
+    } else if (ruleOptions && typeof ruleOptions.enabled === 'boolean') {
+      return ruleOptions.enabled;
+    } else if (runOnly.type === 'tag' && runOnly.values) {
+      return matchTags(rule, runOnly.values);
+    } else {
+      return matchTags(rule, []);
+    }
+  };
+  'use strict';
+  function getDeepest(collection) {
+    'use strict';
+    return collection.sort(function(a, b) {
+      if (axe.utils.contains(a, b)) {
+        return 1;
+      }
+      return -1;
+    })[0];
+  }
+  function isNodeInContext(node, context) {
+    'use strict';
+    var include = context.include && getDeepest(context.include.filter(function(candidate) {
+      return axe.utils.contains(candidate, node);
+    }));
+    var exclude = context.exclude && getDeepest(context.exclude.filter(function(candidate) {
+      return axe.utils.contains(candidate, node);
+    }));
+    if (!exclude && include || exclude && axe.utils.contains(exclude, include)) {
+      return true;
+    }
+    return false;
+  }
+  function pushNode(result, nodes, context) {
+    'use strict';
+    for (var i = 0, l = nodes.length; i < l; i++) {
+      if (!result.find(function(item) {
+        return item.actualNode === nodes[i].actualNode;
+      }) && isNodeInContext(nodes[i], context)) {
+        result.push(nodes[i]);
+      }
+    }
+  }
+  axe.utils.select = function select(selector, context) {
+    'use strict';
+    var result = [], candidate;
+    for (var i = 0, l = context.include.length; i < l; i++) {
+      candidate = context.include[i];
+      if (candidate.actualNode.nodeType === candidate.actualNode.ELEMENT_NODE && axe.utils.matchesSelector(candidate.actualNode, selector)) {
+        pushNode(result, [ candidate ], context);
+      }
+      pushNode(result, axe.utils.querySelectorAll(candidate, selector), context);
+    }
+    return result.sort(axe.utils.nodeSorter);
+  };
+  'use strict';
+  axe.utils.toArray = function(thing) {
+    'use strict';
+    return Array.prototype.slice.call(thing);
+  };
+  'use strict';
+  var uuid;
+  (function(_global) {
+    var _rng;
+    var _crypto = _global.crypto || _global.msCrypto;
+    if (!_rng && _crypto && _crypto.getRandomValues) {
+      var _rnds8 = new Uint8Array(16);
+      _rng = function whatwgRNG() {
+        _crypto.getRandomValues(_rnds8);
+        return _rnds8;
+      };
+    }
+    if (!_rng) {
+      var _rnds = new Array(16);
+      _rng = function _rng() {
+        for (var i = 0, r; i < 16; i++) {
+          if ((i & 3) === 0) {
+            r = Math.random() * 4294967296;
+          }
+          _rnds[i] = r >>> ((i & 3) << 3) & 255;
+        }
+        return _rnds;
+      };
+    }
+    var BufferClass = typeof _global.Buffer == 'function' ? _global.Buffer : Array;
+    var _byteToHex = [];
+    var _hexToByte = {};
+    for (var i = 0; i < 256; i++) {
+      _byteToHex[i] = (i + 256).toString(16).substr(1);
+      _hexToByte[_byteToHex[i]] = i;
+    }
+    function parse(s, buf, offset) {
+      var i = buf && offset || 0, ii = 0;
+      buf = buf || [];
+      s.toLowerCase().replace(/[0-9a-f]{2}/g, function(oct) {
+        if (ii < 16) {
+          buf[i + ii++] = _hexToByte[oct];
+        }
+      });
+      while (ii < 16) {
+        buf[i + ii++] = 0;
+      }
+      return buf;
+    }
+    function unparse(buf, offset) {
+      var i = offset || 0, bth = _byteToHex;
+      return bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] + '-' + bth[buf[i++]] + bth[buf[i++]] + '-' + bth[buf[i++]] + bth[buf[i++]] + '-' + bth[buf[i++]] + bth[buf[i++]] + '-' + bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]];
+    }
+    var _seedBytes = _rng();
+    var _nodeId = [ _seedBytes[0] | 1, _seedBytes[1], _seedBytes[2], _seedBytes[3], _seedBytes[4], _seedBytes[5] ];
+    var _clockseq = (_seedBytes[6] << 8 | _seedBytes[7]) & 16383;
+    var _lastMSecs = 0, _lastNSecs = 0;
+    function v1(options, buf, offset) {
+      var i = buf && offset || 0;
+      var b = buf || [];
+      options = options || {};
+      var clockseq = options.clockseq != null ? options.clockseq : _clockseq;
+      var msecs = options.msecs != null ? options.msecs : new Date().getTime();
+      var nsecs = options.nsecs != null ? options.nsecs : _lastNSecs + 1;
+      var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 1e4;
+      if (dt < 0 && options.clockseq == null) {
+        clockseq = clockseq + 1 & 16383;
+      }
+      if ((dt < 0 || msecs > _lastMSecs) && options.nsecs == null) {
+        nsecs = 0;
+      }
+      if (nsecs >= 1e4) {
+        throw new Error('uuid.v1(): Can\'t create more than 10M uuids/sec');
+      }
+      _lastMSecs = msecs;
+      _lastNSecs = nsecs;
+      _clockseq = clockseq;
+      msecs += 122192928e5;
+      var tl = ((msecs & 268435455) * 1e4 + nsecs) % 4294967296;
+      b[i++] = tl >>> 24 & 255;
+      b[i++] = tl >>> 16 & 255;
+      b[i++] = tl >>> 8 & 255;
+      b[i++] = tl & 255;
+      var tmh = msecs / 4294967296 * 1e4 & 268435455;
+      b[i++] = tmh >>> 8 & 255;
+      b[i++] = tmh & 255;
+      b[i++] = tmh >>> 24 & 15 | 16;
+      b[i++] = tmh >>> 16 & 255;
+      b[i++] = clockseq >>> 8 | 128;
+      b[i++] = clockseq & 255;
+      var node = options.node || _nodeId;
+      for (var n = 0; n < 6; n++) {
+        b[i + n] = node[n];
+      }
+      return buf ? buf : unparse(b);
+    }
+    function v4(options, buf, offset) {
+      var i = buf && offset || 0;
+      if (typeof options == 'string') {
+        buf = options == 'binary' ? new BufferClass(16) : null;
+        options = null;
+      }
+      options = options || {};
+      var rnds = options.random || (options.rng || _rng)();
+      rnds[6] = rnds[6] & 15 | 64;
+      rnds[8] = rnds[8] & 63 | 128;
+      if (buf) {
+        for (var ii = 0; ii < 16; ii++) {
+          buf[i + ii] = rnds[ii];
+        }
+      }
+      return buf || unparse(rnds);
+    }
+    uuid = v4;
+    uuid.v1 = v1;
+    uuid.v4 = v4;
+    uuid.parse = parse;
+    uuid.unparse = unparse;
+    uuid.BufferClass = BufferClass;
+  })(window);
+  'use strict';
+  axe._load({
+    data: {
+      rules: {
+        accesskeys: {
+          description: 'Ensures every accesskey attribute value is unique',
+          help: 'accesskey attribute value must be unique'
+        },
+        'area-alt': {
+          description: 'Ensures <area> elements of image maps have alternate text',
+          help: 'Active <area> elements must have alternate text'
+        },
+        'aria-allowed-attr': {
+          description: 'Ensures ARIA attributes are allowed for an element\'s role',
+          help: 'Elements must only use allowed ARIA attributes'
+        },
+        'aria-hidden-body': {
+          description: 'Ensures aria-hidden=\'true\' is not present on the document body.',
+          help: 'aria-hidden=\'true\' must not be present on the document body'
+        },
+        'aria-required-attr': {
+          description: 'Ensures elements with ARIA roles have all required ARIA attributes',
+          help: 'Required ARIA attributes must be provided'
+        },
+        'aria-required-children': {
+          description: 'Ensures elements with an ARIA role that require child roles contain them',
+          help: 'Certain ARIA roles must contain particular children'
+        },
+        'aria-required-parent': {
+          description: 'Ensures elements with an ARIA role that require parent roles are contained by them',
+          help: 'Certain ARIA roles must be contained by particular parents'
+        },
+        'aria-roles': {
+          description: 'Ensures all elements with a role attribute use a valid value',
+          help: 'ARIA roles used must conform to valid values'
+        },
+        'aria-valid-attr-value': {
+          description: 'Ensures all ARIA attributes have valid values',
+          help: 'ARIA attributes must conform to valid values'
+        },
+        'aria-valid-attr': {
+          description: 'Ensures attributes that begin with aria- are valid ARIA attributes',
+          help: 'ARIA attributes must conform to valid names'
+        },
+        'audio-caption': {
+          description: 'Ensures <audio> elements have captions',
+          help: '<audio> elements must have a captions track'
+        },
+        blink: {
+          description: 'Ensures <blink> elements are not used',
+          help: '<blink> elements are deprecated and must not be used'
+        },
+        'button-name': {
+          description: 'Ensures buttons have discernible text',
+          help: 'Buttons must have discernible text'
+        },
+        bypass: {
+          description: 'Ensures each page has at least one mechanism for a user to bypass navigation and jump straight to the content',
+          help: 'Page must have means to bypass repeated blocks'
+        },
+        checkboxgroup: {
+          description: 'Ensures related <input type="checkbox"> elements have a group and that that group designation is consistent',
+          help: 'Checkbox inputs with the same name attribute value must be part of a group'
+        },
+        'color-contrast': {
+          description: 'Ensures the contrast between foreground and background colors meets WCAG 2 AA contrast ratio thresholds',
+          help: 'Elements must have sufficient color contrast'
+        },
+        'definition-list': {
+          description: 'Ensures <dl> elements are structured correctly',
+          help: '<dl> elements must only directly contain properly-ordered <dt> and <dd> groups, <script> or <template> elements'
+        },
+        dlitem: {
+          description: 'Ensures <dt> and <dd> elements are contained by a <dl>',
+          help: '<dt> and <dd> elements must be contained by a <dl>'
+        },
+        'document-title': {
+          description: 'Ensures each HTML document contains a non-empty <title> element',
+          help: 'Documents must have <title> element to aid in navigation'
+        },
+        'duplicate-id': {
+          description: 'Ensures every id attribute value is unique',
+          help: 'id attribute value must be unique'
+        },
+        'empty-heading': {
+          description: 'Ensures headings have discernible text',
+          help: 'Headings must not be empty'
+        },
+        'frame-title-unique': {
+          description: 'Ensures <iframe> and <frame> elements contain a unique title attribute',
+          help: 'Frames must have a unique title attribute'
+        },
+        'frame-title': {
+          description: 'Ensures <iframe> and <frame> elements contain a non-empty title attribute',
+          help: 'Frames must have title attribute'
+        },
+        'heading-order': {
+          description: 'Ensures the order of headings is semantically correct',
+          help: 'Heading levels should only increase by one'
+        },
+        'hidden-content': {
+          description: 'Informs users about hidden content.',
+          help: 'Hidden content on the page cannot be analyzed'
+        },
+        'href-no-hash': {
+          description: 'Ensures that href values are valid link references to promote only using anchors as links',
+          help: 'Anchors must only be used as links with valid URLs or URL fragments'
+        },
+        'html-has-lang': {
+          description: 'Ensures every HTML document has a lang attribute',
+          help: '<html> element must have a lang attribute'
+        },
+        'html-lang-valid': {
+          description: 'Ensures the lang attribute of the <html> element has a valid value',
+          help: '<html> element must have a valid value for the lang attribute'
+        },
+        'image-alt': {
+          description: 'Ensures <img> elements have alternate text or a role of none or presentation',
+          help: 'Images must have alternate text'
+        },
+        'image-redundant-alt': {
+          description: 'Ensure button and link text is not repeated as image alternative',
+          help: 'Text of buttons and links should not be repeated in the image alternative'
+        },
+        'input-image-alt': {
+          description: 'Ensures <input type="image"> elements have alternate text',
+          help: 'Image buttons must have alternate text'
+        },
+        'label-title-only': {
+          description: 'Ensures that every form element is not solely labeled using the title or aria-describedby attributes',
+          help: 'Form elements should have a visible label'
+        },
+        label: {
+          description: 'Ensures every form element has a label',
+          help: 'Form elements must have labels'
+        },
+        'layout-table': {
+          description: 'Ensures presentational <table> elements do not use <th>, <caption> elements or the summary attribute',
+          help: 'Layout tables must not use data table elements'
+        },
+        'link-in-text-block': {
+          description: 'Links can be distinguished without relying on color',
+          help: 'Links must be distinguished from surrounding text in a way that does not rely on color'
+        },
+        'link-name': {
+          description: 'Ensures links have discernible text',
+          help: 'Links must have discernible text'
+        },
+        list: {
+          description: 'Ensures that lists are structured correctly',
+          help: '<ul> and <ol> must only directly contain <li>, <script> or <template> elements'
+        },
+        listitem: {
+          description: 'Ensures <li> elements are used semantically',
+          help: '<li> elements must be contained in a <ul> or <ol>'
+        },
+        marquee: {
+          description: 'Ensures <marquee> elements are not used',
+          help: '<marquee> elements are deprecated and must not be used'
+        },
+        'meta-refresh': {
+          description: 'Ensures <meta http-equiv="refresh"> is not used',
+          help: 'Timed refresh must not exist'
+        },
+        'meta-viewport-large': {
+          description: 'Ensures <meta name="viewport"> can scale a significant amount',
+          help: 'Users should be able to zoom and scale the text up to 500%'
+        },
+        'meta-viewport': {
+          description: 'Ensures <meta name="viewport"> does not disable text scaling and zooming',
+          help: 'Zooming and scaling must not be disabled'
+        },
+        'object-alt': {
+          description: 'Ensures <object> elements have alternate text',
+          help: '<object> elements must have alternate text'
+        },
+        'p-as-heading': {
+          description: 'Ensure p elements are not used to style headings',
+          help: 'Bold, italic text and font-size are not used to style p elements as a heading'
+        },
+        radiogroup: {
+          description: 'Ensures related <input type="radio"> elements have a group and that the group designation is consistent',
+          help: 'Radio inputs with the same name attribute value must be part of a group'
+        },
+        region: {
+          description: 'Ensures all content is contained within a landmark region',
+          help: 'Content should be contained in a landmark region'
+        },
+        'scope-attr-valid': {
+          description: 'Ensures the scope attribute is used correctly on tables',
+          help: 'scope attribute should be used correctly'
+        },
+        'server-side-image-map': {
+          description: 'Ensures that server-side image maps are not used',
+          help: 'Server-side image maps must not be used'
+        },
+        'skip-link': {
+          description: 'Ensures the first link on the page is a skip link',
+          help: 'The page should have a skip link as its first link'
+        },
+        tabindex: {
+          description: 'Ensures tabindex attribute values are not greater than 0',
+          help: 'Elements should not have tabindex greater than zero'
+        },
+        'table-duplicate-name': {
+          description: 'Ensure that tables do not have the same summary and caption',
+          help: 'The <caption> element should not contain the same text as the summary attribute'
+        },
+        'table-fake-caption': {
+          description: 'Ensure that tables with a caption use the <caption> element.',
+          help: 'Data or header cells should not be used to give caption to a data table.'
+        },
+        'td-has-header': {
+          description: 'Ensure that each non-empty data cell in a large table has one or more table headers',
+          help: 'All non-empty td element in table larger than 3 by 3 must have an associated table header'
+        },
+        'td-headers-attr': {
+          description: 'Ensure that each cell in a table using the headers refers to another cell in that table',
+          help: 'All cells in a table element that use the headers attribute must only refer to other cells of that same table'
+        },
+        'th-has-data-cells': {
+          description: 'Ensure that each table header in a data table refers to data cells',
+          help: 'All th element and elements with role=columnheader/rowheader must data cells which it describes'
+        },
+        'valid-lang': {
+          description: 'Ensures lang attributes have valid values',
+          help: 'lang attribute must have a valid value'
+        },
+        'video-caption': {
+          description: 'Ensures <video> elements have captions',
+          help: '<video> elements must have captions'
+        },
+        'video-description': {
+          description: 'Ensures <video> elements have audio descriptions',
+          help: '<video> elements must have an audio description track'
+        }
+      },
+      checks: {
+        accesskeys: {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Accesskey attribute value is unique';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Document has multiple elements with the same accesskey';
+              return out;
+            }
+          }
+        },
+        'non-empty-alt': {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Element has a non-empty alt attribute';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Element has no alt attribute or the alt attribute is empty';
+              return out;
+            }
+          }
+        },
+        'non-empty-title': {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Element has a title attribute';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Element has no title attribute or the title attribute is empty';
+              return out;
+            }
+          }
+        },
+        'aria-label': {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'aria-label attribute exists and is not empty';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'aria-label attribute does not exist or is empty';
+              return out;
+            }
+          }
+        },
+        'aria-labelledby': {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'aria-labelledby attribute exists and references elements that are visible to screen readers';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty or not visible';
+              return out;
+            }
+          }
+        },
+        'aria-allowed-attr': {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'ARIA attributes are used correctly for the defined role';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'ARIA attribute' + (it.data && it.data.length > 1 ? 's are' : ' is') + ' not allowed:';
+              var arr1 = it.data;
+              if (arr1) {
+                var value, i1 = -1, l1 = arr1.length - 1;
+                while (i1 < l1) {
+                  value = arr1[i1 += 1];
+                  out += ' ' + value;
+                }
+              }
+              return out;
+            }
+          }
+        },
+        'aria-hidden-body': {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'No aria-hidden attribute is present on document body';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'aria-hidden=true should not be present on the document body';
+              return out;
+            }
+          }
+        },
+        'aria-required-attr': {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'All required ARIA attributes are present';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Required ARIA attribute' + (it.data && it.data.length > 1 ? 's' : '') + ' not present:';
+              var arr1 = it.data;
+              if (arr1) {
+                var value, i1 = -1, l1 = arr1.length - 1;
+                while (i1 < l1) {
+                  value = arr1[i1 += 1];
+                  out += ' ' + value;
+                }
+              }
+              return out;
+            }
+          }
+        },
+        'aria-required-children': {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Required ARIA children are present';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Required ARIA ' + (it.data && it.data.length > 1 ? 'children' : 'child') + ' role not present:';
+              var arr1 = it.data;
+              if (arr1) {
+                var value, i1 = -1, l1 = arr1.length - 1;
+                while (i1 < l1) {
+                  value = arr1[i1 += 1];
+                  out += ' ' + value;
+                }
+              }
+              return out;
+            }
+          }
+        },
+        'aria-required-parent': {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Required ARIA parent role present';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Required ARIA parent' + (it.data && it.data.length > 1 ? 's' : '') + ' role not present:';
+              var arr1 = it.data;
+              if (arr1) {
+                var value, i1 = -1, l1 = arr1.length - 1;
+                while (i1 < l1) {
+                  value = arr1[i1 += 1];
+                  out += ' ' + value;
+                }
+              }
+              return out;
+            }
+          }
+        },
+        invalidrole: {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'ARIA role is valid';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Role must be one of the valid ARIA roles';
+              return out;
+            }
+          }
+        },
+        abstractrole: {
+          impact: 'serious',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Abstract roles are not used';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Abstract roles cannot be directly used';
+              return out;
+            }
+          }
+        },
+        'aria-valid-attr-value': {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'ARIA attribute values are valid';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Invalid ARIA attribute value' + (it.data && it.data.length > 1 ? 's' : '') + ':';
+              var arr1 = it.data;
+              if (arr1) {
+                var value, i1 = -1, l1 = arr1.length - 1;
+                while (i1 < l1) {
+                  value = arr1[i1 += 1];
+                  out += ' ' + value;
+                }
+              }
+              return out;
+            }
+          }
+        },
+        'aria-valid-attr': {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'ARIA attribute name' + (it.data && it.data.length > 1 ? 's' : '') + ' are valid';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Invalid ARIA attribute name' + (it.data && it.data.length > 1 ? 's' : '') + ':';
+              var arr1 = it.data;
+              if (arr1) {
+                var value, i1 = -1, l1 = arr1.length - 1;
+                while (i1 < l1) {
+                  value = arr1[i1 += 1];
+                  out += ' ' + value;
+                }
+              }
+              return out;
+            }
+          }
+        },
+        caption: {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'The multimedia element has a captions track';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'The multimedia element does not have a captions track';
+              return out;
+            },
+            incomplete: function anonymous(it) {
+              var out = 'A captions track for this element could not be found';
+              return out;
+            }
+          }
+        },
+        'is-on-screen': {
+          impact: 'minor',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Element is not visible';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Element is visible';
+              return out;
+            }
+          }
+        },
+        'non-empty-if-present': {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Element ';
+              if (it.data) {
+                out += 'has a non-empty value attribute';
+              } else {
+                out += 'does not have a value attribute';
+              }
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Element has a value attribute and the value attribute is empty';
+              return out;
+            }
+          }
+        },
+        'non-empty-value': {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Element has a non-empty value attribute';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Element has no value attribute or the value attribute is empty';
+              return out;
+            }
+          }
+        },
+        'button-has-visible-text': {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Element has inner text that is visible to screen readers';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Element does not have inner text that is visible to screen readers';
+              return out;
+            }
+          }
+        },
+        'role-presentation': {
+          impact: 'moderate',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Element\'s default semantics were overriden with role="presentation"';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Element\'s default semantics were not overridden with role="presentation"';
+              return out;
+            }
+          }
+        },
+        'role-none': {
+          impact: 'moderate',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Element\'s default semantics were overriden with role="none"';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Element\'s default semantics were not overridden with role="none"';
+              return out;
+            }
+          }
+        },
+        'focusable-no-name': {
+          impact: 'serious',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Element is not in tab order or has accessible text';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Element is in tab order and does not have accessible text';
+              return out;
+            }
+          }
+        },
+        'internal-link-present': {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Valid skip link found';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'No valid skip link found';
+              return out;
+            }
+          }
+        },
+        'header-present': {
+          impact: 'moderate',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Page has a header';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Page does not have a header';
+              return out;
+            }
+          }
+        },
+        landmark: {
+          impact: 'serious',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Page has a landmark region';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Page does not have a landmark region';
+              return out;
+            }
+          }
+        },
+        'group-labelledby': {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'All elements with the name "' + it.data.name + '" reference the same element with aria-labelledby';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'All elements with the name "' + it.data.name + '" do not reference the same element with aria-labelledby';
+              return out;
+            }
+          }
+        },
+        fieldset: {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Element is contained in a fieldset';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = '';
+              var code = it.data && it.data.failureCode;
+              if (code === 'no-legend') {
+                out += 'Fieldset does not have a legend as its first child';
+              } else if (code === 'empty-legend') {
+                out += 'Legend does not have text that is visible to screen readers';
+              } else if (code === 'mixed-inputs') {
+                out += 'Fieldset contains unrelated inputs';
+              } else if (code === 'no-group-label') {
+                out += 'ARIA group does not have aria-label or aria-labelledby';
+              } else if (code === 'group-mixed-inputs') {
+                out += 'ARIA group contains unrelated inputs';
+              } else {
+                out += 'Element does not have a containing fieldset or ARIA group';
+              }
+              return out;
+            }
+          }
+        },
+        'color-contrast': {
+          impact: 'serious',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Element has sufficient color contrast of ' + it.data.contrastRatio;
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Element has insufficient color contrast of ' + it.data.contrastRatio + ' (foreground color: ' + it.data.fgColor + ', background color: ' + it.data.bgColor + ', font size: ' + it.data.fontSize + ', font weight: ' + it.data.fontWeight + ')';
+              return out;
+            },
+            incomplete: {
+              bgImage: 'Element\'s background color could not be determined due to a background image',
+              bgGradient: 'Element\'s background color could not be determined due to a background gradient',
+              imgNode: 'Element\'s background color could not be determined because element contains an image node',
+              bgOverlap: 'Element\'s background color could not be determined because it is overlapped by another element',
+              fgAlpha: 'Element\'s foreground color could not be determined because of alpha transparency',
+              elmPartiallyObscured: 'Element\'s background color could not be determined because it\'s partially obscured by another element',
+              equalRatio: 'Element has a 1:1 contrast ratio with the background',
+              default: 'Unable to determine contrast ratio'
+            }
+          }
+        },
+        'structured-dlitems': {
+          impact: 'serious',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'When not empty, element has both <dt> and <dd> elements';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'When not empty, element does not have at least one <dt> element followed by at least one <dd> element';
+              return out;
+            }
+          }
+        },
+        'only-dlitems': {
+          impact: 'serious',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'List element only has direct children that are allowed inside <dt> or <dd> elements';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'List element has direct children that are not allowed inside <dt> or <dd> elements';
+              return out;
+            }
+          }
+        },
+        dlitem: {
+          impact: 'serious',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Description list item has a <dl> parent element';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Description list item does not have a <dl> parent element';
+              return out;
+            }
+          }
+        },
+        'doc-has-title': {
+          impact: 'moderate',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Document has a non-empty <title> element';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Document does not have a non-empty <title> element';
+              return out;
+            }
+          }
+        },
+        'duplicate-id': {
+          impact: 'moderate',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Document has no elements that share the same id attribute';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Document has multiple elements with the same id attribute: ' + it.data;
+              return out;
+            }
+          }
+        },
+        'has-visible-text': {
+          impact: 'moderate',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Element has text that is visible to screen readers';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Element does not have text that is visible to screen readers';
+              return out;
+            }
+          }
+        },
+        'unique-frame-title': {
+          impact: 'serious',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Element\'s title attribute is unique';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Element\'s title attribute is not unique';
+              return out;
+            }
+          }
+        },
+        'heading-order': {
+          impact: 'minor',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Heading order valid';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Heading order invalid';
+              return out;
+            }
+          }
+        },
+        'hidden-content': {
+          impact: 'minor',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'All content on the page has been analyzed.';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'There were problems analyzing the content on this page.';
+              return out;
+            },
+            incomplete: function anonymous(it) {
+              var out = 'There is hidden content on the page that was not analyzed. You will need to trigger the display of this content in order to analyze it.';
+              return out;
+            }
+          }
+        },
+        'href-no-hash': {
+          impact: 'moderate',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Anchor does not have an href value of #';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Anchor has an href value of #';
+              return out;
+            }
+          }
+        },
+        'has-lang': {
+          impact: 'serious',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'The <html> element has a lang attribute';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'The <html> element does not have a lang attribute';
+              return out;
+            }
+          }
+        },
+        'valid-lang': {
+          impact: 'serious',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Value of lang attribute is included in the list of valid languages';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Value of lang attribute not included in the list of valid languages';
+              return out;
+            }
+          }
+        },
+        'has-alt': {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Element has an alt attribute';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Element does not have an alt attribute';
+              return out;
+            }
+          }
+        },
+        'duplicate-img-label': {
+          impact: 'minor',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Element does not duplicate existing text in <img> alt text';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Element contains <img> element with alt text that duplicates existing text';
+              return out;
+            }
+          }
+        },
+        'title-only': {
+          impact: 'serious',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Form element does not solely use title attribute for its label';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Only title used to generate label for form element';
+              return out;
+            }
+          }
+        },
+        'implicit-label': {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Form element has an implicit (wrapped) <label>';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Form element does not have an implicit (wrapped) <label>';
+              return out;
+            }
+          }
+        },
+        'explicit-label': {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Form element has an explicit <label>';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Form element does not have an explicit <label>';
+              return out;
+            }
+          }
+        },
+        'help-same-as-label': {
+          impact: 'minor',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Help text (title or aria-describedby) does not duplicate label text';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Help text (title or aria-describedby) text is the same as the label text';
+              return out;
+            }
+          }
+        },
+        'multiple-label': {
+          impact: 'serious',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Form element does not have multiple <label> elements';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Form element has multiple <label> elements';
+              return out;
+            }
+          }
+        },
+        'has-th': {
+          impact: 'serious',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Layout table does not use <th> elements';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Layout table uses <th> elements';
+              return out;
+            }
+          }
+        },
+        'has-caption': {
+          impact: 'serious',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Layout table does not use <caption> element';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Layout table uses <caption> element';
+              return out;
+            }
+          }
+        },
+        'has-summary': {
+          impact: 'serious',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Layout table does not use summary attribute';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Layout table uses summary attribute';
+              return out;
+            }
+          }
+        },
+        'link-in-text-block': {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Links can be distinguished from surrounding text in a way that does not rely on color';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Links can not be distinguished from surrounding text in a way that does not rely on color';
+              return out;
+            },
+            incomplete: {
+              bgContrast: 'Element\'s contrast ratio could not be determined. Check for a distinct hover/focus style',
+              bgImage: 'Element\'s contrast ratio could not be determined due to a background image',
+              bgGradient: 'Element\'s contrast ratio could not be determined due to a background gradient',
+              imgNode: 'Element\'s contrast ratio could not be determined because element contains an image node',
+              bgOverlap: 'Element\'s contrast ratio could not be determined because of element overlap',
+              default: 'Unable to determine contrast ratio'
+            }
+          }
+        },
+        'only-listitems': {
+          impact: 'serious',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'List element only has direct children that are allowed inside <li> elements';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'List element has direct children that are not allowed inside <li> elements';
+              return out;
+            }
+          }
+        },
+        listitem: {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'List item has a <ul>, <ol> or role="list" parent element';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'List item does not have a <ul>, <ol> or role="list" parent element';
+              return out;
+            }
+          }
+        },
+        'meta-refresh': {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = '<meta> tag does not immediately refresh the page';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = '<meta> tag forces timed refresh of page';
+              return out;
+            }
+          }
+        },
+        'meta-viewport-large': {
+          impact: 'minor',
+          messages: {
+            pass: function anonymous(it) {
+              var out = '<meta> tag does not prevent significant zooming';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = '<meta> tag limits zooming';
+              return out;
+            }
+          }
+        },
+        'meta-viewport': {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = '<meta> tag does not disable zooming';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = '<meta> tag disables zooming';
+              return out;
+            }
+          }
+        },
+        'p-as-heading': {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = '<p> elements are not styled as headings';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Heading elements should be used instead of styled p elements';
+              return out;
+            }
+          }
+        },
+        region: {
+          impact: 'moderate',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Content contained by ARIA landmark';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Content not contained by an ARIA landmark';
+              return out;
+            }
+          }
+        },
+        'html5-scope': {
+          impact: 'serious',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Scope attribute is only used on table header elements (<th>)';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'In HTML 5, scope attributes may only be used on table header elements (<th>)';
+              return out;
+            }
+          }
+        },
+        'scope-value': {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Scope attribute is used correctly';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'The value of the scope attribute may only be \'row\' or \'col\'';
+              return out;
+            }
+          }
+        },
+        exists: {
+          impact: 'minor',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Element does not exist';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Element exists';
+              return out;
+            }
+          }
+        },
+        'skip-link': {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Valid skip link found';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'No valid skip link found';
+              return out;
+            }
+          }
+        },
+        tabindex: {
+          impact: 'serious',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Element does not have a tabindex greater than 0';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Element has a tabindex greater than 0';
+              return out;
+            }
+          }
+        },
+        'same-caption-summary': {
+          impact: 'moderate',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'Content of summary attribute and <caption> are not duplicated';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Content of summary attribute and <caption> element are identical';
+              return out;
+            }
+          }
+        },
+        'caption-faked': {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'The first row of a table is not used as a caption';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'The first row of the table should be a caption instead of a table cell';
+              return out;
+            }
+          }
+        },
+        'td-has-header': {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'All non-empty data cells have table headers';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Some non-empty data cells do not have table headers';
+              return out;
+            }
+          }
+        },
+        'td-headers-attr': {
+          impact: 'serious',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'The headers attribute is exclusively used to refer to other cells in the table';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'The headers attribute is not exclusively used to refer to other cells in the table';
+              return out;
+            }
+          }
+        },
+        'th-has-data-cells': {
+          impact: 'critical',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'All table header cells refer to data cells';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'Not all table header cells refer to data cells';
+              return out;
+            },
+            incomplete: function anonymous(it) {
+              var out = 'Table data cells are missing or empty';
+              return out;
+            }
+          }
+        },
+        description: {
+          impact: 'serious',
+          messages: {
+            pass: function anonymous(it) {
+              var out = 'The multimedia element has an audio description track';
+              return out;
+            },
+            fail: function anonymous(it) {
+              var out = 'The multimedia element does not have an audio description track';
+              return out;
+            },
+            incomplete: function anonymous(it) {
+              var out = 'An audio description track for this element could not be found';
+              return out;
+            }
+          }
+        }
+      },
+      failureSummaries: {
+        any: {
+          failureMessage: function anonymous(it) {
+            var out = 'Fix any of the following:';
+            var arr1 = it;
+            if (arr1) {
+              var value, i1 = -1, l1 = arr1.length - 1;
+              while (i1 < l1) {
+                value = arr1[i1 += 1];
+                out += '\n  ' + value.split('\n').join('\n  ');
+              }
+            }
+            return out;
+          }
+        },
+        none: {
+          failureMessage: function anonymous(it) {
+            var out = 'Fix all of the following:';
+            var arr1 = it;
+            if (arr1) {
+              var value, i1 = -1, l1 = arr1.length - 1;
+              while (i1 < l1) {
+                value = arr1[i1 += 1];
+                out += '\n  ' + value.split('\n').join('\n  ');
+              }
+            }
+            return out;
+          }
+        }
+      },
+      incompleteFallbackMessage: function anonymous(it) {
+        var out = 'aXe couldn\'t tell the reason. Time to break out the element inspector!';
+        return out;
+      }
+    },
+    rules: [ {
+      id: 'accesskeys',
+      selector: '[accesskey]',
+      excludeHidden: false,
+      tags: [ 'wcag2a', 'wcag211', 'cat.keyboard' ],
+      all: [],
+      any: [],
+      none: [ 'accesskeys' ]
+    }, {
+      id: 'area-alt',
+      selector: 'map area[href]',
+      excludeHidden: false,
+      tags: [ 'cat.text-alternatives', 'wcag2a', 'wcag111', 'section508', 'section508.22.a' ],
+      all: [],
+      any: [ 'non-empty-alt', 'non-empty-title', 'aria-label', 'aria-labelledby' ],
+      none: []
+    }, {
+      id: 'aria-allowed-attr',
+      matches: function matches(node) {
+        var role = node.getAttribute('role');
+        if (!role) {
+          role = axe.commons.aria.implicitRole(node);
+        }
+        var allowed = axe.commons.aria.allowedAttr(role);
+        if (role && allowed) {
+          var aria = /^aria-/;
+          if (node.hasAttributes()) {
+            var attrs = node.attributes;
+            for (var i = 0, l = attrs.length; i < l; i++) {
+              if (aria.test(attrs[i].name)) {
+                return true;
+              }
+            }
+          }
+        }
+        return false;
+      },
+      tags: [ 'cat.aria', 'wcag2a', 'wcag411', 'wcag412' ],
+      all: [],
+      any: [ 'aria-allowed-attr' ],
+      none: []
+    }, {
+      id: 'aria-hidden-body',
+      selector: 'body',
+      excludeHidden: false,
+      tags: [ 'cat.aria', 'wcag2a', 'wcag412' ],
+      all: [],
+      any: [ 'aria-hidden-body' ],
+      none: []
+    }, {
+      id: 'aria-required-attr',
+      selector: '[role]',
+      tags: [ 'cat.aria', 'wcag2a', 'wcag411', 'wcag412' ],
+      all: [],
+      any: [ 'aria-required-attr' ],
+      none: []
+    }, {
+      id: 'aria-required-children',
+      selector: '[role]',
+      tags: [ 'cat.aria', 'wcag2a', 'wcag131' ],
+      all: [],
+      any: [ 'aria-required-children' ],
+      none: []
+    }, {
+      id: 'aria-required-parent',
+      selector: '[role]',
+      tags: [ 'cat.aria', 'wcag2a', 'wcag131' ],
+      all: [],
+      any: [ 'aria-required-parent' ],
+      none: []
+    }, {
+      id: 'aria-roles',
+      selector: '[role]',
+      tags: [ 'cat.aria', 'wcag2a', 'wcag131', 'wcag411', 'wcag412' ],
+      all: [],
+      any: [],
+      none: [ 'invalidrole', 'abstractrole' ]
+    }, {
+      id: 'aria-valid-attr-value',
+      matches: function matches(node) {
+        var aria = /^aria-/;
+        if (node.hasAttributes()) {
+          var attrs = node.attributes;
+          for (var i = 0, l = attrs.length; i < l; i++) {
+            if (aria.test(attrs[i].name)) {
+              return true;
+            }
+          }
+        }
+        return false;
+      },
+      tags: [ 'cat.aria', 'wcag2a', 'wcag131', 'wcag411', 'wcag412' ],
+      all: [],
+      any: [ {
+        options: [],
+        id: 'aria-valid-attr-value'
+      } ],
+      none: []
+    }, {
+      id: 'aria-valid-attr',
+      matches: function matches(node) {
+        var aria = /^aria-/;
+        if (node.hasAttributes()) {
+          var attrs = node.attributes;
+          for (var i = 0, l = attrs.length; i < l; i++) {
+            if (aria.test(attrs[i].name)) {
+              return true;
+            }
+          }
+        }
+        return false;
+      },
+      tags: [ 'cat.aria', 'wcag2a', 'wcag411' ],
+      all: [],
+      any: [ {
+        options: [],
+        id: 'aria-valid-attr'
+      } ],
+      none: []
+    }, {
+      id: 'audio-caption',
+      selector: 'audio',
+      excludeHidden: false,
+      tags: [ 'cat.time-and-media', 'wcag2a', 'wcag122', 'section508', 'section508.22.a' ],
+      all: [],
+      any: [],
+      none: [ 'caption' ]
+    }, {
+      id: 'blink',
+      selector: 'blink',
+      excludeHidden: false,
+      tags: [ 'cat.time-and-media', 'wcag2a', 'wcag222', 'section508', 'section508.22.j' ],
+      all: [],
+      any: [],
+      none: [ 'is-on-screen' ]
+    }, {
+      id: 'button-name',
+      selector: 'button, [role="button"], input[type="button"], input[type="submit"], input[type="reset"]',
+      tags: [ 'cat.name-role-value', 'wcag2a', 'wcag412', 'section508', 'section508.22.a' ],
+      all: [],
+      any: [ 'non-empty-if-present', 'non-empty-value', 'button-has-visible-text', 'aria-label', 'aria-labelledby', 'role-presentation', 'role-none' ],
+      none: [ 'focusable-no-name' ]
+    }, {
+      id: 'bypass',
+      selector: 'html',
+      pageLevel: true,
+      matches: function matches(node) {
+        return !!node.querySelector('a[href]');
+      },
+      tags: [ 'cat.keyboard', 'wcag2a', 'wcag241', 'section508', 'section508.22.o' ],
+      all: [],
+      any: [ 'internal-link-present', 'header-present', 'landmark' ],
+      none: []
+    }, {
+      id: 'checkboxgroup',
+      selector: 'input[type=checkbox][name]',
+      tags: [ 'cat.forms', 'best-practice' ],
+      all: [],
+      any: [ 'group-labelledby', 'fieldset' ],
+      none: []
+    }, {
+      id: 'color-contrast',
+      matches: function matches(node) {
+        var nodeName = node.nodeName.toUpperCase(), nodeType = node.type, doc = document;
+        if (node.getAttribute('aria-disabled') === 'true' || axe.commons.dom.findUp(node, '[aria-disabled="true"]')) {
+          return false;
+        }
+        if (nodeName === 'INPUT') {
+          return [ 'hidden', 'range', 'color', 'checkbox', 'radio', 'image' ].indexOf(nodeType) === -1 && !node.disabled;
+        }
+        if (nodeName === 'SELECT') {
+          return !!node.options.length && !node.disabled;
+        }
+        if (nodeName === 'TEXTAREA') {
+          return !node.disabled;
+        }
+        if (nodeName === 'OPTION') {
+          return false;
+        }
+        if (nodeName === 'BUTTON' && node.disabled || axe.commons.dom.findUp(node, 'button[disabled]')) {
+          return false;
+        }
+        if (nodeName === 'FIELDSET' && node.disabled || axe.commons.dom.findUp(node, 'fieldset[disabled]')) {
+          return false;
+        }
+        var nodeParentLabel = axe.commons.dom.findUp(node, 'label');
+        if (nodeName === 'LABEL' || nodeParentLabel) {
+          var relevantNode = node;
+          if (nodeParentLabel) {
+            relevantNode = nodeParentLabel;
+          }
+          var candidate = relevantNode.htmlFor && doc.getElementById(relevantNode.htmlFor);
+          if (candidate && candidate.disabled) {
+            return false;
+          }
+          var candidate = node.querySelector('input:not([type="hidden"]):not([type="image"])' + ':not([type="button"]):not([type="submit"]):not([type="reset"]), select, textarea');
+          if (candidate && candidate.disabled) {
+            return false;
+          }
+        }
+        if (node.id) {
+          var candidate = doc.querySelector('[aria-labelledby~=' + axe.commons.utils.escapeSelector(node.id) + ']');
+          if (candidate && candidate.disabled) {
+            return false;
+          }
+        }
+        if (axe.commons.text.visible(node, false, true) === '') {
+          return false;
+        }
+        var range = document.createRange(), childNodes = node.childNodes, length = childNodes.length, child, index;
+        for (index = 0; index < length; index++) {
+          child = childNodes[index];
+          if (child.nodeType === 3 && axe.commons.text.sanitize(child.nodeValue) !== '') {
+            range.selectNodeContents(child);
+          }
+        }
+        var rects = range.getClientRects();
+        length = rects.length;
+        for (index = 0; index < length; index++) {
+          if (axe.commons.dom.visuallyOverlaps(rects[index], node)) {
+            return true;
+          }
+        }
+        return false;
+      },
+      excludeHidden: false,
+      options: {
+        noScroll: false
+      },
+      tags: [ 'cat.color', 'wcag2aa', 'wcag143' ],
+      all: [],
+      any: [ 'color-contrast' ],
+      none: []
+    }, {
+      id: 'definition-list',
+      selector: 'dl',
+      matches: function matches(node) {
+        return !node.getAttribute('role');
+      },
+      tags: [ 'cat.structure', 'wcag2a', 'wcag131' ],
+      all: [],
+      any: [],
+      none: [ 'structured-dlitems', 'only-dlitems' ]
+    }, {
+      id: 'dlitem',
+      selector: 'dd, dt',
+      matches: function matches(node) {
+        return !node.getAttribute('role');
+      },
+      tags: [ 'cat.structure', 'wcag2a', 'wcag131' ],
+      all: [],
+      any: [ 'dlitem' ],
+      none: []
+    }, {
+      id: 'document-title',
+      selector: 'html',
+      matches: function matches(node) {
+        return node.ownerDocument.defaultView.self === node.ownerDocument.defaultView.top;
+      },
+      tags: [ 'cat.text-alternatives', 'wcag2a', 'wcag242' ],
+      all: [],
+      any: [ 'doc-has-title' ],
+      none: []
+    }, {
+      id: 'duplicate-id',
+      selector: '[id]',
+      excludeHidden: false,
+      tags: [ 'cat.parsing', 'wcag2a', 'wcag411' ],
+      all: [],
+      any: [ 'duplicate-id' ],
+      none: []
+    }, {
+      id: 'empty-heading',
+      selector: 'h1, h2, h3, h4, h5, h6, [role="heading"]',
+      enabled: true,
+      tags: [ 'cat.name-role-value', 'best-practice' ],
+      all: [],
+      any: [ 'has-visible-text', 'role-presentation', 'role-none' ],
+      none: []
+    }, {
+      id: 'frame-title-unique',
+      selector: 'frame[title], iframe[title]',
+      matches: function matches(node) {
+        var title = node.getAttribute('title');
+        return !!(title ? axe.commons.text.sanitize(title).trim() : '');
+      },
+      tags: [ 'cat.text-alternatives', 'best-practice' ],
+      all: [],
+      any: [],
+      none: [ 'unique-frame-title' ]
+    }, {
+      id: 'frame-title',
+      selector: 'frame, iframe',
+      tags: [ 'cat.text-alternatives', 'wcag2a', 'wcag241', 'section508', 'section508.22.i' ],
+      all: [],
+      any: [ 'aria-label', 'aria-labelledby', 'non-empty-title', 'role-presentation', 'role-none' ],
+      none: []
+    }, {
+      id: 'heading-order',
+      selector: 'h1,h2,h3,h4,h5,h6,[role=heading]',
+      enabled: false,
+      tags: [ 'cat.semantics', 'best-practice' ],
+      all: [],
+      any: [ 'heading-order' ],
+      none: []
+    }, {
+      id: 'hidden-content',
+      selector: '*',
+      excludeHidden: false,
+      tags: [ 'experimental', 'review-item' ],
+      all: [],
+      any: [ 'hidden-content' ],
+      none: [],
+      enabled: false
+    }, {
+      id: 'href-no-hash',
+      selector: 'a[href]',
+      enabled: false,
+      tags: [ 'cat.semantics', 'best-practice' ],
+      all: [],
+      any: [ 'href-no-hash' ],
+      none: []
+    }, {
+      id: 'html-has-lang',
+      selector: 'html',
+      tags: [ 'cat.language', 'wcag2a', 'wcag311' ],
+      all: [],
+      any: [ 'has-lang' ],
+      none: []
+    }, {
+      id: 'html-lang-valid',
+      selector: 'html[lang]',
+      tags: [ 'cat.language', 'wcag2a', 'wcag311' ],
+      all: [],
+      any: [],
+      none: [ 'valid-lang' ]
+    }, {
+      id: 'image-alt',
+      selector: 'img, [role=\'img\']',
+      tags: [ 'cat.text-alternatives', 'wcag2a', 'wcag111', 'section508', 'section508.22.a' ],
+      all: [],
+      any: [ 'has-alt', 'aria-label', 'aria-labelledby', 'non-empty-title', 'role-presentation', 'role-none' ],
+      none: []
+    }, {
+      id: 'image-redundant-alt',
+      selector: 'button, [role="button"], a[href], p, li, td, th',
+      tags: [ 'cat.text-alternatives', 'best-practice' ],
+      all: [],
+      any: [],
+      none: [ 'duplicate-img-label' ]
+    }, {
+      id: 'input-image-alt',
+      selector: 'input[type="image"]',
+      tags: [ 'cat.text-alternatives', 'wcag2a', 'wcag111', 'section508', 'section508.22.a' ],
+      all: [],
+      any: [ 'non-empty-alt', 'aria-label', 'aria-labelledby', 'non-empty-title' ],
+      none: []
+    }, {
+      id: 'label-title-only',
+      selector: 'input, select, textarea',
+      matches: function matches(node) {
+        if (node.nodeName.toLowerCase() !== 'input') {
+          return true;
+        }
+        var t = node.getAttribute('type').toLowerCase();
+        if (t === 'hidden' || t === 'image' || t === 'button' || t === 'submit' || t === 'reset') {
+          return false;
+        }
+        return true;
+      },
+      enabled: false,
+      tags: [ 'cat.forms', 'best-practice' ],
+      all: [],
+      any: [],
+      none: [ 'title-only' ]
+    }, {
+      id: 'label',
+      selector: 'input, select, textarea',
+      matches: function matches(node) {
+        if (node.nodeName.toLowerCase() !== 'input') {
+          return true;
+        }
+        var t = node.getAttribute('type').toLowerCase();
+        if (t === 'hidden' || t === 'image' || t === 'button' || t === 'submit' || t === 'reset') {
+          return false;
+        }
+        return true;
+      },
+      tags: [ 'cat.forms', 'wcag2a', 'wcag332', 'wcag131', 'section508', 'section508.22.n' ],
+      all: [],
+      any: [ 'aria-label', 'aria-labelledby', 'implicit-label', 'explicit-label', 'non-empty-title' ],
+      none: [ 'help-same-as-label', 'multiple-label' ]
+    }, {
+      id: 'layout-table',
+      selector: 'table',
+      matches: function matches(node) {
+        return !axe.commons.table.isDataTable(node);
+      },
+      tags: [ 'cat.semantics', 'wcag2a', 'wcag131' ],
+      all: [],
+      any: [],
+      none: [ 'has-th', 'has-caption', 'has-summary' ]
+    }, {
+      id: 'link-in-text-block',
+      selector: 'a[href], *[role=link]',
+      matches: function matches(node) {
+        var text = axe.commons.text.sanitize(node.textContent);
+        var role = node.getAttribute('role');
+        if (role && role !== 'link') {
+          return false;
+        }
+        if (!text) {
+          return false;
+        }
+        if (!axe.commons.dom.isVisible(node, false)) {
+          return false;
+        }
+        return axe.commons.dom.isInTextBlock(node);
+      },
+      excludeHidden: false,
+      tags: [ 'cat.color', 'experimental', 'wcag2a', 'wcag141' ],
+      all: [ 'link-in-text-block' ],
+      any: [],
+      none: []
+    }, {
+      id: 'link-name',
+      selector: 'a[href], [role=link][href]',
+      matches: function matches(node) {
+        return node.getAttribute('role') !== 'button';
+      },
+      tags: [ 'cat.name-role-value', 'wcag2a', 'wcag111', 'wcag412', 'section508', 'section508.22.a' ],
+      all: [],
+      any: [ 'has-visible-text', 'aria-label', 'aria-labelledby', 'role-presentation', 'role-none' ],
+      none: [ 'focusable-no-name' ]
+    }, {
+      id: 'list',
+      selector: 'ul, ol',
+      matches: function matches(node) {
+        return !node.getAttribute('role');
+      },
+      tags: [ 'cat.structure', 'wcag2a', 'wcag131' ],
+      all: [],
+      any: [],
+      none: [ 'only-listitems' ]
+    }, {
+      id: 'listitem',
+      selector: 'li',
+      matches: function matches(node) {
+        return !node.getAttribute('role');
+      },
+      tags: [ 'cat.structure', 'wcag2a', 'wcag131' ],
+      all: [],
+      any: [ 'listitem' ],
+      none: []
+    }, {
+      id: 'marquee',
+      selector: 'marquee',
+      excludeHidden: false,
+      tags: [ 'cat.parsing', 'wcag2a', 'wcag222' ],
+      all: [],
+      any: [],
+      none: [ 'is-on-screen' ]
+    }, {
+      id: 'meta-refresh',
+      selector: 'meta[http-equiv="refresh"]',
+      excludeHidden: false,
+      tags: [ 'cat.time', 'wcag2a', 'wcag2aaa', 'wcag221', 'wcag224', 'wcag325' ],
+      all: [],
+      any: [ 'meta-refresh' ],
+      none: []
+    }, {
+      id: 'meta-viewport-large',
+      selector: 'meta[name="viewport"]',
+      excludeHidden: false,
+      tags: [ 'cat.sensory-and-visual-cues', 'best-practice' ],
+      all: [],
+      any: [ {
+        options: {
+          scaleMinimum: 5,
+          lowerBound: 2
+        },
+        id: 'meta-viewport-large'
+      } ],
+      none: []
+    }, {
+      id: 'meta-viewport',
+      selector: 'meta[name="viewport"]',
+      excludeHidden: false,
+      tags: [ 'cat.sensory-and-visual-cues', 'wcag2aa', 'wcag144' ],
+      all: [],
+      any: [ {
+        options: {
+          scaleMinimum: 2
+        },
+        id: 'meta-viewport'
+      } ],
+      none: []
+    }, {
+      id: 'object-alt',
+      selector: 'object',
+      tags: [ 'cat.text-alternatives', 'wcag2a', 'wcag111', 'section508', 'section508.22.a' ],
+      all: [],
+      any: [ 'has-visible-text', 'aria-label', 'aria-labelledby', 'non-empty-title' ],
+      none: []
+    }, {
+      id: 'p-as-heading',
+      selector: 'p',
+      matches: function matches(node) {
+        var children = Array.from(node.parentNode.childNodes);
+        var nodeText = node.textContent.trim();
+        var isSentence = /[.!?:;](?![.!?:;])/g;
+        if (nodeText.length === 0 || (nodeText.match(isSentence) || []).length >= 2) {
+          return false;
+        }
+        var siblingsAfter = children.slice(children.indexOf(node) + 1).filter(function(elm) {
+          return elm.nodeName.toUpperCase() === 'P' && elm.textContent.trim() !== '';
+        });
+        return siblingsAfter.length !== 0;
+      },
+      tags: [ 'cat.semantics', 'wcag2a', 'wcag131', 'experimental' ],
+      all: [ {
+        options: {
+          margins: [ {
+            weight: 150,
+            italic: true
+          }, {
+            weight: 150,
+            size: 1.15
+          }, {
+            italic: true,
+            size: 1.15
+          }, {
+            size: 1.4
+          } ]
+        },
+        id: 'p-as-heading'
+      } ],
+      any: [],
+      none: []
+    }, {
+      id: 'radiogroup',
+      selector: 'input[type=radio][name]',
+      tags: [ 'cat.forms', 'best-practice' ],
+      all: [],
+      any: [ 'group-labelledby', 'fieldset' ],
+      none: []
+    }, {
+      id: 'region',
+      selector: 'html',
+      pageLevel: true,
+      enabled: false,
+      tags: [ 'cat.keyboard', 'best-practice' ],
+      all: [],
+      any: [ 'region' ],
+      none: []
+    }, {
+      id: 'scope-attr-valid',
+      selector: 'td[scope], th[scope]',
+      enabled: true,
+      tags: [ 'cat.tables', 'best-practice' ],
+      all: [ 'html5-scope', 'scope-value' ],
+      any: [],
+      none: []
+    }, {
+      id: 'server-side-image-map',
+      selector: 'img[ismap]',
+      tags: [ 'cat.text-alternatives', 'wcag2a', 'wcag211', 'section508', 'section508.22.f' ],
+      all: [],
+      any: [],
+      none: [ 'exists' ]
+    }, {
+      id: 'skip-link',
+      selector: 'a[href]',
+      pageLevel: true,
+      enabled: false,
+      tags: [ 'cat.keyboard', 'best-practice' ],
+      all: [],
+      any: [ 'skip-link' ],
+      none: []
+    }, {
+      id: 'tabindex',
+      selector: '[tabindex]',
+      tags: [ 'cat.keyboard', 'best-practice' ],
+      all: [],
+      any: [ 'tabindex' ],
+      none: []
+    }, {
+      id: 'table-duplicate-name',
+      selector: 'table',
+      tags: [ 'cat.tables', 'best-practice' ],
+      all: [],
+      any: [],
+      none: [ 'same-caption-summary' ]
+    }, {
+      id: 'table-fake-caption',
+      selector: 'table',
+      matches: function matches(node) {
+        return axe.commons.table.isDataTable(node);
+      },
+      tags: [ 'cat.tables', 'experimental', 'wcag2a', 'wcag131', 'section508', 'section508.22.g' ],
+      all: [ 'caption-faked' ],
+      any: [],
+      none: []
+    }, {
+      id: 'td-has-header',
+      selector: 'table',
+      matches: function matches(node) {
+        if (axe.commons.table.isDataTable(node)) {
+          var tableArray = axe.commons.table.toArray(node);
+          return tableArray.length >= 3 && tableArray[0].length >= 3 && tableArray[1].length >= 3 && tableArray[2].length >= 3;
+        }
+        return false;
+      },
+      tags: [ 'cat.tables', 'experimental', 'wcag2a', 'wcag131', 'section508', 'section508.22.g' ],
+      all: [ 'td-has-header' ],
+      any: [],
+      none: []
+    }, {
+      id: 'td-headers-attr',
+      selector: 'table',
+      tags: [ 'cat.tables', 'wcag2a', 'wcag131', 'section508', 'section508.22.g' ],
+      all: [ 'td-headers-attr' ],
+      any: [],
+      none: []
+    }, {
+      id: 'th-has-data-cells',
+      selector: 'table',
+      matches: function matches(node) {
+        return axe.commons.table.isDataTable(node);
+      },
+      tags: [ 'cat.tables', 'wcag2a', 'wcag131', 'section508', 'section508.22.g' ],
+      all: [ 'th-has-data-cells' ],
+      any: [],
+      none: []
+    }, {
+      id: 'valid-lang',
+      selector: '[lang], [xml\\:lang]',
+      matches: function matches(node) {
+        return node.nodeName.toLowerCase() !== 'html';
+      },
+      tags: [ 'cat.language', 'wcag2aa', 'wcag312' ],
+      all: [],
+      any: [],
+      none: [ 'valid-lang' ]
+    }, {
+      id: 'video-caption',
+      selector: 'video',
+      excludeHidden: false,
+      tags: [ 'cat.text-alternatives', 'wcag2a', 'wcag122', 'wcag123', 'section508', 'section508.22.a' ],
+      all: [],
+      any: [],
+      none: [ 'caption' ]
+    }, {
+      id: 'video-description',
+      selector: 'video',
+      excludeHidden: false,
+      tags: [ 'cat.text-alternatives', 'wcag2aa', 'wcag125', 'section508', 'section508.22.b' ],
+      all: [],
+      any: [],
+      none: [ 'description' ]
+    } ],
+    checks: [ {
+      id: 'abstractrole',
+      evaluate: function evaluate(node, options) {
+        return axe.commons.aria.getRoleType(node.getAttribute('role')) === 'abstract';
+      }
+    }, {
+      id: 'aria-allowed-attr',
+      evaluate: function evaluate(node, options) {
+        var invalid = [];
+        var attr, attrName, allowed, role = node.getAttribute('role'), attrs = node.attributes;
+        if (!role) {
+          role = axe.commons.aria.implicitRole(node);
+        }
+        allowed = axe.commons.aria.allowedAttr(role);
+        if (role && allowed) {
+          for (var i = 0, l = attrs.length; i < l; i++) {
+            attr = attrs[i];
+            attrName = attr.name;
+            if (axe.commons.aria.validateAttr(attrName) && allowed.indexOf(attrName) === -1) {
+              invalid.push(attrName + '="' + attr.nodeValue + '"');
+            }
+          }
+        }
+        if (invalid.length) {
+          this.data(invalid);
+          return false;
+        }
+        return true;
+      }
+    }, {
+      id: 'aria-hidden-body',
+      evaluate: function evaluate(node, options) {
+        return node.getAttribute('aria-hidden') !== 'true';
+      }
+    }, {
+      id: 'invalidrole',
+      evaluate: function evaluate(node, options) {
+        return !axe.commons.aria.isValidRole(node.getAttribute('role'));
+      }
+    }, {
+      id: 'aria-required-attr',
+      evaluate: function evaluate(node, options) {
+        var missing = [];
+        if (node.hasAttributes()) {
+          var attr, role = node.getAttribute('role'), required = axe.commons.aria.requiredAttr(role);
+          if (role && required) {
+            for (var i = 0, l = required.length; i < l; i++) {
+              attr = required[i];
+              if (!node.getAttribute(attr)) {
+                missing.push(attr);
+              }
+            }
+          }
+        }
+        if (missing.length) {
+          this.data(missing);
+          return false;
+        }
+        return true;
+      }
+    }, {
+      id: 'aria-required-children',
+      evaluate: function evaluate(node, options) {
+        var requiredOwned = axe.commons.aria.requiredOwned, implicitNodes = axe.commons.aria.implicitNodes, matchesSelector = axe.commons.utils.matchesSelector, idrefs = axe.commons.dom.idrefs;
+        function owns(node, role, ariaOwned) {
+          if (node === null) {
+            return false;
+          }
+          var implicit = implicitNodes(role), selector = [ '[role="' + role + '"]' ];
+          if (implicit) {
+            selector = selector.concat(implicit);
+          }
+          selector = selector.join(',');
+          return ariaOwned ? matchesSelector(node, selector) || !!node.querySelector(selector) : !!node.querySelector(selector);
+        }
+        function ariaOwns(nodes, role) {
+          var index, length;
+          for (index = 0, length = nodes.length; index < length; index++) {
+            if (nodes[index] === null) {
+              continue;
+            }
+            if (owns(nodes[index], role, true)) {
+              return true;
+            }
+          }
+          return false;
+        }
+        function missingRequiredChildren(node, childRoles, all) {
+          var i, l = childRoles.length, missing = [], ownedElements = idrefs(node, 'aria-owns');
+          for (i = 0; i < l; i++) {
+            var r = childRoles[i];
+            if (owns(node, r) || ariaOwns(ownedElements, r)) {
+              if (!all) {
+                return null;
+              }
+            } else {
+              if (all) {
+                missing.push(r);
+              }
+            }
+          }
+          if (missing.length) {
+            return missing;
+          }
+          if (!all && childRoles.length) {
+            return childRoles;
+          }
+          return null;
+        }
+        var role = node.getAttribute('role');
+        var required = requiredOwned(role);
+        if (!required) {
+          return true;
+        }
+        var all = false;
+        var childRoles = required.one;
+        if (!childRoles) {
+          var all = true;
+          childRoles = required.all;
+        }
+        var missing = missingRequiredChildren(node, childRoles, all);
+        if (!missing) {
+          return true;
+        }
+        this.data(missing);
+        return false;
+      }
+    }, {
+      id: 'aria-required-parent',
+      evaluate: function evaluate(node, options) {
+        function getSelector(role) {
+          var impliedNative = axe.commons.aria.implicitNodes(role) || [];
+          return impliedNative.concat('[role="' + role + '"]').join(',');
+        }
+        function getMissingContext(element, requiredContext, includeElement) {
+          var index, length, role = element.getAttribute('role'), missing = [];
+          if (!requiredContext) {
+            requiredContext = axe.commons.aria.requiredContext(role);
+          }
+          if (!requiredContext) {
+            return null;
+          }
+          for (index = 0, length = requiredContext.length; index < length; index++) {
+            if (includeElement && axe.utils.matchesSelector(element, getSelector(requiredContext[index]))) {
+              return null;
+            }
+            if (axe.commons.dom.findUp(element, getSelector(requiredContext[index]))) {
+              return null;
+            } else {
+              missing.push(requiredContext[index]);
+            }
+          }
+          return missing;
+        }
+        function getAriaOwners(element) {
+          var owners = [], o = null;
+          while (element) {
+            if (element.id) {
+              o = document.querySelector('[aria-owns~=' + axe.commons.utils.escapeSelector(element.id) + ']');
+              if (o) {
+                owners.push(o);
+              }
+            }
+            element = element.parentNode;
+          }
+          return owners.length ? owners : null;
+        }
+        var missingParents = getMissingContext(node);
+        if (!missingParents) {
+          return true;
+        }
+        var owners = getAriaOwners(node);
+        if (owners) {
+          for (var i = 0, l = owners.length; i < l; i++) {
+            missingParents = getMissingContext(owners[i], missingParents, true);
+            if (!missingParents) {
+              return true;
+            }
+          }
+        }
+        this.data(missingParents);
+        return false;
+      }
+    }, {
+      id: 'aria-valid-attr-value',
+      evaluate: function evaluate(node, options) {
+        options = Array.isArray(options) ? options : [];
+        var invalid = [], aria = /^aria-/;
+        var attr, attrName, attrs = node.attributes;
+        for (var i = 0, l = attrs.length; i < l; i++) {
+          attr = attrs[i];
+          attrName = attr.name;
+          if (options.indexOf(attrName) === -1 && aria.test(attrName) && !axe.commons.aria.validateAttrValue(node, attrName)) {
+            invalid.push(attrName + '="' + attr.nodeValue + '"');
+          }
+        }
+        if (invalid.length) {
+          this.data(invalid);
+          return false;
+        }
+        return true;
+      },
+      options: []
+    }, {
+      id: 'aria-valid-attr',
+      evaluate: function evaluate(node, options) {
+        options = Array.isArray(options) ? options : [];
+        var invalid = [], aria = /^aria-/;
+        var attr, attrs = node.attributes;
+        for (var i = 0, l = attrs.length; i < l; i++) {
+          attr = attrs[i].name;
+          if (options.indexOf(attr) === -1 && aria.test(attr) && !axe.commons.aria.validateAttr(attr)) {
+            invalid.push(attr);
+          }
+        }
+        if (invalid.length) {
+          this.data(invalid);
+          return false;
+        }
+        return true;
+      },
+      options: []
+    }, {
+      id: 'color-contrast',
+      evaluate: function evaluate(node, options) {
+        if (!axe.commons.dom.isVisible(node, false)) {
+          return true;
+        }
+        var noScroll = !!(options || {}).noScroll;
+        var bgNodes = [], bgColor = axe.commons.color.getBackgroundColor(node, bgNodes, noScroll), fgColor = axe.commons.color.getForegroundColor(node, noScroll);
+        var nodeStyle = window.getComputedStyle(node);
+        var fontSize = parseFloat(nodeStyle.getPropertyValue('font-size'));
+        var fontWeight = nodeStyle.getPropertyValue('font-weight');
+        var bold = [ 'bold', 'bolder', '600', '700', '800', '900' ].indexOf(fontWeight) !== -1;
+        var cr = axe.commons.color.hasValidContrastRatio(bgColor, fgColor, fontSize, bold);
+        var truncatedResult = Math.floor(cr.contrastRatio * 100) / 100;
+        var missing;
+        if (bgColor === null) {
+          missing = axe.commons.color.incompleteData.get('bgColor');
+        }
+        var equalRatio = false;
+        if (truncatedResult === 1) {
+          equalRatio = true;
+          missing = axe.commons.color.incompleteData.set('bgColor', 'equalRatio');
+        }
+        var data = {
+          fgColor: fgColor ? fgColor.toHexString() : undefined,
+          bgColor: bgColor ? bgColor.toHexString() : undefined,
+          contrastRatio: cr ? truncatedResult : undefined,
+          fontSize: (fontSize * 72 / 96).toFixed(1) + 'pt',
+          fontWeight: bold ? 'bold' : 'normal',
+          missingData: missing
+        };
+        this.data(data);
+        if (!cr.isValid || equalRatio) {
+          this.relatedNodes(bgNodes);
+        }
+        if (fgColor === null || bgColor === null || equalRatio) {
+          missing = null;
+          axe.commons.color.incompleteData.clear();
+          return undefined;
+        }
+        return cr.isValid;
+      }
+    }, {
+      id: 'link-in-text-block',
+      evaluate: function evaluate(node, options) {
+        var color = axe.commons.color;
+        function getContrast(color1, color2) {
+          var c1lum = color1.getRelativeLuminance();
+          var c2lum = color2.getRelativeLuminance();
+          return (Math.max(c1lum, c2lum) + .05) / (Math.min(c1lum, c2lum) + .05);
+        }
+        var blockLike = [ 'block', 'list-item', 'table', 'flex', 'grid', 'inline-block' ];
+        function isBlock(elm) {
+          var display = window.getComputedStyle(elm).getPropertyValue('display');
+          return blockLike.indexOf(display) !== -1 || display.substr(0, 6) === 'table-';
+        }
+        if (isBlock(node)) {
+          return false;
+        }
+        var parentBlock = node.parentNode;
+        while (parentBlock.nodeType === 1 && !isBlock(parentBlock)) {
+          parentBlock = parentBlock.parentNode;
+        }
+        if (color.elementIsDistinct(node, parentBlock)) {
+          return true;
+        } else {
+          var nodeColor, parentColor;
+          nodeColor = color.getForegroundColor(node);
+          parentColor = color.getForegroundColor(parentBlock);
+          if (!nodeColor || !parentColor) {
+            return undefined;
+          }
+          var contrast = getContrast(nodeColor, parentColor);
+          if (contrast === 1) {
+            return true;
+          } else if (contrast >= 3) {
+            axe.commons.color.incompleteData.set('fgColor', 'bgContrast');
+            this.data({
+              missingData: axe.commons.color.incompleteData.get('fgColor')
+            });
+            axe.commons.color.incompleteData.clear();
+            return undefined;
+          }
+          nodeColor = color.getBackgroundColor(node);
+          parentColor = color.getBackgroundColor(parentBlock);
+          if (!nodeColor || !parentColor || getContrast(nodeColor, parentColor) >= 3) {
+            var reason = void 0;
+            if (!nodeColor || !parentColor) {
+              reason = axe.commons.color.incompleteData.get('bgColor');
+            } else {
+              reason = 'bgContrast';
+            }
+            axe.commons.color.incompleteData.set('fgColor', reason);
+            this.data({
+              missingData: axe.commons.color.incompleteData.get('fgColor')
+            });
+            axe.commons.color.incompleteData.clear();
+            return undefined;
+          }
+        }
+        return false;
+      }
+    }, {
+      id: 'fieldset',
+      evaluate: function evaluate(node, options) {
+        var failureCode, self = this;
+        function getUnrelatedElements(parent, name) {
+          return axe.commons.utils.toArray(parent.querySelectorAll('select,textarea,button,input:not([name="' + name + '"]):not([type="hidden"])'));
+        }
+        function checkFieldset(group, name) {
+          var firstNode = group.firstElementChild;
+          if (!firstNode || firstNode.nodeName.toUpperCase() !== 'LEGEND') {
+            self.relatedNodes([ group ]);
+            failureCode = 'no-legend';
+            return false;
+          }
+          if (!axe.commons.text.accessibleText(firstNode)) {
+            self.relatedNodes([ firstNode ]);
+            failureCode = 'empty-legend';
+            return false;
+          }
+          var otherElements = getUnrelatedElements(group, name);
+          if (otherElements.length) {
+            self.relatedNodes(otherElements);
+            failureCode = 'mixed-inputs';
+            return false;
+          }
+          return true;
+        }
+        function checkARIAGroup(group, name) {
+          var hasLabelledByText = axe.commons.dom.idrefs(group, 'aria-labelledby').some(function(element) {
+            return element && axe.commons.text.accessibleText(element);
+          });
+          var ariaLabel = group.getAttribute('aria-label');
+          if (!hasLabelledByText && !(ariaLabel && axe.commons.text.sanitize(ariaLabel))) {
+            self.relatedNodes(group);
+            failureCode = 'no-group-label';
+            return false;
+          }
+          var otherElements = getUnrelatedElements(group, name);
+          if (otherElements.length) {
+            self.relatedNodes(otherElements);
+            failureCode = 'group-mixed-inputs';
+            return false;
+          }
+          return true;
+        }
+        function spliceCurrentNode(nodes, current) {
+          return axe.commons.utils.toArray(nodes).filter(function(candidate) {
+            return candidate !== current;
+          });
+        }
+        function runCheck(element) {
+          var name = axe.commons.utils.escapeSelector(node.name);
+          var matchingNodes = document.querySelectorAll('input[type="' + axe.commons.utils.escapeSelector(node.type) + '"][name="' + name + '"]');
+          if (matchingNodes.length < 2) {
+            return true;
+          }
+          var fieldset = axe.commons.dom.findUp(element, 'fieldset');
+          var group = axe.commons.dom.findUp(element, '[role="group"]' + (node.type === 'radio' ? ',[role="radiogroup"]' : ''));
+          if (!group && !fieldset) {
+            failureCode = 'no-group';
+            self.relatedNodes(spliceCurrentNode(matchingNodes, element));
+            return false;
+          }
+          return fieldset ? checkFieldset(fieldset, name) : checkARIAGroup(group, name);
+        }
+        var data = {
+          name: node.getAttribute('name'),
+          type: node.getAttribute('type')
+        };
+        var result = runCheck(node);
+        if (!result) {
+          data.failureCode = failureCode;
+        }
+        this.data(data);
+        return result;
+      },
+      after: function after(results, options) {
+        var seen = {};
+        return results.filter(function(result) {
+          if (result.result) {
+            return true;
+          }
+          var data = result.data;
+          if (data) {
+            seen[data.type] = seen[data.type] || {};
+            if (!seen[data.type][data.name]) {
+              seen[data.type][data.name] = [ data ];
+              return true;
+            }
+            var hasBeenSeen = seen[data.type][data.name].some(function(candidate) {
+              return candidate.failureCode === data.failureCode;
+            });
+            if (!hasBeenSeen) {
+              seen[data.type][data.name].push(data);
+            }
+            return !hasBeenSeen;
+          }
+          return false;
+        });
+      }
+    }, {
+      id: 'group-labelledby',
+      evaluate: function evaluate(node, options) {
+        this.data({
+          name: node.getAttribute('name'),
+          type: node.getAttribute('type')
+        });
+        var matchingNodes = document.querySelectorAll('input[type="' + axe.commons.utils.escapeSelector(node.type) + '"][name="' + axe.commons.utils.escapeSelector(node.name) + '"]');
+        if (matchingNodes.length <= 1) {
+          return true;
+        }
+        return [].map.call(matchingNodes, function(m) {
+          var l = m.getAttribute('aria-labelledby');
+          return l ? l.split(/\s+/) : [];
+        }).reduce(function(prev, curr) {
+          return prev.filter(function(n) {
+            return curr.indexOf(n) !== -1;
+          });
+        }).filter(function(n) {
+          var labelNode = document.getElementById(n);
+          return labelNode && axe.commons.text.accessibleText(labelNode);
+        }).length !== 0;
+      },
+      after: function after(results, options) {
+        var seen = {};
+        return results.filter(function(result) {
+          var data = result.data;
+          if (data) {
+            seen[data.type] = seen[data.type] || {};
+            if (!seen[data.type][data.name]) {
+              seen[data.type][data.name] = true;
+              return true;
+            }
+          }
+          return false;
+        });
+      }
+    }, {
+      id: 'accesskeys',
+      evaluate: function evaluate(node, options) {
+        if (axe.commons.dom.isVisible(node, false)) {
+          this.data(node.getAttribute('accesskey'));
+          this.relatedNodes([ node ]);
+        }
+        return true;
+      },
+      after: function after(results, options) {
+        var seen = {};
+        return results.filter(function(r) {
+          if (!r.data) {
+            return false;
+          }
+          var key = r.data.toUpperCase();
+          if (!seen[key]) {
+            seen[key] = r;
+            r.relatedNodes = [];
+            return true;
+          }
+          seen[key].relatedNodes.push(r.relatedNodes[0]);
+          return false;
+        }).map(function(r) {
+          r.result = !!r.relatedNodes.length;
+          return r;
+        });
+      }
+    }, {
+      id: 'focusable-no-name',
+      evaluate: function evaluate(node, options) {
+        var tabIndex = node.getAttribute('tabindex'), isFocusable = axe.commons.dom.isFocusable(node) && tabIndex > -1;
+        if (!isFocusable) {
+          return false;
+        }
+        return !axe.commons.text.accessibleText(node);
+      }
+    }, {
+      id: 'tabindex',
+      evaluate: function evaluate(node, options) {
+        return node.tabIndex <= 0;
+      }
+    }, {
+      id: 'duplicate-img-label',
+      evaluate: function evaluate(node, options) {
+        var imgs = node.querySelectorAll('img');
+        var text = axe.commons.text.visible(node, true).toLowerCase();
+        if (text === '') {
+          return false;
+        }
+        for (var i = 0, len = imgs.length; i < len; i++) {
+          var img = imgs[i];
+          var imgAlt = axe.commons.text.accessibleText(img).toLowerCase();
+          if (imgAlt === text && img.getAttribute('role') !== 'presentation' && axe.commons.dom.isVisible(img)) {
+            return true;
+          }
+        }
+        return false;
+      }
+    }, {
+      id: 'explicit-label',
+      evaluate: function evaluate(node, options) {
+        if (node.id) {
+          var label = document.querySelector('label[for="' + axe.commons.utils.escapeSelector(node.id) + '"]');
+          if (label) {
+            return !!axe.commons.text.accessibleText(label);
+          }
+        }
+        return false;
+      }
+    }, {
+      id: 'help-same-as-label',
+      evaluate: function evaluate(node, options) {
+        var labelText = axe.commons.text.label(node), check = node.getAttribute('title');
+        if (!labelText) {
+          return false;
+        }
+        if (!check) {
+          check = '';
+          if (node.getAttribute('aria-describedby')) {
+            var ref = axe.commons.dom.idrefs(node, 'aria-describedby');
+            check = ref.map(function(thing) {
+              return thing ? axe.commons.text.accessibleText(thing) : '';
+            }).join('');
+          }
+        }
+        return axe.commons.text.sanitize(check) === axe.commons.text.sanitize(labelText);
+      },
+      enabled: false
+    }, {
+      id: 'implicit-label',
+      evaluate: function evaluate(node, options) {
+        var label = axe.commons.dom.findUp(node, 'label');
+        if (label) {
+          return !!axe.commons.text.accessibleText(label);
+        }
+        return false;
+      }
+    }, {
+      id: 'multiple-label',
+      evaluate: function evaluate(node, options) {
+        var labels = [].slice.call(document.querySelectorAll('label[for="' + axe.commons.utils.escapeSelector(node.id) + '"]')), parent = node.parentNode;
+        if (labels.length) {
+          labels = labels.filter(function(label, index) {
+            if (index === 0 && !axe.commons.dom.isVisible(label, true) || axe.commons.dom.isVisible(label, true)) {
+              return label;
+            }
+          });
+        }
+        while (parent) {
+          if (parent.tagName === 'LABEL' && labels.indexOf(parent) === -1) {
+            labels.push(parent);
+          }
+          parent = parent.parentNode;
+        }
+        this.relatedNodes(labels);
+        return labels.length > 1;
+      }
+    }, {
+      id: 'title-only',
+      evaluate: function evaluate(node, options) {
+        var labelText = axe.commons.text.label(node);
+        return !labelText && !!(node.getAttribute('title') || node.getAttribute('aria-describedby'));
+      }
+    }, {
+      id: 'has-lang',
+      evaluate: function evaluate(node, options) {
+        return !!(node.getAttribute('lang') || node.getAttribute('xml:lang') || '').trim();
+      }
+    }, {
+      id: 'valid-lang',
+      evaluate: function evaluate(node, options) {
+        function getBaseLang(lang) {
+          return lang.trim().split('-')[0].toLowerCase();
+        }
+        var langs, invalid;
+        langs = (options ? options : axe.commons.utils.validLangs()).map(getBaseLang);
+        invalid = [ 'lang', 'xml:lang' ].reduce(function(invalid, langAttr) {
+          var langVal = node.getAttribute(langAttr);
+          if (typeof langVal !== 'string') {
+            return invalid;
+          }
+          var baselangVal = getBaseLang(langVal);
+          if (baselangVal !== '' && langs.indexOf(baselangVal) === -1) {
+            invalid.push(langAttr + '="' + node.getAttribute(langAttr) + '"');
+          }
+          return invalid;
+        }, []);
+        if (invalid.length) {
+          this.data(invalid);
+          return true;
+        }
+        return false;
+      }
+    }, {
+      id: 'dlitem',
+      evaluate: function evaluate(node, options) {
+        return node.parentNode.tagName === 'DL';
+      }
+    }, {
+      id: 'has-listitem',
+      evaluate: function evaluate(node, options) {
+        var children = node.children;
+        if (children.length === 0) {
+          return true;
+        }
+        for (var i = 0; i < children.length; i++) {
+          if (children[i].nodeName.toUpperCase() === 'LI') {
+            return false;
+          }
+        }
+        return true;
+      }
+    }, {
+      id: 'listitem',
+      evaluate: function evaluate(node, options) {
+        if ([ 'UL', 'OL' ].indexOf(node.parentNode.nodeName.toUpperCase()) !== -1) {
+          return true;
+        }
+        return node.parentNode.getAttribute('role') === 'list';
+      }
+    }, {
+      id: 'only-dlitems',
+      evaluate: function evaluate(node, options) {
+        var child, nodeName, bad = [], children = node.childNodes, permitted = [ 'STYLE', 'META', 'LINK', 'MAP', 'AREA', 'SCRIPT', 'DATALIST', 'TEMPLATE' ], hasNonEmptyTextNode = false;
+        for (var i = 0; i < children.length; i++) {
+          child = children[i];
+          var nodeName = child.nodeName.toUpperCase();
+          if (child.nodeType === 1 && nodeName !== 'DT' && nodeName !== 'DD' && permitted.indexOf(nodeName) === -1) {
+            bad.push(child);
+          } else if (child.nodeType === 3 && child.nodeValue.trim() !== '') {
+            hasNonEmptyTextNode = true;
+          }
+        }
+        if (bad.length) {
+          this.relatedNodes(bad);
+        }
+        var retVal = !!bad.length || hasNonEmptyTextNode;
+        return retVal;
+      }
+    }, {
+      id: 'only-listitems',
+      evaluate: function evaluate(node, options) {
+        var child, nodeName, bad = [], children = node.childNodes, permitted = [ 'STYLE', 'META', 'LINK', 'MAP', 'AREA', 'SCRIPT', 'DATALIST', 'TEMPLATE' ], hasNonEmptyTextNode = false;
+        for (var i = 0; i < children.length; i++) {
+          child = children[i];
+          nodeName = child.nodeName.toUpperCase();
+          if (child.nodeType === 1 && nodeName !== 'LI' && permitted.indexOf(nodeName) === -1) {
+            bad.push(child);
+          } else if (child.nodeType === 3 && child.nodeValue.trim() !== '') {
+            hasNonEmptyTextNode = true;
+          }
+        }
+        if (bad.length) {
+          this.relatedNodes(bad);
+        }
+        return !!bad.length || hasNonEmptyTextNode;
+      }
+    }, {
+      id: 'structured-dlitems',
+      evaluate: function evaluate(node, options) {
+        var children = node.children;
+        if (!children || !children.length) {
+          return false;
+        }
+        var hasDt = false, hasDd = false, nodeName;
+        for (var i = 0; i < children.length; i++) {
+          nodeName = children[i].nodeName.toUpperCase();
+          if (nodeName === 'DT') {
+            hasDt = true;
+          }
+          if (hasDt && nodeName === 'DD') {
+            return false;
+          }
+          if (nodeName === 'DD') {
+            hasDd = true;
+          }
+        }
+        return hasDt || hasDd;
+      }
+    }, {
+      id: 'caption',
+      evaluate: function evaluate(node, options) {
+        var tracks = node.querySelectorAll('track');
+        if (tracks.length) {
+          for (var i = 0; i < tracks.length; i++) {
+            var kind = tracks[i].getAttribute('kind');
+            if (kind && kind === 'captions') {
+              return false;
+            }
+          }
+          return true;
+        }
+        return undefined;
+      }
+    }, {
+      id: 'description',
+      evaluate: function evaluate(node, options) {
+        var tracks = node.querySelectorAll('track');
+        if (tracks.length) {
+          for (var i = 0; i < tracks.length; i++) {
+            var kind = tracks[i].getAttribute('kind');
+            if (kind && kind === 'descriptions') {
+              return false;
+            }
+          }
+          return true;
+        }
+        return undefined;
+      }
+    }, {
+      id: 'meta-viewport-large',
+      evaluate: function evaluate(node, options) {
+        options = options || {};
+        var params, content = node.getAttribute('content') || '', parsedParams = content.split(/[;,]/), result = {}, minimum = options.scaleMinimum || 2, lowerBound = options.lowerBound || false;
+        for (var i = 0, l = parsedParams.length; i < l; i++) {
+          params = parsedParams[i].split('=');
+          var key = params.shift().toLowerCase();
+          if (key && params.length) {
+            result[key.trim()] = params.shift().trim().toLowerCase();
+          }
+        }
+        if (lowerBound && result['maximum-scale'] && parseFloat(result['maximum-scale']) < lowerBound) {
+          return true;
+        }
+        if (!lowerBound && result['user-scalable'] === 'no') {
+          return false;
+        }
+        if (result['maximum-scale'] && parseFloat(result['maximum-scale']) < minimum) {
+          return false;
+        }
+        return true;
+      },
+      options: {
+        scaleMinimum: 5,
+        lowerBound: 2
+      }
+    }, {
+      id: 'meta-viewport',
+      evaluate: function evaluate(node, options) {
+        options = options || {};
+        var params, content = node.getAttribute('content') || '', parsedParams = content.split(/[;,]/), result = {}, minimum = options.scaleMinimum || 2, lowerBound = options.lowerBound || false;
+        for (var i = 0, l = parsedParams.length; i < l; i++) {
+          params = parsedParams[i].split('=');
+          var key = params.shift().toLowerCase();
+          if (key && params.length) {
+            result[key.trim()] = params.shift().trim().toLowerCase();
+          }
+        }
+        if (lowerBound && result['maximum-scale'] && parseFloat(result['maximum-scale']) < lowerBound) {
+          return true;
+        }
+        if (!lowerBound && result['user-scalable'] === 'no') {
+          return false;
+        }
+        if (result['maximum-scale'] && parseFloat(result['maximum-scale']) < minimum) {
+          return false;
+        }
+        return true;
+      },
+      options: {
+        scaleMinimum: 2
+      }
+    }, {
+      id: 'header-present',
+      evaluate: function evaluate(node, options) {
+        return !!node.querySelector('h1, h2, h3, h4, h5, h6, [role="heading"]');
+      }
+    }, {
+      id: 'heading-order',
+      evaluate: function evaluate(node, options) {
+        var ariaHeadingLevel = node.getAttribute('aria-level');
+        if (ariaHeadingLevel !== null) {
+          this.data(parseInt(ariaHeadingLevel, 10));
+          return true;
+        }
+        var headingLevel = node.tagName.match(/H(\d)/);
+        if (headingLevel) {
+          this.data(parseInt(headingLevel[1], 10));
+          return true;
+        }
+        return true;
+      },
+      after: function after(results, options) {
+        if (results.length < 2) {
+          return results;
+        }
+        var prevLevel = results[0].data;
+        for (var i = 1; i < results.length; i++) {
+          if (results[i].result && results[i].data > prevLevel + 1) {
+            results[i].result = false;
+          }
+          prevLevel = results[i].data;
+        }
+        return results;
+      }
+    }, {
+      id: 'href-no-hash',
+      evaluate: function evaluate(node, options) {
+        var href = node.getAttribute('href');
+        if (href === '#') {
+          return false;
+        }
+        return true;
+      }
+    }, {
+      id: 'internal-link-present',
+      evaluate: function evaluate(node, options) {
+        return !!node.querySelector('a[href^="#"]');
+      }
+    }, {
+      id: 'landmark',
+      evaluate: function evaluate(node, options) {
+        return node.getElementsByTagName('main').length > 0 || !!node.querySelector('[role="main"]');
+      }
+    }, {
+      id: 'meta-refresh',
+      evaluate: function evaluate(node, options) {
+        var content = node.getAttribute('content') || '', parsedParams = content.split(/[;,]/);
+        return content === '' || parsedParams[0] === '0';
+      }
+    }, {
+      id: 'p-as-heading',
+      evaluate: function evaluate(node, options) {
+        var siblings = Array.from(node.parentNode.children);
+        var currentIndex = siblings.indexOf(node);
+        options = options || {};
+        var margins = options.margins || [];
+        var nextSibling = siblings.slice(currentIndex + 1).find(function(elm) {
+          return elm.nodeName.toUpperCase() === 'P';
+        });
+        var prevSibling = siblings.slice(0, currentIndex).reverse().find(function(elm) {
+          return elm.nodeName.toUpperCase() === 'P';
+        });
+        function getTextContainer(elm) {
+          var nextNode = elm;
+          var outerText = elm.textContent.trim();
+          var innerText = outerText;
+          while (innerText === outerText && nextNode !== undefined) {
+            var i = -1;
+            elm = nextNode;
+            if (elm.children.length === 0) {
+              return elm;
+            }
+            do {
+              i++;
+              innerText = elm.children[i].textContent.trim();
+            } while (innerText === '' && i + 1 < elm.children.length);
+            nextNode = elm.children[i];
+          }
+          return elm;
+        }
+        function normalizeFontWeight(weight) {
+          switch (weight) {
+           case 'lighter':
+            return 100;
+
+           case 'normal':
+            return 400;
+
+           case 'bold':
+            return 700;
+
+           case 'bolder':
+            return 900;
+          }
+          weight = parseInt(weight);
+          return !isNaN(weight) ? weight : 400;
+        }
+        function getStyleValues(node) {
+          var style = window.getComputedStyle(getTextContainer(node));
+          return {
+            fontWeight: normalizeFontWeight(style.getPropertyValue('font-weight')),
+            fontSize: parseInt(style.getPropertyValue('font-size')),
+            isItalic: style.getPropertyValue('font-style') === 'italic'
+          };
+        }
+        function isHeaderStyle(styleA, styleB, margins) {
+          return margins.reduce(function(out, margin) {
+            return out || (!margin.size || styleA.fontSize / margin.size > styleB.fontSize) && (!margin.weight || styleA.fontWeight - margin.weight > styleB.fontWeight) && (!margin.italic || styleA.isItalic && !styleB.isItalic);
+          }, false);
+        }
+        var currStyle = getStyleValues(node);
+        var nextStyle = nextSibling ? getStyleValues(nextSibling) : null;
+        var prevStyle = prevSibling ? getStyleValues(prevSibling) : null;
+        if (!nextStyle || !isHeaderStyle(currStyle, nextStyle, margins)) {
+          return true;
+        }
+        var blockquote = axe.commons.dom.findUp(node, 'blockquote');
+        if (blockquote && blockquote.nodeName.toUpperCase() === 'BLOCKQUOTE') {
+          return undefined;
+        }
+        if (prevStyle && !isHeaderStyle(currStyle, prevStyle, margins)) {
+          return undefined;
+        }
+        return false;
+      },
+      options: {
+        margins: [ {
+          weight: 150,
+          italic: true
+        }, {
+          weight: 150,
+          size: 1.15
+        }, {
+          italic: true,
+          size: 1.15
+        }, {
+          size: 1.4
+        } ]
+      }
+    }, {
+      id: 'region',
+      evaluate: function evaluate(node, options) {
+        var landmarkRoles = axe.commons.aria.getRolesByType('landmark'), firstLink = node.querySelector('a[href]');
+        function isSkipLink(n) {
+          return firstLink && axe.commons.dom.isFocusable(axe.commons.dom.getElementByReference(firstLink, 'href')) && firstLink === n;
+        }
+        function isLandmark(n) {
+          var role = n.getAttribute('role');
+          return role && landmarkRoles.indexOf(role) !== -1;
+        }
+        function checkRegion(n) {
+          if (isLandmark(n)) {
+            return null;
+          }
+          if (isSkipLink(n)) {
+            return getViolatingChildren(n);
+          }
+          if (axe.commons.dom.isVisible(n, true) && (axe.commons.text.visible(n, true, true) || axe.commons.dom.isVisualContent(n))) {
+            return n;
+          }
+          return getViolatingChildren(n);
+        }
+        function getViolatingChildren(n) {
+          var children = axe.commons.utils.toArray(n.children);
+          if (children.length === 0) {
+            return [];
+          }
+          return children.map(checkRegion).filter(function(c) {
+            return c !== null;
+          }).reduce(function(a, b) {
+            return a.concat(b);
+          }, []);
+        }
+        var v = getViolatingChildren(node);
+        this.relatedNodes(v);
+        return !v.length;
+      },
+      after: function after(results, options) {
+        return [ results[0] ];
+      }
+    }, {
+      id: 'skip-link',
+      evaluate: function evaluate(node, options) {
+        return axe.commons.dom.isFocusable(axe.commons.dom.getElementByReference(node, 'href'));
+      },
+      after: function after(results, options) {
+        return [ results[0] ];
+      }
+    }, {
+      id: 'unique-frame-title',
+      evaluate: function evaluate(node, options) {
+        var title = axe.commons.text.sanitize(node.title).trim().toLowerCase();
+        this.data(title);
+        return true;
+      },
+      after: function after(results, options) {
+        var titles = {};
+        results.forEach(function(r) {
+          titles[r.data] = titles[r.data] !== undefined ? ++titles[r.data] : 0;
+        });
+        results.forEach(function(r) {
+          r.result = !!titles[r.data];
+        });
+        return results;
+      }
+    }, {
+      id: 'aria-label',
+      evaluate: function evaluate(node, options) {
+        var label = node.getAttribute('aria-label');
+        return !!(label ? axe.commons.text.sanitize(label).trim() : '');
+      }
+    }, {
+      id: 'aria-labelledby',
+      evaluate: function evaluate(node, options) {
+        var getIdRefs = axe.commons.dom.idrefs;
+        return getIdRefs(node, 'aria-labelledby').some(function(elm) {
+          return elm && axe.commons.text.accessibleText(elm, true);
+        });
+      }
+    }, {
+      id: 'button-has-visible-text',
+      evaluate: function evaluate(node, options) {
+        var nodeName = node.nodeName.toUpperCase();
+        var role = node.getAttribute('role');
+        var label = void 0;
+        if (nodeName === 'BUTTON' || role === 'button' && nodeName !== 'INPUT') {
+          label = axe.commons.text.accessibleText(node);
+          this.data(label);
+          return !!label;
+        } else {
+          return false;
+        }
+      }
+    }, {
+      id: 'doc-has-title',
+      evaluate: function evaluate(node, options) {
+        var title = document.title;
+        return !!(title ? axe.commons.text.sanitize(title).trim() : '');
+      }
+    }, {
+      id: 'duplicate-id',
+      evaluate: function evaluate(node, options) {
+        if (!node.id.trim()) {
+          return true;
+        }
+        var matchingNodes = document.querySelectorAll('[id="' + axe.commons.utils.escapeSelector(node.id) + '"]');
+        var related = [];
+        for (var i = 0; i < matchingNodes.length; i++) {
+          if (matchingNodes[i] !== node) {
+            related.push(matchingNodes[i]);
+          }
+        }
+        if (related.length) {
+          this.relatedNodes(related);
+        }
+        this.data(node.getAttribute('id'));
+        return matchingNodes.length <= 1;
+      },
+      after: function after(results, options) {
+        var uniqueIds = [];
+        return results.filter(function(r) {
+          if (uniqueIds.indexOf(r.data) === -1) {
+            uniqueIds.push(r.data);
+            return true;
+          }
+          return false;
+        });
+      }
+    }, {
+      id: 'exists',
+      evaluate: function evaluate(node, options) {
+        return true;
+      }
+    }, {
+      id: 'has-alt',
+      evaluate: function evaluate(node, options) {
+        var nn = node.nodeName.toLowerCase();
+        return node.hasAttribute('alt') && (nn === 'img' || nn === 'input' || nn === 'area');
+      }
+    }, {
+      id: 'has-visible-text',
+      evaluate: function evaluate(node, options) {
+        return axe.commons.text.accessibleText(node).length > 0;
+      }
+    }, {
+      id: 'is-on-screen',
+      evaluate: function evaluate(node, options) {
+        return axe.commons.dom.isVisible(node, false) && !axe.commons.dom.isOffscreen(node);
+      }
+    }, {
+      id: 'non-empty-alt',
+      evaluate: function evaluate(node, options) {
+        var label = node.getAttribute('alt');
+        return !!(label ? axe.commons.text.sanitize(label).trim() : '');
+      }
+    }, {
+      id: 'non-empty-if-present',
+      evaluate: function evaluate(node, options) {
+        var nodeName = node.nodeName.toUpperCase();
+        var type = (node.getAttribute('type') || '').toLowerCase();
+        var label = node.getAttribute('value');
+        this.data(label);
+        if (nodeName === 'INPUT' && [ 'submit', 'reset' ].indexOf(type) !== -1) {
+          return label === null;
+        }
+        return false;
+      }
+    }, {
+      id: 'non-empty-title',
+      evaluate: function evaluate(node, options) {
+        var title = node.getAttribute('title');
+        return !!(title ? axe.commons.text.sanitize(title).trim() : '');
+      }
+    }, {
+      id: 'non-empty-value',
+      evaluate: function evaluate(node, options) {
+        var label = node.getAttribute('value');
+        return !!(label ? axe.commons.text.sanitize(label).trim() : '');
+      }
+    }, {
+      id: 'role-none',
+      evaluate: function evaluate(node, options) {
+        return node.getAttribute('role') === 'none';
+      }
+    }, {
+      id: 'role-presentation',
+      evaluate: function evaluate(node, options) {
+        return node.getAttribute('role') === 'presentation';
+      }
+    }, {
+      id: 'caption-faked',
+      evaluate: function evaluate(node, options) {
+        var table = axe.commons.table.toGrid(node);
+        var firstRow = table[0];
+        if (table.length <= 1 || firstRow.length <= 1 || node.rows.length <= 1) {
+          return true;
+        }
+        return firstRow.reduce(function(out, curr, i) {
+          return out || curr !== firstRow[i + 1] && firstRow[i + 1] !== undefined;
+        }, false);
+      }
+    }, {
+      id: 'has-caption',
+      evaluate: function evaluate(node, options) {
+        return !!node.caption;
+      }
+    }, {
+      id: 'has-summary',
+      evaluate: function evaluate(node, options) {
+        return !!node.summary;
+      }
+    }, {
+      id: 'has-th',
+      evaluate: function evaluate(node, options) {
+        var row, cell, badCells = [];
+        for (var rowIndex = 0, rowLength = node.rows.length; rowIndex < rowLength; rowIndex++) {
+          row = node.rows[rowIndex];
+          for (var cellIndex = 0, cellLength = row.cells.length; cellIndex < cellLength; cellIndex++) {
+            cell = row.cells[cellIndex];
+            if (cell.nodeName.toUpperCase() === 'TH' || [ 'rowheader', 'columnheader' ].indexOf(cell.getAttribute('role')) !== -1) {
+              badCells.push(cell);
+            }
+          }
+        }
+        if (badCells.length) {
+          this.relatedNodes(badCells);
+          return true;
+        }
+        return false;
+      }
+    }, {
+      id: 'html5-scope',
+      evaluate: function evaluate(node, options) {
+        if (!axe.commons.dom.isHTML5(document)) {
+          return true;
+        }
+        return node.nodeName.toUpperCase() === 'TH';
+      }
+    }, {
+      id: 'same-caption-summary',
+      evaluate: function evaluate(node, options) {
+        return !!(node.summary && node.caption) && node.summary === axe.commons.text.accessibleText(node.caption);
+      }
+    }, {
+      id: 'scope-value',
+      evaluate: function evaluate(node, options) {
+        options = options || {};
+        var value = node.getAttribute('scope').toLowerCase();
+        var validVals = [ 'row', 'col', 'rowgroup', 'colgroup' ] || options.values;
+        return validVals.indexOf(value) !== -1;
+      }
+    }, {
+      id: 'td-has-header',
+      evaluate: function evaluate(node, options) {
+        var tableUtils = axe.commons.table;
+        var badCells = [];
+        var cells = tableUtils.getAllCells(node);
+        cells.forEach(function(cell) {
+          if (axe.commons.dom.hasContent(cell) && tableUtils.isDataCell(cell) && !axe.commons.aria.label(cell)) {
+            var hasHeaders = tableUtils.getHeaders(cell);
+            hasHeaders = hasHeaders.reduce(function(hasHeaders, header) {
+              return hasHeaders || header !== null && !!axe.commons.dom.hasContent(header);
+            }, false);
+            if (!hasHeaders) {
+              badCells.push(cell);
+            }
+          }
+        });
+        if (badCells.length) {
+          this.relatedNodes(badCells);
+          return false;
+        }
+        return true;
+      }
+    }, {
+      id: 'td-headers-attr',
+      evaluate: function evaluate(node, options) {
+        var cells = [];
+        for (var rowIndex = 0, rowLength = node.rows.length; rowIndex < rowLength; rowIndex++) {
+          var row = node.rows[rowIndex];
+          for (var cellIndex = 0, cellLength = row.cells.length; cellIndex < cellLength; cellIndex++) {
+            cells.push(row.cells[cellIndex]);
+          }
+        }
+        var ids = cells.reduce(function(ids, cell) {
+          if (cell.id) {
+            ids.push(cell.id);
+          }
+          return ids;
+        }, []);
+        var badCells = cells.reduce(function(badCells, cell) {
+          var isSelf, notOfTable;
+          var headers = (cell.getAttribute('headers') || '').split(/\s/).reduce(function(headers, header) {
+            header = header.trim();
+            if (header) {
+              headers.push(header);
+            }
+            return headers;
+          }, []);
+          if (headers.length !== 0) {
+            if (cell.id) {
+              isSelf = headers.indexOf(cell.id.trim()) !== -1;
+            }
+            notOfTable = headers.reduce(function(fail, header) {
+              return fail || ids.indexOf(header) === -1;
+            }, false);
+            if (isSelf || notOfTable) {
+              badCells.push(cell);
+            }
+          }
+          return badCells;
+        }, []);
+        if (badCells.length > 0) {
+          this.relatedNodes(badCells);
+          return false;
+        } else {
+          return true;
+        }
+      }
+    }, {
+      id: 'th-has-data-cells',
+      evaluate: function evaluate(node, options) {
+        var tableUtils = axe.commons.table;
+        var cells = tableUtils.getAllCells(node);
+        var checkResult = this;
+        var reffedHeaders = [];
+        cells.forEach(function(cell) {
+          var headers = cell.getAttribute('headers');
+          if (headers) {
+            reffedHeaders = reffedHeaders.concat(headers.split(/\s+/));
+          }
+          var ariaLabel = cell.getAttribute('aria-labelledby');
+          if (ariaLabel) {
+            reffedHeaders = reffedHeaders.concat(ariaLabel.split(/\s+/));
+          }
+        });
+        var headers = cells.filter(function(cell) {
+          if (axe.commons.text.sanitize(cell.textContent) === '') {
+            return false;
+          }
+          return cell.nodeName.toUpperCase() === 'TH' || [ 'rowheader', 'columnheader' ].indexOf(cell.getAttribute('role')) !== -1;
+        });
+        var tableGrid = tableUtils.toGrid(node);
+        var out = headers.reduce(function(res, header) {
+          if (header.id && reffedHeaders.indexOf(header.id) !== -1) {
+            return !res ? res : true;
+          }
+          var hasCell = false;
+          var pos = tableUtils.getCellPosition(header, tableGrid);
+          if (tableUtils.isColumnHeader(header)) {
+            hasCell = tableUtils.traverse('down', pos, tableGrid).reduce(function(out, cell) {
+              return out || axe.commons.dom.hasContent(cell) && !tableUtils.isColumnHeader(cell);
+            }, false);
+          }
+          if (!hasCell && tableUtils.isRowHeader(header)) {
+            hasCell = tableUtils.traverse('right', pos, tableGrid).reduce(function(out, cell) {
+              return out || axe.commons.dom.hasContent(cell) && !tableUtils.isRowHeader(cell);
+            }, false);
+          }
+          if (!hasCell) {
+            checkResult.relatedNodes(header);
+          }
+          return res && hasCell;
+        }, true);
+        return out ? true : undefined;
+      }
+    }, {
+      id: 'hidden-content',
+      evaluate: function evaluate(node, options) {
+        var styles = window.getComputedStyle(node);
+        var whitelist = [ 'SCRIPT', 'HEAD', 'TITLE', 'NOSCRIPT', 'STYLE', 'TEMPLATE' ];
+        if (!whitelist.includes(node.tagName.toUpperCase()) && axe.commons.dom.hasContent(node)) {
+          if (styles.getPropertyValue('display') === 'none') {
+            return undefined;
+          } else if (styles.getPropertyValue('visibility') === 'hidden') {
+            if (node.parentNode) {
+              var parentStyle = window.getComputedStyle(node.parentNode);
+            }
+            if (!parentStyle || parentStyle.getPropertyValue('visibility') !== 'hidden') {
+              return undefined;
+            }
+          }
+        }
+        return true;
+      }
+    } ],
+    commons: function() {
+      var commons = {};
+      var aria = commons.aria = {}, lookupTables = aria._lut = {};
+      lookupTables.attributes = {
+        'aria-activedescendant': {
+          type: 'idref'
+        },
+        'aria-atomic': {
+          type: 'boolean',
+          values: [ 'true', 'false' ]
+        },
+        'aria-autocomplete': {
+          type: 'nmtoken',
+          values: [ 'inline', 'list', 'both', 'none' ]
+        },
+        'aria-busy': {
+          type: 'boolean',
+          values: [ 'true', 'false' ]
+        },
+        'aria-checked': {
+          type: 'nmtoken',
+          values: [ 'true', 'false', 'mixed', 'undefined' ]
+        },
+        'aria-colcount': {
+          type: 'int'
+        },
+        'aria-colindex': {
+          type: 'int'
+        },
+        'aria-colspan': {
+          type: 'int'
+        },
+        'aria-controls': {
+          type: 'idrefs'
+        },
+        'aria-current': {
+          type: 'nmtoken',
+          values: [ 'page', 'step', 'location', 'date', 'time', 'true', 'false' ]
+        },
+        'aria-describedby': {
+          type: 'idrefs'
+        },
+        'aria-disabled': {
+          type: 'boolean',
+          values: [ 'true', 'false' ]
+        },
+        'aria-dropeffect': {
+          type: 'nmtokens',
+          values: [ 'copy', 'move', 'reference', 'execute', 'popup', 'none' ]
+        },
+        'aria-expanded': {
+          type: 'nmtoken',
+          values: [ 'true', 'false', 'undefined' ]
+        },
+        'aria-flowto': {
+          type: 'idrefs'
+        },
+        'aria-grabbed': {
+          type: 'nmtoken',
+          values: [ 'true', 'false', 'undefined' ]
+        },
+        'aria-haspopup': {
+          type: 'boolean',
+          values: [ 'true', 'false' ]
+        },
+        'aria-hidden': {
+          type: 'boolean',
+          values: [ 'true', 'false' ]
+        },
+        'aria-invalid': {
+          type: 'nmtoken',
+          values: [ 'true', 'false', 'spelling', 'grammar' ]
+        },
+        'aria-label': {
+          type: 'string'
+        },
+        'aria-labelledby': {
+          type: 'idrefs'
+        },
+        'aria-level': {
+          type: 'int'
+        },
+        'aria-live': {
+          type: 'nmtoken',
+          values: [ 'off', 'polite', 'assertive' ]
+        },
+        'aria-multiline': {
+          type: 'boolean',
+          values: [ 'true', 'false' ]
+        },
+        'aria-multiselectable': {
+          type: 'boolean',
+          values: [ 'true', 'false' ]
+        },
+        'aria-orientation': {
+          type: 'nmtoken',
+          values: [ 'horizontal', 'vertical' ]
+        },
+        'aria-owns': {
+          type: 'idrefs'
+        },
+        'aria-posinset': {
+          type: 'int'
+        },
+        'aria-pressed': {
+          type: 'nmtoken',
+          values: [ 'true', 'false', 'mixed', 'undefined' ]
+        },
+        'aria-readonly': {
+          type: 'boolean',
+          values: [ 'true', 'false' ]
+        },
+        'aria-relevant': {
+          type: 'nmtokens',
+          values: [ 'additions', 'removals', 'text', 'all' ]
+        },
+        'aria-required': {
+          type: 'boolean',
+          values: [ 'true', 'false' ]
+        },
+        'aria-rowcount': {
+          type: 'int'
+        },
+        'aria-rowindex': {
+          type: 'int'
+        },
+        'aria-rowspan': {
+          type: 'int'
+        },
+        'aria-selected': {
+          type: 'nmtoken',
+          values: [ 'true', 'false', 'undefined' ]
+        },
+        'aria-setsize': {
+          type: 'int'
+        },
+        'aria-sort': {
+          type: 'nmtoken',
+          values: [ 'ascending', 'descending', 'other', 'none' ]
+        },
+        'aria-valuemax': {
+          type: 'decimal'
+        },
+        'aria-valuemin': {
+          type: 'decimal'
+        },
+        'aria-valuenow': {
+          type: 'decimal'
+        },
+        'aria-valuetext': {
+          type: 'string'
+        }
+      };
+      lookupTables.globalAttributes = [ 'aria-atomic', 'aria-busy', 'aria-controls', 'aria-current', 'aria-describedby', 'aria-disabled', 'aria-dropeffect', 'aria-flowto', 'aria-grabbed', 'aria-haspopup', 'aria-hidden', 'aria-invalid', 'aria-label', 'aria-labelledby', 'aria-live', 'aria-owns', 'aria-relevant' ];
+      lookupTables.role = {
+        alert: {
+          type: 'widget',
+          attributes: {
+            allowed: [ 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null
+        },
+        alertdialog: {
+          type: 'widget',
+          attributes: {
+            allowed: [ 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null
+        },
+        application: {
+          type: 'landmark',
+          attributes: {
+            allowed: [ 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null
+        },
+        article: {
+          type: 'structure',
+          attributes: {
+            allowed: [ 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null,
+          implicit: [ 'article' ]
+        },
+        banner: {
+          type: 'landmark',
+          attributes: {
+            allowed: [ 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null,
+          implicit: [ 'header' ]
+        },
+        button: {
+          type: 'widget',
+          attributes: {
+            allowed: [ 'aria-expanded', 'aria-pressed' ]
+          },
+          owned: null,
+          nameFrom: [ 'author', 'contents' ],
+          context: null,
+          implicit: [ 'button', 'input[type="button"]', 'input[type="image"]', 'input[type="reset"]', 'input[type="submit"]', 'summary' ]
+        },
+        cell: {
+          type: 'structure',
+          attributes: {
+            allowed: [ 'aria-colindex', 'aria-colspan', 'aria-rowindex', 'aria-rowspan' ]
+          },
+          owned: null,
+          nameFrom: [ 'author', 'contents' ],
+          context: [ 'row' ],
+          implicit: [ 'td', 'th' ]
+        },
+        checkbox: {
+          type: 'widget',
+          attributes: {
+            required: [ 'aria-checked' ]
+          },
+          owned: null,
+          nameFrom: [ 'author', 'contents' ],
+          context: null,
+          implicit: [ 'input[type="checkbox"]' ]
+        },
+        columnheader: {
+          type: 'structure',
+          attributes: {
+            allowed: [ 'aria-expanded', 'aria-sort', 'aria-readonly', 'aria-selected', 'aria-required' ]
+          },
+          owned: null,
+          nameFrom: [ 'author', 'contents' ],
+          context: [ 'row' ],
+          implicit: [ 'th' ]
+        },
+        combobox: {
+          type: 'composite',
+          attributes: {
+            required: [ 'aria-expanded' ],
+            allowed: [ 'aria-autocomplete', 'aria-required', 'aria-activedescendant' ]
+          },
+          owned: {
+            all: [ 'listbox', 'textbox' ]
+          },
+          nameFrom: [ 'author' ],
+          context: null
+        },
+        command: {
+          nameFrom: [ 'author' ],
+          type: 'abstract'
+        },
+        complementary: {
+          type: 'landmark',
+          attributes: {
+            allowed: [ 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null,
+          implicit: [ 'aside' ]
+        },
+        composite: {
+          nameFrom: [ 'author' ],
+          type: 'abstract'
+        },
+        contentinfo: {
+          type: 'landmark',
+          attributes: {
+            allowed: [ 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null,
+          implicit: [ 'footer' ]
+        },
+        definition: {
+          type: 'structure',
+          attributes: {
+            allowed: [ 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null,
+          implicit: [ 'dd' ]
+        },
+        dialog: {
+          type: 'widget',
+          attributes: {
+            allowed: [ 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null,
+          implicit: [ 'dialog' ]
+        },
+        directory: {
+          type: 'structure',
+          attributes: {
+            allowed: [ 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author', 'contents' ],
+          context: null
+        },
+        document: {
+          type: 'structure',
+          attributes: {
+            allowed: [ 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null,
+          implicit: [ 'body' ]
+        },
+        form: {
+          type: 'landmark',
+          attributes: {
+            allowed: [ 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null,
+          implicit: [ 'form' ]
+        },
+        grid: {
+          type: 'composite',
+          attributes: {
+            allowed: [ 'aria-level', 'aria-multiselectable', 'aria-readonly', 'aria-activedescendant', 'aria-expanded' ]
+          },
+          owned: {
+            one: [ 'rowgroup', 'row' ]
+          },
+          nameFrom: [ 'author' ],
+          context: null,
+          implicit: [ 'table' ]
+        },
+        gridcell: {
+          type: 'widget',
+          attributes: {
+            allowed: [ 'aria-selected', 'aria-readonly', 'aria-expanded', 'aria-required' ]
+          },
+          owned: null,
+          nameFrom: [ 'author', 'contents' ],
+          context: [ 'row' ],
+          implicit: [ 'td', 'th' ]
+        },
+        group: {
+          type: 'structure',
+          attributes: {
+            allowed: [ 'aria-activedescendant', 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null,
+          implicit: [ 'details', 'optgroup' ]
+        },
+        heading: {
+          type: 'structure',
+          attributes: {
+            allowed: [ 'aria-level', 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author', 'contents' ],
+          context: null,
+          implicit: [ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' ]
+        },
+        img: {
+          type: 'structure',
+          attributes: {
+            allowed: [ 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null,
+          implicit: [ 'img' ]
+        },
+        input: {
+          nameFrom: [ 'author' ],
+          type: 'abstract'
+        },
+        landmark: {
+          nameFrom: [ 'author' ],
+          type: 'abstract'
+        },
+        link: {
+          type: 'widget',
+          attributes: {
+            allowed: [ 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author', 'contents' ],
+          context: null,
+          implicit: [ 'a[href]' ]
+        },
+        list: {
+          type: 'structure',
+          attributes: {
+            allowed: [ 'aria-expanded' ]
+          },
+          owned: {
+            all: [ 'listitem' ]
+          },
+          nameFrom: [ 'author' ],
+          context: null,
+          implicit: [ 'ol', 'ul', 'dl' ]
+        },
+        listbox: {
+          type: 'composite',
+          attributes: {
+            allowed: [ 'aria-activedescendant', 'aria-multiselectable', 'aria-required', 'aria-expanded' ]
+          },
+          owned: {
+            all: [ 'option' ]
+          },
+          nameFrom: [ 'author' ],
+          context: null,
+          implicit: [ 'select' ]
+        },
+        listitem: {
+          type: 'structure',
+          attributes: {
+            allowed: [ 'aria-level', 'aria-posinset', 'aria-setsize', 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author', 'contents' ],
+          context: [ 'list' ],
+          implicit: [ 'li', 'dt' ]
+        },
+        log: {
+          type: 'widget',
+          attributes: {
+            allowed: [ 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null
+        },
+        main: {
+          type: 'landmark',
+          attributes: {
+            allowed: [ 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null,
+          implicit: [ 'main' ]
+        },
+        marquee: {
+          type: 'widget',
+          attributes: {
+            allowed: [ 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null
+        },
+        math: {
+          type: 'structure',
+          attributes: {
+            allowed: [ 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null,
+          implicit: [ 'math' ]
+        },
+        menu: {
+          type: 'composite',
+          attributes: {
+            allowed: [ 'aria-activedescendant', 'aria-expanded' ]
+          },
+          owned: {
+            one: [ 'menuitem', 'menuitemradio', 'menuitemcheckbox' ]
+          },
+          nameFrom: [ 'author' ],
+          context: null,
+          implicit: [ 'menu[type="context"]' ]
+        },
+        menubar: {
+          type: 'composite',
+          attributes: {
+            allowed: [ 'aria-activedescendant', 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null
+        },
+        menuitem: {
+          type: 'widget',
+          attributes: null,
+          owned: null,
+          nameFrom: [ 'author', 'contents' ],
+          context: [ 'menu', 'menubar' ],
+          implicit: [ 'menuitem[type="command"]' ]
+        },
+        menuitemcheckbox: {
+          type: 'widget',
+          attributes: {
+            required: [ 'aria-checked' ]
+          },
+          owned: null,
+          nameFrom: [ 'author', 'contents' ],
+          context: [ 'menu', 'menubar' ],
+          implicit: [ 'menuitem[type="checkbox"]' ]
+        },
+        menuitemradio: {
+          type: 'widget',
+          attributes: {
+            allowed: [ 'aria-selected', 'aria-posinset', 'aria-setsize' ],
+            required: [ 'aria-checked' ]
+          },
+          owned: null,
+          nameFrom: [ 'author', 'contents' ],
+          context: [ 'menu', 'menubar' ],
+          implicit: [ 'menuitem[type="radio"]' ]
+        },
+        navigation: {
+          type: 'landmark',
+          attributes: {
+            allowed: [ 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null,
+          implicit: [ 'nav' ]
+        },
+        none: {
+          type: 'structure',
+          attributes: null,
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null
+        },
+        note: {
+          type: 'structure',
+          attributes: {
+            allowed: [ 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null
+        },
+        option: {
+          type: 'widget',
+          attributes: {
+            allowed: [ 'aria-selected', 'aria-posinset', 'aria-setsize', 'aria-checked' ]
+          },
+          owned: null,
+          nameFrom: [ 'author', 'contents' ],
+          context: [ 'listbox' ],
+          implicit: [ 'option' ]
+        },
+        presentation: {
+          type: 'structure',
+          attributes: null,
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null
+        },
+        progressbar: {
+          type: 'widget',
+          attributes: {
+            allowed: [ 'aria-valuetext', 'aria-valuenow', 'aria-valuemax', 'aria-valuemin' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null,
+          implicit: [ 'progress' ]
+        },
+        radio: {
+          type: 'widget',
+          attributes: {
+            allowed: [ 'aria-selected', 'aria-posinset', 'aria-setsize' ],
+            required: [ 'aria-checked' ]
+          },
+          owned: null,
+          nameFrom: [ 'author', 'contents' ],
+          context: null,
+          implicit: [ 'input[type="radio"]' ]
+        },
+        radiogroup: {
+          type: 'composite',
+          attributes: {
+            allowed: [ 'aria-activedescendant', 'aria-required', 'aria-expanded' ]
+          },
+          owned: {
+            all: [ 'radio' ]
+          },
+          nameFrom: [ 'author' ],
+          context: null
+        },
+        range: {
+          nameFrom: [ 'author' ],
+          type: 'abstract'
+        },
+        region: {
+          type: 'structure',
+          attributes: {
+            allowed: [ 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null,
+          implicit: [ 'section' ]
+        },
+        roletype: {
+          type: 'abstract'
+        },
+        row: {
+          type: 'structure',
+          attributes: {
+            allowed: [ 'aria-level', 'aria-selected', 'aria-activedescendant', 'aria-expanded' ]
+          },
+          owned: {
+            one: [ 'cell', 'columnheader', 'rowheader', 'gridcell' ]
+          },
+          nameFrom: [ 'author', 'contents' ],
+          context: [ 'rowgroup', 'grid', 'treegrid', 'table' ],
+          implicit: [ 'tr' ]
+        },
+        rowgroup: {
+          type: 'structure',
+          attributes: {
+            allowed: [ 'aria-activedescendant', 'aria-expanded' ]
+          },
+          owned: {
+            all: [ 'row' ]
+          },
+          nameFrom: [ 'author', 'contents' ],
+          context: [ 'grid', 'table' ],
+          implicit: [ 'tbody', 'thead', 'tfoot' ]
+        },
+        rowheader: {
+          type: 'structure',
+          attributes: {
+            allowed: [ 'aria-sort', 'aria-required', 'aria-readonly', 'aria-expanded', 'aria-selected' ]
+          },
+          owned: null,
+          nameFrom: [ 'author', 'contents' ],
+          context: [ 'row' ],
+          implicit: [ 'th' ]
+        },
+        scrollbar: {
+          type: 'widget',
+          attributes: {
+            required: [ 'aria-controls', 'aria-orientation', 'aria-valuenow', 'aria-valuemax', 'aria-valuemin' ],
+            allowed: [ 'aria-valuetext' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null
+        },
+        search: {
+          type: 'landmark',
+          attributes: {
+            allowed: [ 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null
+        },
+        searchbox: {
+          type: 'widget',
+          attributes: {
+            allowed: [ 'aria-activedescendant', 'aria-autocomplete', 'aria-multiline', 'aria-readonly', 'aria-required' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null,
+          implicit: [ 'input[type="search"]' ]
+        },
+        section: {
+          nameFrom: [ 'author', 'contents' ],
+          type: 'abstract'
+        },
+        sectionhead: {
+          nameFrom: [ 'author', 'contents' ],
+          type: 'abstract'
+        },
+        select: {
+          nameFrom: [ 'author' ],
+          type: 'abstract'
+        },
+        separator: {
+          type: 'structure',
+          attributes: {
+            allowed: [ 'aria-expanded', 'aria-orientation' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null,
+          implicit: [ 'hr' ]
+        },
+        slider: {
+          type: 'widget',
+          attributes: {
+            allowed: [ 'aria-valuetext', 'aria-orientation' ],
+            required: [ 'aria-valuenow', 'aria-valuemax', 'aria-valuemin' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null,
+          implicit: [ 'input[type="range"]' ]
+        },
+        spinbutton: {
+          type: 'widget',
+          attributes: {
+            allowed: [ 'aria-valuetext', 'aria-required' ],
+            required: [ 'aria-valuenow', 'aria-valuemax', 'aria-valuemin' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null,
+          implicit: [ 'input[type="number"]' ]
+        },
+        status: {
+          type: 'widget',
+          attributes: {
+            allowed: [ 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null,
+          implicit: [ 'output' ]
+        },
+        structure: {
+          type: 'abstract'
+        },
+        switch: {
+          type: 'widget',
+          attributes: {
+            required: [ 'aria-checked' ]
+          },
+          owned: null,
+          nameFrom: [ 'author', 'contents' ],
+          context: null
+        },
+        tab: {
+          type: 'widget',
+          attributes: {
+            allowed: [ 'aria-selected', 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author', 'contents' ],
+          context: [ 'tablist' ]
+        },
+        table: {
+          type: 'structure',
+          attributes: {
+            allowed: [ 'aria-colcount', 'aria-rowcount' ]
+          },
+          owned: {
+            one: [ 'rowgroup', 'row' ]
+          },
+          nameFrom: [ 'author' ],
+          context: null,
+          implicit: [ 'table' ]
+        },
+        tablist: {
+          type: 'composite',
+          attributes: {
+            allowed: [ 'aria-activedescendant', 'aria-expanded', 'aria-level', 'aria-multiselectable' ]
+          },
+          owned: {
+            all: [ 'tab' ]
+          },
+          nameFrom: [ 'author' ],
+          context: null
+        },
+        tabpanel: {
+          type: 'widget',
+          attributes: {
+            allowed: [ 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null
+        },
+        text: {
+          type: 'structure',
+          owned: null,
+          nameFrom: [ 'author', 'contents' ],
+          context: null
+        },
+        textbox: {
+          type: 'widget',
+          attributes: {
+            allowed: [ 'aria-activedescendant', 'aria-autocomplete', 'aria-multiline', 'aria-readonly', 'aria-required' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null,
+          implicit: [ 'input[type="text"]', 'input[type="email"]', 'input[type="password"]', 'input[type="tel"]', 'input[type="url"]', 'input:not([type])', 'textarea' ]
+        },
+        timer: {
+          type: 'widget',
+          attributes: {
+            allowed: [ 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null
+        },
+        toolbar: {
+          type: 'structure',
+          attributes: {
+            allowed: [ 'aria-activedescendant', 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author' ],
+          context: null,
+          implicit: [ 'menu[type="toolbar"]' ]
+        },
+        tooltip: {
+          type: 'widget',
+          attributes: {
+            allowed: [ 'aria-expanded' ]
+          },
+          owned: null,
+          nameFrom: [ 'author', 'contents' ],
+          context: null
+        },
+        tree: {
+          type: 'composite',
+          attributes: {
+            allowed: [ 'aria-activedescendant', 'aria-multiselectable', 'aria-required', 'aria-expanded' ]
+          },
+          owned: {
+            all: [ 'treeitem' ]
+          },
+          nameFrom: [ 'author' ],
+          context: null
+        },
+        treegrid: {
+          type: 'composite',
+          attributes: {
+            allowed: [ 'aria-activedescendant', 'aria-expanded', 'aria-level', 'aria-multiselectable', 'aria-readonly', 'aria-required' ]
+          },
+          owned: {
+            all: [ 'treeitem' ]
+          },
+          nameFrom: [ 'author' ],
+          context: null
+        },
+        treeitem: {
+          type: 'widget',
+          attributes: {
+            allowed: [ 'aria-checked', 'aria-selected', 'aria-expanded', 'aria-level', 'aria-posinset', 'aria-setsize' ]
+          },
+          owned: null,
+          nameFrom: [ 'author', 'contents' ],
+          context: [ 'treegrid', 'tree' ]
+        },
+        widget: {
+          type: 'abstract'
+        },
+        window: {
+          nameFrom: [ 'author' ],
+          type: 'abstract'
+        }
+      };
+      var color = {};
+      commons.color = color;
+      var dom = commons.dom = {};
+      var table = commons.table = {};
+      var text = commons.text = {};
+      var utils = commons.utils = axe.utils;
+      aria.requiredAttr = function(role) {
+        'use strict';
+        var roles = lookupTables.role[role], attr = roles && roles.attributes && roles.attributes.required;
+        return attr || [];
+      };
+      aria.allowedAttr = function(role) {
+        'use strict';
+        var roles = lookupTables.role[role], attr = roles && roles.attributes && roles.attributes.allowed || [], requiredAttr = roles && roles.attributes && roles.attributes.required || [];
+        return attr.concat(lookupTables.globalAttributes).concat(requiredAttr);
+      };
+      aria.validateAttr = function(att) {
+        'use strict';
+        return !!lookupTables.attributes[att];
+      };
+      aria.validateAttrValue = function(node, attr) {
+        'use strict';
+        var matches, list, value = node.getAttribute(attr), attrInfo = lookupTables.attributes[attr];
+        var doc = dom.getRootNode(node);
+        if (!attrInfo) {
+          return true;
+        }
+        switch (attrInfo.type) {
+         case 'boolean':
+         case 'nmtoken':
+          return typeof value === 'string' && attrInfo.values.indexOf(value.toLowerCase()) !== -1;
+
+         case 'nmtokens':
+          list = axe.utils.tokenList(value);
+          return list.reduce(function(result, token) {
+            return result && attrInfo.values.indexOf(token) !== -1;
+          }, list.length !== 0);
+
+         case 'idref':
+          return !!(value && doc.getElementById(value));
+
+         case 'idrefs':
+          list = axe.utils.tokenList(value);
+          return list.reduce(function(result, token) {
+            return !!(result && doc.getElementById(token));
+          }, list.length !== 0);
+
+         case 'string':
+          return true;
+
+         case 'decimal':
+          matches = value.match(/^[-+]?([0-9]*)\.?([0-9]*)$/);
+          return !!(matches && (matches[1] || matches[2]));
+
+         case 'int':
+          return /^[-+]?[0-9]+$/.test(value);
+        }
+      };
+      aria.label = function(node) {
+        var ref, candidate;
+        if (node.actualNode.getAttribute('aria-labelledby')) {
+          ref = dom.idrefs(node.actualNode, 'aria-labelledby');
+          candidate = ref.map(function(thing) {
+            var vNode = axe.utils.getNodeFromTree(axe._tree[0], thing);
+            return vNode ? text.visible(vNode, true) : '';
+          }).join(' ').trim();
+          if (candidate) {
+            return candidate;
+          }
+        }
+        candidate = node.actualNode.getAttribute('aria-label');
+        if (candidate) {
+          candidate = text.sanitize(candidate).trim();
+          if (candidate) {
+            return candidate;
+          }
+        }
+        return null;
+      };
+      aria.isValidRole = function(role) {
+        'use strict';
+        if (lookupTables.role[role]) {
+          return true;
+        }
+        return false;
+      };
+      aria.getRolesWithNameFromContents = function() {
+        return Object.keys(lookupTables.role).filter(function(r) {
+          return lookupTables.role[r].nameFrom && lookupTables.role[r].nameFrom.indexOf('contents') !== -1;
+        });
+      };
+      aria.getRolesByType = function(roleType) {
+        return Object.keys(lookupTables.role).filter(function(r) {
+          return lookupTables.role[r].type === roleType;
+        });
+      };
+      aria.getRoleType = function(role) {
+        var r = lookupTables.role[role];
+        return r && r.type || null;
+      };
+      aria.requiredOwned = function(role) {
+        'use strict';
+        var owned = null, roles = lookupTables.role[role];
+        if (roles) {
+          owned = axe.utils.clone(roles.owned);
+        }
+        return owned;
+      };
+      aria.requiredContext = function(role) {
+        'use strict';
+        var context = null, roles = lookupTables.role[role];
+        if (roles) {
+          context = axe.utils.clone(roles.context);
+        }
+        return context;
+      };
+      aria.implicitNodes = function(role) {
+        'use strict';
+        var implicit = null, roles = lookupTables.role[role];
+        if (roles && roles.implicit) {
+          implicit = axe.utils.clone(roles.implicit);
+        }
+        return implicit;
+      };
+      aria.implicitRole = function(node) {
+        'use strict';
+        var isValidImplicitRole = function isValidImplicitRole(set, role) {
+          var validForNodeType = function validForNodeType(implicitNodeTypeSelector) {
+            return axe.utils.matchesSelector(node, implicitNodeTypeSelector);
+          };
+          if (role.implicit && role.implicit.some(validForNodeType)) {
+            set.push(role.name);
+          }
+          return set;
+        };
+        var sortRolesByOptimalAriaContext = function sortRolesByOptimalAriaContext(roles, ariaAttributes) {
+          var getScore = function getScore(role) {
+            var allowedAriaAttributes = aria.allowedAttr(role);
+            return allowedAriaAttributes.reduce(function(score, attribute) {
+              return score + (ariaAttributes.indexOf(attribute) > -1 ? 1 : 0);
+            }, 0);
+          };
+          var scored = roles.map(function(role) {
+            return {
+              score: getScore(role),
+              name: role
+            };
+          });
+          var sorted = scored.sort(function(scoredRoleA, scoredRoleB) {
+            return scoredRoleB.score - scoredRoleA.score;
+          });
+          return sorted.map(function(sortedRole) {
+            return sortedRole.name;
+          });
+        };
+        var roles = Object.keys(lookupTables.role).map(function(role) {
+          var lookup = lookupTables.role[role];
+          return {
+            name: role,
+            implicit: lookup && lookup.implicit
+          };
+        });
+        var availableImplicitRoles = roles.reduce(isValidImplicitRole, []);
+        if (!availableImplicitRoles.length) {
+          return null;
+        }
+        var nodeAttributes = node.attributes;
+        var ariaAttributes = [];
+        for (var i = 0, j = nodeAttributes.length; i < j; i++) {
+          var attr = nodeAttributes[i];
+          if (attr.name.match(/^aria-/)) {
+            ariaAttributes.push(attr.name);
+          }
+        }
+        return sortRolesByOptimalAriaContext(availableImplicitRoles, ariaAttributes).shift();
+      };
+      color.Color = function(red, green, blue, alpha) {
+        this.red = red;
+        this.green = green;
+        this.blue = blue;
+        this.alpha = alpha;
+        this.toHexString = function() {
+          var redString = Math.round(this.red).toString(16);
+          var greenString = Math.round(this.green).toString(16);
+          var blueString = Math.round(this.blue).toString(16);
+          return '#' + (this.red > 15.5 ? redString : '0' + redString) + (this.green > 15.5 ? greenString : '0' + greenString) + (this.blue > 15.5 ? blueString : '0' + blueString);
+        };
+        var rgbRegex = /^rgb\((\d+), (\d+), (\d+)\)$/;
+        var rgbaRegex = /^rgba\((\d+), (\d+), (\d+), (\d*(\.\d+)?)\)/;
+        this.parseRgbString = function(colorString) {
+          if (colorString === 'transparent') {
+            this.red = 0;
+            this.green = 0;
+            this.blue = 0;
+            this.alpha = 0;
+            return;
+          }
+          var match = colorString.match(rgbRegex);
+          if (match) {
+            this.red = parseInt(match[1], 10);
+            this.green = parseInt(match[2], 10);
+            this.blue = parseInt(match[3], 10);
+            this.alpha = 1;
+            return;
+          }
+          match = colorString.match(rgbaRegex);
+          if (match) {
+            this.red = parseInt(match[1], 10);
+            this.green = parseInt(match[2], 10);
+            this.blue = parseInt(match[3], 10);
+            this.alpha = parseFloat(match[4]);
+            return;
+          }
+        };
+        this.getRelativeLuminance = function() {
+          var rSRGB = this.red / 255;
+          var gSRGB = this.green / 255;
+          var bSRGB = this.blue / 255;
+          var r = rSRGB <= .03928 ? rSRGB / 12.92 : Math.pow((rSRGB + .055) / 1.055, 2.4);
+          var g = gSRGB <= .03928 ? gSRGB / 12.92 : Math.pow((gSRGB + .055) / 1.055, 2.4);
+          var b = bSRGB <= .03928 ? bSRGB / 12.92 : Math.pow((bSRGB + .055) / 1.055, 2.4);
+          return .2126 * r + .7152 * g + .0722 * b;
+        };
+      };
+      color.flattenColors = function(fgColor, bgColor) {
+        var alpha = fgColor.alpha;
+        var r = (1 - alpha) * bgColor.red + alpha * fgColor.red;
+        var g = (1 - alpha) * bgColor.green + alpha * fgColor.green;
+        var b = (1 - alpha) * bgColor.blue + alpha * fgColor.blue;
+        var a = fgColor.alpha + bgColor.alpha * (1 - fgColor.alpha);
+        return new color.Color(r, g, b, a);
+      };
+      color.getContrast = function(bgColor, fgColor) {
+        if (!fgColor || !bgColor) {
+          return null;
+        }
+        if (fgColor.alpha < 1) {
+          fgColor = color.flattenColors(fgColor, bgColor);
+        }
+        var bL = bgColor.getRelativeLuminance();
+        var fL = fgColor.getRelativeLuminance();
+        return (Math.max(fL, bL) + .05) / (Math.min(fL, bL) + .05);
+      };
+      color.hasValidContrastRatio = function(bg, fg, fontSize, isBold) {
+        var contrast = color.getContrast(bg, fg);
+        var isSmallFont = isBold && Math.ceil(fontSize * 72) / 96 < 14 || !isBold && Math.ceil(fontSize * 72) / 96 < 18;
+        return {
+          isValid: isSmallFont && contrast >= 4.5 || !isSmallFont && contrast >= 3,
+          contrastRatio: contrast
+        };
+      };
+      function _getFonts(style) {
+        return style.getPropertyValue('font-family').split(/[,;]/g).map(function(font) {
+          return font.trim().toLowerCase();
+        });
+      }
+      function elementIsDistinct(node, ancestorNode) {
+        var nodeStyle = window.getComputedStyle(node);
+        if (nodeStyle.getPropertyValue('background-image') !== 'none') {
+          return true;
+        }
+        var hasBorder = [ 'border-bottom', 'border-top', 'outline' ].reduce(function(result, edge) {
+          var borderClr = new color.Color();
+          borderClr.parseRgbString(nodeStyle.getPropertyValue(edge + '-color'));
+          return result || nodeStyle.getPropertyValue(edge + '-style') !== 'none' && parseFloat(nodeStyle.getPropertyValue(edge + '-width')) > 0 && borderClr.alpha !== 0;
+        }, false);
+        if (hasBorder) {
+          return true;
+        }
+        var parentStyle = window.getComputedStyle(ancestorNode);
+        if (_getFonts(nodeStyle)[0] !== _getFonts(parentStyle)[0]) {
+          return true;
+        }
+        var hasStyle = [ 'text-decoration-line', 'text-decoration-style', 'font-weight', 'font-style', 'font-size' ].reduce(function(result, cssProp) {
+          return result || nodeStyle.getPropertyValue(cssProp) !== parentStyle.getPropertyValue(cssProp);
+        }, false);
+        var tDec = nodeStyle.getPropertyValue('text-decoration');
+        if (tDec.split(' ').length < 3) {
+          hasStyle = hasStyle || tDec !== parentStyle.getPropertyValue('text-decoration');
+        }
+        return hasStyle;
+      }
+      color.elementIsDistinct = elementIsDistinct;
+      var graphicNodes = [ 'IMG', 'CANVAS', 'OBJECT', 'IFRAME', 'VIDEO', 'SVG' ];
+      function elmHasImage(elm, style) {
+        var nodeName = elm.nodeName.toUpperCase();
+        if (graphicNodes.includes(nodeName)) {
+          axe.commons.color.incompleteData.set('bgColor', 'imgNode');
+          return true;
+        }
+        style = style || window.getComputedStyle(elm);
+        var bgImageStyle = style.getPropertyValue('background-image');
+        var hasBgImage = bgImageStyle !== 'none';
+        if (hasBgImage) {
+          var hasGradient = /gradient/.test(bgImageStyle);
+          axe.commons.color.incompleteData.set('bgColor', hasGradient ? 'bgGradient' : 'bgImage');
+        }
+        return hasBgImage;
+      }
+      function getBgColor(elm, elmStyle) {
+        elmStyle = elmStyle || window.getComputedStyle(elm);
+        var bgColor = new color.Color();
+        bgColor.parseRgbString(elmStyle.getPropertyValue('background-color'));
+        if (bgColor.alpha !== 0) {
+          var opacity = elmStyle.getPropertyValue('opacity');
+          bgColor.alpha = bgColor.alpha * opacity;
+        }
+        return bgColor;
+      }
+      function contentOverlapping(targetElement, bgNode) {
+        var targetRect = targetElement.getClientRects()[0];
+        var obscuringElements = document.elementsFromPoint(targetRect.left, targetRect.top);
+        if (obscuringElements) {
+          for (var i = 0; i < obscuringElements.length; i++) {
+            if (obscuringElements[i] !== targetElement && obscuringElements[i] === bgNode) {
+              return true;
+            }
+          }
+        }
+        return false;
+      }
+      function calculateObscuringAlpha(elmIndex, elmStack, originalElm) {
+        var totalAlpha = 0;
+        if (elmIndex > 0) {
+          for (var i = elmIndex - 1; i >= 0; i--) {
+            var bgElm = elmStack[i];
+            var bgElmStyle = window.getComputedStyle(bgElm);
+            var bgColor = getBgColor(bgElm, bgElmStyle);
+            if (bgColor.alpha && contentOverlapping(originalElm, bgElm)) {
+              totalAlpha += bgColor.alpha;
+            } else {
+              elmStack.splice(i, 1);
+            }
+          }
+        }
+        return totalAlpha;
+      }
+      function elmPartiallyObscured(elm, bgElm, bgColor) {
+        var obscured = elm !== bgElm && !dom.visuallyContains(elm, bgElm) && bgColor.alpha !== 0;
+        if (obscured) {
+          axe.commons.color.incompleteData.set('bgColor', 'elmPartiallyObscured');
+        }
+        return obscured;
+      }
+      function includeMissingElements(elmStack, elm) {
+        var elementMap = {
+          TD: 'TR',
+          INPUT: 'LABEL'
+        };
+        var tagArray = elmStack.map(function(elm) {
+          return elm.tagName;
+        });
+        var bgNodes = elmStack;
+        for (var candidate in elementMap) {
+          if (elementMap.hasOwnProperty(candidate)) {
+            if (elm.tagName === candidate) {
+              var ancestorMatch = axe.commons.dom.findUp(elm, elementMap[candidate]);
+              if (ancestorMatch && elmStack.indexOf(ancestorMatch) === -1) {
+                var overlaps = axe.commons.dom.visuallyOverlaps(elm.getBoundingClientRect(), ancestorMatch);
+                if (overlaps) {
+                  bgNodes.splice(elmStack.indexOf(elm) + 1, 0, ancestorMatch);
+                }
+              }
+            }
+            if (elm.tagName === elementMap[candidate] && tagArray.indexOf(elm.tagName) === -1) {
+              bgNodes.splice(tagArray.indexOf(candidate) + 1, 0, elm);
+            }
+          }
+        }
+        return bgNodes;
+      }
+      function sortPageBackground(elmStack) {
+        var bodyIndex = elmStack.indexOf(document.body);
+        var bgNodes = elmStack;
+        if (bodyIndex > 1 && !elmHasImage(document.documentElement) && getBgColor(document.documentElement).alpha === 0) {
+          bgNodes.splice(bodyIndex, 1);
+          bgNodes.splice(elmStack.indexOf(document.documentElement), 1);
+          bgNodes.push(document.body);
+        }
+        return bgNodes;
+      }
+      color.getBackgroundStack = function(elm) {
+        var rect = elm.getBoundingClientRect();
+        var x = void 0, y = void 0;
+        if (rect.left > window.innerWidth) {
+          return;
+        }
+        if (rect.top > window.innerHeight) {
+          return;
+        }
+        x = Math.min(Math.ceil(rect.left + rect.width / 2), window.innerWidth - 1);
+        y = Math.min(Math.ceil(rect.top + rect.height / 2), window.innerHeight - 1);
+        var elmStack = document.elementsFromPoint(x, y);
+        elmStack = includeMissingElements(elmStack, elm);
+        elmStack = dom.reduceToElementsBelowFloating(elmStack, elm);
+        elmStack = sortPageBackground(elmStack);
+        var elmIndex = elmStack.indexOf(elm);
+        if (calculateObscuringAlpha(elmIndex, elmStack, elm) >= .99) {
+          axe.commons.color.incompleteData.set('bgColor', 'bgOverlap');
+          return null;
+        }
+        return elmIndex !== -1 ? elmStack : null;
+      };
+      color.getBackgroundColor = function(elm) {
+        var bgElms = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
+        var noScroll = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+        if (noScroll !== true) {
+          elm.scrollIntoView();
+        }
+        var bgColors = [];
+        var elmStack = color.getBackgroundStack(elm);
+        (elmStack || []).some(function(bgElm) {
+          var bgElmStyle = window.getComputedStyle(bgElm);
+          var bgColor = getBgColor(bgElm, bgElmStyle);
+          if (elmPartiallyObscured(elm, bgElm, bgColor) || elmHasImage(bgElm, bgElmStyle)) {
+            bgColors = null;
+            bgElms.push(bgElm);
+            return true;
+          }
+          if (bgColor.alpha !== 0) {
+            bgElms.push(bgElm);
+            bgColors.push(bgColor);
+            return bgColor.alpha === 1;
+          } else {
+            return false;
+          }
+        });
+        if (bgColors !== null && elmStack !== null) {
+          bgColors.push(new color.Color(255, 255, 255, 1));
+          var colors = bgColors.reduce(color.flattenColors);
+          return colors;
+        }
+        return null;
+      };
+      dom.isOpaque = function(node) {
+        var style = window.getComputedStyle(node);
+        return elmHasImage(node, style) || getBgColor(node, style).alpha === 1;
+      };
+      color.getForegroundColor = function(node, noScroll) {
+        var nodeStyle = window.getComputedStyle(node);
+        var fgColor = new color.Color();
+        fgColor.parseRgbString(nodeStyle.getPropertyValue('color'));
+        var opacity = nodeStyle.getPropertyValue('opacity');
+        fgColor.alpha = fgColor.alpha * opacity;
+        if (fgColor.alpha === 1) {
+          return fgColor;
+        }
+        var bgColor = color.getBackgroundColor(node, [], noScroll);
+        if (bgColor === null) {
+          var reason = axe.commons.color.incompleteData.get('bgColor');
+          axe.commons.color.incompleteData.set('fgColor', reason);
+          return null;
+        }
+        return color.flattenColors(fgColor, bgColor);
+      };
+      color.incompleteData = function() {
+        var data = {};
+        return {
+          set: function set(key, reason) {
+            if (typeof key !== 'string') {
+              throw new Error('Incomplete data: key must be a string');
+            }
+            if (reason) {
+              data[key] = reason;
+            }
+            return data[key];
+          },
+          get: function get(key) {
+            return data[key];
+          },
+          clear: function clear() {
+            data = {};
+          }
+        };
+      }();
+      dom.reduceToElementsBelowFloating = function(elements, targetNode) {
+        var floatingPositions = [ 'fixed', 'sticky' ], finalElements = [], targetFound = false, index, currentNode, style;
+        for (index = 0; index < elements.length; ++index) {
+          currentNode = elements[index];
+          if (currentNode === targetNode) {
+            targetFound = true;
+          }
+          style = window.getComputedStyle(currentNode);
+          if (!targetFound && floatingPositions.indexOf(style.position) !== -1) {
+            finalElements = [];
+            continue;
+          }
+          finalElements.push(currentNode);
+        }
+        return finalElements;
+      };
+      dom.findUp = function(element, target) {
+        'use strict';
+        var parent, doc = axe.commons.dom.getRootNode(element), matches;
+        matches = doc.querySelectorAll(target);
+        matches = axe.utils.toArray(matches);
+        if (doc === document && !matches.length) {
+          return null;
+        }
+        parent = element.assignedSlot ? element.assignedSlot : element.parentNode;
+        if (parent.nodeType === 11) {
+          parent = parent.host;
+        }
+        while (parent && matches.indexOf(parent) === -1) {
+          parent = parent.assignedSlot ? parent.assignedSlot : parent.parentNode;
+          if (parent && parent.nodeType === 11) {
+            parent = parent.host;
+            doc = axe.commons.dom.getRootNode(parent);
+            matches = doc.querySelectorAll(target);
+            matches = axe.utils.toArray(matches);
+            if (doc === document && !matches.length) {
+              return null;
+            }
+          }
+        }
+        return parent;
+      };
+      dom.getElementByReference = function(node, attr) {
+        'use strict';
+        var candidate, fragment = node.getAttribute(attr), doc = document;
+        if (fragment && fragment.charAt(0) === '#') {
+          fragment = fragment.substring(1);
+          candidate = doc.getElementById(fragment);
+          if (candidate) {
+            return candidate;
+          }
+          candidate = doc.getElementsByName(fragment);
+          if (candidate.length) {
+            return candidate[0];
+          }
+        }
+        return null;
+      };
+      dom.getElementCoordinates = function(element) {
+        'use strict';
+        var scrollOffset = dom.getScrollOffset(document), xOffset = scrollOffset.left, yOffset = scrollOffset.top, coords = element.getBoundingClientRect();
+        return {
+          top: coords.top + yOffset,
+          right: coords.right + xOffset,
+          bottom: coords.bottom + yOffset,
+          left: coords.left + xOffset,
+          width: coords.right - coords.left,
+          height: coords.bottom - coords.top
+        };
+      };
+      dom.getRootNode = function(node) {
+        var doc = node.getRootNode && node.getRootNode() || document;
+        if (doc === node) {
+          doc = document;
+        }
+        return doc;
+      };
+      dom.getScrollOffset = function(element) {
+        'use strict';
+        if (!element.nodeType && element.document) {
+          element = element.document;
+        }
+        if (element.nodeType === 9) {
+          var docElement = element.documentElement, body = element.body;
+          return {
+            left: docElement && docElement.scrollLeft || body && body.scrollLeft || 0,
+            top: docElement && docElement.scrollTop || body && body.scrollTop || 0
+          };
+        }
+        return {
+          left: element.scrollLeft,
+          top: element.scrollTop
+        };
+      };
+      dom.getViewportSize = function(win) {
+        'use strict';
+        var body, doc = win.document, docElement = doc.documentElement;
+        if (win.innerWidth) {
+          return {
+            width: win.innerWidth,
+            height: win.innerHeight
+          };
+        }
+        if (docElement) {
+          return {
+            width: docElement.clientWidth,
+            height: docElement.clientHeight
+          };
+        }
+        body = doc.body;
+        return {
+          width: body.clientWidth,
+          height: body.clientHeight
+        };
+      };
+      dom.hasContent = function hasContent(elm) {
+        if (elm.actualNode.textContent.trim() || aria.label(elm)) {
+          return true;
+        }
+        var contentElms = axe.utils.querySelectorAll(elm, '*');
+        for (var i = 0; i < contentElms.length; i++) {
+          if (aria.label(contentElms[i]) || dom.isVisualContent(contentElms[i].actualNode)) {
+            return true;
+          }
+        }
+        return false;
+      };
+      dom.idrefs = function(node, attr) {
+        'use strict';
+        var index, length, doc = dom.getRootNode(node), result = [], idrefs = node.getAttribute(attr);
+        if (idrefs) {
+          idrefs = axe.utils.tokenList(idrefs);
+          for (index = 0, length = idrefs.length; index < length; index++) {
+            result.push(doc.getElementById(idrefs[index]));
+          }
+        }
+        return result;
+      };
+      dom.isFocusable = function(el) {
+        'use strict';
+        if (!el || el.disabled || !dom.isVisible(el) && el.nodeName.toUpperCase() !== 'AREA') {
+          return false;
+        }
+        switch (el.nodeName.toUpperCase()) {
+         case 'A':
+         case 'AREA':
+          if (el.href) {
+            return true;
+          }
+          break;
+
+         case 'INPUT':
+          return el.type !== 'hidden';
+
+         case 'TEXTAREA':
+         case 'SELECT':
+         case 'DETAILS':
+         case 'BUTTON':
+          return true;
+        }
+        var tabindex = el.getAttribute('tabindex');
+        if (tabindex && !isNaN(parseInt(tabindex, 10))) {
+          return true;
+        }
+        return false;
+      };
+      dom.isHTML5 = function(doc) {
+        var node = doc.doctype;
+        if (node === null) {
+          return false;
+        }
+        return node.name === 'html' && !node.publicId && !node.systemId;
+      };
+      function walkDomNode(node, functor) {
+        'use strict';
+        var shouldWalk = functor(node);
+        node = node.firstChild;
+        while (node) {
+          if (shouldWalk !== false) {
+            walkDomNode(node, functor);
+          }
+          node = node.nextSibling;
+        }
+      }
+      var blockLike = [ 'block', 'list-item', 'table', 'flex', 'grid', 'inline-block' ];
+      function isBlock(elm) {
+        'use strict';
+        var display = window.getComputedStyle(elm).getPropertyValue('display');
+        return blockLike.indexOf(display) !== -1 || display.substr(0, 6) === 'table-';
+      }
+      dom.isInTextBlock = function isInTextBlock(node) {
+        'use strict';
+        if (isBlock(node)) {
+          return false;
+        }
+        var parentBlock = node.parentNode;
+        while (parentBlock.nodeType === 1 && !isBlock(parentBlock)) {
+          parentBlock = parentBlock.parentNode;
+        }
+        var parentText = '';
+        var linkText = '';
+        var inBrBlock = 0;
+        walkDomNode(parentBlock, function(currNode) {
+          if (inBrBlock === 2) {
+            return false;
+          }
+          if (currNode.nodeType === 3) {
+            parentText += currNode.nodeValue;
+          }
+          if (currNode.nodeType !== 1) {
+            return;
+          }
+          var nodeName = (currNode.nodeName || '').toUpperCase();
+          if ([ 'BR', 'HR' ].indexOf(nodeName) !== -1) {
+            if (inBrBlock === 0) {
+              parentText = '';
+              linkText = '';
+            } else {
+              inBrBlock = 2;
+            }
+          } else if (currNode.style.display === 'none' || currNode.style.overflow === 'hidden' || [ '', null, 'none' ].indexOf(currNode.style.float) === -1 || [ '', null, 'relative' ].indexOf(currNode.style.position) === -1) {
+            return false;
+          } else if (nodeName === 'A' && currNode.href || (currNode.getAttribute('role') || '').toLowerCase() === 'link') {
+            if (currNode === node) {
+              inBrBlock = 1;
+            }
+            linkText += currNode.textContent;
+            return false;
+          }
+        });
+        parentText = axe.commons.text.sanitize(parentText);
+        linkText = axe.commons.text.sanitize(linkText);
+        return parentText.length > linkText.length;
+      };
+      dom.isNode = function(candidate) {
+        'use strict';
+        return candidate instanceof Node;
+      };
+      dom.isOffscreen = function(element) {
+        'use strict';
+        var noParentScrolled = function noParentScrolled(element, offset) {
+          element = element.parentNode;
+          while (element.nodeName.toLowerCase() !== 'html') {
+            if (element.scrollTop) {
+              offset += element.scrollTop;
+              if (offset >= 0) {
+                return false;
+              }
+            }
+            element = element.parentNode;
+          }
+          return true;
+        };
+        var leftBoundary, docElement = document.documentElement, styl = window.getComputedStyle(element), dir = window.getComputedStyle(document.body || docElement).getPropertyValue('direction'), coords = dom.getElementCoordinates(element);
+        if (coords.bottom < 0 && (noParentScrolled(element, coords.bottom) || styl.position === 'absolute')) {
+          return true;
+        }
+        if (coords.left === 0 && coords.right === 0) {
+          return false;
+        }
+        if (dir === 'ltr') {
+          if (coords.right <= 0) {
+            return true;
+          }
+        } else {
+          leftBoundary = Math.max(docElement.scrollWidth, dom.getViewportSize(window).width);
+          if (coords.left >= leftBoundary) {
+            return true;
+          }
+        }
+        return false;
+      };
+      function isClipped(clip) {
+        'use strict';
+        var matches = clip.match(/rect\s*\(([0-9]+)px,?\s*([0-9]+)px,?\s*([0-9]+)px,?\s*([0-9]+)px\s*\)/);
+        if (matches && matches.length === 5) {
+          return matches[3] - matches[1] <= 0 && matches[2] - matches[4] <= 0;
+        }
+        return false;
+      }
+      dom.isVisible = function(el, screenReader, recursed) {
+        'use strict';
+        var style, nodeName, parent;
+        if (el.nodeType === 9) {
+          return true;
+        }
+        if (el.nodeType === 11) {
+          el = el.host;
+        }
+        style = window.getComputedStyle(el, null);
+        if (style === null) {
+          return false;
+        }
+        nodeName = el.nodeName.toUpperCase();
+        if (style.getPropertyValue('display') === 'none' || nodeName.toUpperCase() === 'STYLE' || nodeName.toUpperCase() === 'SCRIPT' || !screenReader && isClipped(style.getPropertyValue('clip')) || !recursed && (style.getPropertyValue('visibility') === 'hidden' || !screenReader && dom.isOffscreen(el)) || screenReader && el.getAttribute('aria-hidden') === 'true') {
+          return false;
+        }
+        parent = el.assignedSlot ? el.assignedSlot : el.parentNode;
+        if (parent) {
+          return dom.isVisible(parent, screenReader, true);
+        }
+        return false;
+      };
+      var visualRoles = [ 'checkbox', 'img', 'radio', 'range', 'slider', 'spinbutton', 'textbox' ];
+      dom.isVisualContent = function(candidate) {
+        var role = candidate.getAttribute('role');
+        if (role) {
+          return visualRoles.indexOf(role) !== -1;
+        }
+        switch (candidate.tagName.toUpperCase()) {
+         case 'IMG':
+         case 'IFRAME':
+         case 'OBJECT':
+         case 'VIDEO':
+         case 'AUDIO':
+         case 'CANVAS':
+         case 'SVG':
+         case 'MATH':
+         case 'BUTTON':
+         case 'SELECT':
+         case 'TEXTAREA':
+         case 'KEYGEN':
+         case 'PROGRESS':
+         case 'METER':
+          return true;
+
+         case 'INPUT':
+          return candidate.type !== 'hidden';
+
+         default:
+          return false;
+        }
+      };
+      dom.visuallyContains = function(node, parent) {
+        var rectBound = node.getBoundingClientRect();
+        var margin = .01;
+        var rect = {
+          top: rectBound.top + margin,
+          bottom: rectBound.bottom - margin,
+          left: rectBound.left + margin,
+          right: rectBound.right - margin
+        };
+        var parentRect = parent.getBoundingClientRect();
+        var parentTop = parentRect.top;
+        var parentLeft = parentRect.left;
+        var parentScrollArea = {
+          top: parentTop - parent.scrollTop,
+          bottom: parentTop - parent.scrollTop + parent.scrollHeight,
+          left: parentLeft - parent.scrollLeft,
+          right: parentLeft - parent.scrollLeft + parent.scrollWidth
+        };
+        var style = window.getComputedStyle(parent);
+        if (style.getPropertyValue('display') === 'inline') {
+          return true;
+        }
+        if (rect.left < parentScrollArea.left && rect.left < parentRect.left || rect.top < parentScrollArea.top && rect.top < parentRect.top || rect.right > parentScrollArea.right && rect.right > parentRect.right || rect.bottom > parentScrollArea.bottom && rect.bottom > parentRect.bottom) {
+          return false;
+        }
+        if (rect.right > parentRect.right || rect.bottom > parentRect.bottom) {
+          return style.overflow === 'scroll' || style.overflow === 'auto' || style.overflow === 'hidden' || parent instanceof HTMLBodyElement || parent instanceof HTMLHtmlElement;
+        }
+        return true;
+      };
+      dom.visuallyOverlaps = function(rect, parent) {
+        var parentRect = parent.getBoundingClientRect();
+        var parentTop = parentRect.top;
+        var parentLeft = parentRect.left;
+        var parentScrollArea = {
+          top: parentTop - parent.scrollTop,
+          bottom: parentTop - parent.scrollTop + parent.scrollHeight,
+          left: parentLeft - parent.scrollLeft,
+          right: parentLeft - parent.scrollLeft + parent.scrollWidth
+        };
+        if (rect.left > parentScrollArea.right && rect.left > parentRect.right || rect.top > parentScrollArea.bottom && rect.top > parentRect.bottom || rect.right < parentScrollArea.left && rect.right < parentRect.left || rect.bottom < parentScrollArea.top && rect.bottom < parentRect.top) {
+          return false;
+        }
+        var style = window.getComputedStyle(parent);
+        if (rect.left > parentRect.right || rect.top > parentRect.bottom) {
+          return style.overflow === 'scroll' || style.overflow === 'auto' || parent instanceof HTMLBodyElement || parent instanceof HTMLHtmlElement;
+        }
+        return true;
+      };
+      table.getAllCells = function(tableElm) {
+        var rowIndex, cellIndex, rowLength, cellLength;
+        var cells = [];
+        for (rowIndex = 0, rowLength = tableElm.rows.length; rowIndex < rowLength; rowIndex++) {
+          for (cellIndex = 0, cellLength = tableElm.rows[rowIndex].cells.length; cellIndex < cellLength; cellIndex++) {
+            cells.push(tableElm.rows[rowIndex].cells[cellIndex]);
+          }
+        }
+        return cells;
+      };
+      table.getCellPosition = function(cell, tableGrid) {
+        var rowIndex, index;
+        if (!tableGrid) {
+          tableGrid = table.toGrid(dom.findUp(cell, 'table'));
+        }
+        for (rowIndex = 0; rowIndex < tableGrid.length; rowIndex++) {
+          if (tableGrid[rowIndex]) {
+            index = tableGrid[rowIndex].indexOf(cell);
+            if (index !== -1) {
+              return {
+                x: index,
+                y: rowIndex
+              };
+            }
+          }
+        }
+      };
+      table.getHeaders = function(cell) {
+        if (cell.hasAttribute('headers')) {
+          return commons.dom.idrefs(cell, 'headers');
+        }
+        var tableGrid = commons.table.toGrid(commons.dom.findUp(cell, 'table'));
+        var position = commons.table.getCellPosition(cell, tableGrid);
+        var rowHeaders = table.traverse('left', position, tableGrid).filter(function(cell) {
+          return table.isRowHeader(cell);
+        });
+        var colHeaders = table.traverse('up', position, tableGrid).filter(function(cell) {
+          return table.isColumnHeader(cell);
+        });
+        return [].concat(rowHeaders, colHeaders).reverse();
+      };
+      table.getScope = function(cell) {
+        var scope = cell.getAttribute('scope');
+        var role = cell.getAttribute('role');
+        if (cell instanceof Element === false || [ 'TD', 'TH' ].indexOf(cell.nodeName.toUpperCase()) === -1) {
+          throw new TypeError('Expected TD or TH element');
+        }
+        if (role === 'columnheader') {
+          return 'col';
+        } else if (role === 'rowheader') {
+          return 'row';
+        } else if (scope === 'col' || scope === 'row') {
+          return scope;
+        } else if (cell.nodeName.toUpperCase() !== 'TH') {
+          return false;
+        }
+        var tableGrid = table.toGrid(dom.findUp(cell, 'table'));
+        var pos = table.getCellPosition(cell);
+        var headerRow = tableGrid[pos.y].reduce(function(headerRow, cell) {
+          return headerRow && cell.nodeName.toUpperCase() === 'TH';
+        }, true);
+        if (headerRow) {
+          return 'col';
+        }
+        var headerCol = tableGrid.map(function(col) {
+          return col[pos.x];
+        }).reduce(function(headerCol, cell) {
+          return headerCol && cell.nodeName.toUpperCase() === 'TH';
+        }, true);
+        if (headerCol) {
+          return 'row';
+        }
+        return 'auto';
+      };
+      table.isColumnHeader = function(node) {
+        return [ 'col', 'auto' ].indexOf(table.getScope(node)) !== -1;
+      };
+      table.isDataCell = function(cell) {
+        if (!cell.children.length && !cell.textContent.trim()) {
+          return false;
+        }
+        return cell.nodeName.toUpperCase() === 'TD';
+      };
+      table.isDataTable = function(node) {
+        var role = node.getAttribute('role');
+        if ((role === 'presentation' || role === 'none') && !dom.isFocusable(node)) {
+          return false;
+        }
+        if (node.getAttribute('contenteditable') === 'true' || dom.findUp(node, '[contenteditable="true"]')) {
+          return true;
+        }
+        if (role === 'grid' || role === 'treegrid' || role === 'table') {
+          return true;
+        }
+        if (commons.aria.getRoleType(role) === 'landmark') {
+          return true;
+        }
+        if (node.getAttribute('datatable') === '0') {
+          return false;
+        }
+        if (node.getAttribute('summary')) {
+          return true;
+        }
+        if (node.tHead || node.tFoot || node.caption) {
+          return true;
+        }
+        for (var childIndex = 0, childLength = node.children.length; childIndex < childLength; childIndex++) {
+          if (node.children[childIndex].nodeName.toUpperCase() === 'COLGROUP') {
+            return true;
+          }
+        }
+        var cells = 0;
+        var rowLength = node.rows.length;
+        var row, cell;
+        var hasBorder = false;
+        for (var rowIndex = 0; rowIndex < rowLength; rowIndex++) {
+          row = node.rows[rowIndex];
+          for (var cellIndex = 0, cellLength = row.cells.length; cellIndex < cellLength; cellIndex++) {
+            cell = row.cells[cellIndex];
+            if (cell.nodeName.toUpperCase() === 'TH') {
+              return true;
+            }
+            if (!hasBorder && (cell.offsetWidth !== cell.clientWidth || cell.offsetHeight !== cell.clientHeight)) {
+              hasBorder = true;
+            }
+            if (cell.getAttribute('scope') || cell.getAttribute('headers') || cell.getAttribute('abbr')) {
+              return true;
+            }
+            if ([ 'columnheader', 'rowheader' ].indexOf(cell.getAttribute('role')) !== -1) {
+              return true;
+            }
+            if (cell.children.length === 1 && cell.children[0].nodeName.toUpperCase() === 'ABBR') {
+              return true;
+            }
+            cells++;
+          }
+        }
+        if (node.getElementsByTagName('table').length) {
+          return false;
+        }
+        if (rowLength < 2) {
+          return false;
+        }
+        var sampleRow = node.rows[Math.ceil(rowLength / 2)];
+        if (sampleRow.cells.length === 1 && sampleRow.cells[0].colSpan === 1) {
+          return false;
+        }
+        if (sampleRow.cells.length >= 5) {
+          return true;
+        }
+        if (hasBorder) {
+          return true;
+        }
+        var bgColor, bgImage;
+        for (rowIndex = 0; rowIndex < rowLength; rowIndex++) {
+          row = node.rows[rowIndex];
+          if (bgColor && bgColor !== window.getComputedStyle(row).getPropertyValue('background-color')) {
+            return true;
+          } else {
+            bgColor = window.getComputedStyle(row).getPropertyValue('background-color');
+          }
+          if (bgImage && bgImage !== window.getComputedStyle(row).getPropertyValue('background-image')) {
+            return true;
+          } else {
+            bgImage = window.getComputedStyle(row).getPropertyValue('background-image');
+          }
+        }
+        if (rowLength >= 20) {
+          return true;
+        }
+        if (dom.getElementCoordinates(node).width > dom.getViewportSize(window).width * .95) {
+          return false;
+        }
+        if (cells < 10) {
+          return false;
+        }
+        if (node.querySelector('object, embed, iframe, applet')) {
+          return false;
+        }
+        return true;
+      };
+      table.isHeader = function(cell) {
+        if (table.isColumnHeader(cell) || table.isRowHeader(cell)) {
+          return true;
+        }
+        if (cell.id) {
+          return !!document.querySelector('[headers~="' + axe.utils.escapeSelector(cell.id) + '"]');
+        }
+        return false;
+      };
+      table.isRowHeader = function(node) {
+        return [ 'row', 'auto' ].indexOf(table.getScope(node)) !== -1;
+      };
+      table.toGrid = function(node) {
+        var table = [];
+        var rows = node.rows;
+        for (var i = 0, rowLength = rows.length; i < rowLength; i++) {
+          var cells = rows[i].cells;
+          table[i] = table[i] || [];
+          var columnIndex = 0;
+          for (var j = 0, cellLength = cells.length; j < cellLength; j++) {
+            for (var colSpan = 0; colSpan < cells[j].colSpan; colSpan++) {
+              for (var rowSpan = 0; rowSpan < cells[j].rowSpan; rowSpan++) {
+                table[i + rowSpan] = table[i + rowSpan] || [];
+                while (table[i + rowSpan][columnIndex]) {
+                  columnIndex++;
+                }
+                table[i + rowSpan][columnIndex] = cells[j];
+              }
+              columnIndex++;
+            }
+          }
+        }
+        return table;
+      };
+      table.toArray = table.toGrid;
+      (function(table) {
+        var traverseTable = function traverseTable(dir, position, tableGrid, callback) {
+          var result;
+          var cell = tableGrid[position.y] ? tableGrid[position.y][position.x] : undefined;
+          if (!cell) {
+            return [];
+          }
+          if (typeof callback === 'function') {
+            result = callback(cell, position, tableGrid);
+            if (result === true) {
+              return [ cell ];
+            }
+          }
+          result = traverseTable(dir, {
+            x: position.x + dir.x,
+            y: position.y + dir.y
+          }, tableGrid, callback);
+          result.unshift(cell);
+          return result;
+        };
+        table.traverse = function(dir, startPos, tableGrid, callback) {
+          if (Array.isArray(startPos)) {
+            callback = tableGrid;
+            tableGrid = startPos;
+            startPos = {
+              x: 0,
+              y: 0
+            };
+          }
+          if (typeof dir === 'string') {
+            switch (dir) {
+             case 'left':
+              dir = {
+                x: -1,
+                y: 0
+              };
+              break;
+
+             case 'up':
+              dir = {
+                x: 0,
+                y: -1
+              };
+              break;
+
+             case 'right':
+              dir = {
+                x: 1,
+                y: 0
+              };
+              break;
+
+             case 'down':
+              dir = {
+                x: 0,
+                y: 1
+              };
+              break;
+            }
+          }
+          return traverseTable(dir, {
+            x: startPos.x + dir.x,
+            y: startPos.y + dir.y
+          }, tableGrid, callback);
+        };
+      })(table);
+      var defaultButtonValues = {
+        submit: 'Submit',
+        reset: 'Reset'
+      };
+      var inputTypes = [ 'text', 'search', 'tel', 'url', 'email', 'date', 'time', 'number', 'range', 'color' ];
+      var phrasingElements = [ 'A', 'EM', 'STRONG', 'SMALL', 'MARK', 'ABBR', 'DFN', 'I', 'B', 'S', 'U', 'CODE', 'VAR', 'SAMP', 'KBD', 'SUP', 'SUB', 'Q', 'CITE', 'SPAN', 'BDO', 'BDI', 'BR', 'WBR', 'INS', 'DEL', 'IMG', 'EMBED', 'OBJECT', 'IFRAME', 'MAP', 'AREA', 'SCRIPT', 'NOSCRIPT', 'RUBY', 'VIDEO', 'AUDIO', 'INPUT', 'TEXTAREA', 'SELECT', 'BUTTON', 'LABEL', 'OUTPUT', 'DATALIST', 'KEYGEN', 'PROGRESS', 'COMMAND', 'CANVAS', 'TIME', 'METER' ];
+      function findLabel(element) {
+        var ref = null;
+        if (element.id) {
+          ref = document.querySelector('label[for="' + axe.utils.escapeSelector(element.id) + '"]');
+          if (ref) {
+            return ref;
+          }
+        }
+        ref = dom.findUp(element, 'label');
+        return ref;
+      }
+      function isButton(element) {
+        return [ 'button', 'reset', 'submit' ].indexOf(element.type) !== -1;
+      }
+      function isInput(element) {
+        var nodeName = element.nodeName.toUpperCase();
+        return nodeName === 'TEXTAREA' || nodeName === 'SELECT' || nodeName === 'INPUT' && element.type.toLowerCase() !== 'hidden';
+      }
+      function shouldCheckSubtree(element) {
+        return [ 'BUTTON', 'SUMMARY', 'A' ].indexOf(element.nodeName.toUpperCase()) !== -1;
+      }
+      function shouldNeverCheckSubtree(element) {
+        return [ 'TABLE', 'FIGURE' ].indexOf(element.nodeName.toUpperCase()) !== -1;
+      }
+      function formValueText(element) {
+        var nodeName = element.nodeName.toUpperCase();
+        if (nodeName === 'INPUT') {
+          if (!element.hasAttribute('type') || inputTypes.indexOf(element.getAttribute('type').toLowerCase()) !== -1 && element.value) {
+            return element.value;
+          }
+          return '';
+        }
+        if (nodeName === 'SELECT') {
+          var opts = element.options;
+          if (opts && opts.length) {
+            var returnText = '';
+            for (var i = 0; i < opts.length; i++) {
+              if (opts[i].selected) {
+                returnText += ' ' + opts[i].text;
+              }
+            }
+            return text.sanitize(returnText);
+          }
+          return '';
+        }
+        if (nodeName === 'TEXTAREA' && element.value) {
+          return element.value;
+        }
+        return '';
+      }
+      function checkDescendant(element, nodeName) {
+        var candidate = element.querySelector(nodeName.toLowerCase());
+        if (candidate) {
+          return text.accessibleText(candidate);
+        }
+        return '';
+      }
+      function isEmbeddedControl(e) {
+        if (!e) {
+          return false;
+        }
+        switch (e.nodeName.toUpperCase()) {
+         case 'SELECT':
+         case 'TEXTAREA':
+          return true;
+
+         case 'INPUT':
+          return !e.hasAttribute('type') || inputTypes.indexOf(e.getAttribute('type').toLowerCase()) !== -1;
+
+         default:
+          return false;
+        }
+      }
+      function shouldCheckAlt(element) {
+        var nodeName = element.nodeName.toUpperCase();
+        return nodeName === 'INPUT' && element.type.toLowerCase() === 'image' || [ 'IMG', 'APPLET', 'AREA' ].indexOf(nodeName) !== -1;
+      }
+      function nonEmptyText(t) {
+        return !!text.sanitize(t);
+      }
+      text.accessibleText = function(element, inLabelledByContext) {
+        var accessibleNameComputation;
+        var encounteredNodes = [];
+        function getInnerText(element, inLabelledByContext, inControlContext) {
+          var nodes = element.childNodes;
+          var returnText = '';
+          var node;
+          for (var i = 0; i < nodes.length; i++) {
+            node = nodes[i];
+            if (node.nodeType === 3) {
+              returnText += node.textContent;
+            } else if (node.nodeType === 1) {
+              if (phrasingElements.indexOf(node.nodeName.toUpperCase()) === -1) {
+                returnText += ' ';
+              }
+              returnText += accessibleNameComputation(nodes[i], inLabelledByContext, inControlContext);
+            }
+          }
+          return returnText;
+        }
+        function checkNative(element, inLabelledByContext, inControlContext) {
+          var returnText = '';
+          var nodeName = element.nodeName.toUpperCase();
+          if (shouldCheckSubtree(element)) {
+            returnText = getInnerText(element, false, false) || '';
+            if (nonEmptyText(returnText)) {
+              return returnText;
+            }
+          }
+          if (nodeName === 'FIGURE') {
+            returnText = checkDescendant(element, 'figcaption');
+            if (nonEmptyText(returnText)) {
+              return returnText;
+            }
+          }
+          if (nodeName === 'TABLE') {
+            returnText = checkDescendant(element, 'caption');
+            if (nonEmptyText(returnText)) {
+              return returnText;
+            }
+            returnText = element.getAttribute('title') || element.getAttribute('summary') || '';
+            if (nonEmptyText(returnText)) {
+              return returnText;
+            }
+          }
+          if (shouldCheckAlt(element)) {
+            return element.getAttribute('alt') || '';
+          }
+          if (isInput(element) && !inControlContext) {
+            if (isButton(element)) {
+              return element.value || element.title || defaultButtonValues[element.type] || '';
+            }
+            var labelElement = findLabel(element);
+            if (labelElement) {
+              return accessibleNameComputation(labelElement, inLabelledByContext, true);
+            }
+          }
+          return '';
+        }
+        function checkARIA(element, inLabelledByContext, inControlContext) {
+          if (!inLabelledByContext && element.hasAttribute('aria-labelledby')) {
+            return text.sanitize(dom.idrefs(element, 'aria-labelledby').map(function(l) {
+              if (element === l) {
+                encounteredNodes.pop();
+              }
+              return accessibleNameComputation(l, true, element !== l);
+            }).join(' '));
+          }
+          if (!(inControlContext && isEmbeddedControl(element)) && element.hasAttribute('aria-label')) {
+            return text.sanitize(element.getAttribute('aria-label'));
+          }
+          return '';
+        }
+        accessibleNameComputation = function accessibleNameComputation(element, inLabelledByContext, inControlContext) {
+          'use strict';
+          var returnText;
+          if (element === null || encounteredNodes.indexOf(element) !== -1) {
+            return '';
+          } else if (!inLabelledByContext && !dom.isVisible(element, true)) {
+            return '';
+          }
+          encounteredNodes.push(element);
+          var role = element.getAttribute('role');
+          returnText = checkARIA(element, inLabelledByContext, inControlContext);
+          if (nonEmptyText(returnText)) {
+            return returnText;
+          }
+          returnText = checkNative(element, inLabelledByContext, inControlContext);
+          if (nonEmptyText(returnText)) {
+            return returnText;
+          }
+          if (inControlContext) {
+            returnText = formValueText(element);
+            if (nonEmptyText(returnText)) {
+              return returnText;
+            }
+          }
+          if (!shouldNeverCheckSubtree(element) && (!role || aria.getRolesWithNameFromContents().indexOf(role) !== -1)) {
+            returnText = getInnerText(element, inLabelledByContext, inControlContext);
+            if (nonEmptyText(returnText)) {
+              return returnText;
+            }
+          }
+          if (element.hasAttribute('title')) {
+            return element.getAttribute('title');
+          }
+          return '';
+        };
+        return text.sanitize(accessibleNameComputation(element, inLabelledByContext));
+      };
+      text.label = function(node) {
+        var ref, candidate, doc;
+        candidate = aria.label(node);
+        if (candidate) {
+          return candidate;
+        }
+        if (node.actualNode.id) {
+          doc = axe.commons.dom.getRootNode(node.actualNode);
+          ref = doc.querySelector('label[for="' + axe.utils.escapeSelector(node.actualNode.id) + '"]');
+          ref = axe.utils.getNodeFromTree(axe._tree[0], ref);
+          candidate = ref && text.visible(ref, true);
+          if (candidate) {
+            return candidate;
+          }
+        }
+        ref = dom.findUp(node.actualNode, 'label');
+        ref = axe.utils.getNodeFromTree(axe._tree[0], ref);
+        candidate = ref && text.visible(ref, true);
+        if (candidate) {
+          return candidate;
+        }
+        return null;
+      };
+      text.sanitize = function(str) {
+        'use strict';
+        return str.replace(/\r\n/g, '\n').replace(/\u00A0/g, ' ').replace(/[\s]{2,}/g, ' ').trim();
+      };
+      text.visible = function(element, screenReader, noRecursing) {
+        'use strict';
+        var index, child, nodeValue, childNodes = element.children, length = childNodes.length, result = '';
+        for (index = 0; index < length; index++) {
+          child = childNodes[index];
+          if (child.actualNode.nodeType === 3) {
+            nodeValue = child.actualNode.nodeValue;
+            if (nodeValue && dom.isVisible(element.actualNode, screenReader)) {
+              result += nodeValue;
+            }
+          } else if (!noRecursing) {
+            result += text.visible(child, screenReader);
+          }
+        }
+        return text.sanitize(result);
+      };
+      axe.utils.toArray = function(thing) {
+        'use strict';
+        return Array.prototype.slice.call(thing);
+      };
+      axe.utils.tokenList = function(str) {
+        'use strict';
+        return str.trim().replace(/\s{2,}/g, ' ').split(' ');
+      };
+      var langs = [ 'aa', 'ab', 'ae', 'af', 'ak', 'am', 'an', 'ar', 'as', 'av', 'ay', 'az', 'ba', 'be', 'bg', 'bh', 'bi', 'bm', 'bn', 'bo', 'br', 'bs', 'ca', 'ce', 'ch', 'co', 'cr', 'cs', 'cu', 'cv', 'cy', 'da', 'de', 'dv', 'dz', 'ee', 'el', 'en', 'eo', 'es', 'et', 'eu', 'fa', 'ff', 'fi', 'fj', 'fo', 'fr', 'fy', 'ga', 'gd', 'gl', 'gn', 'gu', 'gv', 'ha', 'he', 'hi', 'ho', 'hr', 'ht', 'hu', 'hy', 'hz', 'ia', 'id', 'ie', 'ig', 'ii', 'ik', 'in', 'io', 'is', 'it', 'iu', 'iw', 'ja', 'ji', 'jv', 'jw', 'ka', 'kg', 'ki', 'kj', 'kk', 'kl', 'km', 'kn', 'ko', 'kr', 'ks', 'ku', 'kv', 'kw', 'ky', 'la', 'lb', 'lg', 'li', 'ln', 'lo', 'lt', 'lu', 'lv', 'mg', 'mh', 'mi', 'mk', 'ml', 'mn', 'mo', 'mr', 'ms', 'mt', 'my', 'na', 'nb', 'nd', 'ne', 'ng', 'nl', 'nn', 'no', 'nr', 'nv', 'ny', 'oc', 'oj', 'om', 'or', 'os', 'pa', 'pi', 'pl', 'ps', 'pt', 'qu', 'rm', 'rn', 'ro', 'ru', 'rw', 'sa', 'sc', 'sd', 'se', 'sg', 'sh', 'si', 'sk', 'sl', 'sm', 'sn', 'so', 'sq', 'sr', 'ss', 'st', 'su', 'sv', 'sw', 'ta', 'te', 'tg', 'th', 'ti', 'tk', 'tl', 'tn', 'to', 'tr', 'ts', 'tt', 'tw', 'ty', 'ug', 'uk', 'ur', 'uz', 've', 'vi', 'vo', 'wa', 'wo', 'xh', 'yi', 'yo', 'za', 'zh', 'zu', 'aaa', 'aab', 'aac', 'aad', 'aae', 'aaf', 'aag', 'aah', 'aai', 'aak', 'aal', 'aam', 'aan', 'aao', 'aap', 'aaq', 'aas', 'aat', 'aau', 'aav', 'aaw', 'aax', 'aaz', 'aba', 'abb', 'abc', 'abd', 'abe', 'abf', 'abg', 'abh', 'abi', 'abj', 'abl', 'abm', 'abn', 'abo', 'abp', 'abq', 'abr', 'abs', 'abt', 'abu', 'abv', 'abw', 'abx', 'aby', 'abz', 'aca', 'acb', 'acd', 'ace', 'acf', 'ach', 'aci', 'ack', 'acl', 'acm', 'acn', 'acp', 'acq', 'acr', 'acs', 'act', 'acu', 'acv', 'acw', 'acx', 'acy', 'acz', 'ada', 'adb', 'add', 'ade', 'adf', 'adg', 'adh', 'adi', 'adj', 'adl', 'adn', 'ado', 'adp', 'adq', 'adr', 'ads', 'adt', 'adu', 'adw', 'adx', 'ady', 'adz', 'aea', 'aeb', 'aec', 'aed', 'aee', 'aek', 'ael', 'aem', 'aen', 'aeq', 'aer', 'aes', 'aeu', 'aew', 'aey', 'aez', 'afa', 'afb', 'afd', 'afe', 'afg', 'afh', 'afi', 'afk', 'afn', 'afo', 'afp', 'afs', 'aft', 'afu', 'afz', 'aga', 'agb', 'agc', 'agd', 'age', 'agf', 'agg', 'agh', 'agi', 'agj', 'agk', 'agl', 'agm', 'agn', 'ago', 'agp', 'agq', 'agr', 'ags', 'agt', 'agu', 'agv', 'agw', 'agx', 'agy', 'agz', 'aha', 'ahb', 'ahg', 'ahh', 'ahi', 'ahk', 'ahl', 'ahm', 'ahn', 'aho', 'ahp', 'ahr', 'ahs', 'aht', 'aia', 'aib', 'aic', 'aid', 'aie', 'aif', 'aig', 'aih', 'aii', 'aij', 'aik', 'ail', 'aim', 'ain', 'aio', 'aip', 'aiq', 'air', 'ais', 'ait', 'aiw', 'aix', 'aiy', 'aja', 'ajg', 'aji', 'ajn', 'ajp', 'ajt', 'aju', 'ajw', 'ajz', 'akb', 'akc', 'akd', 'ake', 'akf', 'akg', 'akh', 'aki', 'akj', 'akk', 'akl', 'akm', 'ako', 'akp', 'akq', 'akr', 'aks', 'akt', 'aku', 'akv', 'akw', 'akx', 'aky', 'akz', 'ala', 'alc', 'ald', 'ale', 'alf', 'alg', 'alh', 'ali', 'alj', 'alk', 'all', 'alm', 'aln', 'alo', 'alp', 'alq', 'alr', 'als', 'alt', 'alu', 'alv', 'alw', 'alx', 'aly', 'alz', 'ama', 'amb', 'amc', 'ame', 'amf', 'amg', 'ami', 'amj', 'amk', 'aml', 'amm', 'amn', 'amo', 'amp', 'amq', 'amr', 'ams', 'amt', 'amu', 'amv', 'amw', 'amx', 'amy', 'amz', 'ana', 'anb', 'anc', 'and', 'ane', 'anf', 'ang', 'anh', 'ani', 'anj', 'ank', 'anl', 'anm', 'ann', 'ano', 'anp', 'anq', 'anr', 'ans', 'ant', 'anu', 'anv', 'anw', 'anx', 'any', 'anz', 'aoa', 'aob', 'aoc', 'aod', 'aoe', 'aof', 'aog', 'aoh', 'aoi', 'aoj', 'aok', 'aol', 'aom', 'aon', 'aor', 'aos', 'aot', 'aou', 'aox', 'aoz', 'apa', 'apb', 'apc', 'apd', 'ape', 'apf', 'apg', 'aph', 'api', 'apj', 'apk', 'apl', 'apm', 'apn', 'apo', 'app', 'apq', 'apr', 'aps', 'apt', 'apu', 'apv', 'apw', 'apx', 'apy', 'apz', 'aqa', 'aqc', 'aqd', 'aqg', 'aql', 'aqm', 'aqn', 'aqp', 'aqr', 'aqt', 'aqz', 'arb', 'arc', 'ard', 'are', 'arh', 'ari', 'arj', 'ark', 'arl', 'arn', 'aro', 'arp', 'arq', 'arr', 'ars', 'art', 'aru', 'arv', 'arw', 'arx', 'ary', 'arz', 'asa', 'asb', 'asc', 'asd', 'ase', 'asf', 'asg', 'ash', 'asi', 'asj', 'ask', 'asl', 'asn', 'aso', 'asp', 'asq', 'asr', 'ass', 'ast', 'asu', 'asv', 'asw', 'asx', 'asy', 'asz', 'ata', 'atb', 'atc', 'atd', 'ate', 'atg', 'ath', 'ati', 'atj', 'atk', 'atl', 'atm', 'atn', 'ato', 'atp', 'atq', 'atr', 'ats', 'att', 'atu', 'atv', 'atw', 'atx', 'aty', 'atz', 'aua', 'aub', 'auc', 'aud', 'aue', 'auf', 'aug', 'auh', 'aui', 'auj', 'auk', 'aul', 'aum', 'aun', 'auo', 'aup', 'auq', 'aur', 'aus', 'aut', 'auu', 'auw', 'aux', 'auy', 'auz', 'avb', 'avd', 'avi', 'avk', 'avl', 'avm', 'avn', 'avo', 'avs', 'avt', 'avu', 'avv', 'awa', 'awb', 'awc', 'awd', 'awe', 'awg', 'awh', 'awi', 'awk', 'awm', 'awn', 'awo', 'awr', 'aws', 'awt', 'awu', 'awv', 'aww', 'awx', 'awy', 'axb', 'axe', 'axg', 'axk', 'axl', 'axm', 'axx', 'aya', 'ayb', 'ayc', 'ayd', 'aye', 'ayg', 'ayh', 'ayi', 'ayk', 'ayl', 'ayn', 'ayo', 'ayp', 'ayq', 'ayr', 'ays', 'ayt', 'ayu', 'ayx', 'ayy', 'ayz', 'aza', 'azb', 'azc', 'azd', 'azg', 'azj', 'azm', 'azn', 'azo', 'azt', 'azz', 'baa', 'bab', 'bac', 'bad', 'bae', 'baf', 'bag', 'bah', 'bai', 'baj', 'bal', 'ban', 'bao', 'bap', 'bar', 'bas', 'bat', 'bau', 'bav', 'baw', 'bax', 'bay', 'baz', 'bba', 'bbb', 'bbc', 'bbd', 'bbe', 'bbf', 'bbg', 'bbh', 'bbi', 'bbj', 'bbk', 'bbl', 'bbm', 'bbn', 'bbo', 'bbp', 'bbq', 'bbr', 'bbs', 'bbt', 'bbu', 'bbv', 'bbw', 'bbx', 'bby', 'bbz', 'bca', 'bcb', 'bcc', 'bcd', 'bce', 'bcf', 'bcg', 'bch', 'bci', 'bcj', 'bck', 'bcl', 'bcm', 'bcn', 'bco', 'bcp', 'bcq', 'bcr', 'bcs', 'bct', 'bcu', 'bcv', 'bcw', 'bcy', 'bcz', 'bda', 'bdb', 'bdc', 'bdd', 'bde', 'bdf', 'bdg', 'bdh', 'bdi', 'bdj', 'bdk', 'bdl', 'bdm', 'bdn', 'bdo', 'bdp', 'bdq', 'bdr', 'bds', 'bdt', 'bdu', 'bdv', 'bdw', 'bdx', 'bdy', 'bdz', 'bea', 'beb', 'bec', 'bed', 'bee', 'bef', 'beg', 'beh', 'bei', 'bej', 'bek', 'bem', 'beo', 'bep', 'beq', 'ber', 'bes', 'bet', 'beu', 'bev', 'bew', 'bex', 'bey', 'bez', 'bfa', 'bfb', 'bfc', 'bfd', 'bfe', 'bff', 'bfg', 'bfh', 'bfi', 'bfj', 'bfk', 'bfl', 'bfm', 'bfn', 'bfo', 'bfp', 'bfq', 'bfr', 'bfs', 'bft', 'bfu', 'bfw', 'bfx', 'bfy', 'bfz', 'bga', 'bgb', 'bgc', 'bgd', 'bge', 'bgf', 'bgg', 'bgi', 'bgj', 'bgk', 'bgl', 'bgm', 'bgn', 'bgo', 'bgp', 'bgq', 'bgr', 'bgs', 'bgt', 'bgu', 'bgv', 'bgw', 'bgx', 'bgy', 'bgz', 'bha', 'bhb', 'bhc', 'bhd', 'bhe', 'bhf', 'bhg', 'bhh', 'bhi', 'bhj', 'bhk', 'bhl', 'bhm', 'bhn', 'bho', 'bhp', 'bhq', 'bhr', 'bhs', 'bht', 'bhu', 'bhv', 'bhw', 'bhx', 'bhy', 'bhz', 'bia', 'bib', 'bic', 'bid', 'bie', 'bif', 'big', 'bij', 'bik', 'bil', 'bim', 'bin', 'bio', 'bip', 'biq', 'bir', 'bit', 'biu', 'biv', 'biw', 'bix', 'biy', 'biz', 'bja', 'bjb', 'bjc', 'bjd', 'bje', 'bjf', 'bjg', 'bjh', 'bji', 'bjj', 'bjk', 'bjl', 'bjm', 'bjn', 'bjo', 'bjp', 'bjq', 'bjr', 'bjs', 'bjt', 'bju', 'bjv', 'bjw', 'bjx', 'bjy', 'bjz', 'bka', 'bkb', 'bkc', 'bkd', 'bkf', 'bkg', 'bkh', 'bki', 'bkj', 'bkk', 'bkl', 'bkm', 'bkn', 'bko', 'bkp', 'bkq', 'bkr', 'bks', 'bkt', 'bku', 'bkv', 'bkw', 'bkx', 'bky', 'bkz', 'bla', 'blb', 'blc', 'bld', 'ble', 'blf', 'blg', 'blh', 'bli', 'blj', 'blk', 'bll', 'blm', 'bln', 'blo', 'blp', 'blq', 'blr', 'bls', 'blt', 'blv', 'blw', 'blx', 'bly', 'blz', 'bma', 'bmb', 'bmc', 'bmd', 'bme', 'bmf', 'bmg', 'bmh', 'bmi', 'bmj', 'bmk', 'bml', 'bmm', 'bmn', 'bmo', 'bmp', 'bmq', 'bmr', 'bms', 'bmt', 'bmu', 'bmv', 'bmw', 'bmx', 'bmy', 'bmz', 'bna', 'bnb', 'bnc', 'bnd', 'bne', 'bnf', 'bng', 'bni', 'bnj', 'bnk', 'bnl', 'bnm', 'bnn', 'bno', 'bnp', 'bnq', 'bnr', 'bns', 'bnt', 'bnu', 'bnv', 'bnw', 'bnx', 'bny', 'bnz', 'boa', 'bob', 'boe', 'bof', 'bog', 'boh', 'boi', 'boj', 'bok', 'bol', 'bom', 'bon', 'boo', 'bop', 'boq', 'bor', 'bot', 'bou', 'bov', 'bow', 'box', 'boy', 'boz', 'bpa', 'bpb', 'bpd', 'bpg', 'bph', 'bpi', 'bpj', 'bpk', 'bpl', 'bpm', 'bpn', 'bpo', 'bpp', 'bpq', 'bpr', 'bps', 'bpt', 'bpu', 'bpv', 'bpw', 'bpx', 'bpy', 'bpz', 'bqa', 'bqb', 'bqc', 'bqd', 'bqf', 'bqg', 'bqh', 'bqi', 'bqj', 'bqk', 'bql', 'bqm', 'bqn', 'bqo', 'bqp', 'bqq', 'bqr', 'bqs', 'bqt', 'bqu', 'bqv', 'bqw', 'bqx', 'bqy', 'bqz', 'bra', 'brb', 'brc', 'brd', 'brf', 'brg', 'brh', 'bri', 'brj', 'brk', 'brl', 'brm', 'brn', 'bro', 'brp', 'brq', 'brr', 'brs', 'brt', 'bru', 'brv', 'brw', 'brx', 'bry', 'brz', 'bsa', 'bsb', 'bsc', 'bse', 'bsf', 'bsg', 'bsh', 'bsi', 'bsj', 'bsk', 'bsl', 'bsm', 'bsn', 'bso', 'bsp', 'bsq', 'bsr', 'bss', 'bst', 'bsu', 'bsv', 'bsw', 'bsx', 'bsy', 'bta', 'btb', 'btc', 'btd', 'bte', 'btf', 'btg', 'bth', 'bti', 'btj', 'btk', 'btl', 'btm', 'btn', 'bto', 'btp', 'btq', 'btr', 'bts', 'btt', 'btu', 'btv', 'btw', 'btx', 'bty', 'btz', 'bua', 'bub', 'buc', 'bud', 'bue', 'buf', 'bug', 'buh', 'bui', 'buj', 'buk', 'bum', 'bun', 'buo', 'bup', 'buq', 'bus', 'but', 'buu', 'buv', 'buw', 'bux', 'buy', 'buz', 'bva', 'bvb', 'bvc', 'bvd', 'bve', 'bvf', 'bvg', 'bvh', 'bvi', 'bvj', 'bvk', 'bvl', 'bvm', 'bvn', 'bvo', 'bvp', 'bvq', 'bvr', 'bvt', 'bvu', 'bvv', 'bvw', 'bvx', 'bvy', 'bvz', 'bwa', 'bwb', 'bwc', 'bwd', 'bwe', 'bwf', 'bwg', 'bwh', 'bwi', 'bwj', 'bwk', 'bwl', 'bwm', 'bwn', 'bwo', 'bwp', 'bwq', 'bwr', 'bws', 'bwt', 'bwu', 'bww', 'bwx', 'bwy', 'bwz', 'bxa', 'bxb', 'bxc', 'bxd', 'bxe', 'bxf', 'bxg', 'bxh', 'bxi', 'bxj', 'bxk', 'bxl', 'bxm', 'bxn', 'bxo', 'bxp', 'bxq', 'bxr', 'bxs', 'bxu', 'bxv', 'bxw', 'bxx', 'bxz', 'bya', 'byb', 'byc', 'byd', 'bye', 'byf', 'byg', 'byh', 'byi', 'byj', 'byk', 'byl', 'bym', 'byn', 'byo', 'byp', 'byq', 'byr', 'bys', 'byt', 'byv', 'byw', 'byx', 'byy', 'byz', 'bza', 'bzb', 'bzc', 'bzd', 'bze', 'bzf', 'bzg', 'bzh', 'bzi', 'bzj', 'bzk', 'bzl', 'bzm', 'bzn', 'bzo', 'bzp', 'bzq', 'bzr', 'bzs', 'bzt', 'bzu', 'bzv', 'bzw', 'bzx', 'bzy', 'bzz', 'caa', 'cab', 'cac', 'cad', 'cae', 'caf', 'cag', 'cah', 'cai', 'caj', 'cak', 'cal', 'cam', 'can', 'cao', 'cap', 'caq', 'car', 'cas', 'cau', 'cav', 'caw', 'cax', 'cay', 'caz', 'cba', 'cbb', 'cbc', 'cbd', 'cbe', 'cbg', 'cbh', 'cbi', 'cbj', 'cbk', 'cbl', 'cbn', 'cbo', 'cbq', 'cbr', 'cbs', 'cbt', 'cbu', 'cbv', 'cbw', 'cby', 'cca', 'ccc', 'ccd', 'cce', 'ccg', 'cch', 'ccj', 'ccl', 'ccm', 'ccn', 'cco', 'ccp', 'ccq', 'ccr', 'ccs', 'cda', 'cdc', 'cdd', 'cde', 'cdf', 'cdg', 'cdh', 'cdi', 'cdj', 'cdm', 'cdn', 'cdo', 'cdr', 'cds', 'cdy', 'cdz', 'cea', 'ceb', 'ceg', 'cek', 'cel', 'cen', 'cet', 'cfa', 'cfd', 'cfg', 'cfm', 'cga', 'cgc', 'cgg', 'cgk', 'chb', 'chc', 'chd', 'chf', 'chg', 'chh', 'chj', 'chk', 'chl', 'chm', 'chn', 'cho', 'chp', 'chq', 'chr', 'cht', 'chw', 'chx', 'chy', 'chz', 'cia', 'cib', 'cic', 'cid', 'cie', 'cih', 'cik', 'cim', 'cin', 'cip', 'cir', 'ciw', 'ciy', 'cja', 'cje', 'cjh', 'cji', 'cjk', 'cjm', 'cjn', 'cjo', 'cjp', 'cjr', 'cjs', 'cjv', 'cjy', 'cka', 'ckb', 'ckh', 'ckl', 'ckn', 'cko', 'ckq', 'ckr', 'cks', 'ckt', 'cku', 'ckv', 'ckx', 'cky', 'ckz', 'cla', 'clc', 'cld', 'cle', 'clh', 'cli', 'clj', 'clk', 'cll', 'clm', 'clo', 'clt', 'clu', 'clw', 'cly', 'cma', 'cmc', 'cme', 'cmg', 'cmi', 'cmk', 'cml', 'cmm', 'cmn', 'cmo', 'cmr', 'cms', 'cmt', 'cna', 'cnb', 'cnc', 'cng', 'cnh', 'cni', 'cnk', 'cnl', 'cno', 'cns', 'cnt', 'cnu', 'cnw', 'cnx', 'coa', 'cob', 'coc', 'cod', 'coe', 'cof', 'cog', 'coh', 'coj', 'cok', 'col', 'com', 'con', 'coo', 'cop', 'coq', 'cot', 'cou', 'cov', 'cow', 'cox', 'coy', 'coz', 'cpa', 'cpb', 'cpc', 'cpe', 'cpf', 'cpg', 'cpi', 'cpn', 'cpo', 'cpp', 'cps', 'cpu', 'cpx', 'cpy', 'cqd', 'cqu', 'cra', 'crb', 'crc', 'crd', 'crf', 'crg', 'crh', 'cri', 'crj', 'crk', 'crl', 'crm', 'crn', 'cro', 'crp', 'crq', 'crr', 'crs', 'crt', 'crv', 'crw', 'crx', 'cry', 'crz', 'csa', 'csb', 'csc', 'csd', 'cse', 'csf', 'csg', 'csh', 'csi', 'csj', 'csk', 'csl', 'csm', 'csn', 'cso', 'csq', 'csr', 'css', 'cst', 'csu', 'csv', 'csw', 'csy', 'csz', 'cta', 'ctc', 'ctd', 'cte', 'ctg', 'cth', 'ctl', 'ctm', 'ctn', 'cto', 'ctp', 'cts', 'ctt', 'ctu', 'ctz', 'cua', 'cub', 'cuc', 'cug', 'cuh', 'cui', 'cuj', 'cuk', 'cul', 'cum', 'cuo', 'cup', 'cuq', 'cur', 'cus', 'cut', 'cuu', 'cuv', 'cuw', 'cux', 'cvg', 'cvn', 'cwa', 'cwb', 'cwd', 'cwe', 'cwg', 'cwt', 'cya', 'cyb', 'cyo', 'czh', 'czk', 'czn', 'czo', 'czt', 'daa', 'dac', 'dad', 'dae', 'daf', 'dag', 'dah', 'dai', 'daj', 'dak', 'dal', 'dam', 'dao', 'dap', 'daq', 'dar', 'das', 'dau', 'dav', 'daw', 'dax', 'day', 'daz', 'dba', 'dbb', 'dbd', 'dbe', 'dbf', 'dbg', 'dbi', 'dbj', 'dbl', 'dbm', 'dbn', 'dbo', 'dbp', 'dbq', 'dbr', 'dbt', 'dbu', 'dbv', 'dbw', 'dby', 'dcc', 'dcr', 'dda', 'ddd', 'dde', 'ddg', 'ddi', 'ddj', 'ddn', 'ddo', 'ddr', 'dds', 'ddw', 'dec', 'ded', 'dee', 'def', 'deg', 'deh', 'dei', 'dek', 'del', 'dem', 'den', 'dep', 'deq', 'der', 'des', 'dev', 'dez', 'dga', 'dgb', 'dgc', 'dgd', 'dge', 'dgg', 'dgh', 'dgi', 'dgk', 'dgl', 'dgn', 'dgo', 'dgr', 'dgs', 'dgt', 'dgu', 'dgw', 'dgx', 'dgz', 'dha', 'dhd', 'dhg', 'dhi', 'dhl', 'dhm', 'dhn', 'dho', 'dhr', 'dhs', 'dhu', 'dhv', 'dhw', 'dhx', 'dia', 'dib', 'dic', 'did', 'dif', 'dig', 'dih', 'dii', 'dij', 'dik', 'dil', 'dim', 'din', 'dio', 'dip', 'diq', 'dir', 'dis', 'dit', 'diu', 'diw', 'dix', 'diy', 'diz', 'dja', 'djb', 'djc', 'djd', 'dje', 'djf', 'dji', 'djj', 'djk', 'djl', 'djm', 'djn', 'djo', 'djr', 'dju', 'djw', 'dka', 'dkk', 'dkl', 'dkr', 'dks', 'dkx', 'dlg', 'dlk', 'dlm', 'dln', 'dma', 'dmb', 'dmc', 'dmd', 'dme', 'dmg', 'dmk', 'dml', 'dmm', 'dmn', 'dmo', 'dmr', 'dms', 'dmu', 'dmv', 'dmw', 'dmx', 'dmy', 'dna', 'dnd', 'dne', 'dng', 'dni', 'dnj', 'dnk', 'dnn', 'dnr', 'dnt', 'dnu', 'dnv', 'dnw', 'dny', 'doa', 'dob', 'doc', 'doe', 'dof', 'doh', 'doi', 'dok', 'dol', 'don', 'doo', 'dop', 'doq', 'dor', 'dos', 'dot', 'dov', 'dow', 'dox', 'doy', 'doz', 'dpp', 'dra', 'drb', 'drc', 'drd', 'dre', 'drg', 'drh', 'dri', 'drl', 'drn', 'dro', 'drq', 'drr', 'drs', 'drt', 'dru', 'drw', 'dry', 'dsb', 'dse', 'dsh', 'dsi', 'dsl', 'dsn', 'dso', 'dsq', 'dta', 'dtb', 'dtd', 'dth', 'dti', 'dtk', 'dtm', 'dtn', 'dto', 'dtp', 'dtr', 'dts', 'dtt', 'dtu', 'dty', 'dua', 'dub', 'duc', 'dud', 'due', 'duf', 'dug', 'duh', 'dui', 'duj', 'duk', 'dul', 'dum', 'dun', 'duo', 'dup', 'duq', 'dur', 'dus', 'duu', 'duv', 'duw', 'dux', 'duy', 'duz', 'dva', 'dwa', 'dwl', 'dwr', 'dws', 'dwu', 'dww', 'dwy', 'dya', 'dyb', 'dyd', 'dyg', 'dyi', 'dym', 'dyn', 'dyo', 'dyu', 'dyy', 'dza', 'dzd', 'dze', 'dzg', 'dzl', 'dzn', 'eaa', 'ebg', 'ebk', 'ebo', 'ebr', 'ebu', 'ecr', 'ecs', 'ecy', 'eee', 'efa', 'efe', 'efi', 'ega', 'egl', 'ego', 'egx', 'egy', 'ehu', 'eip', 'eit', 'eiv', 'eja', 'eka', 'ekc', 'eke', 'ekg', 'eki', 'ekk', 'ekl', 'ekm', 'eko', 'ekp', 'ekr', 'eky', 'ele', 'elh', 'eli', 'elk', 'elm', 'elo', 'elp', 'elu', 'elx', 'ema', 'emb', 'eme', 'emg', 'emi', 'emk', 'emm', 'emn', 'emo', 'emp', 'ems', 'emu', 'emw', 'emx', 'emy', 'ena', 'enb', 'enc', 'end', 'enf', 'enh', 'enl', 'enm', 'enn', 'eno', 'enq', 'enr', 'enu', 'env', 'enw', 'enx', 'eot', 'epi', 'era', 'erg', 'erh', 'eri', 'erk', 'ero', 'err', 'ers', 'ert', 'erw', 'ese', 'esg', 'esh', 'esi', 'esk', 'esl', 'esm', 'esn', 'eso', 'esq', 'ess', 'esu', 'esx', 'esy', 'etb', 'etc', 'eth', 'etn', 'eto', 'etr', 'ets', 'ett', 'etu', 'etx', 'etz', 'euq', 'eve', 'evh', 'evn', 'ewo', 'ext', 'eya', 'eyo', 'eza', 'eze', 'faa', 'fab', 'fad', 'faf', 'fag', 'fah', 'fai', 'faj', 'fak', 'fal', 'fam', 'fan', 'fap', 'far', 'fat', 'fau', 'fax', 'fay', 'faz', 'fbl', 'fcs', 'fer', 'ffi', 'ffm', 'fgr', 'fia', 'fie', 'fil', 'fip', 'fir', 'fit', 'fiu', 'fiw', 'fkk', 'fkv', 'fla', 'flh', 'fli', 'fll', 'fln', 'flr', 'fly', 'fmp', 'fmu', 'fnb', 'fng', 'fni', 'fod', 'foi', 'fom', 'fon', 'for', 'fos', 'fox', 'fpe', 'fqs', 'frc', 'frd', 'frk', 'frm', 'fro', 'frp', 'frq', 'frr', 'frs', 'frt', 'fse', 'fsl', 'fss', 'fub', 'fuc', 'fud', 'fue', 'fuf', 'fuh', 'fui', 'fuj', 'fum', 'fun', 'fuq', 'fur', 'fut', 'fuu', 'fuv', 'fuy', 'fvr', 'fwa', 'fwe', 'gaa', 'gab', 'gac', 'gad', 'gae', 'gaf', 'gag', 'gah', 'gai', 'gaj', 'gak', 'gal', 'gam', 'gan', 'gao', 'gap', 'gaq', 'gar', 'gas', 'gat', 'gau', 'gav', 'gaw', 'gax', 'gay', 'gaz', 'gba', 'gbb', 'gbc', 'gbd', 'gbe', 'gbf', 'gbg', 'gbh', 'gbi', 'gbj', 'gbk', 'gbl', 'gbm', 'gbn', 'gbo', 'gbp', 'gbq', 'gbr', 'gbs', 'gbu', 'gbv', 'gbw', 'gbx', 'gby', 'gbz', 'gcc', 'gcd', 'gce', 'gcf', 'gcl', 'gcn', 'gcr', 'gct', 'gda', 'gdb', 'gdc', 'gdd', 'gde', 'gdf', 'gdg', 'gdh', 'gdi', 'gdj', 'gdk', 'gdl', 'gdm', 'gdn', 'gdo', 'gdq', 'gdr', 'gds', 'gdt', 'gdu', 'gdx', 'gea', 'geb', 'gec', 'ged', 'geg', 'geh', 'gei', 'gej', 'gek', 'gel', 'gem', 'geq', 'ges', 'gev', 'gew', 'gex', 'gey', 'gez', 'gfk', 'gft', 'gfx', 'gga', 'ggb', 'ggd', 'gge', 'ggg', 'ggk', 'ggl', 'ggn', 'ggo', 'ggr', 'ggt', 'ggu', 'ggw', 'gha', 'ghc', 'ghe', 'ghh', 'ghk', 'ghl', 'ghn', 'gho', 'ghr', 'ghs', 'ght', 'gia', 'gib', 'gic', 'gid', 'gie', 'gig', 'gih', 'gil', 'gim', 'gin', 'gio', 'gip', 'giq', 'gir', 'gis', 'git', 'giu', 'giw', 'gix', 'giy', 'giz', 'gji', 'gjk', 'gjm', 'gjn', 'gjr', 'gju', 'gka', 'gke', 'gkn', 'gko', 'gkp', 'gku', 'glc', 'gld', 'glh', 'gli', 'glj', 'glk', 'gll', 'glo', 'glr', 'glu', 'glw', 'gly', 'gma', 'gmb', 'gmd', 'gme', 'gmg', 'gmh', 'gml', 'gmm', 'gmn', 'gmq', 'gmu', 'gmv', 'gmw', 'gmx', 'gmy', 'gmz', 'gna', 'gnb', 'gnc', 'gnd', 'gne', 'gng', 'gnh', 'gni', 'gnk', 'gnl', 'gnm', 'gnn', 'gno', 'gnq', 'gnr', 'gnt', 'gnu', 'gnw', 'gnz', 'goa', 'gob', 'goc', 'god', 'goe', 'gof', 'gog', 'goh', 'goi', 'goj', 'gok', 'gol', 'gom', 'gon', 'goo', 'gop', 'goq', 'gor', 'gos', 'got', 'gou', 'gow', 'gox', 'goy', 'goz', 'gpa', 'gpe', 'gpn', 'gqa', 'gqi', 'gqn', 'gqr', 'gqu', 'gra', 'grb', 'grc', 'grd', 'grg', 'grh', 'gri', 'grj', 'grk', 'grm', 'gro', 'grq', 'grr', 'grs', 'grt', 'gru', 'grv', 'grw', 'grx', 'gry', 'grz', 'gse', 'gsg', 'gsl', 'gsm', 'gsn', 'gso', 'gsp', 'gss', 'gsw', 'gta', 'gti', 'gtu', 'gua', 'gub', 'guc', 'gud', 'gue', 'guf', 'gug', 'guh', 'gui', 'guk', 'gul', 'gum', 'gun', 'guo', 'gup', 'guq', 'gur', 'gus', 'gut', 'guu', 'guv', 'guw', 'gux', 'guz', 'gva', 'gvc', 'gve', 'gvf', 'gvj', 'gvl', 'gvm', 'gvn', 'gvo', 'gvp', 'gvr', 'gvs', 'gvy', 'gwa', 'gwb', 'gwc', 'gwd', 'gwe', 'gwf', 'gwg', 'gwi', 'gwj', 'gwm', 'gwn', 'gwr', 'gwt', 'gwu', 'gww', 'gwx', 'gxx', 'gya', 'gyb', 'gyd', 'gye', 'gyf', 'gyg', 'gyi', 'gyl', 'gym', 'gyn', 'gyr', 'gyy', 'gza', 'gzi', 'gzn', 'haa', 'hab', 'hac', 'had', 'hae', 'haf', 'hag', 'hah', 'hai', 'haj', 'hak', 'hal', 'ham', 'han', 'hao', 'hap', 'haq', 'har', 'has', 'hav', 'haw', 'hax', 'hay', 'haz', 'hba', 'hbb', 'hbn', 'hbo', 'hbu', 'hca', 'hch', 'hdn', 'hds', 'hdy', 'hea', 'hed', 'heg', 'heh', 'hei', 'hem', 'hgm', 'hgw', 'hhi', 'hhr', 'hhy', 'hia', 'hib', 'hid', 'hif', 'hig', 'hih', 'hii', 'hij', 'hik', 'hil', 'him', 'hio', 'hir', 'hit', 'hiw', 'hix', 'hji', 'hka', 'hke', 'hkk', 'hks', 'hla', 'hlb', 'hld', 'hle', 'hlt', 'hlu', 'hma', 'hmb', 'hmc', 'hmd', 'hme', 'hmf', 'hmg', 'hmh', 'hmi', 'hmj', 'hmk', 'hml', 'hmm', 'hmn', 'hmp', 'hmq', 'hmr', 'hms', 'hmt', 'hmu', 'hmv', 'hmw', 'hmx', 'hmy', 'hmz', 'hna', 'hnd', 'hne', 'hnh', 'hni', 'hnj', 'hnn', 'hno', 'hns', 'hnu', 'hoa', 'hob', 'hoc', 'hod', 'hoe', 'hoh', 'hoi', 'hoj', 'hok', 'hol', 'hom', 'hoo', 'hop', 'hor', 'hos', 'hot', 'hov', 'how', 'hoy', 'hoz', 'hpo', 'hps', 'hra', 'hrc', 'hre', 'hrk', 'hrm', 'hro', 'hrp', 'hrr', 'hrt', 'hru', 'hrw', 'hrx', 'hrz', 'hsb', 'hsh', 'hsl', 'hsn', 'hss', 'hti', 'hto', 'hts', 'htu', 'htx', 'hub', 'huc', 'hud', 'hue', 'huf', 'hug', 'huh', 'hui', 'huj', 'huk', 'hul', 'hum', 'huo', 'hup', 'huq', 'hur', 'hus', 'hut', 'huu', 'huv', 'huw', 'hux', 'huy', 'huz', 'hvc', 'hve', 'hvk', 'hvn', 'hvv', 'hwa', 'hwc', 'hwo', 'hya', 'hyx', 'iai', 'ian', 'iap', 'iar', 'iba', 'ibb', 'ibd', 'ibe', 'ibg', 'ibh', 'ibi', 'ibl', 'ibm', 'ibn', 'ibr', 'ibu', 'iby', 'ica', 'ich', 'icl', 'icr', 'ida', 'idb', 'idc', 'idd', 'ide', 'idi', 'idr', 'ids', 'idt', 'idu', 'ifa', 'ifb', 'ife', 'iff', 'ifk', 'ifm', 'ifu', 'ify', 'igb', 'ige', 'igg', 'igl', 'igm', 'ign', 'igo', 'igs', 'igw', 'ihb', 'ihi', 'ihp', 'ihw', 'iin', 'iir', 'ijc', 'ije', 'ijj', 'ijn', 'ijo', 'ijs', 'ike', 'iki', 'ikk', 'ikl', 'iko', 'ikp', 'ikr', 'iks', 'ikt', 'ikv', 'ikw', 'ikx', 'ikz', 'ila', 'ilb', 'ilg', 'ili', 'ilk', 'ill', 'ilm', 'ilo', 'ilp', 'ils', 'ilu', 'ilv', 'ilw', 'ima', 'ime', 'imi', 'iml', 'imn', 'imo', 'imr', 'ims', 'imy', 'inb', 'inc', 'ine', 'ing', 'inh', 'inj', 'inl', 'inm', 'inn', 'ino', 'inp', 'ins', 'int', 'inz', 'ior', 'iou', 'iow', 'ipi', 'ipo', 'iqu', 'iqw', 'ira', 'ire', 'irh', 'iri', 'irk', 'irn', 'iro', 'irr', 'iru', 'irx', 'iry', 'isa', 'isc', 'isd', 'ise', 'isg', 'ish', 'isi', 'isk', 'ism', 'isn', 'iso', 'isr', 'ist', 'isu', 'itb', 'itc', 'itd', 'ite', 'iti', 'itk', 'itl', 'itm', 'ito', 'itr', 'its', 'itt', 'itv', 'itw', 'itx', 'ity', 'itz', 'ium', 'ivb', 'ivv', 'iwk', 'iwm', 'iwo', 'iws', 'ixc', 'ixl', 'iya', 'iyo', 'iyx', 'izh', 'izi', 'izr', 'izz', 'jaa', 'jab', 'jac', 'jad', 'jae', 'jaf', 'jah', 'jaj', 'jak', 'jal', 'jam', 'jan', 'jao', 'jaq', 'jar', 'jas', 'jat', 'jau', 'jax', 'jay', 'jaz', 'jbe', 'jbi', 'jbj', 'jbk', 'jbn', 'jbo', 'jbr', 'jbt', 'jbu', 'jbw', 'jcs', 'jct', 'jda', 'jdg', 'jdt', 'jeb', 'jee', 'jeg', 'jeh', 'jei', 'jek', 'jel', 'jen', 'jer', 'jet', 'jeu', 'jgb', 'jge', 'jgk', 'jgo', 'jhi', 'jhs', 'jia', 'jib', 'jic', 'jid', 'jie', 'jig', 'jih', 'jii', 'jil', 'jim', 'jio', 'jiq', 'jit', 'jiu', 'jiv', 'jiy', 'jje', 'jjr', 'jka', 'jkm', 'jko', 'jkp', 'jkr', 'jku', 'jle', 'jls', 'jma', 'jmb', 'jmc', 'jmd', 'jmi', 'jml', 'jmn', 'jmr', 'jms', 'jmw', 'jmx', 'jna', 'jnd', 'jng', 'jni', 'jnj', 'jnl', 'jns', 'job', 'jod', 'jog', 'jor', 'jos', 'jow', 'jpa', 'jpr', 'jpx', 'jqr', 'jra', 'jrb', 'jrr', 'jrt', 'jru', 'jsl', 'jua', 'jub', 'juc', 'jud', 'juh', 'jui', 'juk', 'jul', 'jum', 'jun', 'juo', 'jup', 'jur', 'jus', 'jut', 'juu', 'juw', 'juy', 'jvd', 'jvn', 'jwi', 'jya', 'jye', 'jyy', 'kaa', 'kab', 'kac', 'kad', 'kae', 'kaf', 'kag', 'kah', 'kai', 'kaj', 'kak', 'kam', 'kao', 'kap', 'kaq', 'kar', 'kav', 'kaw', 'kax', 'kay', 'kba', 'kbb', 'kbc', 'kbd', 'kbe', 'kbf', 'kbg', 'kbh', 'kbi', 'kbj', 'kbk', 'kbl', 'kbm', 'kbn', 'kbo', 'kbp', 'kbq', 'kbr', 'kbs', 'kbt', 'kbu', 'kbv', 'kbw', 'kbx', 'kby', 'kbz', 'kca', 'kcb', 'kcc', 'kcd', 'kce', 'kcf', 'kcg', 'kch', 'kci', 'kcj', 'kck', 'kcl', 'kcm', 'kcn', 'kco', 'kcp', 'kcq', 'kcr', 'kcs', 'kct', 'kcu', 'kcv', 'kcw', 'kcx', 'kcy', 'kcz', 'kda', 'kdc', 'kdd', 'kde', 'kdf', 'kdg', 'kdh', 'kdi', 'kdj', 'kdk', 'kdl', 'kdm', 'kdn', 'kdo', 'kdp', 'kdq', 'kdr', 'kdt', 'kdu', 'kdv', 'kdw', 'kdx', 'kdy', 'kdz', 'kea', 'keb', 'kec', 'ked', 'kee', 'kef', 'keg', 'keh', 'kei', 'kej', 'kek', 'kel', 'kem', 'ken', 'keo', 'kep', 'keq', 'ker', 'kes', 'ket', 'keu', 'kev', 'kew', 'kex', 'key', 'kez', 'kfa', 'kfb', 'kfc', 'kfd', 'kfe', 'kff', 'kfg', 'kfh', 'kfi', 'kfj', 'kfk', 'kfl', 'kfm', 'kfn', 'kfo', 'kfp', 'kfq', 'kfr', 'kfs', 'kft', 'kfu', 'kfv', 'kfw', 'kfx', 'kfy', 'kfz', 'kga', 'kgb', 'kgc', 'kgd', 'kge', 'kgf', 'kgg', 'kgh', 'kgi', 'kgj', 'kgk', 'kgl', 'kgm', 'kgn', 'kgo', 'kgp', 'kgq', 'kgr', 'kgs', 'kgt', 'kgu', 'kgv', 'kgw', 'kgx', 'kgy', 'kha', 'khb', 'khc', 'khd', 'khe', 'khf', 'khg', 'khh', 'khi', 'khj', 'khk', 'khl', 'khn', 'kho', 'khp', 'khq', 'khr', 'khs', 'kht', 'khu', 'khv', 'khw', 'khx', 'khy', 'khz', 'kia', 'kib', 'kic', 'kid', 'kie', 'kif', 'kig', 'kih', 'kii', 'kij', 'kil', 'kim', 'kio', 'kip', 'kiq', 'kis', 'kit', 'kiu', 'kiv', 'kiw', 'kix', 'kiy', 'kiz', 'kja', 'kjb', 'kjc', 'kjd', 'kje', 'kjf', 'kjg', 'kjh', 'kji', 'kjj', 'kjk', 'kjl', 'kjm', 'kjn', 'kjo', 'kjp', 'kjq', 'kjr', 'kjs', 'kjt', 'kju', 'kjv', 'kjx', 'kjy', 'kjz', 'kka', 'kkb', 'kkc', 'kkd', 'kke', 'kkf', 'kkg', 'kkh', 'kki', 'kkj', 'kkk', 'kkl', 'kkm', 'kkn', 'kko', 'kkp', 'kkq', 'kkr', 'kks', 'kkt', 'kku', 'kkv', 'kkw', 'kkx', 'kky', 'kkz', 'kla', 'klb', 'klc', 'kld', 'kle', 'klf', 'klg', 'klh', 'kli', 'klj', 'klk', 'kll', 'klm', 'kln', 'klo', 'klp', 'klq', 'klr', 'kls', 'klt', 'klu', 'klv', 'klw', 'klx', 'kly', 'klz', 'kma', 'kmb', 'kmc', 'kmd', 'kme', 'kmf', 'kmg', 'kmh', 'kmi', 'kmj', 'kmk', 'kml', 'kmm', 'kmn', 'kmo', 'kmp', 'kmq', 'kmr', 'kms', 'kmt', 'kmu', 'kmv', 'kmw', 'kmx', 'kmy', 'kmz', 'kna', 'knb', 'knc', 'knd', 'kne', 'knf', 'kng', 'kni', 'knj', 'knk', 'knl', 'knm', 'knn', 'kno', 'knp', 'knq', 'knr', 'kns', 'knt', 'knu', 'knv', 'knw', 'knx', 'kny', 'knz', 'koa', 'koc', 'kod', 'koe', 'kof', 'kog', 'koh', 'koi', 'koj', 'kok', 'kol', 'koo', 'kop', 'koq', 'kos', 'kot', 'kou', 'kov', 'kow', 'kox', 'koy', 'koz', 'kpa', 'kpb', 'kpc', 'kpd', 'kpe', 'kpf', 'kpg', 'kph', 'kpi', 'kpj', 'kpk', 'kpl', 'kpm', 'kpn', 'kpo', 'kpp', 'kpq', 'kpr', 'kps', 'kpt', 'kpu', 'kpv', 'kpw', 'kpx', 'kpy', 'kpz', 'kqa', 'kqb', 'kqc', 'kqd', 'kqe', 'kqf', 'kqg', 'kqh', 'kqi', 'kqj', 'kqk', 'kql', 'kqm', 'kqn', 'kqo', 'kqp', 'kqq', 'kqr', 'kqs', 'kqt', 'kqu', 'kqv', 'kqw', 'kqx', 'kqy', 'kqz', 'kra', 'krb', 'krc', 'krd', 'kre', 'krf', 'krh', 'kri', 'krj', 'krk', 'krl', 'krm', 'krn', 'kro', 'krp', 'krr', 'krs', 'krt', 'kru', 'krv', 'krw', 'krx', 'kry', 'krz', 'ksa', 'ksb', 'ksc', 'ksd', 'kse', 'ksf', 'ksg', 'ksh', 'ksi', 'ksj', 'ksk', 'ksl', 'ksm', 'ksn', 'kso', 'ksp', 'ksq', 'ksr', 'kss', 'kst', 'ksu', 'ksv', 'ksw', 'ksx', 'ksy', 'ksz', 'kta', 'ktb', 'ktc', 'ktd', 'kte', 'ktf', 'ktg', 'kth', 'kti', 'ktj', 'ktk', 'ktl', 'ktm', 'ktn', 'kto', 'ktp', 'ktq', 'ktr', 'kts', 'ktt', 'ktu', 'ktv', 'ktw', 'ktx', 'kty', 'ktz', 'kub', 'kuc', 'kud', 'kue', 'kuf', 'kug', 'kuh', 'kui', 'kuj', 'kuk', 'kul', 'kum', 'kun', 'kuo', 'kup', 'kuq', 'kus', 'kut', 'kuu', 'kuv', 'kuw', 'kux', 'kuy', 'kuz', 'kva', 'kvb', 'kvc', 'kvd', 'kve', 'kvf', 'kvg', 'kvh', 'kvi', 'kvj', 'kvk', 'kvl', 'kvm', 'kvn', 'kvo', 'kvp', 'kvq', 'kvr', 'kvs', 'kvt', 'kvu', 'kvv', 'kvw', 'kvx', 'kvy', 'kvz', 'kwa', 'kwb', 'kwc', 'kwd', 'kwe', 'kwf', 'kwg', 'kwh', 'kwi', 'kwj', 'kwk', 'kwl', 'kwm', 'kwn', 'kwo', 'kwp', 'kwq', 'kwr', 'kws', 'kwt', 'kwu', 'kwv', 'kww', 'kwx', 'kwy', 'kwz', 'kxa', 'kxb', 'kxc', 'kxd', 'kxe', 'kxf', 'kxh', 'kxi', 'kxj', 'kxk', 'kxl', 'kxm', 'kxn', 'kxo', 'kxp', 'kxq', 'kxr', 'kxs', 'kxt', 'kxu', 'kxv', 'kxw', 'kxx', 'kxy', 'kxz', 'kya', 'kyb', 'kyc', 'kyd', 'kye', 'kyf', 'kyg', 'kyh', 'kyi', 'kyj', 'kyk', 'kyl', 'kym', 'kyn', 'kyo', 'kyp', 'kyq', 'kyr', 'kys', 'kyt', 'kyu', 'kyv', 'kyw', 'kyx', 'kyy', 'kyz', 'kza', 'kzb', 'kzc', 'kzd', 'kze', 'kzf', 'kzg', 'kzh', 'kzi', 'kzj', 'kzk', 'kzl', 'kzm', 'kzn', 'kzo', 'kzp', 'kzq', 'kzr', 'kzs', 'kzt', 'kzu', 'kzv', 'kzw', 'kzx', 'kzy', 'kzz', 'laa', 'lab', 'lac', 'lad', 'lae', 'laf', 'lag', 'lah', 'lai', 'laj', 'lak', 'lal', 'lam', 'lan', 'lap', 'laq', 'lar', 'las', 'lau', 'law', 'lax', 'lay', 'laz', 'lba', 'lbb', 'lbc', 'lbe', 'lbf', 'lbg', 'lbi', 'lbj', 'lbk', 'lbl', 'lbm', 'lbn', 'lbo', 'lbq', 'lbr', 'lbs', 'lbt', 'lbu', 'lbv', 'lbw', 'lbx', 'lby', 'lbz', 'lcc', 'lcd', 'lce', 'lcf', 'lch', 'lcl', 'lcm', 'lcp', 'lcq', 'lcs', 'lda', 'ldb', 'ldd', 'ldg', 'ldh', 'ldi', 'ldj', 'ldk', 'ldl', 'ldm', 'ldn', 'ldo', 'ldp', 'ldq', 'lea', 'leb', 'lec', 'led', 'lee', 'lef', 'leg', 'leh', 'lei', 'lej', 'lek', 'lel', 'lem', 'len', 'leo', 'lep', 'leq', 'ler', 'les', 'let', 'leu', 'lev', 'lew', 'lex', 'ley', 'lez', 'lfa', 'lfn', 'lga', 'lgb', 'lgg', 'lgh', 'lgi', 'lgk', 'lgl', 'lgm', 'lgn', 'lgq', 'lgr', 'lgt', 'lgu', 'lgz', 'lha', 'lhh', 'lhi', 'lhl', 'lhm', 'lhn', 'lhp', 'lhs', 'lht', 'lhu', 'lia', 'lib', 'lic', 'lid', 'lie', 'lif', 'lig', 'lih', 'lii', 'lij', 'lik', 'lil', 'lio', 'lip', 'liq', 'lir', 'lis', 'liu', 'liv', 'liw', 'lix', 'liy', 'liz', 'lja', 'lje', 'lji', 'ljl', 'ljp', 'ljw', 'ljx', 'lka', 'lkb', 'lkc', 'lkd', 'lke', 'lkh', 'lki', 'lkj', 'lkl', 'lkm', 'lkn', 'lko', 'lkr', 'lks', 'lkt', 'lku', 'lky', 'lla', 'llb', 'llc', 'lld', 'lle', 'llf', 'llg', 'llh', 'lli', 'llj', 'llk', 'lll', 'llm', 'lln', 'llo', 'llp', 'llq', 'lls', 'llu', 'llx', 'lma', 'lmb', 'lmc', 'lmd', 'lme', 'lmf', 'lmg', 'lmh', 'lmi', 'lmj', 'lmk', 'lml', 'lmm', 'lmn', 'lmo', 'lmp', 'lmq', 'lmr', 'lmu', 'lmv', 'lmw', 'lmx', 'lmy', 'lmz', 'lna', 'lnb', 'lnd', 'lng', 'lnh', 'lni', 'lnj', 'lnl', 'lnm', 'lnn', 'lno', 'lns', 'lnu', 'lnw', 'lnz', 'loa', 'lob', 'loc', 'loe', 'lof', 'log', 'loh', 'loi', 'loj', 'lok', 'lol', 'lom', 'lon', 'loo', 'lop', 'loq', 'lor', 'los', 'lot', 'lou', 'lov', 'low', 'lox', 'loy', 'loz', 'lpa', 'lpe', 'lpn', 'lpo', 'lpx', 'lra', 'lrc', 'lre', 'lrg', 'lri', 'lrk', 'lrl', 'lrm', 'lrn', 'lro', 'lrr', 'lrt', 'lrv', 'lrz', 'lsa', 'lsd', 'lse', 'lsg', 'lsh', 'lsi', 'lsl', 'lsm', 'lso', 'lsp', 'lsr', 'lss', 'lst', 'lsy', 'ltc', 'ltg', 'lth', 'lti', 'ltn', 'lto', 'lts', 'ltu', 'lua', 'luc', 'lud', 'lue', 'luf', 'lui', 'luj', 'luk', 'lul', 'lum', 'lun', 'luo', 'lup', 'luq', 'lur', 'lus', 'lut', 'luu', 'luv', 'luw', 'luy', 'luz', 'lva', 'lvk', 'lvs', 'lvu', 'lwa', 'lwe', 'lwg', 'lwh', 'lwl', 'lwm', 'lwo', 'lwt', 'lwu', 'lww', 'lya', 'lyg', 'lyn', 'lzh', 'lzl', 'lzn', 'lzz', 'maa', 'mab', 'mad', 'mae', 'maf', 'mag', 'mai', 'maj', 'mak', 'mam', 'man', 'map', 'maq', 'mas', 'mat', 'mau', 'mav', 'maw', 'max', 'maz', 'mba', 'mbb', 'mbc', 'mbd', 'mbe', 'mbf', 'mbh', 'mbi', 'mbj', 'mbk', 'mbl', 'mbm', 'mbn', 'mbo', 'mbp', 'mbq', 'mbr', 'mbs', 'mbt', 'mbu', 'mbv', 'mbw', 'mbx', 'mby', 'mbz', 'mca', 'mcb', 'mcc', 'mcd', 'mce', 'mcf', 'mcg', 'mch', 'mci', 'mcj', 'mck', 'mcl', 'mcm', 'mcn', 'mco', 'mcp', 'mcq', 'mcr', 'mcs', 'mct', 'mcu', 'mcv', 'mcw', 'mcx', 'mcy', 'mcz', 'mda', 'mdb', 'mdc', 'mdd', 'mde', 'mdf', 'mdg', 'mdh', 'mdi', 'mdj', 'mdk', 'mdl', 'mdm', 'mdn', 'mdp', 'mdq', 'mdr', 'mds', 'mdt', 'mdu', 'mdv', 'mdw', 'mdx', 'mdy', 'mdz', 'mea', 'meb', 'mec', 'med', 'mee', 'mef', 'meg', 'meh', 'mei', 'mej', 'mek', 'mel', 'mem', 'men', 'meo', 'mep', 'meq', 'mer', 'mes', 'met', 'meu', 'mev', 'mew', 'mey', 'mez', 'mfa', 'mfb', 'mfc', 'mfd', 'mfe', 'mff', 'mfg', 'mfh', 'mfi', 'mfj', 'mfk', 'mfl', 'mfm', 'mfn', 'mfo', 'mfp', 'mfq', 'mfr', 'mfs', 'mft', 'mfu', 'mfv', 'mfw', 'mfx', 'mfy', 'mfz', 'mga', 'mgb', 'mgc', 'mgd', 'mge', 'mgf', 'mgg', 'mgh', 'mgi', 'mgj', 'mgk', 'mgl', 'mgm', 'mgn', 'mgo', 'mgp', 'mgq', 'mgr', 'mgs', 'mgt', 'mgu', 'mgv', 'mgw', 'mgx', 'mgy', 'mgz', 'mha', 'mhb', 'mhc', 'mhd', 'mhe', 'mhf', 'mhg', 'mhh', 'mhi', 'mhj', 'mhk', 'mhl', 'mhm', 'mhn', 'mho', 'mhp', 'mhq', 'mhr', 'mhs', 'mht', 'mhu', 'mhw', 'mhx', 'mhy', 'mhz', 'mia', 'mib', 'mic', 'mid', 'mie', 'mif', 'mig', 'mih', 'mii', 'mij', 'mik', 'mil', 'mim', 'min', 'mio', 'mip', 'miq', 'mir', 'mis', 'mit', 'miu', 'miw', 'mix', 'miy', 'miz', 'mja', 'mjb', 'mjc', 'mjd', 'mje', 'mjg', 'mjh', 'mji', 'mjj', 'mjk', 'mjl', 'mjm', 'mjn', 'mjo', 'mjp', 'mjq', 'mjr', 'mjs', 'mjt', 'mju', 'mjv', 'mjw', 'mjx', 'mjy', 'mjz', 'mka', 'mkb', 'mkc', 'mke', 'mkf', 'mkg', 'mkh', 'mki', 'mkj', 'mkk', 'mkl', 'mkm', 'mkn', 'mko', 'mkp', 'mkq', 'mkr', 'mks', 'mkt', 'mku', 'mkv', 'mkw', 'mkx', 'mky', 'mkz', 'mla', 'mlb', 'mlc', 'mld', 'mle', 'mlf', 'mlh', 'mli', 'mlj', 'mlk', 'mll', 'mlm', 'mln', 'mlo', 'mlp', 'mlq', 'mlr', 'mls', 'mlu', 'mlv', 'mlw', 'mlx', 'mlz', 'mma', 'mmb', 'mmc', 'mmd', 'mme', 'mmf', 'mmg', 'mmh', 'mmi', 'mmj', 'mmk', 'mml', 'mmm', 'mmn', 'mmo', 'mmp', 'mmq', 'mmr', 'mmt', 'mmu', 'mmv', 'mmw', 'mmx', 'mmy', 'mmz', 'mna', 'mnb', 'mnc', 'mnd', 'mne', 'mnf', 'mng', 'mnh', 'mni', 'mnj', 'mnk', 'mnl', 'mnm', 'mnn', 'mno', 'mnp', 'mnq', 'mnr', 'mns', 'mnt', 'mnu', 'mnv', 'mnw', 'mnx', 'mny', 'mnz', 'moa', 'moc', 'mod', 'moe', 'mof', 'mog', 'moh', 'moi', 'moj', 'mok', 'mom', 'moo', 'mop', 'moq', 'mor', 'mos', 'mot', 'mou', 'mov', 'mow', 'mox', 'moy', 'moz', 'mpa', 'mpb', 'mpc', 'mpd', 'mpe', 'mpg', 'mph', 'mpi', 'mpj', 'mpk', 'mpl', 'mpm', 'mpn', 'mpo', 'mpp', 'mpq', 'mpr', 'mps', 'mpt', 'mpu', 'mpv', 'mpw', 'mpx', 'mpy', 'mpz', 'mqa', 'mqb', 'mqc', 'mqe', 'mqf', 'mqg', 'mqh', 'mqi', 'mqj', 'mqk', 'mql', 'mqm', 'mqn', 'mqo', 'mqp', 'mqq', 'mqr', 'mqs', 'mqt', 'mqu', 'mqv', 'mqw', 'mqx', 'mqy', 'mqz', 'mra', 'mrb', 'mrc', 'mrd', 'mre', 'mrf', 'mrg', 'mrh', 'mrj', 'mrk', 'mrl', 'mrm', 'mrn', 'mro', 'mrp', 'mrq', 'mrr', 'mrs', 'mrt', 'mru', 'mrv', 'mrw', 'mrx', 'mry', 'mrz', 'msb', 'msc', 'msd', 'mse', 'msf', 'msg', 'msh', 'msi', 'msj', 'msk', 'msl', 'msm', 'msn', 'mso', 'msp', 'msq', 'msr', 'mss', 'mst', 'msu', 'msv', 'msw', 'msx', 'msy', 'msz', 'mta', 'mtb', 'mtc', 'mtd', 'mte', 'mtf', 'mtg', 'mth', 'mti', 'mtj', 'mtk', 'mtl', 'mtm', 'mtn', 'mto', 'mtp', 'mtq', 'mtr', 'mts', 'mtt', 'mtu', 'mtv', 'mtw', 'mtx', 'mty', 'mua', 'mub', 'muc', 'mud', 'mue', 'mug', 'muh', 'mui', 'muj', 'muk', 'mul', 'mum', 'mun', 'muo', 'mup', 'muq', 'mur', 'mus', 'mut', 'muu', 'muv', 'mux', 'muy', 'muz', 'mva', 'mvb', 'mvd', 'mve', 'mvf', 'mvg', 'mvh', 'mvi', 'mvk', 'mvl', 'mvm', 'mvn', 'mvo', 'mvp', 'mvq', 'mvr', 'mvs', 'mvt', 'mvu', 'mvv', 'mvw', 'mvx', 'mvy', 'mvz', 'mwa', 'mwb', 'mwc', 'mwd', 'mwe', 'mwf', 'mwg', 'mwh', 'mwi', 'mwj', 'mwk', 'mwl', 'mwm', 'mwn', 'mwo', 'mwp', 'mwq', 'mwr', 'mws', 'mwt', 'mwu', 'mwv', 'mww', 'mwx', 'mwy', 'mwz', 'mxa', 'mxb', 'mxc', 'mxd', 'mxe', 'mxf', 'mxg', 'mxh', 'mxi', 'mxj', 'mxk', 'mxl', 'mxm', 'mxn', 'mxo', 'mxp', 'mxq', 'mxr', 'mxs', 'mxt', 'mxu', 'mxv', 'mxw', 'mxx', 'mxy', 'mxz', 'myb', 'myc', 'myd', 'mye', 'myf', 'myg', 'myh', 'myi', 'myj', 'myk', 'myl', 'mym', 'myn', 'myo', 'myp', 'myq', 'myr', 'mys', 'myt', 'myu', 'myv', 'myw', 'myx', 'myy', 'myz', 'mza', 'mzb', 'mzc', 'mzd', 'mze', 'mzg', 'mzh', 'mzi', 'mzj', 'mzk', 'mzl', 'mzm', 'mzn', 'mzo', 'mzp', 'mzq', 'mzr', 'mzs', 'mzt', 'mzu', 'mzv', 'mzw', 'mzx', 'mzy', 'mzz', 'naa', 'nab', 'nac', 'nad', 'nae', 'naf', 'nag', 'nah', 'nai', 'naj', 'nak', 'nal', 'nam', 'nan', 'nao', 'nap', 'naq', 'nar', 'nas', 'nat', 'naw', 'nax', 'nay', 'naz', 'nba', 'nbb', 'nbc', 'nbd', 'nbe', 'nbf', 'nbg', 'nbh', 'nbi', 'nbj', 'nbk', 'nbm', 'nbn', 'nbo', 'nbp', 'nbq', 'nbr', 'nbs', 'nbt', 'nbu', 'nbv', 'nbw', 'nbx', 'nby', 'nca', 'ncb', 'ncc', 'ncd', 'nce', 'ncf', 'ncg', 'nch', 'nci', 'ncj', 'nck', 'ncl', 'ncm', 'ncn', 'nco', 'ncp', 'ncq', 'ncr', 'ncs', 'nct', 'ncu', 'ncx', 'ncz', 'nda', 'ndb', 'ndc', 'ndd', 'ndf', 'ndg', 'ndh', 'ndi', 'ndj', 'ndk', 'ndl', 'ndm', 'ndn', 'ndp', 'ndq', 'ndr', 'nds', 'ndt', 'ndu', 'ndv', 'ndw', 'ndx', 'ndy', 'ndz', 'nea', 'neb', 'nec', 'ned', 'nee', 'nef', 'neg', 'neh', 'nei', 'nej', 'nek', 'nem', 'nen', 'neo', 'neq', 'ner', 'nes', 'net', 'neu', 'nev', 'new', 'nex', 'ney', 'nez', 'nfa', 'nfd', 'nfl', 'nfr', 'nfu', 'nga', 'ngb', 'ngc', 'ngd', 'nge', 'ngf', 'ngg', 'ngh', 'ngi', 'ngj', 'ngk', 'ngl', 'ngm', 'ngn', 'ngo', 'ngp', 'ngq', 'ngr', 'ngs', 'ngt', 'ngu', 'ngv', 'ngw', 'ngx', 'ngy', 'ngz', 'nha', 'nhb', 'nhc', 'nhd', 'nhe', 'nhf', 'nhg', 'nhh', 'nhi', 'nhk', 'nhm', 'nhn', 'nho', 'nhp', 'nhq', 'nhr', 'nht', 'nhu', 'nhv', 'nhw', 'nhx', 'nhy', 'nhz', 'nia', 'nib', 'nic', 'nid', 'nie', 'nif', 'nig', 'nih', 'nii', 'nij', 'nik', 'nil', 'nim', 'nin', 'nio', 'niq', 'nir', 'nis', 'nit', 'niu', 'niv', 'niw', 'nix', 'niy', 'niz', 'nja', 'njb', 'njd', 'njh', 'nji', 'njj', 'njl', 'njm', 'njn', 'njo', 'njr', 'njs', 'njt', 'nju', 'njx', 'njy', 'njz', 'nka', 'nkb', 'nkc', 'nkd', 'nke', 'nkf', 'nkg', 'nkh', 'nki', 'nkj', 'nkk', 'nkm', 'nkn', 'nko', 'nkp', 'nkq', 'nkr', 'nks', 'nkt', 'nku', 'nkv', 'nkw', 'nkx', 'nkz', 'nla', 'nlc', 'nle', 'nlg', 'nli', 'nlj', 'nlk', 'nll', 'nln', 'nlo', 'nlq', 'nlr', 'nlu', 'nlv', 'nlw', 'nlx', 'nly', 'nlz', 'nma', 'nmb', 'nmc', 'nmd', 'nme', 'nmf', 'nmg', 'nmh', 'nmi', 'nmj', 'nmk', 'nml', 'nmm', 'nmn', 'nmo', 'nmp', 'nmq', 'nmr', 'nms', 'nmt', 'nmu', 'nmv', 'nmw', 'nmx', 'nmy', 'nmz', 'nna', 'nnb', 'nnc', 'nnd', 'nne', 'nnf', 'nng', 'nnh', 'nni', 'nnj', 'nnk', 'nnl', 'nnm', 'nnn', 'nnp', 'nnq', 'nnr', 'nns', 'nnt', 'nnu', 'nnv', 'nnw', 'nnx', 'nny', 'nnz', 'noa', 'noc', 'nod', 'noe', 'nof', 'nog', 'noh', 'noi', 'noj', 'nok', 'nol', 'nom', 'non', 'noo', 'nop', 'noq', 'nos', 'not', 'nou', 'nov', 'now', 'noy', 'noz', 'npa', 'npb', 'npg', 'nph', 'npi', 'npl', 'npn', 'npo', 'nps', 'npu', 'npx', 'npy', 'nqg', 'nqk', 'nql', 'nqm', 'nqn', 'nqo', 'nqq', 'nqy', 'nra', 'nrb', 'nrc', 'nre', 'nrf', 'nrg', 'nri', 'nrk', 'nrl', 'nrm', 'nrn', 'nrp', 'nrr', 'nrt', 'nru', 'nrx', 'nrz', 'nsa', 'nsc', 'nsd', 'nse', 'nsf', 'nsg', 'nsh', 'nsi', 'nsk', 'nsl', 'nsm', 'nsn', 'nso', 'nsp', 'nsq', 'nsr', 'nss', 'nst', 'nsu', 'nsv', 'nsw', 'nsx', 'nsy', 'nsz', 'ntd', 'nte', 'ntg', 'nti', 'ntj', 'ntk', 'ntm', 'nto', 'ntp', 'ntr', 'nts', 'ntu', 'ntw', 'ntx', 'nty', 'ntz', 'nua', 'nub', 'nuc', 'nud', 'nue', 'nuf', 'nug', 'nuh', 'nui', 'nuj', 'nuk', 'nul', 'num', 'nun', 'nuo', 'nup', 'nuq', 'nur', 'nus', 'nut', 'nuu', 'nuv', 'nuw', 'nux', 'nuy', 'nuz', 'nvh', 'nvm', 'nvo', 'nwa', 'nwb', 'nwc', 'nwe', 'nwg', 'nwi', 'nwm', 'nwo', 'nwr', 'nwx', 'nwy', 'nxa', 'nxd', 'nxe', 'nxg', 'nxi', 'nxk', 'nxl', 'nxm', 'nxn', 'nxo', 'nxq', 'nxr', 'nxu', 'nxx', 'nyb', 'nyc', 'nyd', 'nye', 'nyf', 'nyg', 'nyh', 'nyi', 'nyj', 'nyk', 'nyl', 'nym', 'nyn', 'nyo', 'nyp', 'nyq', 'nyr', 'nys', 'nyt', 'nyu', 'nyv', 'nyw', 'nyx', 'nyy', 'nza', 'nzb', 'nzi', 'nzk', 'nzm', 'nzs', 'nzu', 'nzy', 'nzz', 'oaa', 'oac', 'oar', 'oav', 'obi', 'obk', 'obl', 'obm', 'obo', 'obr', 'obt', 'obu', 'oca', 'och', 'oco', 'ocu', 'oda', 'odk', 'odt', 'odu', 'ofo', 'ofs', 'ofu', 'ogb', 'ogc', 'oge', 'ogg', 'ogo', 'ogu', 'oht', 'ohu', 'oia', 'oin', 'ojb', 'ojc', 'ojg', 'ojp', 'ojs', 'ojv', 'ojw', 'oka', 'okb', 'okd', 'oke', 'okg', 'okh', 'oki', 'okj', 'okk', 'okl', 'okm', 'okn', 'oko', 'okr', 'oks', 'oku', 'okv', 'okx', 'ola', 'old', 'ole', 'olk', 'olm', 'olo', 'olr', 'olt', 'olu', 'oma', 'omb', 'omc', 'ome', 'omg', 'omi', 'omk', 'oml', 'omn', 'omo', 'omp', 'omq', 'omr', 'omt', 'omu', 'omv', 'omw', 'omx', 'ona', 'onb', 'one', 'ong', 'oni', 'onj', 'onk', 'onn', 'ono', 'onp', 'onr', 'ons', 'ont', 'onu', 'onw', 'onx', 'ood', 'oog', 'oon', 'oor', 'oos', 'opa', 'opk', 'opm', 'opo', 'opt', 'opy', 'ora', 'orc', 'ore', 'org', 'orh', 'orn', 'oro', 'orr', 'ors', 'ort', 'oru', 'orv', 'orw', 'orx', 'ory', 'orz', 'osa', 'osc', 'osi', 'oso', 'osp', 'ost', 'osu', 'osx', 'ota', 'otb', 'otd', 'ote', 'oti', 'otk', 'otl', 'otm', 'otn', 'oto', 'otq', 'otr', 'ots', 'ott', 'otu', 'otw', 'otx', 'oty', 'otz', 'oua', 'oub', 'oue', 'oui', 'oum', 'oun', 'ovd', 'owi', 'owl', 'oyb', 'oyd', 'oym', 'oyy', 'ozm', 'paa', 'pab', 'pac', 'pad', 'pae', 'paf', 'pag', 'pah', 'pai', 'pak', 'pal', 'pam', 'pao', 'pap', 'paq', 'par', 'pas', 'pat', 'pau', 'pav', 'paw', 'pax', 'pay', 'paz', 'pbb', 'pbc', 'pbe', 'pbf', 'pbg', 'pbh', 'pbi', 'pbl', 'pbn', 'pbo', 'pbp', 'pbr', 'pbs', 'pbt', 'pbu', 'pbv', 'pby', 'pbz', 'pca', 'pcb', 'pcc', 'pcd', 'pce', 'pcf', 'pcg', 'pch', 'pci', 'pcj', 'pck', 'pcl', 'pcm', 'pcn', 'pcp', 'pcr', 'pcw', 'pda', 'pdc', 'pdi', 'pdn', 'pdo', 'pdt', 'pdu', 'pea', 'peb', 'ped', 'pee', 'pef', 'peg', 'peh', 'pei', 'pej', 'pek', 'pel', 'pem', 'peo', 'pep', 'peq', 'pes', 'pev', 'pex', 'pey', 'pez', 'pfa', 'pfe', 'pfl', 'pga', 'pgd', 'pgg', 'pgi', 'pgk', 'pgl', 'pgn', 'pgs', 'pgu', 'pgy', 'pgz', 'pha', 'phd', 'phg', 'phh', 'phi', 'phk', 'phl', 'phm', 'phn', 'pho', 'phq', 'phr', 'pht', 'phu', 'phv', 'phw', 'pia', 'pib', 'pic', 'pid', 'pie', 'pif', 'pig', 'pih', 'pii', 'pij', 'pil', 'pim', 'pin', 'pio', 'pip', 'pir', 'pis', 'pit', 'piu', 'piv', 'piw', 'pix', 'piy', 'piz', 'pjt', 'pka', 'pkb', 'pkc', 'pkg', 'pkh', 'pkn', 'pko', 'pkp', 'pkr', 'pks', 'pkt', 'pku', 'pla', 'plb', 'plc', 'pld', 'ple', 'plf', 'plg', 'plh', 'plj', 'plk', 'pll', 'pln', 'plo', 'plp', 'plq', 'plr', 'pls', 'plt', 'plu', 'plv', 'plw', 'ply', 'plz', 'pma', 'pmb', 'pmc', 'pmd', 'pme', 'pmf', 'pmh', 'pmi', 'pmj', 'pmk', 'pml', 'pmm', 'pmn', 'pmo', 'pmq', 'pmr', 'pms', 'pmt', 'pmu', 'pmw', 'pmx', 'pmy', 'pmz', 'pna', 'pnb', 'pnc', 'pne', 'png', 'pnh', 'pni', 'pnj', 'pnk', 'pnl', 'pnm', 'pnn', 'pno', 'pnp', 'pnq', 'pnr', 'pns', 'pnt', 'pnu', 'pnv', 'pnw', 'pnx', 'pny', 'pnz', 'poc', 'pod', 'poe', 'pof', 'pog', 'poh', 'poi', 'pok', 'pom', 'pon', 'poo', 'pop', 'poq', 'pos', 'pot', 'pov', 'pow', 'pox', 'poy', 'poz', 'ppa', 'ppe', 'ppi', 'ppk', 'ppl', 'ppm', 'ppn', 'ppo', 'ppp', 'ppq', 'ppr', 'pps', 'ppt', 'ppu', 'pqa', 'pqe', 'pqm', 'pqw', 'pra', 'prb', 'prc', 'prd', 'pre', 'prf', 'prg', 'prh', 'pri', 'prk', 'prl', 'prm', 'prn', 'pro', 'prp', 'prq', 'prr', 'prs', 'prt', 'pru', 'prw', 'prx', 'pry', 'prz', 'psa', 'psc', 'psd', 'pse', 'psg', 'psh', 'psi', 'psl', 'psm', 'psn', 'pso', 'psp', 'psq', 'psr', 'pss', 'pst', 'psu', 'psw', 'psy', 'pta', 'pth', 'pti', 'ptn', 'pto', 'ptp', 'ptq', 'ptr', 'ptt', 'ptu', 'ptv', 'ptw', 'pty', 'pua', 'pub', 'puc', 'pud', 'pue', 'puf', 'pug', 'pui', 'puj', 'puk', 'pum', 'puo', 'pup', 'puq', 'pur', 'put', 'puu', 'puw', 'pux', 'puy', 'puz', 'pwa', 'pwb', 'pwg', 'pwi', 'pwm', 'pwn', 'pwo', 'pwr', 'pww', 'pxm', 'pye', 'pym', 'pyn', 'pys', 'pyu', 'pyx', 'pyy', 'pzn', 'qaa..qtz', 'qua', 'qub', 'quc', 'qud', 'quf', 'qug', 'quh', 'qui', 'quk', 'qul', 'qum', 'qun', 'qup', 'quq', 'qur', 'qus', 'quv', 'quw', 'qux', 'quy', 'quz', 'qva', 'qvc', 'qve', 'qvh', 'qvi', 'qvj', 'qvl', 'qvm', 'qvn', 'qvo', 'qvp', 'qvs', 'qvw', 'qvy', 'qvz', 'qwa', 'qwc', 'qwe', 'qwh', 'qwm', 'qws', 'qwt', 'qxa', 'qxc', 'qxh', 'qxl', 'qxn', 'qxo', 'qxp', 'qxq', 'qxr', 'qxs', 'qxt', 'qxu', 'qxw', 'qya', 'qyp', 'raa', 'rab', 'rac', 'rad', 'raf', 'rag', 'rah', 'rai', 'raj', 'rak', 'ral', 'ram', 'ran', 'rao', 'rap', 'raq', 'rar', 'ras', 'rat', 'rau', 'rav', 'raw', 'rax', 'ray', 'raz', 'rbb', 'rbk', 'rbl', 'rbp', 'rcf', 'rdb', 'rea', 'reb', 'ree', 'reg', 'rei', 'rej', 'rel', 'rem', 'ren', 'rer', 'res', 'ret', 'rey', 'rga', 'rge', 'rgk', 'rgn', 'rgr', 'rgs', 'rgu', 'rhg', 'rhp', 'ria', 'rie', 'rif', 'ril', 'rim', 'rin', 'rir', 'rit', 'riu', 'rjg', 'rji', 'rjs', 'rka', 'rkb', 'rkh', 'rki', 'rkm', 'rkt', 'rkw', 'rma', 'rmb', 'rmc', 'rmd', 'rme', 'rmf', 'rmg', 'rmh', 'rmi', 'rmk', 'rml', 'rmm', 'rmn', 'rmo', 'rmp', 'rmq', 'rmr', 'rms', 'rmt', 'rmu', 'rmv', 'rmw', 'rmx', 'rmy', 'rmz', 'rna', 'rnd', 'rng', 'rnl', 'rnn', 'rnp', 'rnr', 'rnw', 'roa', 'rob', 'roc', 'rod', 'roe', 'rof', 'rog', 'rol', 'rom', 'roo', 'rop', 'ror', 'rou', 'row', 'rpn', 'rpt', 'rri', 'rro', 'rrt', 'rsb', 'rsi', 'rsl', 'rsm', 'rtc', 'rth', 'rtm', 'rts', 'rtw', 'rub', 'ruc', 'rue', 'ruf', 'rug', 'ruh', 'rui', 'ruk', 'ruo', 'rup', 'ruq', 'rut', 'ruu', 'ruy', 'ruz', 'rwa', 'rwk', 'rwm', 'rwo', 'rwr', 'rxd', 'rxw', 'ryn', 'rys', 'ryu', 'rzh', 'saa', 'sab', 'sac', 'sad', 'sae', 'saf', 'sah', 'sai', 'saj', 'sak', 'sal', 'sam', 'sao', 'sap', 'saq', 'sar', 'sas', 'sat', 'sau', 'sav', 'saw', 'sax', 'say', 'saz', 'sba', 'sbb', 'sbc', 'sbd', 'sbe', 'sbf', 'sbg', 'sbh', 'sbi', 'sbj', 'sbk', 'sbl', 'sbm', 'sbn', 'sbo', 'sbp', 'sbq', 'sbr', 'sbs', 'sbt', 'sbu', 'sbv', 'sbw', 'sbx', 'sby', 'sbz', 'sca', 'scb', 'sce', 'scf', 'scg', 'sch', 'sci', 'sck', 'scl', 'scn', 'sco', 'scp', 'scq', 'scs', 'sct', 'scu', 'scv', 'scw', 'scx', 'sda', 'sdb', 'sdc', 'sde', 'sdf', 'sdg', 'sdh', 'sdj', 'sdk', 'sdl', 'sdm', 'sdn', 'sdo', 'sdp', 'sdr', 'sds', 'sdt', 'sdu', 'sdv', 'sdx', 'sdz', 'sea', 'seb', 'sec', 'sed', 'see', 'sef', 'seg', 'seh', 'sei', 'sej', 'sek', 'sel', 'sem', 'sen', 'seo', 'sep', 'seq', 'ser', 'ses', 'set', 'seu', 'sev', 'sew', 'sey', 'sez', 'sfb', 'sfe', 'sfm', 'sfs', 'sfw', 'sga', 'sgb', 'sgc', 'sgd', 'sge', 'sgg', 'sgh', 'sgi', 'sgj', 'sgk', 'sgl', 'sgm', 'sgn', 'sgo', 'sgp', 'sgr', 'sgs', 'sgt', 'sgu', 'sgw', 'sgx', 'sgy', 'sgz', 'sha', 'shb', 'shc', 'shd', 'she', 'shg', 'shh', 'shi', 'shj', 'shk', 'shl', 'shm', 'shn', 'sho', 'shp', 'shq', 'shr', 'shs', 'sht', 'shu', 'shv', 'shw', 'shx', 'shy', 'shz', 'sia', 'sib', 'sid', 'sie', 'sif', 'sig', 'sih', 'sii', 'sij', 'sik', 'sil', 'sim', 'sio', 'sip', 'siq', 'sir', 'sis', 'sit', 'siu', 'siv', 'siw', 'six', 'siy', 'siz', 'sja', 'sjb', 'sjd', 'sje', 'sjg', 'sjk', 'sjl', 'sjm', 'sjn', 'sjo', 'sjp', 'sjr', 'sjs', 'sjt', 'sju', 'sjw', 'ska', 'skb', 'skc', 'skd', 'ske', 'skf', 'skg', 'skh', 'ski', 'skj', 'skk', 'skm', 'skn', 'sko', 'skp', 'skq', 'skr', 'sks', 'skt', 'sku', 'skv', 'skw', 'skx', 'sky', 'skz', 'sla', 'slc', 'sld', 'sle', 'slf', 'slg', 'slh', 'sli', 'slj', 'sll', 'slm', 'sln', 'slp', 'slq', 'slr', 'sls', 'slt', 'slu', 'slw', 'slx', 'sly', 'slz', 'sma', 'smb', 'smc', 'smd', 'smf', 'smg', 'smh', 'smi', 'smj', 'smk', 'sml', 'smm', 'smn', 'smp', 'smq', 'smr', 'sms', 'smt', 'smu', 'smv', 'smw', 'smx', 'smy', 'smz', 'snb', 'snc', 'sne', 'snf', 'sng', 'snh', 'sni', 'snj', 'snk', 'snl', 'snm', 'snn', 'sno', 'snp', 'snq', 'snr', 'sns', 'snu', 'snv', 'snw', 'snx', 'sny', 'snz', 'soa', 'sob', 'soc', 'sod', 'soe', 'sog', 'soh', 'soi', 'soj', 'sok', 'sol', 'son', 'soo', 'sop', 'soq', 'sor', 'sos', 'sou', 'sov', 'sow', 'sox', 'soy', 'soz', 'spb', 'spc', 'spd', 'spe', 'spg', 'spi', 'spk', 'spl', 'spm', 'spn', 'spo', 'spp', 'spq', 'spr', 'sps', 'spt', 'spu', 'spv', 'spx', 'spy', 'sqa', 'sqh', 'sqj', 'sqk', 'sqm', 'sqn', 'sqo', 'sqq', 'sqr', 'sqs', 'sqt', 'squ', 'sra', 'srb', 'src', 'sre', 'srf', 'srg', 'srh', 'sri', 'srk', 'srl', 'srm', 'srn', 'sro', 'srq', 'srr', 'srs', 'srt', 'sru', 'srv', 'srw', 'srx', 'sry', 'srz', 'ssa', 'ssb', 'ssc', 'ssd', 'sse', 'ssf', 'ssg', 'ssh', 'ssi', 'ssj', 'ssk', 'ssl', 'ssm', 'ssn', 'sso', 'ssp', 'ssq', 'ssr', 'sss', 'sst', 'ssu', 'ssv', 'ssx', 'ssy', 'ssz', 'sta', 'stb', 'std', 'ste', 'stf', 'stg', 'sth', 'sti', 'stj', 'stk', 'stl', 'stm', 'stn', 'sto', 'stp', 'stq', 'str', 'sts', 'stt', 'stu', 'stv', 'stw', 'sty', 'sua', 'sub', 'suc', 'sue', 'sug', 'sui', 'suj', 'suk', 'sul', 'sum', 'suq', 'sur', 'sus', 'sut', 'suv', 'suw', 'sux', 'suy', 'suz', 'sva', 'svb', 'svc', 'sve', 'svk', 'svm', 'svr', 'svs', 'svx', 'swb', 'swc', 'swf', 'swg', 'swh', 'swi', 'swj', 'swk', 'swl', 'swm', 'swn', 'swo', 'swp', 'swq', 'swr', 'sws', 'swt', 'swu', 'swv', 'sww', 'swx', 'swy', 'sxb', 'sxc', 'sxe', 'sxg', 'sxk', 'sxl', 'sxm', 'sxn', 'sxo', 'sxr', 'sxs', 'sxu', 'sxw', 'sya', 'syb', 'syc', 'syd', 'syi', 'syk', 'syl', 'sym', 'syn', 'syo', 'syr', 'sys', 'syw', 'syx', 'syy', 'sza', 'szb', 'szc', 'szd', 'sze', 'szg', 'szl', 'szn', 'szp', 'szs', 'szv', 'szw', 'taa', 'tab', 'tac', 'tad', 'tae', 'taf', 'tag', 'tai', 'taj', 'tak', 'tal', 'tan', 'tao', 'tap', 'taq', 'tar', 'tas', 'tau', 'tav', 'taw', 'tax', 'tay', 'taz', 'tba', 'tbb', 'tbc', 'tbd', 'tbe', 'tbf', 'tbg', 'tbh', 'tbi', 'tbj', 'tbk', 'tbl', 'tbm', 'tbn', 'tbo', 'tbp', 'tbq', 'tbr', 'tbs', 'tbt', 'tbu', 'tbv', 'tbw', 'tbx', 'tby', 'tbz', 'tca', 'tcb', 'tcc', 'tcd', 'tce', 'tcf', 'tcg', 'tch', 'tci', 'tck', 'tcl', 'tcm', 'tcn', 'tco', 'tcp', 'tcq', 'tcs', 'tct', 'tcu', 'tcw', 'tcx', 'tcy', 'tcz', 'tda', 'tdb', 'tdc', 'tdd', 'tde', 'tdf', 'tdg', 'tdh', 'tdi', 'tdj', 'tdk', 'tdl', 'tdm', 'tdn', 'tdo', 'tdq', 'tdr', 'tds', 'tdt', 'tdu', 'tdv', 'tdx', 'tdy', 'tea', 'teb', 'tec', 'ted', 'tee', 'tef', 'teg', 'teh', 'tei', 'tek', 'tem', 'ten', 'teo', 'tep', 'teq', 'ter', 'tes', 'tet', 'teu', 'tev', 'tew', 'tex', 'tey', 'tfi', 'tfn', 'tfo', 'tfr', 'tft', 'tga', 'tgb', 'tgc', 'tgd', 'tge', 'tgf', 'tgg', 'tgh', 'tgi', 'tgj', 'tgn', 'tgo', 'tgp', 'tgq', 'tgr', 'tgs', 'tgt', 'tgu', 'tgv', 'tgw', 'tgx', 'tgy', 'tgz', 'thc', 'thd', 'the', 'thf', 'thh', 'thi', 'thk', 'thl', 'thm', 'thn', 'thp', 'thq', 'thr', 'ths', 'tht', 'thu', 'thv', 'thw', 'thx', 'thy', 'thz', 'tia', 'tic', 'tid', 'tie', 'tif', 'tig', 'tih', 'tii', 'tij', 'tik', 'til', 'tim', 'tin', 'tio', 'tip', 'tiq', 'tis', 'tit', 'tiu', 'tiv', 'tiw', 'tix', 'tiy', 'tiz', 'tja', 'tjg', 'tji', 'tjl', 'tjm', 'tjn', 'tjo', 'tjs', 'tju', 'tjw', 'tka', 'tkb', 'tkd', 'tke', 'tkf', 'tkg', 'tkk', 'tkl', 'tkm', 'tkn', 'tkp', 'tkq', 'tkr', 'tks', 'tkt', 'tku', 'tkv', 'tkw', 'tkx', 'tkz', 'tla', 'tlb', 'tlc', 'tld', 'tlf', 'tlg', 'tlh', 'tli', 'tlj', 'tlk', 'tll', 'tlm', 'tln', 'tlo', 'tlp', 'tlq', 'tlr', 'tls', 'tlt', 'tlu', 'tlv', 'tlw', 'tlx', 'tly', 'tma', 'tmb', 'tmc', 'tmd', 'tme', 'tmf', 'tmg', 'tmh', 'tmi', 'tmj', 'tmk', 'tml', 'tmm', 'tmn', 'tmo', 'tmp', 'tmq', 'tmr', 'tms', 'tmt', 'tmu', 'tmv', 'tmw', 'tmy', 'tmz', 'tna', 'tnb', 'tnc', 'tnd', 'tne', 'tnf', 'tng', 'tnh', 'tni', 'tnk', 'tnl', 'tnm', 'tnn', 'tno', 'tnp', 'tnq', 'tnr', 'tns', 'tnt', 'tnu', 'tnv', 'tnw', 'tnx', 'tny', 'tnz', 'tob', 'toc', 'tod', 'toe', 'tof', 'tog', 'toh', 'toi', 'toj', 'tol', 'tom', 'too', 'top', 'toq', 'tor', 'tos', 'tou', 'tov', 'tow', 'tox', 'toy', 'toz', 'tpa', 'tpc', 'tpe', 'tpf', 'tpg', 'tpi', 'tpj', 'tpk', 'tpl', 'tpm', 'tpn', 'tpo', 'tpp', 'tpq', 'tpr', 'tpt', 'tpu', 'tpv', 'tpw', 'tpx', 'tpy', 'tpz', 'tqb', 'tql', 'tqm', 'tqn', 'tqo', 'tqp', 'tqq', 'tqr', 'tqt', 'tqu', 'tqw', 'tra', 'trb', 'trc', 'trd', 'tre', 'trf', 'trg', 'trh', 'tri', 'trj', 'trk', 'trl', 'trm', 'trn', 'tro', 'trp', 'trq', 'trr', 'trs', 'trt', 'tru', 'trv', 'trw', 'trx', 'try', 'trz', 'tsa', 'tsb', 'tsc', 'tsd', 'tse', 'tsf', 'tsg', 'tsh', 'tsi', 'tsj', 'tsk', 'tsl', 'tsm', 'tsp', 'tsq', 'tsr', 'tss', 'tst', 'tsu', 'tsv', 'tsw', 'tsx', 'tsy', 'tsz', 'tta', 'ttb', 'ttc', 'ttd', 'tte', 'ttf', 'ttg', 'tth', 'tti', 'ttj', 'ttk', 'ttl', 'ttm', 'ttn', 'tto', 'ttp', 'ttq', 'ttr', 'tts', 'ttt', 'ttu', 'ttv', 'ttw', 'tty', 'ttz', 'tua', 'tub', 'tuc', 'tud', 'tue', 'tuf', 'tug', 'tuh', 'tui', 'tuj', 'tul', 'tum', 'tun', 'tuo', 'tup', 'tuq', 'tus', 'tut', 'tuu', 'tuv', 'tuw', 'tux', 'tuy', 'tuz', 'tva', 'tvd', 'tve', 'tvk', 'tvl', 'tvm', 'tvn', 'tvo', 'tvs', 'tvt', 'tvu', 'tvw', 'tvy', 'twa', 'twb', 'twc', 'twd', 'twe', 'twf', 'twg', 'twh', 'twl', 'twm', 'twn', 'two', 'twp', 'twq', 'twr', 'twt', 'twu', 'tww', 'twx', 'twy', 'txa', 'txb', 'txc', 'txe', 'txg', 'txh', 'txi', 'txj', 'txm', 'txn', 'txo', 'txq', 'txr', 'txs', 'txt', 'txu', 'txx', 'txy', 'tya', 'tye', 'tyh', 'tyi', 'tyj', 'tyl', 'tyn', 'typ', 'tyr', 'tys', 'tyt', 'tyu', 'tyv', 'tyx', 'tyz', 'tza', 'tzh', 'tzj', 'tzl', 'tzm', 'tzn', 'tzo', 'tzx', 'uam', 'uan', 'uar', 'uba', 'ubi', 'ubl', 'ubr', 'ubu', 'uby', 'uda', 'ude', 'udg', 'udi', 'udj', 'udl', 'udm', 'udu', 'ues', 'ufi', 'uga', 'ugb', 'uge', 'ugn', 'ugo', 'ugy', 'uha', 'uhn', 'uis', 'uiv', 'uji', 'uka', 'ukg', 'ukh', 'ukk', 'ukl', 'ukp', 'ukq', 'uks', 'uku', 'ukw', 'uky', 'ula', 'ulb', 'ulc', 'ule', 'ulf', 'uli', 'ulk', 'ull', 'ulm', 'uln', 'ulu', 'ulw', 'uma', 'umb', 'umc', 'umd', 'umg', 'umi', 'umm', 'umn', 'umo', 'ump', 'umr', 'ums', 'umu', 'una', 'und', 'une', 'ung', 'unk', 'unm', 'unn', 'unp', 'unr', 'unu', 'unx', 'unz', 'uok', 'upi', 'upv', 'ura', 'urb', 'urc', 'ure', 'urf', 'urg', 'urh', 'uri', 'urj', 'urk', 'url', 'urm', 'urn', 'uro', 'urp', 'urr', 'urt', 'uru', 'urv', 'urw', 'urx', 'ury', 'urz', 'usa', 'ush', 'usi', 'usk', 'usp', 'usu', 'uta', 'ute', 'utp', 'utr', 'utu', 'uum', 'uun', 'uur', 'uuu', 'uve', 'uvh', 'uvl', 'uwa', 'uya', 'uzn', 'uzs', 'vaa', 'vae', 'vaf', 'vag', 'vah', 'vai', 'vaj', 'val', 'vam', 'van', 'vao', 'vap', 'var', 'vas', 'vau', 'vav', 'vay', 'vbb', 'vbk', 'vec', 'ved', 'vel', 'vem', 'veo', 'vep', 'ver', 'vgr', 'vgt', 'vic', 'vid', 'vif', 'vig', 'vil', 'vin', 'vis', 'vit', 'viv', 'vka', 'vki', 'vkj', 'vkk', 'vkl', 'vkm', 'vko', 'vkp', 'vkt', 'vku', 'vlp', 'vls', 'vma', 'vmb', 'vmc', 'vmd', 'vme', 'vmf', 'vmg', 'vmh', 'vmi', 'vmj', 'vmk', 'vml', 'vmm', 'vmp', 'vmq', 'vmr', 'vms', 'vmu', 'vmv', 'vmw', 'vmx', 'vmy', 'vmz', 'vnk', 'vnm', 'vnp', 'vor', 'vot', 'vra', 'vro', 'vrs', 'vrt', 'vsi', 'vsl', 'vsv', 'vto', 'vum', 'vun', 'vut', 'vwa', 'waa', 'wab', 'wac', 'wad', 'wae', 'waf', 'wag', 'wah', 'wai', 'waj', 'wak', 'wal', 'wam', 'wan', 'wao', 'wap', 'waq', 'war', 'was', 'wat', 'wau', 'wav', 'waw', 'wax', 'way', 'waz', 'wba', 'wbb', 'wbe', 'wbf', 'wbh', 'wbi', 'wbj', 'wbk', 'wbl', 'wbm', 'wbp', 'wbq', 'wbr', 'wbs', 'wbt', 'wbv', 'wbw', 'wca', 'wci', 'wdd', 'wdg', 'wdj', 'wdk', 'wdu', 'wdy', 'wea', 'wec', 'wed', 'weg', 'weh', 'wei', 'wem', 'wen', 'weo', 'wep', 'wer', 'wes', 'wet', 'weu', 'wew', 'wfg', 'wga', 'wgb', 'wgg', 'wgi', 'wgo', 'wgu', 'wgw', 'wgy', 'wha', 'whg', 'whk', 'whu', 'wib', 'wic', 'wie', 'wif', 'wig', 'wih', 'wii', 'wij', 'wik', 'wil', 'wim', 'win', 'wir', 'wit', 'wiu', 'wiv', 'wiw', 'wiy', 'wja', 'wji', 'wka', 'wkb', 'wkd', 'wkl', 'wku', 'wkw', 'wky', 'wla', 'wlc', 'wle', 'wlg', 'wli', 'wlk', 'wll', 'wlm', 'wlo', 'wlr', 'wls', 'wlu', 'wlv', 'wlw', 'wlx', 'wly', 'wma', 'wmb', 'wmc', 'wmd', 'wme', 'wmh', 'wmi', 'wmm', 'wmn', 'wmo', 'wms', 'wmt', 'wmw', 'wmx', 'wnb', 'wnc', 'wnd', 'wne', 'wng', 'wni', 'wnk', 'wnm', 'wnn', 'wno', 'wnp', 'wnu', 'wnw', 'wny', 'woa', 'wob', 'woc', 'wod', 'woe', 'wof', 'wog', 'woi', 'wok', 'wom', 'won', 'woo', 'wor', 'wos', 'wow', 'woy', 'wpc', 'wra', 'wrb', 'wrd', 'wrg', 'wrh', 'wri', 'wrk', 'wrl', 'wrm', 'wrn', 'wro', 'wrp', 'wrr', 'wrs', 'wru', 'wrv', 'wrw', 'wrx', 'wry', 'wrz', 'wsa', 'wsg', 'wsi', 'wsk', 'wsr', 'wss', 'wsu', 'wsv', 'wtf', 'wth', 'wti', 'wtk', 'wtm', 'wtw', 'wua', 'wub', 'wud', 'wuh', 'wul', 'wum', 'wun', 'wur', 'wut', 'wuu', 'wuv', 'wux', 'wuy', 'wwa', 'wwb', 'wwo', 'wwr', 'www', 'wxa', 'wxw', 'wya', 'wyb', 'wyi', 'wym', 'wyr', 'wyy', 'xaa', 'xab', 'xac', 'xad', 'xae', 'xag', 'xai', 'xaj', 'xak', 'xal', 'xam', 'xan', 'xao', 'xap', 'xaq', 'xar', 'xas', 'xat', 'xau', 'xav', 'xaw', 'xay', 'xba', 'xbb', 'xbc', 'xbd', 'xbe', 'xbg', 'xbi', 'xbj', 'xbm', 'xbn', 'xbo', 'xbp', 'xbr', 'xbw', 'xbx', 'xby', 'xcb', 'xcc', 'xce', 'xcg', 'xch', 'xcl', 'xcm', 'xcn', 'xco', 'xcr', 'xct', 'xcu', 'xcv', 'xcw', 'xcy', 'xda', 'xdc', 'xdk', 'xdm', 'xdo', 'xdy', 'xeb', 'xed', 'xeg', 'xel', 'xem', 'xep', 'xer', 'xes', 'xet', 'xeu', 'xfa', 'xga', 'xgb', 'xgd', 'xgf', 'xgg', 'xgi', 'xgl', 'xgm', 'xgn', 'xgr', 'xgu', 'xgw', 'xha', 'xhc', 'xhd', 'xhe', 'xhr', 'xht', 'xhu', 'xhv', 'xia', 'xib', 'xii', 'xil', 'xin', 'xip', 'xir', 'xis', 'xiv', 'xiy', 'xjb', 'xjt', 'xka', 'xkb', 'xkc', 'xkd', 'xke', 'xkf', 'xkg', 'xkh', 'xki', 'xkj', 'xkk', 'xkl', 'xkn', 'xko', 'xkp', 'xkq', 'xkr', 'xks', 'xkt', 'xku', 'xkv', 'xkw', 'xkx', 'xky', 'xkz', 'xla', 'xlb', 'xlc', 'xld', 'xle', 'xlg', 'xli', 'xln', 'xlo', 'xlp', 'xls', 'xlu', 'xly', 'xma', 'xmb', 'xmc', 'xmd', 'xme', 'xmf', 'xmg', 'xmh', 'xmj', 'xmk', 'xml', 'xmm', 'xmn', 'xmo', 'xmp', 'xmq', 'xmr', 'xms', 'xmt', 'xmu', 'xmv', 'xmw', 'xmx', 'xmy', 'xmz', 'xna', 'xnb', 'xnd', 'xng', 'xnh', 'xni', 'xnk', 'xnn', 'xno', 'xnr', 'xns', 'xnt', 'xnu', 'xny', 'xnz', 'xoc', 'xod', 'xog', 'xoi', 'xok', 'xom', 'xon', 'xoo', 'xop', 'xor', 'xow', 'xpa', 'xpc', 'xpe', 'xpg', 'xpi', 'xpj', 'xpk', 'xpm', 'xpn', 'xpo', 'xpp', 'xpq', 'xpr', 'xps', 'xpt', 'xpu', 'xpy', 'xqa', 'xqt', 'xra', 'xrb', 'xrd', 'xre', 'xrg', 'xri', 'xrm', 'xrn', 'xrq', 'xrr', 'xrt', 'xru', 'xrw', 'xsa', 'xsb', 'xsc', 'xsd', 'xse', 'xsh', 'xsi', 'xsj', 'xsl', 'xsm', 'xsn', 'xso', 'xsp', 'xsq', 'xsr', 'xss', 'xsu', 'xsv', 'xsy', 'xta', 'xtb', 'xtc', 'xtd', 'xte', 'xtg', 'xth', 'xti', 'xtj', 'xtl', 'xtm', 'xtn', 'xto', 'xtp', 'xtq', 'xtr', 'xts', 'xtt', 'xtu', 'xtv', 'xtw', 'xty', 'xtz', 'xua', 'xub', 'xud', 'xug', 'xuj', 'xul', 'xum', 'xun', 'xuo', 'xup', 'xur', 'xut', 'xuu', 'xve', 'xvi', 'xvn', 'xvo', 'xvs', 'xwa', 'xwc', 'xwd', 'xwe', 'xwg', 'xwj', 'xwk', 'xwl', 'xwo', 'xwr', 'xwt', 'xww', 'xxb', 'xxk', 'xxm', 'xxr', 'xxt', 'xya', 'xyb', 'xyj', 'xyk', 'xyl', 'xyt', 'xyy', 'xzh', 'xzm', 'xzp', 'yaa', 'yab', 'yac', 'yad', 'yae', 'yaf', 'yag', 'yah', 'yai', 'yaj', 'yak', 'yal', 'yam', 'yan', 'yao', 'yap', 'yaq', 'yar', 'yas', 'yat', 'yau', 'yav', 'yaw', 'yax', 'yay', 'yaz', 'yba', 'ybb', 'ybd', 'ybe', 'ybh', 'ybi', 'ybj', 'ybk', 'ybl', 'ybm', 'ybn', 'ybo', 'ybx', 'yby', 'ych', 'ycl', 'ycn', 'ycp', 'yda', 'ydd', 'yde', 'ydg', 'ydk', 'yds', 'yea', 'yec', 'yee', 'yei', 'yej', 'yel', 'yen', 'yer', 'yes', 'yet', 'yeu', 'yev', 'yey', 'yga', 'ygi', 'ygl', 'ygm', 'ygp', 'ygr', 'ygs', 'ygu', 'ygw', 'yha', 'yhd', 'yhl', 'yhs', 'yia', 'yif', 'yig', 'yih', 'yii', 'yij', 'yik', 'yil', 'yim', 'yin', 'yip', 'yiq', 'yir', 'yis', 'yit', 'yiu', 'yiv', 'yix', 'yiy', 'yiz', 'yka', 'ykg', 'yki', 'ykk', 'ykl', 'ykm', 'ykn', 'yko', 'ykr', 'ykt', 'yku', 'yky', 'yla', 'ylb', 'yle', 'ylg', 'yli', 'yll', 'ylm', 'yln', 'ylo', 'ylr', 'ylu', 'yly', 'yma', 'ymb', 'ymc', 'ymd', 'yme', 'ymg', 'ymh', 'ymi', 'ymk', 'yml', 'ymm', 'ymn', 'ymo', 'ymp', 'ymq', 'ymr', 'yms', 'ymt', 'ymx', 'ymz', 'yna', 'ynd', 'yne', 'yng', 'ynh', 'ynk', 'ynl', 'ynn', 'yno', 'ynq', 'yns', 'ynu', 'yob', 'yog', 'yoi', 'yok', 'yol', 'yom', 'yon', 'yos', 'yot', 'yox', 'yoy', 'ypa', 'ypb', 'ypg', 'yph', 'ypk', 'ypm', 'ypn', 'ypo', 'ypp', 'ypz', 'yra', 'yrb', 'yre', 'yri', 'yrk', 'yrl', 'yrm', 'yrn', 'yro', 'yrs', 'yrw', 'yry', 'ysc', 'ysd', 'ysg', 'ysl', 'ysn', 'yso', 'ysp', 'ysr', 'yss', 'ysy', 'yta', 'ytl', 'ytp', 'ytw', 'yty', 'yua', 'yub', 'yuc', 'yud', 'yue', 'yuf', 'yug', 'yui', 'yuj', 'yuk', 'yul', 'yum', 'yun', 'yup', 'yuq', 'yur', 'yut', 'yuu', 'yuw', 'yux', 'yuy', 'yuz', 'yva', 'yvt', 'ywa', 'ywg', 'ywl', 'ywn', 'ywq', 'ywr', 'ywt', 'ywu', 'yww', 'yxa', 'yxg', 'yxl', 'yxm', 'yxu', 'yxy', 'yyr', 'yyu', 'yyz', 'yzg', 'yzk', 'zaa', 'zab', 'zac', 'zad', 'zae', 'zaf', 'zag', 'zah', 'zai', 'zaj', 'zak', 'zal', 'zam', 'zao', 'zap', 'zaq', 'zar', 'zas', 'zat', 'zau', 'zav', 'zaw', 'zax', 'zay', 'zaz', 'zbc', 'zbe', 'zbl', 'zbt', 'zbw', 'zca', 'zch', 'zdj', 'zea', 'zeg', 'zeh', 'zen', 'zga', 'zgb', 'zgh', 'zgm', 'zgn', 'zgr', 'zhb', 'zhd', 'zhi', 'zhn', 'zhw', 'zhx', 'zia', 'zib', 'zik', 'zil', 'zim', 'zin', 'zir', 'ziw', 'ziz', 'zka', 'zkb', 'zkd', 'zkg', 'zkh', 'zkk', 'zkn', 'zko', 'zkp', 'zkr', 'zkt', 'zku', 'zkv', 'zkz', 'zle', 'zlj', 'zlm', 'zln', 'zlq', 'zls', 'zlw', 'zma', 'zmb', 'zmc', 'zmd', 'zme', 'zmf', 'zmg', 'zmh', 'zmi', 'zmj', 'zmk', 'zml', 'zmm', 'zmn', 'zmo', 'zmp', 'zmq', 'zmr', 'zms', 'zmt', 'zmu', 'zmv', 'zmw', 'zmx', 'zmy', 'zmz', 'zna', 'znd', 'zne', 'zng', 'znk', 'zns', 'zoc', 'zoh', 'zom', 'zoo', 'zoq', 'zor', 'zos', 'zpa', 'zpb', 'zpc', 'zpd', 'zpe', 'zpf', 'zpg', 'zph', 'zpi', 'zpj', 'zpk', 'zpl', 'zpm', 'zpn', 'zpo', 'zpp', 'zpq', 'zpr', 'zps', 'zpt', 'zpu', 'zpv', 'zpw', 'zpx', 'zpy', 'zpz', 'zqe', 'zra', 'zrg', 'zrn', 'zro', 'zrp', 'zrs', 'zsa', 'zsk', 'zsl', 'zsm', 'zsr', 'zsu', 'zte', 'ztg', 'ztl', 'ztm', 'ztn', 'ztp', 'ztq', 'zts', 'ztt', 'ztu', 'ztx', 'zty', 'zua', 'zuh', 'zum', 'zun', 'zuy', 'zwa', 'zxx', 'zyb', 'zyg', 'zyj', 'zyn', 'zyp', 'zza', 'zzj' ];
+      axe.utils.validLangs = function() {
+        'use strict';
+        return langs;
+      };
+      return commons;
+    }()
+  });
+})(typeof window === 'object' ? window : this);
\ No newline at end of file
diff --git a/third_party/axe-core/axe.min.js b/third_party/axe-core/axe.min.js
new file mode 100644
index 0000000..1cb6219
--- /dev/null
+++ b/third_party/axe-core/axe.min.js
@@ -0,0 +1,42 @@
+/*! aXe v2.3.1
+ * Copyright (c) 2017 Deque Systems, Inc.
+ *
+ * Your use of this Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This entire copyright notice must appear in every copy of this file you
+ * distribute or in any file that contains substantial portions of this source
+ * code.
+ */
+!function a(window){function b(a){this.name="SupportError",this.cause=a.cause,this.message="`"+a.cause+"` - feature unsupported in your environment.",a.ruleId&&(this.ruleId=a.ruleId,this.message+=" Skipping "+this.ruleId+" rule."),this.stack=(new Error).stack}function c(a){"use strict";var b;return a?(b=axe.utils.clone(a),b.commons=a.commons):b={},b.reporter=b.reporter||null,b.rules=b.rules||[],b.checks=b.checks||[],b.data=Object.assign({checks:{},rules:{}},b.data),b}function d(a,b,c){"use strict";var d,e;for(d=0,e=a.length;d<e;d++)b[c](a[d])}function e(a){this.brand="axe",this.application="axeAPI",this.tagExclude=["experimental"],this.defaultConfig=a,this._init()}function f(a,b,c){var d=a.brand,e=a.application;return axe.constants.helpUrlBase+d+"/"+(c||axe.version.substring(0,axe.version.lastIndexOf(".")))+"/"+b+"?application="+e}function g(a){"use strict";this.id=a.id,this.data=null,this.relatedNodes=[],this.result=null}function h(a){"use strict";return"string"==typeof a?new Function("return "+a+";")():a}function i(a){a&&(this.id=a.id,this.configure(a))}function j(a,b){"use strict";if(!axe.utils.isHidden(b)){axe.utils.findBy(a,"node",b)||a.push({node:b,include:[],exclude:[]})}}function k(a,b,c){"use strict";a.frames=a.frames||[];var d,e,f=document.querySelectorAll(c.shift());a:for(var g=0,h=f.length;g<h;g++){e=f[g];for(var i=0,j=a.frames.length;i<j;i++)if(a.frames[i].node===e){a.frames[i][b].push(c);break a}d={node:e,include:[],exclude:[]},c&&d[b].push(c),a.frames.push(d)}}function l(a){"use strict";if(a&&"object"===(void 0===a?"undefined":qa(a))||a instanceof NodeList){if(a instanceof Node)return{include:[a],exclude:[]};if(a.hasOwnProperty("include")||a.hasOwnProperty("exclude"))return{include:a.include&&+a.include.length?a.include:[document],exclude:a.exclude||[]};if(a.length===+a.length)return{include:a,exclude:[]}}return"string"==typeof a?{include:[a],exclude:[]}:{include:[document],exclude:[]}}function m(a,b){"use strict";for(var c,d,e=[],f=0,g=a[b].length;f<g;f++){if("string"==typeof(c=a[b][f])){d=Array.from(document.querySelectorAll(c)),e=e.concat(d.map(function(a){return axe.utils.getFlattenedTree(a)[0]}));break}!c||!c.length||c instanceof Node?c instanceof Node&&e.push(axe.utils.getFlattenedTree(c)[0]):c.length>1?k(a,b,c):(d=Array.from(document.querySelectorAll(c[0])),e=e.concat(d.map(function(a){return axe.utils.getFlattenedTree(a)[0]})))}return e.filter(function(a){return a})}function n(a){"use strict";if(0===a.include.length){if(0===a.frames.length){var b=axe.utils.respondable.isInFrame()?"frame":"page";return new Error("No elements found for include in "+b+" Context")}a.frames.forEach(function(a,b){if(0===a.include.length)return new Error("No elements found for include in Context of frame "+b)})}}function o(a){"use strict";var b=this;this.frames=[],this.initiator=!a||"boolean"!=typeof a.initiator||a.initiator,this.page=!1,a=l(a),this.exclude=a.exclude,this.include=a.include,this.include=m(this,"include"),this.exclude=m(this,"exclude"),axe.utils.select("frame, iframe",this).forEach(function(a){oa(a,b)&&j(b.frames,a.actualNode)}),1===this.include.length&&this.include[0].actualNode===document.documentElement&&(this.page=!0);var c=n(this);if(c instanceof Error)throw c}function p(a){"use strict";this.id=a.id,this.result=axe.constants.NA,this.pageLevel=a.pageLevel,this.impact=null,this.nodes=[]}function q(a,b){"use strict";this._audit=b,this.id=a.id,this.selector=a.selector||"*",this.excludeHidden="boolean"!=typeof a.excludeHidden||a.excludeHidden,this.enabled="boolean"!=typeof a.enabled||a.enabled,this.pageLevel="boolean"==typeof a.pageLevel&&a.pageLevel,this.any=a.any||[],this.all=a.all||[],this.none=a.none||[],this.tags=a.tags||[],a.matches&&(this.matches=h(a.matches))}function r(a){"use strict";return axe.utils.getAllChecks(a).map(function(b){var c=a._audit.checks[b.id||b];return c&&"function"==typeof c.after?c:null}).filter(Boolean)}function s(a,b){"use strict";var c=[];return a.forEach(function(a){axe.utils.getAllChecks(a).forEach(function(a){a.id===b&&c.push(a)})}),c}function t(a){"use strict";return a.filter(function(a){return!0!==a.filtered})}function u(a){"use strict";var b=["any","all","none"],c=a.nodes.filter(function(a){var c=0;return b.forEach(function(b){a[b]=t(a[b]),c+=a[b].length}),c>0});return a.pageLevel&&c.length&&(c=[c.reduce(function(a,c){if(a)return b.forEach(function(b){a[b].push.apply(a[b],c[b])}),a})]),c}function v(a,b){"use strict";if(!axe._audit)throw new Error("No audit configured");var c=axe.utils.queue(),d=[];Object.keys(axe.plugins).forEach(function(a){c.defer(function(b){var c=function(a){d.push(a),b()};try{axe.plugins[a].cleanup(b,c)}catch(a){c(a)}})}),axe.utils.toArray(document.querySelectorAll("frame, iframe")).forEach(function(a){c.defer(function(b,c){return axe.utils.sendCommandToFrame(a,{command:"cleanup-plugin"},b,c)})}),c.then(function(c){0===d.length?a(c):b(d)}).catch(b)}function w(a){"use strict";var b;if(!(b=axe._audit))throw new Error("No audit configured");a.reporter&&("function"==typeof a.reporter||ta[a.reporter])&&(b.reporter=a.reporter),a.checks&&a.checks.forEach(function(a){b.addCheck(a)}),a.rules&&a.rules.forEach(function(a){b.addRule(a)}),void 0!==a.branding?b.setBranding(a.branding):b._constructHelpUrls(),a.tagExclude&&(b.tagExclude=a.tagExclude)}function x(a,b,c){"use strict";var d=c,e=function(a){a instanceof Error==!1&&(a=new Error(a)),c(a)},f=a&&a.context||{};f.include&&!f.include.length&&(f.include=[document]);var g=a&&a.options||{};switch(a.command){case"rules":return A(f,g,d,e);case"cleanup-plugin":return v(d,e);default:if(axe._audit&&axe._audit.commands&&axe._audit.commands[a.command])return axe._audit.commands[a.command](a,c)}}function y(a){"use strict";this._run=a.run,this._collect=a.collect,this._registry={},a.commands.forEach(function(a){axe._audit.registerCommand(a)})}function z(){"use strict";var a=axe._audit;if(!a)throw new Error("No audit configured");a.resetRulesAndChecks()}function A(a,b,c,d){"use strict";try{a=new o(a)}catch(a){return d(a)}var e=axe.utils.queue(),f=axe._audit;b.performanceTimer&&axe.utils.performanceTimer.auditStart(),a.frames.length&&!1!==b.iframes&&e.defer(function(c,d){axe.utils.collectResultsFromFrames(a,b,"rules",null,c,d)}),e.defer(function(c,d){f.run(a,b,c,d)}),e.then(function(e){try{b.performanceTimer&&axe.utils.performanceTimer.auditEnd();var g=axe.utils.mergeResults(e.map(function(a){return{results:a}}));a.initiator&&(g=f.after(g,b),g.forEach(axe.utils.publishMetaData),g=g.map(axe.utils.finalizeRuleResult));try{c(g)}catch(a){axe.log(a)}}catch(a){d(a)}}).catch(d)}function B(a){"use strict";switch(!0){case"string"==typeof a:case Array.isArray(a):case Node&&a instanceof Node:case NodeList&&a instanceof NodeList:return!0;case"object"!==(void 0===a?"undefined":qa(a)):return!1;case void 0!==a.include:case void 0!==a.exclude:case"number"==typeof a.length:return!0;default:return!1}}function C(a,b,c){"use strict";var d=new TypeError("axe.run arguments are invalid");if(!B(a)){if(void 0!==c)throw d;c=b,b=a,a=document}if("object"!==(void 0===b?"undefined":qa(b))){if(void 0!==c)throw d;c=b,b={}}if("function"!=typeof c&&void 0!==c)throw d;return{context:a,options:b,callback:c||ua}}function D(a,b){"use strict";["any","all","none"].forEach(function(c){Array.isArray(a[c])&&a[c].filter(function(a){return Array.isArray(a.relatedNodes)}).forEach(function(a){a.relatedNodes=a.relatedNodes.map(function(a){var c={html:a.source};return b.elementRef&&!a.fromFrame&&(c.element=a.element),(!1!==b.selectors||a.fromFrame)&&(c.target=a.selector),b.xpath&&(c.xpath=a.xpath),c})})})}function E(a,b){return xa.reduce(function(c,d){return c[d]=(a[d]||[]).map(function(a){return b(a,d)}),c},{})}function F(a,b,c){var d=Object.assign({},b);d.nodes=(d[c]||[]).concat(),axe.constants.resultGroups.forEach(function(a){delete d[a]}),a[c].push(d)}function G(a,b,c){"use strict";var d=window.getComputedStyle(a,null),e=!1;return!!d&&(b.forEach(function(a){d.getPropertyValue(a.property)===a.value&&(e=!0)}),!!e||!(a.nodeName.toUpperCase()===c.toUpperCase()||!a.parentNode)&&G(a.parentNode,b,c))}function H(a,b){"use strict";return new Error(a+": "+axe.utils.getSelector(b))}function I(a,b,c,d,e,f){"use strict";var g=axe.utils.queue();a.frames.forEach(function(e){var f={options:b,command:c,parameter:d,context:{initiator:!1,page:a.page,include:e.include||[],exclude:e.exclude||[]}};g.defer(function(a,b){var c=e.node;axe.utils.sendCommandToFrame(c,f,function(b){if(b)return a({results:b,frameElement:c,frame:axe.utils.getSelector(c)});a(null)},b)})}),g.then(function(a){e(axe.utils.mergeResults(a,b))}).catch(f)}function J(a,b){if(b=b||300,a.length>b){var c=a.indexOf(">");a=a.substring(0,c+1)}return a}function K(a){var b=a.outerHTML;return b||"function"!=typeof XMLSerializer||(b=(new XMLSerializer).serializeToString(a)),J(b||"")}function L(a,b,c){this._fromFrame=!!c,this.spec=c||{},b&&b.absolutePaths&&(this._options={toRoot:!0}),this.source=void 0!==this.spec.source?this.spec.source:K(a),this._element=a}function M(a,b){return{shadowId:b,children:[],actualNode:a}}function N(a){var b=[];for(a=a.firstChild;a;)b.push(a),a=a.nextSibling;return b}function O(){var a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return 0!==a.length&&(a.match(/[0-9]/g)||"").length>=a.length/2}function P(a,b){return[a.substring(0,b),a.substring(b)]}function Q(a){var b=a,c="",d="",e="",f="",g="",h="";if(a.includes("#")){var i=P(a,a.indexOf("#")),j=ya(i,2);a=j[0],h=j[1]}if(a.includes("?")){var k=P(a,a.indexOf("?")),l=ya(k,2);a=l[0],g=l[1]}if(a.includes("://")){var m=a.split("://"),n=ya(m,2);c=n[0],a=n[1];var o=P(a,a.indexOf("/")),p=ya(o,2);d=p[0],a=p[1]}else if("//"===a.substr(0,2)){a=a.substr(2);var q=P(a,a.indexOf("/")),r=ya(q,2);d=r[0],a=r[1]}if("www."===d.substr(0,4)&&(d=d.substr(4)),d&&d.includes(":")){var s=P(d,d.indexOf(":")),t=ya(s,2);d=t[0],e=t[1]}return f=a,{original:b,protocol:c,domain:d,port:e,path:f,query:g,hash:h}}function R(a){if(Array.isArray(a)){for(var b=0,c=Array(a.length);b<a.length;b++)c[b]=a[b];return c}return Array.from(a)}function S(a){return!["focus","hover","hidden","visible","dirty","touched","valid","disable","enable","active","col-"].find(function(b){return a.includes(b)})}function T(a){return a.classList&&0!==a.classList.length?(a.parentNode&&Array.from(a.parentNode.children||"")||[]).reduce(function(b,c){return a===c?b:b.filter(function(a){return!c.classList.contains(a)})},Array.from(a.classList).filter(S)):[]}function U(a,b){var c=a.parentNode&&Array.from(a.parentNode.children||"")||[];if(c.find(function(c){return c!==a&&axe.utils.matchesSelector(c,b)}))return":nth-child("+(1+c.indexOf(a))+")";return""}function V(a,b){var c=a.nodeName.toLowerCase(),d=Array.from(a.classList)||[],e={nodeName:c,classList:d,isCustomElm:c.includes("-"),isCommonElm:Aa.includes(c),distinctClassList:T(a)};return[Ba.getCustomElm,Ba.getElmRoleProp,Ba.getUncommonElm,Ba.getElmNameProp,Ba.getDistinctClass,Ba.getFileRefProp,Ba.getCommonName].reduce(function(c,d){if(c.length===b)return c;var f=d(a,e);return f&&(f[0].match(/[a-z]/)?c.unshift(f):c.push(f)),c},[])}function W(a,b,c){var d=void 0,e=void 0,f=b.isUnique,g=void 0!==f&&f,h=Ba.getElmId(a),i=b.featureCount,j=void 0===i?2:i,k=b.minDepth,l=void 0===k?1:k,m=b.toRoot,n=void 0!==m&&m,o=b.childSelectors,p=void 0===o?[]:o;h?(d=h,g=!0):(d=V(a,j).join(""),d+=U(a,d),g=b.isUnique||1===c.querySelectorAll(d).length,g||a!==document.documentElement||(d+=":root"),e=0!==l||!g);var q=[d].concat(R(p));return a.parentElement&&11!==a.parentElement.nodeType&&(n||e)?W(a.parentNode,{toRoot:n,isUnique:g,childSelectors:q,featureCount:1,minDepth:l-1},c):q.join(" > ")}function X(a,b){var c,d;if(!a)return[];if(!b&&9===a.nodeType)return b=[{str:"html"}];if(b=b||[],a.parentNode&&a.parentNode!==a&&(b=X(a.parentNode,b)),a.previousSibling){d=1,c=a.previousSibling;do{1===c.nodeType&&c.nodeName===a.nodeName&&d++,c=c.previousSibling}while(c);1===d&&(d=null)}else if(a.nextSibling){c=a.nextSibling;do{1===c.nodeType&&c.nodeName===a.nodeName?(d=1,c=null):(d=null,c=c.previousSibling)}while(c)}if(1===a.nodeType){var e={};e.str=a.nodeName.toLowerCase(),a.getAttribute&&a.getAttribute("id")&&1===a.ownerDocument.querySelectorAll("#"+axe.utils.escapeSelector(a.id)).length&&(e.id=a.getAttribute("id")),d>1&&(e.count=d),b.push(e)}return b}function Y(a){return a.reduce(function(a,b){return b.id?"/"+b.str+"[@id='"+b.id+"']":a+"/"+b.str+(b.count>0?"["+b.count+"]":"")},"")}function Z(a){"use strict";if(Ca&&Ca.parentNode)return void 0===Ca.styleSheet?Ca.appendChild(document.createTextNode(a)):Ca.styleSheet.cssText+=a,Ca;if(a){var b=document.head||document.getElementsByTagName("head")[0];return Ca=document.createElement("style"),Ca.type="text/css",void 0===Ca.styleSheet?Ca.appendChild(document.createTextNode(a)):Ca.styleSheet.cssText=a,b.appendChild(Ca),Ca}}function $(a,b,c,d){"use strict";var e=axe.utils.getXpath(c),f={element:c,selector:d,xpath:e};a.forEach(function(a){a.node=axe.utils.DqElement.fromFrame(a.node,b,f);var c=axe.utils.getAllChecks(a);c.length&&c.forEach(function(a){a.relatedNodes=a.relatedNodes.map(function(a){return axe.utils.DqElement.fromFrame(a,b,f)})})})}function _(a,b){"use strict";for(var c,d,e=b[0].node,f=0,g=a.length;f<g;f++)if(d=a[f].node,(c=axe.utils.nodeSorter({actualNode:d.element},{actualNode:e.element}))>0||0===c&&e.selector.length<d.selector.length)return void a.splice.apply(a,[f,0].concat(b));a.push.apply(a,b)}function aa(a){"use strict";return a&&a.results?Array.isArray(a.results)?a.results.length?a.results:null:[a.results]:null}function ba(a,b){function c(a){return a.incomplete&&a.incomplete.default?a.incomplete.default:ra.incompleteFallbackMessage()}if(!a||!a.missingData)return c(b);try{var d=b.incomplete[a.missingData[0].reason];if(!d)throw new Error;return d}catch(d){return"string"==typeof a.missingData?b.incomplete[a.missingData]:c(b)}}function ca(a,b){"use strict";return function(c){var d=a[c.id]||{},e=d.messages||{},f=Object.assign({},d);delete f.messages,void 0===c.result?"object"===qa(e.incomplete)?f.message=function(){return ba(c.data,e)}:f.message=e.incomplete:f.message=c.result===b?e.pass:e.fail,axe.utils.extendMetaData(c,f)}}function da(a,b){return 1===a.nodeType&&("*"===b.tag||a.nodeName.toLowerCase()===b.tag)}function ea(a,b){return!b.classes||b.classes.reduce(function(b,c){return b&&a.className&&a.className.match(c.regexp)},!0)}function fa(a,b){return!b.attributes||b.attributes.reduce(function(b,c){var d=a.getAttribute(c.key);return b&&null!==d&&(!c.value||c.test(d))},!0)}function ga(a,b){return!b.id||a.id===b.id}function ha(a,b){return!(b.pseudos&&!b.pseudos.reduce(function(b,c){if("not"===c.name)return b&&!Ea([a],c.expressions,!1).length;throw new Error("the pseudo selector "+c.name+" has not yet been implemented")},!0))}function ia(a,b,c){var d=[];return a=Array.isArray(a)?a:[a],a.forEach(function(a){da(a.actualNode,b)&&ea(a.actualNode,b)&&fa(a.actualNode,b)&&ga(a.actualNode,b)&&ha(a,b)&&d.push(a),c&&(d=d.concat(ia(a.children.filter(function(c){return!b.id||c.shadowId===a.shadowId}),b,c)))}),d}function ja(a){/*! Credit Mootools Copyright Mootools, MIT License */
+if(a)return a.map(function(a){var b,c,d=a.name.replace(Ga,""),e=(a.value||"").replace(Ga,"");switch(a.operator){case"^=":c=new RegExp("^"+Fa(e));break;case"$=":c=new RegExp(Fa(e)+"$");break;case"~=":c=new RegExp("(^|\\s)"+Fa(e)+"(\\s|$)");break;case"|=":c=new RegExp("^"+Fa(e)+"(-|$)");break;case"=":b=function(a){return e===a};break;case"*=":b=function(a){return a&&a.indexOf(e)>-1};break;case"!=":b=function(a){return e!==a};break;default:b=function(a){return!!a}}return""===e&&/^[*$^]=$/.test(a.operator)&&(b=function(){return!1}),b||(b=function(a){return a&&c.test(a)}),{key:d,value:e,test:b}})}function ka(a){if(a)return a.map(function(a){return a=a.replace(Ga,""),{value:a,regexp:new RegExp("(^|\\s)"+Fa(a)+"(\\s|$)")}})}function la(a){if(a)return a.map(function(a){var b;return"not"===a.name&&(b=axe.utils.cssParser.parse(a.value),b=b.selectors?b.selectors:[b],b=Da(b)),{name:a.name,expressions:b,value:a.value}})}function ma(a,b){"use strict";var c,d,e=axe._audit&&axe._audit.tagExclude?axe._audit.tagExclude:[];return b.include||b.exclude?(c=b.include||[],c=Array.isArray(c)?c:[c],d=b.exclude||[],d=Array.isArray(d)?d:[d],d=d.concat(e.filter(function(a){return-1===c.indexOf(a)}))):(c=Array.isArray(b)?b:[b],d=e.filter(function(a){return-1===c.indexOf(a)})),!!(c.some(function(b){return-1!==a.tags.indexOf(b)})||0===c.length&&!1!==a.enabled)&&d.every(function(b){return-1===a.tags.indexOf(b)})}function na(a){"use strict";return a.sort(function(a,b){return axe.utils.contains(a,b)?1:-1})[0]}function oa(a,b){"use strict";var c=b.include&&na(b.include.filter(function(b){return axe.utils.contains(b,a)})),d=b.exclude&&na(b.exclude.filter(function(b){return axe.utils.contains(b,a)}));return!!(!d&&c||d&&axe.utils.contains(d,c))}function pa(a,b,c){"use strict";for(var d=0,e=b.length;d<e;d++)!a.find(function(a){return a.actualNode===b[d].actualNode})&&oa(b[d],c)&&a.push(b[d])}var document=window.document,qa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},axe=axe||{};axe.version="2.3.1","function"==typeof define&&define.amd&&define([],function(){"use strict";return axe}),"object"===("undefined"==typeof module?"undefined":qa(module))&&module.exports&&"function"==typeof a.toString&&(axe.source="("+a.toString()+')(typeof window === "object" ? window : this);',module.exports=axe),"function"==typeof window.getComputedStyle&&(window.axe=axe);var commons;b.prototype=Object.create(Error.prototype),b.prototype.constructor=b;var utils=axe.utils={},ra={},qa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a};e.prototype._init=function(){var a=c(this.defaultConfig);axe.commons=commons=a.commons,this.reporter=a.reporter,this.commands={},this.rules=[],this.checks={},d(a.rules,this,"addRule"),d(a.checks,this,"addCheck"),this.data={},this.data.checks=a.data&&a.data.checks||{},this.data.rules=a.data&&a.data.rules||{},this.data.failureSummaries=a.data&&a.data.failureSummaries||{},this.data.incompleteFallbackMessage=a.data&&a.data.incompleteFallbackMessage||"",this._constructHelpUrls()},e.prototype.registerCommand=function(a){"use strict";this.commands[a.id]=a.callback},e.prototype.addRule=function(a){"use strict";a.metadata&&(this.data.rules[a.id]=a.metadata);var b=this.getRule(a.id);b?b.configure(a):this.rules.push(new q(a,this))},e.prototype.addCheck=function(a){"use strict";var b=a.metadata;"object"===(void 0===b?"undefined":qa(b))&&(this.data.checks[a.id]=b,"object"===qa(b.messages)&&Object.keys(b.messages).filter(function(a){return b.messages.hasOwnProperty(a)&&"string"==typeof b.messages[a]}).forEach(function(a){0===b.messages[a].indexOf("function")&&(b.messages[a]=new Function("return "+b.messages[a]+";")())})),this.checks[a.id]?this.checks[a.id].configure(a):this.checks[a.id]=new i(a)},e.prototype.run=function(a,b,c,d){"use strict";this.validateOptions(b),axe._tree=axe.utils.getFlattenedTree(document.body);var e=axe.utils.queue();this.rules.forEach(function(c){if(axe.utils.ruleShouldRun(c,a,b)){if(b.performanceTimer){var d="mark_rule_end_"+c.id,f="mark_rule_start_"+c.id;axe.utils.performanceTimer.mark(f)}e.defer(function(e,g){c.run(a,b,function(a){b.performanceTimer&&(axe.utils.performanceTimer.mark(d),axe.utils.performanceTimer.measure("rule_"+c.id,f,d)),e(a)},function(a){if(b.debug)g(a);else{var d=Object.assign(new p(c),{result:axe.constants.CANTTELL,description:"An error occured while running this rule",message:a.message,help:a.stack||a.message,error:a});e(d)}})})}}),e.then(function(a){axe._tree=void 0,c(a.filter(function(a){return!!a}))}).catch(d)},e.prototype.after=function(a,b){"use strict";var c=this.rules;return a.map(function(a){return axe.utils.findBy(c,"id",a.id).after(a,b)})},e.prototype.getRule=function(a){return this.rules.find(function(b){return b.id===a})},e.prototype.validateOptions=function(a){"use strict";var b=this;if("object"===qa(a.runOnly)){var c=a.runOnly;if("rule"===c.type&&Array.isArray(c.value))c.value.forEach(function(a){if(!b.getRule(a))throw new Error("unknown rule `"+a+"` in options.runOnly")});else if(Array.isArray(c.value)&&c.value.length>0){var d=[].concat(c.value);if(b.rules.forEach(function(a){var b,c,e;if(d)for(c=0,e=a.tags.length;c<e;c++)-1!==(b=d.indexOf(a.tags[c]))&&d.splice(b,1)}),0!==d.length)throw new Error("could not find tags `"+d.join("`, `")+"`")}}return"object"===qa(a.rules)&&Object.keys(a.rules).forEach(function(a){if(!b.getRule(a))throw new Error("unknown rule `"+a+"` in options.rules")}),a},e.prototype.setBranding=function(a){"use strict";var b={brand:this.brand,application:this.application};a&&a.hasOwnProperty("brand")&&a.brand&&"string"==typeof a.brand&&(this.brand=a.brand),a&&a.hasOwnProperty("application")&&a.application&&"string"==typeof a.application&&(this.application=a.application),this._constructHelpUrls(b)},e.prototype._constructHelpUrls=function(){var a=this,b=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,c=axe.version.substring(0,axe.version.lastIndexOf("."));this.rules.forEach(function(d){a.data.rules[d.id]||(a.data.rules[d.id]={});var e=a.data.rules[d.id];("string"!=typeof e.helpUrl||b&&e.helpUrl===f(b,d.id,c))&&(e.helpUrl=f(a,d.id,c))})},e.prototype.resetRulesAndChecks=function(){"use strict";this._init()},i.prototype.enabled=!0,i.prototype.run=function(a,b,c,d){"use strict";b=b||{};var e=b.hasOwnProperty("enabled")?b.enabled:this.enabled,f=b.options||this.options;if(e){var h,i=new g(this),j=axe.utils.checkHelper(i,b,c,d);try{h=this.evaluate.call(j,a.actualNode,f,a)}catch(a){return void d(a)}j.isAsync||(i.result=h,setTimeout(function(){c(i)},0))}else c(null)},i.prototype.configure=function(a){var b=this;["options","enabled"].filter(function(b){return a.hasOwnProperty(b)}).forEach(function(c){return b[c]=a[c]}),["evaluate","after"].filter(function(b){return a.hasOwnProperty(b)}).forEach(function(c){return b[c]=h(a[c])})};var qa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a};q.prototype.matches=function(){"use strict";return!0},q.prototype.gather=function(a){"use strict";var b=axe.utils.select(this.selector,a);return this.excludeHidden?b.filter(function(a){return!axe.utils.isHidden(a.actualNode)}):b},q.prototype.runChecks=function(a,b,c,d,e){"use strict";var f=this,g=axe.utils.queue();this[a].forEach(function(a){var d=f._audit.checks[a.id||a],e=axe.utils.getCheckOption(d,f.id,c);g.defer(function(a,c){d.run(b,e,a,c)})}),g.then(function(b){b=b.filter(function(a){return a}),d({type:a,results:b})}).catch(e)},q.prototype.run=function(a,c,d,e){var f=this,g=axe.utils.queue(),h=new p(this),i=void 0;try{i=this.gather(a).filter(function(a){return f.matches(a.actualNode)})}catch(a){return void e(new b({cause:a,ruleId:this.id}))}c.performanceTimer&&axe.log("gather (",i.length,"):",axe.utils.performanceTimer.timeElapsed()+"ms"),i.forEach(function(a){g.defer(function(b,d){var e=axe.utils.queue();e.defer(function(b,d){f.runChecks("any",a,c,b,d)}),e.defer(function(b,d){f.runChecks("all",a,c,b,d)}),e.defer(function(b,d){f.runChecks("none",a,c,b,d)}),e.then(function(d){if(d.length){var e=!1,f={};d.forEach(function(a){var b=a.results.filter(function(a){return a});f[a.type]=b,b.length&&(e=!0)}),e&&(f.node=new axe.utils.DqElement(a.actualNode,c),h.nodes.push(f))}b()}).catch(function(a){return d(a)})})}),g.then(function(){return d(h)}).catch(function(a){return e(a)})},q.prototype.after=function(a,b){"use strict";var c=r(this),d=this.id;return c.forEach(function(c){var e=s(a.nodes,c.id),f=axe.utils.getCheckOption(c,d,b),g=c.after(e,f);e.forEach(function(a){-1===g.indexOf(a)&&(a.filtered=!0)})}),a.nodes=u(a),a},q.prototype.configure=function(a){"use strict";a.hasOwnProperty("selector")&&(this.selector=a.selector),a.hasOwnProperty("excludeHidden")&&(this.excludeHidden="boolean"!=typeof a.excludeHidden||a.excludeHidden),a.hasOwnProperty("enabled")&&(this.enabled="boolean"!=typeof a.enabled||a.enabled),a.hasOwnProperty("pageLevel")&&(this.pageLevel="boolean"==typeof a.pageLevel&&a.pageLevel),a.hasOwnProperty("any")&&(this.any=a.any),a.hasOwnProperty("all")&&(this.all=a.all),a.hasOwnProperty("none")&&(this.none=a.none),a.hasOwnProperty("tags")&&(this.tags=a.tags),a.hasOwnProperty("matches")&&("string"==typeof a.matches?this.matches=new Function("return "+a.matches+";")():this.matches=a.matches)},function(axe){var a=[{name:"NA",value:"inapplicable",priority:0,group:"inapplicable"},{name:"PASS",value:"passed",priority:1,group:"passes"},{name:"CANTTELL",value:"cantTell",priority:2,group:"incomplete"},{name:"FAIL",value:"failed",priority:3,group:"violations"}],b={helpUrlBase:"https://dequeuniversity.com/rules/",results:[],resultGroups:[],resultGroupMap:{},impact:Object.freeze(["minor","moderate","serious","critical"])};a.forEach(function(a){var c=a.name,d=a.value,e=a.priority,f=a.group;b[c]=d,b[c+"_PRIO"]=e,b[c+"_GROUP"]=f,b.results[e]=d,b.resultGroups[e]=f,b.resultGroupMap[d]=f}),Object.freeze(b.results),Object.freeze(b.resultGroups),Object.freeze(b.resultGroupMap),Object.freeze(b),Object.defineProperty(axe,"constants",{value:b,enumerable:!0,configurable:!1,writable:!1})}(axe);var qa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a};axe.log=function(){"use strict";"object"===("undefined"==typeof console?"undefined":qa(console))&&console.log&&Function.prototype.apply.call(console.log,console,arguments)};var qa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a};axe.a11yCheck=function(a,b,c){"use strict";"function"==typeof b&&(c=b,b={}),b&&"object"===(void 0===b?"undefined":qa(b))||(b={});var d=axe._audit;if(!d)throw new Error("No audit configured");b.reporter=b.reporter||d.reporter||"v2",b.performanceTimer&&axe.utils.performanceTimer.start();var e=axe.getReporter(b.reporter);axe._runRules(a,b,function(a){var d=e(a,b,c);void 0!==d&&(b.performanceTimer&&axe.utils.performanceTimer.end(),c(d))},axe.log)},axe.cleanup=v,axe.configure=w,axe.getRules=function(a){"use strict";a=a||[];var b=a.length?axe._audit.rules.filter(function(b){return!!a.filter(function(a){return-1!==b.tags.indexOf(a)}).length}):axe._audit.rules,c=axe._audit.data.rules||{};return b.map(function(a){var b=c[a.id]||{};return{ruleId:a.id,description:b.description,help:b.help,helpUrl:b.helpUrl,tags:a.tags}})},axe._load=function(a){"use strict";axe.utils.respondable.subscribe("axe.ping",function(a,b,c){c({axe:!0})}),axe.utils.respondable.subscribe("axe.start",x),axe._audit=new e(a)};var axe=axe||{};axe.plugins={},y.prototype.run=function(){"use strict";return this._run.apply(this,arguments)},y.prototype.collect=function(){"use strict";return this._collect.apply(this,arguments)},y.prototype.cleanup=function(a){"use strict";var b=axe.utils.queue(),c=this;Object.keys(this._registry).forEach(function(a){b.defer(function(b){c._registry[a].cleanup(b)})}),b.then(function(){a()})},y.prototype.add=function(a){"use strict";this._registry[a.id]=a},axe.registerPlugin=function(a){"use strict";axe.plugins[a.id]=new y(a)};var sa,ta={};axe.getReporter=function(a){"use strict";return"string"==typeof a&&ta[a]?ta[a]:"function"==typeof a?a:sa},axe.addReporter=function(a,b,c){"use strict";ta[a]=b,c&&(sa=b)},axe.reset=z,axe._runRules=A;var qa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},ua=function(){};axe.run=function(a,b,c){"use strict";if(!axe._audit)throw new Error("No audit configured");var d=C(a,b,c);a=d.context,b=d.options,c=d.callback,b.reporter=b.reporter||axe._audit.reporter||"v1",b.performanceTimer&&axe.utils.performanceTimer.start();var e=void 0,f=ua,g=ua;return window.Promise&&c===ua&&(e=new Promise(function(a,b){f=b,g=a})),axe._runRules(a,b,function(a){var d=function(a){try{c(null,a)}catch(a){axe.log(a)}g(a)};b.performanceTimer&&axe.utils.performanceTimer.end();try{var e=axe.getReporter(b.reporter),h=e(a,b,d);void 0!==h&&d(h)}catch(a){c(a),f(a)}},function(a){c(a),f(a)}),e},ra.failureSummary=function(a){"use strict";var b={};return b.none=a.none.concat(a.all),b.any=a.any,Object.keys(b).map(function(a){if(b[a].length){var c=axe._audit.data.failureSummaries[a];return c&&"function"==typeof c.failureMessage?c.failureMessage(b[a].map(function(a){return a.message||""})):void 0}}).filter(function(a){return void 0!==a}).join("\n\n")},ra.incompleteFallbackMessage=function(){"use strict";return axe._audit.data.incompleteFallbackMessage()};var qa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},va=axe.constants.resultGroups;ra.processAggregate=function(a,b){var c=axe.utils.aggregateResult(a);return c.timestamp=(new Date).toISOString(),c.url=window.location.href,va.forEach(function(a){c[a]=(c[a]||[]).map(function(a){return a=Object.assign({},a),Array.isArray(a.nodes)&&a.nodes.length>0&&(a.nodes=a.nodes.map(function(a){return"object"===qa(a.node)&&(a.html=a.node.source,b.elementRef&&!a.node.fromFrame&&(a.element=a.node.element),(!1!==b.selectors||a.node.fromFrame)&&(a.target=a.node.selector),b.xpath&&(a.xpath=a.node.xpath)),delete a.result,delete a.node,D(a,b),a})),va.forEach(function(b){return delete a[b]}),delete a.pageLevel,delete a.result,a})}),c},axe.addReporter("na",function(a,b,c){"use strict";"function"==typeof b&&(c=b,b={});var d=ra.processAggregate(a,b);c({violations:d.violations,passes:d.passes,incomplete:d.incomplete,inapplicable:d.inapplicable,timestamp:d.timestamp,url:d.url})}),axe.addReporter("no-passes",function(a,b,c){"use strict";"function"==typeof b&&(c=b,b={});var d=ra.processAggregate(a,b);c({violations:d.violations,timestamp:d.timestamp,url:d.url})}),axe.addReporter("raw",function(a,b,c){"use strict";"function"==typeof b&&(c=b,b={}),c(a)}),axe.addReporter("v1",function(a,b,c){"use strict";"function"==typeof b&&(c=b,b={});var d=ra.processAggregate(a,b);d.violations.forEach(function(a){return a.nodes.forEach(function(a){a.failureSummary=ra.failureSummary(a)})}),c({violations:d.violations,passes:d.passes,incomplete:d.incomplete,inapplicable:d.inapplicable,timestamp:d.timestamp,url:d.url})}),axe.addReporter("v2",function(a,b,c){"use strict";"function"==typeof b&&(c=b,b={});var d=ra.processAggregate(a,b);c({violations:d.violations,passes:d.passes,incomplete:d.incomplete,inapplicable:d.inapplicable,timestamp:d.timestamp,url:d.url})},!0),axe.utils.aggregate=function(a,b,c){b=b.slice(),c&&b.push(c);var d=b.map(function(b){return a.indexOf(b)}).sort();return a[d.pop()]};var wa=[];wa[axe.constants.PASS_PRIO]=!0,wa[axe.constants.CANTTELL_PRIO]=null,wa[axe.constants.FAIL_PRIO]=!1;var xa=["any","all","none"];axe.utils.aggregateChecks=function(a){var b=Object.assign({},a);E(b,function(a,b){var c=wa.indexOf(a.result);a.priority=-1!==c?c:axe.constants.CANTTELL_PRIO,"none"===b&&(a.priority=4-a.priority)});var c=E(b,function(a){return a.priority});b.priority=Math.max(c.all.reduce(function(a,b){return Math.max(a,b)},0),c.none.reduce(function(a,b){return Math.max(a,b)},0),c.any.reduce(function(a,b){return Math.min(a,b)},4)%4);var d=[];return xa.forEach(function(a){b[a]=b[a].filter(function(a){return a.priority===b.priority}),b[a].forEach(function(a){return d.push(a.impact)})}),b.priority===axe.constants.FAIL_PRIO?b.impact=axe.utils.aggregate(axe.constants.impact,d):b.impact=null,E(b,function(a){delete a.result,delete a.priority}),b.result=axe.constants.results[b.priority],delete b.priority,b},axe.utils.aggregateResult=function(a){var b={};return axe.constants.resultGroups.forEach(function(a){return b[a]=[]}),a.forEach(function(a){a.error?F(b,a,axe.constants.CANTTELL_GROUP):a.result===axe.constants.NA?F(b,a,axe.constants.NA_GROUP):axe.constants.resultGroups.forEach(function(c){Array.isArray(a[c])&&a[c].length>0&&F(b,a,c)})}),b},function(){axe.utils.aggregateRule=function(a){var b={};a=a.map(function(a){if(a.any&&a.all&&a.none)return axe.utils.aggregateChecks(a);if(Array.isArray(a.node))return axe.utils.finalizeRuleResult(a);throw new TypeError("Invalid Result type")});var c=a.map(function(a){return a.result});b.result=axe.utils.aggregate(axe.constants.results,c,b.result),axe.constants.resultGroups.forEach(function(a){return b[a]=[]}),a.forEach(function(a){var c=axe.constants.resultGroupMap[a.result];b[c].push(a)});var d=axe.constants.FAIL_GROUP;if(b[d].length>0){var e=b[d].map(function(a){return a.impact});b.impact=axe.utils.aggregate(axe.constants.impact,e)||null}else b.impact=null;return b}}(),axe.utils.areStylesSet=G,axe.utils.checkHelper=function(a,b,c,d){"use strict";return{isAsync:!1,async:function(){return this.isAsync=!0,function(b){b instanceof Error==!1?(a.value=b,c(a)):d(b)}},data:function(b){a.data=b},relatedNodes:function(c){c=c instanceof Node?[c]:axe.utils.toArray(c),a.relatedNodes=c.map(function(a){return new axe.utils.DqElement(a,b)})}}};var qa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a};axe.utils.clone=function(a){"use strict";var b,c,d=a;if(null!==a&&"object"===(void 0===a?"undefined":qa(a)))if(Array.isArray(a))for(d=[],b=0,c=a.length;b<c;b++)d[b]=axe.utils.clone(a[b]);else{d={};for(b in a)d[b]=axe.utils.clone(a[b])}return d},axe.utils.sendCommandToFrame=function(a,b,c,d){"use strict";var e=a.contentWindow;if(!e)return axe.log("Frame does not have a content window",a),void c(null);var f=setTimeout(function(){f=setTimeout(function(){var e=H("No response from frame",a);b.debug?d(e):(axe.log(e),c(null))},0)},500);axe.utils.respondable(e,"axe.ping",null,void 0,function(){clearTimeout(f),f=setTimeout(function(){d(H("Axe in frame timed out",a))},3e4),axe.utils.respondable(e,"axe.start",b,void 0,function(a){clearTimeout(f),a instanceof Error==!1?c(a):d(a)})})},axe.utils.collectResultsFromFrames=I,axe.utils.contains=function(a,b){"use strict";function c(a,b){return a.shadowId===b.shadowId||!!a.children.find(function(a){return c(a,b)})}return a.shadowId||b.shadowId?c(a,b):"function"==typeof a.actualNode.contains?a.actualNode.contains(b.actualNode):!!(16&a.actualNode.compareDocumentPosition(b.actualNode))},function(axe){/*!
+  * The copyright below covers the code within this function block only
+  *
+  * Copyright (c) 2013 Dulin Marat
+  * 
+  * Permission is hereby granted, free of charge, to any person obtaining a copy
+  * of this software and associated documentation files (the "Software"), to deal
+  * in the Software without restriction, including without limitation the rights
+  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  * copies of the Software, and to permit persons to whom the Software is
+  * furnished to do so, subject to the following conditions:
+  * 
+  * The above copyright notice and this permission notice shall be included in
+  * all copies or substantial portions of the Software.
+  * 
+  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+  * THE SOFTWARE.
+  */
+function a(){this.pseudos={},this.attrEqualityMods={},this.ruleNestingOperators={},this.substitutesEnabled=!1}function b(a){return a>="a"&&a<="z"||a>="A"&&a<="Z"||"-"===a||"_"===a}function c(a){return a>="a"&&a<="z"||a>="A"&&a<="Z"||a>="0"&&a<="9"||"-"===a||"_"===a}function d(a){return a>="a"&&a<="f"||a>="A"&&a<="F"||a>="0"&&a<="9"}function e(a,e,g,j,k,l){var m,n,o,p,q;return p=a.length,m=null,o=function(b,c){var f,g,h;for(h="",e++,m=a.charAt(e);e<p;){if(m===b)return e++,h;if("\\"===m)if(e++,(m=a.charAt(e))===b)h+=b;else if(f=c[m])h+=f;else{if(d(m)){for(g=m,e++,m=a.charAt(e);d(m);)g+=m,e++,m=a.charAt(e);" "===m&&(e++,m=a.charAt(e)),h+=String.fromCharCode(parseInt(g,16));continue}h+=m}else h+=m;e++,m=a.charAt(e)}return h},n=function(){var b="";for(m=a.charAt(e);e<p;){if(c(m))b+=m;else{if("\\"!==m)return b;if(++e>=p)throw Error("Expected symbol but end of file reached.");if(m=a.charAt(e),f[m])b+=m;else{if(d(m)){var g=m;for(e++,m=a.charAt(e);d(m);)g+=m,e++,m=a.charAt(e);" "===m&&(e++,m=a.charAt(e)),b+=String.fromCharCode(parseInt(g,16));continue}b+=m}}e++,m=a.charAt(e)}return b},q=function(){m=a.charAt(e);for(var b=!1;" "===m||"\t"===m||"\n"===m||"\r"===m||"\f"===m;)b=!0,e++,m=a.charAt(e);return b},this.parse=function(){var b=this.parseSelector();if(e<p)throw Error('Rule expected but "'+a.charAt(e)+'" found.');return b},this.parseSelector=function(){var b,c=b=this.parseSingleSelector();for(m=a.charAt(e);","===m;){if(e++,q(),"selectors"!==b.type&&(b={type:"selectors",selectors:[c]}),!(c=this.parseSingleSelector()))throw Error('Rule expected after ",".');b.selectors.push(c)}return b},this.parseSingleSelector=function(){q();var b={type:"ruleSet"},c=this.parseRule();if(!c)return null;for(var d=b;c&&(c.type="rule",d.rule=c,d=c,q(),m=a.charAt(e),!(e>=p||","===m||")"===m));)if(k[m]){var f=m;if(e++,q(),!(c=this.parseRule()))throw Error('Rule expected after "'+f+'".');c.nestingOperator=f}else(c=this.parseRule())&&(c.nestingOperator=null);return b},this.parseRule=function(){for(var c=null;e<p;)if("*"===(m=a.charAt(e)))e++,(c=c||{}).tagName="*";else if(b(m)||"\\"===m)(c=c||{}).tagName=n();else if("."===m)e++,c=c||{},(c.classNames=c.classNames||[]).push(n());else if("#"===m)e++,(c=c||{}).id=n();else if("["===m){e++,q();var d={name:n()};if(q(),"]"===m)e++;else{var f="";if(j[m]&&(f=m,e++,m=a.charAt(e)),e>=p)throw Error('Expected "=" but end of file reached.');if("="!==m)throw Error('Expected "=" but "'+m+'" found.');d.operator=f+"=",e++,q();var k="";if(d.valueType="string",'"'===m)k=o('"',i);else if("'"===m)k=o("'",h);else if(l&&"$"===m)e++,k=n(),d.valueType="substitute";else{for(;e<p&&"]"!==m;)k+=m,e++,m=a.charAt(e);k=k.trim()}if(q(),e>=p)throw Error('Expected "]" but end of file reached.');if("]"!==m)throw Error('Expected "]" but "'+m+'" found.');e++,d.value=k}c=c||{},(c.attrs=c.attrs||[]).push(d)}else{if(":"!==m)break;e++;var r=n(),s={name:r};if("("===m){e++;var t="";if(q(),"selector"===g[r])s.valueType="selector",t=this.parseSelector();else{if(s.valueType=g[r]||"string",'"'===m)t=o('"',i);else if("'"===m)t=o("'",h);else if(l&&"$"===m)e++,t=n(),s.valueType="substitute";else{for(;e<p&&")"!==m;)t+=m,e++,m=a.charAt(e);t=t.trim()}q()}if(e>=p)throw Error('Expected ")" but end of file reached.');if(")"!==m)throw Error('Expected ")" but "'+m+'" found.');e++,s.value=t}c=c||{},(c.pseudos=c.pseudos||[]).push(s)}return c},this}a.prototype.registerSelectorPseudos=function(a){for(var b=0,c=arguments.length;b<c;b++)a=arguments[b],this.pseudos[a]="selector";return this},a.prototype.unregisterSelectorPseudos=function(a){for(var b=0,c=arguments.length;b<c;b++)a=arguments[b],delete this.pseudos[a];return this},a.prototype.registerNumericPseudos=function(a){for(var b=0,c=arguments.length;b<c;b++)a=arguments[b],this.pseudos[a]="numeric";return this},a.prototype.unregisterNumericPseudos=function(a){for(var b=0,c=arguments.length;b<c;b++)a=arguments[b],delete this.pseudos[a];return this},a.prototype.registerNestingOperators=function(a){for(var b=0,c=arguments.length;b<c;b++)a=arguments[b],this.ruleNestingOperators[a]=!0;return this},a.prototype.unregisterNestingOperators=function(a){for(var b=0,c=arguments.length;b<c;b++)a=arguments[b],delete this.ruleNestingOperators[a];return this},a.prototype.registerAttrEqualityMods=function(a){for(var b=0,c=arguments.length;b<c;b++)a=arguments[b],this.attrEqualityMods[a]=!0;return this},a.prototype.unregisterAttrEqualityMods=function(a){for(var b=0,c=arguments.length;b<c;b++)a=arguments[b],delete this.attrEqualityMods[a];return this},a.prototype.enableSubstitutes=function(){return this.substitutesEnabled=!0,this},a.prototype.disableSubstitutes=function(){return this.substitutesEnabled=!1,this};var f={"!":!0,'"':!0,"#":!0,$:!0,"%":!0,"&":!0,"'":!0,"(":!0,")":!0,"*":!0,"+":!0,",":!0,".":!0,"/":!0,";":!0,"<":!0,"=":!0,">":!0,"?":!0,"@":!0,"[":!0,"\\":!0,"]":!0,"^":!0,"`":!0,"{":!0,"|":!0,"}":!0,"~":!0},g={"\n":"\\n","\r":"\\r","\t":"\\t","\f":"\\f","\v":"\\v"},h={n:"\n",r:"\r",t:"\t",f:"\f","\\":"\\","'":"'"},i={n:"\n",r:"\r",t:"\t",f:"\f","\\":"\\",'"':'"'};a.prototype.parse=function(a){return new e(a,0,this.pseudos,this.attrEqualityMods,this.ruleNestingOperators,this.substitutesEnabled).parse()},a.prototype.escapeIdentifier=function(a){for(var b="",c=0,d=a.length;c<d;){var e=a.charAt(c);if(f[e])b+="\\"+e;else if("_"===e||"-"===e||e>="A"&&e<="Z"||e>="a"&&e<="z"||0!==c&&e>="0"&&e<="9")b+=e;else{var g=e.charCodeAt(0);if(55296==(63488&g)){var h=a.charCodeAt(c++);if(55296!=(64512&g)||56320!=(64512&h))throw Error("UCS-2(decode): illegal sequence");g=((1023&g)<<10)+(1023&h)+65536}b+="\\"+g.toString(16)+" "}c++}return b},a.prototype.escapeStr=function(a){for(var b,c,d="",e=0,f=a.length;e<f;)b=a.charAt(e),'"'===b?b='\\"':"\\"===b?b="\\\\":(c=g[b])&&(b=c),d+=b,e++;return'"'+d+'"'},a.prototype.render=function(a){return this._renderEntity(a).trim()},a.prototype._renderEntity=function(a){var b,c,d;switch(d="",a.type){case"ruleSet":for(b=a.rule,c=[];b;)b.nestingOperator&&c.push(b.nestingOperator),c.push(this._renderEntity(b)),b=b.rule;d=c.join(" ");break;case"selectors":d=a.selectors.map(this._renderEntity,this).join(", ");break;case"rule":a.tagName&&(d="*"===a.tagName?"*":this.escapeIdentifier(a.tagName)),a.id&&(d+="#"+this.escapeIdentifier(a.id)),a.classNames&&(d+=a.classNames.map(function(a){return"."+this.escapeIdentifier(a)},this).join("")),a.attrs&&(d+=a.attrs.map(function(a){return a.operator?"substitute"===a.valueType?"["+this.escapeIdentifier(a.name)+a.operator+"$"+a.value+"]":"["+this.escapeIdentifier(a.name)+a.operator+this.escapeStr(a.value)+"]":"["+this.escapeIdentifier(a.name)+"]"},this).join("")),a.pseudos&&(d+=a.pseudos.map(function(a){return a.valueType?"selector"===a.valueType?":"+this.escapeIdentifier(a.name)+"("+this._renderEntity(a.value)+")":"substitute"===a.valueType?":"+this.escapeIdentifier(a.name)+"($"+a.value+")":"numeric"===a.valueType?":"+this.escapeIdentifier(a.name)+"("+a.value+")":":"+this.escapeIdentifier(a.name)+"("+this.escapeIdentifier(a.value)+")":":"+this.escapeIdentifier(a.name)},this).join(""));break;default:throw Error('Unknown entity type: "'+a.type(NaN))}return d};var j=new a;j.registerNestingOperators(">"),axe.utils.cssParser=j}(axe),L.prototype={get selector(){return this.spec.selector||[axe.utils.getSelector(this.element,this._options)]},get xpath(){return this.spec.xpath||[axe.utils.getXpath(this.element)]},get element(){return this._element},get fromFrame(){return this._fromFrame},toJSON:function(){"use strict";return{selector:this.selector,source:this.source,xpath:this.xpath}}},L.fromFrame=function(a,b,c){return a.selector.unshift(c.selector),a.xpath.unshift(c.xpath),new axe.utils.DqElement(c.element,b,a)},axe.utils.DqElement=L,axe.utils.matchesSelector=function(){"use strict";function a(a){var b,c,d=a.Element.prototype,e=["matches","matchesSelector","mozMatchesSelector","webkitMatchesSelector","msMatchesSelector"],f=e.length;for(b=0;b<f;b++)if(c=e[b],d[c])return c}var b;return function(c,d){return b&&c[b]||(b=a(c.ownerDocument.defaultView)),c[b](d)}}(),axe.utils.escapeSelector=function(a){"use strict";for(var b,c=String(a),d=c.length,e=-1,f="",g=c.charCodeAt(0);++e<d;){if(0==(b=c.charCodeAt(e)))throw new Error("INVALID_CHARACTER_ERR");b>=1&&b<=31||b>=127&&b<=159||0==e&&b>=48&&b<=57||1==e&&b>=48&&b<=57&&45==g?f+="\\"+b.toString(16)+" ":f+=(1!=e||45!=b||45!=g)&&(b>=128||45==b||95==b||b>=48&&b<=57||b>=65&&b<=90||b>=97&&b<=122)?c.charAt(e):"\\"+c.charAt(e)}return f},axe.utils.extendMetaData=function(a,b){Object.assign(a,b),Object.keys(b).filter(function(a){return"function"==typeof b[a]}).forEach(function(c){a[c]=null;try{a[c]=b[c](a)}catch(a){}})},axe.utils.finalizeRuleResult=function(a){return Object.assign(a,axe.utils.aggregateRule(a.nodes)),delete a.nodes,a};var qa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a};axe.utils.findBy=function(a,b,c){if(Array.isArray(a))return a.find(function(a){return"object"===(void 0===a?"undefined":qa(a))&&a[b]===c})};var axe=axe||{utils:{}};axe.utils.getFlattenedTree=function(a,b){function c(a,c){var d=axe.utils.getFlattenedTree(c,b);return d&&(a=a.concat(d)),a}var d,e,f;if(a.documentElement&&(a=a.documentElement),f=a.nodeName.toLowerCase(),a.shadowRoot&&"marquee"!==f)return b="a"+Math.random().toString().substring(2),e=Array.from(a.shadowRoot.childNodes),e.reduce(c,[]);if("content"===f)return e=Array.from(a.getDistributedNodes()),e.reduce(c,[]);if("slot"===f){e=Array.from(a.assignedNodes()),e.length||(e=N(a));window.getComputedStyle(a);return e.reduce(c,[])}return 1===a.nodeType?(d=M(a,b),e=Array.from(a.childNodes),d.children=e.reduce(c,[]),[d]):3===a.nodeType?[M(a)]:void 0},axe.utils.getNodeFromTree=function(a,b){var c;return a.children.forEach(function(a){var d;a.actualNode===b?c=a:(d=axe.utils.getNodeFromTree(a,b))&&(c=d)}),c},axe.utils.getAllChecks=function(a){"use strict";return[].concat(a.any||[]).concat(a.all||[]).concat(a.none||[])},axe.utils.getCheckOption=function(a,b,c){var d=((c.rules&&c.rules[b]||{}).checks||{})[a.id],e=(c.checks||{})[a.id],f=a.enabled,g=a.options;return e&&(e.hasOwnProperty("enabled")&&(f=e.enabled),e.hasOwnProperty("options")&&(g=e.options)),d&&(d.hasOwnProperty("enabled")&&(f=d.enabled),d.hasOwnProperty("options")&&(g=d.options)),{enabled:f,options:g,absolutePaths:c.absolutePaths}};var ya=function(){function a(a,b){var c=[],d=!0,e=!1,f=void 0;try{for(var g,h=a[Symbol.iterator]();!(d=(g=h.next()).done)&&(c.push(g.value),!b||c.length!==b);d=!0);}catch(a){e=!0,f=a}finally{try{!d&&h.return&&h.return()}finally{if(e)throw f}}return c}return function(b,c){if(Array.isArray(b))return b;if(Symbol.iterator in Object(b))return a(b,c);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();axe.utils.getFriendlyUriEnd=function(){var a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!(a.length<=1||"data:"===a.substr(0,5)||"javascript:"===a.substr(0,11)||a.includes("?"))){var c=b.currentDomain,d=b.maxLength,e=void 0===d?25:d,f=Q(a),g=f.path,h=f.domain,i=f.hash,j=g.substr(g.substr(0,g.length-2).lastIndexOf("/")+1);if(i)return j&&(j+i).length<=e?j+i:j.length<2&&i.length>2&&i.length<=e?i:void 0;if(h&&h.length<e&&g.length<=1)return h+g;if(g==="/"+j&&h&&c&&h!==c&&(h+g).length<=e)return h+g;var k=j.lastIndexOf(".");return(-1===k||k>1)&&(-1!==k||j.length>2)&&j.length<=e&&!j.match(/index(\.[a-zA-Z]{2-4})?/)&&!O(j)?j:void 0}};var za=axe.utils.escapeSelector,Aa=["div","span","p","b","i","u","strong","em","h2","h3"],Ba={getElmId:function(a){if(a.id){var b=a.getRootNode&&a.getRootNode()||document,c="#"+za(a.id||"");return c.match(/player_uid_/)||1!==b.querySelectorAll(c).length?void 0:c}},getCustomElm:function(a,b){var c=b.isCustomElm,d=b.nodeName;if(c)return d},getElmRoleProp:function(a){if(a.hasAttribute("role"))return'[role="'+za(a.getAttribute("role"))+'"]'},getUncommonElm:function(a,b){var c=b.isCommonElm,d=b.isCustomElm,e=b.nodeName;if(!c&&!d)return e=za(e),"input"===e&&a.hasAttribute("type")&&(e+='[type="'+a.type+'"]'),e},getElmNameProp:function(a){if(!a.id&&a.name)return'[name="'+za(a.name)+'"]'},getDistinctClass:function(a,b){var c=b.distinctClassList;if(c.length>0&&c.length<3)return"."+c.map(za).join(".")},getFileRefProp:function(a){var b=void 0;if(a.hasAttribute("href"))b="href";else{if(!a.hasAttribute("src"))return;b="src"}var c=axe.utils.getFriendlyUriEnd(a.getAttribute(b));if(c)return"["+b+'$="'+encodeURI(c)+'"]'},getCommonName:function(a,b){var c=b.nodeName;if(b.isCommonElm)return c}};axe.utils.getSelector=function(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!a)return"";var c=a.getRootNode&&a.getRootNode()||document;if(11===c.nodeType){for(var d=[];11===c.nodeType;)d.push({elm:a,doc:c}),a=c.host,c=a.getRootNode();return d.push({elm:a,doc:c}),d.reverse().map(function(a){return W(a.elm,b,a.doc)})}return W(a,b,c)},axe.utils.getXpath=function(a){return Y(X(a))};var Ca;axe.utils.injectStyle=Z,axe.utils.isHidden=function(a,b){"use strict";var c;if(9===a.nodeType)return!1;11===a.nodeType&&(a=a.host);var d=window.getComputedStyle(a,null);return!d||!a.parentNode||"none"===d.getPropertyValue("display")||!b&&"hidden"===d.getPropertyValue("visibility")||"true"===a.getAttribute("aria-hidden")||(c=a.assignedSlot?a.assignedSlot:a.parentNode,axe.utils.isHidden(c,!0))},axe.utils.mergeResults=function(a,b){"use strict";var c=[];return a.forEach(function(a){var d=aa(a);d&&d.length&&d.forEach(function(d){d.nodes&&a.frame&&$(d.nodes,b,a.frameElement,a.frame);var e=axe.utils.findBy(c,"id",d.id);e?d.nodes.length&&_(e.nodes,d.nodes):c.push(d)})}),c},axe.utils.nodeSorter=function(a,b){"use strict";return a.actualNode===b.actualNode?0:4&a.actualNode.compareDocumentPosition(b.actualNode)?-1:1},utils.performanceTimer=function(){"use strict";function a(){if(window.performance&&window.performance)return window.performance.now()}var b=null,c=a();return{start:function(){this.mark("mark_axe_start")},end:function(){this.mark("mark_axe_end"),this.measure("axe","mark_axe_start","mark_axe_end"),this.logMeasures("axe")},auditStart:function(){this.mark("mark_audit_start")},auditEnd:function(){this.mark("mark_audit_end"),this.measure("audit_start_to_end","mark_audit_start","mark_audit_end"),this.logMeasures()},mark:function(a){window.performance&&void 0!==window.performance.mark&&window.performance.mark(a)},measure:function(a,b,c){window.performance&&void 0!==window.performance.measure&&window.performance.measure(a,b,c)},logMeasures:function(a){function b(a){axe.log("Measure "+a.name+" took "+a.duration+"ms")}if(window.performance&&void 0!==window.performance.getEntriesByType)for(var c=window.performance.getEntriesByType("measure"),d=0;d<c.length;++d){var e=c[d];if(e.name===a)return void b(e);b(e)}},timeElapsed:function(){return a()-c},reset:function(){b||(b=a()),c=a()}}}(),"function"!=typeof Object.assign&&function(){Object.assign=function(a){"use strict";if(void 0===a||null===a)throw new TypeError("Cannot convert undefined or null to object");for(var b=Object(a),c=1;c<arguments.length;c++){var d=arguments[c];if(void 0!==d&&null!==d)for(var e in d)d.hasOwnProperty(e)&&(b[e]=d[e])}return b}}(),Array.prototype.find||(Array.prototype.find=function(a){if(null===this)throw new TypeError("Array.prototype.find called on null or undefined");if("function"!=typeof a)throw new TypeError("predicate must be a function");for(var b,c=Object(this),d=c.length>>>0,e=arguments[1],f=0;f<d;f++)if(b=c[f],a.call(e,b,f,c))return b}),axe.utils.pollyfillElementsFromPoint=function(){if(document.elementsFromPoint)return document.elementsFromPoint;if(document.msElementsFromPoint)return document.msElementsFromPoint;var a=function(){var a=document.createElement("x");return a.style.cssText="pointer-events:auto","auto"===a.style.pointerEvents}(),b=a?"pointer-events":"visibility",c=a?"none":"hidden",d=document.createElement("style");return d.innerHTML=a?"* { pointer-events: all }":"* { visibility: visible }",function(a,e){var f,g,h,i=[],j=[];for(document.head.appendChild(d);(f=document.elementFromPoint(a,e))&&-1===i.indexOf(f);)i.push(f),j.push({value:f.style.getPropertyValue(b),priority:f.style.getPropertyPriority(b)}),f.style.setProperty(b,c,"important");for(g=j.length;h=j[--g];)i[g].style.setProperty(b,h.value?h.value:"",h.priority);return document.head.removeChild(d),i}},"function"==typeof window.addEventListener&&(document.elementsFromPoint=axe.utils.pollyfillElementsFromPoint()),Array.prototype.includes||(Array.prototype.includes=function(a){"use strict";var b=Object(this),c=parseInt(b.length,10)||0;if(0===c)return!1;var d,e=parseInt(arguments[1],10)||0;e>=0?d=e:(d=c+e)<0&&(d=0);for(var f;d<c;){if(f=b[d],a===f||a!==a&&f!==f)return!0;d++}return!1}),Array.prototype.some||(Array.prototype.some=function(a){"use strict";if(null==this)throw new TypeError("Array.prototype.some called on null or undefined");if("function"!=typeof a)throw new TypeError;for(var b=Object(this),c=b.length>>>0,d=arguments.length>=2?arguments[1]:void 0,e=0;e<c;e++)if(e in b&&a.call(d,b[e],e,b))return!0;return!1}),Array.from||(Array.from=function(){var a=Object.prototype.toString,b=function(b){return"function"==typeof b||"[object Function]"===a.call(b)},c=function(a){var b=Number(a);return isNaN(b)?0:0!==b&&isFinite(b)?(b>0?1:-1)*Math.floor(Math.abs(b)):b},d=Math.pow(2,53)-1,e=function(a){var b=c(a);return Math.min(Math.max(b,0),d)};return function(a){var c=this,d=Object(a);if(null==a)throw new TypeError("Array.from requires an array-like object - not null or undefined");var f,g=arguments.length>1?arguments[1]:void 0;if(void 0!==g){if(!b(g))throw new TypeError("Array.from: when provided, the second argument must be a function");arguments.length>2&&(f=arguments[2])}for(var h,i=e(d.length),j=b(c)?Object(new c(i)):new Array(i),k=0;k<i;)h=d[k],j[k]=g?void 0===f?g(h,k):g.call(f,h,k):h,k+=1;return j.length=i,j}}()),String.prototype.includes||(String.prototype.includes=function(a,b){return"number"!=typeof b&&(b=0),!(b+a.length>this.length)&&-1!==this.indexOf(a,b)});var qa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a};axe.utils.publishMetaData=function(a){"use strict";var b=axe._audit.data.checks||{},c=axe._audit.data.rules||{},d=axe.utils.findBy(axe._audit.rules,"id",a.id)||{};a.tags=axe.utils.clone(d.tags||[]);var e=ca(b,!0),f=ca(b,!1);a.nodes.forEach(function(a){a.any.forEach(e),a.all.forEach(e),a.none.forEach(f)}),axe.utils.extendMetaData(a,axe.utils.clone(c[a.id]||{}))};var Da=function(){},Ea=function(){},Fa=function(){/*! Credit: XRegExp 0.6.1 (c) 2007-2008 Steven Levithan <http://stevenlevithan.com/regex/xregexp/> MIT License */
+var a=/(?=[\-\[\]{}()*+?.\\\^$|,#\s])/g;return function(b){return b.replace(a,"\\")}}(),Ga=/\\/g;Da=function(a){return a.map(function(a){for(var b=[],c=a.rule;c;)b.push({tag:c.tagName?c.tagName.toLowerCase():"*",combinator:c.nestingOperator?c.nestingOperator:" ",id:c.id,attributes:ja(c.attrs),classes:ka(c.classNames),pseudos:la(c.pseudos)}),c=c.rule;return b})},Ea=function(a,b,c){return b.reduce(function(b,d){var e=a;return d.forEach(function(a,b){if(c=">"!==a.combinator&&c,-1===[" ",">"].indexOf(a.combinator))throw new Error("axe.utils.querySelectorAll does not support the combinator: "+a.combinator);e=e.reduce(function(d,e){return d.concat(ia(b?e.children:e,a,c))},[])}),b.concat(e)},[])},axe.utils.querySelectorAll=function(a,b){a=Array.isArray(a)?a:[a];var c=axe.utils.cssParser.parse(b);return c=c.selectors?c.selectors:[c],c=Da(c),Ea(a,c,!0)};var qa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a};!function(){"use strict";function a(){}function b(a){if("function"!=typeof a)throw new TypeError("Queue methods require functions as arguments")}function c(){function c(b){return function(c){g[b]=c,(i-=1)||j===a||(k=!0,j(g))}}function d(b){return j=a,m(b),g}function e(){for(var a=g.length;h<a;h++){var b=g[h];try{b.call(null,c(h),d)}catch(a){d(a)}}}var f,g=[],h=0,i=0,j=a,k=!1,l=function(a){f=a,setTimeout(function(){void 0!==f&&null!==f&&axe.log("Uncaught error (of queue)",f)},1)},m=l,n={defer:function(a){if("object"===(void 0===a?"undefined":qa(a))&&a.then&&a.catch){var c=a;a=function(a,b){c.then(a).catch(b)}}if(b(a),void 0===f){if(k)throw new Error("Queue already completed");return g.push(a),++i,e(),n}},then:function(c){if(b(c),j!==a)throw new Error("queue `then` already set");return f||(j=c,i||(k=!0,j(g))),n},catch:function(a){if(b(a),m!==l)throw new Error("queue `catch` already set");return f?(a(f),f=null):m=a,n},abort:d};return n}axe.utils.queue=c}();var qa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a};!function(a){"use strict";function b(){var a="axe",b="";return void 0!==axe&&axe._audit&&!axe._audit.application&&(a=axe._audit.application),void 0!==axe&&(b=axe.version),a+"."+b}function c(a){if("object"===(void 0===a?"undefined":qa(a))&&"string"==typeof a.uuid&&!0===a._respondable){var c=b();return a._source===c||"axe.x.y.z"===a._source||"axe.x.y.z"===c}return!1}function d(a,c,d,e,f,g){var h;d instanceof Error&&(h={name:d.name,message:d.message,stack:d.stack},d=void 0);var i={uuid:e,topic:c,message:d,error:h,_respondable:!0,_source:b(),_keepalive:f};"function"==typeof g&&(j[e]=g),a.postMessage(JSON.stringify(i),"*")}function e(a,b,c,e,f){d(a,b,c,Ha.v1(),e,f)}function f(a,b,c){return function(e,f,g){d(a,b,e,c,f,g)}}function g(a,b,c){var d=b.topic,e=k[d];if(e){var g=f(a,null,b.uuid);e(b.message,c,g)}}function h(a){var b=a.message||"Unknown error occurred",c=window[a.name]||Error;return a.stack&&(b+="\n"+a.stack.replace(a.message,"")),new c(b)}function i(a){var b;if("string"==typeof a){try{b=JSON.parse(a)}catch(a){}if(c(b))return"object"===qa(b.error)?b.error=h(b.error):b.error=void 0,b}}var j={},k={};e.subscribe=function(a,b){k[a]=b},e.isInFrame=function(a){return a=a||window,!!a.frameElement},"function"==typeof window.addEventListener&&window.addEventListener("message",function(a){var b=i(a.data);if(b){var c=b.uuid,e=b._keepalive,h=j[c];if(h){h(b.error||b.message,e,f(a.source,b.topic,c)),e||delete j[c]}if(!b.error)try{g(a.source,b,e)}catch(e){d(a.source,b.topic,e,c,!1)}}},!1),a.respondable=e}(utils),axe.utils.ruleShouldRun=function(a,b,c){"use strict";var d=c.runOnly||{},e=(c.rules||{})[a.id];return!(a.pageLevel&&!b.page)&&("rule"===d.type?-1!==d.values.indexOf(a.id):e&&"boolean"==typeof e.enabled?e.enabled:"tag"===d.type&&d.values?ma(a,d.values):ma(a,[]))},axe.utils.select=function(a,b){"use strict";for(var c,d=[],e=0,f=b.include.length;e<f;e++)c=b.include[e],c.actualNode.nodeType===c.actualNode.ELEMENT_NODE&&axe.utils.matchesSelector(c.actualNode,a)&&pa(d,[c],b),pa(d,axe.utils.querySelectorAll(c,a),b);return d.sort(axe.utils.nodeSorter)},axe.utils.toArray=function(a){"use strict";return Array.prototype.slice.call(a)};var Ha;!function(a){function b(a,b,c){var d=b&&c||0,e=0;for(b=b||[],a.toLowerCase().replace(/[0-9a-f]{2}/g,function(a){e<16&&(b[d+e++]=l[a])});e<16;)b[d+e++]=0;return b}function c(a,b){var c=b||0,d=k;return d[a[c++]]+d[a[c++]]+d[a[c++]]+d[a[c++]]+"-"+d[a[c++]]+d[a[c++]]+"-"+d[a[c++]]+d[a[c++]]+"-"+d[a[c++]]+d[a[c++]]+"-"+d[a[c++]]+d[a[c++]]+d[a[c++]]+d[a[c++]]+d[a[c++]]+d[a[c++]]}function d(a,b,d){var e=b&&d||0,f=b||[];a=a||{};var g=null!=a.clockseq?a.clockseq:p,h=null!=a.msecs?a.msecs:(new Date).getTime(),i=null!=a.nsecs?a.nsecs:r+1,j=h-q+(i-r)/1e4;if(j<0&&null==a.clockseq&&(g=g+1&16383),(j<0||h>q)&&null==a.nsecs&&(i=0),i>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");q=h,r=i,p=g,h+=122192928e5;var k=(1e4*(268435455&h)+i)%4294967296;f[e++]=k>>>24&255,f[e++]=k>>>16&255,f[e++]=k>>>8&255,f[e++]=255&k;var l=h/4294967296*1e4&268435455;f[e++]=l>>>8&255,f[e++]=255&l,f[e++]=l>>>24&15|16,f[e++]=l>>>16&255,f[e++]=g>>>8|128,f[e++]=255&g;for(var m=a.node||o,n=0;n<6;n++)f[e+n]=m[n];return b||c(f)}function e(a,b,d){var e=b&&d||0;"string"==typeof a&&(b="binary"==a?new j(16):null,a=null),a=a||{};var g=a.random||(a.rng||f)();if(g[6]=15&g[6]|64,g[8]=63&g[8]|128,b)for(var h=0;h<16;h++)b[e+h]=g[h];return b||c(g)}var f,g=a.crypto||a.msCrypto;if(!f&&g&&g.getRandomValues){var h=new Uint8Array(16);f=function(){return g.getRandomValues(h),h}}if(!f){var i=new Array(16);f=function(){for(var a,b=0;b<16;b++)0==(3&b)&&(a=4294967296*Math.random()),i[b]=a>>>((3&b)<<3)&255;return i}}for(var j="function"==typeof a.Buffer?a.Buffer:Array,k=[],l={},m=0;m<256;m++)k[m]=(m+256).toString(16).substr(1),l[k[m]]=m;var n=f(),o=[1|n[0],n[1],n[2],n[3],n[4],n[5]],p=16383&(n[6]<<8|n[7]),q=0,r=0;Ha=e,Ha.v1=d,Ha.v4=e,Ha.parse=b,Ha.unparse=c,Ha.BufferClass=j}(window),axe._load({data:{rules:{accesskeys:{description:"Ensures every accesskey attribute value is unique",help:"accesskey attribute value must be unique"},"area-alt":{description:"Ensures <area> elements of image maps have alternate text",help:"Active <area> elements must have alternate text"},"aria-allowed-attr":{description:"Ensures ARIA attributes are allowed for an element's role",help:"Elements must only use allowed ARIA attributes"},"aria-hidden-body":{description:"Ensures aria-hidden='true' is not present on the document body.",help:"aria-hidden='true' must not be present on the document body"},"aria-required-attr":{description:"Ensures elements with ARIA roles have all required ARIA attributes",help:"Required ARIA attributes must be provided"},"aria-required-children":{description:"Ensures elements with an ARIA role that require child roles contain them",help:"Certain ARIA roles must contain particular children"},"aria-required-parent":{description:"Ensures elements with an ARIA role that require parent roles are contained by them",help:"Certain ARIA roles must be contained by particular parents"},"aria-roles":{description:"Ensures all elements with a role attribute use a valid value",help:"ARIA roles used must conform to valid values"},"aria-valid-attr-value":{description:"Ensures all ARIA attributes have valid values",help:"ARIA attributes must conform to valid values"},"aria-valid-attr":{description:"Ensures attributes that begin with aria- are valid ARIA attributes",help:"ARIA attributes must conform to valid names"},"audio-caption":{description:"Ensures <audio> elements have captions",help:"<audio> elements must have a captions track"},blink:{description:"Ensures <blink> elements are not used",help:"<blink> elements are deprecated and must not be used"},"button-name":{description:"Ensures buttons have discernible text",help:"Buttons must have discernible text"},bypass:{description:"Ensures each page has at least one mechanism for a user to bypass navigation and jump straight to the content",help:"Page must have means to bypass repeated blocks"},checkboxgroup:{description:'Ensures related <input type="checkbox"> elements have a group and that that group designation is consistent',help:"Checkbox inputs with the same name attribute value must be part of a group"},"color-contrast":{description:"Ensures the contrast between foreground and background colors meets WCAG 2 AA contrast ratio thresholds",help:"Elements must have sufficient color contrast"},"definition-list":{description:"Ensures <dl> elements are structured correctly",help:"<dl> elements must only directly contain properly-ordered <dt> and <dd> groups, <script> or <template> elements"},dlitem:{description:"Ensures <dt> and <dd> elements are contained by a <dl>",help:"<dt> and <dd> elements must be contained by a <dl>"},"document-title":{description:"Ensures each HTML document contains a non-empty <title> element",help:"Documents must have <title> element to aid in navigation"},"duplicate-id":{description:"Ensures every id attribute value is unique",help:"id attribute value must be unique"},"empty-heading":{description:"Ensures headings have discernible text",help:"Headings must not be empty"},"frame-title-unique":{description:"Ensures <iframe> and <frame> elements contain a unique title attribute",help:"Frames must have a unique title attribute"},"frame-title":{description:"Ensures <iframe> and <frame> elements contain a non-empty title attribute",help:"Frames must have title attribute"},"heading-order":{description:"Ensures the order of headings is semantically correct",help:"Heading levels should only increase by one"},"hidden-content":{description:"Informs users about hidden content.",help:"Hidden content on the page cannot be analyzed"},"href-no-hash":{description:"Ensures that href values are valid link references to promote only using anchors as links",help:"Anchors must only be used as links with valid URLs or URL fragments"},"html-has-lang":{description:"Ensures every HTML document has a lang attribute",help:"<html> element must have a lang attribute"},"html-lang-valid":{description:"Ensures the lang attribute of the <html> element has a valid value",help:"<html> element must have a valid value for the lang attribute"},"image-alt":{description:"Ensures <img> elements have alternate text or a role of none or presentation",help:"Images must have alternate text"},"image-redundant-alt":{description:"Ensure button and link text is not repeated as image alternative",help:"Text of buttons and links should not be repeated in the image alternative"},"input-image-alt":{description:'Ensures <input type="image"> elements have alternate text',help:"Image buttons must have alternate text"},"label-title-only":{description:"Ensures that every form element is not solely labeled using the title or aria-describedby attributes",help:"Form elements should have a visible label"},label:{description:"Ensures every form element has a label",help:"Form elements must have labels"},"layout-table":{description:"Ensures presentational <table> elements do not use <th>, <caption> elements or the summary attribute",help:"Layout tables must not use data table elements"},"link-in-text-block":{description:"Links can be distinguished without relying on color",help:"Links must be distinguished from surrounding text in a way that does not rely on color"},"link-name":{description:"Ensures links have discernible text",help:"Links must have discernible text"},list:{description:"Ensures that lists are structured correctly",help:"<ul> and <ol> must only directly contain <li>, <script> or <template> elements"},listitem:{description:"Ensures <li> elements are used semantically",help:"<li> elements must be contained in a <ul> or <ol>"},marquee:{description:"Ensures <marquee> elements are not used",help:"<marquee> elements are deprecated and must not be used"},"meta-refresh":{description:'Ensures <meta http-equiv="refresh"> is not used',help:"Timed refresh must not exist"},"meta-viewport-large":{description:'Ensures <meta name="viewport"> can scale a significant amount',help:"Users should be able to zoom and scale the text up to 500%"},"meta-viewport":{description:'Ensures <meta name="viewport"> does not disable text scaling and zooming',help:"Zooming and scaling must not be disabled"},"object-alt":{description:"Ensures <object> elements have alternate text",help:"<object> elements must have alternate text"},"p-as-heading":{description:"Ensure p elements are not used to style headings",help:"Bold, italic text and font-size are not used to style p elements as a heading"},radiogroup:{description:'Ensures related <input type="radio"> elements have a group and that the group designation is consistent',help:"Radio inputs with the same name attribute value must be part of a group"},region:{description:"Ensures all content is contained within a landmark region",help:"Content should be contained in a landmark region"},"scope-attr-valid":{description:"Ensures the scope attribute is used correctly on tables",help:"scope attribute should be used correctly"},"server-side-image-map":{description:"Ensures that server-side image maps are not used",help:"Server-side image maps must not be used"},"skip-link":{description:"Ensures the first link on the page is a skip link",help:"The page should have a skip link as its first link"},tabindex:{description:"Ensures tabindex attribute values are not greater than 0",help:"Elements should not have tabindex greater than zero"},"table-duplicate-name":{description:"Ensure that tables do not have the same summary and caption",help:"The <caption> element should not contain the same text as the summary attribute"},"table-fake-caption":{description:"Ensure that tables with a caption use the <caption> element.",help:"Data or header cells should not be used to give caption to a data table."},"td-has-header":{description:"Ensure that each non-empty data cell in a large table has one or more table headers",help:"All non-empty td element in table larger than 3 by 3 must have an associated table header"},"td-headers-attr":{description:"Ensure that each cell in a table using the headers refers to another cell in that table",help:"All cells in a table element that use the headers attribute must only refer to other cells of that same table"},"th-has-data-cells":{description:"Ensure that each table header in a data table refers to data cells",help:"All th element and elements with role=columnheader/rowheader must data cells which it describes"},"valid-lang":{description:"Ensures lang attributes have valid values",help:"lang attribute must have a valid value"},"video-caption":{description:"Ensures <video> elements have captions",help:"<video> elements must have captions"},"video-description":{description:"Ensures <video> elements have audio descriptions",help:"<video> elements must have an audio description track"}},checks:{accesskeys:{impact:"critical",messages:{pass:function(a){return"Accesskey attribute value is unique"},fail:function(a){return"Document has multiple elements with the same accesskey"}}},"non-empty-alt":{impact:"critical",messages:{pass:function(a){return"Element has a non-empty alt attribute"},fail:function(a){return"Element has no alt attribute or the alt attribute is empty"}}},"non-empty-title":{impact:"critical",messages:{pass:function(a){return"Element has a title attribute"},fail:function(a){return"Element has no title attribute or the title attribute is empty"}}},"aria-label":{impact:"critical",messages:{pass:function(a){return"aria-label attribute exists and is not empty"},fail:function(a){return"aria-label attribute does not exist or is empty"}}},"aria-labelledby":{impact:"critical",messages:{pass:function(a){return"aria-labelledby attribute exists and references elements that are visible to screen readers"},fail:function(a){return"aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty or not visible"}}},"aria-allowed-attr":{impact:"critical",messages:{pass:function(a){return"ARIA attributes are used correctly for the defined role"},fail:function(a){var b="ARIA attribute"+(a.data&&a.data.length>1?"s are":" is")+" not allowed:",c=a.data;if(c)for(var d,e=-1,f=c.length-1;e<f;)d=c[e+=1],b+=" "+d;return b}}},"aria-hidden-body":{impact:"critical",messages:{pass:function(a){return"No aria-hidden attribute is present on document body"},fail:function(a){return"aria-hidden=true should not be present on the document body"}}},"aria-required-attr":{impact:"critical",messages:{pass:function(a){return"All required ARIA attributes are present"},fail:function(a){var b="Required ARIA attribute"+(a.data&&a.data.length>1?"s":"")+" not present:",c=a.data;if(c)for(var d,e=-1,f=c.length-1;e<f;)d=c[e+=1],b+=" "+d;return b}}},"aria-required-children":{impact:"critical",messages:{pass:function(a){return"Required ARIA children are present"},fail:function(a){var b="Required ARIA "+(a.data&&a.data.length>1?"children":"child")+" role not present:",c=a.data;if(c)for(var d,e=-1,f=c.length-1;e<f;)d=c[e+=1],b+=" "+d;return b}}},"aria-required-parent":{impact:"critical",messages:{pass:function(a){return"Required ARIA parent role present"},fail:function(a){var b="Required ARIA parent"+(a.data&&a.data.length>1?"s":"")+" role not present:",c=a.data;if(c)for(var d,e=-1,f=c.length-1;e<f;)d=c[e+=1],b+=" "+d;return b}}},invalidrole:{impact:"critical",messages:{pass:function(a){return"ARIA role is valid"},fail:function(a){return"Role must be one of the valid ARIA roles"}}},abstractrole:{impact:"serious",messages:{pass:function(a){return"Abstract roles are not used"},fail:function(a){return"Abstract roles cannot be directly used"}}},"aria-valid-attr-value":{impact:"critical",messages:{pass:function(a){return"ARIA attribute values are valid"},fail:function(a){var b="Invalid ARIA attribute value"+(a.data&&a.data.length>1?"s":"")+":",c=a.data;if(c)for(var d,e=-1,f=c.length-1;e<f;)d=c[e+=1],b+=" "+d;return b}}},"aria-valid-attr":{impact:"critical",messages:{pass:function(a){return"ARIA attribute name"+(a.data&&a.data.length>1?"s":"")+" are valid"},fail:function(a){var b="Invalid ARIA attribute name"+(a.data&&a.data.length>1?"s":"")+":",c=a.data;if(c)for(var d,e=-1,f=c.length-1;e<f;)d=c[e+=1],b+=" "+d;return b}}},caption:{impact:"critical",messages:{pass:function(a){return"The multimedia element has a captions track"},fail:function(a){return"The multimedia element does not have a captions track"},incomplete:function(a){return"A captions track for this element could not be found"}}},"is-on-screen":{impact:"minor",messages:{pass:function(a){return"Element is not visible"},fail:function(a){return"Element is visible"}}},"non-empty-if-present":{impact:"critical",messages:{pass:function(a){var b="Element ";return a.data?b+="has a non-empty value attribute":b+="does not have a value attribute",b},fail:function(a){return"Element has a value attribute and the value attribute is empty"}}},"non-empty-value":{impact:"critical",messages:{pass:function(a){return"Element has a non-empty value attribute"},fail:function(a){return"Element has no value attribute or the value attribute is empty"}}},"button-has-visible-text":{impact:"critical",messages:{pass:function(a){return"Element has inner text that is visible to screen readers"},fail:function(a){return"Element does not have inner text that is visible to screen readers"}}},"role-presentation":{impact:"moderate",messages:{pass:function(a){return'Element\'s default semantics were overriden with role="presentation"'},fail:function(a){return'Element\'s default semantics were not overridden with role="presentation"'}}},"role-none":{impact:"moderate",messages:{pass:function(a){return'Element\'s default semantics were overriden with role="none"'},fail:function(a){return'Element\'s default semantics were not overridden with role="none"'}}},"focusable-no-name":{impact:"serious",messages:{pass:function(a){return"Element is not in tab order or has accessible text"},fail:function(a){return"Element is in tab order and does not have accessible text"}}},"internal-link-present":{impact:"critical",messages:{pass:function(a){return"Valid skip link found"},fail:function(a){return"No valid skip link found"}}},"header-present":{impact:"moderate",messages:{pass:function(a){return"Page has a header"},fail:function(a){return"Page does not have a header"}}},landmark:{impact:"serious",messages:{pass:function(a){return"Page has a landmark region"},fail:function(a){return"Page does not have a landmark region"}}},"group-labelledby":{impact:"critical",messages:{pass:function(a){return'All elements with the name "'+a.data.name+'" reference the same element with aria-labelledby'},fail:function(a){return'All elements with the name "'+a.data.name+'" do not reference the same element with aria-labelledby'}}},fieldset:{impact:"critical",messages:{pass:function(a){return"Element is contained in a fieldset"},fail:function(a){var b="",c=a.data&&a.data.failureCode;return b+="no-legend"===c?"Fieldset does not have a legend as its first child":"empty-legend"===c?"Legend does not have text that is visible to screen readers":"mixed-inputs"===c?"Fieldset contains unrelated inputs":"no-group-label"===c?"ARIA group does not have aria-label or aria-labelledby":"group-mixed-inputs"===c?"ARIA group contains unrelated inputs":"Element does not have a containing fieldset or ARIA group"}}},"color-contrast":{impact:"serious",messages:{pass:function(a){return"Element has sufficient color contrast of "+a.data.contrastRatio},fail:function(a){return"Element has insufficient color contrast of "+a.data.contrastRatio+" (foreground color: "+a.data.fgColor+", background color: "+a.data.bgColor+", font size: "+a.data.fontSize+", font weight: "+a.data.fontWeight+")"},incomplete:{bgImage:"Element's background color could not be determined due to a background image",bgGradient:"Element's background color could not be determined due to a background gradient",imgNode:"Element's background color could not be determined because element contains an image node",bgOverlap:"Element's background color could not be determined because it is overlapped by another element",fgAlpha:"Element's foreground color could not be determined because of alpha transparency",elmPartiallyObscured:"Element's background color could not be determined because it's partially obscured by another element",equalRatio:"Element has a 1:1 contrast ratio with the background",default:"Unable to determine contrast ratio"}}},"structured-dlitems":{impact:"serious",messages:{pass:function(a){return"When not empty, element has both <dt> and <dd> elements"},fail:function(a){return"When not empty, element does not have at least one <dt> element followed by at least one <dd> element"}}},"only-dlitems":{impact:"serious",messages:{pass:function(a){return"List element only has direct children that are allowed inside <dt> or <dd> elements"},fail:function(a){return"List element has direct children that are not allowed inside <dt> or <dd> elements"}}},dlitem:{impact:"serious",messages:{pass:function(a){return"Description list item has a <dl> parent element"},fail:function(a){return"Description list item does not have a <dl> parent element"}}},"doc-has-title":{impact:"moderate",messages:{pass:function(a){return"Document has a non-empty <title> element"},fail:function(a){return"Document does not have a non-empty <title> element"}}},"duplicate-id":{impact:"moderate",messages:{pass:function(a){return"Document has no elements that share the same id attribute"},fail:function(a){return"Document has multiple elements with the same id attribute: "+a.data}}},"has-visible-text":{impact:"moderate",messages:{pass:function(a){return"Element has text that is visible to screen readers"},fail:function(a){return"Element does not have text that is visible to screen readers"}}},"unique-frame-title":{impact:"serious",messages:{pass:function(a){return"Element's title attribute is unique"},fail:function(a){return"Element's title attribute is not unique"}}},"heading-order":{impact:"minor",messages:{pass:function(a){return"Heading order valid"},fail:function(a){return"Heading order invalid"}}},"hidden-content":{impact:"minor",messages:{pass:function(a){return"All content on the page has been analyzed."},fail:function(a){return"There were problems analyzing the content on this page."},incomplete:function(a){return"There is hidden content on the page that was not analyzed. You will need to trigger the display of this content in order to analyze it."}}},"href-no-hash":{impact:"moderate",messages:{pass:function(a){return"Anchor does not have an href value of #"},fail:function(a){return"Anchor has an href value of #"}}},"has-lang":{impact:"serious",messages:{pass:function(a){return"The <html> element has a lang attribute"},fail:function(a){return"The <html> element does not have a lang attribute"}}},"valid-lang":{impact:"serious",messages:{pass:function(a){return"Value of lang attribute is included in the list of valid languages"},fail:function(a){return"Value of lang attribute not included in the list of valid languages"}}},"has-alt":{impact:"critical",messages:{pass:function(a){return"Element has an alt attribute"},fail:function(a){return"Element does not have an alt attribute"}}},"duplicate-img-label":{impact:"minor",messages:{pass:function(a){return"Element does not duplicate existing text in <img> alt text"},fail:function(a){return"Element contains <img> element with alt text that duplicates existing text"}}},"title-only":{impact:"serious",messages:{pass:function(a){return"Form element does not solely use title attribute for its label"},fail:function(a){return"Only title used to generate label for form element"}}},"implicit-label":{impact:"critical",messages:{pass:function(a){return"Form element has an implicit (wrapped) <label>"},fail:function(a){return"Form element does not have an implicit (wrapped) <label>"}}},"explicit-label":{impact:"critical",messages:{pass:function(a){return"Form element has an explicit <label>"},fail:function(a){return"Form element does not have an explicit <label>"}}},"help-same-as-label":{impact:"minor",messages:{pass:function(a){return"Help text (title or aria-describedby) does not duplicate label text"},fail:function(a){return"Help text (title or aria-describedby) text is the same as the label text"}}},"multiple-label":{impact:"serious",messages:{pass:function(a){return"Form element does not have multiple <label> elements"},fail:function(a){return"Form element has multiple <label> elements"}}},"has-th":{impact:"serious",messages:{pass:function(a){return"Layout table does not use <th> elements"},fail:function(a){return"Layout table uses <th> elements"}}},"has-caption":{impact:"serious",messages:{pass:function(a){return"Layout table does not use <caption> element"},fail:function(a){return"Layout table uses <caption> element"}}},"has-summary":{impact:"serious",messages:{pass:function(a){return"Layout table does not use summary attribute"},fail:function(a){return"Layout table uses summary attribute"}}},"link-in-text-block":{impact:"critical",messages:{pass:function(a){return"Links can be distinguished from surrounding text in a way that does not rely on color"},fail:function(a){return"Links can not be distinguished from surrounding text in a way that does not rely on color"},incomplete:{bgContrast:"Element's contrast ratio could not be determined. Check for a distinct hover/focus style",bgImage:"Element's contrast ratio could not be determined due to a background image",bgGradient:"Element's contrast ratio could not be determined due to a background gradient",imgNode:"Element's contrast ratio could not be determined because element contains an image node",bgOverlap:"Element's contrast ratio could not be determined because of element overlap",default:"Unable to determine contrast ratio"}}},"only-listitems":{impact:"serious",messages:{pass:function(a){return"List element only has direct children that are allowed inside <li> elements"},fail:function(a){return"List element has direct children that are not allowed inside <li> elements"}}},listitem:{impact:"critical",messages:{pass:function(a){return'List item has a <ul>, <ol> or role="list" parent element'},fail:function(a){return'List item does not have a <ul>, <ol> or role="list" parent element'}}},"meta-refresh":{impact:"critical",messages:{pass:function(a){return"<meta> tag does not immediately refresh the page"},fail:function(a){return"<meta> tag forces timed refresh of page"}}},"meta-viewport-large":{impact:"minor",messages:{pass:function(a){return"<meta> tag does not prevent significant zooming"},fail:function(a){return"<meta> tag limits zooming"}}},"meta-viewport":{impact:"critical",messages:{pass:function(a){return"<meta> tag does not disable zooming"},fail:function(a){return"<meta> tag disables zooming"}}},"p-as-heading":{impact:"critical",messages:{pass:function(a){return"<p> elements are not styled as headings"},fail:function(a){return"Heading elements should be used instead of styled p elements"}}},region:{impact:"moderate",messages:{pass:function(a){return"Content contained by ARIA landmark"},fail:function(a){return"Content not contained by an ARIA landmark"}}},"html5-scope":{impact:"serious",messages:{pass:function(a){return"Scope attribute is only used on table header elements (<th>)"},fail:function(a){return"In HTML 5, scope attributes may only be used on table header elements (<th>)"}}},"scope-value":{impact:"critical",messages:{pass:function(a){return"Scope attribute is used correctly"},fail:function(a){return"The value of the scope attribute may only be 'row' or 'col'"}}},exists:{impact:"minor",messages:{pass:function(a){return"Element does not exist"},fail:function(a){return"Element exists"}}},"skip-link":{impact:"critical",messages:{pass:function(a){return"Valid skip link found"},fail:function(a){return"No valid skip link found"}}},tabindex:{impact:"serious",messages:{pass:function(a){return"Element does not have a tabindex greater than 0"},fail:function(a){return"Element has a tabindex greater than 0"}}},"same-caption-summary":{impact:"moderate",messages:{pass:function(a){return"Content of summary attribute and <caption> are not duplicated"},fail:function(a){return"Content of summary attribute and <caption> element are identical"}}},"caption-faked":{impact:"critical",messages:{pass:function(a){return"The first row of a table is not used as a caption"},fail:function(a){return"The first row of the table should be a caption instead of a table cell"}}},"td-has-header":{impact:"critical",messages:{pass:function(a){return"All non-empty data cells have table headers"},fail:function(a){return"Some non-empty data cells do not have table headers"}}},"td-headers-attr":{impact:"serious",messages:{pass:function(a){return"The headers attribute is exclusively used to refer to other cells in the table"},fail:function(a){return"The headers attribute is not exclusively used to refer to other cells in the table"}}},"th-has-data-cells":{impact:"critical",messages:{pass:function(a){return"All table header cells refer to data cells"},fail:function(a){return"Not all table header cells refer to data cells"},incomplete:function(a){return"Table data cells are missing or empty"}}},description:{impact:"serious",messages:{pass:function(a){return"The multimedia element has an audio description track"},fail:function(a){return"The multimedia element does not have an audio description track"},incomplete:function(a){return"An audio description track for this element could not be found"}}}},failureSummaries:{any:{failureMessage:function(a){var b="Fix any of the following:",c=a;if(c)for(var d,e=-1,f=c.length-1;e<f;)d=c[e+=1],b+="\n  "+d.split("\n").join("\n  ");return b}},none:{failureMessage:function(a){
+var b="Fix all of the following:",c=a;if(c)for(var d,e=-1,f=c.length-1;e<f;)d=c[e+=1],b+="\n  "+d.split("\n").join("\n  ");return b}}},incompleteFallbackMessage:function(a){return"aXe couldn't tell the reason. Time to break out the element inspector!"}},rules:[{id:"accesskeys",selector:"[accesskey]",excludeHidden:!1,tags:["wcag2a","wcag211","cat.keyboard"],all:[],any:[],none:["accesskeys"]},{id:"area-alt",selector:"map area[href]",excludeHidden:!1,tags:["cat.text-alternatives","wcag2a","wcag111","section508","section508.22.a"],all:[],any:["non-empty-alt","non-empty-title","aria-label","aria-labelledby"],none:[]},{id:"aria-allowed-attr",matches:function(a){var b=a.getAttribute("role");b||(b=axe.commons.aria.implicitRole(a));var c=axe.commons.aria.allowedAttr(b);if(b&&c){var d=/^aria-/;if(a.hasAttributes())for(var e=a.attributes,f=0,g=e.length;f<g;f++)if(d.test(e[f].name))return!0}return!1},tags:["cat.aria","wcag2a","wcag411","wcag412"],all:[],any:["aria-allowed-attr"],none:[]},{id:"aria-hidden-body",selector:"body",excludeHidden:!1,tags:["cat.aria","wcag2a","wcag412"],all:[],any:["aria-hidden-body"],none:[]},{id:"aria-required-attr",selector:"[role]",tags:["cat.aria","wcag2a","wcag411","wcag412"],all:[],any:["aria-required-attr"],none:[]},{id:"aria-required-children",selector:"[role]",tags:["cat.aria","wcag2a","wcag131"],all:[],any:["aria-required-children"],none:[]},{id:"aria-required-parent",selector:"[role]",tags:["cat.aria","wcag2a","wcag131"],all:[],any:["aria-required-parent"],none:[]},{id:"aria-roles",selector:"[role]",tags:["cat.aria","wcag2a","wcag131","wcag411","wcag412"],all:[],any:[],none:["invalidrole","abstractrole"]},{id:"aria-valid-attr-value",matches:function(a){var b=/^aria-/;if(a.hasAttributes())for(var c=a.attributes,d=0,e=c.length;d<e;d++)if(b.test(c[d].name))return!0;return!1},tags:["cat.aria","wcag2a","wcag131","wcag411","wcag412"],all:[],any:[{options:[],id:"aria-valid-attr-value"}],none:[]},{id:"aria-valid-attr",matches:function(a){var b=/^aria-/;if(a.hasAttributes())for(var c=a.attributes,d=0,e=c.length;d<e;d++)if(b.test(c[d].name))return!0;return!1},tags:["cat.aria","wcag2a","wcag411"],all:[],any:[{options:[],id:"aria-valid-attr"}],none:[]},{id:"audio-caption",selector:"audio",excludeHidden:!1,tags:["cat.time-and-media","wcag2a","wcag122","section508","section508.22.a"],all:[],any:[],none:["caption"]},{id:"blink",selector:"blink",excludeHidden:!1,tags:["cat.time-and-media","wcag2a","wcag222","section508","section508.22.j"],all:[],any:[],none:["is-on-screen"]},{id:"button-name",selector:'button, [role="button"], input[type="button"], input[type="submit"], input[type="reset"]',tags:["cat.name-role-value","wcag2a","wcag412","section508","section508.22.a"],all:[],any:["non-empty-if-present","non-empty-value","button-has-visible-text","aria-label","aria-labelledby","role-presentation","role-none"],none:["focusable-no-name"]},{id:"bypass",selector:"html",pageLevel:!0,matches:function(a){return!!a.querySelector("a[href]")},tags:["cat.keyboard","wcag2a","wcag241","section508","section508.22.o"],all:[],any:["internal-link-present","header-present","landmark"],none:[]},{id:"checkboxgroup",selector:"input[type=checkbox][name]",tags:["cat.forms","best-practice"],all:[],any:["group-labelledby","fieldset"],none:[]},{id:"color-contrast",matches:function(a){var b=a.nodeName.toUpperCase(),c=a.type,d=document;if("true"===a.getAttribute("aria-disabled")||axe.commons.dom.findUp(a,'[aria-disabled="true"]'))return!1;if("INPUT"===b)return-1===["hidden","range","color","checkbox","radio","image"].indexOf(c)&&!a.disabled;if("SELECT"===b)return!!a.options.length&&!a.disabled;if("TEXTAREA"===b)return!a.disabled;if("OPTION"===b)return!1;if("BUTTON"===b&&a.disabled||axe.commons.dom.findUp(a,"button[disabled]"))return!1;if("FIELDSET"===b&&a.disabled||axe.commons.dom.findUp(a,"fieldset[disabled]"))return!1;var e=axe.commons.dom.findUp(a,"label");if("LABEL"===b||e){var f=a;e&&(f=e);var g=f.htmlFor&&d.getElementById(f.htmlFor);if(g&&g.disabled)return!1;var g=a.querySelector('input:not([type="hidden"]):not([type="image"]):not([type="button"]):not([type="submit"]):not([type="reset"]), select, textarea');if(g&&g.disabled)return!1}if(a.id){var g=d.querySelector("[aria-labelledby~="+axe.commons.utils.escapeSelector(a.id)+"]");if(g&&g.disabled)return!1}if(""===axe.commons.text.visible(a,!1,!0))return!1;var h,i,j=document.createRange(),k=a.childNodes,l=k.length;for(i=0;i<l;i++)h=k[i],3===h.nodeType&&""!==axe.commons.text.sanitize(h.nodeValue)&&j.selectNodeContents(h);var m=j.getClientRects();for(l=m.length,i=0;i<l;i++)if(axe.commons.dom.visuallyOverlaps(m[i],a))return!0;return!1},excludeHidden:!1,options:{noScroll:!1},tags:["cat.color","wcag2aa","wcag143"],all:[],any:["color-contrast"],none:[]},{id:"definition-list",selector:"dl",matches:function(a){return!a.getAttribute("role")},tags:["cat.structure","wcag2a","wcag131"],all:[],any:[],none:["structured-dlitems","only-dlitems"]},{id:"dlitem",selector:"dd, dt",matches:function(a){return!a.getAttribute("role")},tags:["cat.structure","wcag2a","wcag131"],all:[],any:["dlitem"],none:[]},{id:"document-title",selector:"html",matches:function(a){return a.ownerDocument.defaultView.self===a.ownerDocument.defaultView.top},tags:["cat.text-alternatives","wcag2a","wcag242"],all:[],any:["doc-has-title"],none:[]},{id:"duplicate-id",selector:"[id]",excludeHidden:!1,tags:["cat.parsing","wcag2a","wcag411"],all:[],any:["duplicate-id"],none:[]},{id:"empty-heading",selector:'h1, h2, h3, h4, h5, h6, [role="heading"]',enabled:!0,tags:["cat.name-role-value","best-practice"],all:[],any:["has-visible-text","role-presentation","role-none"],none:[]},{id:"frame-title-unique",selector:"frame[title], iframe[title]",matches:function(a){var b=a.getAttribute("title");return!!(b?axe.commons.text.sanitize(b).trim():"")},tags:["cat.text-alternatives","best-practice"],all:[],any:[],none:["unique-frame-title"]},{id:"frame-title",selector:"frame, iframe",tags:["cat.text-alternatives","wcag2a","wcag241","section508","section508.22.i"],all:[],any:["aria-label","aria-labelledby","non-empty-title","role-presentation","role-none"],none:[]},{id:"heading-order",selector:"h1,h2,h3,h4,h5,h6,[role=heading]",enabled:!1,tags:["cat.semantics","best-practice"],all:[],any:["heading-order"],none:[]},{id:"hidden-content",selector:"*",excludeHidden:!1,tags:["experimental","review-item"],all:[],any:["hidden-content"],none:[],enabled:!1},{id:"href-no-hash",selector:"a[href]",enabled:!1,tags:["cat.semantics","best-practice"],all:[],any:["href-no-hash"],none:[]},{id:"html-has-lang",selector:"html",tags:["cat.language","wcag2a","wcag311"],all:[],any:["has-lang"],none:[]},{id:"html-lang-valid",selector:"html[lang]",tags:["cat.language","wcag2a","wcag311"],all:[],any:[],none:["valid-lang"]},{id:"image-alt",selector:"img, [role='img']",tags:["cat.text-alternatives","wcag2a","wcag111","section508","section508.22.a"],all:[],any:["has-alt","aria-label","aria-labelledby","non-empty-title","role-presentation","role-none"],none:[]},{id:"image-redundant-alt",selector:'button, [role="button"], a[href], p, li, td, th',tags:["cat.text-alternatives","best-practice"],all:[],any:[],none:["duplicate-img-label"]},{id:"input-image-alt",selector:'input[type="image"]',tags:["cat.text-alternatives","wcag2a","wcag111","section508","section508.22.a"],all:[],any:["non-empty-alt","aria-label","aria-labelledby","non-empty-title"],none:[]},{id:"label-title-only",selector:"input, select, textarea",matches:function(a){if("input"!==a.nodeName.toLowerCase())return!0;var b=a.getAttribute("type").toLowerCase();return"hidden"!==b&&"image"!==b&&"button"!==b&&"submit"!==b&&"reset"!==b},enabled:!1,tags:["cat.forms","best-practice"],all:[],any:[],none:["title-only"]},{id:"label",selector:"input, select, textarea",matches:function(a){if("input"!==a.nodeName.toLowerCase())return!0;var b=a.getAttribute("type").toLowerCase();return"hidden"!==b&&"image"!==b&&"button"!==b&&"submit"!==b&&"reset"!==b},tags:["cat.forms","wcag2a","wcag332","wcag131","section508","section508.22.n"],all:[],any:["aria-label","aria-labelledby","implicit-label","explicit-label","non-empty-title"],none:["help-same-as-label","multiple-label"]},{id:"layout-table",selector:"table",matches:function(a){return!axe.commons.table.isDataTable(a)},tags:["cat.semantics","wcag2a","wcag131"],all:[],any:[],none:["has-th","has-caption","has-summary"]},{id:"link-in-text-block",selector:"a[href], *[role=link]",matches:function(a){var b=axe.commons.text.sanitize(a.textContent),c=a.getAttribute("role");return(!c||"link"===c)&&(!!b&&(!!axe.commons.dom.isVisible(a,!1)&&axe.commons.dom.isInTextBlock(a)))},excludeHidden:!1,tags:["cat.color","experimental","wcag2a","wcag141"],all:["link-in-text-block"],any:[],none:[]},{id:"link-name",selector:"a[href], [role=link][href]",matches:function(a){return"button"!==a.getAttribute("role")},tags:["cat.name-role-value","wcag2a","wcag111","wcag412","section508","section508.22.a"],all:[],any:["has-visible-text","aria-label","aria-labelledby","role-presentation","role-none"],none:["focusable-no-name"]},{id:"list",selector:"ul, ol",matches:function(a){return!a.getAttribute("role")},tags:["cat.structure","wcag2a","wcag131"],all:[],any:[],none:["only-listitems"]},{id:"listitem",selector:"li",matches:function(a){return!a.getAttribute("role")},tags:["cat.structure","wcag2a","wcag131"],all:[],any:["listitem"],none:[]},{id:"marquee",selector:"marquee",excludeHidden:!1,tags:["cat.parsing","wcag2a","wcag222"],all:[],any:[],none:["is-on-screen"]},{id:"meta-refresh",selector:'meta[http-equiv="refresh"]',excludeHidden:!1,tags:["cat.time","wcag2a","wcag2aaa","wcag221","wcag224","wcag325"],all:[],any:["meta-refresh"],none:[]},{id:"meta-viewport-large",selector:'meta[name="viewport"]',excludeHidden:!1,tags:["cat.sensory-and-visual-cues","best-practice"],all:[],any:[{options:{scaleMinimum:5,lowerBound:2},id:"meta-viewport-large"}],none:[]},{id:"meta-viewport",selector:'meta[name="viewport"]',excludeHidden:!1,tags:["cat.sensory-and-visual-cues","wcag2aa","wcag144"],all:[],any:[{options:{scaleMinimum:2},id:"meta-viewport"}],none:[]},{id:"object-alt",selector:"object",tags:["cat.text-alternatives","wcag2a","wcag111","section508","section508.22.a"],all:[],any:["has-visible-text","aria-label","aria-labelledby","non-empty-title"],none:[]},{id:"p-as-heading",selector:"p",matches:function(a){var b=Array.from(a.parentNode.childNodes),c=a.textContent.trim(),d=/[.!?:;](?![.!?:;])/g;return!(0===c.length||(c.match(d)||[]).length>=2)&&0!==b.slice(b.indexOf(a)+1).filter(function(a){return"P"===a.nodeName.toUpperCase()&&""!==a.textContent.trim()}).length},tags:["cat.semantics","wcag2a","wcag131","experimental"],all:[{options:{margins:[{weight:150,italic:!0},{weight:150,size:1.15},{italic:!0,size:1.15},{size:1.4}]},id:"p-as-heading"}],any:[],none:[]},{id:"radiogroup",selector:"input[type=radio][name]",tags:["cat.forms","best-practice"],all:[],any:["group-labelledby","fieldset"],none:[]},{id:"region",selector:"html",pageLevel:!0,enabled:!1,tags:["cat.keyboard","best-practice"],all:[],any:["region"],none:[]},{id:"scope-attr-valid",selector:"td[scope], th[scope]",enabled:!0,tags:["cat.tables","best-practice"],all:["html5-scope","scope-value"],any:[],none:[]},{id:"server-side-image-map",selector:"img[ismap]",tags:["cat.text-alternatives","wcag2a","wcag211","section508","section508.22.f"],all:[],any:[],none:["exists"]},{id:"skip-link",selector:"a[href]",pageLevel:!0,enabled:!1,tags:["cat.keyboard","best-practice"],all:[],any:["skip-link"],none:[]},{id:"tabindex",selector:"[tabindex]",tags:["cat.keyboard","best-practice"],all:[],any:["tabindex"],none:[]},{id:"table-duplicate-name",selector:"table",tags:["cat.tables","best-practice"],all:[],any:[],none:["same-caption-summary"]},{id:"table-fake-caption",selector:"table",matches:function(a){return axe.commons.table.isDataTable(a)},tags:["cat.tables","experimental","wcag2a","wcag131","section508","section508.22.g"],all:["caption-faked"],any:[],none:[]},{id:"td-has-header",selector:"table",matches:function(a){if(axe.commons.table.isDataTable(a)){var b=axe.commons.table.toArray(a);return b.length>=3&&b[0].length>=3&&b[1].length>=3&&b[2].length>=3}return!1},tags:["cat.tables","experimental","wcag2a","wcag131","section508","section508.22.g"],all:["td-has-header"],any:[],none:[]},{id:"td-headers-attr",selector:"table",tags:["cat.tables","wcag2a","wcag131","section508","section508.22.g"],all:["td-headers-attr"],any:[],none:[]},{id:"th-has-data-cells",selector:"table",matches:function(a){return axe.commons.table.isDataTable(a)},tags:["cat.tables","wcag2a","wcag131","section508","section508.22.g"],all:["th-has-data-cells"],any:[],none:[]},{id:"valid-lang",selector:"[lang], [xml\\:lang]",matches:function(a){return"html"!==a.nodeName.toLowerCase()},tags:["cat.language","wcag2aa","wcag312"],all:[],any:[],none:["valid-lang"]},{id:"video-caption",selector:"video",excludeHidden:!1,tags:["cat.text-alternatives","wcag2a","wcag122","wcag123","section508","section508.22.a"],all:[],any:[],none:["caption"]},{id:"video-description",selector:"video",excludeHidden:!1,tags:["cat.text-alternatives","wcag2aa","wcag125","section508","section508.22.b"],all:[],any:[],none:["description"]}],checks:[{id:"abstractrole",evaluate:function(a,b){return"abstract"===axe.commons.aria.getRoleType(a.getAttribute("role"))}},{id:"aria-allowed-attr",evaluate:function(a,b){var c,d,e,f=[],g=a.getAttribute("role"),h=a.attributes;if(g||(g=axe.commons.aria.implicitRole(a)),e=axe.commons.aria.allowedAttr(g),g&&e)for(var i=0,j=h.length;i<j;i++)c=h[i],d=c.name,axe.commons.aria.validateAttr(d)&&-1===e.indexOf(d)&&f.push(d+'="'+c.nodeValue+'"');return!f.length||(this.data(f),!1)}},{id:"aria-hidden-body",evaluate:function(a,b){return"true"!==a.getAttribute("aria-hidden")}},{id:"invalidrole",evaluate:function(a,b){return!axe.commons.aria.isValidRole(a.getAttribute("role"))}},{id:"aria-required-attr",evaluate:function(a,b){var c=[];if(a.hasAttributes()){var d,e=a.getAttribute("role"),f=axe.commons.aria.requiredAttr(e);if(e&&f)for(var g=0,h=f.length;g<h;g++)d=f[g],a.getAttribute(d)||c.push(d)}return!c.length||(this.data(c),!1)}},{id:"aria-required-children",evaluate:function(a,b){function c(a,b,c){if(null===a)return!1;var d=f(b),e=['[role="'+b+'"]'];return d&&(e=e.concat(d)),e=e.join(","),c?g(a,e)||!!a.querySelector(e):!!a.querySelector(e)}function d(a,b){var d,e;for(d=0,e=a.length;d<e;d++)if(null!==a[d]&&c(a[d],b,!0))return!0;return!1}var e=axe.commons.aria.requiredOwned,f=axe.commons.aria.implicitNodes,g=axe.commons.utils.matchesSelector,h=axe.commons.dom.idrefs,i=a.getAttribute("role"),j=e(i);if(!j)return!0;var k=!1,l=j.one;if(!l){var k=!0;l=j.all}var m=function(a,b,e){var f,g=b.length,i=[],j=h(a,"aria-owns");for(f=0;f<g;f++){var k=b[f];if(c(a,k)||d(j,k)){if(!e)return null}else e&&i.push(k)}return i.length?i:!e&&b.length?b:null}(a,l,k);return!m||(this.data(m),!1)}},{id:"aria-required-parent",evaluate:function(a,b){function c(a){return(axe.commons.aria.implicitNodes(a)||[]).concat('[role="'+a+'"]').join(",")}function d(a,b,d){var e,f,g=a.getAttribute("role"),h=[];if(b||(b=axe.commons.aria.requiredContext(g)),!b)return null;for(e=0,f=b.length;e<f;e++){if(d&&axe.utils.matchesSelector(a,c(b[e])))return null;if(axe.commons.dom.findUp(a,c(b[e])))return null;h.push(b[e])}return h}var e=d(a);if(!e)return!0;var f=function(a){for(var b=[],c=null;a;)a.id&&(c=document.querySelector("[aria-owns~="+axe.commons.utils.escapeSelector(a.id)+"]"))&&b.push(c),a=a.parentNode;return b.length?b:null}(a);if(f)for(var g=0,h=f.length;g<h;g++)if(!(e=d(f[g],e,!0)))return!0;return this.data(e),!1}},{id:"aria-valid-attr-value",evaluate:function(a,b){b=Array.isArray(b)?b:[];for(var c,d,e=[],f=/^aria-/,g=a.attributes,h=0,i=g.length;h<i;h++)c=g[h],d=c.name,-1===b.indexOf(d)&&f.test(d)&&!axe.commons.aria.validateAttrValue(a,d)&&e.push(d+'="'+c.nodeValue+'"');return!e.length||(this.data(e),!1)},options:[]},{id:"aria-valid-attr",evaluate:function(a,b){b=Array.isArray(b)?b:[];for(var c,d=[],e=/^aria-/,f=a.attributes,g=0,h=f.length;g<h;g++)c=f[g].name,-1===b.indexOf(c)&&e.test(c)&&!axe.commons.aria.validateAttr(c)&&d.push(c);return!d.length||(this.data(d),!1)},options:[]},{id:"color-contrast",evaluate:function(a,b){if(!axe.commons.dom.isVisible(a,!1))return!0;var c,d=!!(b||{}).noScroll,e=[],f=axe.commons.color.getBackgroundColor(a,e,d),g=axe.commons.color.getForegroundColor(a,d),h=window.getComputedStyle(a),i=parseFloat(h.getPropertyValue("font-size")),j=h.getPropertyValue("font-weight"),k=-1!==["bold","bolder","600","700","800","900"].indexOf(j),l=axe.commons.color.hasValidContrastRatio(f,g,i,k),m=Math.floor(100*l.contrastRatio)/100;null===f&&(c=axe.commons.color.incompleteData.get("bgColor"));var n=!1;1===m&&(n=!0,c=axe.commons.color.incompleteData.set("bgColor","equalRatio"));var o={fgColor:g?g.toHexString():void 0,bgColor:f?f.toHexString():void 0,contrastRatio:l?m:void 0,fontSize:(72*i/96).toFixed(1)+"pt",fontWeight:k?"bold":"normal",missingData:c};return this.data(o),l.isValid&&!n||this.relatedNodes(e),null===g||null===f||n?(c=null,void axe.commons.color.incompleteData.clear()):l.isValid}},{id:"link-in-text-block",evaluate:function(a,b){function c(a,b){var c=a.getRelativeLuminance(),d=b.getRelativeLuminance();return(Math.max(c,d)+.05)/(Math.min(c,d)+.05)}function d(a){var b=window.getComputedStyle(a).getPropertyValue("display");return-1!==f.indexOf(b)||"table-"===b.substr(0,6)}var e=axe.commons.color,f=["block","list-item","table","flex","grid","inline-block"];if(d(a))return!1;for(var g=a.parentNode;1===g.nodeType&&!d(g);)g=g.parentNode;if(e.elementIsDistinct(a,g))return!0;var h,i;if(h=e.getForegroundColor(a),i=e.getForegroundColor(g),h&&i){var j=c(h,i);if(1===j)return!0;if(j>=3)return axe.commons.color.incompleteData.set("fgColor","bgContrast"),this.data({missingData:axe.commons.color.incompleteData.get("fgColor")}),void axe.commons.color.incompleteData.clear();if(h=e.getBackgroundColor(a),i=e.getBackgroundColor(g),!h||!i||c(h,i)>=3){var k=void 0;return k=h&&i?"bgContrast":axe.commons.color.incompleteData.get("bgColor"),axe.commons.color.incompleteData.set("fgColor",k),this.data({missingData:axe.commons.color.incompleteData.get("fgColor")}),void axe.commons.color.incompleteData.clear()}return!1}}},{id:"fieldset",evaluate:function(a,b){function c(a,b){return axe.commons.utils.toArray(a.querySelectorAll('select,textarea,button,input:not([name="'+b+'"]):not([type="hidden"])'))}function d(a,b){var d=a.firstElementChild;if(!d||"LEGEND"!==d.nodeName.toUpperCase())return h.relatedNodes([a]),g="no-legend",!1;if(!axe.commons.text.accessibleText(d))return h.relatedNodes([d]),g="empty-legend",!1;var e=c(a,b);return!e.length||(h.relatedNodes(e),g="mixed-inputs",!1)}function e(a,b){var d=axe.commons.dom.idrefs(a,"aria-labelledby").some(function(a){return a&&axe.commons.text.accessibleText(a)}),e=a.getAttribute("aria-label");if(!(d||e&&axe.commons.text.sanitize(e)))return h.relatedNodes(a),g="no-group-label",!1;var f=c(a,b);return!f.length||(h.relatedNodes(f),g="group-mixed-inputs",!1)}function f(a,b){return axe.commons.utils.toArray(a).filter(function(a){return a!==b})}var g,h=this,i={name:a.getAttribute("name"),type:a.getAttribute("type")},j=function(b){var c=axe.commons.utils.escapeSelector(a.name),i=document.querySelectorAll('input[type="'+axe.commons.utils.escapeSelector(a.type)+'"][name="'+c+'"]');if(i.length<2)return!0;var j=axe.commons.dom.findUp(b,"fieldset"),k=axe.commons.dom.findUp(b,'[role="group"]'+("radio"===a.type?',[role="radiogroup"]':""));return k||j?j?d(j,c):e(k,c):(g="no-group",h.relatedNodes(f(i,b)),!1)}(a);return j||(i.failureCode=g),this.data(i),j},after:function(a,b){var c={};return a.filter(function(a){if(a.result)return!0;var b=a.data;if(b){if(c[b.type]=c[b.type]||{},!c[b.type][b.name])return c[b.type][b.name]=[b],!0;var d=c[b.type][b.name].some(function(a){return a.failureCode===b.failureCode});return d||c[b.type][b.name].push(b),!d}return!1})}},{id:"group-labelledby",evaluate:function(a,b){this.data({name:a.getAttribute("name"),type:a.getAttribute("type")});var c=document.querySelectorAll('input[type="'+axe.commons.utils.escapeSelector(a.type)+'"][name="'+axe.commons.utils.escapeSelector(a.name)+'"]');return c.length<=1||0!==[].map.call(c,function(a){var b=a.getAttribute("aria-labelledby");return b?b.split(/\s+/):[]}).reduce(function(a,b){return a.filter(function(a){return-1!==b.indexOf(a)})}).filter(function(a){var b=document.getElementById(a);return b&&axe.commons.text.accessibleText(b)}).length},after:function(a,b){var c={};return a.filter(function(a){var b=a.data;return!(!b||(c[b.type]=c[b.type]||{},c[b.type][b.name]))&&(c[b.type][b.name]=!0,!0)})}},{id:"accesskeys",evaluate:function(a,b){return axe.commons.dom.isVisible(a,!1)&&(this.data(a.getAttribute("accesskey")),this.relatedNodes([a])),!0},after:function(a,b){var c={};return a.filter(function(a){if(!a.data)return!1;var b=a.data.toUpperCase();return c[b]?(c[b].relatedNodes.push(a.relatedNodes[0]),!1):(c[b]=a,a.relatedNodes=[],!0)}).map(function(a){return a.result=!!a.relatedNodes.length,a})}},{id:"focusable-no-name",evaluate:function(a,b){var c=a.getAttribute("tabindex");return!!(axe.commons.dom.isFocusable(a)&&c>-1)&&!axe.commons.text.accessibleText(a)}},{id:"tabindex",evaluate:function(a,b){return a.tabIndex<=0}},{id:"duplicate-img-label",evaluate:function(a,b){var c=a.querySelectorAll("img"),d=axe.commons.text.visible(a,!0).toLowerCase();if(""===d)return!1;for(var e=0,f=c.length;e<f;e++){var g=c[e];if(axe.commons.text.accessibleText(g).toLowerCase()===d&&"presentation"!==g.getAttribute("role")&&axe.commons.dom.isVisible(g))return!0}return!1}},{id:"explicit-label",evaluate:function(a,b){if(a.id){var c=document.querySelector('label[for="'+axe.commons.utils.escapeSelector(a.id)+'"]');if(c)return!!axe.commons.text.accessibleText(c)}return!1}},{id:"help-same-as-label",evaluate:function(a,b){var c=axe.commons.text.label(a),d=a.getAttribute("title");if(!c)return!1;if(!d&&(d="",a.getAttribute("aria-describedby"))){d=axe.commons.dom.idrefs(a,"aria-describedby").map(function(a){return a?axe.commons.text.accessibleText(a):""}).join("")}return axe.commons.text.sanitize(d)===axe.commons.text.sanitize(c)},enabled:!1},{id:"implicit-label",evaluate:function(a,b){var c=axe.commons.dom.findUp(a,"label");return!!c&&!!axe.commons.text.accessibleText(c)}},{id:"multiple-label",evaluate:function(a,b){var c=[].slice.call(document.querySelectorAll('label[for="'+axe.commons.utils.escapeSelector(a.id)+'"]')),d=a.parentNode;for(c.length&&(c=c.filter(function(a,b){if(0===b&&!axe.commons.dom.isVisible(a,!0)||axe.commons.dom.isVisible(a,!0))return a}));d;)"LABEL"===d.tagName&&-1===c.indexOf(d)&&c.push(d),d=d.parentNode;return this.relatedNodes(c),c.length>1}},{id:"title-only",evaluate:function(a,b){return!(axe.commons.text.label(a)||!a.getAttribute("title")&&!a.getAttribute("aria-describedby"))}},{id:"has-lang",evaluate:function(a,b){return!!(a.getAttribute("lang")||a.getAttribute("xml:lang")||"").trim()}},{id:"valid-lang",evaluate:function(a,b){function c(a){return a.trim().split("-")[0].toLowerCase()}var d,e;return d=(b||axe.commons.utils.validLangs()).map(c),e=["lang","xml:lang"].reduce(function(b,e){var f=a.getAttribute(e);if("string"!=typeof f)return b;var g=c(f);return""!==g&&-1===d.indexOf(g)&&b.push(e+'="'+a.getAttribute(e)+'"'),b},[]),!!e.length&&(this.data(e),!0)}},{id:"dlitem",evaluate:function(a,b){return"DL"===a.parentNode.tagName}},{id:"has-listitem",evaluate:function(a,b){var c=a.children;if(0===c.length)return!0;for(var d=0;d<c.length;d++)if("LI"===c[d].nodeName.toUpperCase())return!1;return!0}},{id:"listitem",evaluate:function(a,b){return-1!==["UL","OL"].indexOf(a.parentNode.nodeName.toUpperCase())||"list"===a.parentNode.getAttribute("role")}},{id:"only-dlitems",evaluate:function(a,b){for(var c,d,e=[],f=a.childNodes,g=["STYLE","META","LINK","MAP","AREA","SCRIPT","DATALIST","TEMPLATE"],h=!1,i=0;i<f.length;i++){c=f[i];var d=c.nodeName.toUpperCase();1===c.nodeType&&"DT"!==d&&"DD"!==d&&-1===g.indexOf(d)?e.push(c):3===c.nodeType&&""!==c.nodeValue.trim()&&(h=!0)}return e.length&&this.relatedNodes(e),!!e.length||h}},{id:"only-listitems",evaluate:function(a,b){for(var c,d,e=[],f=a.childNodes,g=["STYLE","META","LINK","MAP","AREA","SCRIPT","DATALIST","TEMPLATE"],h=!1,i=0;i<f.length;i++)c=f[i],d=c.nodeName.toUpperCase(),1===c.nodeType&&"LI"!==d&&-1===g.indexOf(d)?e.push(c):3===c.nodeType&&""!==c.nodeValue.trim()&&(h=!0);return e.length&&this.relatedNodes(e),!!e.length||h}},{id:"structured-dlitems",evaluate:function(a,b){var c=a.children;if(!c||!c.length)return!1;for(var d,e=!1,f=!1,g=0;g<c.length;g++){if(d=c[g].nodeName.toUpperCase(),"DT"===d&&(e=!0),e&&"DD"===d)return!1;"DD"===d&&(f=!0)}return e||f}},{id:"caption",evaluate:function(a,b){var c=a.querySelectorAll("track");if(c.length){for(var d=0;d<c.length;d++){var e=c[d].getAttribute("kind");if(e&&"captions"===e)return!1}return!0}}},{id:"description",evaluate:function(a,b){var c=a.querySelectorAll("track");if(c.length){for(var d=0;d<c.length;d++){var e=c[d].getAttribute("kind");if(e&&"descriptions"===e)return!1}return!0}}},{id:"meta-viewport-large",evaluate:function(a,b){b=b||{};for(var c,d=a.getAttribute("content")||"",e=d.split(/[;,]/),f={},g=b.scaleMinimum||2,h=b.lowerBound||!1,i=0,j=e.length;i<j;i++){c=e[i].split("=");var k=c.shift().toLowerCase();k&&c.length&&(f[k.trim()]=c.shift().trim().toLowerCase())}return!!(h&&f["maximum-scale"]&&parseFloat(f["maximum-scale"])<h)||!(!h&&"no"===f["user-scalable"])&&!(f["maximum-scale"]&&parseFloat(f["maximum-scale"])<g)},options:{scaleMinimum:5,lowerBound:2}},{id:"meta-viewport",evaluate:function(a,b){b=b||{};for(var c,d=a.getAttribute("content")||"",e=d.split(/[;,]/),f={},g=b.scaleMinimum||2,h=b.lowerBound||!1,i=0,j=e.length;i<j;i++){c=e[i].split("=");var k=c.shift().toLowerCase();k&&c.length&&(f[k.trim()]=c.shift().trim().toLowerCase())}return!!(h&&f["maximum-scale"]&&parseFloat(f["maximum-scale"])<h)||!(!h&&"no"===f["user-scalable"])&&!(f["maximum-scale"]&&parseFloat(f["maximum-scale"])<g)},options:{scaleMinimum:2}},{id:"header-present",evaluate:function(a,b){return!!a.querySelector('h1, h2, h3, h4, h5, h6, [role="heading"]')}},{id:"heading-order",evaluate:function(a,b){var c=a.getAttribute("aria-level");if(null!==c)return this.data(parseInt(c,10)),!0;var d=a.tagName.match(/H(\d)/);return!d||(this.data(parseInt(d[1],10)),!0)},after:function(a,b){if(a.length<2)return a;for(var c=a[0].data,d=1;d<a.length;d++)a[d].result&&a[d].data>c+1&&(a[d].result=!1),c=a[d].data;return a}},{id:"href-no-hash",evaluate:function(a,b){return"#"!==a.getAttribute("href")}},{id:"internal-link-present",evaluate:function(a,b){return!!a.querySelector('a[href^="#"]')}},{id:"landmark",evaluate:function(a,b){return a.getElementsByTagName("main").length>0||!!a.querySelector('[role="main"]')}},{id:"meta-refresh",evaluate:function(a,b){var c=a.getAttribute("content")||"",d=c.split(/[;,]/);return""===c||"0"===d[0]}},{id:"p-as-heading",evaluate:function(a,b){function c(a){for(var b=a,c=a.textContent.trim(),d=c;d===c&&void 0!==b;){var e=-1;if(a=b,0===a.children.length)return a;do{e++,d=a.children[e].textContent.trim()}while(""===d&&e+1<a.children.length);b=a.children[e]}return a}function d(a){switch(a){case"lighter":return 100;case"normal":return 400;case"bold":return 700;case"bolder":return 900}return a=parseInt(a),isNaN(a)?400:a}function e(a){var b=window.getComputedStyle(c(a));return{fontWeight:d(b.getPropertyValue("font-weight")),fontSize:parseInt(b.getPropertyValue("font-size")),isItalic:"italic"===b.getPropertyValue("font-style")}}function f(a,b,c){return c.reduce(function(c,d){return c||(!d.size||a.fontSize/d.size>b.fontSize)&&(!d.weight||a.fontWeight-d.weight>b.fontWeight)&&(!d.italic||a.isItalic&&!b.isItalic)},!1)}var g=Array.from(a.parentNode.children),h=g.indexOf(a);b=b||{};var i=b.margins||[],j=g.slice(h+1).find(function(a){return"P"===a.nodeName.toUpperCase()}),k=g.slice(0,h).reverse().find(function(a){return"P"===a.nodeName.toUpperCase()}),l=e(a),m=j?e(j):null,n=k?e(k):null;if(!m||!f(l,m,i))return!0;var o=axe.commons.dom.findUp(a,"blockquote");return!!(o&&"BLOCKQUOTE"===o.nodeName.toUpperCase()||n&&!f(l,n,i))&&void 0},options:{margins:[{weight:150,italic:!0},{weight:150,size:1.15},{italic:!0,size:1.15},{size:1.4}]}},{id:"region",evaluate:function(a,b){function c(a){return h&&axe.commons.dom.isFocusable(axe.commons.dom.getElementByReference(h,"href"))&&h===a}function d(a){var b=a.getAttribute("role");return b&&-1!==g.indexOf(b)}function e(a){return d(a)?null:c(a)?f(a):axe.commons.dom.isVisible(a,!0)&&(axe.commons.text.visible(a,!0,!0)||axe.commons.dom.isVisualContent(a))?a:f(a)}function f(a){var b=axe.commons.utils.toArray(a.children);return 0===b.length?[]:b.map(e).filter(function(a){return null!==a}).reduce(function(a,b){return a.concat(b)},[])}var g=axe.commons.aria.getRolesByType("landmark"),h=a.querySelector("a[href]"),i=f(a);return this.relatedNodes(i),!i.length},after:function(a,b){return[a[0]]}},{id:"skip-link",evaluate:function(a,b){return axe.commons.dom.isFocusable(axe.commons.dom.getElementByReference(a,"href"))},after:function(a,b){return[a[0]]}},{id:"unique-frame-title",evaluate:function(a,b){var c=axe.commons.text.sanitize(a.title).trim().toLowerCase();return this.data(c),!0},after:function(a,b){var c={};return a.forEach(function(a){c[a.data]=void 0!==c[a.data]?++c[a.data]:0}),a.forEach(function(a){a.result=!!c[a.data]}),a}},{id:"aria-label",evaluate:function(a,b){var c=a.getAttribute("aria-label");return!!(c?axe.commons.text.sanitize(c).trim():"")}},{id:"aria-labelledby",evaluate:function(a,b){return(0,axe.commons.dom.idrefs)(a,"aria-labelledby").some(function(a){return a&&axe.commons.text.accessibleText(a,!0)})}},{id:"button-has-visible-text",evaluate:function(a,b){var c=a.nodeName.toUpperCase(),d=a.getAttribute("role"),e=void 0;return("BUTTON"===c||"button"===d&&"INPUT"!==c)&&(e=axe.commons.text.accessibleText(a),this.data(e),!!e)}},{id:"doc-has-title",evaluate:function(a,b){var c=document.title;return!!(c?axe.commons.text.sanitize(c).trim():"")}},{id:"duplicate-id",evaluate:function(a,b){if(!a.id.trim())return!0;for(var c=document.querySelectorAll('[id="'+axe.commons.utils.escapeSelector(a.id)+'"]'),d=[],e=0;e<c.length;e++)c[e]!==a&&d.push(c[e]);return d.length&&this.relatedNodes(d),this.data(a.getAttribute("id")),c.length<=1},after:function(a,b){var c=[];return a.filter(function(a){return-1===c.indexOf(a.data)&&(c.push(a.data),!0)})}},{id:"exists",evaluate:function(a,b){return!0}},{id:"has-alt",evaluate:function(a,b){var c=a.nodeName.toLowerCase();return a.hasAttribute("alt")&&("img"===c||"input"===c||"area"===c)}},{id:"has-visible-text",evaluate:function(a,b){return axe.commons.text.accessibleText(a).length>0}},{id:"is-on-screen",evaluate:function(a,b){return axe.commons.dom.isVisible(a,!1)&&!axe.commons.dom.isOffscreen(a)}},{id:"non-empty-alt",evaluate:function(a,b){var c=a.getAttribute("alt");return!!(c?axe.commons.text.sanitize(c).trim():"")}},{id:"non-empty-if-present",evaluate:function(a,b){var c=a.nodeName.toUpperCase(),d=(a.getAttribute("type")||"").toLowerCase(),e=a.getAttribute("value");return this.data(e),"INPUT"===c&&-1!==["submit","reset"].indexOf(d)&&null===e}},{id:"non-empty-title",evaluate:function(a,b){var c=a.getAttribute("title");return!!(c?axe.commons.text.sanitize(c).trim():"")}},{id:"non-empty-value",evaluate:function(a,b){var c=a.getAttribute("value");return!!(c?axe.commons.text.sanitize(c).trim():"")}},{id:"role-none",evaluate:function(a,b){return"none"===a.getAttribute("role")}},{id:"role-presentation",evaluate:function(a,b){return"presentation"===a.getAttribute("role")}},{id:"caption-faked",evaluate:function(a,b){var c=axe.commons.table.toGrid(a),d=c[0];return c.length<=1||d.length<=1||a.rows.length<=1||d.reduce(function(a,b,c){return a||b!==d[c+1]&&void 0!==d[c+1]},!1)}},{id:"has-caption",evaluate:function(a,b){return!!a.caption}},{id:"has-summary",evaluate:function(a,b){
+return!!a.summary}},{id:"has-th",evaluate:function(a,b){for(var c,d,e=[],f=0,g=a.rows.length;f<g;f++){c=a.rows[f];for(var h=0,i=c.cells.length;h<i;h++)d=c.cells[h],"TH"!==d.nodeName.toUpperCase()&&-1===["rowheader","columnheader"].indexOf(d.getAttribute("role"))||e.push(d)}return!!e.length&&(this.relatedNodes(e),!0)}},{id:"html5-scope",evaluate:function(a,b){return!axe.commons.dom.isHTML5(document)||"TH"===a.nodeName.toUpperCase()}},{id:"same-caption-summary",evaluate:function(a,b){return!(!a.summary||!a.caption)&&a.summary===axe.commons.text.accessibleText(a.caption)}},{id:"scope-value",evaluate:function(a,b){b=b||{};var c=a.getAttribute("scope").toLowerCase();return-1!==(["row","col","rowgroup","colgroup"]||b.values).indexOf(c)}},{id:"td-has-header",evaluate:function(a,b){var c=axe.commons.table,d=[];return c.getAllCells(a).forEach(function(a){if(axe.commons.dom.hasContent(a)&&c.isDataCell(a)&&!axe.commons.aria.label(a)){var b=c.getHeaders(a);(b=b.reduce(function(a,b){return a||null!==b&&!!axe.commons.dom.hasContent(b)},!1))||d.push(a)}}),!d.length||(this.relatedNodes(d),!1)}},{id:"td-headers-attr",evaluate:function(a,b){for(var c=[],d=0,e=a.rows.length;d<e;d++)for(var f=a.rows[d],g=0,h=f.cells.length;g<h;g++)c.push(f.cells[g]);var i=c.reduce(function(a,b){return b.id&&a.push(b.id),a},[]),j=c.reduce(function(a,b){var c,d,e=(b.getAttribute("headers")||"").split(/\s/).reduce(function(a,b){return b=b.trim(),b&&a.push(b),a},[]);return 0!==e.length&&(b.id&&(c=-1!==e.indexOf(b.id.trim())),d=e.reduce(function(a,b){return a||-1===i.indexOf(b)},!1),(c||d)&&a.push(b)),a},[]);return!(j.length>0)||(this.relatedNodes(j),!1)}},{id:"th-has-data-cells",evaluate:function(a,b){var c=axe.commons.table,d=c.getAllCells(a),e=this,f=[];d.forEach(function(a){var b=a.getAttribute("headers");b&&(f=f.concat(b.split(/\s+/)));var c=a.getAttribute("aria-labelledby");c&&(f=f.concat(c.split(/\s+/)))});var g=d.filter(function(a){return""!==axe.commons.text.sanitize(a.textContent)&&("TH"===a.nodeName.toUpperCase()||-1!==["rowheader","columnheader"].indexOf(a.getAttribute("role")))}),h=c.toGrid(a);return!!g.reduce(function(a,b){if(b.id&&-1!==f.indexOf(b.id))return!!a||a;var d=!1,g=c.getCellPosition(b,h);return c.isColumnHeader(b)&&(d=c.traverse("down",g,h).reduce(function(a,b){return a||axe.commons.dom.hasContent(b)&&!c.isColumnHeader(b)},!1)),!d&&c.isRowHeader(b)&&(d=c.traverse("right",g,h).reduce(function(a,b){return a||axe.commons.dom.hasContent(b)&&!c.isRowHeader(b)},!1)),d||e.relatedNodes(b),a&&d},!0)||void 0}},{id:"hidden-content",evaluate:function(a,b){var c=window.getComputedStyle(a);if(!["SCRIPT","HEAD","TITLE","NOSCRIPT","STYLE","TEMPLATE"].includes(a.tagName.toUpperCase())&&axe.commons.dom.hasContent(a)){if("none"===c.getPropertyValue("display"))return;if("hidden"===c.getPropertyValue("visibility")){if(a.parentNode)var d=window.getComputedStyle(a.parentNode);if(!d||"hidden"!==d.getPropertyValue("visibility"))return}}return!0}}],commons:function(){function a(a){return a.getPropertyValue("font-family").split(/[,;]/g).map(function(a){return a.trim().toLowerCase()})}function b(b,c){var d=window.getComputedStyle(b);if("none"!==d.getPropertyValue("background-image"))return!0;if(["border-bottom","border-top","outline"].reduce(function(a,b){var c=new y.Color;return c.parseRgbString(d.getPropertyValue(b+"-color")),a||"none"!==d.getPropertyValue(b+"-style")&&parseFloat(d.getPropertyValue(b+"-width"))>0&&0!==c.alpha},!1))return!0;var e=window.getComputedStyle(c);if(a(d)[0]!==a(e)[0])return!0;var f=["text-decoration-line","text-decoration-style","font-weight","font-style","font-size"].reduce(function(a,b){return a||d.getPropertyValue(b)!==e.getPropertyValue(b)},!1),g=d.getPropertyValue("text-decoration");return g.split(" ").length<3&&(f=f||g!==e.getPropertyValue("text-decoration")),f}function c(a,b){var c=a.nodeName.toUpperCase();if(C.includes(c))return axe.commons.color.incompleteData.set("bgColor","imgNode"),!0;b=b||window.getComputedStyle(a);var d=b.getPropertyValue("background-image"),e="none"!==d;if(e){var f=/gradient/.test(d);axe.commons.color.incompleteData.set("bgColor",f?"bgGradient":"bgImage")}return e}function d(a,b){b=b||window.getComputedStyle(a);var c=new y.Color;if(c.parseRgbString(b.getPropertyValue("background-color")),0!==c.alpha){var d=b.getPropertyValue("opacity");c.alpha=c.alpha*d}return c}function e(a,b){var c=a.getClientRects()[0],d=document.elementsFromPoint(c.left,c.top);if(d)for(var e=0;e<d.length;e++)if(d[e]!==a&&d[e]===b)return!0;return!1}function f(a,b,c){var f=0;if(a>0)for(var g=a-1;g>=0;g--){var h=b[g],i=window.getComputedStyle(h),j=d(h,i);j.alpha&&e(c,h)?f+=j.alpha:b.splice(g,1)}return f}function g(a,b,c){var d=a!==b&&!z.visuallyContains(a,b)&&0!==c.alpha;return d&&axe.commons.color.incompleteData.set("bgColor","elmPartiallyObscured"),d}function h(a,b){var c={TD:"TR",INPUT:"LABEL"},d=a.map(function(a){return a.tagName}),e=a;for(var f in c)if(c.hasOwnProperty(f)){if(b.tagName===f){var g=axe.commons.dom.findUp(b,c[f]);if(g&&-1===a.indexOf(g)){var h=axe.commons.dom.visuallyOverlaps(b.getBoundingClientRect(),g);h&&e.splice(a.indexOf(b)+1,0,g)}}b.tagName===c[f]&&-1===d.indexOf(b.tagName)&&e.splice(d.indexOf(f)+1,0,b)}return e}function i(a){var b=a.indexOf(document.body),e=a;return b>1&&!c(document.documentElement)&&0===d(document.documentElement).alpha&&(e.splice(b,1),e.splice(a.indexOf(document.documentElement),1),e.push(document.body)),e}function j(a,b){"use strict";var c=b(a);for(a=a.firstChild;a;)!1!==c&&j(a,b),a=a.nextSibling}function k(a){"use strict";var b=window.getComputedStyle(a).getPropertyValue("display");return-1!==D.indexOf(b)||"table-"===b.substr(0,6)}function l(a){"use strict";var b=a.match(/rect\s*\(([0-9]+)px,?\s*([0-9]+)px,?\s*([0-9]+)px,?\s*([0-9]+)px\s*\)/);return!(!b||5!==b.length)&&(b[3]-b[1]<=0&&b[2]-b[4]<=0)}function m(a){var b=null;return a.id&&(b=document.querySelector('label[for="'+axe.utils.escapeSelector(a.id)+'"]'))?b:b=z.findUp(a,"label")}function n(a){return-1!==["button","reset","submit"].indexOf(a.type)}function o(a){var b=a.nodeName.toUpperCase();return"TEXTAREA"===b||"SELECT"===b||"INPUT"===b&&"hidden"!==a.type.toLowerCase()}function p(a){return-1!==["BUTTON","SUMMARY","A"].indexOf(a.nodeName.toUpperCase())}function q(a){return-1!==["TABLE","FIGURE"].indexOf(a.nodeName.toUpperCase())}function r(a){var b=a.nodeName.toUpperCase();if("INPUT"===b)return!a.hasAttribute("type")||-1!==G.indexOf(a.getAttribute("type").toLowerCase())&&a.value?a.value:"";if("SELECT"===b){var c=a.options;if(c&&c.length){for(var d="",e=0;e<c.length;e++)c[e].selected&&(d+=" "+c[e].text);return B.sanitize(d)}return""}return"TEXTAREA"===b&&a.value?a.value:""}function s(a,b){var c=a.querySelector(b.toLowerCase());return c?B.accessibleText(c):""}function t(a){if(!a)return!1;switch(a.nodeName.toUpperCase()){case"SELECT":case"TEXTAREA":return!0;case"INPUT":return!a.hasAttribute("type")||-1!==G.indexOf(a.getAttribute("type").toLowerCase());default:return!1}}function u(a){var b=a.nodeName.toUpperCase();return"INPUT"===b&&"image"===a.type.toLowerCase()||-1!==["IMG","APPLET","AREA"].indexOf(b)}function v(a){return!!B.sanitize(a)}var commons={},w=commons.aria={},x=w._lut={};x.attributes={"aria-activedescendant":{type:"idref"},"aria-atomic":{type:"boolean",values:["true","false"]},"aria-autocomplete":{type:"nmtoken",values:["inline","list","both","none"]},"aria-busy":{type:"boolean",values:["true","false"]},"aria-checked":{type:"nmtoken",values:["true","false","mixed","undefined"]},"aria-colcount":{type:"int"},"aria-colindex":{type:"int"},"aria-colspan":{type:"int"},"aria-controls":{type:"idrefs"},"aria-current":{type:"nmtoken",values:["page","step","location","date","time","true","false"]},"aria-describedby":{type:"idrefs"},"aria-disabled":{type:"boolean",values:["true","false"]},"aria-dropeffect":{type:"nmtokens",values:["copy","move","reference","execute","popup","none"]},"aria-expanded":{type:"nmtoken",values:["true","false","undefined"]},"aria-flowto":{type:"idrefs"},"aria-grabbed":{type:"nmtoken",values:["true","false","undefined"]},"aria-haspopup":{type:"boolean",values:["true","false"]},"aria-hidden":{type:"boolean",values:["true","false"]},"aria-invalid":{type:"nmtoken",values:["true","false","spelling","grammar"]},"aria-label":{type:"string"},"aria-labelledby":{type:"idrefs"},"aria-level":{type:"int"},"aria-live":{type:"nmtoken",values:["off","polite","assertive"]},"aria-multiline":{type:"boolean",values:["true","false"]},"aria-multiselectable":{type:"boolean",values:["true","false"]},"aria-orientation":{type:"nmtoken",values:["horizontal","vertical"]},"aria-owns":{type:"idrefs"},"aria-posinset":{type:"int"},"aria-pressed":{type:"nmtoken",values:["true","false","mixed","undefined"]},"aria-readonly":{type:"boolean",values:["true","false"]},"aria-relevant":{type:"nmtokens",values:["additions","removals","text","all"]},"aria-required":{type:"boolean",values:["true","false"]},"aria-rowcount":{type:"int"},"aria-rowindex":{type:"int"},"aria-rowspan":{type:"int"},"aria-selected":{type:"nmtoken",values:["true","false","undefined"]},"aria-setsize":{type:"int"},"aria-sort":{type:"nmtoken",values:["ascending","descending","other","none"]},"aria-valuemax":{type:"decimal"},"aria-valuemin":{type:"decimal"},"aria-valuenow":{type:"decimal"},"aria-valuetext":{type:"string"}},x.globalAttributes=["aria-atomic","aria-busy","aria-controls","aria-current","aria-describedby","aria-disabled","aria-dropeffect","aria-flowto","aria-grabbed","aria-haspopup","aria-hidden","aria-invalid","aria-label","aria-labelledby","aria-live","aria-owns","aria-relevant"],x.role={alert:{type:"widget",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null},alertdialog:{type:"widget",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null},application:{type:"landmark",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null},article:{type:"structure",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["article"]},banner:{type:"landmark",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["header"]},button:{type:"widget",attributes:{allowed:["aria-expanded","aria-pressed"]},owned:null,nameFrom:["author","contents"],context:null,implicit:["button",'input[type="button"]','input[type="image"]','input[type="reset"]','input[type="submit"]',"summary"]},cell:{type:"structure",attributes:{allowed:["aria-colindex","aria-colspan","aria-rowindex","aria-rowspan"]},owned:null,nameFrom:["author","contents"],context:["row"],implicit:["td","th"]},checkbox:{type:"widget",attributes:{required:["aria-checked"]},owned:null,nameFrom:["author","contents"],context:null,implicit:['input[type="checkbox"]']},columnheader:{type:"structure",attributes:{allowed:["aria-expanded","aria-sort","aria-readonly","aria-selected","aria-required"]},owned:null,nameFrom:["author","contents"],context:["row"],implicit:["th"]},combobox:{type:"composite",attributes:{required:["aria-expanded"],allowed:["aria-autocomplete","aria-required","aria-activedescendant"]},owned:{all:["listbox","textbox"]},nameFrom:["author"],context:null},command:{nameFrom:["author"],type:"abstract"},complementary:{type:"landmark",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["aside"]},composite:{nameFrom:["author"],type:"abstract"},contentinfo:{type:"landmark",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["footer"]},definition:{type:"structure",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["dd"]},dialog:{type:"widget",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["dialog"]},directory:{type:"structure",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author","contents"],context:null},document:{type:"structure",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["body"]},form:{type:"landmark",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["form"]},grid:{type:"composite",attributes:{allowed:["aria-level","aria-multiselectable","aria-readonly","aria-activedescendant","aria-expanded"]},owned:{one:["rowgroup","row"]},nameFrom:["author"],context:null,implicit:["table"]},gridcell:{type:"widget",attributes:{allowed:["aria-selected","aria-readonly","aria-expanded","aria-required"]},owned:null,nameFrom:["author","contents"],context:["row"],implicit:["td","th"]},group:{type:"structure",attributes:{allowed:["aria-activedescendant","aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["details","optgroup"]},heading:{type:"structure",attributes:{allowed:["aria-level","aria-expanded"]},owned:null,nameFrom:["author","contents"],context:null,implicit:["h1","h2","h3","h4","h5","h6"]},img:{type:"structure",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["img"]},input:{nameFrom:["author"],type:"abstract"},landmark:{nameFrom:["author"],type:"abstract"},link:{type:"widget",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author","contents"],context:null,implicit:["a[href]"]},list:{type:"structure",attributes:{allowed:["aria-expanded"]},owned:{all:["listitem"]},nameFrom:["author"],context:null,implicit:["ol","ul","dl"]},listbox:{type:"composite",attributes:{allowed:["aria-activedescendant","aria-multiselectable","aria-required","aria-expanded"]},owned:{all:["option"]},nameFrom:["author"],context:null,implicit:["select"]},listitem:{type:"structure",attributes:{allowed:["aria-level","aria-posinset","aria-setsize","aria-expanded"]},owned:null,nameFrom:["author","contents"],context:["list"],implicit:["li","dt"]},log:{type:"widget",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null},main:{type:"landmark",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["main"]},marquee:{type:"widget",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null},math:{type:"structure",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["math"]},menu:{type:"composite",attributes:{allowed:["aria-activedescendant","aria-expanded"]},owned:{one:["menuitem","menuitemradio","menuitemcheckbox"]},nameFrom:["author"],context:null,implicit:['menu[type="context"]']},menubar:{type:"composite",attributes:{allowed:["aria-activedescendant","aria-expanded"]},owned:null,nameFrom:["author"],context:null},menuitem:{type:"widget",attributes:null,owned:null,nameFrom:["author","contents"],context:["menu","menubar"],implicit:['menuitem[type="command"]']},menuitemcheckbox:{type:"widget",attributes:{required:["aria-checked"]},owned:null,nameFrom:["author","contents"],context:["menu","menubar"],implicit:['menuitem[type="checkbox"]']},menuitemradio:{type:"widget",attributes:{allowed:["aria-selected","aria-posinset","aria-setsize"],required:["aria-checked"]},owned:null,nameFrom:["author","contents"],context:["menu","menubar"],implicit:['menuitem[type="radio"]']},navigation:{type:"landmark",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["nav"]},none:{type:"structure",attributes:null,owned:null,nameFrom:["author"],context:null},note:{type:"structure",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null},option:{type:"widget",attributes:{allowed:["aria-selected","aria-posinset","aria-setsize","aria-checked"]},owned:null,nameFrom:["author","contents"],context:["listbox"],implicit:["option"]},presentation:{type:"structure",attributes:null,owned:null,nameFrom:["author"],context:null},progressbar:{type:"widget",attributes:{allowed:["aria-valuetext","aria-valuenow","aria-valuemax","aria-valuemin"]},owned:null,nameFrom:["author"],context:null,implicit:["progress"]},radio:{type:"widget",attributes:{allowed:["aria-selected","aria-posinset","aria-setsize"],required:["aria-checked"]},owned:null,nameFrom:["author","contents"],context:null,implicit:['input[type="radio"]']},radiogroup:{type:"composite",attributes:{allowed:["aria-activedescendant","aria-required","aria-expanded"]},owned:{all:["radio"]},nameFrom:["author"],context:null},range:{nameFrom:["author"],type:"abstract"},region:{type:"structure",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["section"]},roletype:{type:"abstract"},row:{type:"structure",attributes:{allowed:["aria-level","aria-selected","aria-activedescendant","aria-expanded"]},owned:{one:["cell","columnheader","rowheader","gridcell"]},nameFrom:["author","contents"],context:["rowgroup","grid","treegrid","table"],implicit:["tr"]},rowgroup:{type:"structure",attributes:{allowed:["aria-activedescendant","aria-expanded"]},owned:{all:["row"]},nameFrom:["author","contents"],context:["grid","table"],implicit:["tbody","thead","tfoot"]},rowheader:{type:"structure",attributes:{allowed:["aria-sort","aria-required","aria-readonly","aria-expanded","aria-selected"]},owned:null,nameFrom:["author","contents"],context:["row"],implicit:["th"]},scrollbar:{type:"widget",attributes:{required:["aria-controls","aria-orientation","aria-valuenow","aria-valuemax","aria-valuemin"],allowed:["aria-valuetext"]},owned:null,nameFrom:["author"],context:null},search:{type:"landmark",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null},searchbox:{type:"widget",attributes:{allowed:["aria-activedescendant","aria-autocomplete","aria-multiline","aria-readonly","aria-required"]},owned:null,nameFrom:["author"],context:null,implicit:['input[type="search"]']},section:{nameFrom:["author","contents"],type:"abstract"},sectionhead:{nameFrom:["author","contents"],type:"abstract"},select:{nameFrom:["author"],type:"abstract"},separator:{type:"structure",attributes:{allowed:["aria-expanded","aria-orientation"]},owned:null,nameFrom:["author"],context:null,implicit:["hr"]},slider:{type:"widget",attributes:{allowed:["aria-valuetext","aria-orientation"],required:["aria-valuenow","aria-valuemax","aria-valuemin"]},owned:null,nameFrom:["author"],context:null,implicit:['input[type="range"]']},spinbutton:{type:"widget",attributes:{allowed:["aria-valuetext","aria-required"],required:["aria-valuenow","aria-valuemax","aria-valuemin"]},owned:null,nameFrom:["author"],context:null,implicit:['input[type="number"]']},status:{type:"widget",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:["output"]},structure:{type:"abstract"},switch:{type:"widget",attributes:{required:["aria-checked"]},owned:null,nameFrom:["author","contents"],context:null},tab:{type:"widget",attributes:{allowed:["aria-selected","aria-expanded"]},owned:null,nameFrom:["author","contents"],context:["tablist"]},table:{type:"structure",attributes:{allowed:["aria-colcount","aria-rowcount"]},owned:{one:["rowgroup","row"]},nameFrom:["author"],context:null,implicit:["table"]},tablist:{type:"composite",attributes:{allowed:["aria-activedescendant","aria-expanded","aria-level","aria-multiselectable"]},owned:{all:["tab"]},nameFrom:["author"],context:null},tabpanel:{type:"widget",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null},text:{type:"structure",owned:null,nameFrom:["author","contents"],context:null},textbox:{type:"widget",attributes:{allowed:["aria-activedescendant","aria-autocomplete","aria-multiline","aria-readonly","aria-required"]},owned:null,nameFrom:["author"],context:null,implicit:['input[type="text"]','input[type="email"]','input[type="password"]','input[type="tel"]','input[type="url"]',"input:not([type])","textarea"]},timer:{type:"widget",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author"],context:null},toolbar:{type:"structure",attributes:{allowed:["aria-activedescendant","aria-expanded"]},owned:null,nameFrom:["author"],context:null,implicit:['menu[type="toolbar"]']},tooltip:{type:"widget",attributes:{allowed:["aria-expanded"]},owned:null,nameFrom:["author","contents"],context:null},tree:{type:"composite",attributes:{allowed:["aria-activedescendant","aria-multiselectable","aria-required","aria-expanded"]},owned:{all:["treeitem"]},nameFrom:["author"],context:null},treegrid:{type:"composite",attributes:{allowed:["aria-activedescendant","aria-expanded","aria-level","aria-multiselectable","aria-readonly","aria-required"]},owned:{all:["treeitem"]},nameFrom:["author"],context:null},treeitem:{type:"widget",attributes:{allowed:["aria-checked","aria-selected","aria-expanded","aria-level","aria-posinset","aria-setsize"]},owned:null,nameFrom:["author","contents"],context:["treegrid","tree"]},widget:{type:"abstract"},window:{nameFrom:["author"],type:"abstract"}};var y={};commons.color=y;var z=commons.dom={},A=commons.table={},B=commons.text={};commons.utils=axe.utils;w.requiredAttr=function(a){"use strict";var b=x.role[a];return b&&b.attributes&&b.attributes.required||[]},w.allowedAttr=function(a){"use strict";var b=x.role[a],c=b&&b.attributes&&b.attributes.allowed||[],d=b&&b.attributes&&b.attributes.required||[];return c.concat(x.globalAttributes).concat(d)},w.validateAttr=function(a){"use strict";return!!x.attributes[a]},w.validateAttrValue=function(a,b){"use strict";var c,d,e=a.getAttribute(b),f=x.attributes[b],g=z.getRootNode(a);if(!f)return!0;switch(f.type){case"boolean":case"nmtoken":return"string"==typeof e&&-1!==f.values.indexOf(e.toLowerCase());case"nmtokens":return d=axe.utils.tokenList(e),d.reduce(function(a,b){return a&&-1!==f.values.indexOf(b)},0!==d.length);case"idref":return!(!e||!g.getElementById(e));case"idrefs":return d=axe.utils.tokenList(e),d.reduce(function(a,b){return!(!a||!g.getElementById(b))},0!==d.length);case"string":return!0;case"decimal":return!(!(c=e.match(/^[-+]?([0-9]*)\.?([0-9]*)$/))||!c[1]&&!c[2]);case"int":return/^[-+]?[0-9]+$/.test(e)}},w.label=function(a){var b,c;return a.actualNode.getAttribute("aria-labelledby")&&(b=z.idrefs(a.actualNode,"aria-labelledby"),c=b.map(function(a){var b=axe.utils.getNodeFromTree(axe._tree[0],a);return b?B.visible(b,!0):""}).join(" ").trim())?c:(c=a.actualNode.getAttribute("aria-label"),c&&(c=B.sanitize(c).trim())?c:null)},w.isValidRole=function(a){"use strict";return!!x.role[a]},w.getRolesWithNameFromContents=function(){return Object.keys(x.role).filter(function(a){return x.role[a].nameFrom&&-1!==x.role[a].nameFrom.indexOf("contents")})},w.getRolesByType=function(a){return Object.keys(x.role).filter(function(b){return x.role[b].type===a})},w.getRoleType=function(a){var b=x.role[a];return b&&b.type||null},w.requiredOwned=function(a){"use strict";var b=null,c=x.role[a];return c&&(b=axe.utils.clone(c.owned)),b},w.requiredContext=function(a){"use strict";var b=null,c=x.role[a];return c&&(b=axe.utils.clone(c.context)),b},w.implicitNodes=function(a){"use strict";var b=null,c=x.role[a];return c&&c.implicit&&(b=axe.utils.clone(c.implicit)),b},w.implicitRole=function(a){"use strict";var b=function(b,c){var d=function(b){return axe.utils.matchesSelector(a,b)};return c.implicit&&c.implicit.some(d)&&b.push(c.name),b},c=Object.keys(x.role).map(function(a){var b=x.role[a];return{name:a,implicit:b&&b.implicit}}),d=c.reduce(b,[]);if(!d.length)return null;for(var e=a.attributes,f=[],g=0,h=e.length;g<h;g++){var i=e[g];i.name.match(/^aria-/)&&f.push(i.name)}return function(a,b){var c=function(a){return w.allowedAttr(a).reduce(function(a,c){return a+(b.indexOf(c)>-1?1:0)},0)};return a.map(function(a){return{score:c(a),name:a}}).sort(function(a,b){return b.score-a.score}).map(function(a){return a.name})}(d,f).shift()},y.Color=function(a,b,c,d){this.red=a,this.green=b,this.blue=c,this.alpha=d,this.toHexString=function(){var a=Math.round(this.red).toString(16),b=Math.round(this.green).toString(16),c=Math.round(this.blue).toString(16);return"#"+(this.red>15.5?a:"0"+a)+(this.green>15.5?b:"0"+b)+(this.blue>15.5?c:"0"+c)};var e=/^rgb\((\d+), (\d+), (\d+)\)$/,f=/^rgba\((\d+), (\d+), (\d+), (\d*(\.\d+)?)\)/;this.parseRgbString=function(a){if("transparent"===a)return this.red=0,this.green=0,this.blue=0,void(this.alpha=0);var b=a.match(e);return b?(this.red=parseInt(b[1],10),this.green=parseInt(b[2],10),this.blue=parseInt(b[3],10),void(this.alpha=1)):(b=a.match(f),b?(this.red=parseInt(b[1],10),this.green=parseInt(b[2],10),this.blue=parseInt(b[3],10),void(this.alpha=parseFloat(b[4]))):void 0)},this.getRelativeLuminance=function(){var a=this.red/255,b=this.green/255,c=this.blue/255;return.2126*(a<=.03928?a/12.92:Math.pow((a+.055)/1.055,2.4))+.7152*(b<=.03928?b/12.92:Math.pow((b+.055)/1.055,2.4))+.0722*(c<=.03928?c/12.92:Math.pow((c+.055)/1.055,2.4))}},y.flattenColors=function(a,b){var c=a.alpha,d=(1-c)*b.red+c*a.red,e=(1-c)*b.green+c*a.green,f=(1-c)*b.blue+c*a.blue,g=a.alpha+b.alpha*(1-a.alpha);return new y.Color(d,e,f,g)},y.getContrast=function(a,b){if(!b||!a)return null;b.alpha<1&&(b=y.flattenColors(b,a));var c=a.getRelativeLuminance(),d=b.getRelativeLuminance();return(Math.max(d,c)+.05)/(Math.min(d,c)+.05)},y.hasValidContrastRatio=function(a,b,c,d){var e=y.getContrast(a,b),f=d&&Math.ceil(72*c)/96<14||!d&&Math.ceil(72*c)/96<18;return{isValid:f&&e>=4.5||!f&&e>=3,contrastRatio:e}},y.elementIsDistinct=b;var C=["IMG","CANVAS","OBJECT","IFRAME","VIDEO","SVG"];y.getBackgroundStack=function(a){var b=a.getBoundingClientRect(),c=void 0,d=void 0;if(!(b.left>window.innerWidth||b.top>window.innerHeight)){c=Math.min(Math.ceil(b.left+b.width/2),window.innerWidth-1),d=Math.min(Math.ceil(b.top+b.height/2),window.innerHeight-1);var e=document.elementsFromPoint(c,d);e=h(e,a),e=z.reduceToElementsBelowFloating(e,a),e=i(e);var g=e.indexOf(a);return f(g,e,a)>=.99?(axe.commons.color.incompleteData.set("bgColor","bgOverlap"),null):-1!==g?e:null}},y.getBackgroundColor=function(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];!0!==(arguments.length>2&&void 0!==arguments[2]&&arguments[2])&&a.scrollIntoView();var e=[],f=y.getBackgroundStack(a);if((f||[]).some(function(f){var h=window.getComputedStyle(f),i=d(f,h);return g(a,f,i)||c(f,h)?(e=null,b.push(f),!0):0!==i.alpha&&(b.push(f),e.push(i),1===i.alpha)}),null!==e&&null!==f){e.push(new y.Color(255,255,255,1));return e.reduce(y.flattenColors)}return null},z.isOpaque=function(a){var b=window.getComputedStyle(a);return c(a,b)||1===d(a,b).alpha},y.getForegroundColor=function(a,b){var c=window.getComputedStyle(a),d=new y.Color;d.parseRgbString(c.getPropertyValue("color"));var e=c.getPropertyValue("opacity");if(d.alpha=d.alpha*e,1===d.alpha)return d;var f=y.getBackgroundColor(a,[],b);if(null===f){var g=axe.commons.color.incompleteData.get("bgColor");return axe.commons.color.incompleteData.set("fgColor",g),null}return y.flattenColors(d,f)},y.incompleteData=function(){var a={};return{set:function(b,c){if("string"!=typeof b)throw new Error("Incomplete data: key must be a string");return c&&(a[b]=c),a[b]},get:function(b){return a[b]},clear:function(){a={}}}}(),z.reduceToElementsBelowFloating=function(a,b){var c,d,e,f=["fixed","sticky"],g=[],h=!1;for(c=0;c<a.length;++c)d=a[c],d===b&&(h=!0),e=window.getComputedStyle(d),h||-1===f.indexOf(e.position)?g.push(d):g=[];return g},z.findUp=function(a,b){"use strict";var c,d,e=axe.commons.dom.getRootNode(a);if(d=e.querySelectorAll(b),d=axe.utils.toArray(d),e===document&&!d.length)return null;for(c=a.assignedSlot?a.assignedSlot:a.parentNode,11===c.nodeType&&(c=c.host);c&&-1===d.indexOf(c);)if((c=c.assignedSlot?c.assignedSlot:c.parentNode)&&11===c.nodeType&&(c=c.host,e=axe.commons.dom.getRootNode(c),d=e.querySelectorAll(b),d=axe.utils.toArray(d),e===document&&!d.length))return null;return c},z.getElementByReference=function(a,b){"use strict";var c,d=a.getAttribute(b),e=document;if(d&&"#"===d.charAt(0)){if(d=d.substring(1),c=e.getElementById(d))return c;if(c=e.getElementsByName(d),c.length)return c[0]}return null},z.getElementCoordinates=function(a){"use strict";var b=z.getScrollOffset(document),c=b.left,d=b.top,e=a.getBoundingClientRect();return{top:e.top+d,right:e.right+c,bottom:e.bottom+d,left:e.left+c,width:e.right-e.left,height:e.bottom-e.top}},z.getRootNode=function(a){var b=a.getRootNode&&a.getRootNode()||document;return b===a&&(b=document),b},z.getScrollOffset=function(a){"use strict";if(!a.nodeType&&a.document&&(a=a.document),9===a.nodeType){var b=a.documentElement,c=a.body;return{left:b&&b.scrollLeft||c&&c.scrollLeft||0,top:b&&b.scrollTop||c&&c.scrollTop||0}}return{left:a.scrollLeft,top:a.scrollTop}},z.getViewportSize=function(a){"use strict";var b,c=a.document,d=c.documentElement;return a.innerWidth?{width:a.innerWidth,height:a.innerHeight}:d?{width:d.clientWidth,height:d.clientHeight}:(b=c.body,{width:b.clientWidth,height:b.clientHeight})},z.hasContent=function(a){if(a.actualNode.textContent.trim()||w.label(a))return!0;for(var b=axe.utils.querySelectorAll(a,"*"),c=0;c<b.length;c++)if(w.label(b[c])||z.isVisualContent(b[c].actualNode))return!0;return!1},z.idrefs=function(a,b){"use strict";var c,d,e=z.getRootNode(a),f=[],g=a.getAttribute(b);if(g)for(g=axe.utils.tokenList(g),c=0,d=g.length;c<d;c++)f.push(e.getElementById(g[c]));return f},z.isFocusable=function(a){"use strict";if(!a||a.disabled||!z.isVisible(a)&&"AREA"!==a.nodeName.toUpperCase())return!1;switch(a.nodeName.toUpperCase()){case"A":case"AREA":if(a.href)return!0;break;case"INPUT":return"hidden"!==a.type;case"TEXTAREA":case"SELECT":case"DETAILS":case"BUTTON":return!0}var b=a.getAttribute("tabindex");return!(!b||isNaN(parseInt(b,10)))},z.isHTML5=function(a){var b=a.doctype;return null!==b&&("html"===b.name&&!b.publicId&&!b.systemId)};var D=["block","list-item","table","flex","grid","inline-block"];z.isInTextBlock=function(a){"use strict";if(k(a))return!1;for(var b=a.parentNode;1===b.nodeType&&!k(b);)b=b.parentNode;var c="",d="",e=0;return j(b,function(b){if(2===e)return!1;if(3===b.nodeType&&(c+=b.nodeValue),1===b.nodeType){var f=(b.nodeName||"").toUpperCase();if(-1!==["BR","HR"].indexOf(f))0===e?(c="",d=""):e=2;else{if("none"===b.style.display||"hidden"===b.style.overflow||-1===["",null,"none"].indexOf(b.style.float)||-1===["",null,"relative"].indexOf(b.style.position))return!1;if("A"===f&&b.href||"link"===(b.getAttribute("role")||"").toLowerCase())return b===a&&(e=1),d+=b.textContent,!1}}}),c=axe.commons.text.sanitize(c),d=axe.commons.text.sanitize(d),c.length>d.length},z.isNode=function(a){"use strict";return a instanceof Node},z.isOffscreen=function(a){"use strict";var b,c=document.documentElement,d=window.getComputedStyle(a),e=window.getComputedStyle(document.body||c).getPropertyValue("direction"),f=z.getElementCoordinates(a);if(f.bottom<0&&(function(a,b){for(a=a.parentNode;"html"!==a.nodeName.toLowerCase();){if(a.scrollTop&&(b+=a.scrollTop)>=0)return!1;a=a.parentNode}return!0}(a,f.bottom)||"absolute"===d.position))return!0;if(0===f.left&&0===f.right)return!1;if("ltr"===e){if(f.right<=0)return!0}else if(b=Math.max(c.scrollWidth,z.getViewportSize(window).width),f.left>=b)return!0;return!1},z.isVisible=function(a,b,c){"use strict";var d,e,f;return 9===a.nodeType||(11===a.nodeType&&(a=a.host),null!==(d=window.getComputedStyle(a,null))&&(e=a.nodeName.toUpperCase(),!("none"===d.getPropertyValue("display")||"STYLE"===e.toUpperCase()||"SCRIPT"===e.toUpperCase()||!b&&l(d.getPropertyValue("clip"))||!c&&("hidden"===d.getPropertyValue("visibility")||!b&&z.isOffscreen(a))||b&&"true"===a.getAttribute("aria-hidden"))&&(!!(f=a.assignedSlot?a.assignedSlot:a.parentNode)&&z.isVisible(f,b,!0))))};var E=["checkbox","img","radio","range","slider","spinbutton","textbox"];z.isVisualContent=function(a){var b=a.getAttribute("role");if(b)return-1!==E.indexOf(b);switch(a.tagName.toUpperCase()){case"IMG":case"IFRAME":case"OBJECT":case"VIDEO":case"AUDIO":case"CANVAS":case"SVG":case"MATH":case"BUTTON":case"SELECT":case"TEXTAREA":case"KEYGEN":case"PROGRESS":case"METER":return!0;case"INPUT":return"hidden"!==a.type;default:return!1}},
+z.visuallyContains=function(a,b){var c=a.getBoundingClientRect(),d={top:c.top+.01,bottom:c.bottom-.01,left:c.left+.01,right:c.right-.01},e=b.getBoundingClientRect(),f=e.top,g=e.left,h={top:f-b.scrollTop,bottom:f-b.scrollTop+b.scrollHeight,left:g-b.scrollLeft,right:g-b.scrollLeft+b.scrollWidth},i=window.getComputedStyle(b);return"inline"===i.getPropertyValue("display")||!(d.left<h.left&&d.left<e.left||d.top<h.top&&d.top<e.top||d.right>h.right&&d.right>e.right||d.bottom>h.bottom&&d.bottom>e.bottom)&&(!(d.right>e.right||d.bottom>e.bottom)||("scroll"===i.overflow||"auto"===i.overflow||"hidden"===i.overflow||b instanceof HTMLBodyElement||b instanceof HTMLHtmlElement))},z.visuallyOverlaps=function(a,b){var c=b.getBoundingClientRect(),d=c.top,e=c.left,f={top:d-b.scrollTop,bottom:d-b.scrollTop+b.scrollHeight,left:e-b.scrollLeft,right:e-b.scrollLeft+b.scrollWidth};if(a.left>f.right&&a.left>c.right||a.top>f.bottom&&a.top>c.bottom||a.right<f.left&&a.right<c.left||a.bottom<f.top&&a.bottom<c.top)return!1;var g=window.getComputedStyle(b);return!(a.left>c.right||a.top>c.bottom)||("scroll"===g.overflow||"auto"===g.overflow||b instanceof HTMLBodyElement||b instanceof HTMLHtmlElement)},A.getAllCells=function(a){var b,c,d,e,f=[];for(b=0,d=a.rows.length;b<d;b++)for(c=0,e=a.rows[b].cells.length;c<e;c++)f.push(a.rows[b].cells[c]);return f},A.getCellPosition=function(a,b){var c,d;for(b||(b=A.toGrid(z.findUp(a,"table"))),c=0;c<b.length;c++)if(b[c]&&-1!==(d=b[c].indexOf(a)))return{x:d,y:c}},A.getHeaders=function(a){if(a.hasAttribute("headers"))return commons.dom.idrefs(a,"headers");var b=commons.table.toGrid(commons.dom.findUp(a,"table")),c=commons.table.getCellPosition(a,b);return[].concat(A.traverse("left",c,b).filter(function(a){return A.isRowHeader(a)}),A.traverse("up",c,b).filter(function(a){return A.isColumnHeader(a)})).reverse()},A.getScope=function(a){var b=a.getAttribute("scope"),c=a.getAttribute("role");if(a instanceof Element==!1||-1===["TD","TH"].indexOf(a.nodeName.toUpperCase()))throw new TypeError("Expected TD or TH element");if("columnheader"===c)return"col";if("rowheader"===c)return"row";if("col"===b||"row"===b)return b;if("TH"!==a.nodeName.toUpperCase())return!1;var d=A.toGrid(z.findUp(a,"table")),e=A.getCellPosition(a);return d[e.y].reduce(function(a,b){return a&&"TH"===b.nodeName.toUpperCase()},!0)?"col":d.map(function(a){return a[e.x]}).reduce(function(a,b){return a&&"TH"===b.nodeName.toUpperCase()},!0)?"row":"auto"},A.isColumnHeader=function(a){return-1!==["col","auto"].indexOf(A.getScope(a))},A.isDataCell=function(a){return!(!a.children.length&&!a.textContent.trim())&&"TD"===a.nodeName.toUpperCase()},A.isDataTable=function(a){var b=a.getAttribute("role");if(("presentation"===b||"none"===b)&&!z.isFocusable(a))return!1;if("true"===a.getAttribute("contenteditable")||z.findUp(a,'[contenteditable="true"]'))return!0;if("grid"===b||"treegrid"===b||"table"===b)return!0;if("landmark"===commons.aria.getRoleType(b))return!0;if("0"===a.getAttribute("datatable"))return!1;if(a.getAttribute("summary"))return!0;if(a.tHead||a.tFoot||a.caption)return!0;for(var c=0,d=a.children.length;c<d;c++)if("COLGROUP"===a.children[c].nodeName.toUpperCase())return!0;for(var e,f,g=0,h=a.rows.length,i=!1,j=0;j<h;j++){e=a.rows[j];for(var k=0,l=e.cells.length;k<l;k++){if(f=e.cells[k],"TH"===f.nodeName.toUpperCase())return!0;if(i||f.offsetWidth===f.clientWidth&&f.offsetHeight===f.clientHeight||(i=!0),f.getAttribute("scope")||f.getAttribute("headers")||f.getAttribute("abbr"))return!0;if(-1!==["columnheader","rowheader"].indexOf(f.getAttribute("role")))return!0;if(1===f.children.length&&"ABBR"===f.children[0].nodeName.toUpperCase())return!0;g++}}if(a.getElementsByTagName("table").length)return!1;if(h<2)return!1;var m=a.rows[Math.ceil(h/2)];if(1===m.cells.length&&1===m.cells[0].colSpan)return!1;if(m.cells.length>=5)return!0;if(i)return!0;var n,o;for(j=0;j<h;j++){if(e=a.rows[j],n&&n!==window.getComputedStyle(e).getPropertyValue("background-color"))return!0;if(n=window.getComputedStyle(e).getPropertyValue("background-color"),o&&o!==window.getComputedStyle(e).getPropertyValue("background-image"))return!0;o=window.getComputedStyle(e).getPropertyValue("background-image")}return h>=20||!(z.getElementCoordinates(a).width>.95*z.getViewportSize(window).width)&&(!(g<10)&&!a.querySelector("object, embed, iframe, applet"))},A.isHeader=function(a){return!(!A.isColumnHeader(a)&&!A.isRowHeader(a))||!!a.id&&!!document.querySelector('[headers~="'+axe.utils.escapeSelector(a.id)+'"]')},A.isRowHeader=function(a){return-1!==["row","auto"].indexOf(A.getScope(a))},A.toGrid=function(a){for(var b=[],c=a.rows,d=0,e=c.length;d<e;d++){var f=c[d].cells;b[d]=b[d]||[];for(var g=0,h=0,i=f.length;h<i;h++)for(var j=0;j<f[h].colSpan;j++){for(var k=0;k<f[h].rowSpan;k++){for(b[d+k]=b[d+k]||[];b[d+k][g];)g++;b[d+k][g]=f[h]}g++}}return b},A.toArray=A.toGrid,function(a){var b=function a(b,c,d,e){var f,g=d[c.y]?d[c.y][c.x]:void 0;return g?"function"==typeof e&&!0===(f=e(g,c,d))?[g]:(f=a(b,{x:c.x+b.x,y:c.y+b.y},d,e),f.unshift(g),f):[]};a.traverse=function(a,c,d,e){if(Array.isArray(c)&&(e=d,d=c,c={x:0,y:0}),"string"==typeof a)switch(a){case"left":a={x:-1,y:0};break;case"up":a={x:0,y:-1};break;case"right":a={x:1,y:0};break;case"down":a={x:0,y:1}}return b(a,{x:c.x+a.x,y:c.y+a.y},d,e)}}(A);var F={submit:"Submit",reset:"Reset"},G=["text","search","tel","url","email","date","time","number","range","color"],H=["A","EM","STRONG","SMALL","MARK","ABBR","DFN","I","B","S","U","CODE","VAR","SAMP","KBD","SUP","SUB","Q","CITE","SPAN","BDO","BDI","BR","WBR","INS","DEL","IMG","EMBED","OBJECT","IFRAME","MAP","AREA","SCRIPT","NOSCRIPT","RUBY","VIDEO","AUDIO","INPUT","TEXTAREA","SELECT","BUTTON","LABEL","OUTPUT","DATALIST","KEYGEN","PROGRESS","COMMAND","CANVAS","TIME","METER"];B.accessibleText=function(a,b){function c(a,b,c){for(var d,e=a.childNodes,g="",h=0;h<e.length;h++)d=e[h],3===d.nodeType?g+=d.textContent:1===d.nodeType&&(-1===H.indexOf(d.nodeName.toUpperCase())&&(g+=" "),g+=f(e[h],b,c));return g}function d(a,b,d){var e="",g=a.nodeName.toUpperCase();if(p(a)&&(e=c(a,!1,!1)||"",v(e)))return e;if("FIGURE"===g&&(e=s(a,"figcaption"),v(e)))return e;if("TABLE"===g){if(e=s(a,"caption"),v(e))return e;if(e=a.getAttribute("title")||a.getAttribute("summary")||"",v(e))return e}if(u(a))return a.getAttribute("alt")||"";if(o(a)&&!d){if(n(a))return a.value||a.title||F[a.type]||"";var h=m(a);if(h)return f(h,b,!0)}return""}function e(a,b,c){return!b&&a.hasAttribute("aria-labelledby")?B.sanitize(z.idrefs(a,"aria-labelledby").map(function(b){return a===b&&g.pop(),f(b,!0,a!==b)}).join(" ")):c&&t(a)||!a.hasAttribute("aria-label")?"":B.sanitize(a.getAttribute("aria-label"))}var f,g=[];return f=function(a,b,f){"use strict";var h;if(null===a||-1!==g.indexOf(a))return"";if(!b&&!z.isVisible(a,!0))return"";g.push(a);var i=a.getAttribute("role");return h=e(a,b,f),v(h)?h:(h=d(a,b,f),v(h)?h:f&&(h=r(a),v(h))?h:q(a)||i&&-1===w.getRolesWithNameFromContents().indexOf(i)||(h=c(a,b,f),!v(h))?a.hasAttribute("title")?a.getAttribute("title"):"":h)},B.sanitize(f(a,b))},B.label=function(a){var b,c,d;return(c=w.label(a))?c:a.actualNode.id&&(d=axe.commons.dom.getRootNode(a.actualNode),b=d.querySelector('label[for="'+axe.utils.escapeSelector(a.actualNode.id)+'"]'),b=axe.utils.getNodeFromTree(axe._tree[0],b),c=b&&B.visible(b,!0))?c:(b=z.findUp(a.actualNode,"label"),b=axe.utils.getNodeFromTree(axe._tree[0],b),(c=b&&B.visible(b,!0))||null)},B.sanitize=function(a){"use strict";return a.replace(/\r\n/g,"\n").replace(/\u00A0/g," ").replace(/[\s]{2,}/g," ").trim()},B.visible=function(a,b,c){"use strict";var d,e,f,g=a.children,h=g.length,i="";for(d=0;d<h;d++)e=g[d],3===e.actualNode.nodeType?(f=e.actualNode.nodeValue)&&z.isVisible(a.actualNode,b)&&(i+=f):c||(i+=B.visible(e,b));return B.sanitize(i)},axe.utils.toArray=function(a){"use strict";return Array.prototype.slice.call(a)},axe.utils.tokenList=function(a){"use strict";return a.trim().replace(/\s{2,}/g," ").split(" ")}
+;var I=["aa","ab","ae","af","ak","am","an","ar","as","av","ay","az","ba","be","bg","bh","bi","bm","bn","bo","br","bs","ca","ce","ch","co","cr","cs","cu","cv","cy","da","de","dv","dz","ee","el","en","eo","es","et","eu","fa","ff","fi","fj","fo","fr","fy","ga","gd","gl","gn","gu","gv","ha","he","hi","ho","hr","ht","hu","hy","hz","ia","id","ie","ig","ii","ik","in","io","is","it","iu","iw","ja","ji","jv","jw","ka","kg","ki","kj","kk","kl","km","kn","ko","kr","ks","ku","kv","kw","ky","la","lb","lg","li","ln","lo","lt","lu","lv","mg","mh","mi","mk","ml","mn","mo","mr","ms","mt","my","na","nb","nd","ne","ng","nl","nn","no","nr","nv","ny","oc","oj","om","or","os","pa","pi","pl","ps","pt","qu","rm","rn","ro","ru","rw","sa","sc","sd","se","sg","sh","si","sk","sl","sm","sn","so","sq","sr","ss","st","su","sv","sw","ta","te","tg","th","ti","tk","tl","tn","to","tr","ts","tt","tw","ty","ug","uk","ur","uz","ve","vi","vo","wa","wo","xh","yi","yo","za","zh","zu","aaa","aab","aac","aad","aae","aaf","aag","aah","aai","aak","aal","aam","aan","aao","aap","aaq","aas","aat","aau","aav","aaw","aax","aaz","aba","abb","abc","abd","abe","abf","abg","abh","abi","abj","abl","abm","abn","abo","abp","abq","abr","abs","abt","abu","abv","abw","abx","aby","abz","aca","acb","acd","ace","acf","ach","aci","ack","acl","acm","acn","acp","acq","acr","acs","act","acu","acv","acw","acx","acy","acz","ada","adb","add","ade","adf","adg","adh","adi","adj","adl","adn","ado","adp","adq","adr","ads","adt","adu","adw","adx","ady","adz","aea","aeb","aec","aed","aee","aek","ael","aem","aen","aeq","aer","aes","aeu","aew","aey","aez","afa","afb","afd","afe","afg","afh","afi","afk","afn","afo","afp","afs","aft","afu","afz","aga","agb","agc","agd","age","agf","agg","agh","agi","agj","agk","agl","agm","agn","ago","agp","agq","agr","ags","agt","agu","agv","agw","agx","agy","agz","aha","ahb","ahg","ahh","ahi","ahk","ahl","ahm","ahn","aho","ahp","ahr","ahs","aht","aia","aib","aic","aid","aie","aif","aig","aih","aii","aij","aik","ail","aim","ain","aio","aip","aiq","air","ais","ait","aiw","aix","aiy","aja","ajg","aji","ajn","ajp","ajt","aju","ajw","ajz","akb","akc","akd","ake","akf","akg","akh","aki","akj","akk","akl","akm","ako","akp","akq","akr","aks","akt","aku","akv","akw","akx","aky","akz","ala","alc","ald","ale","alf","alg","alh","ali","alj","alk","all","alm","aln","alo","alp","alq","alr","als","alt","alu","alv","alw","alx","aly","alz","ama","amb","amc","ame","amf","amg","ami","amj","amk","aml","amm","amn","amo","amp","amq","amr","ams","amt","amu","amv","amw","amx","amy","amz","ana","anb","anc","and","ane","anf","ang","anh","ani","anj","ank","anl","anm","ann","ano","anp","anq","anr","ans","ant","anu","anv","anw","anx","any","anz","aoa","aob","aoc","aod","aoe","aof","aog","aoh","aoi","aoj","aok","aol","aom","aon","aor","aos","aot","aou","aox","aoz","apa","apb","apc","apd","ape","apf","apg","aph","api","apj","apk","apl","apm","apn","apo","app","apq","apr","aps","apt","apu","apv","apw","apx","apy","apz","aqa","aqc","aqd","aqg","aql","aqm","aqn","aqp","aqr","aqt","aqz","arb","arc","ard","are","arh","ari","arj","ark","arl","arn","aro","arp","arq","arr","ars","art","aru","arv","arw","arx","ary","arz","asa","asb","asc","asd","ase","asf","asg","ash","asi","asj","ask","asl","asn","aso","asp","asq","asr","ass","ast","asu","asv","asw","asx","asy","asz","ata","atb","atc","atd","ate","atg","ath","ati","atj","atk","atl","atm","atn","ato","atp","atq","atr","ats","att","atu","atv","atw","atx","aty","atz","aua","aub","auc","aud","aue","auf","aug","auh","aui","auj","auk","aul","aum","aun","auo","aup","auq","aur","aus","aut","auu","auw","aux","auy","auz","avb","avd","avi","avk","avl","avm","avn","avo","avs","avt","avu","avv","awa","awb","awc","awd","awe","awg","awh","awi","awk","awm","awn","awo","awr","aws","awt","awu","awv","aww","awx","awy","axb","axe","axg","axk","axl","axm","axx","aya","ayb","ayc","ayd","aye","ayg","ayh","ayi","ayk","ayl","ayn","ayo","ayp","ayq","ayr","ays","ayt","ayu","ayx","ayy","ayz","aza","azb","azc","azd","azg","azj","azm","azn","azo","azt","azz","baa","bab","bac","bad","bae","baf","bag","bah","bai","baj","bal","ban","bao","bap","bar","bas","bat","bau","bav","baw","bax","bay","baz","bba","bbb","bbc","bbd","bbe","bbf","bbg","bbh","bbi","bbj","bbk","bbl","bbm","bbn","bbo","bbp","bbq","bbr","bbs","bbt","bbu","bbv","bbw","bbx","bby","bbz","bca","bcb","bcc","bcd","bce","bcf","bcg","bch","bci","bcj","bck","bcl","bcm","bcn","bco","bcp","bcq","bcr","bcs","bct","bcu","bcv","bcw","bcy","bcz","bda","bdb","bdc","bdd","bde","bdf","bdg","bdh","bdi","bdj","bdk","bdl","bdm","bdn","bdo","bdp","bdq","bdr","bds","bdt","bdu","bdv","bdw","bdx","bdy","bdz","bea","beb","bec","bed","bee","bef","beg","beh","bei","bej","bek","bem","beo","bep","beq","ber","bes","bet","beu","bev","bew","bex","bey","bez","bfa","bfb","bfc","bfd","bfe","bff","bfg","bfh","bfi","bfj","bfk","bfl","bfm","bfn","bfo","bfp","bfq","bfr","bfs","bft","bfu","bfw","bfx","bfy","bfz","bga","bgb","bgc","bgd","bge","bgf","bgg","bgi","bgj","bgk","bgl","bgm","bgn","bgo","bgp","bgq","bgr","bgs","bgt","bgu","bgv","bgw","bgx","bgy","bgz","bha","bhb","bhc","bhd","bhe","bhf","bhg","bhh","bhi","bhj","bhk","bhl","bhm","bhn","bho","bhp","bhq","bhr","bhs","bht","bhu","bhv","bhw","bhx","bhy","bhz","bia","bib","bic","bid","bie","bif","big","bij","bik","bil","bim","bin","bio","bip","biq","bir","bit","biu","biv","biw","bix","biy","biz","bja","bjb","bjc","bjd","bje","bjf","bjg","bjh","bji","bjj","bjk","bjl","bjm","bjn","bjo","bjp","bjq","bjr","bjs","bjt","bju","bjv","bjw","bjx","bjy","bjz","bka","bkb","bkc","bkd","bkf","bkg","bkh","bki","bkj","bkk","bkl","bkm","bkn","bko","bkp","bkq","bkr","bks","bkt","bku","bkv","bkw","bkx","bky","bkz","bla","blb","blc","bld","ble","blf","blg","blh","bli","blj","blk","bll","blm","bln","blo","blp","blq","blr","bls","blt","blv","blw","blx","bly","blz","bma","bmb","bmc","bmd","bme","bmf","bmg","bmh","bmi","bmj","bmk","bml","bmm","bmn","bmo","bmp","bmq","bmr","bms","bmt","bmu","bmv","bmw","bmx","bmy","bmz","bna","bnb","bnc","bnd","bne","bnf","bng","bni","bnj","bnk","bnl","bnm","bnn","bno","bnp","bnq","bnr","bns","bnt","bnu","bnv","bnw","bnx","bny","bnz","boa","bob","boe","bof","bog","boh","boi","boj","bok","bol","bom","bon","boo","bop","boq","bor","bot","bou","bov","bow","box","boy","boz","bpa","bpb","bpd","bpg","bph","bpi","bpj","bpk","bpl","bpm","bpn","bpo","bpp","bpq","bpr","bps","bpt","bpu","bpv","bpw","bpx","bpy","bpz","bqa","bqb","bqc","bqd","bqf","bqg","bqh","bqi","bqj","bqk","bql","bqm","bqn","bqo","bqp","bqq","bqr","bqs","bqt","bqu","bqv","bqw","bqx","bqy","bqz","bra","brb","brc","brd","brf","brg","brh","bri","brj","brk","brl","brm","brn","bro","brp","brq","brr","brs","brt","bru","brv","brw","brx","bry","brz","bsa","bsb","bsc","bse","bsf","bsg","bsh","bsi","bsj","bsk","bsl","bsm","bsn","bso","bsp","bsq","bsr","bss","bst","bsu","bsv","bsw","bsx","bsy","bta","btb","btc","btd","bte","btf","btg","bth","bti","btj","btk","btl","btm","btn","bto","btp","btq","btr","bts","btt","btu","btv","btw","btx","bty","btz","bua","bub","buc","bud","bue","buf","bug","buh","bui","buj","buk","bum","bun","buo","bup","buq","bus","but","buu","buv","buw","bux","buy","buz","bva","bvb","bvc","bvd","bve","bvf","bvg","bvh","bvi","bvj","bvk","bvl","bvm","bvn","bvo","bvp","bvq","bvr","bvt","bvu","bvv","bvw","bvx","bvy","bvz","bwa","bwb","bwc","bwd","bwe","bwf","bwg","bwh","bwi","bwj","bwk","bwl","bwm","bwn","bwo","bwp","bwq","bwr","bws","bwt","bwu","bww","bwx","bwy","bwz","bxa","bxb","bxc","bxd","bxe","bxf","bxg","bxh","bxi","bxj","bxk","bxl","bxm","bxn","bxo","bxp","bxq","bxr","bxs","bxu","bxv","bxw","bxx","bxz","bya","byb","byc","byd","bye","byf","byg","byh","byi","byj","byk","byl","bym","byn","byo","byp","byq","byr","bys","byt","byv","byw","byx","byy","byz","bza","bzb","bzc","bzd","bze","bzf","bzg","bzh","bzi","bzj","bzk","bzl","bzm","bzn","bzo","bzp","bzq","bzr","bzs","bzt","bzu","bzv","bzw","bzx","bzy","bzz","caa","cab","cac","cad","cae","caf","cag","cah","cai","caj","cak","cal","cam","can","cao","cap","caq","car","cas","cau","cav","caw","cax","cay","caz","cba","cbb","cbc","cbd","cbe","cbg","cbh","cbi","cbj","cbk","cbl","cbn","cbo","cbq","cbr","cbs","cbt","cbu","cbv","cbw","cby","cca","ccc","ccd","cce","ccg","cch","ccj","ccl","ccm","ccn","cco","ccp","ccq","ccr","ccs","cda","cdc","cdd","cde","cdf","cdg","cdh","cdi","cdj","cdm","cdn","cdo","cdr","cds","cdy","cdz","cea","ceb","ceg","cek","cel","cen","cet","cfa","cfd","cfg","cfm","cga","cgc","cgg","cgk","chb","chc","chd","chf","chg","chh","chj","chk","chl","chm","chn","cho","chp","chq","chr","cht","chw","chx","chy","chz","cia","cib","cic","cid","cie","cih","cik","cim","cin","cip","cir","ciw","ciy","cja","cje","cjh","cji","cjk","cjm","cjn","cjo","cjp","cjr","cjs","cjv","cjy","cka","ckb","ckh","ckl","ckn","cko","ckq","ckr","cks","ckt","cku","ckv","ckx","cky","ckz","cla","clc","cld","cle","clh","cli","clj","clk","cll","clm","clo","clt","clu","clw","cly","cma","cmc","cme","cmg","cmi","cmk","cml","cmm","cmn","cmo","cmr","cms","cmt","cna","cnb","cnc","cng","cnh","cni","cnk","cnl","cno","cns","cnt","cnu","cnw","cnx","coa","cob","coc","cod","coe","cof","cog","coh","coj","cok","col","com","con","coo","cop","coq","cot","cou","cov","cow","cox","coy","coz","cpa","cpb","cpc","cpe","cpf","cpg","cpi","cpn","cpo","cpp","cps","cpu","cpx","cpy","cqd","cqu","cra","crb","crc","crd","crf","crg","crh","cri","crj","crk","crl","crm","crn","cro","crp","crq","crr","crs","crt","crv","crw","crx","cry","crz","csa","csb","csc","csd","cse","csf","csg","csh","csi","csj","csk","csl","csm","csn","cso","csq","csr","css","cst","csu","csv","csw","csy","csz","cta","ctc","ctd","cte","ctg","cth","ctl","ctm","ctn","cto","ctp","cts","ctt","ctu","ctz","cua","cub","cuc","cug","cuh","cui","cuj","cuk","cul","cum","cuo","cup","cuq","cur","cus","cut","cuu","cuv","cuw","cux","cvg","cvn","cwa","cwb","cwd","cwe","cwg","cwt","cya","cyb","cyo","czh","czk","czn","czo","czt","daa","dac","dad","dae","daf","dag","dah","dai","daj","dak","dal","dam","dao","dap","daq","dar","das","dau","dav","daw","dax","day","daz","dba","dbb","dbd","dbe","dbf","dbg","dbi","dbj","dbl","dbm","dbn","dbo","dbp","dbq","dbr","dbt","dbu","dbv","dbw","dby","dcc","dcr","dda","ddd","dde","ddg","ddi","ddj","ddn","ddo","ddr","dds","ddw","dec","ded","dee","def","deg","deh","dei","dek","del","dem","den","dep","deq","der","des","dev","dez","dga","dgb","dgc","dgd","dge","dgg","dgh","dgi","dgk","dgl","dgn","dgo","dgr","dgs","dgt","dgu","dgw","dgx","dgz","dha","dhd","dhg","dhi","dhl","dhm","dhn","dho","dhr","dhs","dhu","dhv","dhw","dhx","dia","dib","dic","did","dif","dig","dih","dii","dij","dik","dil","dim","din","dio","dip","diq","dir","dis","dit","diu","diw","dix","diy","diz","dja","djb","djc","djd","dje","djf","dji","djj","djk","djl","djm","djn","djo","djr","dju","djw","dka","dkk","dkl","dkr","dks","dkx","dlg","dlk","dlm","dln","dma","dmb","dmc","dmd","dme","dmg","dmk","dml","dmm","dmn","dmo","dmr","dms","dmu","dmv","dmw","dmx","dmy","dna","dnd","dne","dng","dni","dnj","dnk","dnn","dnr","dnt","dnu","dnv","dnw","dny","doa","dob","doc","doe","dof","doh","doi","dok","dol","don","doo","dop","doq","dor","dos","dot","dov","dow","dox","doy","doz","dpp","dra","drb","drc","drd","dre","drg","drh","dri","drl","drn","dro","drq","drr","drs","drt","dru","drw","dry","dsb","dse","dsh","dsi","dsl","dsn","dso","dsq","dta","dtb","dtd","dth","dti","dtk","dtm","dtn","dto","dtp","dtr","dts","dtt","dtu","dty","dua","dub","duc","dud","due","duf","dug","duh","dui","duj","duk","dul","dum","dun","duo","dup","duq","dur","dus","duu","duv","duw","dux","duy","duz","dva","dwa","dwl","dwr","dws","dwu","dww","dwy","dya","dyb","dyd","dyg","dyi","dym","dyn","dyo","dyu","dyy","dza","dzd","dze","dzg","dzl","dzn","eaa","ebg","ebk","ebo","ebr","ebu","ecr","ecs","ecy","eee","efa","efe","efi","ega","egl","ego","egx","egy","ehu","eip","eit","eiv","eja","eka","ekc","eke","ekg","eki","ekk","ekl","ekm","eko","ekp","ekr","eky","ele","elh","eli","elk","elm","elo","elp","elu","elx","ema","emb","eme","emg","emi","emk","emm","emn","emo","emp","ems","emu","emw","emx","emy","ena","enb","enc","end","enf","enh","enl","enm","enn","eno","enq","enr","enu","env","enw","enx","eot","epi","era","erg","erh","eri","erk","ero","err","ers","ert","erw","ese","esg","esh","esi","esk","esl","esm","esn","eso","esq","ess","esu","esx","esy","etb","etc","eth","etn","eto","etr","ets","ett","etu","etx","etz","euq","eve","evh","evn","ewo","ext","eya","eyo","eza","eze","faa","fab","fad","faf","fag","fah","fai","faj","fak","fal","fam","fan","fap","far","fat","fau","fax","fay","faz","fbl","fcs","fer","ffi","ffm","fgr","fia","fie","fil","fip","fir","fit","fiu","fiw","fkk","fkv","fla","flh","fli","fll","fln","flr","fly","fmp","fmu","fnb","fng","fni","fod","foi","fom","fon","for","fos","fox","fpe","fqs","frc","frd","frk","frm","fro","frp","frq","frr","frs","frt","fse","fsl","fss","fub","fuc","fud","fue","fuf","fuh","fui","fuj","fum","fun","fuq","fur","fut","fuu","fuv","fuy","fvr","fwa","fwe","gaa","gab","gac","gad","gae","gaf","gag","gah","gai","gaj","gak","gal","gam","gan","gao","gap","gaq","gar","gas","gat","gau","gav","gaw","gax","gay","gaz","gba","gbb","gbc","gbd","gbe","gbf","gbg","gbh","gbi","gbj","gbk","gbl","gbm","gbn","gbo","gbp","gbq","gbr","gbs","gbu","gbv","gbw","gbx","gby","gbz","gcc","gcd","gce","gcf","gcl","gcn","gcr","gct","gda","gdb","gdc","gdd","gde","gdf","gdg","gdh","gdi","gdj","gdk","gdl","gdm","gdn","gdo","gdq","gdr","gds","gdt","gdu","gdx","gea","geb","gec","ged","geg","geh","gei","gej","gek","gel","gem","geq","ges","gev","gew","gex","gey","gez","gfk","gft","gfx","gga","ggb","ggd","gge","ggg","ggk","ggl","ggn","ggo","ggr","ggt","ggu","ggw","gha","ghc","ghe","ghh","ghk","ghl","ghn","gho","ghr","ghs","ght","gia","gib","gic","gid","gie","gig","gih","gil","gim","gin","gio","gip","giq","gir","gis","git","giu","giw","gix","giy","giz","gji","gjk","gjm","gjn","gjr","gju","gka","gke","gkn","gko","gkp","gku","glc","gld","glh","gli","glj","glk","gll","glo","glr","glu","glw","gly","gma","gmb","gmd","gme","gmg","gmh","gml","gmm","gmn","gmq","gmu","gmv","gmw","gmx","gmy","gmz","gna","gnb","gnc","gnd","gne","gng","gnh","gni","gnk","gnl","gnm","gnn","gno","gnq","gnr","gnt","gnu","gnw","gnz","goa","gob","goc","god","goe","gof","gog","goh","goi","goj","gok","gol","gom","gon","goo","gop","goq","gor","gos","got","gou","gow","gox","goy","goz","gpa","gpe","gpn","gqa","gqi","gqn","gqr","gqu","gra","grb","grc","grd","grg","grh","gri","grj","grk","grm","gro","grq","grr","grs","grt","gru","grv","grw","grx","gry","grz","gse","gsg","gsl","gsm","gsn","gso","gsp","gss","gsw","gta","gti","gtu","gua","gub","guc","gud","gue","guf","gug","guh","gui","guk","gul","gum","gun","guo","gup","guq","gur","gus","gut","guu","guv","guw","gux","guz","gva","gvc","gve","gvf","gvj","gvl","gvm","gvn","gvo","gvp","gvr","gvs","gvy","gwa","gwb","gwc","gwd","gwe","gwf","gwg","gwi","gwj","gwm","gwn","gwr","gwt","gwu","gww","gwx","gxx","gya","gyb","gyd","gye","gyf","gyg","gyi","gyl","gym","gyn","gyr","gyy","gza","gzi","gzn","haa","hab","hac","had","hae","haf","hag","hah","hai","haj","hak","hal","ham","han","hao","hap","haq","har","has","hav","haw","hax","hay","haz","hba","hbb","hbn","hbo","hbu","hca","hch","hdn","hds","hdy","hea","hed","heg","heh","hei","hem","hgm","hgw","hhi","hhr","hhy","hia","hib","hid","hif","hig","hih","hii","hij","hik","hil","him","hio","hir","hit","hiw","hix","hji","hka","hke","hkk","hks","hla","hlb","hld","hle","hlt","hlu","hma","hmb","hmc","hmd","hme","hmf","hmg","hmh","hmi","hmj","hmk","hml","hmm","hmn","hmp","hmq","hmr","hms","hmt","hmu","hmv","hmw","hmx","hmy","hmz","hna","hnd","hne","hnh","hni","hnj","hnn","hno","hns","hnu","hoa","hob","hoc","hod","hoe","hoh","hoi","hoj","hok","hol","hom","hoo","hop","hor","hos","hot","hov","how","hoy","hoz","hpo","hps","hra","hrc","hre","hrk","hrm","hro","hrp","hrr","hrt","hru","hrw","hrx","hrz","hsb","hsh","hsl","hsn","hss","hti","hto","hts","htu","htx","hub","huc","hud","hue","huf","hug","huh","hui","huj","huk","hul","hum","huo","hup","huq","hur","hus","hut","huu","huv","huw","hux","huy","huz","hvc","hve","hvk","hvn","hvv","hwa","hwc","hwo","hya","hyx","iai","ian","iap","iar","iba","ibb","ibd","ibe","ibg","ibh","ibi","ibl","ibm","ibn","ibr","ibu","iby","ica","ich","icl","icr","ida","idb","idc","idd","ide","idi","idr","ids","idt","idu","ifa","ifb","ife","iff","ifk","ifm","ifu","ify","igb","ige","igg","igl","igm","ign","igo","igs","igw","ihb","ihi","ihp","ihw","iin","iir","ijc","ije","ijj","ijn","ijo","ijs","ike","iki","ikk","ikl","iko","ikp","ikr","iks","ikt","ikv","ikw","ikx","ikz","ila","ilb","ilg","ili","ilk","ill","ilm","ilo","ilp","ils","ilu","ilv","ilw","ima","ime","imi","iml","imn","imo","imr","ims","imy","inb","inc","ine","ing","inh","inj","inl","inm","inn","ino","inp","ins","int","inz","ior","iou","iow","ipi","ipo","iqu","iqw","ira","ire","irh","iri","irk","irn","iro","irr","iru","irx","iry","isa","isc","isd","ise","isg","ish","isi","isk","ism","isn","iso","isr","ist","isu","itb","itc","itd","ite","iti","itk","itl","itm","ito","itr","its","itt","itv","itw","itx","ity","itz","ium","ivb","ivv","iwk","iwm","iwo","iws","ixc","ixl","iya","iyo","iyx","izh","izi","izr","izz","jaa","jab","jac","jad","jae","jaf","jah","jaj","jak","jal","jam","jan","jao","jaq","jar","jas","jat","jau","jax","jay","jaz","jbe","jbi","jbj","jbk","jbn","jbo","jbr","jbt","jbu","jbw","jcs","jct","jda","jdg","jdt","jeb","jee","jeg","jeh","jei","jek","jel","jen","jer","jet","jeu","jgb","jge","jgk","jgo","jhi","jhs","jia","jib","jic","jid","jie","jig","jih","jii","jil","jim","jio","jiq","jit","jiu","jiv","jiy","jje","jjr","jka","jkm","jko","jkp","jkr","jku","jle","jls","jma","jmb","jmc","jmd","jmi","jml","jmn","jmr","jms","jmw","jmx","jna","jnd","jng","jni","jnj","jnl","jns","job","jod","jog","jor","jos","jow","jpa","jpr","jpx","jqr","jra","jrb","jrr","jrt","jru","jsl","jua","jub","juc","jud","juh","jui","juk","jul","jum","jun","juo","jup","jur","jus","jut","juu","juw","juy","jvd","jvn","jwi","jya","jye","jyy","kaa","kab","kac","kad","kae","kaf","kag","kah","kai","kaj","kak","kam","kao","kap","kaq","kar","kav","kaw","kax","kay","kba","kbb","kbc","kbd","kbe","kbf","kbg","kbh","kbi","kbj","kbk","kbl","kbm","kbn","kbo","kbp","kbq","kbr","kbs","kbt","kbu","kbv","kbw","kbx","kby","kbz","kca","kcb","kcc","kcd","kce","kcf","kcg","kch","kci","kcj","kck","kcl","kcm","kcn","kco","kcp","kcq","kcr","kcs","kct","kcu","kcv","kcw","kcx","kcy","kcz","kda","kdc","kdd","kde","kdf","kdg","kdh","kdi","kdj","kdk","kdl","kdm","kdn","kdo","kdp","kdq","kdr","kdt","kdu","kdv","kdw","kdx","kdy","kdz","kea","keb","kec","ked","kee","kef","keg","keh","kei","kej","kek","kel","kem","ken","keo","kep","keq","ker","kes","ket","keu","kev","kew","kex","key","kez","kfa","kfb","kfc","kfd","kfe","kff","kfg","kfh","kfi","kfj","kfk","kfl","kfm","kfn","kfo","kfp","kfq","kfr","kfs","kft","kfu","kfv","kfw","kfx","kfy","kfz","kga","kgb","kgc","kgd","kge","kgf","kgg","kgh","kgi","kgj","kgk","kgl","kgm","kgn","kgo","kgp","kgq","kgr","kgs","kgt","kgu","kgv","kgw","kgx","kgy","kha","khb","khc","khd","khe","khf","khg","khh","khi","khj","khk","khl","khn","kho","khp","khq","khr","khs","kht","khu","khv","khw","khx","khy","khz","kia","kib","kic","kid","kie","kif","kig","kih","kii","kij","kil","kim","kio","kip","kiq","kis","kit","kiu","kiv","kiw","kix","kiy","kiz","kja","kjb","kjc","kjd","kje","kjf","kjg","kjh","kji","kjj","kjk","kjl","kjm","kjn","kjo","kjp","kjq","kjr","kjs","kjt","kju","kjv","kjx","kjy","kjz","kka","kkb","kkc","kkd","kke","kkf","kkg","kkh","kki","kkj","kkk","kkl","kkm","kkn","kko","kkp","kkq","kkr","kks","kkt","kku","kkv","kkw","kkx","kky","kkz","kla","klb","klc","kld","kle","klf","klg","klh","kli","klj","klk","kll","klm","kln","klo","klp","klq","klr","kls","klt","klu","klv","klw","klx","kly","klz","kma","kmb","kmc","kmd","kme","kmf","kmg","kmh","kmi","kmj","kmk","kml","kmm","kmn","kmo","kmp","kmq","kmr","kms","kmt","kmu","kmv","kmw","kmx","kmy","kmz","kna","knb","knc","knd","kne","knf","kng","kni","knj","knk","knl","knm","knn","kno","knp","knq","knr","kns","knt","knu","knv","knw","knx","kny","knz","koa","koc","kod","koe","kof","kog","koh","koi","koj","kok","kol","koo","kop","koq","kos","kot","kou","kov","kow","kox","koy","koz","kpa","kpb","kpc","kpd","kpe","kpf","kpg","kph","kpi","kpj","kpk","kpl","kpm","kpn","kpo","kpp","kpq","kpr","kps","kpt","kpu","kpv","kpw","kpx","kpy","kpz","kqa","kqb","kqc","kqd","kqe","kqf","kqg","kqh","kqi","kqj","kqk","kql","kqm","kqn","kqo","kqp","kqq","kqr","kqs","kqt","kqu","kqv","kqw","kqx","kqy","kqz","kra","krb","krc","krd","kre","krf","krh","kri","krj","krk","krl","krm","krn","kro","krp","krr","krs","krt","kru","krv","krw","krx","kry","krz","ksa","ksb","ksc","ksd","kse","ksf","ksg","ksh","ksi","ksj","ksk","ksl","ksm","ksn","kso","ksp","ksq","ksr","kss","kst","ksu","ksv","ksw","ksx","ksy","ksz","kta","ktb","ktc","ktd","kte","ktf","ktg","kth","kti","ktj","ktk","ktl","ktm","ktn","kto","ktp","ktq","ktr","kts","ktt","ktu","ktv","ktw","ktx","kty","ktz","kub","kuc","kud","kue","kuf","kug","kuh","kui","kuj","kuk","kul","kum","kun","kuo","kup","kuq","kus","kut","kuu","kuv","kuw","kux","kuy","kuz","kva","kvb","kvc","kvd","kve","kvf","kvg","kvh","kvi","kvj","kvk","kvl","kvm","kvn","kvo","kvp","kvq","kvr","kvs","kvt","kvu","kvv","kvw","kvx","kvy","kvz","kwa","kwb","kwc","kwd","kwe","kwf","kwg","kwh","kwi","kwj","kwk","kwl","kwm","kwn","kwo","kwp","kwq","kwr","kws","kwt","kwu","kwv","kww","kwx","kwy","kwz","kxa","kxb","kxc","kxd","kxe","kxf","kxh","kxi","kxj","kxk","kxl","kxm","kxn","kxo","kxp","kxq","kxr","kxs","kxt","kxu","kxv","kxw","kxx","kxy","kxz","kya","kyb","kyc","kyd","kye","kyf","kyg","kyh","kyi","kyj","kyk","kyl","kym","kyn","kyo","kyp","kyq","kyr","kys","kyt","kyu","kyv","kyw","kyx","kyy","kyz","kza","kzb","kzc","kzd","kze","kzf","kzg","kzh","kzi","kzj","kzk","kzl","kzm","kzn","kzo","kzp","kzq","kzr","kzs","kzt","kzu","kzv","kzw","kzx","kzy","kzz","laa","lab","lac","lad","lae","laf","lag","lah","lai","laj","lak","lal","lam","lan","lap","laq","lar","las","lau","law","lax","lay","laz","lba","lbb","lbc","lbe","lbf","lbg","lbi","lbj","lbk","lbl","lbm","lbn","lbo","lbq","lbr","lbs","lbt","lbu","lbv","lbw","lbx","lby","lbz","lcc","lcd","lce","lcf","lch","lcl","lcm","lcp","lcq","lcs","lda","ldb","ldd","ldg","ldh","ldi","ldj","ldk","ldl","ldm","ldn","ldo","ldp","ldq","lea","leb","lec","led","lee","lef","leg","leh","lei","lej","lek","lel","lem","len","leo","lep","leq","ler","les","let","leu","lev","lew","lex","ley","lez","lfa","lfn","lga","lgb","lgg","lgh","lgi","lgk","lgl","lgm","lgn","lgq","lgr","lgt","lgu","lgz","lha","lhh","lhi","lhl","lhm","lhn","lhp","lhs","lht","lhu","lia","lib","lic","lid","lie","lif","lig","lih","lii","lij","lik","lil","lio","lip","liq","lir","lis","liu","liv","liw","lix","liy","liz","lja","lje","lji","ljl","ljp","ljw","ljx","lka","lkb","lkc","lkd","lke","lkh","lki","lkj","lkl","lkm","lkn","lko","lkr","lks","lkt","lku","lky","lla","llb","llc","lld","lle","llf","llg","llh","lli","llj","llk","lll","llm","lln","llo","llp","llq","lls","llu","llx","lma","lmb","lmc","lmd","lme","lmf","lmg","lmh","lmi","lmj","lmk","lml","lmm","lmn","lmo","lmp","lmq","lmr","lmu","lmv","lmw","lmx","lmy","lmz","lna","lnb","lnd","lng","lnh","lni","lnj","lnl","lnm","lnn","lno","lns","lnu","lnw","lnz","loa","lob","loc","loe","lof","log","loh","loi","loj","lok","lol","lom","lon","loo","lop","loq","lor","los","lot","lou","lov","low","lox","loy","loz","lpa","lpe","lpn","lpo","lpx","lra","lrc","lre","lrg","lri","lrk","lrl","lrm","lrn","lro","lrr","lrt","lrv","lrz","lsa","lsd","lse","lsg","lsh","lsi","lsl","lsm","lso","lsp","lsr","lss","lst","lsy","ltc","ltg","lth","lti","ltn","lto","lts","ltu","lua","luc","lud","lue","luf","lui","luj","luk","lul","lum","lun","luo","lup","luq","lur","lus","lut","luu","luv","luw","luy","luz","lva","lvk","lvs","lvu","lwa","lwe","lwg","lwh","lwl","lwm","lwo","lwt","lwu","lww","lya","lyg","lyn","lzh","lzl","lzn","lzz","maa","mab","mad","mae","maf","mag","mai","maj","mak","mam","man","map","maq","mas","mat","mau","mav","maw","max","maz","mba","mbb","mbc","mbd","mbe","mbf","mbh","mbi","mbj","mbk","mbl","mbm","mbn","mbo","mbp","mbq","mbr","mbs","mbt","mbu","mbv","mbw","mbx","mby","mbz","mca","mcb","mcc","mcd","mce","mcf","mcg","mch","mci","mcj","mck","mcl","mcm","mcn","mco","mcp","mcq","mcr","mcs","mct","mcu","mcv","mcw","mcx","mcy","mcz","mda","mdb","mdc","mdd","mde","mdf","mdg","mdh","mdi","mdj","mdk","mdl","mdm","mdn","mdp","mdq","mdr","mds","mdt","mdu","mdv","mdw","mdx","mdy","mdz","mea","meb","mec","med","mee","mef","meg","meh","mei","mej","mek","mel","mem","men","meo","mep","meq","mer","mes","met","meu","mev","mew","mey","mez","mfa","mfb","mfc","mfd","mfe","mff","mfg","mfh","mfi","mfj","mfk","mfl","mfm","mfn","mfo","mfp","mfq","mfr","mfs","mft","mfu","mfv","mfw","mfx","mfy","mfz","mga","mgb","mgc","mgd","mge","mgf","mgg","mgh","mgi","mgj","mgk","mgl","mgm","mgn","mgo","mgp","mgq","mgr","mgs","mgt","mgu","mgv","mgw","mgx","mgy","mgz","mha","mhb","mhc","mhd","mhe","mhf","mhg","mhh","mhi","mhj","mhk","mhl","mhm","mhn","mho","mhp","mhq","mhr","mhs","mht","mhu","mhw","mhx","mhy","mhz","mia","mib","mic","mid","mie","mif","mig","mih","mii","mij","mik","mil","mim","min","mio","mip","miq","mir","mis","mit","miu","miw","mix","miy","miz","mja","mjb","mjc","mjd","mje","mjg","mjh","mji","mjj","mjk","mjl","mjm","mjn","mjo","mjp","mjq","mjr","mjs","mjt","mju","mjv","mjw","mjx","mjy","mjz","mka","mkb","mkc","mke","mkf","mkg","mkh","mki","mkj","mkk","mkl","mkm","mkn","mko","mkp","mkq","mkr","mks","mkt","mku","mkv","mkw","mkx","mky","mkz","mla","mlb","mlc","mld","mle","mlf","mlh","mli","mlj","mlk","mll","mlm","mln","mlo","mlp","mlq","mlr","mls","mlu","mlv","mlw","mlx","mlz","mma","mmb","mmc","mmd","mme","mmf","mmg","mmh","mmi","mmj","mmk","mml","mmm","mmn","mmo","mmp","mmq","mmr","mmt","mmu","mmv","mmw","mmx","mmy","mmz","mna","mnb","mnc","mnd","mne","mnf","mng","mnh","mni","mnj","mnk","mnl","mnm","mnn","mno","mnp","mnq","mnr","mns","mnt","mnu","mnv","mnw","mnx","mny","mnz","moa","moc","mod","moe","mof","mog","moh","moi","moj","mok","mom","moo","mop","moq","mor","mos","mot","mou","mov","mow","mox","moy","moz","mpa","mpb","mpc","mpd","mpe","mpg","mph","mpi","mpj","mpk","mpl","mpm","mpn","mpo","mpp","mpq","mpr","mps","mpt","mpu","mpv","mpw","mpx","mpy","mpz","mqa","mqb","mqc","mqe","mqf","mqg","mqh","mqi","mqj","mqk","mql","mqm","mqn","mqo","mqp","mqq","mqr","mqs","mqt","mqu","mqv","mqw","mqx","mqy","mqz","mra","mrb","mrc","mrd","mre","mrf","mrg","mrh","mrj","mrk","mrl","mrm","mrn","mro","mrp","mrq","mrr","mrs","mrt","mru","mrv","mrw","mrx","mry","mrz","msb","msc","msd","mse","msf","msg","msh","msi","msj","msk","msl","msm","msn","mso","msp","msq","msr","mss","mst","msu","msv","msw","msx","msy","msz","mta","mtb","mtc","mtd","mte","mtf","mtg","mth","mti","mtj","mtk","mtl","mtm","mtn","mto","mtp","mtq","mtr","mts","mtt","mtu","mtv","mtw","mtx","mty","mua","mub","muc","mud","mue","mug","muh","mui","muj","muk","mul","mum","mun","muo","mup","muq","mur","mus","mut","muu","muv","mux","muy","muz","mva","mvb","mvd","mve","mvf","mvg","mvh","mvi","mvk","mvl","mvm","mvn","mvo","mvp","mvq","mvr","mvs","mvt","mvu","mvv","mvw","mvx","mvy","mvz","mwa","mwb","mwc","mwd","mwe","mwf","mwg","mwh","mwi","mwj","mwk","mwl","mwm","mwn","mwo","mwp","mwq","mwr","mws","mwt","mwu","mwv","mww","mwx","mwy","mwz","mxa","mxb","mxc","mxd","mxe","mxf","mxg","mxh","mxi","mxj","mxk","mxl","mxm","mxn","mxo","mxp","mxq","mxr","mxs","mxt","mxu","mxv","mxw","mxx","mxy","mxz","myb","myc","myd","mye","myf","myg","myh","myi","myj","myk","myl","mym","myn","myo","myp","myq","myr","mys","myt","myu","myv","myw","myx","myy","myz","mza","mzb","mzc","mzd","mze","mzg","mzh","mzi","mzj","mzk","mzl","mzm","mzn","mzo","mzp","mzq","mzr","mzs","mzt","mzu","mzv","mzw","mzx","mzy","mzz","naa","nab","nac","nad","nae","naf","nag","nah","nai","naj","nak","nal","nam","nan","nao","nap","naq","nar","nas","nat","naw","nax","nay","naz","nba","nbb","nbc","nbd","nbe","nbf","nbg","nbh","nbi","nbj","nbk","nbm","nbn","nbo","nbp","nbq","nbr","nbs","nbt","nbu","nbv","nbw","nbx","nby","nca","ncb","ncc","ncd","nce","ncf","ncg","nch","nci","ncj","nck","ncl","ncm","ncn","nco","ncp","ncq","ncr","ncs","nct","ncu","ncx","ncz","nda","ndb","ndc","ndd","ndf","ndg","ndh","ndi","ndj","ndk","ndl","ndm","ndn","ndp","ndq","ndr","nds","ndt","ndu","ndv","ndw","ndx","ndy","ndz","nea","neb","nec","ned","nee","nef","neg","neh","nei","nej","nek","nem","nen","neo","neq","ner","nes","net","neu","nev","new","nex","ney","nez","nfa","nfd","nfl","nfr","nfu","nga","ngb","ngc","ngd","nge","ngf","ngg","ngh","ngi","ngj","ngk","ngl","ngm","ngn","ngo","ngp","ngq","ngr","ngs","ngt","ngu","ngv","ngw","ngx","ngy","ngz","nha","nhb","nhc","nhd","nhe","nhf","nhg","nhh","nhi","nhk","nhm","nhn","nho","nhp","nhq","nhr","nht","nhu","nhv","nhw","nhx","nhy","nhz","nia","nib","nic","nid","nie","nif","nig","nih","nii","nij","nik","nil","nim","nin","nio","niq","nir","nis","nit","niu","niv","niw","nix","niy","niz","nja","njb","njd","njh","nji","njj","njl","njm","njn","njo","njr","njs","njt","nju","njx","njy","njz","nka","nkb","nkc","nkd","nke","nkf","nkg","nkh","nki","nkj","nkk","nkm","nkn","nko","nkp","nkq","nkr","nks","nkt","nku","nkv","nkw","nkx","nkz","nla","nlc","nle","nlg","nli","nlj","nlk","nll","nln","nlo","nlq","nlr","nlu","nlv","nlw","nlx","nly","nlz","nma","nmb","nmc","nmd","nme","nmf","nmg","nmh","nmi","nmj","nmk","nml","nmm","nmn","nmo","nmp","nmq","nmr","nms","nmt","nmu","nmv","nmw","nmx","nmy","nmz","nna","nnb","nnc","nnd","nne","nnf","nng","nnh","nni","nnj","nnk","nnl","nnm","nnn","nnp","nnq","nnr","nns","nnt","nnu","nnv","nnw","nnx","nny","nnz","noa","noc","nod","noe","nof","nog","noh","noi","noj","nok","nol","nom","non","noo","nop","noq","nos","not","nou","nov","now","noy","noz","npa","npb","npg","nph","npi","npl","npn","npo","nps","npu","npx","npy","nqg","nqk","nql","nqm","nqn","nqo","nqq","nqy","nra","nrb","nrc","nre","nrf","nrg","nri","nrk","nrl","nrm","nrn","nrp","nrr","nrt","nru","nrx","nrz","nsa","nsc","nsd","nse","nsf","nsg","nsh","nsi","nsk","nsl","nsm","nsn","nso","nsp","nsq","nsr","nss","nst","nsu","nsv","nsw","nsx","nsy","nsz","ntd","nte","ntg","nti","ntj","ntk","ntm","nto","ntp","ntr","nts","ntu","ntw","ntx","nty","ntz","nua","nub","nuc","nud","nue","nuf","nug","nuh","nui","nuj","nuk","nul","num","nun","nuo","nup","nuq","nur","nus","nut","nuu","nuv","nuw","nux","nuy","nuz","nvh","nvm","nvo","nwa","nwb","nwc","nwe","nwg","nwi","nwm","nwo","nwr","nwx","nwy","nxa","nxd","nxe","nxg","nxi","nxk","nxl","nxm","nxn","nxo","nxq","nxr","nxu","nxx","nyb","nyc","nyd","nye","nyf","nyg","nyh","nyi","nyj","nyk","nyl","nym","nyn","nyo","nyp","nyq","nyr","nys","nyt","nyu","nyv","nyw","nyx","nyy","nza","nzb","nzi","nzk","nzm","nzs","nzu","nzy","nzz","oaa","oac","oar","oav","obi","obk","obl","obm","obo","obr","obt","obu","oca","och","oco","ocu","oda","odk","odt","odu","ofo","ofs","ofu","ogb","ogc","oge","ogg","ogo","ogu","oht","ohu","oia","oin","ojb","ojc","ojg","ojp","ojs","ojv","ojw","oka","okb","okd","oke","okg","okh","oki","okj","okk","okl","okm","okn","oko","okr","oks","oku","okv","okx","ola","old","ole","olk","olm","olo","olr","olt","olu","oma","omb","omc","ome","omg","omi","omk","oml","omn","omo","omp","omq","omr","omt","omu","omv","omw","omx","ona","onb","one","ong","oni","onj","onk","onn","ono","onp","onr","ons","ont","onu","onw","onx","ood","oog","oon","oor","oos","opa","opk","opm","opo","opt","opy","ora","orc","ore","org","orh","orn","oro","orr","ors","ort","oru","orv","orw","orx","ory","orz","osa","osc","osi","oso","osp","ost","osu","osx","ota","otb","otd","ote","oti","otk","otl","otm","otn","oto","otq","otr","ots","ott","otu","otw","otx","oty","otz","oua","oub","oue","oui","oum","oun","ovd","owi","owl","oyb","oyd","oym","oyy","ozm","paa","pab","pac","pad","pae","paf","pag","pah","pai","pak","pal","pam","pao","pap","paq","par","pas","pat","pau","pav","paw","pax","pay","paz","pbb","pbc","pbe","pbf","pbg","pbh","pbi","pbl","pbn","pbo","pbp","pbr","pbs","pbt","pbu","pbv","pby","pbz","pca","pcb","pcc","pcd","pce","pcf","pcg","pch","pci","pcj","pck","pcl","pcm","pcn","pcp","pcr","pcw","pda","pdc","pdi","pdn","pdo","pdt","pdu","pea","peb","ped","pee","pef","peg","peh","pei","pej","pek","pel","pem","peo","pep","peq","pes","pev","pex","pey","pez","pfa","pfe","pfl","pga","pgd","pgg","pgi","pgk","pgl","pgn","pgs","pgu","pgy","pgz","pha","phd","phg","phh","phi","phk","phl","phm","phn","pho","phq","phr","pht","phu","phv","phw","pia","pib","pic","pid","pie","pif","pig","pih","pii","pij","pil","pim","pin","pio","pip","pir","pis","pit","piu","piv","piw","pix","piy","piz","pjt","pka","pkb","pkc","pkg","pkh","pkn","pko","pkp","pkr","pks","pkt","pku","pla","plb","plc","pld","ple","plf","plg","plh","plj","plk","pll","pln","plo","plp","plq","plr","pls","plt","plu","plv","plw","ply","plz","pma","pmb","pmc","pmd","pme","pmf","pmh","pmi","pmj","pmk","pml","pmm","pmn","pmo","pmq","pmr","pms","pmt","pmu","pmw","pmx","pmy","pmz","pna","pnb","pnc","pne","png","pnh","pni","pnj","pnk","pnl","pnm","pnn","pno","pnp","pnq","pnr","pns","pnt","pnu","pnv","pnw","pnx","pny","pnz","poc","pod","poe","pof","pog","poh","poi","pok","pom","pon","poo","pop","poq","pos","pot","pov","pow","pox","poy","poz","ppa","ppe","ppi","ppk","ppl","ppm","ppn","ppo","ppp","ppq","ppr","pps","ppt","ppu","pqa","pqe","pqm","pqw","pra","prb","prc","prd","pre","prf","prg","prh","pri","prk","prl","prm","prn","pro","prp","prq","prr","prs","prt","pru","prw","prx","pry","prz","psa","psc","psd","pse","psg","psh","psi","psl","psm","psn","pso","psp","psq","psr","pss","pst","psu","psw","psy","pta","pth","pti","ptn","pto","ptp","ptq","ptr","ptt","ptu","ptv","ptw","pty","pua","pub","puc","pud","pue","puf","pug","pui","puj","puk","pum","puo","pup","puq","pur","put","puu","puw","pux","puy","puz","pwa","pwb","pwg","pwi","pwm","pwn","pwo","pwr","pww","pxm","pye","pym","pyn","pys","pyu","pyx","pyy","pzn","qaa..qtz","qua","qub","quc","qud","quf","qug","quh","qui","quk","qul","qum","qun","qup","quq","qur","qus","quv","quw","qux","quy","quz","qva","qvc","qve","qvh","qvi","qvj","qvl","qvm","qvn","qvo","qvp","qvs","qvw","qvy","qvz","qwa","qwc","qwe","qwh","qwm","qws","qwt","qxa","qxc","qxh","qxl","qxn","qxo","qxp","qxq","qxr","qxs","qxt","qxu","qxw","qya","qyp","raa","rab","rac","rad","raf","rag","rah","rai","raj","rak","ral","ram","ran","rao","rap","raq","rar","ras","rat","rau","rav","raw","rax","ray","raz","rbb","rbk","rbl","rbp","rcf","rdb","rea","reb","ree","reg","rei","rej","rel","rem","ren","rer","res","ret","rey","rga","rge","rgk","rgn","rgr","rgs","rgu","rhg","rhp","ria","rie","rif","ril","rim","rin","rir","rit","riu","rjg","rji","rjs","rka","rkb","rkh","rki","rkm","rkt","rkw","rma","rmb","rmc","rmd","rme","rmf","rmg","rmh","rmi","rmk","rml","rmm","rmn","rmo","rmp","rmq","rmr","rms","rmt","rmu","rmv","rmw","rmx","rmy","rmz","rna","rnd","rng","rnl","rnn","rnp","rnr","rnw","roa","rob","roc","rod","roe","rof","rog","rol","rom","roo","rop","ror","rou","row","rpn","rpt","rri","rro","rrt","rsb","rsi","rsl","rsm","rtc","rth","rtm","rts","rtw","rub","ruc","rue","ruf","rug","ruh","rui","ruk","ruo","rup","ruq","rut","ruu","ruy","ruz","rwa","rwk","rwm","rwo","rwr","rxd","rxw","ryn","rys","ryu","rzh","saa","sab","sac","sad","sae","saf","sah","sai","saj","sak","sal","sam","sao","sap","saq","sar","sas","sat","sau","sav","saw","sax","say","saz","sba","sbb","sbc","sbd","sbe","sbf","sbg","sbh","sbi","sbj","sbk","sbl","sbm","sbn","sbo","sbp","sbq","sbr","sbs","sbt","sbu","sbv","sbw","sbx","sby","sbz","sca","scb","sce","scf","scg","sch","sci","sck","scl","scn","sco","scp","scq","scs","sct","scu","scv","scw","scx","sda","sdb","sdc","sde","sdf","sdg","sdh","sdj","sdk","sdl","sdm","sdn","sdo","sdp","sdr","sds","sdt","sdu","sdv","sdx","sdz","sea","seb","sec","sed","see","sef","seg","seh","sei","sej","sek","sel","sem","sen","seo","sep","seq","ser","ses","set","seu","sev","sew","sey","sez","sfb","sfe","sfm","sfs","sfw","sga","sgb","sgc","sgd","sge","sgg","sgh","sgi","sgj","sgk","sgl","sgm","sgn","sgo","sgp","sgr","sgs","sgt","sgu","sgw","sgx","sgy","sgz","sha","shb","shc","shd","she","shg","shh","shi","shj","shk","shl","shm","shn","sho","shp","shq","shr","shs","sht","shu","shv","shw","shx","shy","shz","sia","sib","sid","sie","sif","sig","sih","sii","sij","sik","sil","sim","sio","sip","siq","sir","sis","sit","siu","siv","siw","six","siy","siz","sja","sjb","sjd","sje","sjg","sjk","sjl","sjm","sjn","sjo","sjp","sjr","sjs","sjt","sju","sjw","ska","skb","skc","skd","ske","skf","skg","skh","ski","skj","skk","skm","skn","sko","skp","skq","skr","sks","skt","sku","skv","skw","skx","sky","skz","sla","slc","sld","sle","slf","slg","slh","sli","slj","sll","slm","sln","slp","slq","slr","sls","slt","slu","slw","slx","sly","slz","sma","smb","smc","smd","smf","smg","smh","smi","smj","smk","sml","smm","smn","smp","smq","smr","sms","smt","smu","smv","smw","smx","smy","smz","snb","snc","sne","snf","sng","snh","sni","snj","snk","snl","snm","snn","sno","snp","snq","snr","sns","snu","snv","snw","snx","sny","snz","soa","sob","soc","sod","soe","sog","soh","soi","soj","sok","sol","son","soo","sop","soq","sor","sos","sou","sov","sow","sox","soy","soz","spb","spc","spd","spe","spg","spi","spk","spl","spm","spn","spo","spp","spq","spr","sps","spt","spu","spv","spx","spy","sqa","sqh","sqj","sqk","sqm","sqn","sqo","sqq","sqr","sqs","sqt","squ","sra","srb","src","sre","srf","srg","srh","sri","srk","srl","srm","srn","sro","srq","srr","srs","srt","sru","srv","srw","srx","sry","srz","ssa","ssb","ssc","ssd","sse","ssf","ssg","ssh","ssi","ssj","ssk","ssl","ssm","ssn","sso","ssp","ssq","ssr","sss","sst","ssu","ssv","ssx","ssy","ssz","sta","stb","std","ste","stf","stg","sth","sti","stj","stk","stl","stm","stn","sto","stp","stq","str","sts","stt","stu","stv","stw","sty","sua","sub","suc","sue","sug","sui","suj","suk","sul","sum","suq","sur","sus","sut","suv","suw","sux","suy","suz","sva","svb","svc","sve","svk","svm","svr","svs","svx","swb","swc","swf","swg","swh","swi","swj","swk","swl","swm","swn","swo","swp","swq","swr","sws","swt","swu","swv","sww","swx","swy","sxb","sxc","sxe","sxg","sxk","sxl","sxm","sxn","sxo","sxr","sxs","sxu","sxw","sya","syb","syc","syd","syi","syk","syl","sym","syn","syo","syr","sys","syw","syx","syy","sza","szb","szc","szd","sze","szg","szl","szn","szp","szs","szv","szw","taa","tab","tac","tad","tae","taf","tag","tai","taj","tak","tal","tan","tao","tap","taq","tar","tas","tau","tav","taw","tax","tay","taz","tba","tbb","tbc","tbd","tbe","tbf","tbg","tbh","tbi","tbj","tbk","tbl","tbm","tbn","tbo","tbp","tbq","tbr","tbs","tbt","tbu","tbv","tbw","tbx","tby","tbz","tca","tcb","tcc","tcd","tce","tcf","tcg","tch","tci","tck","tcl","tcm","tcn","tco","tcp","tcq","tcs","tct","tcu","tcw","tcx","tcy","tcz","tda","tdb","tdc","tdd","tde","tdf","tdg","tdh","tdi","tdj","tdk","tdl","tdm","tdn","tdo","tdq","tdr","tds","tdt","tdu","tdv","tdx","tdy","tea","teb","tec","ted","tee","tef","teg","teh","tei","tek","tem","ten","teo","tep","teq","ter","tes","tet","teu","tev","tew","tex","tey","tfi","tfn","tfo","tfr","tft","tga","tgb","tgc","tgd","tge","tgf","tgg","tgh","tgi","tgj","tgn","tgo","tgp","tgq","tgr","tgs","tgt","tgu","tgv","tgw","tgx","tgy","tgz","thc","thd","the","thf","thh","thi","thk","thl","thm","thn","thp","thq","thr","ths","tht","thu","thv","thw","thx","thy","thz","tia","tic","tid","tie","tif","tig","tih","tii","tij","tik","til","tim","tin","tio","tip","tiq","tis","tit","tiu","tiv","tiw","tix","tiy","tiz","tja","tjg","tji","tjl","tjm","tjn","tjo","tjs","tju","tjw","tka","tkb","tkd","tke","tkf","tkg","tkk","tkl","tkm","tkn","tkp","tkq","tkr","tks","tkt","tku","tkv","tkw","tkx","tkz","tla","tlb","tlc","tld","tlf","tlg","tlh","tli","tlj","tlk","tll","tlm","tln","tlo","tlp","tlq","tlr","tls","tlt","tlu","tlv","tlw","tlx","tly","tma","tmb","tmc","tmd","tme","tmf","tmg","tmh","tmi","tmj","tmk","tml","tmm","tmn","tmo","tmp","tmq","tmr","tms","tmt","tmu","tmv","tmw","tmy","tmz","tna","tnb","tnc","tnd","tne","tnf","tng","tnh","tni","tnk","tnl","tnm","tnn","tno","tnp","tnq","tnr","tns","tnt","tnu","tnv","tnw","tnx","tny","tnz","tob","toc","tod","toe","tof","tog","toh","toi","toj","tol","tom","too","top","toq","tor","tos","tou","tov","tow","tox","toy","toz","tpa","tpc","tpe","tpf","tpg","tpi","tpj","tpk","tpl","tpm","tpn","tpo","tpp","tpq","tpr","tpt","tpu","tpv","tpw","tpx","tpy","tpz","tqb","tql","tqm","tqn","tqo","tqp","tqq","tqr","tqt","tqu","tqw","tra","trb","trc","trd","tre","trf","trg","trh","tri","trj","trk","trl","trm","trn","tro","trp","trq","trr","trs","trt","tru","trv","trw","trx","try","trz","tsa","tsb","tsc","tsd","tse","tsf","tsg","tsh","tsi","tsj","tsk","tsl","tsm","tsp","tsq","tsr","tss","tst","tsu","tsv","tsw","tsx","tsy","tsz","tta","ttb","ttc","ttd","tte","ttf","ttg","tth","tti","ttj","ttk","ttl","ttm","ttn","tto","ttp","ttq","ttr","tts","ttt","ttu","ttv","ttw","tty","ttz","tua","tub","tuc","tud","tue","tuf","tug","tuh","tui","tuj","tul","tum","tun","tuo","tup","tuq","tus","tut","tuu","tuv","tuw","tux","tuy","tuz","tva","tvd","tve","tvk","tvl","tvm","tvn","tvo","tvs","tvt","tvu","tvw","tvy","twa","twb","twc","twd","twe","twf","twg","twh","twl","twm","twn","two","twp","twq","twr","twt","twu","tww","twx","twy","txa","txb","txc","txe","txg","txh","txi","txj","txm","txn","txo","txq","txr","txs","txt","txu","txx","txy","tya","tye","tyh","tyi","tyj","tyl","tyn","typ","tyr","tys","tyt","tyu","tyv","tyx","tyz","tza","tzh","tzj","tzl","tzm","tzn","tzo","tzx","uam","uan","uar","uba","ubi","ubl","ubr","ubu","uby","uda","ude","udg","udi","udj","udl","udm","udu","ues","ufi","uga","ugb","uge","ugn","ugo","ugy","uha","uhn","uis","uiv","uji","uka","ukg","ukh","ukk","ukl","ukp","ukq","uks","uku","ukw","uky","ula","ulb","ulc","ule","ulf","uli","ulk","ull","ulm","uln","ulu","ulw","uma","umb","umc","umd","umg","umi","umm","umn","umo","ump","umr","ums","umu","una","und","une","ung","unk","unm","unn","unp","unr","unu","unx","unz","uok","upi","upv","ura","urb","urc","ure","urf","urg","urh","uri","urj","urk","url","urm","urn","uro","urp","urr","urt","uru","urv","urw","urx","ury","urz","usa","ush","usi","usk","usp","usu","uta","ute","utp","utr","utu","uum","uun","uur","uuu","uve","uvh","uvl","uwa","uya","uzn","uzs","vaa","vae","vaf","vag","vah","vai","vaj","val","vam","van","vao","vap","var","vas","vau","vav","vay","vbb","vbk","vec","ved","vel","vem","veo","vep","ver","vgr","vgt","vic","vid","vif","vig","vil","vin","vis","vit","viv","vka","vki","vkj","vkk","vkl","vkm","vko","vkp","vkt","vku","vlp","vls","vma","vmb","vmc","vmd","vme","vmf","vmg","vmh","vmi","vmj","vmk","vml","vmm","vmp","vmq","vmr","vms","vmu","vmv","vmw","vmx","vmy","vmz","vnk","vnm","vnp","vor","vot","vra","vro","vrs","vrt","vsi","vsl","vsv","vto","vum","vun","vut","vwa","waa","wab","wac","wad","wae","waf","wag","wah","wai","waj","wak","wal","wam","wan","wao","wap","waq","war","was","wat","wau","wav","waw","wax","way","waz","wba","wbb","wbe","wbf","wbh","wbi","wbj","wbk","wbl","wbm","wbp","wbq","wbr","wbs","wbt","wbv","wbw","wca","wci","wdd","wdg","wdj","wdk","wdu","wdy","wea","wec","wed","weg","weh","wei","wem","wen","weo","wep","wer","wes","wet","weu","wew","wfg","wga","wgb","wgg","wgi","wgo","wgu","wgw","wgy","wha","whg","whk","whu","wib","wic","wie","wif","wig","wih","wii","wij","wik","wil","wim","win","wir","wit","wiu","wiv","wiw","wiy","wja","wji","wka","wkb","wkd","wkl","wku","wkw","wky","wla","wlc","wle","wlg","wli","wlk","wll","wlm","wlo","wlr","wls","wlu","wlv","wlw","wlx","wly","wma","wmb","wmc","wmd","wme","wmh","wmi","wmm","wmn","wmo","wms","wmt","wmw","wmx","wnb","wnc","wnd","wne","wng","wni","wnk","wnm","wnn","wno","wnp","wnu","wnw","wny","woa","wob","woc","wod","woe","wof","wog","woi","wok","wom","won","woo","wor","wos","wow","woy","wpc","wra","wrb","wrd","wrg","wrh","wri","wrk","wrl","wrm","wrn","wro","wrp","wrr","wrs","wru","wrv","wrw","wrx","wry","wrz","wsa","wsg","wsi","wsk","wsr","wss","wsu","wsv","wtf","wth","wti","wtk","wtm","wtw","wua","wub","wud","wuh","wul","wum","wun","wur","wut","wuu","wuv","wux","wuy","wwa","wwb","wwo","wwr","www","wxa","wxw","wya","wyb","wyi","wym","wyr","wyy","xaa","xab","xac","xad","xae","xag","xai","xaj","xak","xal","xam","xan","xao","xap","xaq","xar","xas","xat","xau","xav","xaw","xay","xba","xbb","xbc","xbd","xbe","xbg","xbi","xbj","xbm","xbn","xbo","xbp","xbr","xbw","xbx","xby","xcb","xcc","xce","xcg","xch","xcl","xcm","xcn","xco","xcr","xct","xcu","xcv","xcw","xcy","xda","xdc","xdk","xdm","xdo","xdy","xeb","xed","xeg","xel","xem","xep","xer","xes","xet","xeu","xfa","xga","xgb","xgd","xgf","xgg","xgi","xgl","xgm","xgn","xgr","xgu","xgw","xha","xhc","xhd","xhe","xhr","xht","xhu","xhv","xia","xib","xii","xil","xin","xip","xir","xis","xiv","xiy","xjb","xjt","xka","xkb","xkc","xkd","xke","xkf","xkg","xkh","xki","xkj","xkk","xkl","xkn","xko","xkp","xkq","xkr","xks","xkt","xku","xkv","xkw","xkx","xky","xkz","xla","xlb","xlc","xld","xle","xlg","xli","xln","xlo","xlp","xls","xlu","xly","xma","xmb","xmc","xmd","xme","xmf","xmg","xmh","xmj","xmk","xml","xmm","xmn","xmo","xmp","xmq","xmr","xms","xmt","xmu","xmv","xmw","xmx","xmy","xmz","xna","xnb","xnd","xng","xnh","xni","xnk","xnn","xno","xnr","xns","xnt","xnu","xny","xnz","xoc","xod","xog","xoi","xok","xom","xon","xoo","xop","xor","xow","xpa","xpc","xpe","xpg","xpi","xpj","xpk","xpm","xpn","xpo","xpp","xpq","xpr","xps","xpt","xpu","xpy","xqa","xqt","xra","xrb","xrd","xre","xrg","xri","xrm","xrn","xrq","xrr","xrt","xru","xrw","xsa","xsb","xsc","xsd","xse","xsh","xsi","xsj","xsl","xsm","xsn","xso","xsp","xsq","xsr","xss","xsu","xsv","xsy","xta","xtb","xtc","xtd","xte","xtg","xth","xti","xtj","xtl","xtm","xtn","xto","xtp","xtq","xtr","xts","xtt","xtu","xtv","xtw","xty","xtz","xua","xub","xud","xug","xuj","xul","xum","xun","xuo","xup","xur","xut","xuu","xve","xvi","xvn","xvo","xvs","xwa","xwc","xwd","xwe","xwg","xwj","xwk","xwl","xwo","xwr","xwt","xww","xxb","xxk","xxm","xxr","xxt","xya","xyb","xyj","xyk","xyl","xyt","xyy","xzh","xzm","xzp","yaa","yab","yac","yad","yae","yaf","yag","yah","yai","yaj","yak","yal","yam","yan","yao","yap","yaq","yar","yas","yat","yau","yav","yaw","yax","yay","yaz","yba","ybb","ybd","ybe","ybh","ybi","ybj","ybk","ybl","ybm","ybn","ybo","ybx","yby","ych","ycl","ycn","ycp","yda","ydd","yde","ydg","ydk","yds","yea","yec","yee","yei","yej","yel","yen","yer","yes","yet","yeu","yev","yey","yga","ygi","ygl","ygm","ygp","ygr","ygs","ygu","ygw","yha","yhd","yhl","yhs","yia","yif","yig","yih","yii","yij","yik","yil","yim","yin","yip","yiq","yir","yis","yit","yiu","yiv","yix","yiy","yiz","yka","ykg","yki","ykk","ykl","ykm","ykn","yko","ykr","ykt","yku","yky","yla","ylb","yle","ylg","yli","yll","ylm","yln","ylo","ylr","ylu","yly","yma","ymb","ymc","ymd","yme","ymg","ymh","ymi","ymk","yml","ymm","ymn","ymo","ymp","ymq","ymr","yms","ymt","ymx","ymz","yna","ynd","yne","yng","ynh","ynk","ynl","ynn","yno","ynq","yns","ynu","yob","yog","yoi","yok","yol","yom","yon","yos","yot","yox","yoy","ypa","ypb","ypg","yph","ypk","ypm","ypn","ypo","ypp","ypz","yra","yrb","yre","yri","yrk","yrl","yrm","yrn","yro","yrs","yrw","yry","ysc","ysd","ysg","ysl","ysn","yso","ysp","ysr","yss","ysy","yta","ytl","ytp","ytw","yty","yua","yub","yuc","yud","yue","yuf","yug","yui","yuj","yuk","yul","yum","yun","yup","yuq","yur","yut","yuu","yuw","yux","yuy","yuz","yva","yvt","ywa","ywg","ywl","ywn","ywq","ywr","ywt","ywu","yww","yxa","yxg","yxl","yxm","yxu","yxy","yyr","yyu","yyz","yzg","yzk","zaa","zab","zac","zad","zae","zaf","zag","zah","zai","zaj","zak","zal","zam","zao","zap","zaq","zar","zas","zat","zau","zav","zaw","zax","zay","zaz","zbc","zbe","zbl","zbt","zbw","zca","zch","zdj","zea","zeg","zeh","zen","zga","zgb","zgh","zgm","zgn","zgr","zhb","zhd","zhi","zhn","zhw","zhx","zia","zib","zik","zil","zim","zin","zir","ziw","ziz","zka","zkb","zkd","zkg","zkh","zkk","zkn","zko","zkp","zkr","zkt","zku","zkv","zkz","zle","zlj","zlm","zln","zlq","zls","zlw","zma","zmb","zmc","zmd","zme","zmf","zmg","zmh","zmi","zmj","zmk","zml","zmm","zmn","zmo","zmp","zmq","zmr","zms","zmt","zmu","zmv","zmw","zmx","zmy","zmz","zna","znd","zne","zng","znk","zns","zoc","zoh","zom","zoo","zoq","zor","zos","zpa","zpb","zpc","zpd","zpe","zpf","zpg","zph","zpi","zpj","zpk","zpl","zpm","zpn","zpo","zpp","zpq","zpr","zps","zpt","zpu","zpv","zpw","zpx","zpy","zpz","zqe","zra","zrg","zrn","zro","zrp","zrs","zsa","zsk","zsl","zsm","zsr","zsu","zte","ztg","ztl","ztm","ztn","ztp","ztq","zts","ztt","ztu","ztx","zty","zua","zuh","zum","zun","zuy","zwa","zxx","zyb","zyg","zyj","zyn","zyp","zza","zzj"]
+;return axe.utils.validLangs=function(){"use strict";return I},commons}()})}("object"==typeof window?window:this);
\ No newline at end of file
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 89cb5203..fc2f227 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -114,12 +114,13 @@
       'Chromium Linux32 Goma Canary (clobber)': 'release_bot_x86',
       'Chromium Mac 10.10 MacViews': 'mac_views_browser_release_bot',
       'Chromium Mac 10.11': 'release_bot',
-      'Chromium Mac 10.11 Force Mac Toolchain': 'release_bot_mac_hermetic',
+      'Chromium Mac 10.11 Force Mac Toolchain': 'release_bot_mac_new_sdk',
       'Chromium Mac 10.9 Goma Canary': 'release_bot',
       'Chromium Mac 10.9 Goma Canary (clobber)': 'release_bot',
       'Chromium Mac 10.9 Goma Canary (dbg)': 'debug_bot',
       'Chromium Mac 10.9 Goma Canary (dbg)(clobber)': 'debug_bot',
       'Chromium Mac Goma Canary LocalOutputCache': 'release_bot',
+      'Chromium Win 10 GCE Tests': 'release_bot_x86_minimal_symbols',
       'Chromium Win PGO Builder': {
         '1': 'official_optimize_chrome_pgo_phase_1_x86',
         '2': 'official_optimize_chrome_pgo_phase_2_x86',
@@ -1432,8 +1433,8 @@
       'release_bot', 'chrome_with_codecs',
     ],
 
-    'release_bot_mac_hermetic': [
-      'release_bot', 'mac_hermetic_toolchain',
+    'release_bot_mac_new_sdk': [
+      'release_bot', 'mac_new_sdk',
     ],
 
     'release_bot_mac_strip': [
@@ -1775,8 +1776,8 @@
       'mixins': ['chrome_with_codecs'],
     },
 
-    'mac_hermetic_toolchain': {
-      'gn_args': 'use_system_xcode=false',
+    'mac_new_sdk': {
+      'gn_args': 'mac_sdk_min=10.12',
     },
 
     'headless': {
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index b732eff..692bb60 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -18061,6 +18061,15 @@
   <int value="1" label="Google CAPTCHA solved"/>
 </enum>
 
+<enum name="GoogleFaviconServerRequestStatus">
+  <int value="0" label="Success"/>
+  <int value="1" label="Failure (connection error, no HTTP response)"/>
+  <int value="2" label="Failure (HTTP error)"/>
+  <int value="3" label="Failure (previous HTTP error cached)"/>
+  <int value="4" label="Failure (on write to database)"/>
+  <int value="5" label="Failure (invalid request)"/>
+</enum>
+
 <enum name="GoogleNowCardTypeId">
   <summary>
     Represents a card type ID. See cardTypeId in
@@ -22721,6 +22730,7 @@
   <int value="-867087281" label="enable-virtual-keyboard"/>
   <int value="-866993841" label="OfflinePagesCTV2:disabled"/>
   <int value="-864266073" label="cros-regions-mode"/>
+  <int value="-864234985" label="UseDdljsonApi:enabled"/>
   <int value="-864205629" label="enable-offline-load-stale-cache"/>
   <int value="-861678473" label="disable-offer-upload-credit-cards"/>
   <int value="-861343291" label="ChromeHome:disabled"/>
@@ -22858,6 +22868,7 @@
   <int value="-353182790" label="ConsistentOmniboxGeolocation:disabled"/>
   <int value="-351552989" label="disable-hosted-apps-in-windows"/>
   <int value="-351127770" label="enable-offline-pages-as-bookmarks"/>
+  <int value="-349437334" label="UseDdljsonApi:disabled"/>
   <int value="-349057743" label="extensions-on-chrome-urls"/>
   <int value="-345838366" label="enable-hosted-apps-in-windows"/>
   <int value="-345324571" label="enable-quirks-client"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 40eaa90..b29ad08 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -22761,6 +22761,9 @@
 
 <histogram name="GCM.DataMessageReceivedHasRegisteredApp"
     enum="BooleanRegistered">
+  <obsolete>
+    No longer used starting with Chrome 61 as the check was removed.
+  </obsolete>
   <owner>peter@chromium.org</owner>
   <summary>
     Records whether a matching registration was found for each received
@@ -45257,15 +45260,49 @@
 </histogram>
 
 <histogram base="true"
+    name="NewTabPage.ContentSuggestions.TimeUntilFirstShownTrigger" units="ms">
+  <owner>jkrcal@chromium.org</owner>
+  <summary>
+    Android: The time since the last fetch, recorded upon the first on-shown
+    fetch trigger. The first on-shown trigger does not necessarily cause a fetch
+    (if it comes before the end of the respective scheduling interval). This
+    metric is recorded at most once after each fetch (and additionaly at most
+    once after each startup of Chrome before the next fetch). This is used to
+    understand how changing scheduling intervals will impact traffic of
+    background fetches.
+  </summary>
+</histogram>
+
+<histogram base="true"
     name="NewTabPage.ContentSuggestions.TimeUntilFirstSoftTrigger" units="ms">
+  <obsolete>
+    Deprecated as of July 2017, in favor of
+    NewTabPage.ContentSuggestions.TimeUntilFirstShownTrigger and
+    NewTabPage.ContentSuggestions.TimeUntilFirstStartupTrigger.
+  </obsolete>
   <owner>jkrcal@chromium.org</owner>
   <summary>
     Android: The time since the last fetch, recorded upon the first soft fetch
     trigger. The first soft trigger does not necessarily cause a fetch (if it
     comes before the end of the respective scheduling interval). This metric is
-    recorded at most once (per lifetime of a Chrome instance) after each fetch.
-    This is used to understand how changing scheduling intervals will impact
-    traffic of background fetches.
+    recorded at most once after each fetch (and additionaly at most once after
+    each startup of Chrome before the next fetch). This is used to understand
+    how changing scheduling intervals will impact traffic of background fetches.
+  </summary>
+</histogram>
+
+<histogram base="true"
+    name="NewTabPage.ContentSuggestions.TimeUntilFirstStartupTrigger"
+    units="ms">
+  <owner>jkrcal@chromium.org</owner>
+  <summary>
+    Android: The time since the last fetch, recorded upon the first startup
+    fetch trigger. The first startup trigger does not necessarily cause a fetch
+    (if it comes before the end of the respective scheduling interval). This
+    metric is recorded at most once after each fetch (and additionaly at most
+    once after each startup of Chrome before the next fetch). This is used to
+    understand how changing scheduling intervals will impact traffic of
+    background fetches.
   </summary>
 </histogram>
 
@@ -46372,6 +46409,16 @@
   </summary>
 </histogram>
 
+<histogram name="NewTabPage.TileFaviconFetchStatus.Server"
+    enum="GoogleFaviconServerRequestStatus">
+  <owner>jkrcal@chromium.org</owner>
+  <summary>
+    Mobile only. The result of fetching a favicon for a tile on the New Tab
+    Page. This is recorded for each gray MostVisited tile on the New Tab Page
+    once per impression of the tile.
+  </summary>
+</histogram>
+
 <histogram name="NewTabPage.TileFaviconFetchSuccess.Popular"
     enum="BooleanSuccess">
   <owner>jkrcal@chromium.org</owner>
@@ -46384,6 +46431,9 @@
 
 <histogram name="NewTabPage.TileFaviconFetchSuccess.Server"
     enum="BooleanSuccess">
+  <obsolete>
+    Deprecated 06/2017. Replaced by NewTabPage.TileFaviconFetchStatus.Server.
+  </obsolete>
   <owner>jkrcal@chromium.org</owner>
   <summary>
     Mobile only. The result of fetching a favicon for a tile on the New Tab
@@ -80489,6 +80539,10 @@
 
 <histogram name="UMA.FileMetricsProvider.EmbeddedProfile.DroppedFileAge"
     units="minutes">
+  <obsolete>
+    Deprecated 07/2017. Was only for short-term analysis. About 95% of dropped
+    files were less than 1 day old.
+  </obsolete>
   <owner>asvitkine@chromium.org</owner>
   <owner>bcwhite@chromium.org</owner>
   <summary>
@@ -97560,11 +97614,21 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="UserClasses" separator=".">
+  <affected-histogram
+      name="NewTabPage.ContentSuggestions.TimeUntilFirstShownTrigger"/>
   <suffix name="RareNTPUser" label="Rare NTP user"/>
   <suffix name="ActiveNTPUser" label="Active NTP user"/>
   <suffix name="ActiveSuggestionsConsumer" label="Active suggestions consumer"/>
   <affected-histogram
-      name="NewTabPage.ContentSuggestions.TimeUntilFirstSoftTrigger"/>
+      name="NewTabPage.ContentSuggestions.TimeUntilFirstSoftTrigger">
+    <obsolete>
+      Deprecated as of July 2017, in favor of
+      NewTabPage.ContentSuggestions.TimeUntilFirstShownTrigger and
+      NewTabPage.ContentSuggestions.TimeUntilFirstStartupTrigger.
+    </obsolete>
+  </affected-histogram>
+  <affected-histogram
+      name="NewTabPage.ContentSuggestions.TimeUntilFirstStartupTrigger"/>
   <affected-histogram
       name="NewTabPage.ContentSuggestions.TimeUntilPersistentFetch"/>
   <affected-histogram name="NewTabPage.ContentSuggestions.TimeUntilSoftFetch"/>
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml
index d9cb199..3994165 100644
--- a/tools/metrics/ukm/ukm.xml
+++ b/tools/metrics/ukm/ukm.xml
@@ -489,6 +489,55 @@
   <metric name="AudioVideo.SRC"/>
 </event>
 
+<event name="Memory.Experimental">
+  <owner>erikchen@chromium.org</owner>
+  <summary>
+    Metrics associated with memory consumption, in MB.
+  </summary>
+  <metric name="BlinkGC">
+    <summary>
+      Measure of memory consumed by Oilpan.
+    </summary>
+  </metric>
+  <metric name="CommandBuffer">
+    <summary>
+      Measure of memory consumed by GL command buffer.
+    </summary>
+  </metric>
+  <metric name="Malloc">
+    <summary>
+      Measure of memory allocated by malloc.
+    </summary>
+  </metric>
+  <metric name="PartitionAlloc">
+    <summary>
+      Measure of memory allocated by PartitionAlloc.
+    </summary>
+  </metric>
+  <metric name="PrivateMemoryFootprint">
+    <summary>
+      Measure of total memory consumed by process.
+    </summary>
+  </metric>
+  <metric name="ProcessType">
+    <summary>
+      Type of process (e.g. browser, renderer, GPU --- see
+      services/resource_coordinator/public/interfaces/memory_instrumentation/memory_instrumentation.mojom)
+      of associated metrics.
+    </summary>
+  </metric>
+  <metric name="Resident">
+    <summary>
+      Size of process' working set.
+    </summary>
+  </metric>
+  <metric name="V8">
+    <summary>
+      Measure of memory consumed by V8.
+    </summary>
+  </metric>
+</event>
+
 <event name="PageDomainInfo">
   <owner>uthakore@chromium.org</owner>
   <summary>
diff --git a/tools/perf/page_sets/system_health/expectations.py b/tools/perf/page_sets/system_health/expectations.py
index 93b3b4c..3a4248d 100644
--- a/tools/perf/page_sets/system_health/expectations.py
+++ b/tools/perf/page_sets/system_health/expectations.py
@@ -28,9 +28,6 @@
                       [expectations.ALL_WIN], 'crbug.com/728152')
     self.DisableStory('browse:news:cnn',
                       [expectations.ALL_MAC], 'crbug.com/728576')
-    self.DisableStory('browse:media:flickr_infinite_scroll',
-                      [expectations.ALL],
-                      'crbug.com/728785')
 
 
 class SystemHealthDesktopMemoryExpectations(expectations.StoryExpectations):
@@ -59,9 +56,8 @@
                       [expectations.ALL_WIN], 'crbug.com/728152')
     self.DisableStory('browse:news:cnn',
                       [expectations.ALL_MAC], 'crbug.com/728576')
-    self.DisableStory('browse:media:flickr_infinite_scroll',
-                      [expectations.ALL],
-                      'crbug.com/728785')
+    self.DisableStory('browse:social:twitter_infinite_scroll',
+                      [expectations.ALL_WIN], 'crbug.com/728464')
 
 
 class SystemHealthMobileCommonExpectations(expectations.StoryExpectations):
@@ -82,8 +78,6 @@
                       'crbug.com/728081')
     self.DisableStory('browse:social:facebook_infinite_scroll',
                       [expectations.ALL], 'crbug.com/728152')
-    self.DisableStory('browse:media:flickr_infinite_scroll',
-                      [expectations.ALL], 'crbug.com/728785')
     self.DisableStory(
         'load:tools:drive',
         [expectations.ANDROID_NEXUS5X, expectations.ANDROID_WEBVIEW],
@@ -122,8 +116,6 @@
                       'crbug.com/728081')
     self.DisableStory('browse:social:facebook_infinite_scroll',
                       [expectations.ALL], 'crbug.com/728152')
-    self.DisableStory('browse:media:flickr_infinite_scroll',
-                      [expectations.ALL], 'crbug.com/728785')
     self.DisableStory(
         'load:tools:drive',
         [expectations.ANDROID_NEXUS5X, expectations.ANDROID_WEBVIEW],
@@ -163,9 +155,6 @@
                       [expectations.ALL_MAC], 'crbug.com/728576')
     self.DisableStory('browse:social:twitter_infinite_scroll',
                       [expectations.ALL], 'crbug.com/728464')
-    self.DisableStory('browse:media:flickr_infinite_scroll',
-                      [expectations.ALL, expectations.ALL_WIN],
-                      'crbug.com/728785')
 
 # Should only include browse:*:* stories.
 class V8BrowsingMobileExpecations(expectations.StoryExpectations):
@@ -178,8 +167,6 @@
                       'crbug.com/728081')
     self.DisableStory('browse:social:facebook_infinite_scroll',
                       [expectations.ALL], 'crbug.com/728152')
-    self.DisableStory('browse:media:flickr_infinite_scroll',
-                      [expectations.ALL], 'crbug.com/728785')
     # TODO(rnephew): This disabling should move to CanRunOnBrowser.
     self.DisableStory('browse:chrome:omnibox',
                       [expectations.ANDROID_WEBVIEW],
diff --git a/tools/win/pe_summarize.py b/tools/win/pe_summarize.py
index 3fbb9207..13e4a4b2 100644
--- a/tools/win/pe_summarize.py
+++ b/tools/win/pe_summarize.py
@@ -57,6 +57,13 @@
 import sys
 
 
+def _FindSection(section_list, section_name):
+  for i in range(len(section_list)):
+    if section_name == section_list[i][0]:
+      return i
+  return -1
+
+
 def main():
   if len(sys.argv) < 2:
     print r'Usage: %s PEFileName [OtherPeFileNames...]' % sys.argv[0]
@@ -119,16 +126,25 @@
       print 'Memory size change from %s to %s' % (last_pe_path, pe_path)
       total_delta = 0
       for i in range(len(results)):
-        # Make sure the current/last section names match or else the deltas
-        # will be meaningless. Mismatches can occur when comparing 32-bit and
-        # 64-bit binaries.
-        if results[i][0] != last_results[i][0]:
-          print "Names for section[%d] don't match. Aborting." % i
-          return 0
-        delta = results[i][1] - last_results[i][1]
+        section_name = results[i][0]
+        # Find a matching section name. Mismatches can occur when comparing
+        # 32-bit and 64-bit binaries. They can also occur when one of the
+        # binaries pulls in code that defines custom sections such as .rodata.
+        last_i = _FindSection(last_results, section_name)
+        delta = results[i][1]
+        if last_i >= 0:
+          delta -= last_results[last_i][1]
         total_delta += delta
         if delta:
-          print '%12s: %7d bytes change' % (results[i][0], delta)
+          print '%12s: %7d bytes change' % (section_name, delta)
+      for last_i in range(len(last_results)):
+        section_name = last_results[last_i][0]
+        # Find sections that exist only in last_results.
+        i = _FindSection(results, section_name)
+        if i < 0:
+          delta = -last_results[last_i][1]
+          total_delta += delta
+          print '%12s: %7d bytes change' % (section_name, delta)
       print 'Total change: %7d bytes' % total_delta
     last_pe_filepart = pe_filepart
     last_pe_path = pe_path
diff --git a/ui/app_list/views/apps_grid_view.cc b/ui/app_list/views/apps_grid_view.cc
index ae1bb11..00c3387 100644
--- a/ui/app_list/views/apps_grid_view.cc
+++ b/ui/app_list/views/apps_grid_view.cc
@@ -962,14 +962,10 @@
   SetSelectedItemByIndex(Index(target_page, target_slot));
 }
 
-void AppsGridView::CalculateIdealBounds() {
+const gfx::Vector2d AppsGridView::CalculateTransitionOffset(
+    int page_of_view) const {
   gfx::Size grid_size = GetTileGridSize();
 
-  // Page size including padding pixels. A tile.x + page_width means the same
-  // tile slot in the next page; similarly for tile.y + page_height.
-  const int page_width = grid_size.width() + kPagePadding;
-  const int page_height = grid_size.height() + kPagePadding;
-
   // If there is a transition, calculates offset for current and target page.
   const int current_page = pagination_model_.selected_page();
   const PaginationModel::Transition& transition =
@@ -979,6 +975,44 @@
   // Transition to previous page means negative offset.
   const int dir = transition.target_page > current_page ? -1 : 1;
 
+  int x_offset = 0;
+  int y_offset = 0;
+
+  if (pagination_controller_->scroll_axis() ==
+      PaginationController::SCROLL_AXIS_HORIZONTAL) {
+    // Page size including padding pixels. A tile.x + page_width means the same
+    // tile slot in the next page.
+    const int page_width = grid_size.width() + kPagePadding;
+    if (page_of_view < current_page)
+      x_offset = -page_width;
+    else if (page_of_view > current_page)
+      x_offset = page_width;
+
+    if (is_valid) {
+      if (page_of_view == current_page ||
+          page_of_view == transition.target_page) {
+        x_offset += transition.progress * page_width * dir;
+      }
+    }
+  } else {
+    const int page_height = grid_size.height() + kPagePadding;
+    if (page_of_view < current_page)
+      y_offset = -page_height;
+    else if (page_of_view > current_page)
+      y_offset = page_height;
+
+    if (is_valid) {
+      if (page_of_view == current_page ||
+          page_of_view == transition.target_page) {
+        y_offset += transition.progress * page_height * dir;
+      }
+    }
+  }
+
+  return gfx::Vector2d(x_offset, y_offset);
+}
+
+void AppsGridView::CalculateIdealBounds() {
   const int total_views =
       view_model_.view_size() + pulsing_blocks_model_.view_size();
   int slot_index = 0;
@@ -994,41 +1028,11 @@
       view_index = GetIndexFromModelIndex(slot_index);
     }
 
-    // Decide the x or y offset for current item.
-    int x_offset = 0;
-    int y_offset = 0;
-
-    if (pagination_controller_->scroll_axis() ==
-        PaginationController::SCROLL_AXIS_HORIZONTAL) {
-      if (view_index.page < current_page)
-        x_offset = -page_width;
-      else if (view_index.page > current_page)
-        x_offset = page_width;
-
-      if (is_valid) {
-        if (view_index.page == current_page ||
-            view_index.page == transition.target_page) {
-          x_offset += transition.progress * page_width * dir;
-        }
-      }
-    } else {
-      if (view_index.page < current_page)
-        y_offset = -page_height;
-      else if (view_index.page > current_page)
-        y_offset = page_height;
-
-      if (is_valid) {
-        if (view_index.page == current_page ||
-            view_index.page == transition.target_page) {
-          y_offset += transition.progress * page_height * dir;
-        }
-      }
-    }
-
     const int row = view_index.slot / cols_;
     const int col = view_index.slot % cols_;
     gfx::Rect tile_slot = GetExpectedTileBounds(row, col);
-    tile_slot.Offset(x_offset, y_offset);
+    const gfx::Vector2d offset = CalculateTransitionOffset(view_index.page);
+    tile_slot.Offset(offset.x(), offset.y());
     if (i < view_model_.view_size()) {
       view_model_.set_ideal_bounds(i, tile_slot);
     } else {
diff --git a/ui/app_list/views/apps_grid_view.h b/ui/app_list/views/apps_grid_view.h
index 932f3c9..0c8512c 100644
--- a/ui/app_list/views/apps_grid_view.h
+++ b/ui/app_list/views/apps_grid_view.h
@@ -276,6 +276,10 @@
 
   void MoveSelected(int page_delta, int slot_x_delta, int slot_y_delta);
 
+  // Calculates the offset for |page_of_view| based on current page and
+  // transition target page.
+  const gfx::Vector2d CalculateTransitionOffset(int page_of_view) const;
+
   void CalculateIdealBounds();
   void AnimateToIdealBounds();
 
diff --git a/ui/base/accelerators/accelerator.cc b/ui/base/accelerators/accelerator.cc
index 8b8d14e..7bbddf42 100644
--- a/ui/base/accelerators/accelerator.cc
+++ b/ui/base/accelerators/accelerator.cc
@@ -42,19 +42,22 @@
                          KeyState key_state)
     : key_code_(key_code),
       key_state_(key_state),
-      modifiers_(modifiers & kInterestingFlagsMask) {}
+      modifiers_(modifiers & kInterestingFlagsMask),
+      interrupted_by_mouse_event_(false) {}
 
 Accelerator::Accelerator(const KeyEvent& key_event)
     : key_code_(key_event.key_code()),
       key_state_(key_event.type() == ET_KEY_PRESSED ? KeyState::PRESSED
                                                     : KeyState::RELEASED),
       // |modifiers_| may include the repeat flag.
-      modifiers_(key_event.flags() & kInterestingFlagsMask) {}
+      modifiers_(key_event.flags() & kInterestingFlagsMask),
+      interrupted_by_mouse_event_(false) {}
 
 Accelerator::Accelerator(const Accelerator& accelerator) {
   key_code_ = accelerator.key_code_;
   key_state_ = accelerator.key_state_;
   modifiers_ = accelerator.modifiers_;
+  interrupted_by_mouse_event_ = accelerator.interrupted_by_mouse_event_;
   if (accelerator.platform_accelerator_)
     platform_accelerator_ = accelerator.platform_accelerator_->CreateCopy();
 }
@@ -72,6 +75,7 @@
     key_code_ = accelerator.key_code_;
     key_state_ = accelerator.key_state_;
     modifiers_ = accelerator.modifiers_;
+    interrupted_by_mouse_event_ = accelerator.interrupted_by_mouse_event_;
     if (accelerator.platform_accelerator_)
       platform_accelerator_ = accelerator.platform_accelerator_->CreateCopy();
     else
@@ -94,7 +98,8 @@
 bool Accelerator::operator ==(const Accelerator& rhs) const {
   return (key_code_ == rhs.key_code_) && (key_state_ == rhs.key_state_) &&
          (MaskOutKeyEventFlags(modifiers_) ==
-          MaskOutKeyEventFlags(rhs.modifiers_));
+          MaskOutKeyEventFlags(rhs.modifiers_)) &&
+         interrupted_by_mouse_event_ == rhs.interrupted_by_mouse_event_;
 }
 
 bool Accelerator::operator !=(const Accelerator& rhs) const {
diff --git a/ui/base/accelerators/accelerator.h b/ui/base/accelerators/accelerator.h
index f5ee417..3d6b422 100644
--- a/ui/base/accelerators/accelerator.h
+++ b/ui/base/accelerators/accelerator.h
@@ -89,6 +89,14 @@
     return platform_accelerator_.get();
   }
 
+  void set_interrupted_by_mouse_event(bool interrupted_by_mouse_event) {
+    interrupted_by_mouse_event_ = interrupted_by_mouse_event;
+  }
+
+  bool interrupted_by_mouse_event() const {
+    return interrupted_by_mouse_event_;
+  }
+
  private:
   // The keycode (VK_...).
   KeyboardCode key_code_;
@@ -102,6 +110,13 @@
   // TODO: this is only used in Mac code and should be removed from here.
   // http://crbug.com/702823.
   std::unique_ptr<PlatformAccelerator> platform_accelerator_;
+
+  // Whether the accelerator is interrupted by a mouse press/release. This is
+  // optionally used by AcceleratorController. Even this is set to true, the
+  // accelerator may still be handled successfully. (Currently only
+  // TOGGLE_APP_LIST is disabled when mouse press/release occurs between
+  // search key down and up. See crbug.com/665897)
+  bool interrupted_by_mouse_event_;
 };
 
 // An interface that classes that want to register for keyboard accelerators
diff --git a/ui/base/accelerators/accelerator_history.cc b/ui/base/accelerators/accelerator_history.cc
index 94e78da2..e4fbc81 100644
--- a/ui/base/accelerators/accelerator_history.cc
+++ b/ui/base/accelerators/accelerator_history.cc
@@ -31,4 +31,11 @@
   }
 }
 
+void AcceleratorHistory::InterruptCurrentAccelerator() {
+  if (current_accelerator_.key_state() == Accelerator::KeyState::PRESSED) {
+    // Only interrupts pressed keys.
+    current_accelerator_.set_interrupted_by_mouse_event(true);
+  }
+}
+
 } // namespace ui
diff --git a/ui/base/accelerators/accelerator_history.h b/ui/base/accelerators/accelerator_history.h
index ee63a572..bc944cc 100644
--- a/ui/base/accelerators/accelerator_history.h
+++ b/ui/base/accelerators/accelerator_history.h
@@ -35,6 +35,8 @@
   // stored one.
   void StoreCurrentAccelerator(const Accelerator& accelerator);
 
+  void InterruptCurrentAccelerator();
+
  private:
   Accelerator current_accelerator_;
   Accelerator previous_accelerator_;
diff --git a/ui/compositor/DEPS b/ui/compositor/DEPS
index 567f270..1db43fd 100644
--- a/ui/compositor/DEPS
+++ b/ui/compositor/DEPS
@@ -1,6 +1,7 @@
 include_rules = [
   "+cc",
   "-cc/blink",
+  "+components/viz/common/quads",
   "+components/viz/host",
   "+gpu/command_buffer/client/gles2_interface.h",
   "+services/ui/public/cpp",
diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc
index d851a9b..513fba2 100644
--- a/ui/compositor/compositor.cc
+++ b/ui/compositor/compositor.cc
@@ -15,6 +15,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/stl_util.h"
+#include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "base/sys_info.h"
@@ -34,6 +35,7 @@
 #include "cc/surfaces/local_surface_id_allocator.h"
 #include "cc/trees/layer_tree_host.h"
 #include "cc/trees/layer_tree_settings.h"
+#include "components/viz/common/quads/resource_format.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/compositor/compositor_observer.h"
 #include "ui/compositor/compositor_switches.h"
@@ -84,6 +86,15 @@
   refresh_rate_ = context_factory_->GetRefreshRate();
   settings.main_frame_before_activation_enabled = false;
 
+  if (command_line->HasSwitch(switches::kLimitFps)) {
+    std::string fps_str =
+        command_line->GetSwitchValueASCII(switches::kLimitFps);
+    double fps;
+    if (base::StringToDouble(fps_str, &fps) && fps > 0) {
+      forced_refresh_rate_ = fps;
+    }
+  }
+
   if (command_line->HasSwitch(cc::switches::kUIShowCompositedLayerBorders)) {
     std::string layer_borders_string = command_line->GetSwitchValueASCII(
         cc::switches::kUIShowCompositedLayerBorders);
@@ -141,7 +152,7 @@
   settings.use_partial_raster = !settings.use_zero_copy;
 
   if (command_line->HasSwitch(switches::kUIEnableRGBA4444Textures))
-    settings.preferred_tile_format = cc::RGBA_4444;
+    settings.preferred_tile_format = viz::RGBA_4444;
   settings.resource_settings = context_factory_->GetResourceSettings();
 
   settings.gpu_memory_policy.bytes_limit_when_visible = 512 * 1024 * 1024;
@@ -372,6 +383,10 @@
 
 void Compositor::SetDisplayVSyncParameters(base::TimeTicks timebase,
                                            base::TimeDelta interval) {
+  if (forced_refresh_rate_) {
+    timebase = base::TimeTicks();
+    interval = base::TimeDelta::FromSeconds(1) / forced_refresh_rate_;
+  }
   if (interval.is_zero()) {
     // TODO(brianderson): We should not be receiving 0 intervals.
     interval = cc::BeginFrameArgs::DefaultInterval();
diff --git a/ui/compositor/compositor.h b/ui/compositor/compositor.h
index 292d734..7a1b0a9 100644
--- a/ui/compositor/compositor.h
+++ b/ui/compositor/compositor.h
@@ -404,6 +404,9 @@
   // Current vsync refresh rate per second.
   float refresh_rate_ = 0.f;
 
+  // If nonzero, this is the refresh rate forced from the command-line.
+  double forced_refresh_rate_ = 0.f;
+
   // A map from child id to parent id.
   std::unordered_set<cc::FrameSinkId, cc::FrameSinkIdHash> child_frame_sinks_;
   bool widget_valid_ = false;
diff --git a/ui/compositor/compositor_switches.cc b/ui/compositor/compositor_switches.cc
index 2a999a8..991aba5 100644
--- a/ui/compositor/compositor_switches.cc
+++ b/ui/compositor/compositor_switches.cc
@@ -17,6 +17,10 @@
 // Forces tests to produce pixel output when they normally wouldn't.
 const char kEnablePixelOutputInTests[] = "enable-pixel-output-in-tests";
 
+// Limits the compositor to output a certain number of frames per second,
+// maximum.
+const char kLimitFps[] = "limit-fps";
+
 // Disable partial swap which is needed for some OpenGL drivers / emulators.
 const char kUIDisablePartialSwap[] = "ui-disable-partial-swap";
 
diff --git a/ui/compositor/compositor_switches.h b/ui/compositor/compositor_switches.h
index 0cc31be97..54fc33542 100644
--- a/ui/compositor/compositor_switches.h
+++ b/ui/compositor/compositor_switches.h
@@ -11,6 +11,7 @@
 
 COMPOSITOR_EXPORT extern const char kEnableHardwareOverlays[];
 COMPOSITOR_EXPORT extern const char kEnablePixelOutputInTests[];
+COMPOSITOR_EXPORT extern const char kLimitFps[];
 COMPOSITOR_EXPORT extern const char kUIDisablePartialSwap[];
 COMPOSITOR_EXPORT extern const char kUIEnableRGBA4444Textures[];
 COMPOSITOR_EXPORT extern const char kUIEnableZeroCopy[];
diff --git a/ui/gfx/render_text.cc b/ui/gfx/render_text.cc
index ebae2fb..041c9f2 100644
--- a/ui/gfx/render_text.cc
+++ b/ui/gfx/render_text.cc
@@ -105,11 +105,11 @@
 
 // Creates a SkShader to fade the text, with |left_part| specifying the left
 // fade effect, if any, and |right_part| specifying the right fade effect.
-std::unique_ptr<cc::PaintShader> CreateFadeShader(const FontList& font_list,
-                                                  const Rect& text_rect,
-                                                  const Rect& left_part,
-                                                  const Rect& right_part,
-                                                  SkColor color) {
+sk_sp<cc::PaintShader> CreateFadeShader(const FontList& font_list,
+                                        const Rect& text_rect,
+                                        const Rect& left_part,
+                                        const Rect& right_part,
+                                        SkColor color) {
   // The shader should only specify transparency of the fade itself, not the
   // original transparency, which will be applied by the actual renderer.
   DCHECK_EQ(SkColorGetA(color), static_cast<uint8_t>(0xff));
@@ -224,7 +224,7 @@
   flags_.setColor(foreground);
 }
 
-void SkiaTextRenderer::SetShader(std::unique_ptr<cc::PaintShader> shader) {
+void SkiaTextRenderer::SetShader(sk_sp<cc::PaintShader> shader) {
   flags_.setShader(std::move(shader));
 }
 
diff --git a/ui/gfx/render_text.h b/ui/gfx/render_text.h
index d912882..24ea3d4 100644
--- a/ui/gfx/render_text.h
+++ b/ui/gfx/render_text.h
@@ -62,7 +62,7 @@
   void SetTypeface(sk_sp<SkTypeface> typeface);
   void SetTextSize(SkScalar size);
   void SetForegroundColor(SkColor foreground);
-  void SetShader(std::unique_ptr<cc::PaintShader> shader);
+  void SetShader(sk_sp<cc::PaintShader> shader);
   void DrawSelection(const std::vector<Rect>& selection, SkColor color);
   virtual void DrawPosText(const SkPoint* pos,
                            const uint16_t* glyphs,
diff --git a/ui/gfx/skia_paint_util.cc b/ui/gfx/skia_paint_util.cc
index 6bbe1ca..c18fbd1 100644
--- a/ui/gfx/skia_paint_util.cc
+++ b/ui/gfx/skia_paint_util.cc
@@ -13,15 +13,14 @@
 
 namespace gfx {
 
-std::unique_ptr<cc::PaintShader> CreateImageRepShader(
-    const gfx::ImageSkiaRep& image_rep,
-    SkShader::TileMode tile_mode,
-    const SkMatrix& local_matrix) {
+sk_sp<cc::PaintShader> CreateImageRepShader(const gfx::ImageSkiaRep& image_rep,
+                                            SkShader::TileMode tile_mode,
+                                            const SkMatrix& local_matrix) {
   return CreateImageRepShaderForScale(image_rep, tile_mode, local_matrix,
                                       image_rep.scale());
 }
 
-std::unique_ptr<cc::PaintShader> CreateImageRepShaderForScale(
+sk_sp<cc::PaintShader> CreateImageRepShaderForScale(
     const gfx::ImageSkiaRep& image_rep,
     SkShader::TileMode tile_mode,
     const SkMatrix& local_matrix,
@@ -43,10 +42,10 @@
       &shader_scale);
 }
 
-std::unique_ptr<cc::PaintShader> CreateGradientShader(int start_point,
-                                                      int end_point,
-                                                      SkColor start_color,
-                                                      SkColor end_color) {
+sk_sp<cc::PaintShader> CreateGradientShader(int start_point,
+                                            int end_point,
+                                            SkColor start_color,
+                                            SkColor end_color) {
   SkColor grad_colors[2] = {start_color, end_color};
   SkPoint grad_points[2];
   grad_points[0].iset(0, start_point);
diff --git a/ui/gfx/skia_paint_util.h b/ui/gfx/skia_paint_util.h
index 1d163437..f76fc23 100644
--- a/ui/gfx/skia_paint_util.h
+++ b/ui/gfx/skia_paint_util.h
@@ -26,13 +26,13 @@
 // TODO(pkotwicz): Allow shader's local matrix to be changed after the shader
 // is created.
 //
-GFX_EXPORT std::unique_ptr<cc::PaintShader> CreateImageRepShader(
+GFX_EXPORT sk_sp<cc::PaintShader> CreateImageRepShader(
     const gfx::ImageSkiaRep& image_rep,
     SkShader::TileMode tile_mode,
     const SkMatrix& local_matrix);
 
 // Creates a bitmap shader for the image rep with the passed in scale factor.
-GFX_EXPORT std::unique_ptr<cc::PaintShader> CreateImageRepShaderForScale(
+GFX_EXPORT sk_sp<cc::PaintShader> CreateImageRepShaderForScale(
     const gfx::ImageSkiaRep& image_rep,
     SkShader::TileMode tile_mode,
     const SkMatrix& local_matrix,
@@ -40,11 +40,10 @@
 
 // Creates a vertical gradient shader. The caller owns the shader.
 // Example usage to avoid leaks:
-GFX_EXPORT std::unique_ptr<cc::PaintShader> CreateGradientShader(
-    int start_point,
-    int end_point,
-    SkColor start_color,
-    SkColor end_color);
+GFX_EXPORT sk_sp<cc::PaintShader> CreateGradientShader(int start_point,
+                                                       int end_point,
+                                                       SkColor start_color,
+                                                       SkColor end_color);
 
 // Creates a draw looper to generate |shadows|. The caller owns the draw looper.
 // NULL is returned if |shadows| is empty since no draw looper is needed in
diff --git a/ui/keyboard/keyboard_controller.cc b/ui/keyboard/keyboard_controller.cc
index 8bd0a54..05bb656 100644
--- a/ui/keyboard/keyboard_controller.cc
+++ b/ui/keyboard/keyboard_controller.cc
@@ -8,12 +8,9 @@
 
 #include "base/bind.h"
 #include "base/command_line.h"
-#include "base/location.h"
 #include "base/macros.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/single_thread_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "build/build_config.h"
 #include "ui/aura/env.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_delegate.h"
@@ -27,7 +24,6 @@
 #include "ui/display/types/display_constants.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/path.h"
-#include "ui/gfx/skia_util.h"
 #include "ui/keyboard/keyboard_controller_observer.h"
 #include "ui/keyboard/keyboard_layout_manager.h"
 #include "ui/keyboard/keyboard_ui.h"
diff --git a/ui/keyboard/keyboard_controller.h b/ui/keyboard/keyboard_controller.h
index a62890e3..5fd0028 100644
--- a/ui/keyboard/keyboard_controller.h
+++ b/ui/keyboard/keyboard_controller.h
@@ -7,7 +7,6 @@
 
 #include <memory>
 
-#include "base/event_types.h"
 #include "base/macros.h"
 #include "base/observer_list.h"
 #include "ui/aura/window_observer.h"
diff --git a/ui/keyboard/keyboard_controller_unittest.cc b/ui/keyboard/keyboard_controller_unittest.cc
index 8a3c096..b3f2dea 100644
--- a/ui/keyboard/keyboard_controller_unittest.cc
+++ b/ui/keyboard/keyboard_controller_unittest.cc
@@ -6,18 +6,15 @@
 
 #include <memory>
 
-#include "base/bind.h"
 #include "base/command_line.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/test/scoped_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/aura/client/focus_client.h"
-#include "ui/aura/layout_manager.h"
 #include "ui/aura/test/aura_test_helper.h"
 #include "ui/aura/test/test_window_delegate.h"
 #include "ui/aura/window.h"
-#include "ui/aura/window_event_dispatcher.h"
 #include "ui/base/ime/dummy_text_input_client.h"
 #include "ui/base/ime/input_method.h"
 #include "ui/base/ime/input_method_factory.h"
@@ -28,7 +25,6 @@
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/compositor/test/context_factories_for_test.h"
 #include "ui/compositor/test/layer_animator_test_controller.h"
-#include "ui/events/event_utils.h"
 #include "ui/events/test/event_generator.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/keyboard/keyboard_controller_observer.h"
diff --git a/ui/keyboard/keyboard_util.h b/ui/keyboard/keyboard_util.h
index f0089a4..1caa1b3a 100644
--- a/ui/keyboard/keyboard_util.h
+++ b/ui/keyboard/keyboard_util.h
@@ -7,14 +7,17 @@
 
 #include <string>
 
-// TODO(beng): replace with forward decl once RootWindow is renamed.
-#include "ui/aura/window.h"
+#include "base/strings/string16.h"
 #include "ui/keyboard/keyboard_export.h"
 
 namespace aura {
 class WindowTreeHost;
 }
 
+namespace gfx {
+class Rect;
+};
+
 class GURL;
 
 namespace keyboard {
diff --git a/ui/views/win/fullscreen_handler.cc b/ui/views/win/fullscreen_handler.cc
index c35bad52..6cbe30a 100644
--- a/ui/views/win/fullscreen_handler.cc
+++ b/ui/views/win/fullscreen_handler.cc
@@ -90,7 +90,8 @@
     HRESULT hr = ::CoCreateInstance(CLSID_TaskbarList, NULL,
                                     CLSCTX_INPROC_SERVER,
                                     IID_PPV_ARGS(&task_bar_list_));
-    CHECK(SUCCEEDED(hr));
+    if (SUCCEEDED(hr) && FAILED(task_bar_list_->HrInit()))
+      task_bar_list_ = nullptr;
   }
 
   // As per MSDN marking the window as fullscreen should ensure that the
@@ -98,7 +99,8 @@
   // is activated. If the window is not fullscreen, the Shell falls back to
   // heuristics to determine how the window should be treated, which means
   // that it could still consider the window as fullscreen. :(
-  task_bar_list_->MarkFullscreenWindow(hwnd_, !!fullscreen);
+  if (task_bar_list_)
+    task_bar_list_->MarkFullscreenWindow(hwnd_, !!fullscreen);
 }
 
 }  // namespace views
diff --git a/ui/wm/core/accelerator_filter.cc b/ui/wm/core/accelerator_filter.cc
index 03ea898..21f10d5 100644
--- a/ui/wm/core/accelerator_filter.cc
+++ b/ui/wm/core/accelerator_filter.cc
@@ -46,4 +46,11 @@
     event->StopPropagation();
 }
 
+void AcceleratorFilter::OnMouseEvent(ui::MouseEvent* event) {
+  if (event->type() == ui::ET_MOUSE_PRESSED ||
+      event->type() == ui::ET_MOUSE_RELEASED) {
+    accelerator_history_->InterruptCurrentAccelerator();
+  }
+}
+
 }  // namespace wm
diff --git a/ui/wm/core/accelerator_filter.h b/ui/wm/core/accelerator_filter.h
index 492ab6c..86bdf77e2 100644
--- a/ui/wm/core/accelerator_filter.h
+++ b/ui/wm/core/accelerator_filter.h
@@ -30,6 +30,7 @@
 
   // Overridden from ui::EventHandler:
   void OnKeyEvent(ui::KeyEvent* event) override;
+  void OnMouseEvent(ui::MouseEvent* event) override;
 
  private:
   std::unique_ptr<AcceleratorDelegate> delegate_;