diff --git a/DEPS b/DEPS
index 8668a0c..744db62 100644
--- a/DEPS
+++ b/DEPS
@@ -79,7 +79,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': 'f5b418839f2e43ec9f92ed9a5f873eb9cf63f713',
+  'skia_revision': '97708e59ce483f4f15706ab91101bbc4c75392ba',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -91,7 +91,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '5cf4d06cd4604efaec242203b2b327e6daa607ee',
+  'angle_revision': 'b1de5a7e633ec9fa1ef8e8778def5069fe248c46',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling build tools
   # and whatever else without interference from each other.
@@ -408,7 +408,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '33146a20418aff04ca926680f32f793ccfb72c0b',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '36a9c890b9795e9d1b916a3f41b470f275683ed1',
       'condition': 'checkout_linux',
   },
 
@@ -873,7 +873,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '3c1cb0203b6cfc10389e85a350b2ea6ca29d01ce',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '9d6f73bfb299cc20d55e12ae98e70de803211d7a', # commit position 21742
+    Var('webrtc_git') + '/src.git' + '@' + '35d052c2a3c5fa5d4bc4501a8b4d3f36c3d3201d', # commit position 21742
 
   'src/third_party/xdg-utils': {
       'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d',
diff --git a/ash/system/power/power_button_menu_screen_view.cc b/ash/system/power/power_button_menu_screen_view.cc
index 1dc6165..573de94 100644
--- a/ash/system/power/power_button_menu_screen_view.cc
+++ b/ash/system/power/power_button_menu_screen_view.cc
@@ -72,8 +72,8 @@
     animation.AddObserver(this);
     animation.SetTweenType(show ? gfx::Tween::EASE_IN_2
                                 : gfx::Tween::FAST_OUT_LINEAR_IN);
-    animation.SetTransitionDuration(base::TimeDelta::FromMilliseconds(
-        PowerButtonMenuView::kAnimationTimeoutMs));
+    animation.SetTransitionDuration(
+        PowerButtonMenuView::kMenuAnimationDuration);
 
     layer()->SetOpacity(show ? kPowerButtonMenuOpacity : 0.f);
   }
diff --git a/ash/system/power/power_button_menu_view.cc b/ash/system/power/power_button_menu_view.cc
index f489fc8..d3babfe 100644
--- a/ash/system/power/power_button_menu_view.cc
+++ b/ash/system/power/power_button_menu_view.cc
@@ -32,6 +32,8 @@
 
 using PowerButtonPosition = PowerButtonController::PowerButtonPosition;
 
+constexpr base::TimeDelta PowerButtonMenuView::kMenuAnimationDuration;
+
 PowerButtonMenuView::PowerButtonMenuView(
     PowerButtonPosition power_button_position)
     : power_button_position_(power_button_position) {
@@ -55,8 +57,7 @@
   animation.AddObserver(this);
   animation.SetTweenType(show ? gfx::Tween::EASE_IN
                               : gfx::Tween::FAST_OUT_LINEAR_IN);
-  animation.SetTransitionDuration(
-      base::TimeDelta::FromMilliseconds(kAnimationTimeoutMs));
+  animation.SetTransitionDuration(kMenuAnimationDuration);
 
   layer()->SetOpacity(show ? 1.0f : 0.f);
 
diff --git a/ash/system/power/power_button_menu_view.h b/ash/system/power/power_button_menu_view.h
index 29781cb..c7a7c014 100644
--- a/ash/system/power/power_button_menu_view.h
+++ b/ash/system/power/power_button_menu_view.h
@@ -21,8 +21,9 @@
                                        public views::ButtonListener,
                                        public ui::ImplicitAnimationObserver {
  public:
-  // The duration of the animation to show or hide the power button menu view.
-  static constexpr int kAnimationTimeoutMs = 500;
+  // The duration of showing or dismissing power button menu animation.
+  static constexpr base::TimeDelta kMenuAnimationDuration =
+      base::TimeDelta::FromMilliseconds(250);
 
   // Distance of the menu animation transform.
   static constexpr int kMenuViewTransformDistanceDp = 16;
diff --git a/ash/system/web_notification/web_notification_tray.cc b/ash/system/web_notification/web_notification_tray.cc
index 05bfb6e..da27a07c 100644
--- a/ash/system/web_notification/web_notification_tray.cc
+++ b/ash/system/web_notification/web_notification_tray.cc
@@ -40,16 +40,11 @@
 #include "ui/views/bubble/tray_bubble_view.h"
 #include "ui/views/controls/image_view.h"
 #include "ui/views/controls/label.h"
-#include "ui/views/controls/menu/menu_runner.h"
 #include "ui/views/layout/fill_layout.h"
 
 namespace ash {
 namespace {
 
-// Menu commands
-constexpr int kToggleQuietMode = 0;
-constexpr int kEnableQuietModeDay = 2;
-
 constexpr int kMaximumSmallIconCount = 3;
 
 constexpr int kTrayItemInnerIconSize = 16;
@@ -533,28 +528,6 @@
                                    false /* show_by_click */);
 }
 
-bool WebNotificationTray::IsCommandIdChecked(int command_id) const {
-  if (command_id != kToggleQuietMode)
-    return false;
-  return message_center()->IsQuietMode();
-}
-
-bool WebNotificationTray::IsCommandIdEnabled(int command_id) const {
-  return true;
-}
-
-void WebNotificationTray::ExecuteCommand(int command_id, int event_flags) {
-  if (command_id == kToggleQuietMode) {
-    bool in_quiet_mode = message_center()->IsQuietMode();
-    message_center()->SetQuietMode(!in_quiet_mode);
-    return;
-  }
-  base::TimeDelta expires_in = command_id == kEnableQuietModeDay
-                                   ? base::TimeDelta::FromDays(1)
-                                   : base::TimeDelta::FromHours(1);
-  message_center()->EnterQuietModeWithExpire(expires_in);
-}
-
 void WebNotificationTray::OnMessageCenterContentsChanged() {
   // Do not update the tray contents directly. Multiple change events can happen
   // consecutively, and calling Update in the middle of those events will show
diff --git a/ash/system/web_notification/web_notification_tray.h b/ash/system/web_notification/web_notification_tray.h
index 0c1976f1..818f783 100644
--- a/ash/system/web_notification/web_notification_tray.h
+++ b/ash/system/web_notification/web_notification_tray.h
@@ -13,7 +13,6 @@
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
-#include "ui/base/models/simple_menu_model.h"
 #include "ui/gfx/animation/animation_container.h"
 #include "ui/message_center/ui_delegate.h"
 #include "ui/views/bubble/tray_bubble_view.h"
@@ -45,8 +44,7 @@
 class ASH_EXPORT WebNotificationTray
     : public TrayBackgroundView,
       public message_center::UiDelegate,
-      public base::SupportsWeakPtr<WebNotificationTray>,
-      public ui::SimpleMenuModel::Delegate {
+      public base::SupportsWeakPtr<WebNotificationTray> {
  public:
   WebNotificationTray(Shelf* shelf, aura::Window* status_area_window);
   ~WebNotificationTray() override;
@@ -61,9 +59,6 @@
   // Returns the current tray bubble height or 0 if there is no bubble.
   int tray_bubble_height_for_test() const;
 
-  // Returns true if it should block the auto hide behavior of the shelf.
-  bool ShouldBlockShelfAutoHide() const;
-
   // Returns true if the message center bubble is visible.
   bool IsMessageCenterVisible() const;
 
@@ -96,11 +91,6 @@
   void HidePopups() override;
   bool ShowNotifierSettings() override;
 
-  // Overridden from ui::SimpleMenuModel::Delegate.
-  bool IsCommandIdChecked(int command_id) const override;
-  bool IsCommandIdEnabled(int command_id) const override;
-  void ExecuteCommand(int command_id, int event_flags) override;
-
   message_center::MessageCenter* message_center() const;
 
   message_center::UiController* message_center_ui_controller() {
@@ -134,15 +124,6 @@
   // the message center.
   bool ShouldShowMessageCenter() const;
 
-  // Returns true if it should show the quiet mode menu.
-  bool ShouldShowQuietModeMenu(const ui::Event& event);
-
-  // Shows the quiet mode menu.
-  void ShowQuietModeMenu(const ui::Event& event);
-
-  // Creates the menu model for quiet mode and returns it.
-  ui::MenuModel* CreateQuietModeMenu();
-
   WebNotificationBubbleWrapper* message_center_bubble() const {
     return message_center_bubble_.get();
   }
@@ -169,12 +150,6 @@
 
   bool should_update_tray_content_;
 
-  // True when the shelf auto hide behavior has to be blocked. Previously
-  // this was done by checking |message_center_bubble_| but actually
-  // the check can be called when creating this object, so it would cause
-  // flickers of the shelf from hidden to shown. See: crbug.com/181213
-  bool should_block_shelf_auto_hide_;
-
   std::unique_ptr<AshPopupAlignmentDelegate> popup_alignment_delegate_;
 
   DISALLOW_COPY_AND_ASSIGN(WebNotificationTray);
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 686f25d8..d61370b 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -1808,6 +1808,7 @@
     "ENABLE_PROFILING=$enable_profiling",
     "CAN_UNWIND_WITH_FRAME_POINTERS=$can_unwind_with_frame_pointers",
     "UNSAFE_DEVELOPER_BUILD=$is_unsafe_developer_build",
+    "CAN_UNWIND_WITH_CFI_TABLE=$can_unwind_with_cfi_table",
   ]
 }
 
diff --git a/base/memory/read_only_shared_memory_region.cc b/base/memory/read_only_shared_memory_region.cc
index dd9f7a6..8c0d2760 100644
--- a/base/memory/read_only_shared_memory_region.cc
+++ b/base/memory/read_only_shared_memory_region.cc
@@ -79,7 +79,7 @@
   return ReadOnlySharedMemoryMapping(memory, mapped_size, handle_.GetGUID());
 }
 
-bool ReadOnlySharedMemoryRegion::IsValid() {
+bool ReadOnlySharedMemoryRegion::IsValid() const {
   return handle_.IsValid();
 }
 
diff --git a/base/memory/read_only_shared_memory_region.h b/base/memory/read_only_shared_memory_region.h
index bccf42a..bef6baf 100644
--- a/base/memory/read_only_shared_memory_region.h
+++ b/base/memory/read_only_shared_memory_region.h
@@ -78,10 +78,10 @@
   ReadOnlySharedMemoryMapping MapAt(off_t offset, size_t size);
 
   // Whether the underlying platform handle is valid.
-  bool IsValid();
+  bool IsValid() const;
 
   // Returns the maximum mapping size that can be created from this region.
-  size_t GetSize() {
+  size_t GetSize() const {
     DCHECK(IsValid());
     return handle_.GetSize();
   }
diff --git a/base/memory/unsafe_shared_memory_region.cc b/base/memory/unsafe_shared_memory_region.cc
index 60f01ba..562e121e 100644
--- a/base/memory/unsafe_shared_memory_region.cc
+++ b/base/memory/unsafe_shared_memory_region.cc
@@ -59,7 +59,7 @@
   return WritableSharedMemoryMapping(memory, mapped_size, handle_.GetGUID());
 }
 
-bool UnsafeSharedMemoryRegion::IsValid() {
+bool UnsafeSharedMemoryRegion::IsValid() const {
   return handle_.IsValid();
 }
 
diff --git a/base/memory/unsafe_shared_memory_region.h b/base/memory/unsafe_shared_memory_region.h
index 0d792d8..b9048a24 100644
--- a/base/memory/unsafe_shared_memory_region.h
+++ b/base/memory/unsafe_shared_memory_region.h
@@ -79,10 +79,10 @@
   WritableSharedMemoryMapping MapAt(off_t offset, size_t size);
 
   // Whether the underlying platform handle is valid.
-  bool IsValid();
+  bool IsValid() const;
 
   // Returns the maximum mapping size that can be created from this region.
-  size_t GetSize() {
+  size_t GetSize() const {
     DCHECK(IsValid());
     return handle_.GetSize();
   }
diff --git a/base/memory/writable_shared_memory_region.cc b/base/memory/writable_shared_memory_region.cc
index 2048ef7..e2c3a26 100644
--- a/base/memory/writable_shared_memory_region.cc
+++ b/base/memory/writable_shared_memory_region.cc
@@ -66,7 +66,7 @@
   return WritableSharedMemoryMapping(memory, mapped_size, handle_.GetGUID());
 }
 
-bool WritableSharedMemoryRegion::IsValid() {
+bool WritableSharedMemoryRegion::IsValid() const {
   return handle_.IsValid();
 }
 
diff --git a/base/memory/writable_shared_memory_region.h b/base/memory/writable_shared_memory_region.h
index a6766ee..bfe61fe 100644
--- a/base/memory/writable_shared_memory_region.h
+++ b/base/memory/writable_shared_memory_region.h
@@ -75,10 +75,10 @@
   WritableSharedMemoryMapping MapAt(off_t offset, size_t size);
 
   // Whether underlying platform handles are valid.
-  bool IsValid();
+  bool IsValid() const;
 
   // Returns the maximum mapping size that can be created from this region.
-  size_t GetSize() {
+  size_t GetSize() const {
     DCHECK(IsValid());
     return handle_.GetSize();
   }
diff --git a/base/trace_event/heap_profiler_allocation_context_tracker.cc b/base/trace_event/heap_profiler_allocation_context_tracker.cc
index a375d3b9..eb5f128 100644
--- a/base/trace_event/heap_profiler_allocation_context_tracker.cc
+++ b/base/trace_event/heap_profiler_allocation_context_tracker.cc
@@ -15,6 +15,11 @@
 #include "base/threading/platform_thread.h"
 #include "base/threading/thread_local_storage.h"
 #include "base/trace_event/heap_profiler_allocation_context.h"
+#include "build/build_config.h"
+
+#if defined(OS_ANDROID) && BUILDFLAG(CAN_UNWIND_WITH_CFI_TABLE)
+#include "base/trace_event/cfi_backtrace_android.h"
+#endif
 
 #if defined(OS_LINUX) || defined(OS_ANDROID)
 #include <sys/prctl.h>
@@ -214,20 +219,26 @@
 // kMaxFrameCount + 1 frames, so that we know if there are more frames
 // than our backtrace capacity.
 #if !defined(OS_NACL)  // We don't build base/debug/stack_trace.cc for NaCl.
-#if BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS)
+#if defined(OS_ANDROID) && BUILDFLAG(CAN_UNWIND_WITH_CFI_TABLE)
+        const void* frames[Backtrace::kMaxFrameCount + 1];
+        static_assert(arraysize(frames) >= Backtrace::kMaxFrameCount,
+                      "not requesting enough frames to fill Backtrace");
+        size_t frame_count = CFIBacktraceAndroid::GetInstance()->Unwind(
+            frames, arraysize(frames));
+#elif BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS)
         const void* frames[Backtrace::kMaxFrameCount + 1];
         static_assert(arraysize(frames) >= Backtrace::kMaxFrameCount,
                       "not requesting enough frames to fill Backtrace");
         size_t frame_count = debug::TraceStackFramePointers(
             frames, arraysize(frames),
             1 /* exclude this function from the trace */);
-#else   // BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS)
+#else
         // Fall-back to capturing the stack with base::debug::StackTrace,
         // which is likely slower, but more reliable.
         base::debug::StackTrace stack_trace(Backtrace::kMaxFrameCount + 1);
         size_t frame_count = 0u;
         const void* const* frames = stack_trace.Addresses(&frame_count);
-#endif  // BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS)
+#endif
 
         // If there are too many frames, keep the ones furthest from main().
         size_t backtrace_capacity = backtrace_end - backtrace;
diff --git a/base/trace_event/memory_dump_manager.cc b/base/trace_event/memory_dump_manager.cc
index 71f4ce4..2514536 100644
--- a/base/trace_event/memory_dump_manager.cc
+++ b/base/trace_event/memory_dump_manager.cc
@@ -41,8 +41,13 @@
 
 #if defined(OS_ANDROID)
 #include "base/trace_event/java_heap_dump_provider_android.h"
+
+#if BUILDFLAG(CAN_UNWIND_WITH_CFI_TABLE)
+#include "base/trace_event/cfi_backtrace_android.h"
 #endif
 
+#endif  // defined(OS_ANDROID)
+
 namespace base {
 namespace trace_event {
 
@@ -273,8 +278,15 @@
       break;
 
     case kHeapProfilingModeNative:
-      // If we don't have frame pointers then native tracing falls-back to
-      // using base::debug::StackTrace, which may be slow.
+#if defined(OS_ANDROID) && BUILDFLAG(CAN_UNWIND_WITH_CFI_TABLE)
+    {
+      bool can_unwind =
+          CFIBacktraceAndroid::GetInstance()->can_unwind_stack_frames();
+      DCHECK(can_unwind);
+    }
+#endif
+      // If we don't have frame pointers and unwind tables then native tracing
+      // falls-back to using base::debug::StackTrace, which may be slow.
       AllocationContextTracker::SetCaptureMode(
           AllocationContextTracker::CaptureMode::NATIVE_STACK);
       break;
diff --git a/build/check_gn_headers_whitelist.txt b/build/check_gn_headers_whitelist.txt
index 843fcbf..3daeaad 100644
--- a/build/check_gn_headers_whitelist.txt
+++ b/build/check_gn_headers_whitelist.txt
@@ -211,7 +211,6 @@
 ppapi/native_client/src/untrusted/pnacl_irt_shim/irt_shim_ppapi.h
 ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.h
 ppapi/native_client/src/untrusted/pnacl_irt_shim/shim_ppapi.h
-ppapi/proxy/content_decryptor_private_serializer.h
 ppapi/proxy/dispatch_reply_message.h
 ppapi/proxy/plugin_proxy_delegate.h
 ppapi/proxy/plugin_resource_callback.h
diff --git a/build/config/android/extract_unwind_tables.gni b/build/config/android/extract_unwind_tables.gni
index 70f2d331..38035b9 100644
--- a/build/config/android/extract_unwind_tables.gni
+++ b/build/config/android/extract_unwind_tables.gni
@@ -31,11 +31,11 @@
       "--dump_syms_path",
       rebase_path("$root_out_dir/dump_syms", root_build_dir),
     ]
-    deps = [
-      ":${invoker.library_target}",
-      "//third_party/breakpad:dump_syms",
-    ]
+
+    deps = invoker.deps
+    deps += [ "//third_party/breakpad:dump_syms" ]
   }
+
   android_assets(target_name) {
     if (defined(invoker.testonly)) {
       testonly = invoker.testonly
diff --git a/build/config/win/BUILD.gn b/build/config/win/BUILD.gn
index ec4cf78c..9aa79ef0 100644
--- a/build/config/win/BUILD.gn
+++ b/build/config/win/BUILD.gn
@@ -115,25 +115,25 @@
     cflags += [ "/Brepro" ]
   }
 
-  # TODO(siggi): Is this of any use anymore?
-  # /PROFILE ensures that the PDB file contains FIXUP information (growing the
-  # PDB file by about 5%) but does not otherwise alter the output binary. It is
-  # enabled opportunistically for builds where it is not prohibited (not
-  # supported when incrementally linking, or using /debug:fastlink).
   if (!is_debug && !is_component_build) {
-    if (is_win_fastlink && !use_lld) {
-      # /PROFILE implies the following linker flags. Therefore if we are
-      # skipping /PROFILE because it is incompatible with /DEBUG:FASTLINK
-      # we should explicitly add these flags in order to avoid unintended
-      # consequences such as larger binaries.
-      ldflags = [
-        "/OPT:REF",
-        "/OPT:ICF",
-        "/INCREMENTAL:NO",
-        "/FIXED:NO",
-      ]
-    } else {
-      ldflags = [ "/PROFILE" ]
+    # Enable standard linker optimizations like GC (/OPT:REF) and ICF in static
+    # release builds. These are implied by /PROFILE below, but /PROFILE is
+    # incompatible with /debug:fastlink and LLD ignores it as of this writing.
+    # Release builds always want these optimizations, so enable them explicitly.
+    ldflags = [
+      "/OPT:REF",
+      "/OPT:ICF",
+      "/INCREMENTAL:NO",
+      "/FIXED:NO",
+    ]
+
+    # TODO(siggi): Is this of any use anymore?
+    # /PROFILE ensures that the PDB file contains FIXUP information (growing the
+    # PDB file by about 5%) but does not otherwise alter the output binary. It
+    # is enabled opportunistically for builds where it is not prohibited (not
+    # supported when incrementally linking, or using /debug:fastlink).
+    if (!is_win_fastlink) {
+      ldflags += [ "/PROFILE" ]
     }
   }
 
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 13d986f8..7485050 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -21,6 +21,7 @@
 import("channel.gni")
 import("java_sources.gni")
 import("static_initializers.gni")
+import("//build/config/android/extract_unwind_tables.gni")
 
 manifest_package = "org.chromium.chrome"
 
@@ -661,6 +662,7 @@
       "javatests/src/org/chromium/chrome/browser/vr_shell/VrInstallUpdateInfoBarTest.java",
       "javatests/src/org/chromium/chrome/browser/vr_shell/VrShellCompositorViewHolderTest.java",
       "javatests/src/org/chromium/chrome/browser/vr_shell/VrShellControllerInputTest.java",
+      "javatests/src/org/chromium/chrome/browser/vr_shell/VrShellDialogTest.java",
       "javatests/src/org/chromium/chrome/browser/vr_shell/VrShellNativeUiTest.java",
       "javatests/src/org/chromium/chrome/browser/vr_shell/VrShellNavigationTest.java",
       "javatests/src/org/chromium/chrome/browser/vr_shell/VrShellTransitionTest.java",
@@ -732,6 +734,22 @@
   }
 }
 
+# Enable stack unwinding only for local official builds. Enabling on all local
+# builds would increase build time for developers. Choosing a release channel
+# should be done based on the size of the unwind file and performance of
+# unwinding.
+_add_unwind_tables_in_apk = can_unwind_with_cfi_table && is_android &&
+                            is_official_build && android_channel == "default"
+
+if (_add_unwind_tables_in_apk) {
+  unwind_table_asset("chrome_public_unwind_assets") {
+    library_target = "chrome"
+    deps = [
+      ":libchrome",
+    ]
+  }
+}
+
 android_assets("chrome_public_pak_assets") {
   sources = [
     "$root_out_dir/chrome_100_percent.pak",
@@ -743,6 +761,9 @@
     ":chrome_public_locale_pak_assets",
     "//chrome:packed_resources",
   ]
+  if (_add_unwind_tables_in_apk) {
+    deps += [ ":chrome_public_unwind_assets" ]
+  }
 }
 
 # This target is separate from chrome_public_pak_assets because it does not
@@ -968,6 +989,15 @@
     ]
   }
 
+  if (_add_unwind_tables_in_apk) {
+    unwind_table_asset("monochrome_unwind_assets") {
+      library_target = "monochrome"
+      deps = [
+        ":monochrome",
+      ]
+    }
+  }
+
   # This target explicitly includes locale paks via deps.
   android_assets("monochrome_pak_assets") {
     sources = [
@@ -981,6 +1011,9 @@
       ":monochrome_paks",
       "//android_webview:locale_pak_assets",
     ]
+    if (_add_unwind_tables_in_apk) {
+      deps += [ ":monochrome_unwind_assets" ]
+    }
   }
 }  # current_toolchain == host_toolchain
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrShellDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrShellDialogTest.java
new file mode 100644
index 0000000..01d9564
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrShellDialogTest.java
@@ -0,0 +1,164 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.vr_shell;
+
+import static org.chromium.chrome.browser.vr_shell.TestFramework.POLL_TIMEOUT_LONG_MS;
+import static org.chromium.chrome.browser.vr_shell.VrTestFramework.PAGE_LOAD_TIMEOUT_S;
+import static org.chromium.chrome.browser.vr_shell.VrTestFramework.POLL_TIMEOUT_LONG_MS;
+import static org.chromium.chrome.browser.vr_shell.VrTestFramework.POLL_TIMEOUT_SHORT_MS;
+import static org.chromium.chrome.test.util.ChromeRestriction.RESTRICTION_TYPE_VIEWER_DAYDREAM;
+;
+
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.LargeTest;
+import android.support.test.uiautomator.UiDevice;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.Manual;
+import org.chromium.base.test.util.Restriction;
+import org.chromium.base.test.util.UrlUtils;
+import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.vr_shell.rules.ChromeTabbedActivityVrTestRule;
+import org.chromium.chrome.browser.vr_shell.util.TransitionUtils;
+import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+
+import java.io.File;
+import java.util.concurrent.TimeoutException;
+
+/**
+ * End-to-End test for capturing and comparing screen images for VR Browsering Dialogs
+ */
+@RunWith(ChromeJUnit4ClassRunner.class)
+@CommandLineFlags.
+Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "enable-features=VrBrowsingNativeAndroidUi"})
+@Restriction(RESTRICTION_TYPE_VIEWER_DAYDREAM)
+public class VrShellDialogTest {
+    private static final String TEST_IMAGE_DIR = "chrome/test/data/vr/UiCapture";
+    private static final File sBaseDirectory =
+            new File(UrlUtils.getIsolatedTestFilePath(TEST_IMAGE_DIR));
+
+    // We explicitly instantiate a rule here instead of using parameterization since this class
+    // only ever runs in ChromeTabbedActivity.
+    @Rule
+    public ChromeTabbedActivityVrTestRule mVrTestRule = new ChromeTabbedActivityVrTestRule();
+
+    private VrTestFramework mVrTestFramework;
+
+    @Before
+    public void setUp() throws Exception {
+        mVrTestFramework = new VrTestFramework(mVrTestRule);
+
+        // Create UiCapture image directory.
+        if (!sBaseDirectory.exists() && !sBaseDirectory.isDirectory()) {
+            Assert.assertTrue(sBaseDirectory.mkdirs());
+        }
+    }
+
+    private boolean captureScreen(String filename) {
+        File screenshotFile = new File(sBaseDirectory, filename + ".png");
+        if (screenshotFile.exists() && !screenshotFile.delete()) return false;
+
+        final UiDevice uiDevice =
+                UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
+
+        return uiDevice.takeScreenshot(screenshotFile);
+    }
+
+    private void displayDialog(String initialPage, String navigationCommand)
+            throws InterruptedException, TimeoutException {
+        mVrTestFramework.loadUrlAndAwaitInitialization(
+                VrTestFramework.getHtmlTestFile(initialPage), PAGE_LOAD_TIMEOUT_S);
+
+        // Display audio permissions prompt.
+        Assert.assertTrue(TransitionUtils.forceEnterVr());
+        TransitionUtils.waitForVrEntry(POLL_TIMEOUT_LONG_MS);
+        VrTestFramework.runJavaScriptOrFail(navigationCommand, POLL_TIMEOUT_SHORT_MS,
+                mVrTestFramework.getFirstTabWebContents());
+        TransitionUtils.waitForNativeUiPrompt(POLL_TIMEOUT_LONG_MS);
+
+        // There is currently no way to know whether a dialog has been drawn yet,
+        // so sleep long enough for it to show up.
+        Thread.sleep(1000);
+    }
+
+    /**
+     *Test navigate to 2D page and launch the Microphone dialog.
+     */
+    @Test
+    @Manual
+    @LargeTest
+    public void microphoneDialogTest() throws InterruptedException, TimeoutException {
+        // Display audio permissions prompt.
+        displayDialog(
+                "test_navigation_2d_page", "navigator.getUserMedia({audio: true}, ()=>{}, ()=>{})");
+
+        // Capture image
+        Assert.assertTrue(captureScreen("MicrophoneDialogTestImage"));
+    }
+
+    /**
+     *Test navigate to 2D page and launch the Camera dialog.
+     */
+    @Test
+    @Manual
+    @LargeTest
+    public void cameraDialogTest() throws InterruptedException, TimeoutException {
+        // Display Camera permissions prompt.
+        displayDialog(
+                "test_navigation_2d_page", "navigator.getUserMedia({video: true}, ()=>{}, ()=>{})");
+
+        // Capture image
+        Assert.assertTrue(captureScreen("CameraDialogTestImage"));
+    }
+
+    /**
+     *Test navigate to 2D page and launch the Location dialog.
+     */
+    @Test
+    @Manual
+    @LargeTest
+    public void locationDialogTest() throws InterruptedException, TimeoutException {
+        // Display Location permissions prompt.
+        displayDialog("test_navigation_2d_page",
+                "navigator.geolocation.getCurrentPosition(()=>{}, ()=>{})");
+
+        // Capture image
+        Assert.assertTrue(captureScreen("LocationDialogTestImage"));
+    }
+
+    /**
+     *Test navigate to 2D page and launch the Notifications dialog.
+     */
+    @Test
+    @Manual
+    @LargeTest
+    public void notificationDialogTest() throws InterruptedException, TimeoutException {
+        // Display Notification permissions prompt.
+        displayDialog("test_navigation_2d_page", "Notification.requestPermission(()=>{})");
+
+        // Capture image
+        Assert.assertTrue(captureScreen("NotificationDialogTestImage"));
+    }
+
+    /**
+     *Test navigate to 2D page and launch the MIDI dialog.
+     */
+    @Test
+    @Manual
+    @LargeTest
+    public void midiDialogTest() throws InterruptedException, TimeoutException {
+        // Display MIDI permissions prompt.
+        displayDialog("test_navigation_2d_page", "navigator.requestMIDIAccess({sysex: true})");
+
+        // Capture image
+        Assert.assertTrue(captureScreen("MidiDialogTestImage"));
+    }
+}
\ No newline at end of file
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index add4fc40..a2649aa 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -6267,9 +6267,6 @@
       <message name="IDS_LOAD_STATE_WAITING_FOR_RESPONSE">
         Waiting for <ph name="HOST_NAME">$1<ex>www.google.com</ex></ph>...
       </message>
-      <message name="IDS_LOAD_STATE_THROTTLED" desc="Tab status shown when tab loading is blocked on other in process network operations">
-        Waiting for other requests to complete...
-      </message>
 
       <!-- Tab Context Menu -->
       <if expr="not use_titlecase">
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index 066d0d7..b0204584 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -3703,9 +3703,6 @@
     <message name="IDS_SETTINGS_DISPLAY_ZOOM_TITLE" desc="In Device Settings > Displays, the title for the section for changing the display's zoom.">
       Display Size
     </message>
-    <message name="IDS_SETTINGS_DISPLAY_ZOOM_SUBLABEL" desc="In Device Settings > Displays, the text describing the display's zoom.">
-      Make items on your screen smaller or larger
-    </message>
     <message name="IDS_SETTINGS_DISPLAY_ZOOM_VALUE" desc="The currently selected display zoom percentage.">
       <ph name="DISPLAY_ZOOM">$1<ex>120</ex>%</ph>
     </message>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 94b6a40..2bdcc5b 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -2617,6 +2617,7 @@
       "resource_coordinator/lifecycle_unit.h",
       "resource_coordinator/lifecycle_unit_base.cc",
       "resource_coordinator/lifecycle_unit_base.h",
+      "resource_coordinator/lifecycle_unit_observer.cc",
       "resource_coordinator/lifecycle_unit_observer.h",
       "resource_coordinator/lifecycle_unit_source.h",
       "resource_coordinator/lifecycle_unit_source_base.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 047d35a1..dc16141 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -3657,6 +3657,13 @@
      FEATURE_VALUE_TYPE(features::kWebAuth)},
 #endif  // !defined(OS_ANDROID)
 
+#if !defined(OS_ANDROID)
+    {"enable-web-authentication-testing-api",
+     flag_descriptions::kEnableWebAuthenticationTestingAPIName,
+     flag_descriptions::kEnableWebAuthenticationTestingAPIDescription,
+     kOsDesktop, SINGLE_VALUE_TYPE(switches::kEnableWebAuthTestingAPI)},
+#endif  // !defined(OS_ANDROID)
+
 #if defined(OS_ANDROID)
     {"enable-sole-integration", flag_descriptions::kSoleIntegrationName,
      flag_descriptions::kSoleIntegrationDescription, kOsAndroid,
diff --git a/chrome/browser/chromeos/login/kiosk_browsertest.cc b/chrome/browser/chromeos/login/kiosk_browsertest.cc
index 9f8bf08..5fcfa03ec 100644
--- a/chrome/browser/chromeos/login/kiosk_browsertest.cc
+++ b/chrome/browser/chromeos/login/kiosk_browsertest.cc
@@ -941,7 +941,7 @@
   ASSERT_TRUE(GetAppLaunchController()->showing_network_dialog());
 
   // Continue button should be visible since we are online.
-  JsExpect("$('continue-network-config-btn').hidden == false");
+  JsExpect("$('error-message-md-continue-button').hidden == false");
 
   // Let app launching resume.
   AppLaunchController::SetBlockAppLaunchForTesting(false);
@@ -951,7 +951,7 @@
       GetLoginUI()->GetWebContents(),
       "(function() {"
       "var e = new Event('click');"
-      "$('continue-network-config-btn').dispatchEvent(e);"
+      "$('error-message-md-continue-button').dispatchEvent(e);"
       "})();"));
 
   WaitForAppLaunchSuccess();
diff --git a/chrome/browser/chromeos/login/wizard_controller_browsertest.cc b/chrome/browser/chromeos/login/wizard_controller_browsertest.cc
index 306b9a47c..51429e7 100644
--- a/chrome/browser/chromeos/login/wizard_controller_browsertest.cc
+++ b/chrome/browser/chromeos/login/wizard_controller_browsertest.cc
@@ -1053,8 +1053,7 @@
   // Emulates user click on the "Restart and Powerwash" button.
   ASSERT_EQ(0, fake_session_manager_client()->start_device_wipe_call_count());
   ASSERT_TRUE(content::ExecuteScript(
-      GetWebContents(),
-      "$('error-message-restart-and-powerwash-button').click();"));
+      GetWebContents(), "$('error-message-md-powerwash-button').click();"));
   ASSERT_EQ(1, fake_session_manager_client()->start_device_wipe_call_count());
 }
 
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 3a33981..c63a5a8 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -2360,9 +2360,16 @@
     "Show a microphone for voice search on the local New Tab page "
     "if Google is the default search engine.";
 
-const char kEnableWebAuthenticationAPIName[] = "Web Authentication API.";
+const char kEnableWebAuthenticationAPIName[] = "Web Authentication API";
 const char kEnableWebAuthenticationAPIDescription[] =
-    "Enable Web Authentication API support.";
+    "Enable Web Authentication API support";
+
+const char kEnableWebAuthenticationTestingAPIName[] =
+    "Web Authentication Testing API";
+const char kEnableWebAuthenticationTestingAPIDescription[] =
+    "Enable Web Authentication Testing API support, which disconnects the API "
+    "implementation from the real world, and allows configuring virtual "
+    "authenticator devices for testing";
 
 #if defined(GOOGLE_CHROME_BUILD)
 
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index eaa1b2a7..621c289a 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1440,6 +1440,9 @@
 extern const char kEnableWebAuthenticationAPIName[];
 extern const char kEnableWebAuthenticationAPIDescription[];
 
+extern const char kEnableWebAuthenticationTestingAPIName[];
+extern const char kEnableWebAuthenticationTestingAPIDescription[];
+
 #if defined(GOOGLE_CHROME_BUILD)
 
 extern const char kGoogleBrandedContextMenuName[];
diff --git a/chrome/browser/media/router/media_router_metrics.h b/chrome/browser/media/router/media_router_metrics.h
index cfee5c5..6f676ac9 100644
--- a/chrome/browser/media/router/media_router_metrics.h
+++ b/chrome/browser/media/router/media_router_metrics.h
@@ -10,7 +10,7 @@
 #include "base/gtest_prod_util.h"
 #include "base/time/time.h"
 #include "chrome/browser/media/router/discovery/dial/safe_dial_device_description_parser.h"
-#include "chrome/browser/ui/webui/media_router/media_cast_mode.h"
+#include "chrome/browser/ui/media_router/media_cast_mode.h"
 #include "media/base/container_names.h"
 
 class GURL;
diff --git a/chrome/browser/media/router/media_router_metrics_unittest.cc b/chrome/browser/media/router/media_router_metrics_unittest.cc
index f2c8625..b8723ac5 100644
--- a/chrome/browser/media/router/media_router_metrics_unittest.cc
+++ b/chrome/browser/media/router/media_router_metrics_unittest.cc
@@ -9,7 +9,7 @@
 #include "base/test/histogram_tester.h"
 #include "base/test/simple_test_clock.h"
 #include "base/time/time.h"
-#include "chrome/browser/ui/webui/media_router/media_cast_mode.h"
+#include "chrome/browser/ui/media_router/media_cast_mode.h"
 #include "chrome/common/media_router/media_sink.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/resource_coordinator/discard_metrics_lifecycle_unit_observer.cc b/chrome/browser/resource_coordinator/discard_metrics_lifecycle_unit_observer.cc
index 0fcd3fa..a3aa787 100644
--- a/chrome/browser/resource_coordinator/discard_metrics_lifecycle_unit_observer.cc
+++ b/chrome/browser/resource_coordinator/discard_metrics_lifecycle_unit_observer.cc
@@ -25,10 +25,6 @@
     OnReload();
 }
 
-void DiscardMetricsLifecycleUnitObserver::OnLifecycleUnitVisibilityChanged(
-    LifecycleUnit* lifecycle_unit,
-    content::Visibility visibility) {}
-
 void DiscardMetricsLifecycleUnitObserver::OnLifecycleUnitDestroyed(
     LifecycleUnit* lifecycle_unit) {
   // If the browser is not shutting down and the tab is in a LOADED state after
diff --git a/chrome/browser/resource_coordinator/discard_metrics_lifecycle_unit_observer.h b/chrome/browser/resource_coordinator/discard_metrics_lifecycle_unit_observer.h
index e38997f6..a8d5a6cb 100644
--- a/chrome/browser/resource_coordinator/discard_metrics_lifecycle_unit_observer.h
+++ b/chrome/browser/resource_coordinator/discard_metrics_lifecycle_unit_observer.h
@@ -20,9 +20,6 @@
 
   // LifecycleUnitObserver:
   void OnLifecycleUnitStateChanged(LifecycleUnit* lifecycle_unit) override;
-  void OnLifecycleUnitVisibilityChanged(
-      LifecycleUnit* lifecycle_unit,
-      content::Visibility visibility) override;
   void OnLifecycleUnitDestroyed(LifecycleUnit* lifecycle_unit) override;
 
  private:
diff --git a/chrome/browser/resource_coordinator/lifecycle_unit_observer.cc b/chrome/browser/resource_coordinator/lifecycle_unit_observer.cc
new file mode 100644
index 0000000..1150ae5
--- /dev/null
+++ b/chrome/browser/resource_coordinator/lifecycle_unit_observer.cc
@@ -0,0 +1,21 @@
+// Copyright 2018 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/resource_coordinator/lifecycle_unit_observer.h"
+
+namespace resource_coordinator {
+
+LifecycleUnitObserver::~LifecycleUnitObserver() = default;
+
+void LifecycleUnitObserver::OnLifecycleUnitStateChanged(
+    LifecycleUnit* lifecycle_unit) {}
+
+void LifecycleUnitObserver::OnLifecycleUnitVisibilityChanged(
+    LifecycleUnit* lifecycle_unit,
+    content::Visibility visibility) {}
+
+void LifecycleUnitObserver::OnLifecycleUnitDestroyed(
+    LifecycleUnit* lifecycle_unit) {}
+
+}  // namespace resource_coordinator
diff --git a/chrome/browser/resource_coordinator/lifecycle_unit_observer.h b/chrome/browser/resource_coordinator/lifecycle_unit_observer.h
index 756c420e..b7d9ce3 100644
--- a/chrome/browser/resource_coordinator/lifecycle_unit_observer.h
+++ b/chrome/browser/resource_coordinator/lifecycle_unit_observer.h
@@ -14,19 +14,18 @@
 // Interface to be notified when the state of a LifecycleUnit changes.
 class LifecycleUnitObserver {
  public:
-  virtual ~LifecycleUnitObserver() = default;
+  virtual ~LifecycleUnitObserver();
 
   // Invoked when the state of the observed LifecycleUnit changes.
-  virtual void OnLifecycleUnitStateChanged(LifecycleUnit* lifecycle_unit) = 0;
+  virtual void OnLifecycleUnitStateChanged(LifecycleUnit* lifecycle_unit);
 
   // Invoked when the visibility of the observed LifecyleUnit changes.
-  virtual void OnLifecycleUnitVisibilityChanged(
-      LifecycleUnit* lifecycle_unit,
-      content::Visibility visibility) = 0;
+  virtual void OnLifecycleUnitVisibilityChanged(LifecycleUnit* lifecycle_unit,
+                                                content::Visibility visibility);
 
   // Invoked before the observed LifecycleUnit starts being destroyed (i.e.
   // |lifecycle_unit| is still valid when this is invoked).
-  virtual void OnLifecycleUnitDestroyed(LifecycleUnit* lifecycle_unit) = 0;
+  virtual void OnLifecycleUnitDestroyed(LifecycleUnit* lifecycle_unit);
 };
 
 }  // namespace resource_coordinator
diff --git a/chrome/browser/resource_coordinator/tab_lifecycle_unit_source.cc b/chrome/browser/resource_coordinator/tab_lifecycle_unit_source.cc
index 41e54f1..170c6620 100644
--- a/chrome/browser/resource_coordinator/tab_lifecycle_unit_source.cc
+++ b/chrome/browser/resource_coordinator/tab_lifecycle_unit_source.cc
@@ -14,6 +14,7 @@
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "content/public/browser/web_contents_user_data.h"
 
 namespace resource_coordinator {
 
@@ -21,6 +22,31 @@
 TabLifecycleUnitSource* instance_ = nullptr;
 }  // namespace
 
+// Allows storage of a TabLifecycleUnit on a WebContents.
+class TabLifecycleUnitSource::TabLifecycleUnitHolder
+    : public content::WebContentsUserData<
+          TabLifecycleUnitSource::TabLifecycleUnitHolder> {
+ public:
+  ~TabLifecycleUnitHolder() override = default;
+
+  TabLifecycleUnit* lifecycle_unit() const { return lifecycle_unit_.get(); }
+  void set_lifecycle_unit(std::unique_ptr<TabLifecycleUnit> lifecycle_unit) {
+    lifecycle_unit_ = std::move(lifecycle_unit);
+  }
+  std::unique_ptr<TabLifecycleUnit> TakeTabLifecycleUnit() {
+    return std::move(lifecycle_unit_);
+  }
+
+ private:
+  friend class content::WebContentsUserData<TabLifecycleUnitHolder>;
+
+  explicit TabLifecycleUnitHolder(content::WebContents*) {}
+
+  std::unique_ptr<TabLifecycleUnit> lifecycle_unit_;
+
+  DISALLOW_COPY_AND_ASSIGN(TabLifecycleUnitHolder);
+};
+
 TabLifecycleUnitSource::TabLifecycleUnitSource()
     : browser_tab_strip_tracker_(this, nullptr, this) {
   DCHECK(!instance_);
@@ -41,10 +67,7 @@
 
 TabLifecycleUnitExternal* TabLifecycleUnitSource::GetTabLifecycleUnitExternal(
     content::WebContents* web_contents) const {
-  auto it = tabs_.find(web_contents);
-  if (it == tabs_.end())
-    return nullptr;
-  return it->second.get();
+  return GetTabLifecycleUnit(web_contents);
 }
 
 void TabLifecycleUnitSource::AddTabLifecycleObserver(
@@ -63,6 +86,15 @@
   UpdateFocusedTab();
 }
 
+TabLifecycleUnitSource::TabLifecycleUnit*
+TabLifecycleUnitSource::GetTabLifecycleUnit(
+    content::WebContents* web_contents) const {
+  auto* holder = TabLifecycleUnitHolder::FromWebContents(web_contents);
+  if (holder)
+    return holder->lifecycle_unit();
+  return nullptr;
+}
+
 TabStripModel* TabLifecycleUnitSource::GetFocusedTabStripModel() const {
   if (focused_tab_strip_model_for_testing_)
     return focused_tab_strip_model_for_testing_;
@@ -77,34 +109,41 @@
   content::WebContents* const focused_web_contents =
       focused_tab_strip_model ? focused_tab_strip_model->GetActiveWebContents()
                               : nullptr;
-  DCHECK(!focused_web_contents ||
-         base::ContainsKey(tabs_, focused_web_contents));
-  UpdateFocusedTabTo(focused_web_contents ? tabs_[focused_web_contents].get()
-                                          : nullptr);
+  TabLifecycleUnit* focused_lifecycle_unit =
+      focused_web_contents ? GetTabLifecycleUnit(focused_web_contents)
+                           : nullptr;
+  DCHECK(!focused_web_contents || focused_lifecycle_unit);
+  UpdateFocusedTabTo(focused_lifecycle_unit);
 }
 
 void TabLifecycleUnitSource::UpdateFocusedTabTo(
-    TabLifecycleUnit* new_focused_tab_lifecycle_unit) {
-  if (new_focused_tab_lifecycle_unit == focused_tab_lifecycle_unit_)
+    TabLifecycleUnit* new_focused_lifecycle_unit) {
+  if (new_focused_lifecycle_unit == focused_lifecycle_unit_)
     return;
-  if (focused_tab_lifecycle_unit_)
-    focused_tab_lifecycle_unit_->SetFocused(false);
-  if (new_focused_tab_lifecycle_unit)
-    new_focused_tab_lifecycle_unit->SetFocused(true);
-  focused_tab_lifecycle_unit_ = new_focused_tab_lifecycle_unit;
+  if (focused_lifecycle_unit_)
+    focused_lifecycle_unit_->SetFocused(false);
+  if (new_focused_lifecycle_unit)
+    new_focused_lifecycle_unit->SetFocused(true);
+  focused_lifecycle_unit_ = new_focused_lifecycle_unit;
 }
 
 void TabLifecycleUnitSource::TabInsertedAt(TabStripModel* tab_strip_model,
                                            content::WebContents* contents,
                                            int index,
                                            bool foreground) {
-  auto it = tabs_.find(contents);
-  if (it == tabs_.end()) {
+  TabLifecycleUnit* lifecycle_unit = GetTabLifecycleUnit(contents);
+  if (lifecycle_unit) {
+    // An existing tab was moved to a new window.
+    lifecycle_unit->SetTabStripModel(tab_strip_model);
+    if (foreground)
+      UpdateFocusedTab();
+  } else {
     // A tab was created.
-    auto res = tabs_.insert(std::make_pair(
-        contents, std::make_unique<TabLifecycleUnit>(
-                      &tab_lifecycle_observers_, contents, tab_strip_model)));
-    TabLifecycleUnit* lifecycle_unit = res.first->second.get();
+    TabLifecycleUnitHolder::CreateForWebContents(contents);
+    auto* holder = TabLifecycleUnitHolder::FromWebContents(contents);
+    holder->set_lifecycle_unit(std::make_unique<TabLifecycleUnit>(
+        &tab_lifecycle_observers_, contents, tab_strip_model));
+    TabLifecycleUnit* lifecycle_unit = holder->lifecycle_unit();
     if (GetFocusedTabStripModel() == tab_strip_model && foreground)
       UpdateFocusedTabTo(lifecycle_unit);
 
@@ -112,39 +151,14 @@
     lifecycle_unit->AddObserver(new DiscardMetricsLifecycleUnitObserver());
 
     NotifyLifecycleUnitCreated(lifecycle_unit);
-  } else {
-    // A tab was moved to another window.
-    it->second->SetTabStripModel(tab_strip_model);
-    if (foreground)
-      UpdateFocusedTab();
   }
 }
 
-void TabLifecycleUnitSource::TabClosingAt(TabStripModel* tab_strip_model,
-                                          content::WebContents* contents,
-                                          int index) {
-  auto it = tabs_.find(contents);
-  DCHECK(it != tabs_.end());
-  TabLifecycleUnit* lifecycle_unit = it->second.get();
-  if (focused_tab_lifecycle_unit_ == lifecycle_unit)
-    UpdateFocusedTabTo(nullptr);
-  tabs_.erase(contents);
-}
-
 void TabLifecycleUnitSource::TabDetachedAt(content::WebContents* contents,
                                            int index) {
-  auto it = tabs_.find(contents);
-
-  // TabDetachedAt() can be called after the TabLifecycleUnit has been destroyed
-  // by TabClosingAt().
-  // TODO(fdoray): Changed this to a DCHECK once TabLifecycleUnits are destroyed
-  // from WebContentsDestroyed() rather than TabClosingAt().
-  // https://crbug.com/775644
-  if (it == tabs_.end())
-    return;
-
-  TabLifecycleUnit* lifecycle_unit = it->second.get();
-  if (focused_tab_lifecycle_unit_ == lifecycle_unit)
+  TabLifecycleUnit* lifecycle_unit = GetTabLifecycleUnit(contents);
+  DCHECK(lifecycle_unit);
+  if (focused_lifecycle_unit_ == lifecycle_unit)
     UpdateFocusedTabTo(nullptr);
   lifecycle_unit->SetTabStripModel(nullptr);
 }
@@ -161,13 +175,18 @@
                                            content::WebContents* old_contents,
                                            content::WebContents* new_contents,
                                            int index) {
-  DCHECK(!base::ContainsKey(tabs_, new_contents));
-  auto it = tabs_.find(old_contents);
-  DCHECK(it != tabs_.end());
-  std::unique_ptr<TabLifecycleUnit> lifecycle_unit = std::move(it->second);
-  lifecycle_unit->SetWebContents(new_contents);
-  tabs_.erase(it);
-  tabs_[new_contents] = std::move(lifecycle_unit);
+  auto* old_contents_holder =
+      TabLifecycleUnitHolder::FromWebContents(old_contents);
+  DCHECK(old_contents_holder);
+  DCHECK(old_contents_holder->lifecycle_unit());
+  TabLifecycleUnitHolder::CreateForWebContents(new_contents);
+  auto* new_contents_holder =
+      TabLifecycleUnitHolder::FromWebContents(new_contents);
+  DCHECK(new_contents_holder);
+  DCHECK(!new_contents_holder->lifecycle_unit());
+  new_contents_holder->set_lifecycle_unit(
+      old_contents_holder->TakeTabLifecycleUnit());
+  new_contents_holder->lifecycle_unit()->SetWebContents(new_contents);
 }
 
 void TabLifecycleUnitSource::TabChangedAt(content::WebContents* contents,
@@ -175,9 +194,8 @@
                                           TabChangeType change_type) {
   if (change_type != TabChangeType::kAll)
     return;
-  auto it = tabs_.find(contents);
-  DCHECK(it != tabs_.end());
-  TabLifecycleUnit* lifecycle_unit = it->second.get();
+  TabLifecycleUnit* lifecycle_unit = GetTabLifecycleUnit(contents);
+  DCHECK(lifecycle_unit);
   lifecycle_unit->SetRecentlyAudible(contents->WasRecentlyAudible());
 }
 
@@ -190,3 +208,6 @@
 }
 
 }  // namespace resource_coordinator
+
+DEFINE_WEB_CONTENTS_USER_DATA_KEY(
+    resource_coordinator::TabLifecycleUnitSource::TabLifecycleUnitHolder);
diff --git a/chrome/browser/resource_coordinator/tab_lifecycle_unit_source.h b/chrome/browser/resource_coordinator/tab_lifecycle_unit_source.h
index 37478b60b..73ffb01 100644
--- a/chrome/browser/resource_coordinator/tab_lifecycle_unit_source.h
+++ b/chrome/browser/resource_coordinator/tab_lifecycle_unit_source.h
@@ -7,7 +7,6 @@
 
 #include <memory>
 
-#include "base/containers/flat_map.h"
 #include "base/macros.h"
 #include "base/observer_list.h"
 #include "chrome/browser/resource_coordinator/lifecycle_unit_source_base.h"
@@ -37,7 +36,7 @@
   static TabLifecycleUnitSource* GetInstance();
 
   // Returns the TabLifecycleUnitExternal instance associated with
-  // |web_contents|, or nullptr if |web_contents| isn't associated with a tab.
+  // |web_contents|, or nullptr if |web_contents| isn't a tab.
   TabLifecycleUnitExternal* GetTabLifecycleUnitExternal(
       content::WebContents* web_contents) const;
 
@@ -49,31 +48,35 @@
   // Pretend that |tab_strip| is the TabStripModel of the focused window.
   void SetFocusedTabStripModelForTesting(TabStripModel* tab_strip);
 
+  class TabLifecycleUnitHolder;
+
  private:
   friend class TabLifecycleUnitTest;
 
   class TabLifecycleUnit;
 
+  // Returns the TabLifecycleUnit instance associated with |web_contents|, or
+  // nullptr if |web_contents| isn't a tab.
+  TabLifecycleUnit* GetTabLifecycleUnit(
+      content::WebContents* web_contents) const;
+
   // Returns the TabStripModel of the focused browser window, if any.
   TabStripModel* GetFocusedTabStripModel() const;
 
   // Updates the focused TabLifecycleUnit.
   void UpdateFocusedTab();
 
-  // Updates the focused TabLifecycleUnit to |new_focused_tab_lifecycle_unit|.
+  // Updates the focused TabLifecycleUnit to |new_focused_lifecycle_unit|.
   // TabInsertedAt() calls this directly instead of UpdateFocusedTab() because
   // the active WebContents of a TabStripModel isn't updated when
   // TabInsertedAt() is called.
-  void UpdateFocusedTabTo(TabLifecycleUnit* new_focused_tab_lifecycle_unit);
+  void UpdateFocusedTabTo(TabLifecycleUnit* new_focused_lifecycle_unit);
 
   // TabStripModelObserver:
   void TabInsertedAt(TabStripModel* tab_strip_model,
                      content::WebContents* contents,
                      int index,
                      bool foreground) override;
-  void TabClosingAt(TabStripModel* tab_strip_model,
-                    content::WebContents* contents,
-                    int index) override;
   void TabDetachedAt(content::WebContents* contents, int index) override;
   void ActiveTabChanged(content::WebContents* old_contents,
                         content::WebContents* new_contents,
@@ -98,12 +101,7 @@
   TabStripModel* focused_tab_strip_model_for_testing_ = nullptr;
 
   // The currently focused TabLifecycleUnit. Updated by UpdateFocusedTab().
-  TabLifecycleUnit* focused_tab_lifecycle_unit_ = nullptr;
-
-  // Map from content::WebContents to TabLifecycleUnit. Should contain an entry
-  // for each tab in the current Chrome instance.
-  base::flat_map<content::WebContents*, std::unique_ptr<TabLifecycleUnit>>
-      tabs_;
+  TabLifecycleUnit* focused_lifecycle_unit_ = nullptr;
 
   // Observers notified when the discarded or auto-discardable state of a tab
   // changes.
diff --git a/chrome/browser/resource_coordinator/tab_lifecycle_unit_source_unittest.cc b/chrome/browser/resource_coordinator/tab_lifecycle_unit_source_unittest.cc
index 9ded1ea..82482cf 100644
--- a/chrome/browser/resource_coordinator/tab_lifecycle_unit_source_unittest.cc
+++ b/chrome/browser/resource_coordinator/tab_lifecycle_unit_source_unittest.cc
@@ -357,6 +357,28 @@
                                   {first_lifecycle_unit});
 }
 
+// Regression test for https://crbug.com/818454. Previously, TabLifecycleUnits
+// were destroyed from TabStripModelObserver::TabClosingAt(). If a tab was
+// detached (TabStripModel::DetachWebContentsAt) and its WebContents destroyed,
+// the TabLifecycleUnit was never destroyed. This was solved by giving ownership
+// of a TabLifecycleUnit to a WebContentsUserData.
+TEST_F(TabLifecycleUnitSourceTest, DetachAndDeleteWebContents) {
+  LifecycleUnit* first_lifecycle_unit = nullptr;
+  LifecycleUnit* second_lifecycle_unit = nullptr;
+  CreateTwoTabs(true /* focus_tab_strip */, &first_lifecycle_unit,
+                &second_lifecycle_unit);
+
+  testing::StrictMock<MockLifecycleUnitObserver> observer;
+  first_lifecycle_unit->AddObserver(&observer);
+
+  // Detach and destroy the non-active tab. Verify that the LifecycleUnit is
+  // destroyed.
+  tab_strip_model_->DetachWebContentsAt(0);
+  EXPECT_CALL(observer, OnLifecycleUnitDestroyed(first_lifecycle_unit));
+  delete first_lifecycle_unit->AsTabLifecycleUnitExternal()->GetWebContents();
+  testing::Mock::VerifyAndClear(&observer);
+}
+
 // Tab discarding is tested here rather than in TabLifecycleUnitTest because
 // collaboration from the TabLifecycleUnitSource is required to replace the
 // WebContents in the TabLifecycleUnit.
diff --git a/chrome/browser/resources/chromeos/login/oobe_buttons.js b/chrome/browser/resources/chromeos/login/oobe_buttons.js
index c14e362..888b0e0 100644
--- a/chrome/browser/resources/chromeos/login/oobe_buttons.js
+++ b/chrome/browser/resources/chromeos/login/oobe_buttons.js
@@ -92,4 +92,8 @@
   updateIconVisibility_: function() {
     this.$.icon.hidden = (this.icon1x === undefined || this.icon1x.length == 0);
   },
+
+  click: function() {
+    this.$.button.click();
+  },
 });
diff --git a/chrome/browser/resources/chromeos/login/screen_error_message.css b/chrome/browser/resources/chromeos/login/screen_error_message.css
index c4db312..9d65abb2 100644
--- a/chrome/browser/resources/chromeos/login/screen_error_message.css
+++ b/chrome/browser/resources/chromeos/login/screen_error_message.css
@@ -3,10 +3,6 @@
  * found in the LICENSE file. */
 
 #error-message {
-  width: 650px;
-}
-
-#error-message[md-mode] {
   width: 768px;
 }
 
@@ -46,16 +42,6 @@
   display: block;
 }
 
-#error-message-classic .error-header {
-  background-clip: padding-box;
-  background-color: white;
-  border-bottom: 1px solid rgb(238,238,238);
-  padding: 71px 20px 50px;
-  text-align: center;
-  /* A hack used to prevent aliasing on High-DPI displays. */
-  transform: scale3d(1,1,1);
-}
-
 .error-icon {
   height: 64px;
   margin-bottom: 40px;
@@ -65,31 +51,9 @@
   display: none;
 }
 
-#error-message-classic .error-title {
-  color: #606060;
-  font-size: 15px;
-}
-
-#error-message-classic .error-body {
-  background-color: rgb(249,249,249);
-  padding: 20px 20px 20px;
-}
-
-.error-controls {
-  background-color: rgb(249,249,249);
-  padding: 20px 20px 20px;
-}
-
 .error-message-paragraph {
   font-size: 12px;
   line-height: 18px;
-}
-
-#error-message-classic .error-message-paragraph {
-  margin-top: 20px;
-}
-
-#error-message-md .error-message-paragraph {
   margin-bottom: 20px;
 }
 
@@ -147,15 +111,6 @@
   animation: connecting-indicator-ellipsis 3s 1s infinite;
 }
 
-#error-navigation {
-  color: rgba(0, 0, 0, .54);
-  left: 0;
-  position: absolute;
-  right: 0;
-  top: 0;
-  z-index: 1;
-}
-
 #error-message-md-bottom-margin {
   height: 24px;
 }
diff --git a/chrome/browser/resources/chromeos/login/screen_error_message.html b/chrome/browser/resources/chromeos/login/screen_error_message.html
index ce8b8801..eb51a008 100644
--- a/chrome/browser/resources/chromeos/login/screen_error_message.html
+++ b/chrome/browser/resources/chromeos/login/screen_error_message.html
@@ -12,77 +12,36 @@
     </svg>
   </iron-iconset-svg>
 
-  <oobe-dialog role="dialog" id="error-message-md" has-buttons hidden>
+  <oobe-dialog role="dialog" id="error-message-md" has-buttons>
     <iron-icon icon="error-message-24:dialog-icon" class="oobe-icon">
     </iron-icon>
     <div class="header">
-      <h1 id="error-message-md-header" class="title"></h1>
+      <h1 id="error-message-md-header" class="title">
+        <div id="error-header-id" class="error-header" aria-live="assertive">
+          <img alt class="error-icon"
+              src="chrome://theme/IDR_ERROR_NETWORK_OFFLINE">
+          <div id="captive-portal-title" i18n-content="captivePortalTitle"
+              class="error-title
+                     show-with-error-state-portal
+                     show-with-error-state-offline"></div>
+          <div id="login-error-title" i18n-content="loginErrorTitle"
+              class="error-title
+                     show-with-error-state-proxy
+                     show-with-error-state-auth-ext-timeout
+                     show-with-ui-state-local-state-error">
+          </div>
+          <div id="kiosk-online-title" i18n-content="kioskOnlineTitle"
+              class="error-title
+                     show-with-error-state-kiosk-online">
+          </div>
+          <div id="rollback-error-title" i18n-content="rollbackErrorTitle"
+               class="error-title
+                     show-with-ui-state-rollback-error">
+          </div>
+        </div>
+      </h1>
     </div>
     <div id="error-message-md-footer" class="footer flex layout vertical">
-      <div id="error-message-md-footer-spacer" class="flex"></div>
-      <div id="buttons" class="layout horizontal center end-justified">
-        <oobe-welcome-secondary-button id="error-message-md-reboot-button"
-            i18n-values="label-for-aria:rebootButton"
-            class="show-with-ui-state-kiosk-mode">
-          <div i18n-content="rebootButton"></div>
-        </oobe-welcome-secondary-button>
-        <oobe-welcome-secondary-button id="error-message-md-diagnose-button"
-            i18n-values="label-for-aria:diagnoseButton"
-            class="show-with-ui-state-kiosk-mode">
-          <div i18n-content="diagnoseButton"></div>
-        </oobe-welcome-secondary-button>
-        <oobe-welcome-secondary-button
-            id="error-message-md-configure-certs-button"
-            i18n-values="label-for-aria:configureCertsButton"
-            class="show-with-ui-state-kiosk-mode">
-          <div i18n-content="configureCertsButton"></div>
-        </oobe-welcome-secondary-button>
-        <oobe-welcome-secondary-button id="error-message-md-continue-button"
-            i18n-values="label-for-aria:continueButton"
-            class="show-with-error-state-kiosk-online">
-          <div i18n-content="continueButton"></div>
-        </oobe-welcome-secondary-button>
-        <oobe-welcome-secondary-button id="error-message-md-ok-button"
-            i18n-values="label-for-aria:okButton"
-            class="show-with-ui-state-rollback-error">
-          <div i18n-content="okButton"></div>
-        </oobe-welcome-secondary-button>
-        <oobe-welcome-secondary-button id="error-message-md-powerwash-button"
-            i18n-values="label-for-aria:localStateErrorPowerwashButton"
-            class="show-with-ui-state-local-state-error">
-          <div i18n-content="localStateErrorPowerwashButton"></div>
-        </oobe-welcome-secondary-button>
-      </div>
-      <div id="error-message-md-bottom-margin"></div>
-    </div>
-    <div class="bottom-buttons flex layout horizontal">
-      <oobe-back-button id="error-message-back-button"></oobe-back-button>
-    </div>
-  </oobe-dialog>
-  <div id="error-message-classic">
-    <div class="step-contents">
-      <div id="error-header-id" class="error-header" aria-live="assertive">
-        <img alt class="error-icon"
-            src="chrome://theme/IDR_ERROR_NETWORK_OFFLINE">
-        <div id="captive-portal-title" i18n-content="captivePortalTitle"
-            class="error-title
-                   show-with-error-state-portal
-                   show-with-error-state-offline"></div>
-        <div id="login-error-title" i18n-content="loginErrorTitle"
-            class="error-title
-                   show-with-error-state-proxy
-                   show-with-error-state-auth-ext-timeout
-                   show-with-ui-state-local-state-error">
-        </div>
-        <div id="kiosk-online-title" i18n-content="kioskOnlineTitle"
-            class="error-title
-                   show-with-error-state-kiosk-online">
-        </div>
-        <div id="rollback-error-title" i18n-content="rollbackErrorTitle"
-             class="error-title
-                   show-with-ui-state-rollback-error">
-        </div>
-      </div>
       <div id="error-body-id" class="error-body" aria-live="assertive">
         <div id="kiosk-online-message-body"
             class="error-message-paragraph
@@ -195,10 +154,44 @@
         <div id="connecting-indicator"
             class="connecting-indicator error-message-paragraph"></div>
       </div>
+      <div id="error-message-md-footer-spacer" class="flex"></div>
+      <div id="buttons" class="layout horizontal center end-justified">
+        <oobe-welcome-secondary-button id="error-message-md-reboot-button"
+            i18n-values="label-for-aria:rebootButton"
+            class="show-with-ui-state-kiosk-mode">
+          <div i18n-content="rebootButton"></div>
+        </oobe-welcome-secondary-button>
+        <oobe-welcome-secondary-button id="error-message-md-diagnose-button"
+            i18n-values="label-for-aria:diagnoseButton"
+            class="show-with-ui-state-kiosk-mode">
+          <div i18n-content="diagnoseButton"></div>
+        </oobe-welcome-secondary-button>
+        <oobe-welcome-secondary-button
+            id="error-message-md-configure-certs-button"
+            i18n-values="label-for-aria:configureCertsButton"
+            class="show-with-ui-state-kiosk-mode">
+          <div i18n-content="configureCertsButton"></div>
+        </oobe-welcome-secondary-button>
+        <oobe-welcome-secondary-button id="error-message-md-continue-button"
+            i18n-values="label-for-aria:continueButton"
+            class="show-with-error-state-kiosk-online">
+          <div i18n-content="continueButton"></div>
+        </oobe-welcome-secondary-button>
+        <oobe-welcome-secondary-button id="error-message-md-ok-button"
+            i18n-values="label-for-aria:okButton"
+            class="show-with-ui-state-rollback-error">
+          <div i18n-content="okButton"></div>
+        </oobe-welcome-secondary-button>
+        <oobe-welcome-secondary-button id="error-message-md-powerwash-button"
+            i18n-values="label-for-aria:localStateErrorPowerwashButton"
+            class="show-with-ui-state-local-state-error">
+          <div i18n-content="localStateErrorPowerwashButton"></div>
+        </oobe-welcome-secondary-button>
+      </div>
+      <div id="error-message-md-bottom-margin"></div>
     </div>
-    <div class="error-controls">
-      <div id="error-message-controls" class="step-controls"></div>
+    <div class="bottom-buttons flex layout horizontal">
+      <oobe-back-button id="error-message-back-button"></oobe-back-button>
     </div>
-    <navigation-bar id="error-navigation" close-visible><navigation-bar>
-  </div>
+  </oobe-dialog>
 </div>
diff --git a/chrome/browser/resources/chromeos/login/screen_error_message.js b/chrome/browser/resources/chromeos/login/screen_error_message.js
index c04dd3e..1f123607 100644
--- a/chrome/browser/resources/chromeos/login/screen_error_message.js
+++ b/chrome/browser/resources/chromeos/login/screen_error_message.js
@@ -85,13 +85,6 @@
 
     // Whether the screen can be cancelled.
     cancelable_: false,
-    get cancelable() {
-      return this.cancelable_;
-    },
-    set cancelable(value) {
-      this.cancelable_ = value;
-      $('error-navigation').closeVisible = value;
-    },
 
     /** @override */
     decorate: function() {
@@ -122,7 +115,6 @@
       this.context.addObserver(CONTEXT_KEY_UI_STATE, function(ui_state) {
         self.setUIState(ui_state);
       });
-      $('error-navigation').addEventListener('close', this.cancel.bind(this));
       $('error-message-back-button')
           .addEventListener('tap', this.cancel.bind(this));
 
@@ -248,7 +240,6 @@
       $('connecting-indicator').innerHTML =
           loadTimeData.getStringF('connectingIndicatorText', ellipsis);
 
-      this.updateMdMode_();
       this.onContentChange_();
     },
 
@@ -260,8 +251,8 @@
       cr.ui.Oobe.clearErrors();
       cr.ui.DropDown.show('offline-networks-list', false);
       $('login-header-bar').signinUIState = SIGNIN_UI_STATE.ERROR;
-      this.cancelable = $('pod-row').pods.length;
-      $('error-message-back-button').disabled = !this.cancelable;
+      this.cancelable_ = $('pod-row').pods.length;
+      $('error-message-back-button').disabled = !this.cancelable_;
     },
 
     /**
@@ -273,83 +264,6 @@
     },
 
     /**
-     * Buttons in oobe wizard's button strip.
-     * @type {array} Array of Buttons.
-     */
-    get buttons() {
-      var buttons = [];
-      var self = this;
-
-      var rebootButton = this.ownerDocument.createElement('button');
-      rebootButton.textContent = loadTimeData.getString('rebootButton');
-      rebootButton.classList.add('show-with-ui-state-kiosk-mode');
-      rebootButton.addEventListener('click', function(e) {
-        self.send(login.Screen.CALLBACK_USER_ACTED, USER_ACTION_REBOOT);
-        e.stopPropagation();
-      });
-      buttons.push(rebootButton);
-
-      var diagnoseButton = this.ownerDocument.createElement('button');
-      diagnoseButton.textContent = loadTimeData.getString('diagnoseButton');
-      diagnoseButton.classList.add('show-with-ui-state-kiosk-mode');
-      diagnoseButton.addEventListener('click', function(e) {
-        self.send(login.Screen.CALLBACK_USER_ACTED, USER_ACTION_DIAGNOSE);
-        e.stopPropagation();
-      });
-      buttons.push(diagnoseButton);
-
-      var certsButton = this.ownerDocument.createElement('button');
-      certsButton.textContent = loadTimeData.getString('configureCertsButton');
-      certsButton.classList.add('show-with-ui-state-kiosk-mode');
-      certsButton.addEventListener('click', function(e) {
-        self.send(
-            login.Screen.CALLBACK_USER_ACTED, USER_ACTION_CONFIGURE_CERTS);
-        e.stopPropagation();
-      });
-      buttons.push(certsButton);
-
-      var continueButton = this.ownerDocument.createElement('button');
-      continueButton.id = 'continue-network-config-btn';
-      continueButton.textContent = loadTimeData.getString('continueButton');
-      continueButton.classList.add('show-with-error-state-kiosk-online');
-      continueButton.addEventListener('click', function(e) {
-        chrome.send('continueAppLaunch');
-        e.stopPropagation();
-      });
-      buttons.push(continueButton);
-
-      var okButton = this.ownerDocument.createElement('button');
-      okButton.id = 'ok-error-screen-btn';
-      okButton.textContent = loadTimeData.getString('okButton');
-      okButton.classList.add('show-with-ui-state-rollback-error');
-      okButton.addEventListener('click', function(e) {
-        chrome.send('cancelOnReset');
-        e.stopPropagation();
-      });
-      buttons.push(okButton);
-
-      var spacer = this.ownerDocument.createElement('div');
-      spacer.classList.add('button-spacer');
-      spacer.classList.add('show-with-ui-state-kiosk-mode');
-      buttons.push(spacer);
-
-      var powerwashButton = this.ownerDocument.createElement('button');
-      powerwashButton.id = 'error-message-restart-and-powerwash-button';
-      powerwashButton.textContent =
-          loadTimeData.getString('localStateErrorPowerwashButton');
-      powerwashButton.classList.add('show-with-ui-state-local-state-error');
-      powerwashButton.addEventListener('click', function(e) {
-        self.send(
-            login.Screen.CALLBACK_USER_ACTED,
-            USER_ACTION_LOCAL_STATE_POWERWASH);
-        e.stopPropagation();
-      });
-      buttons.push(powerwashButton);
-
-      return buttons;
-    },
-
-    /**
      * Sets current UI state of the screen.
      * @param {string} ui_state New UI state of the screen.
      * @private
@@ -474,23 +388,8 @@
      * Cancels error screen and drops to user pods.
      */
     cancel: function() {
-      if (this.cancelable)
+      if (this.cancelable_)
         Oobe.showUserPods();
     },
-
-    /**
-     * Switches UI to MD mode.
-     */
-    updateMdMode_: function() {
-      if (loadTimeData.getString('errorScreenMDMode') === 'on') {
-        $('error-message').setAttribute('md-mode', true);
-        $('error-message-md-header').appendChild($('error-header-id'));
-        $('error-message-md-footer')
-            .insertBefore(
-                $('error-body-id'), $('error-message-md-footer-spacer'));
-        $('error-message-classic').hidden = true;
-        $('error-message-md').hidden = false;
-      }
-    },
   };
 });
diff --git a/chrome/browser/resources/md_extensions/item.js b/chrome/browser/resources/md_extensions/item.js
index 116f96d..bdf69ab 100644
--- a/chrome/browser/resources/md_extensions/item.js
+++ b/chrome/browser/resources/md_extensions/item.js
@@ -109,7 +109,12 @@
 
     /** @private string */
     a11yAssociation_: function() {
-      return this.i18n('extensionA11yAssociation', this.data.name);
+      // Don't use I18nBehavior.i18n because of additional checks it performs.
+      // Polymer ensures that this string is not stamped into arbitrary HTML.
+      // |this.data.name| can contain any data including html tags.
+      // ex: "My <video> download extension!"
+      return loadTimeData.getStringF(
+          'extensionA11yAssociation', this.data.name);
     },
 
     /** @private */
diff --git a/chrome/browser/resources/print_preview/previewarea/preview_area.js b/chrome/browser/resources/print_preview/previewarea/preview_area.js
index bb24c19c..da27457 100644
--- a/chrome/browser/resources/print_preview/previewarea/preview_area.js
+++ b/chrome/browser/resources/print_preview/previewarea/preview_area.js
@@ -150,6 +150,13 @@
     this.isDocumentReady_ = false;
 
     /**
+     * Whether the current destination is valid.
+     * @type {boolean}
+     * @private
+     */
+    this.isDestinationValid_ = true;
+
+    /**
      * Timeout object used to display a loading message if the preview is taking
      * a long time to generate.
      * @type {?number}
@@ -323,6 +330,16 @@
       this.showMessage_(print_preview.PreviewAreaMessageId_.CUSTOM, message);
     },
 
+    /** @param {boolean} valid Whether the current destination is valid. */
+    setDestinationValid: function(valid) {
+      this.isDestinationValid_ = valid;
+      // If destination is valid and preview is ready, hide the error message.
+      if (valid && this.isPluginReloaded_ && this.isDocumentReady_) {
+        this.setOverlayVisible_(false);
+        this.dispatchPreviewGenerationDoneIfReady_();
+      }
+    },
+
     /** @override */
     enterDocument: function() {
       print_preview.Component.prototype.enterDocument.call(this);
@@ -549,7 +566,7 @@
      * @private
      */
     onTicketChange_: function() {
-      if (!this.previewGenerator_)
+      if (!this.previewGenerator_ || !this.isDestinationValid_)
         return;
       const previewRequest = this.previewGenerator_.requestPreview();
       if (previewRequest.id <= -1) {
diff --git a/chrome/browser/resources/print_preview/print_preview.js b/chrome/browser/resources/print_preview/print_preview.js
index 4164ba2..15f928aa 100644
--- a/chrome/browser/resources/print_preview/print_preview.js
+++ b/chrome/browser/resources/print_preview/print_preview.js
@@ -1026,6 +1026,7 @@
       this.uiState_ = PrintPreviewUiState_.ERROR;
       this.isPreviewGenerationInProgress_ = false;
       this.printHeader_.isPrintButtonEnabled = false;
+      this.previewArea_.setDestinationValid(false);
       this.updateLinks_();
     },
 
@@ -1324,6 +1325,7 @@
       if (this.uiState_ == PrintPreviewUiState_.ERROR) {
         this.uiState_ = PrintPreviewUiState_.READY;
         this.updateLinks_();
+        this.previewArea_.setDestinationValid(true);
       }
       if (this.destinationStore_.selectedDestination &&
           this.isInKioskAutoPrintMode_) {
diff --git a/chrome/browser/resources/settings/device_page/compiled_resources2.gyp b/chrome/browser/resources/settings/device_page/compiled_resources2.gyp
index 0962808..9162ea9 100644
--- a/chrome/browser/resources/settings/device_page/compiled_resources2.gyp
+++ b/chrome/browser/resources/settings/device_page/compiled_resources2.gyp
@@ -65,8 +65,7 @@
         '<(EXTERNS_GYP):settings_private',
         '<(EXTERNS_GYP):system_display',
         '<(INTERFACES_GYP):system_display_interface',
-        'display_layout',
-        'display_size_slider'
+        'display_layout'
       ],
       'includes': ['../../../../../third_party/closure_compiler/compile_js2.gypi'],
     },
@@ -119,19 +118,6 @@
       'includes': ['../../../../../third_party/closure_compiler/compile_js2.gypi'],
     },
     {
-      'target_name': 'display_size_slider',
-      'dependencies': [
-        '<(DEPTH)/third_party/polymer/v1_0/components-chromium/paper-progress/compiled_resources2.gyp:paper-progress-extracted',
-        '<(DEPTH)/third_party/polymer/v1_0/components-chromium/iron-a11y-keys-behavior/compiled_resources2.gyp:iron-a11y-keys-behavior-extracted',
-        '<(DEPTH)/third_party/polymer/v1_0/components-chromium/iron-resizable-behavior/compiled_resources2.gyp:iron-resizable-behavior-extracted',
-        '<(DEPTH)/third_party/polymer/v1_0/components-chromium/iron-range-behavior/compiled_resources2.gyp:iron-range-behavior-extracted',
-        '<(DEPTH)/third_party/polymer/v1_0/components-chromium/paper-behaviors/compiled_resources2.gyp:paper-inky-focus-behavior-extracted',
-        '<(DEPTH)/ui/webui/resources/cr_elements/policy/compiled_resources2.gyp:cr_policy_pref_behavior',
-        '../prefs/compiled_resources2.gyp:prefs_behavior',
-      ],
-      'includes': ['../../../../../third_party/closure_compiler/compile_js2.gypi'],
-    },
-    {
       'target_name': 'power',
       'dependencies': [
         '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:i18n_behavior',
diff --git a/chrome/browser/resources/settings/device_page/display.html b/chrome/browser/resources/settings/device_page/display.html
index acd9ad6a..58b9a664a 100644
--- a/chrome/browser/resources/settings/device_page/display.html
+++ b/chrome/browser/resources/settings/device_page/display.html
@@ -12,7 +12,6 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-tabs/paper-tabs.html">
 <link rel="import" href="display_layout.html">
 <link rel="import" href="display_overscan_dialog.html">
-<link rel="import" href="display_size_slider.html">
 <link rel="import" href="night_light_slider.html">
 <link rel="import" href="../controls/settings_dropdown_menu.html">
 <link rel="import" href="../controls/settings_slider.html">
@@ -162,13 +161,16 @@
         <div class="settings-box indented two-line">
           <div class="start text-area layout vertical">
             <div>$i18n{displayZoomTitle}</div>
-            <div class="secondary self-start">$i18n{displayZoomSublabel}</div>
+            <div class="secondary self-start">
+              [[getDisplayZoomText_(selectedDisplay, selectedZoomPref_.value)]]
+            </div>
           </div>
-          <display-size-slider id="displaySizeSlider"
-              ticks="[[zoomValues_]]" pref="{{selectedZoomPref_}}"
-              min-label="$i18n{displaySizeSliderMinLabel}"
-              max-label="$i18n{displaySizeSliderMaxLabel}">
-          </display-size-slider>
+          <settings-slider tick-values="[[zoomValues_]]"
+              disabled="[[!enableDisplayZoomSlider_(selectedDisplay)]]"
+              pref="{{selectedZoomPref_}}" on-change="onSelectedZoomChange_"
+              label-min="$i18n{displaySizeSliderMinLabel}"
+              label-max="$i18n{displaySizeSliderMaxLabel}">
+          </settings-slider>
         </div>
 
         <!-- Drop down select menu for resolution -->
diff --git a/chrome/browser/resources/settings/device_page/display.js b/chrome/browser/resources/settings/device_page/display.js
index 649b5b6..a95cba2 100644
--- a/chrome/browser/resources/settings/device_page/display.js
+++ b/chrome/browser/resources/settings/device_page/display.js
@@ -102,7 +102,7 @@
     /** @private {!Array<number>} Mode index values for slider. */
     modeValues_: Array,
 
-    /** @private {SliderTicks} Display zoom slider tick values. */
+    /** @private {!Array<number>} Display zoom percentage values for slider */
     zoomValues_: Array,
 
     /** @private {!DropdownMenuOptionList} */
@@ -183,7 +183,6 @@
     'updateNightLightScheduleSettings_(prefs.ash.night_light.schedule_type.*,' +
         ' prefs.ash.night_light.enabled.*)',
     'onSelectedModeChange_(selectedModePref_.value)',
-    'onSelectedZoomChange_(selectedZoomPref_.value)',
   ],
 
   /** @private {number} Selected mode index received from chrome. */
@@ -316,35 +315,32 @@
    */
   getSelectedDisplayZoom_: function(selectedDisplay) {
     const selectedZoom = selectedDisplay.displayZoomFactor * 100;
-    let closestMatch = this.zoomValues_[0].value;
+    let closestMatch = this.zoomValues_[0];
     let minimumDiff = Math.abs(closestMatch - selectedZoom);
 
     for (let i = 0; i < this.zoomValues_.length; i++) {
-      const currentDiff = Math.abs(this.zoomValues_[i].value - selectedZoom);
+      const currentDiff = Math.abs(this.zoomValues_[i] - selectedZoom);
       if (currentDiff < minimumDiff) {
-        closestMatch = this.zoomValues_[i].value;
+        closestMatch = this.zoomValues_[i];
         minimumDiff = currentDiff;
       }
     }
 
-    return /** @type {number} */ (closestMatch);
+    return closestMatch;
   },
 
   /**
    * Given the display with the current display mode, this function lists all
-   * the display zoom values and their labels to be used by the slider.
+   * the display zoom values in percentage.
    * @param {!chrome.system.display.DisplayUnitInfo} selectedDisplay
-   * @return {SliderTicks}
+   * @return {!Array<number>}
    */
   getZoomValues_: function(selectedDisplay) {
-    /** @type {SliderTicks} */
     let zoomValues = [];
     for (let i = 0; i < selectedDisplay.availableDisplayZoomFactors.length;
          i++) {
-      const value =
-          Math.round(selectedDisplay.availableDisplayZoomFactors[i] * 100);
-      const label = this.i18n('displayZoomValue', value.toString());
-      zoomValues.push({value: value, label: label});
+      zoomValues.push(
+          Math.round(selectedDisplay.availableDisplayZoomFactors[i] * 100));
     }
     return zoomValues;
   },
@@ -569,6 +565,16 @@
   },
 
   /**
+   * @param {!chrome.system.display.DisplayUnitInfo} selectedDisplay
+   * @return {string}
+   * @private
+   */
+  getDisplayZoomText_: function(selectedDisplay) {
+    return this.i18n(
+        'displayZoomValue', this.selectedZoomPref_.value.toString());
+  },
+
+  /**
    * @param {!{detail: string}} e |e.detail| is the id of the selected display.
    * @private
    */
@@ -657,14 +663,10 @@
    * @private
    */
   onSelectedZoomChange_: function() {
-    if (this.currentSelectedModeIndex_ == -1 || !this.selectedDisplay)
-      return;
-
     /** @type {!chrome.system.display.DisplayProperties} */ const properties = {
       displayZoomFactor:
           /** @type {number} */ (this.selectedZoomPref_.value) / 100.0
     };
-
     settings.display.systemDisplayApi.setDisplayProperties(
         this.selectedDisplay.id, properties,
         this.setPropertiesCallback_.bind(this));
diff --git a/chrome/browser/resources/settings/device_page/display_size_slider.html b/chrome/browser/resources/settings/device_page/display_size_slider.html
deleted file mode 100644
index d38f6dd..0000000
--- a/chrome/browser/resources/settings/device_page/display_size_slider.html
+++ /dev/null
@@ -1,230 +0,0 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/paper-behaviors/paper-inky-focus-behavior.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/iron-range-behavior/iron-range-behavior.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/iron-resizable-behavior/iron-resizable-behavior.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/paper-progress/paper-progress.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html">
-
-<dom-module id="display-size-slider">
-  <template>
-    <style>
-      :host {
-        /* Counteract the margin on #sliderContainer and match the margin from
-           settings-slider.html */
-        -webkit-margin-end: -16px;
-
-        cursor: default;
-        display: inline-flex;
-        font-weight: 500;
-        min-width: 200px;
-        text-align: center;
-        user-select: none;
-      }
-
-      /* focus shows the ripple */
-      :host(:focus) {
-        outline: none;
-      }
-
-      :host-context([dir='rtl']) #sliderContainer {
-        transform: scaleX(-1);
-      }
-
-      /* We dont want the text to be flipped in rtl */
-      :host-context([dir='rtl']) #labelText,
-      :host-context([dir='rtl']) #subLabelContainer {
-        transform: scaleX(-1);
-      }
-
-      #sliderContainer {
-        display: inline-table;
-        height: 32px;
-        margin-left: 16px;
-        margin-right: 16px;
-        position: relative;
-        width: 100%;
-      }
-
-      #sliderContainer:focus {
-        outline: 0;
-      }
-
-      #labelContainer {
-        bottom: 36px;
-        display: none;
-        height: 1.75em;
-        position: absolute;
-        width: inherit;
-        z-index: 10;
-      }
-
-      /* Show the label on keyboard focus and mouse hover */
-      .dragging #labelContainer,
-      :host(:focus) #labelContainer,
-      #sliderContainer:hover #labelContainer,
-      .hover #labelContainer {
-        display: block;
-      }
-
-      .label {
-        background: var(--google-blue-700);
-        border-radius: 14px;
-        color: white;
-        font-size: 12px;
-        left: 0;
-        line-height: 1.5em;
-        padding: 0 8px;
-        position: absolute;
-        text-align: center;
-        transform: translateX(-50%);
-        transition: margin-top 200ms cubic-bezier(0, 0, 0.2, 1);
-        vertical-align: middle;
-        width: auto;
-      }
-
-      .bar-container {
-        bottom: 0;
-        left: 0;
-        overflow: hidden;
-        position: absolute;
-        right: 0;
-        top: 0;
-      }
-
-      .slider-markers {
-        box-sizing: border-box;
-        height: 2px;
-        left: 0;
-        pointer-events: none;
-        position: absolute;
-        right: -1px;
-        top: 15px;
-        @apply --layout-horizontal;
-      }
-
-      .slider-marker {
-        @apply --layout-flex;
-      }
-      .slider-markers::after,
-      .slider-marker::after {
-        background-color: #000;
-        border-radius: 50%;
-        content: '';
-        display: block;
-        height: 2px;
-        margin-left: -1px;
-        width: 2px;
-      }
-
-      #sliderBar {
-        --paper-progress-container-color: var(--paper-grey-400);
-        --paper-progress-height: 2px;
-        background-color: transparent;
-        padding: 15px 0;
-        width: 100%;
-      }
-
-      .slider-knob {
-        height: 32px;
-        left: 0;
-        margin-left: -16px;
-        position: absolute;
-        top: 0;
-        width: 32px;
-      }
-
-      .slider-knob:focus {
-        outline: none;
-      }
-
-      .slider-knob-inner {
-        background-color: var(--google-blue-700);
-        border: 2px solid var(--google-blue-700);
-        border-radius: 50%;
-        box-sizing: border-box;
-        height: calc(100% - 20px);
-        margin: 10px;
-        transition-duration: 180ms;
-        transition-property: transform, background-color, border;
-        transition-timing-function: ease;
-        width: calc(100% - 20px);
-      }
-
-      .expand > .slider-knob > .slider-knob-inner {
-        transform: scale(1.5);
-      }
-
-      paper-ripple {
-        color: var(--google-blue-700);
-      }
-
-      #subLabelContainer {
-        display: flex;
-        flex-direction: row;
-        justify-content: space-between;
-        padding-top: 24px;
-        pointer-events: none;
-      }
-
-      #subLabelContainer > div {
-        font-size: 12px;
-        font-weight: normal;
-      }
-
-      paper-progress {
-        --paper-progress-active-color: var(--google-blue-700);
-        --paper-progress-disabled-active-color: var(--paper-grey-400);
-      }
-
-      /* Styles for disabled state */
-      #sliderContainer.disabled {
-        pointer-events: none;
-      }
-
-      .disabled > .slider-knob > .slider-knob-inner {
-        transform: scale3d(0.75, 0.75, 1);
-      }
-
-      #subLabelContainer[disabled] {
-        color: var(--paper-grey-400);
-      }
-    </style>
-    <div id="sliderContainer"
-        class$="[[getClassNames_(expand, disabled, dragging)]]"
-        on-mouseout="onMouseOut_">
-      <div id="labelContainer" hidden$="[[shouldShowLabel_(ticks, index)]]"
-          aria-label="[[getLabelForIndex_(ticks, index)]]">
-        <div id="label" class="label">
-          <div id="labelText">
-            [[getLabelForIndex_(ticks, index)]]
-          </div>
-        </div>
-      </div>
-      <div class="bar-container">
-        <paper-progress id="sliderBar" disabled$="[[disabled]]"
-            on-down="onBarDown_" on-up="onBarUp_" on-track="knobTrack_"
-            value="[[index]]" min="[[min]]" max="[[max]]">
-        </paper-progress>
-      </div>
-
-      <template is="dom-if" if="[[!disabled]]">
-        <div class="slider-markers">
-          <template is="dom-repeat" items="[[markers]]">
-            <div class="slider-marker"></div>
-          </template>
-        </div>
-      </template>
-
-      <div id="sliderKnob" class="slider-knob" on-down="knobDown_"
-          on-up="resetKnob_" on-track="knobTrack_">
-        <div class="slider-knob-inner"></div>
-      </div>
-      <div id="subLabelContainer" disabled$="[[disabled]]">
-        <div id="subLabelMin">[[minLabel]]</div>
-        <div id="subLabelMax">[[maxLabel]]</div>
-      </div>
-    </div>
-  </template>
-  <script src="display_size_slider.js"></script>
-</dom-module>
diff --git a/chrome/browser/resources/settings/device_page/display_size_slider.js b/chrome/browser/resources/settings/device_page/display_size_slider.js
deleted file mode 100644
index bba3debe..0000000
--- a/chrome/browser/resources/settings/device_page/display_size_slider.js
+++ /dev/null
@@ -1,473 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * @fileoverview
- * display-size-slider is used to change the value of a pref via a slider
- * control. This specific slider is used instead of the settings-slider due to
- * its implementation of the tool tip that displays the current slider value.
- */
-
-/**
- * The |value| is the corresponding value that the current slider tick is
- * assocated with. The string |label| is shown in the ui as the label for the
- * current slider value.
- * @typedef {{
- *   value: (number|string|boolean),
- *   label: string
- * }}
- */
-let SliderTick;
-
-/**
- * @typedef {!Array<SliderTick>}
- */
-let SliderTicks;
-
-(function() {
-
-Polymer({
-  is: 'display-size-slider',
-
-  behaviors: [
-    CrPolicyPrefBehavior,
-    Polymer.IronA11yKeysBehavior,
-    Polymer.IronRangeBehavior,
-    Polymer.IronResizableBehavior,
-    Polymer.PaperInkyFocusBehavior,
-    PrefsBehavior,
-  ],
-
-  properties: {
-    /** The slider is disabled if true. */
-    disabled: {type: Boolean, value: false, readOnly: true},
-
-    /** True when the user is dragging the slider knob. */
-    dragging: {type: Boolean, value: false, readOnly: true},
-
-    /** If true, the knob is expanded. */
-    expand: {type: Boolean, value: false, readOnly: true},
-
-    /** @type {number} The index for the current slider value in |ticks|. */
-    index: {type: Number, value: 0, readOnly: true},
-
-    /** @type {string} The label for the minimum slider value */
-    minLabel: {type: String, value: ''},
-
-    /** @type {string} The label for the maximum slider value */
-    maxLabel: {type: String, value: ''},
-
-    /**
-     * Each item in the array represents a UI element corresponding to a tick
-     * value.
-     * @type {!Array<number>}
-     */
-    markers: {
-      type: Array,
-      readOnly: true,
-      value: function() {
-        return [];
-      }
-    },
-
-    /** @type {!chrome.settingsPrivate.PrefObject} */
-    pref: Object,
-
-    /**
-     * The data associated with each tick on the slider. Each element in the
-     * array contains a value and the label corresponding to that value.
-     * @type {SliderTicks}
-     */
-    ticks: {type: Array, value: []},
-  },
-
-  listeners: {},
-
-  observers: [
-    'updateIndex_(pref.value)', 'updateKnobAndLabel_(index, disabled)',
-    'updateSliderParams_(ticks.*)', 'updateMarkers_(min, max)',
-    'updateDisabled_(ticks.*, pref.*)'
-  ],
-
-  hostAttributes: {role: 'slider', tabindex: 0},
-
-  keyBindings: {
-    'left': 'leftKeyPress_',
-    'right': 'rightKeyPress_',
-    'up': 'increment_',
-    'down': 'decrement_',
-    'pagedown home': 'resetToMinIndex_',
-    'pageup end': 'resetToMaxIndex_'
-  },
-
-  get _isRTL() {
-    if (this.__isRTL === undefined) {
-      this.__isRTL = window.getComputedStyle(this)['direction'] === 'rtl';
-    }
-    return this.__isRTL;
-  },
-
-  /**
-   * Clamps the value of |newIndex| to IronRangeBehavior's max/min bounds and
-   * updates the value for |index|.
-   * @param {number} newIndex The new value for index that needs to be set.
-   * @private
-   */
-  clampAndSetIndex_: function(newIndex) {
-    newIndex = this.clampToRange_(newIndex, this.min, this.max);
-    if (newIndex != this.index)
-      this._setIndex(newIndex);
-  },
-
-  /**
-   * Clamps the value of |newIndex| to IronRangeBehavior's max/min bounds and
-   * updates the value of |pref| to this clamped value.
-   * @param {number} newIndex The new value for index that needs to be set.
-   * @private
-   */
-  clampIndexAndUpdatePref_: function(newIndex) {
-    newIndex = this.clampToRange_(newIndex, this.min, this.max);
-    if (this.ticks[newIndex].value != this.pref.value)
-      this.set('pref.value', this.ticks[newIndex].value);
-  },
-
-  /**
-   * Clamps and returns the given |value| within the |min| and |max| range.
-   * @param {number} value The number to clamp.
-   * @param {number} min The minimum value in range. Any value below this will
-   *     be clamped to |min|.
-   * @param {number} max The maximum value in range. Any value above this will
-   *     be clamped to |max|.
-   * @return {number}
-   * @private
-   */
-  clampToRange_: function(value, min, max) {
-    return Math.max(Math.min(value, max), min);
-  },
-
-  /**
-   * Overrides _createRipple from PaperInkyFocusBehavior to set the ripple
-   * container as the slider knob before creating the ripple animation. Without
-   * this the PaperInkyFocusBehavior does not know where to create the ripple
-   * animation.
-   * @private
-   */
-  _createRipple: function() {
-    this._rippleContainer = this.$.sliderKnob;
-    return Polymer.PaperInkyFocusBehaviorImpl._createRipple.call(this);
-  },
-
-  /** @private Safely decrements the slider index value by 1 and updates pref */
-  decrement_: function() {
-    this.clampIndexAndUpdatePref_(this.index - 1);
-  },
-
-  /**
-   * Overrides _focusChanged from PaperInkyFocusBehavior to create a ripple only
-   * on a focus received via a keyboard. Hide the ripple when the focus was not
-   * triggered via a keyboard event.
-   * @private
-   */
-  _focusedChanged: function(receivedFocusFromKeyboard) {
-    if (receivedFocusFromKeyboard) {
-      this.ensureRipple();
-    }
-    if (this.hasRipple()) {
-      // note, ripple must be un-hidden prior to setting `holdDown`
-      if (receivedFocusFromKeyboard) {
-        this._ripple.style.display = '';
-      } else {
-        this._ripple.style.display = 'none';
-      }
-      this._ripple.holdDown = receivedFocusFromKeyboard;
-    }
-  },
-
-  /**
-   * Returns a string concatenated list of class names based on whether the
-   * corresponding properties are set.
-   * @return {string}
-   */
-  getClassNames_: function() {
-    return this.mergeClasses_({
-      disabled: this.disabled,
-      expand: this.expand,
-      dragging: this.dragging,
-    });
-  },
-
-  /**
-   * Returns the current label for the selected slider value.
-   * @param {SliderTicks} ticks Slider label and corresponding value for each
-   *    tick.
-   * @param {number} index Index of the slider tick with the desired label.
-   * @return {string}
-   */
-  getLabelForIndex_: function(ticks, index) {
-    if (!ticks || ticks.length == 0 || index >= ticks.length)
-      return '';
-    return ticks[index].label;
-  },
-
-  /** @private Safely increments the slider index value by 1 and updates pref */
-  increment_: function() {
-    this.clampIndexAndUpdatePref_(this.index + 1);
-  },
-
-  /**
-   * Handles the mouse down event for the slider knob.
-   * @private
-   */
-  knobDown_: function(event) {
-    this._setExpand(true);
-
-    // cancel selection
-    event.preventDefault();
-
-    // Without this the paper ripple is displayed on click.
-    this.focus();
-  },
-
-  /**
-   * Handles the mouse drag and drop event for slider knob from start to end.
-   * @param {Event} event
-   * @private
-   */
-  knobTrack_: function(event) {
-    event.stopPropagation();
-    switch (event.detail.state) {
-      case 'start':
-        this.knobTrackStart_();
-        break;
-      case 'track':
-        this.knobTrackDrag_(event);
-        break;
-      case 'end':
-        this.knobTrackEnd_(event);
-        break;
-    }
-  },
-
-  /**
-   * Handles the drag event for the slider knob.
-   * @param {!Event} event
-   * @private
-   */
-  knobTrackDrag_: function(event) {
-    // Distance travelled during mouse drag.
-    const dx = event.detail.dx;
-
-    // Total width of the progress bar in CSS pixels.
-    const totalWidth = this.$.sliderBar.offsetWidth;
-
-    // Distance between 2 consecutive tick markers.
-    const tickWidth = totalWidth / (this.ticks.length - 1);
-
-    // Number of ticks covered by |dx|.
-    let dxInTicks = Math.round(dx / tickWidth);
-
-    if (this._isRTL)
-      dxInTicks *= -1;
-
-    let nextIndex = this.startIndex_ + dxInTicks;
-
-    this.clampAndSetIndex_(nextIndex);
-  },
-
-  /**
-   * Handles the end of slider knob drag event.
-   * @param {!Event} event
-   * @private
-   */
-  knobTrackEnd_: function(event) {
-    this._setDragging(false);
-
-    // Update the pref once user stops dragging and releases mouse.
-    if (this.index != this.startIndex_)
-      this.clampIndexAndUpdatePref_(this.index);
-  },
-
-  /**
-   * Handles the start of the slider knob drag event.
-   * @private
-   */
-  knobTrackStart_: function() {
-    this.startIndex_ = this.index;
-    this._setDragging(true);
-  },
-
-  /** @private Handles the 'left' key press. */
-  leftKeyPress_: function() {
-    this._isRTL ? this.increment_() : this.decrement_();
-  },
-
-  /**
-   * Returns a concatenated string of classnames based on the boolean table
-   * |classes|.
-   * @param {!Object<string, boolean>} classes An object mapping between
-   *     classnames and boolean. The boolean for the corresponding classname is
-   *     true if that classname needs to be present in the returned string.
-   * @return {string}
-   * @private
-   */
-  mergeClasses_: function(classes) {
-    return Object.keys(classes)
-        .filter(function(className) {
-          return classes[className];
-        })
-        .join(' ');
-  },
-
-  /**
-   * Handles the event where the user clicks or taps on the slider bar directly.
-   * @param {!Event} event
-   * @private
-   */
-  onBarDown_: function(event) {
-    const barWidth = this.$.sliderBar.offsetWidth;
-    const barOriginX = this.$.sliderBar.getBoundingClientRect().left;
-    let eventOffsetFromOriginX = event.detail.x - barOriginX;
-    if (this._isRTL)
-      eventOffsetFromOriginX = barWidth - eventOffsetFromOriginX;
-    const tickWidth = barWidth / (this.ticks.length - 1);
-    let newTickIndex = Math.round(eventOffsetFromOriginX / tickWidth);
-    this.startIndex_ = this.index;
-
-    // Update the index but dont update the pref until mouse is released.
-    this.clampAndSetIndex_(newTickIndex);
-  },
-
-  /**
-   * Handles the event of mouse up from the slider bar.
-   * @private
-   */
-  onBarUp_: function() {
-    if (this.startIndex_ != this.index)
-      this.clampIndexAndUpdatePref_(this.index);
-  },
-
-  /**
-   * Handles the event of the mouse moving out of the slider container.
-   * @private
-   */
-  onMouseOut_: function() {
-    // This is needed to hide the label after the user has clicked on the slider
-    this.blur();
-  },
-
-  /**
-   * Resets the knob back to its default state.
-   * @private
-   */
-  resetKnob_: function() {
-    this._setExpand(false);
-  },
-
-  /** @private Handles the 'right' key press. */
-  rightKeyPress_: function() {
-    this._isRTL ? this.decrement_() : this.increment_();
-  },
-
-  /** @private Handles the 'end' and 'page up' key press. */
-  resetToMaxIndex_: function() {
-    this.clampIndexAndUpdatePref_(this.max);
-  },
-
-  /** @private Handles the 'home' and 'page down' key press. */
-  resetToMinIndex_: function() {
-    this.clampIndexAndUpdatePref_(this.min);
-  },
-
-  /**
-   * Returs true if the label needs to be displayed to the user. If the |label|
-   * field for the current selected slider tick represented by |index| is not
-   * set, then this returns false.
-   * @param {SliderTicks} ticks Info related to the slider ticks.
-   * @param {number} index Index of the current selected slider value.
-   * @return {boolean}
-   */
-  shouldShowLabel_: function(ticks, index) {
-    if (!ticks || ticks.length == 0)
-      return false;
-    if (index < 0 || index >= ticks.length)
-      return false;
-    return (!!ticks[index].label && ticks[index].label.length != 0);
-  },
-
-  /**
-   * Sets the disabled property if there are no tick values or if the pref
-   * cannot be modified by the user.
-   * @private
-   */
-  updateDisabled_: function() {
-    let disabled = false;
-
-    // Disabled if no tick values are set for the slider.
-    if (!this.ticks || this.ticks.length <= 1)
-      disabled |= true;
-
-
-    // Disabled if the pref cannot be modified.
-    disabled |= this.isPrefEnforced();
-
-    this._setDisabled(!!disabled);
-  },
-
-  /**
-   * Updates the value for |index| based on the current set value of |pref|.
-   * @private
-   */
-  updateIndex_: function() {
-    if (!this.ticks || this.ticks.length == 0)
-      return;
-    if (!this.pref)
-      return;
-    for (let i = 0; i < this.ticks.length; i++)
-      if (this.ticks[i].value == this.pref.value)
-        this._setIndex(i);
-  },
-
-  /**
-   * Updates the knob position based on the the value of progress indicator.
-   * @private
-   */
-  updateKnobAndLabel_: function() {
-    if (this.disabled) {
-      this.$.sliderKnob.style.left = '0%';
-      this.$.label.style.left = '0%';
-      return;
-    }
-    this._setRatio(this._calcRatio(this.index) * 100);
-
-    this.$.sliderKnob.style.left = this.ratio + '%';
-    this.$.label.style.left = this.ratio + '%';
-  },
-
-  /**
-   * Initializes the |markers| array based on the number of ticks.
-   * @private
-   */
-  updateMarkers_: function(min, max) {
-    let steps = Math.round((max - min) / this.step);
-    if (steps < 0 || !isFinite(steps))
-      steps = 0;
-    this._setMarkers(new Array(steps));
-  },
-
-  /**
-   * Updates the min and max possible values for the slider.
-   * @private
-   */
-  updateSliderParams_: function() {
-    this.min = 0;
-    if (this.ticks.length == 0) {
-      this.max = 0;
-      return;
-    }
-    this.max = this.ticks.length - 1;
-    this.updateIndex_();
-  },
-});
-
-})();
diff --git a/chrome/browser/resources/settings/settings_resources.grd b/chrome/browser/resources/settings/settings_resources.grd
index 9126d66..3e11e8e 100644
--- a/chrome/browser/resources/settings/settings_resources.grd
+++ b/chrome/browser/resources/settings/settings_resources.grd
@@ -548,12 +548,6 @@
         <structure name="IDR_SETTINGS_DEVICE_NIGHT_LIGHT_SLIDER_JS"
                    file="device_page/night_light_slider.js"
                    type="chrome_html" />
-        <structure name="IDR_SETTINGS_DEVICE_DISPLAY_SIZE_SLIDER_HTML"
-                   file="device_page/display_size_slider.html"
-                   type="chrome_html" />
-        <structure name="IDR_SETTINGS_DEVICE_DISPLAY_SIZE_SLIDER_JS"
-                   file="device_page/display_size_slider.js"
-                   type="chrome_html" />
 
       </if>
       <structure name="IDR_SETTINGS_DOWNLOADS_BROWSER_PROXY_HTML"
diff --git a/chrome/browser/signin/chrome_signin_client_unittest.cc b/chrome/browser/signin/chrome_signin_client_unittest.cc
index 98f5727..0129f40 100644
--- a/chrome/browser/signin/chrome_signin_client_unittest.cc
+++ b/chrome/browser/signin/chrome_signin_client_unittest.cc
@@ -190,7 +190,7 @@
   MOCK_METHOD3(DoSignOut,
                void(signin_metrics::ProfileSignout,
                     signin_metrics::SignoutDelete,
-                    bool revoke_all_tokens));
+                    RemoveAccountsOption remove_option));
 
   AccountTrackerService fake_service_;
 };
@@ -233,7 +233,10 @@
       .Times(1);
   EXPECT_CALL(*client_, LockForceSigninProfile(browser()->profile()->GetPath()))
       .Times(1);
-  EXPECT_CALL(*manager_, DoSignOut(source_metric, delete_metric, true))
+  EXPECT_CALL(
+      *manager_,
+      DoSignOut(source_metric, delete_metric,
+                SigninManager::RemoveAccountsOption::kRemoveAllAccounts))
       .Times(1);
 
   manager_->SignOut(source_metric, delete_metric);
@@ -252,7 +255,10 @@
       .Times(0);
   EXPECT_CALL(*client_, LockForceSigninProfile(browser()->profile()->GetPath()))
       .Times(1);
-  EXPECT_CALL(*manager_, DoSignOut(source_metric, delete_metric, true))
+  EXPECT_CALL(
+      *manager_,
+      DoSignOut(source_metric, delete_metric,
+                SigninManager::RemoveAccountsOption::kRemoveAllAccounts))
       .Times(1);
   manager_->SignOut(source_metric, delete_metric);
 
@@ -262,7 +268,10 @@
       .Times(1);
   EXPECT_CALL(*client_, LockForceSigninProfile(browser()->profile()->GetPath()))
       .Times(1);
-  EXPECT_CALL(*manager_, DoSignOut(source_metric, delete_metric, true))
+  EXPECT_CALL(
+      *manager_,
+      DoSignOut(source_metric, delete_metric,
+                SigninManager::RemoveAccountsOption::kRemoveAllAccounts))
       .Times(1);
   manager_->SignOut(source_metric, delete_metric);
 }
@@ -282,7 +291,10 @@
       .Times(0);
   EXPECT_CALL(*client_, LockForceSigninProfile(browser()->profile()->GetPath()))
       .Times(0);
-  EXPECT_CALL(*manager_, DoSignOut(source_metric, delete_metric, true))
+  EXPECT_CALL(
+      *manager_,
+      DoSignOut(source_metric, delete_metric,
+                SigninManager::RemoveAccountsOption::kRemoveAllAccounts))
       .Times(1);
   manager_->SignOut(source_metric, delete_metric);
 }
@@ -305,7 +317,10 @@
       .Times(0);
   EXPECT_CALL(*client_, LockForceSigninProfile(browser()->profile()->GetPath()))
       .Times(0);
-  EXPECT_CALL(*manager_, DoSignOut(source_metric, delete_metric, true))
+  EXPECT_CALL(
+      *manager_,
+      DoSignOut(source_metric, delete_metric,
+                SigninManager::RemoveAccountsOption::kRemoveAllAccounts))
       .Times(1);
   manager_->SignOut(source_metric, delete_metric);
 }
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index c71a2ee..d03870f 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -1385,11 +1385,21 @@
       "layout_constants.h",
       "location_bar/location_bar.cc",
       "location_bar/location_bar.h",
+      "media_router/cast_modes_with_media_sources.cc",
+      "media_router/cast_modes_with_media_sources.h",
+      "media_router/media_cast_mode.cc",
+      "media_router/media_cast_mode.h",
+      "media_router/media_router_file_dialog.cc",
+      "media_router/media_router_file_dialog.h",
+      "media_router/media_sink_with_cast_modes.cc",
+      "media_router/media_sink_with_cast_modes.h",
       "media_router/presentation_receiver_window.h",
       "media_router/presentation_receiver_window_controller.cc",
       "media_router/presentation_receiver_window_controller.h",
       "media_router/presentation_receiver_window_delegate.h",
       "media_router/presentation_receiver_window_factory_mac.cc",
+      "media_router/query_result_manager.cc",
+      "media_router/query_result_manager.h",
       "native_window_tracker.h",
       "omnibox/alternate_nav_infobar_delegate.cc",
       "omnibox/alternate_nav_infobar_delegate.h",
@@ -1584,14 +1594,8 @@
       "webui/md_downloads/md_downloads_ui.h",
       "webui/md_history_ui.cc",
       "webui/md_history_ui.h",
-      "webui/media_router/cast_modes_with_media_sources.cc",
-      "webui/media_router/cast_modes_with_media_sources.h",
-      "webui/media_router/media_cast_mode.cc",
-      "webui/media_router/media_cast_mode.h",
       "webui/media_router/media_router_dialog_controller_impl.cc",
       "webui/media_router/media_router_dialog_controller_impl.h",
-      "webui/media_router/media_router_file_dialog.cc",
-      "webui/media_router/media_router_file_dialog.h",
       "webui/media_router/media_router_internals_ui.cc",
       "webui/media_router/media_router_internals_ui.h",
       "webui/media_router/media_router_internals_webui_message_handler.cc",
@@ -1608,10 +1612,6 @@
       "webui/media_router/media_router_ui_service_factory.h",
       "webui/media_router/media_router_webui_message_handler.cc",
       "webui/media_router/media_router_webui_message_handler.h",
-      "webui/media_router/media_sink_with_cast_modes.cc",
-      "webui/media_router/media_sink_with_cast_modes.h",
-      "webui/media_router/query_result_manager.cc",
-      "webui/media_router/query_result_manager.h",
       "webui/media_router/web_contents_display_observer.h",
       "webui/ntp/app_icon_webui_handler.cc",
       "webui/ntp/app_icon_webui_handler.h",
diff --git a/chrome/browser/ui/cocoa/infobars/infobar_utilities.h b/chrome/browser/ui/cocoa/infobars/infobar_utilities.h
index 716e036..2b0b8da 100644
--- a/chrome/browser/ui/cocoa/infobars/infobar_utilities.h
+++ b/chrome/browser/ui/cocoa/infobars/infobar_utilities.h
@@ -15,9 +15,6 @@
 // |after| signifies the side of |anchor| on which to place |toMove|.
 void MoveControl(NSView* anchor, NSView* toMove, int spacing, bool after);
 
-// Vertically center |toMove| in its container.
-void VerticallyCenterView(NSView *toMove);
-
 // Creates a label control in the style we need for the infobar's labels
 // within |bounds|.
 NSTextField* CreateLabel(NSRect bounds);
diff --git a/chrome/browser/ui/cocoa/infobars/infobar_utilities.mm b/chrome/browser/ui/cocoa/infobars/infobar_utilities.mm
index 8b81fc8..00279c2 100644
--- a/chrome/browser/ui/cocoa/infobars/infobar_utilities.mm
+++ b/chrome/browser/ui/cocoa/infobars/infobar_utilities.mm
@@ -6,8 +6,6 @@
 
 #include "base/mac/scoped_nsobject.h"
 #import "chrome/browser/ui/cocoa/infobars/infobar_container_controller.h"
-#import "chrome/browser/ui/cocoa/infobars/infobar_gradient_view.h"
-#include "chrome/browser/ui/infobar_container_delegate.h"
 #import "components/infobars/core/infobar.h"
 #import "ui/base/cocoa/nsview_additions.h"
 
@@ -50,21 +48,6 @@
   [toMove setFrame:toMoveFrame];
 }
 
-// Vertically center |toMove| in its container.
-void VerticallyCenterView(NSView* toMove) {
-  NSRect superViewFrame = [[toMove superview] frame];
-  NSRect viewFrame = [toMove frame];
-  // If the superview is the infobar view, then subtract out the anti-spoof
-  // height so that the content is centered in the content area of the infobar,
-  // rather than in the total height (which includes the bulge).
-  CGFloat superHeight = NSHeight(superViewFrame);
-  if ([[toMove superview] isKindOfClass:[InfoBarGradientView class]])
-    superHeight = InfoBarContainerDelegate::kDefaultBarTargetHeight;
-  viewFrame.origin.y =
-      floor((superHeight - NSHeight(viewFrame)) / 2.0);
-  [toMove setFrame:viewFrame];
-}
-
 // Creates a label control in the style we need for the infobar's labels
 // within |bounds|.
 NSTextField* CreateLabel(NSRect bounds) {
diff --git a/chrome/browser/ui/cocoa/infobars/translate_infobar_base.mm b/chrome/browser/ui/cocoa/infobars/translate_infobar_base.mm
index 5799535..799ea40b 100644
--- a/chrome/browser/ui/cocoa/infobars/translate_infobar_base.mm
+++ b/chrome/browser/ui/cocoa/infobars/translate_infobar_base.mm
@@ -18,7 +18,6 @@
 #include "chrome/browser/ui/cocoa/infobars/infobar_cocoa.h"
 #import "chrome/browser/ui/cocoa/infobars/infobar_container_controller.h"
 #import "chrome/browser/ui/cocoa/infobars/infobar_controller.h"
-#import "chrome/browser/ui/cocoa/infobars/infobar_gradient_view.h"
 #import "chrome/browser/ui/cocoa/infobars/infobar_utilities.h"
 #include "chrome/browser/ui/cocoa/infobars/translate_message_infobar_controller.h"
 #include "chrome/browser/ui/cocoa/l10n_util.h"
@@ -29,12 +28,20 @@
 #include "ui/base/ui_features.h"
 
 using InfoBarUtilities::MoveControl;
-using InfoBarUtilities::VerticallyCenterView;
 using InfoBarUtilities::CreateLabel;
 using InfoBarUtilities::AddMenuItem;
 
 namespace {
 
+// Vertically center |toMove| in its container.
+void VerticallyCenterView(NSView* toMove) {
+  NSRect superViewFrame = [[toMove superview] frame];
+  NSRect viewFrame = [toMove frame];
+  viewFrame.origin.y =
+      floor((NSHeight(superViewFrame) - NSHeight(viewFrame)) / 2.0);
+  [toMove setFrame:viewFrame];
+}
+
 // Check that the control |before| is ordered visually before the |after|
 // control. Also, check that there is space between them. Is RTL-aware.
 bool VerifyControlOrderAndSpacing(id before, id after) {
diff --git a/chrome/browser/ui/media_router/OWNERS b/chrome/browser/ui/media_router/OWNERS
new file mode 100644
index 0000000..dd66178
--- /dev/null
+++ b/chrome/browser/ui/media_router/OWNERS
@@ -0,0 +1 @@
+file://chrome/browser/media/router/OWNERS
diff --git a/chrome/browser/ui/webui/media_router/cast_modes_with_media_sources.cc b/chrome/browser/ui/media_router/cast_modes_with_media_sources.cc
similarity index 95%
rename from chrome/browser/ui/webui/media_router/cast_modes_with_media_sources.cc
rename to chrome/browser/ui/media_router/cast_modes_with_media_sources.cc
index 09aa90a0..7ecd56d 100644
--- a/chrome/browser/ui/webui/media_router/cast_modes_with_media_sources.cc
+++ b/chrome/browser/ui/media_router/cast_modes_with_media_sources.cc
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "chrome/browser/ui/media_router/cast_modes_with_media_sources.h"
 #include "base/stl_util.h"
-#include "chrome/browser/ui/webui/media_router/cast_modes_with_media_sources.h"
 
 namespace media_router {
 
diff --git a/chrome/browser/ui/webui/media_router/cast_modes_with_media_sources.h b/chrome/browser/ui/media_router/cast_modes_with_media_sources.h
similarity index 82%
rename from chrome/browser/ui/webui/media_router/cast_modes_with_media_sources.h
rename to chrome/browser/ui/media_router/cast_modes_with_media_sources.h
index d6fb466..54b5c22 100644
--- a/chrome/browser/ui/webui/media_router/cast_modes_with_media_sources.h
+++ b/chrome/browser/ui/media_router/cast_modes_with_media_sources.h
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_UI_WEBUI_MEDIA_ROUTER_CAST_MODES_WITH_MEDIA_SOURCES_H_
-#define CHROME_BROWSER_UI_WEBUI_MEDIA_ROUTER_CAST_MODES_WITH_MEDIA_SOURCES_H_
+#ifndef CHROME_BROWSER_UI_MEDIA_ROUTER_CAST_MODES_WITH_MEDIA_SOURCES_H_
+#define CHROME_BROWSER_UI_MEDIA_ROUTER_CAST_MODES_WITH_MEDIA_SOURCES_H_
 
 #include <map>
 #include <unordered_set>
 
-#include "chrome/browser/ui/webui/media_router/media_cast_mode.h"
+#include "chrome/browser/ui/media_router/media_cast_mode.h"
 #include "chrome/common/media_router/media_source.h"
 
 namespace media_router {
@@ -46,4 +46,4 @@
 
 }  // namespace media_router
 
-#endif  // CHROME_BROWSER_UI_WEBUI_MEDIA_ROUTER_CAST_MODES_WITH_MEDIA_SOURCES_H_
+#endif  // CHROME_BROWSER_UI_MEDIA_ROUTER_CAST_MODES_WITH_MEDIA_SOURCES_H_
diff --git a/chrome/browser/ui/webui/media_router/cast_modes_with_media_sources_unittest.cc b/chrome/browser/ui/media_router/cast_modes_with_media_sources_unittest.cc
similarity index 97%
rename from chrome/browser/ui/webui/media_router/cast_modes_with_media_sources_unittest.cc
rename to chrome/browser/ui/media_router/cast_modes_with_media_sources_unittest.cc
index 9c42856..6527e2c 100644
--- a/chrome/browser/ui/webui/media_router/cast_modes_with_media_sources_unittest.cc
+++ b/chrome/browser/ui/media_router/cast_modes_with_media_sources_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ui/webui/media_router/cast_modes_with_media_sources.h"
+#include "chrome/browser/ui/media_router/cast_modes_with_media_sources.h"
 
 #include "chrome/common/media_router/media_source_helper.h"
 #include "testing/gmock/include/gmock/gmock.h"
diff --git a/chrome/browser/ui/webui/media_router/media_cast_mode.cc b/chrome/browser/ui/media_router/media_cast_mode.cc
similarity index 95%
rename from chrome/browser/ui/webui/media_router/media_cast_mode.cc
rename to chrome/browser/ui/media_router/media_cast_mode.cc
index 7a5a75a9..19a99768 100644
--- a/chrome/browser/ui/webui/media_router/media_cast_mode.cc
+++ b/chrome/browser/ui/media_router/media_cast_mode.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ui/webui/media_router/media_cast_mode.h"
+#include "chrome/browser/ui/media_router/media_cast_mode.h"
 
 #include "base/logging.h"
 #include "base/strings/utf_string_conversions.h"
diff --git a/chrome/browser/ui/webui/media_router/media_cast_mode.h b/chrome/browser/ui/media_router/media_cast_mode.h
similarity index 88%
rename from chrome/browser/ui/webui/media_router/media_cast_mode.h
rename to chrome/browser/ui/media_router/media_cast_mode.h
index 3916ab9..bd48724 100644
--- a/chrome/browser/ui/webui/media_router/media_cast_mode.h
+++ b/chrome/browser/ui/media_router/media_cast_mode.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_UI_WEBUI_MEDIA_ROUTER_MEDIA_CAST_MODE_H_
-#define CHROME_BROWSER_UI_WEBUI_MEDIA_ROUTER_MEDIA_CAST_MODE_H_
+#ifndef CHROME_BROWSER_UI_MEDIA_ROUTER_MEDIA_CAST_MODE_H_
+#define CHROME_BROWSER_UI_MEDIA_ROUTER_MEDIA_CAST_MODE_H_
 
 #include <set>
 #include <string>
@@ -42,4 +42,4 @@
 
 }  // namespace media_router
 
-#endif  // CHROME_BROWSER_UI_WEBUI_MEDIA_ROUTER_MEDIA_CAST_MODE_H_
+#endif  // CHROME_BROWSER_UI_MEDIA_ROUTER_MEDIA_CAST_MODE_H_
diff --git a/chrome/browser/ui/webui/media_router/media_cast_mode_unittest.cc b/chrome/browser/ui/media_router/media_cast_mode_unittest.cc
similarity index 93%
rename from chrome/browser/ui/webui/media_router/media_cast_mode_unittest.cc
rename to chrome/browser/ui/media_router/media_cast_mode_unittest.cc
index b7b93f0..f5f1f2fe 100644
--- a/chrome/browser/ui/webui/media_router/media_cast_mode_unittest.cc
+++ b/chrome/browser/ui/media_router/media_cast_mode_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ui/webui/media_router/media_cast_mode.h"
+#include "chrome/browser/ui/media_router/media_cast_mode.h"
 
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/ui/webui/media_router/media_router_file_dialog.cc b/chrome/browser/ui/media_router/media_router_file_dialog.cc
similarity index 99%
rename from chrome/browser/ui/webui/media_router/media_router_file_dialog.cc
rename to chrome/browser/ui/media_router/media_router_file_dialog.cc
index 2506cbba..525df5b 100644
--- a/chrome/browser/ui/webui/media_router/media_router_file_dialog.cc
+++ b/chrome/browser/ui/media_router/media_router_file_dialog.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ui/webui/media_router/media_router_file_dialog.h"
+#include "chrome/browser/ui/media_router/media_router_file_dialog.h"
 
 #include <memory>
 
diff --git a/chrome/browser/ui/webui/media_router/media_router_file_dialog.h b/chrome/browser/ui/media_router/media_router_file_dialog.h
similarity index 95%
rename from chrome/browser/ui/webui/media_router/media_router_file_dialog.h
rename to chrome/browser/ui/media_router/media_router_file_dialog.h
index 29e8bac5..1e087b7 100644
--- a/chrome/browser/ui/webui/media_router/media_router_file_dialog.h
+++ b/chrome/browser/ui/media_router/media_router_file_dialog.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_UI_WEBUI_MEDIA_ROUTER_MEDIA_ROUTER_FILE_DIALOG_H_
-#define CHROME_BROWSER_UI_WEBUI_MEDIA_ROUTER_MEDIA_ROUTER_FILE_DIALOG_H_
+#ifndef CHROME_BROWSER_UI_MEDIA_ROUTER_MEDIA_ROUTER_FILE_DIALOG_H_
+#define CHROME_BROWSER_UI_MEDIA_ROUTER_MEDIA_ROUTER_FILE_DIALOG_H_
 
 #include "base/files/file_util.h"
 #include "base/task/cancelable_task_tracker.h"
@@ -159,4 +159,4 @@
 
 }  // namespace media_router
 
-#endif  // CHROME_BROWSER_UI_WEBUI_MEDIA_ROUTER_MEDIA_ROUTER_FILE_DIALOG_H_
+#endif  // CHROME_BROWSER_UI_MEDIA_ROUTER_MEDIA_ROUTER_FILE_DIALOG_H_
diff --git a/chrome/browser/ui/webui/media_router/media_router_file_dialog_unittest.cc b/chrome/browser/ui/media_router/media_router_file_dialog_unittest.cc
similarity index 98%
rename from chrome/browser/ui/webui/media_router/media_router_file_dialog_unittest.cc
rename to chrome/browser/ui/media_router/media_router_file_dialog_unittest.cc
index ea89c4b..f535327c 100644
--- a/chrome/browser/ui/webui/media_router/media_router_file_dialog_unittest.cc
+++ b/chrome/browser/ui/media_router/media_router_file_dialog_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ui/webui/media_router/media_router_file_dialog.h"
+#include "chrome/browser/ui/media_router/media_router_file_dialog.h"
 
 #include <memory>
 
diff --git a/chrome/browser/ui/webui/media_router/media_sink_with_cast_modes.cc b/chrome/browser/ui/media_router/media_sink_with_cast_modes.cc
similarity index 78%
rename from chrome/browser/ui/webui/media_router/media_sink_with_cast_modes.cc
rename to chrome/browser/ui/media_router/media_sink_with_cast_modes.cc
index 0c26af3..44e2e73 100644
--- a/chrome/browser/ui/webui/media_router/media_sink_with_cast_modes.cc
+++ b/chrome/browser/ui/media_router/media_sink_with_cast_modes.cc
@@ -2,19 +2,17 @@
 // 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/media_router/media_sink_with_cast_modes.h"
+#include "chrome/browser/ui/media_router/media_sink_with_cast_modes.h"
 
 namespace media_router {
 
 MediaSinkWithCastModes::MediaSinkWithCastModes(const MediaSink& sink)
-    : sink(sink) {
-}
+    : sink(sink) {}
 
 MediaSinkWithCastModes::MediaSinkWithCastModes(
     const MediaSinkWithCastModes& other) = default;
 
-MediaSinkWithCastModes::~MediaSinkWithCastModes() {
-}
+MediaSinkWithCastModes::~MediaSinkWithCastModes() {}
 
 bool MediaSinkWithCastModes::Equals(const MediaSinkWithCastModes& other) const {
   return sink.Equals(other.sink) && cast_modes == other.cast_modes;
diff --git a/chrome/browser/ui/webui/media_router/media_sink_with_cast_modes.h b/chrome/browser/ui/media_router/media_sink_with_cast_modes.h
similarity index 73%
rename from chrome/browser/ui/webui/media_router/media_sink_with_cast_modes.h
rename to chrome/browser/ui/media_router/media_sink_with_cast_modes.h
index 7006f68..4d71b9bb 100644
--- a/chrome/browser/ui/webui/media_router/media_sink_with_cast_modes.h
+++ b/chrome/browser/ui/media_router/media_sink_with_cast_modes.h
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_UI_WEBUI_MEDIA_ROUTER_MEDIA_SINK_WITH_CAST_MODES_H_
-#define CHROME_BROWSER_UI_WEBUI_MEDIA_ROUTER_MEDIA_SINK_WITH_CAST_MODES_H_
+#ifndef CHROME_BROWSER_UI_MEDIA_ROUTER_MEDIA_SINK_WITH_CAST_MODES_H_
+#define CHROME_BROWSER_UI_MEDIA_ROUTER_MEDIA_SINK_WITH_CAST_MODES_H_
 
 #include <set>
 
-#include "chrome/browser/ui/webui/media_router/media_cast_mode.h"
+#include "chrome/browser/ui/media_router/media_cast_mode.h"
 #include "chrome/common/media_router/media_sink.h"
 
 namespace media_router {
@@ -29,4 +29,4 @@
 
 }  // namespace media_router
 
-#endif  // CHROME_BROWSER_UI_WEBUI_MEDIA_ROUTER_MEDIA_SINK_WITH_CAST_MODES_H_
+#endif  // CHROME_BROWSER_UI_MEDIA_ROUTER_MEDIA_SINK_WITH_CAST_MODES_H_
diff --git a/chrome/browser/ui/webui/media_router/query_result_manager.cc b/chrome/browser/ui/media_router/query_result_manager.cc
similarity index 95%
rename from chrome/browser/ui/webui/media_router/query_result_manager.cc
rename to chrome/browser/ui/media_router/query_result_manager.cc
index 70165230..78759d84 100644
--- a/chrome/browser/ui/webui/media_router/query_result_manager.cc
+++ b/chrome/browser/ui/media_router/query_result_manager.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ui/webui/media_router/query_result_manager.h"
+#include "chrome/browser/ui/media_router/query_result_manager.h"
 
 #include <utility>
 
@@ -127,7 +127,7 @@
                                                         sink_pair.second);
     }
   }
-  return std::unique_ptr<MediaSource>();
+  return nullptr;
 }
 
 std::vector<MediaSource> QueryResultManager::GetSourcesForCastMode(
@@ -159,9 +159,8 @@
     const url::Origin& origin) {
   for (const MediaSource& source : sources) {
     if (!base::ContainsKey(sinks_observers_, source)) {
-      std::unique_ptr<MediaSourceMediaSinksObserver> observer(
-          new MediaSourceMediaSinksObserver(cast_mode, source, origin, router_,
-                                            this));
+      auto observer = std::make_unique<MediaSourceMediaSinksObserver>(
+          cast_mode, source, origin, router_, this);
       observer->Init();
       sinks_observers_[source] = std::move(observer);
     }
@@ -200,13 +199,13 @@
     const CastModesWithMediaSources& sources_for_sink) const {
   const auto& cast_mode_it = cast_mode_sources_.find(cast_mode);
   if (cast_mode_it == cast_mode_sources_.end())
-    return std::unique_ptr<MediaSource>();
+    return nullptr;
 
   for (const MediaSource& source : cast_mode_it->second) {
     if (sources_for_sink.HasSource(cast_mode, source))
       return std::make_unique<MediaSource>(source.id());
   }
-  return std::unique_ptr<MediaSource>();
+  return nullptr;
 }
 
 bool QueryResultManager::AreSourcesValidForCastMode(
diff --git a/chrome/browser/ui/webui/media_router/query_result_manager.h b/chrome/browser/ui/media_router/query_result_manager.h
similarity index 93%
rename from chrome/browser/ui/webui/media_router/query_result_manager.h
rename to chrome/browser/ui/media_router/query_result_manager.h
index 3e7c56d..9957b75 100644
--- a/chrome/browser/ui/webui/media_router/query_result_manager.h
+++ b/chrome/browser/ui/media_router/query_result_manager.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_UI_WEBUI_MEDIA_ROUTER_QUERY_RESULT_MANAGER_H_
-#define CHROME_BROWSER_UI_WEBUI_MEDIA_ROUTER_QUERY_RESULT_MANAGER_H_
+#ifndef CHROME_BROWSER_UI_MEDIA_ROUTER_QUERY_RESULT_MANAGER_H_
+#define CHROME_BROWSER_UI_MEDIA_ROUTER_QUERY_RESULT_MANAGER_H_
 
 #include <map>
 #include <memory>
@@ -15,9 +15,9 @@
 #include "base/macros.h"
 #include "base/observer_list.h"
 #include "chrome/browser/media/router/media_routes_observer.h"
-#include "chrome/browser/ui/webui/media_router/cast_modes_with_media_sources.h"
-#include "chrome/browser/ui/webui/media_router/media_cast_mode.h"
-#include "chrome/browser/ui/webui/media_router/media_sink_with_cast_modes.h"
+#include "chrome/browser/ui/media_router/cast_modes_with_media_sources.h"
+#include "chrome/browser/ui/media_router/media_cast_mode.h"
+#include "chrome/browser/ui/media_router/media_sink_with_cast_modes.h"
 #include "chrome/common/media_router/media_sink.h"
 #include "chrome/common/media_router/media_source.h"
 
@@ -178,4 +178,4 @@
 
 }  // namespace media_router
 
-#endif  // CHROME_BROWSER_UI_WEBUI_MEDIA_ROUTER_QUERY_RESULT_MANAGER_H_
+#endif  // CHROME_BROWSER_UI_MEDIA_ROUTER_QUERY_RESULT_MANAGER_H_
diff --git a/chrome/browser/ui/webui/media_router/query_result_manager_unittest.cc b/chrome/browser/ui/media_router/query_result_manager_unittest.cc
similarity index 95%
rename from chrome/browser/ui/webui/media_router/query_result_manager_unittest.cc
rename to chrome/browser/ui/media_router/query_result_manager_unittest.cc
index f03f84c..3a0adb0 100644
--- a/chrome/browser/ui/webui/media_router/query_result_manager_unittest.cc
+++ b/chrome/browser/ui/media_router/query_result_manager_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ui/webui/media_router/query_result_manager.h"
+#include "chrome/browser/ui/media_router/query_result_manager.h"
 
 #include "base/bind.h"
 #include "base/containers/hash_tables.h"
@@ -31,8 +31,8 @@
 
 class MockObserver : public QueryResultManager::Observer {
  public:
-  MOCK_METHOD1(OnResultsUpdated, void(
-                   const std::vector<MediaSinkWithCastModes>& sinks));
+  MOCK_METHOD1(OnResultsUpdated,
+               void(const std::vector<MediaSinkWithCastModes>& sinks));
 };
 
 }  // namespace
@@ -40,8 +40,7 @@
 class QueryResultManagerTest : public ::testing::Test {
  public:
   QueryResultManagerTest()
-      : mock_router_(), query_result_manager_(&mock_router_) {
-  }
+      : mock_router_(), query_result_manager_(&mock_router_) {}
 
   void DiscoverSinks(MediaCastMode cast_mode, const MediaSource& source) {
     EXPECT_CALL(mock_router_, RegisterMediaSinksObserver(_))
@@ -195,8 +194,8 @@
   sinks_query_result.push_back(sink1);
   sinks_query_result.push_back(sink2);
   sinks_query_result.push_back(sink3);
-  EXPECT_CALL(mock_observer_,
-              OnResultsUpdated(VectorEquals(expected_sinks))).Times(1);
+  EXPECT_CALL(mock_observer_, OnResultsUpdated(VectorEquals(expected_sinks)))
+      .Times(1);
   sinks_observer_it->second->OnSinksUpdated(sinks_query_result,
                                             std::vector<url::Origin>());
 
@@ -224,8 +223,8 @@
   sinks_observer_it = sinks_observers.find(tab_source);
   ASSERT_TRUE(sinks_observer_it != sinks_observers.end());
   ASSERT_TRUE(sinks_observer_it->second.get());
-  EXPECT_CALL(mock_observer_,
-              OnResultsUpdated(VectorEquals(expected_sinks))).Times(1);
+  EXPECT_CALL(mock_observer_, OnResultsUpdated(VectorEquals(expected_sinks)))
+      .Times(1);
   sinks_observer_it->second->OnSinksUpdated(
       sinks_query_result, {url::Origin::Create(GURL(kOrigin))});
 
@@ -245,8 +244,8 @@
   // The observer for the new source will be registered.
   EXPECT_CALL(mock_router_, RegisterMediaSinksObserver(_))
       .WillOnce(Return(true));
-  EXPECT_CALL(mock_observer_,
-              OnResultsUpdated(VectorEquals(expected_sinks))).Times(1);
+  EXPECT_CALL(mock_observer_, OnResultsUpdated(VectorEquals(expected_sinks)))
+      .Times(1);
   query_result_manager_.SetSourcesForCastMode(
       MediaCastMode::PRESENTATION, {presentation_source2},
       url::Origin::Create(GURL(kOrigin)));
@@ -269,8 +268,8 @@
   // Expected result:
   // Sinks: []
   expected_sinks.clear();
-  EXPECT_CALL(mock_observer_,
-              OnResultsUpdated(VectorEquals(expected_sinks))).Times(1);
+  EXPECT_CALL(mock_observer_, OnResultsUpdated(VectorEquals(expected_sinks)))
+      .Times(1);
   EXPECT_CALL(mock_router_, UnregisterMediaSinksObserver(_)).Times(1);
   query_result_manager_.RemoveSourcesForCastMode(MediaCastMode::TAB_MIRROR);
 
diff --git a/chrome/browser/ui/send_mouse_move_uitest_win.cc b/chrome/browser/ui/send_mouse_move_uitest_win.cc
index 20e3a21..98d72be 100644
--- a/chrome/browser/ui/send_mouse_move_uitest_win.cc
+++ b/chrome/browser/ui/send_mouse_move_uitest_win.cc
@@ -56,8 +56,9 @@
   }
 }
 
+// (crbug.com/827549): Flaky on Win10 bots.
 // Test that the mouse can be positioned at a few locations on the screen.
-IN_PROC_BROWSER_TEST_F(SendMouseMoveUITest, Probe) {
+IN_PROC_BROWSER_TEST_F(SendMouseMoveUITest, DISABLED_Probe) {
   // Make the browser fullscreen so that we can position the mouse anywhere on
   // the display, as ui_controls::SendMouseMoveNotifyWhenDone can only provide
   // notifications when the mouse is moved over a window belonging to the
diff --git a/chrome/browser/ui/tab_contents/core_tab_helper.cc b/chrome/browser/ui/tab_contents/core_tab_helper.cc
index e5030a1..208f061d 100644
--- a/chrome/browser/ui/tab_contents/core_tab_helper.cc
+++ b/chrome/browser/ui/tab_contents/core_tab_helper.cc
@@ -213,9 +213,6 @@
           l10n_util::GetStringFUTF16(IDS_LOAD_STATE_WAITING_FOR_RESPONSE,
                                      source->GetLoadStateHost());
       return true;
-    case net::LOAD_STATE_THROTTLED:
-      *status_text = l10n_util::GetStringUTF16(IDS_LOAD_STATE_THROTTLED);
-      return true;
     // Ignore net::LOAD_STATE_READING_RESPONSE and net::LOAD_STATE_IDLE
     case net::LOAD_STATE_IDLE:
     case net::LOAD_STATE_READING_RESPONSE:
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bar_view_test.cc b/chrome/browser/ui/views/bookmarks/bookmark_bar_view_test.cc
index d322329..57aaa0e 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_bar_view_test.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_bar_view_test.cc
@@ -86,9 +86,7 @@
   views::Widget* WaitForDialog() {
     if (dialog_created_)
       return dialog_;
-    base::MessageLoopForUI* loop = base::MessageLoopForUI::current();
-    base::MessageLoopForUI::ScopedNestableTaskAllower allow_nested(loop);
-    base::RunLoop run_loop;
+    base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
     quit_closure_ = run_loop.QuitClosure();
     run_loop.Run();
     return dialog_;
@@ -140,9 +138,7 @@
   void WaitForDialogClose() {
     if (dialog_closed_)
       return;
-    base::MessageLoopForUI* loop = base::MessageLoopForUI::current();
-    base::MessageLoopForUI::ScopedNestableTaskAllower allow_nested(loop);
-    base::RunLoop run_loop;
+    base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
     quit_closure_ = run_loop.QuitClosure();
     run_loop.Run();
   }
@@ -177,9 +173,7 @@
   void WaitForTab() {
     if (received_tab_)
       return;
-    base::MessageLoopForUI* loop = base::MessageLoopForUI::current();
-    base::MessageLoopForUI::ScopedNestableTaskAllower allow_nested(loop);
-    base::RunLoop run_loop;
+    base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
     quit_closure_ = run_loop.QuitClosure();
     run_loop.Run();
   }
@@ -335,11 +329,7 @@
     profile_.reset();
 
     // Run the message loop to ensure we delete allTasks and fully shut down.
-    base::MessageLoopForUI* loop = base::MessageLoopForUI::current();
-    base::MessageLoopForUI::ScopedNestableTaskAllower allow_nested(loop);
-    base::RunLoop run_loop;
-    loop->task_runner()->PostTask(FROM_HERE, run_loop.QuitClosure());
-    run_loop.Run();
+    base::RunLoop().RunUntilIdle();
 
     ViewEventTestBase::TearDown();
     BookmarkBarView::DisableAnimationsForTesting(false);
diff --git a/chrome/browser/ui/views/find_bar_views_interactive_uitest.cc b/chrome/browser/ui/views/find_bar_views_interactive_uitest.cc
index 271bd75..5b2aecbb 100644
--- a/chrome/browser/ui/views/find_bar_views_interactive_uitest.cc
+++ b/chrome/browser/ui/views/find_bar_views_interactive_uitest.cc
@@ -26,6 +26,7 @@
 #include "ui/base/clipboard/clipboard.h"
 #include "ui/events/keycodes/keyboard_codes.h"
 #include "ui/views/focus/focus_manager.h"
+#include "ui/views/style/platform_style.h"
 #include "ui/views/view.h"
 
 using base::ASCIIToUTF16;
@@ -274,13 +275,10 @@
   EXPECT_TRUE(IsViewFocused(browser(), VIEW_ID_OMNIBOX));
 }
 
-#if defined(OS_MACOSX)
-// Getting text from textfields doesn't always work: https://crbug.com/823532
-#define MAYBE_SelectionRestoreOnTabSwitch DISABLED_SelectionRestoreOnTabSwitch
-#else
-#define MAYBE_SelectionRestoreOnTabSwitch SelectionRestoreOnTabSwitch
-#endif
-IN_PROC_BROWSER_TEST_F(FindInPageTest, MAYBE_SelectionRestoreOnTabSwitch) {
+IN_PROC_BROWSER_TEST_F(FindInPageTest, SelectionRestoreOnTabSwitch) {
+  // Mac intentionally changes selection on focus.
+  if (views::PlatformStyle::kTextfieldScrollsToStartOnFocusChange)
+    return;
   ASSERT_TRUE(embedded_test_server()->Start());
 
   // Make sure Chrome is in the foreground, otherwise sending input
@@ -349,13 +347,7 @@
   EXPECT_EQ(ASCIIToUTF16("de"), GetFindBarSelectedText());
 }
 
-#if defined(OS_MACOSX)
-// Getting text from textfields doesn't always work: https://crbug.com/823532
-#define MAYBE_FocusRestoreOnTabSwitch DISABLED_FocusRestoreOnTabSwitch
-#else
-#define MAYBE_FocusRestoreOnTabSwitch FocusRestoreOnTabSwitch
-#endif
-IN_PROC_BROWSER_TEST_F(FindInPageTest, MAYBE_FocusRestoreOnTabSwitch) {
+IN_PROC_BROWSER_TEST_F(FindInPageTest, FocusRestoreOnTabSwitch) {
   ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
   ASSERT_TRUE(embedded_test_server()->Start());
 
@@ -387,7 +379,9 @@
   ui_test_utils::FindInPage(
       browser()->tab_strip_model()->GetActiveWebContents(),
       ASCIIToUTF16("b"), true, false, NULL, NULL);
-  EXPECT_EQ(ASCIIToUTF16("b"), GetFindBarSelectedText());
+  // Mac intentionally changes selection on focus.
+  if (!views::PlatformStyle::kTextfieldScrollsToStartOnFocusChange)
+    EXPECT_EQ(ASCIIToUTF16("b"), GetFindBarSelectedText());
 
   // Set focus away from the Find bar (to the Location bar).
   chrome::FocusLocationBar(browser());
@@ -396,7 +390,8 @@
   // Select tab A. Find bar should get focus.
   browser()->tab_strip_model()->ActivateTabAt(0, true);
   EXPECT_TRUE(IsViewFocused(browser(), VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
-  EXPECT_EQ(ASCIIToUTF16("a"), GetFindBarSelectedText());
+  if (!views::PlatformStyle::kTextfieldScrollsToStartOnFocusChange)
+    EXPECT_EQ(ASCIIToUTF16("a"), GetFindBarSelectedText());
 
   // Select tab B. Location bar should get focus.
   browser()->tab_strip_model()->ActivateTabAt(1, true);
diff --git a/chrome/browser/ui/views/simple_message_box_views.cc b/chrome/browser/ui/views/simple_message_box_views.cc
index 02c595e..f0b8125 100644
--- a/chrome/browser/ui/views/simple_message_box_views.cc
+++ b/chrome/browser/ui/views/simple_message_box_views.cc
@@ -59,9 +59,7 @@
 
   // TODO(pkotwicz): Exit message loop when the dialog is closed by some other
   // means than |Cancel| or |Accept|. crbug.com/404385
-  base::MessageLoopForUI* loop = base::MessageLoopForUI::current();
-  base::MessageLoopForUI::ScopedNestableTaskAllower allow_nested(loop);
-  base::RunLoop run_loop;
+  base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
 
   SimpleMessageBoxViews::Show(
       parent, title, message, type, yes_text, no_text, checkbox_text,
diff --git a/chrome/browser/ui/views/touch_events_interactive_uitest_win.cc b/chrome/browser/ui/views/touch_events_interactive_uitest_win.cc
index 6276558f..266f1e9 100644
--- a/chrome/browser/ui/views/touch_events_interactive_uitest_win.cc
+++ b/chrome/browser/ui/views/touch_events_interactive_uitest_win.cc
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/win/windows_version.h"
 #include "chrome/test/base/testing_profile.h"
@@ -35,15 +34,11 @@
   }
 
   void WaitForIdle() {
-    base::MessageLoopForUI* loop = base::MessageLoopForUI::current();
-    base::MessageLoopForUI::ScopedNestableTaskAllower allow_nested(loop);
-    base::RunLoop run_loop;
+    base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
     run_loop.RunUntilIdle();
   }
   void WaitForEvents() {
-    base::MessageLoopForUI* loop = base::MessageLoopForUI::current();
-    base::MessageLoopForUI::ScopedNestableTaskAllower allow_nested(loop);
-    base::RunLoop run_loop;
+    base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
     quit_closure_ = run_loop.QuitClosure();
     run_loop.Run();
   }
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
index e53fbf0..59394b2c 100644
--- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
@@ -532,11 +532,6 @@
       g_browser_process->local_state()->GetBoolean(prefs::kOobeMdMode);
   localized_strings->SetString("newOobeUI", oobe_ui_md_mode_ ? "on" : "off");
   localized_strings->SetString(
-      "errorScreenMDMode", base::CommandLine::ForCurrentProcess()->HasSwitch(
-                               chromeos::switches::kDisableMdErrorScreen)
-                               ? "off"
-                               : "on");
-  localized_strings->SetString(
       "showViewsLock", ash::switches::IsUsingViewsLock() ? "on" : "off");
   localized_strings->SetString(
       "showViewsLogin", ash::switches::IsUsingViewsLogin() ? "on" : "off");
diff --git a/chrome/browser/ui/webui/media_router/media_router_ui.h b/chrome/browser/ui/webui/media_router/media_router_ui.h
index e8abac5..3f03ed7e 100644
--- a/chrome/browser/ui/webui/media_router/media_router_ui.h
+++ b/chrome/browser/ui/webui/media_router/media_router_ui.h
@@ -20,11 +20,11 @@
 #include "chrome/browser/media/router/media_router_dialog_controller.h"
 #include "chrome/browser/media/router/mojo/media_route_controller.h"
 #include "chrome/browser/media/router/presentation/presentation_service_delegate_impl.h"
+#include "chrome/browser/ui/media_router/media_cast_mode.h"
+#include "chrome/browser/ui/media_router/media_router_file_dialog.h"
+#include "chrome/browser/ui/media_router/media_sink_with_cast_modes.h"
+#include "chrome/browser/ui/media_router/query_result_manager.h"
 #include "chrome/browser/ui/webui/constrained_web_dialog_ui.h"
-#include "chrome/browser/ui/webui/media_router/media_cast_mode.h"
-#include "chrome/browser/ui/webui/media_router/media_router_file_dialog.h"
-#include "chrome/browser/ui/webui/media_router/media_sink_with_cast_modes.h"
-#include "chrome/browser/ui/webui/media_router/query_result_manager.h"
 #include "chrome/common/media_router/issue.h"
 #include "chrome/common/media_router/media_source.h"
 #include "content/public/browser/web_ui_data_source.h"
diff --git a/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.cc b/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.cc
index c04434f..bcc32910 100644
--- a/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.cc
+++ b/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.cc
@@ -21,7 +21,6 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/signin/signin_manager_factory.h"
 #include "chrome/browser/sync/profile_sync_service_factory.h"
-#include "chrome/browser/ui/webui/media_router/media_cast_mode.h"
 #include "chrome/browser/ui/webui/media_router/media_router_ui.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/pref_names.h"
diff --git a/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.h b/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.h
index 8ebaa248..85d5559 100644
--- a/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.h
+++ b/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.h
@@ -13,8 +13,8 @@
 #include "base/files/file_path.h"
 #include "base/macros.h"
 #include "base/optional.h"
-#include "chrome/browser/ui/webui/media_router/media_cast_mode.h"
-#include "chrome/browser/ui/webui/media_router/media_sink_with_cast_modes.h"
+#include "chrome/browser/ui/media_router/media_cast_mode.h"
+#include "chrome/browser/ui/media_router/media_sink_with_cast_modes.h"
 #include "chrome/common/media_router/issue.h"
 #include "chrome/common/media_router/media_status.h"
 #include "components/signin/core/browser/account_info.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 6fa9f97..13885d2f 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
@@ -684,7 +684,6 @@
       {"displayResolutionSublabel", IDS_SETTINGS_DISPLAY_RESOLUTION_SUBLABEL},
       {"displayResolutionMenuItem", IDS_SETTINGS_DISPLAY_RESOLUTION_MENU_ITEM},
       {"displayZoomTitle", IDS_SETTINGS_DISPLAY_ZOOM_TITLE},
-      {"displayZoomSublabel", IDS_SETTINGS_DISPLAY_ZOOM_SUBLABEL},
       {"displayZoomValue", IDS_SETTINGS_DISPLAY_ZOOM_VALUE},
       {"displaySizeSliderMinLabel", IDS_SETTINGS_DISPLAY_ZOOM_SLIDER_MINIMUM},
       {"displaySizeSliderMaxLabel", IDS_SETTINGS_DISPLAY_ZOOM_SLIDER_MAXIMUM},
diff --git a/chrome/common/ppapi_utils.cc b/chrome/common/ppapi_utils.cc
index ae7fe7f2..57ecfd09 100644
--- a/chrome/common/ppapi_utils.cc
+++ b/chrome/common/ppapi_utils.cc
@@ -74,7 +74,6 @@
 #include "ppapi/c/ppb_websocket.h"
 #include "ppapi/c/private/ppb_camera_capabilities_private.h"
 #include "ppapi/c/private/ppb_camera_device_private.h"
-#include "ppapi/c/private/ppb_content_decryptor_private.h"
 #include "ppapi/c/private/ppb_ext_crx_file_system_private.h"
 #include "ppapi/c/private/ppb_file_io_private.h"
 #include "ppapi/c/private/ppb_file_ref_private.h"
diff --git a/chrome/profiling/memlog_receiver_pipe_win.cc b/chrome/profiling/memlog_receiver_pipe_win.cc
index 5aba545..37187c06 100644
--- a/chrome/profiling/memlog_receiver_pipe_win.cc
+++ b/chrome/profiling/memlog_receiver_pipe_win.cc
@@ -41,7 +41,7 @@
   ZeroOverlapped();
 
   DCHECK(!read_outstanding_);
-  read_outstanding_ = true;
+  read_outstanding_ = this;
   if (!::ReadFile(handle_.get().handle, read_buffer_.get(),
                   MemlogSenderPipe::kPipeSize, &bytes_read,
                   &context_.overlapped)) {
@@ -69,7 +69,9 @@
   // Note: any crashes with this on the stack are likely a result of destroying
   // a relevant class while there is I/O pending.
   DCHECK(read_outstanding_);
-  read_outstanding_ = false;
+  // Clear |read_outstanding_| but retain the reference to keep ourself alive
+  // until this function returns.
+  scoped_refptr<MemlogReceiverPipe> self(std::move(read_outstanding_));
 
   if (bytes_transfered && receiver_) {
     receiver_task_runner_->PostTask(
diff --git a/chrome/profiling/memlog_receiver_pipe_win.h b/chrome/profiling/memlog_receiver_pipe_win.h
index 26063646..064f5418 100644
--- a/chrome/profiling/memlog_receiver_pipe_win.h
+++ b/chrome/profiling/memlog_receiver_pipe_win.h
@@ -39,7 +39,9 @@
 
   base::MessagePumpForIO::IOContext context_;
 
-  bool read_outstanding_ = false;
+  // Used to keep |this| live while awaiting IO completion, which is required
+  // to avoid premature destruction during shutdown.
+  scoped_refptr<MemlogReceiverPipe> read_outstanding_;
 
   std::unique_ptr<char[]> read_buffer_;
 
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 59a69bf..1aa67fe 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -3103,22 +3103,22 @@
       "../browser/renderer_context_menu/render_view_context_menu_test_util.h",
       "../browser/ui/autofill/save_card_bubble_controller_impl_unittest.cc",
       "../browser/ui/bluetooth/bluetooth_chooser_controller_unittest.cc",
+      "../browser/ui/media_router/cast_modes_with_media_sources_unittest.cc",
+      "../browser/ui/media_router/media_cast_mode_unittest.cc",
+      "../browser/ui/media_router/media_router_file_dialog_unittest.cc",
+      "../browser/ui/media_router/query_result_manager_unittest.cc",
       "../browser/ui/passwords/manage_passwords_ui_controller_unittest.cc",
       "../browser/ui/toolbar/media_router_action_controller_unittest.cc",
       "../browser/ui/toolbar/media_router_action_unittest.cc",
       "../browser/ui/toolbar/media_router_contextual_menu_unittest.cc",
       "../browser/ui/toolbar/mock_media_router_action_controller.cc",
       "../browser/ui/toolbar/mock_media_router_action_controller.h",
-      "../browser/ui/webui/media_router/cast_modes_with_media_sources_unittest.cc",
-      "../browser/ui/webui/media_router/media_cast_mode_unittest.cc",
       "../browser/ui/webui/media_router/media_router_dialog_controller_impl_unittest.cc",
-      "../browser/ui/webui/media_router/media_router_file_dialog_unittest.cc",
       "../browser/ui/webui/media_router/media_router_ui_service_factory_unittest.cc",
       "../browser/ui/webui/media_router/media_router_ui_unittest.cc",
       "../browser/ui/webui/media_router/media_router_web_ui_test.cc",
       "../browser/ui/webui/media_router/media_router_web_ui_test.h",
       "../browser/ui/webui/media_router/media_router_webui_message_handler_unittest.cc",
-      "../browser/ui/webui/media_router/query_result_manager_unittest.cc",
       "../common/media_router/discovery/media_sink_internal_unittest.cc",
       "../common/media_router/discovery/media_sink_service_base_unittest.cc",
       "../common/media_router/mojo/media_router_struct_traits_unittest.cc",
diff --git a/chrome/test/data/webui/extensions/cr_extensions_browsertest.js b/chrome/test/data/webui/extensions/cr_extensions_browsertest.js
index c61468c..4fcbce39 100644
--- a/chrome/test/data/webui/extensions/cr_extensions_browsertest.js
+++ b/chrome/test/data/webui/extensions/cr_extensions_browsertest.js
@@ -192,6 +192,10 @@
   this.runMochaTest(extension_item_tests.TestNames.RemoveButton);
 });
 
+TEST_F('CrExtensionsItemsTest', 'HtmlInName', function() {
+  this.runMochaTest(extension_item_tests.TestNames.HtmlInName);
+});
+
 ////////////////////////////////////////////////////////////////////////////////
 // Extension Detail View Tests
 
diff --git a/chrome/test/data/webui/extensions/extension_item_test.js b/chrome/test/data/webui/extensions/extension_item_test.js
index f869f86..f573754 100644
--- a/chrome/test/data/webui/extensions/extension_item_test.js
+++ b/chrome/test/data/webui/extensions/extension_item_test.js
@@ -74,6 +74,7 @@
     SourceIndicator: 'source indicator',
     EnableToggle: 'toggle is disabled when necessary',
     RemoveButton: 'remove button hidden when necessary',
+    HtmlInName: 'html in extension name',
   };
 
   var suiteName = 'ExtensionItemTest';
@@ -322,6 +323,16 @@
       Polymer.dom.flush();
       expectTrue(item.$['remove-button'].hidden);
     });
+
+    test(assert(TestNames.HtmlInName), function() {
+      let name = '<HTML> in the name!';
+      item.set('data.name', name);
+      Polymer.dom.flush();
+      assertEquals(name, item.$.name.textContent.trim());
+      // "Related to $1" is IDS_MD_EXTENSIONS_EXTENSION_A11Y_ASSOCIATION.
+      assertEquals(
+          `Related to ${name}`, item.$.a11yAssociation.textContent.trim());
+    });
   });
 
   return {
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js
index c06c05c2..91a2deb 100644
--- a/chrome/test/data/webui/settings/cr_settings_browsertest.js
+++ b/chrome/test/data/webui/settings/cr_settings_browsertest.js
@@ -1874,28 +1874,3 @@
 TEST_F('CrSettingsOnStartupPageTest', 'All', function() {
   mocha.run();
 });
-GEN('#if defined(OS_CHROMEOS)');
-
-/**
- * @constructor
- * @extends {CrSettingsBrowserTest}
- */
-function CrSettingsDisplaySizeSliderTest() {}
-
-CrSettingsDisplaySizeSliderTest.prototype = {
-  __proto__: CrSettingsBrowserTest.prototype,
-
-  /** @override */
-  browsePreload: 'chrome://settings/device_page/display_size_slider.html',
-
-  /** @override */
-  extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'display_size_slider_test.js',
-  ]),
-};
-
-TEST_F('CrSettingsDisplaySizeSliderTest', 'All', function() {
-  mocha.run();
-});
-GEN('#endif  // defined(OS_CHROMEOS)');
-
diff --git a/chrome/test/data/webui/settings/display_size_slider_test.js b/chrome/test/data/webui/settings/display_size_slider_test.js
deleted file mode 100644
index a1bf439..0000000
--- a/chrome/test/data/webui/settings/display_size_slider_test.js
+++ /dev/null
@@ -1,292 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/** @fileoverview Suite of tests for display-size-slider. */
-suite('DisplaySizeSlider', function() {
-  /** @type {!CrSliderElement} */
-  let slider;
-
-  /** @type {!SliderTicks} */
-  let ticks = [];
-
-  setup(function() {
-    PolymerTest.clearBody();
-    const tickValues = [2, 4, 8, 16, 32, 64, 128];
-    ticks = [];
-    for (let i = 0; i < tickValues.length; i++) {
-      ticks.push({
-        value: tickValues[i],
-        label: tickValues[i].toString()
-      });
-    }
-
-    slider = document.createElement('display-size-slider');
-    slider.ticks = ticks;
-    slider.pref = {
-      type: chrome.settingsPrivate.PrefType.NUMBER,
-      value: ticks[3].value,
-    };
-    document.body.appendChild(slider);
-  });
-
-  test('initialization', function() {
-    const selectedIndex = 3;
-
-    assertFalse(slider.disabled);
-    assertFalse(slider.dragging);
-    assertFalse(slider.expand);
-    expectEquals(selectedIndex, slider.index);
-    expectEquals(ticks.length - 1, slider.markers.length);
-    expectEquals(ticks[selectedIndex].value, slider.pref.value);
-  });
-
-  test('check knob position changes', function() {
-    let expectedIndex = 3;
-    expectEquals(expectedIndex, slider.index);
-    expectEquals(ticks[expectedIndex].value, slider.pref.value);
-
-    let expectedLeftPercentage = (expectedIndex * 100) / (ticks.length - 1);
-    expectEquals(expectedLeftPercentage + '%', slider.$.sliderKnob.style.left);
-
-    // Reset the index to the first tick.
-    slider.resetToMinIndex_();
-    expectedIndex = 0;
-    expectEquals(expectedIndex, slider.index);
-    expectEquals('0%', slider.$.sliderKnob.style.left);
-    expectEquals(ticks[expectedIndex].value, slider.pref.value);
-
-    // Decrementing the slider below the lowest index should have no effect.
-    slider.decrement_();
-    expectEquals(expectedIndex, slider.index);
-    expectEquals('0%', slider.$.sliderKnob.style.left);
-    expectEquals(ticks[expectedIndex].value, slider.pref.value);
-
-    // Reset the index to the last tick.
-    slider.resetToMaxIndex_();
-    expectedIndex = ticks.length - 1;
-    expectEquals(expectedIndex, slider.index);
-    expectEquals('100%', slider.$.sliderKnob.style.left);
-    expectEquals(ticks[expectedIndex].value, slider.pref.value);
-
-    // Incrementing the slider when it is already at max should have no effect.
-    slider.increment_();
-    expectEquals(expectedIndex, slider.index);
-    expectEquals('100%', slider.$.sliderKnob.style.left);
-    expectEquals(ticks[expectedIndex].value, slider.pref.value);
-
-    slider.decrement_();
-    expectedIndex -= 1;
-    expectEquals(expectedIndex, slider.index);
-    expectedLeftPercentage = (expectedIndex * 100) / (ticks.length - 1);
-    expectEquals(Math.round(expectedLeftPercentage),
-                 Math.round(parseFloat(slider.$.sliderKnob.style.left)));
-    expectEquals(ticks[expectedIndex].value, slider.pref.value);
-
-  });
-
-  test('check keyboard events', function() {
-    let expectedIndex = 3;
-    expectEquals(expectedIndex, slider.index);
-
-    // Right keypress should increment the slider by 1.
-    MockInteractions.pressAndReleaseKeyOn(slider, 39 /* right */);
-    expectedIndex += 1;
-    expectEquals(expectedIndex, slider.index);
-
-    // Left keypress should decrement the slider by 1.
-    MockInteractions.pressAndReleaseKeyOn(slider, 37 /* left */);
-    expectedIndex -= 1;
-    expectEquals(expectedIndex, slider.index);
-
-    // Page down should take the slider to the first value.
-    MockInteractions.pressAndReleaseKeyOn(slider, 34 /* page down */);
-    expectedIndex = 0;
-    expectEquals(expectedIndex, slider.index);
-
-    // Page up should take the slider to the last value.
-    MockInteractions.pressAndReleaseKeyOn(slider, 33 /* page up */);
-    expectedIndex = ticks.length - 1;
-    expectEquals(expectedIndex, slider.index);
-
-    // Down keypress should decrement the slider index by 1.
-    MockInteractions.pressAndReleaseKeyOn(slider, 40 /* down */);
-    expectedIndex -= 1;
-    expectEquals(expectedIndex, slider.index);
-
-    // Up keypress should increment the slider index by 1.
-    MockInteractions.pressAndReleaseKeyOn(slider, 38 /* up */);
-    expectedIndex += 1;
-    expectEquals(expectedIndex, slider.index);
-
-    // Home button should take the slider to the first value.
-    MockInteractions.pressAndReleaseKeyOn(slider, 36 /* home */);
-    expectedIndex = 0;
-    expectEquals(expectedIndex, slider.index);
-
-    // End button should take the slider to the last value.
-    MockInteractions.pressAndReleaseKeyOn(slider, 35 /* up */);
-    expectedIndex = ticks.length - 1;
-    expectEquals(expectedIndex, slider.index);
-  });
-
-  test('set pref updates slider', function() {
-    let expectedIndex = 3;
-    expectEquals(expectedIndex, slider.index);
-    expectEquals(ticks[expectedIndex].value, slider.pref.value);
-
-    let newIndex = 4;
-    slider.set('pref.value', ticks[newIndex].value);
-    expectEquals(newIndex, slider.index);
-
-    let expectedLeftPercentage = (newIndex * 100) / (ticks.length - 1);
-    expectEquals(Math.round(expectedLeftPercentage),
-                 Math.round(parseFloat(slider.$.sliderKnob.style.left)));
-  });
-
-  test('check label values', function() {
-    expectEquals('none', getComputedStyle(slider.$.labelContainer).display);
-    let hoverClassName = 'hover';
-    slider.$.sliderContainer.classList.add(hoverClassName);
-    expectEquals('block', getComputedStyle(slider.$.labelContainer).display);
-
-    expectEquals(ticks[slider.index].label, slider.$.labelText.innerText);
-
-    slider.increment_();
-    expectEquals(ticks[slider.index].label, slider.$.labelText.innerText);
-
-    slider.resetToMaxIndex_();
-    expectEquals(ticks[slider.index].label, slider.$.labelText.innerText);
-
-    slider.resetToMinIndex_();
-    expectEquals(ticks[slider.index].label, slider.$.labelText.innerText);
-  });
-
-  test('check knob expansion', function() {
-    assertFalse(slider.expand);
-    let oldIndex = slider.index;
-
-    MockInteractions.down(slider.$.sliderKnob);
-    assertTrue(slider.expand);
-    expectEquals(oldIndex, slider.index);
-    expectEquals(ticks[oldIndex].value, slider.pref.value);
-
-
-    MockInteractions.up(slider.$.sliderKnob);
-    assertFalse(slider.expand);
-    expectEquals(oldIndex, slider.index);
-    expectEquals(ticks[oldIndex].value, slider.pref.value);
-  });
-
-  test('mouse interactions with the slider knobs', function() {
-    let oldIndex = slider.index;
-    const sliderKnob = slider.$.sliderKnob;
-    // Width of each tick.
-    const tickWidth = slider.$.sliderBar.offsetWidth / (ticks.length - 1);
-
-    MockInteractions.down(sliderKnob);
-
-    let currentPos = MockInteractions.middleOfNode(sliderKnob);
-    let nextPos = {
-      x: currentPos.x + tickWidth,
-      y: currentPos.y
-    };
-    MockInteractions.move(sliderKnob, currentPos, nextPos);
-
-    // Mouse is still down. So the slider should still be expanded.
-    assertTrue(slider.expand);
-
-    // The label should be visible.
-    expectEquals('block', getComputedStyle(slider.$.labelContainer).display);
-
-    // We moved by 1 tick width, so the slider index must have increased.
-    expectEquals(oldIndex + 1, slider.index);
-
-    // The mouse is still down, so the pref should not be updated.
-    expectEquals(ticks[oldIndex].value, slider.pref.value);
-
-    MockInteractions.up(sliderKnob);
-
-    // Now that the mouse is down, the pref value should be updated.
-    expectEquals(ticks[oldIndex + 1].value, slider.pref.value);
-
-    oldIndex = slider.index;
-    MockInteractions.track(sliderKnob, -3 * tickWidth, 0);
-    expectEquals(oldIndex - 3, slider.index);
-    expectEquals(ticks[oldIndex - 3].value, slider.pref.value);
-
-    // Moving by a very large amount should clamp the value.
-    oldIndex = slider.index;
-    MockInteractions.track(sliderKnob, 100 * tickWidth, 0);
-    expectEquals(ticks.length - 1, slider.index);
-    expectEquals(ticks[ticks.length - 1].value, slider.pref.value);
-
-    // Similarly for the other side.
-    oldIndex = slider.index;
-    MockInteractions.track(sliderKnob, -100 * tickWidth, 0);
-    expectEquals(0, slider.index);
-    expectEquals(ticks[0].value, slider.pref.value);
-  });
-
-  test('mouse interaction with the bar', function() {
-    const sliderBar = slider.$.sliderBar;
-    const sliderBarOrigin = {
-      x: sliderBar.getBoundingClientRect().x,
-      y: sliderBar.getBoundingClientRect().y
-    };
-
-    let oldIndex = slider.index;
-    MockInteractions.down(sliderBar, sliderBarOrigin);
-
-    // Mouse down on the left end of the slider bar should move the knob there.
-    expectEquals(0, slider.index);
-    expectEquals(0, Math.round(parseFloat(slider.$.sliderKnob.style.left)));
-
-    // However the pref value should not update until the mouse is released.
-    expectEquals(ticks[oldIndex].value, slider.pref.value);
-
-    // Release mouse to update pref value.
-    MockInteractions.up(sliderBar);
-    expectEquals(ticks[slider.index].value, slider.pref.value);
-
-    const tickWidth =
-        sliderBar.getBoundingClientRect().width / (ticks.length - 1);
-    let expectedIndex = 3;
-    // The knob position for the 3rd index.
-    let sliderBarPos = {
-      x: sliderBarOrigin.x + tickWidth * expectedIndex,
-      y: sliderBarOrigin.y
-    };
-
-    oldIndex = slider.index;
-    // Clicking at the 3rd index position on the slider bar should update the
-    // knob.
-    MockInteractions.down(sliderBar, sliderBarPos);
-    let expectedLeftPercentage =
-        (tickWidth * expectedIndex * 100) / sliderBar.offsetWidth;
-    expectEquals(Math.round(expectedLeftPercentage),
-                 Math.round(parseFloat(slider.$.sliderKnob.style.left)));
-    expectEquals(expectedIndex, slider.index);
-    expectEquals(ticks[oldIndex].value, slider.pref.value);
-
-    // The slider has not yet started dragging.
-    assertFalse(slider.dragging);
-
-    expectedIndex = 5;
-    const nextSliderBarPos = {
-      x: sliderBarPos.x + tickWidth * (expectedIndex - slider.index),
-      y: sliderBarPos.y
-    };
-    MockInteractions.move(sliderBar, sliderBarPos, nextSliderBarPos);
-    expectEquals(expectedIndex, slider.index);
-    expectedLeftPercentage =
-        (tickWidth * expectedIndex * 100) / sliderBar.offsetWidth;
-    expectEquals(Math.round(expectedLeftPercentage),
-                 Math.round(parseFloat(slider.$.sliderKnob.style.left)));
-
-    expectEquals(ticks[oldIndex].value, slider.pref.value);
-
-    MockInteractions.up(sliderBar);
-    expectEquals(ticks[expectedIndex].value, slider.pref.value);
-  });
-});
diff --git a/chrome/test/media_router/media_router_integration_browsertest.cc b/chrome/test/media_router/media_router_integration_browsertest.cc
index f863c1d..ec84ed2 100644
--- a/chrome/test/media_router/media_router_integration_browsertest.cc
+++ b/chrome/test/media_router/media_router_integration_browsertest.cc
@@ -18,11 +18,11 @@
 #include "chrome/browser/media/router/media_router_feature.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser_finder.h"
+#include "chrome/browser/ui/media_router/media_cast_mode.h"
+#include "chrome/browser/ui/media_router/media_router_file_dialog.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
-#include "chrome/browser/ui/webui/media_router/media_cast_mode.h"
 #include "chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.h"
-#include "chrome/browser/ui/webui/media_router/media_router_file_dialog.h"
 #include "chrome/browser/ui/webui/media_router/media_router_ui.h"
 #include "chrome/common/media_router/issue.h"
 #include "chrome/common/url_constants.h"
diff --git a/chrome/test/media_router/media_router_integration_browsertest.h b/chrome/test/media_router/media_router_integration_browsertest.h
index ce3400c9..239b9ad 100644
--- a/chrome/test/media_router/media_router_integration_browsertest.h
+++ b/chrome/test/media_router/media_router_integration_browsertest.h
@@ -11,8 +11,8 @@
 #include "base/debug/stack_trace.h"
 #include "base/files/file_path.h"
 #include "base/test/scoped_feature_list.h"
+#include "chrome/browser/ui/media_router/media_cast_mode.h"
 #include "chrome/browser/ui/toolbar/media_router_action.h"
-#include "chrome/browser/ui/webui/media_router/media_cast_mode.h"
 #include "chrome/test/media_router/media_router_base_browsertest.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/test_navigation_observer.h"
diff --git a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsComponent.java b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsComponent.java
index 2b7a3eb..996cfd3 100644
--- a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsComponent.java
+++ b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsComponent.java
@@ -252,10 +252,6 @@
     }
 
     public void start(StartParams params) {
-        if (mStarted) {
-            if (DEBUG) Log.d(TAG, " Instance (ID:" + mInstanceId + ") already started.");
-            return;
-        }
         if (DEBUG) {
             Log.d(TAG,
                     "Starting WebContents with delegate: " + mDelegate.getClass().getSimpleName()
diff --git a/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/CastWebContentsComponentTest.java b/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/CastWebContentsComponentTest.java
index 2f3a4d6..8441ff2 100644
--- a/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/CastWebContentsComponentTest.java
+++ b/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/CastWebContentsComponentTest.java
@@ -234,8 +234,8 @@
         StartParams params2 = new StartParams(mActivity, mWebContents, "test", 1);
         component.start(params2);
         Assert.assertTrue(component.isStarted());
-        verify(delegate, times(1)).start(any(StartParams.class));
-        verify(delegate, times(0)).start(eq(params2));
+        verify(delegate, times(2)).start(any(StartParams.class));
+        verify(delegate, times(1)).start(eq(params2));
         component.stop(mActivity);
         Assert.assertFalse(component.isStarted());
         verify(delegate, times(1)).stop(any(Context.class));
diff --git a/chromecast/device/bluetooth/le/BUILD.gn b/chromecast/device/bluetooth/le/BUILD.gn
index f8054b7..4beb61db 100644
--- a/chromecast/device/bluetooth/le/BUILD.gn
+++ b/chromecast/device/bluetooth/le/BUILD.gn
@@ -19,6 +19,11 @@
     "remote_service.cc",
     "remote_service.h",
   ]
+
+  public_deps = [
+    "//chromecast/public",
+  ]
+
   deps = [
     "//base",
     "//chromecast/base",
diff --git a/chromeos/chromeos_switches.cc b/chromeos/chromeos_switches.cc
index e0633a3..7a181d9 100644
--- a/chromeos/chromeos_switches.cc
+++ b/chromeos/chromeos_switches.cc
@@ -224,9 +224,6 @@
 // Disables requests for an enterprise machine certificate during attestation.
 const char kDisableMachineCertRequest[] = "disable-machine-cert-request";
 
-// Disables material design Error screen.
-const char kDisableMdErrorScreen[] = "disable-md-error-screen";
-
 // Disables mtp write support.
 const char kDisableMtpWriteSupport[] = "disable-mtp-write-support";
 
diff --git a/chromeos/chromeos_switches.h b/chromeos/chromeos_switches.h
index 9e743b10..1a29e36c 100644
--- a/chromeos/chromeos_switches.h
+++ b/chromeos/chromeos_switches.h
@@ -68,7 +68,6 @@
 CHROMEOS_EXPORT extern const char kDisableLockScreenApps[];
 CHROMEOS_EXPORT extern const char kDisableLoginAnimations[];
 CHROMEOS_EXPORT extern const char kDisableMachineCertRequest[];
-CHROMEOS_EXPORT extern const char kDisableMdErrorScreen[];
 CHROMEOS_EXPORT extern const char kDisableMtpWriteSupport[];
 CHROMEOS_EXPORT extern const char kDisableMultiDisplayLayout[];
 CHROMEOS_EXPORT extern const char kDisableNetworkPortalNotification[];
diff --git a/components/cronet/android/api/src/org/chromium/net/ExperimentalUrlRequest.java b/components/cronet/android/api/src/org/chromium/net/ExperimentalUrlRequest.java
index d806d33..0e6aac6 100644
--- a/components/cronet/android/api/src/org/chromium/net/ExperimentalUrlRequest.java
+++ b/components/cronet/android/api/src/org/chromium/net/ExperimentalUrlRequest.java
@@ -89,6 +89,22 @@
             return this;
         }
 
+        /**
+         * Sets a listener that gets invoked after {@link Callback#onCanceled onCanceled()},
+         * {@link Callback#onFailed onFailed()} or {@link Callback#onSucceeded onSucceeded()}
+         * return.
+         *
+         * <p>The listener is invoked  with the request finished info on an
+         * {@link java.util.concurrent.Executor} provided by
+         * {@link RequestFinishedInfo.Listener#getExecutor getExecutor()}.
+         *
+         * @param listener the listener for finished requests.
+         * @return the builder to facilitate chaining.
+         */
+        public Builder setRequestFinishedListener(RequestFinishedInfo.Listener listener) {
+            return this;
+        }
+
         // To support method chaining, override superclass methods to return an
         // instance of this class instead of the parent.
 
diff --git a/components/cronet/android/api_version.txt b/components/cronet/android/api_version.txt
index f599e28..b4de394 100644
--- a/components/cronet/android/api_version.txt
+++ b/components/cronet/android/api_version.txt
@@ -1 +1 @@
-10
+11
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/CronetEngineBase.java b/components/cronet/android/java/src/org/chromium/net/impl/CronetEngineBase.java
index 6f988e25..b5bce25 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/CronetEngineBase.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/CronetEngineBase.java
@@ -4,6 +4,7 @@
 package org.chromium.net.impl;
 
 import android.support.annotation.IntDef;
+import android.support.annotation.Nullable;
 
 import static org.chromium.net.UrlRequest.Builder.REQUEST_PRIORITY_HIGHEST;
 import static org.chromium.net.UrlRequest.Builder.REQUEST_PRIORITY_IDLE;
@@ -15,6 +16,7 @@
 import org.chromium.net.ExperimentalBidirectionalStream;
 import org.chromium.net.ExperimentalCronetEngine;
 import org.chromium.net.ExperimentalUrlRequest;
+import org.chromium.net.RequestFinishedInfo;
 import org.chromium.net.UrlRequest;
 
 import java.lang.annotation.Retention;
@@ -56,13 +58,15 @@
      * @param trafficStatsUidSet {@code true} if {@code trafficStatsUid} represents a UID to
      *         attribute traffic used to perform this request.
      * @param trafficStatsUid UID to attribute traffic used to perform this request.
+     * @param requestFinishedListener callback to get invoked with metrics when request is finished.
+     *        Set to {@code null} if not used.
      * @return new request.
      */
     protected abstract UrlRequestBase createRequest(String url, UrlRequest.Callback callback,
             Executor executor, @RequestPriority int priority, Collection<Object> requestAnnotations,
             boolean disableCache, boolean disableConnectionMigration, boolean allowDirectExecutor,
             boolean trafficStatsTagSet, int trafficStatsTag, boolean trafficStatsUidSet,
-            int trafficStatsUid);
+            int trafficStatsUid, @Nullable RequestFinishedInfo.Listener requestFinishedListener);
 
     /**
      * Creates a {@link BidirectionalStream} object. {@code callback} methods will
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequest.java b/components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequest.java
index cb0e52b2..4d0c71c 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequest.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequest.java
@@ -84,6 +84,7 @@
     private final int mTrafficStatsTag;
     private final boolean mTrafficStatsUidSet;
     private final int mTrafficStatsUid;
+    private final VersionSafeCallbacks.RequestFinishedInfoListener mRequestFinishedListener;
 
     private CronetUploadDataStream mUploadDataStream;
 
@@ -136,7 +137,7 @@
             UrlRequest.Callback callback, Executor executor, Collection<Object> requestAnnotations,
             boolean disableCache, boolean disableConnectionMigration, boolean allowDirectExecutor,
             boolean trafficStatsTagSet, int trafficStatsTag, boolean trafficStatsUidSet,
-            int trafficStatsUid) {
+            int trafficStatsUid, RequestFinishedInfo.Listener requestFinishedListener) {
         if (url == null) {
             throw new NullPointerException("URL is required");
         }
@@ -161,6 +162,9 @@
         mTrafficStatsTag = trafficStatsTag;
         mTrafficStatsUidSet = trafficStatsUidSet;
         mTrafficStatsUid = trafficStatsUid;
+        mRequestFinishedListener = requestFinishedListener != null
+                ? new VersionSafeCallbacks.RequestFinishedInfoListener(requestFinishedListener)
+                : null;
     }
 
     @Override
@@ -204,8 +208,10 @@
                 mUrlRequestAdapter =
                         nativeCreateRequestAdapter(mRequestContext.getUrlRequestContextAdapter(),
                                 mInitialUrl, mPriority, mDisableCache, mDisableConnectionMigration,
-                                mRequestContext.hasRequestFinishedListener(), mTrafficStatsTagSet,
-                                mTrafficStatsTag, mTrafficStatsUidSet, mTrafficStatsUid);
+                                mRequestContext.hasRequestFinishedListener()
+                                        || mRequestFinishedListener != null,
+                                mTrafficStatsTagSet, mTrafficStatsTag, mTrafficStatsUidSet,
+                                mTrafficStatsUid);
                 mRequestContext.onRequestStarted();
                 if (mInitialMethod != null) {
                     if (!nativeSetHttpMethod(mUrlRequestAdapter, mInitialMethod)) {
@@ -793,8 +799,22 @@
     // after Callback's onSucceeded, onFailed and onCanceled.
     private void maybeReportMetrics() {
         if (mMetrics != null) {
-            mRequestContext.reportFinished(new RequestFinishedInfoImpl(mInitialUrl,
-                    mRequestAnnotations, mMetrics, mFinishedReason, mResponseInfo, mException));
+            final RequestFinishedInfo requestInfo = new RequestFinishedInfoImpl(mInitialUrl,
+                    mRequestAnnotations, mMetrics, mFinishedReason, mResponseInfo, mException);
+            mRequestContext.reportFinished(requestInfo);
+            if (mRequestFinishedListener != null) {
+                try {
+                    mRequestFinishedListener.getExecutor().execute(new Runnable() {
+                        @Override
+                        public void run() {
+                            mRequestFinishedListener.onRequestFinished(requestInfo);
+                        }
+                    });
+                } catch (RejectedExecutionException failException) {
+                    Log.e(CronetUrlRequestContext.LOG_TAG, "Exception posting task to executor",
+                            failException);
+                }
+            }
         }
     }
 
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequestContext.java b/components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequestContext.java
index 3b14f1e..13f61011 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequestContext.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequestContext.java
@@ -226,12 +226,13 @@
             int priority, Collection<Object> requestAnnotations, boolean disableCache,
             boolean disableConnectionMigration, boolean allowDirectExecutor,
             boolean trafficStatsTagSet, int trafficStatsTag, boolean trafficStatsUidSet,
-            int trafficStatsUid) {
+            int trafficStatsUid, RequestFinishedInfo.Listener requestFinishedListener) {
         synchronized (mLock) {
             checkHaveAdapter();
             return new CronetUrlRequest(this, url, priority, callback, executor, requestAnnotations,
                     disableCache, disableConnectionMigration, allowDirectExecutor,
-                    trafficStatsTagSet, trafficStatsTag, trafficStatsUidSet, trafficStatsUid);
+                    trafficStatsTagSet, trafficStatsTag, trafficStatsUidSet, trafficStatsUid,
+                    requestFinishedListener);
         }
     }
 
@@ -674,6 +675,7 @@
     void reportFinished(final RequestFinishedInfo requestInfo) {
         ArrayList<VersionSafeCallbacks.RequestFinishedInfoListener> currentListeners;
         synchronized (mFinishedListenerLock) {
+            if (mFinishedListenerMap.isEmpty()) return;
             currentListeners = new ArrayList<VersionSafeCallbacks.RequestFinishedInfoListener>(
                     mFinishedListenerMap.values());
         }
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/JavaCronetEngine.java b/components/cronet/android/java/src/org/chromium/net/impl/JavaCronetEngine.java
index ea6e55c..3156b56 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/JavaCronetEngine.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/JavaCronetEngine.java
@@ -67,7 +67,7 @@
             int priority, Collection<Object> connectionAnnotations, boolean disableCache,
             boolean disableConnectionMigration, boolean allowDirectExecutor,
             boolean trafficStatsTagSet, int trafficStatsTag, boolean trafficStatsUidSet,
-            int trafficStatsUid) {
+            int trafficStatsUid, RequestFinishedInfo.Listener requestFinishedListener) {
         return new JavaUrlRequest(callback, mExecutorService, executor, url, mUserAgent,
                 allowDirectExecutor, trafficStatsTagSet, trafficStatsTag, trafficStatsUidSet,
                 trafficStatsUid);
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/UrlRequestBuilderImpl.java b/components/cronet/android/java/src/org/chromium/net/impl/UrlRequestBuilderImpl.java
index f6c37b7..f3b256e 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/UrlRequestBuilderImpl.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/UrlRequestBuilderImpl.java
@@ -9,6 +9,7 @@
 
 import org.chromium.net.CronetEngine;
 import org.chromium.net.ExperimentalUrlRequest;
+import org.chromium.net.RequestFinishedInfo;
 import org.chromium.net.UploadDataProvider;
 import org.chromium.net.UrlRequest;
 
@@ -57,6 +58,7 @@
     private int mTrafficStatsTag;
     private boolean mTrafficStatsUidSet;
     private int mTrafficStatsUid;
+    private RequestFinishedInfo.Listener mRequestFinishedListener;
 
     /**
      * Creates a builder for {@link UrlRequest} objects. All callbacks for
@@ -187,12 +189,18 @@
     }
 
     @Override
+    public UrlRequestBuilderImpl setRequestFinishedListener(RequestFinishedInfo.Listener listener) {
+        mRequestFinishedListener = listener;
+        return this;
+    }
+
+    @Override
     public UrlRequestBase build() {
         @SuppressLint("WrongConstant") // TODO(jbudorick): Remove this after rolling to the N SDK.
         final UrlRequestBase request = mCronetEngine.createRequest(mUrl, mCallback, mExecutor,
                 mPriority, mRequestAnnotations, mDisableCache, mDisableConnectionMigration,
                 mAllowDirectExecutor, mTrafficStatsTagSet, mTrafficStatsTag, mTrafficStatsUidSet,
-                mTrafficStatsUid);
+                mTrafficStatsUid, mRequestFinishedListener);
         if (mMethod != null) {
             request.setHttpMethod(mMethod);
         }
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/RequestFinishedInfoTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/RequestFinishedInfoTest.java
index eb2fccc..4b23d155 100644
--- a/components/cronet/android/test/javatests/src/org/chromium/net/RequestFinishedInfoTest.java
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/RequestFinishedInfoTest.java
@@ -26,6 +26,7 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.net.CronetTestRule.CronetTestFramework;
 import org.chromium.net.CronetTestRule.OnlyRunNativeCronet;
+import org.chromium.net.CronetTestRule.RequiresMinApi;
 import org.chromium.net.MetricsTestUtil.TestExecutor;
 import org.chromium.net.MetricsTestUtil.TestRequestFinishedListener;
 import org.chromium.net.impl.CronetMetrics;
@@ -37,6 +38,7 @@
 import java.util.List;
 import java.util.concurrent.Executor;
 import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
  * Test RequestFinishedInfo.Listener and the metrics information it provides.
@@ -57,6 +59,8 @@
             extends TestRequestFinishedListener {
         private final TestUrlRequestCallback mCallback;
         public AssertCallbackDoneRequestFinishedListener(TestUrlRequestCallback callback) {
+            // Use same executor as request callback to verify stable call order.
+            super(callback.getExecutor());
             mCallback = callback;
         }
 
@@ -71,10 +75,12 @@
     public void setUp() throws Exception {
         mTestServer = EmbeddedTestServer.createAndStartServer(getContext());
         mUrl = mTestServer.getURL("/echo?status=200");
+        mTestFramework = mTestRule.startCronetTestFramework();
     }
 
     @After
     public void tearDown() throws Exception {
+        mTestFramework.mCronetEngine.shutdown();
         mTestServer.stopAndDestroyServer();
     }
 
@@ -115,7 +121,6 @@
     @Feature({"Cronet"})
     @SuppressWarnings("deprecation")
     public void testRequestFinishedListener() throws Exception {
-        mTestFramework = mTestRule.startCronetTestFramework();
         TestRequestFinishedListener requestFinishedListener = new TestRequestFinishedListener();
         mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinishedListener);
         TestUrlRequestCallback callback = new TestUrlRequestCallback();
@@ -137,7 +142,6 @@
         MetricsTestUtil.checkHasConnectTiming(requestInfo.getMetrics(), startTime, endTime, false);
         assertEquals(newHashSet("request annotation", this), // Use sets for unordered comparison.
                 new HashSet<Object>(requestInfo.getAnnotations()));
-        mTestFramework.mCronetEngine.shutdown();
     }
 
     @Test
@@ -146,7 +150,6 @@
     @Feature({"Cronet"})
     @SuppressWarnings("deprecation")
     public void testRequestFinishedListenerDirectExecutor() throws Exception {
-        mTestFramework = mTestRule.startCronetTestFramework();
         DirectExecutor testExecutor = new DirectExecutor();
         TestRequestFinishedListener requestFinishedListener =
                 new TestRequestFinishedListener(testExecutor);
@@ -172,7 +175,6 @@
         MetricsTestUtil.checkHasConnectTiming(requestInfo.getMetrics(), startTime, endTime, false);
         assertEquals(newHashSet("request annotation", this), // Use sets for unordered comparison.
                 new HashSet<Object>(requestInfo.getAnnotations()));
-        mTestFramework.mCronetEngine.shutdown();
     }
 
     @Test
@@ -181,7 +183,6 @@
     @Feature({"Cronet"})
     @SuppressWarnings("deprecation")
     public void testRequestFinishedListenerDifferentThreads() throws Exception {
-        mTestFramework = mTestRule.startCronetTestFramework();
         TestRequestFinishedListener firstListener = new TestRequestFinishedListener();
         TestRequestFinishedListener secondListener = new TestRequestFinishedListener();
         mTestFramework.mCronetEngine.addRequestFinishedListener(firstListener);
@@ -217,7 +218,6 @@
                 new HashSet<Object>(firstRequestInfo.getAnnotations()));
         assertEquals(newHashSet("request annotation", this),
                 new HashSet<Object>(secondRequestInfo.getAnnotations()));
-        mTestFramework.mCronetEngine.shutdown();
     }
 
     @Test
@@ -227,7 +227,6 @@
     @SuppressWarnings("deprecation")
     public void testRequestFinishedListenerFailedRequest() throws Exception {
         String connectionRefusedUrl = "http://127.0.0.1:3";
-        mTestFramework = mTestRule.startCronetTestFramework();
         TestRequestFinishedListener requestFinishedListener = new TestRequestFinishedListener();
         mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinishedListener);
         TestUrlRequestCallback callback = new TestUrlRequestCallback();
@@ -266,7 +265,6 @@
         MetricsTestUtil.assertAfter(metrics.getRequestEnd(), metrics.getRequestStart());
         assertTrue(metrics.getSentByteCount() == 0);
         assertTrue(metrics.getReceivedByteCount() == 0);
-        mTestFramework.mCronetEngine.shutdown();
     }
 
     @Test
@@ -275,7 +273,6 @@
     @Feature({"Cronet"})
     @SuppressWarnings("deprecation")
     public void testRequestFinishedListenerRemoved() throws Exception {
-        mTestFramework = mTestRule.startCronetTestFramework();
         TestExecutor testExecutor = new TestExecutor();
         TestRequestFinishedListener requestFinishedListener =
                 new TestRequestFinishedListener(testExecutor);
@@ -291,7 +288,6 @@
 
         assertNull("RequestFinishedInfo.Listener must not be called",
                 requestFinishedListener.getRequestInfo());
-        mTestFramework.mCronetEngine.shutdown();
     }
 
     @Test
@@ -299,7 +295,6 @@
     @OnlyRunNativeCronet
     @Feature({"Cronet"})
     public void testRequestFinishedListenerCanceledRequest() throws Exception {
-        mTestFramework = mTestRule.startCronetTestFramework();
         TestRequestFinishedListener requestFinishedListener = new TestRequestFinishedListener();
         mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinishedListener);
         TestUrlRequestCallback callback = new TestUrlRequestCallback() {
@@ -328,7 +323,6 @@
 
         assertEquals(newHashSet("request annotation", this), // Use sets for unordered comparison.
                 new HashSet<Object>(requestInfo.getAnnotations()));
-        mTestFramework.mCronetEngine.shutdown();
     }
 
     private static class RejectAllTasksExecutor implements Executor {
@@ -345,7 +339,6 @@
     @OnlyRunNativeCronet
     @Feature({"Cronet"})
     public void testExceptionInRequestStart() throws Exception {
-        mTestFramework = mTestRule.startCronetTestFramework();
         // The listener in this test shouldn't get any tasks.
         Executor executor = new RejectAllTasksExecutor();
         TestRequestFinishedListener requestFinishedListener =
@@ -363,8 +356,6 @@
         } catch (IllegalArgumentException e) {
             assertEquals("Invalid header =", e.getMessage());
         }
-
-        mTestFramework.mCronetEngine.shutdown();
     }
 
     @Test
@@ -414,7 +405,6 @@
     @Feature({"Cronet"})
     @SuppressWarnings("deprecation")
     public void testOrderSuccessfulRequest() throws Exception {
-        mTestFramework = mTestRule.startCronetTestFramework();
         final TestUrlRequestCallback callback = new TestUrlRequestCallback();
         TestRequestFinishedListener requestFinishedListener =
                 new AssertCallbackDoneRequestFinishedListener(callback);
@@ -437,7 +427,44 @@
         MetricsTestUtil.checkHasConnectTiming(requestInfo.getMetrics(), startTime, endTime, false);
         assertEquals(newHashSet("request annotation", this), // Use sets for unordered comparison.
                 new HashSet<Object>(requestInfo.getAnnotations()));
-        mTestFramework.mCronetEngine.shutdown();
+    }
+
+    @Test
+    @SmallTest
+    @OnlyRunNativeCronet
+    @Feature({"Cronet"})
+    @RequiresMinApi(11)
+    public void testUpdateAnnotationOnSucceeded() throws Exception {
+        // The annotation that is updated in onSucceeded() callback.
+        AtomicBoolean requestAnnotation = new AtomicBoolean(false);
+        final TestUrlRequestCallback callback = new TestUrlRequestCallback() {
+            @Override
+            public void onSucceeded(UrlRequest request, UrlResponseInfo info) {
+                // Add processing information to request annotation.
+                requestAnnotation.set(true);
+                super.onSucceeded(request, info);
+            }
+        };
+        TestRequestFinishedListener requestFinishedListener =
+                new AssertCallbackDoneRequestFinishedListener(callback);
+        ExperimentalUrlRequest.Builder urlRequestBuilder =
+                (ExperimentalUrlRequest.Builder) mTestFramework.mCronetEngine.newUrlRequestBuilder(
+                        mUrl, callback, callback.getExecutor());
+        Date startTime = new Date();
+        urlRequestBuilder.addRequestAnnotation(requestAnnotation)
+                .setRequestFinishedListener(requestFinishedListener)
+                .build()
+                .start();
+        callback.blockForDone();
+        requestFinishedListener.blockUntilDone();
+        Date endTime = new Date();
+        RequestFinishedInfo requestInfo = requestFinishedListener.getRequestInfo();
+        MetricsTestUtil.checkRequestFinishedInfo(requestInfo, mUrl, startTime, endTime);
+        assertEquals(RequestFinishedInfo.SUCCEEDED, requestInfo.getFinishedReason());
+        MetricsTestUtil.checkHasConnectTiming(requestInfo.getMetrics(), startTime, endTime, false);
+        // Check that annotation got updated in onSucceeded() callback.
+        assertEquals(requestAnnotation, requestInfo.getAnnotations().iterator().next());
+        assertTrue(requestAnnotation.get());
     }
 
     @Test
@@ -446,7 +473,6 @@
     @Feature({"Cronet"})
     // Tests a failed request where the error originates from Java.
     public void testOrderFailedRequestJava() throws Exception {
-        mTestFramework = mTestRule.startCronetTestFramework();
         final TestUrlRequestCallback callback = new TestUrlRequestCallback() {
             @Override
             public void onResponseStarted(UrlRequest request, UrlResponseInfo info) {
@@ -472,7 +498,6 @@
                 requestInfo.getException().getMessage());
         RequestFinishedInfo.Metrics metrics = requestInfo.getMetrics();
         assertNotNull("RequestFinishedInfo.getMetrics() must not be null", metrics);
-        mTestFramework.mCronetEngine.shutdown();
     }
 
     @Test
@@ -482,7 +507,6 @@
     // Tests a failed request where the error originates from native code.
     public void testOrderFailedRequestNative() throws Exception {
         String connectionRefusedUrl = "http://127.0.0.1:3";
-        mTestFramework = mTestRule.startCronetTestFramework();
         final TestUrlRequestCallback callback = new TestUrlRequestCallback();
         TestRequestFinishedListener requestFinishedListener =
                 new AssertCallbackDoneRequestFinishedListener(callback);
@@ -503,7 +527,6 @@
                 ((NetworkException) requestInfo.getException()).getErrorCode());
         RequestFinishedInfo.Metrics metrics = requestInfo.getMetrics();
         assertNotNull("RequestFinishedInfo.getMetrics() must not be null", metrics);
-        mTestFramework.mCronetEngine.shutdown();
     }
 
     @Test
@@ -511,7 +534,6 @@
     @OnlyRunNativeCronet
     @Feature({"Cronet"})
     public void testOrderCanceledRequest() throws Exception {
-        mTestFramework = mTestRule.startCronetTestFramework();
         final TestUrlRequestCallback callback = new TestUrlRequestCallback() {
             @Override
             public void onResponseStarted(UrlRequest request, UrlResponseInfo info) {
@@ -542,6 +564,5 @@
 
         assertEquals(newHashSet("request annotation", this), // Use sets for unordered comparison.
                 new HashSet<Object>(requestInfo.getAnnotations()));
-        mTestFramework.mCronetEngine.shutdown();
     }
 }
diff --git a/components/download/internal/common/BUILD.gn b/components/download/internal/common/BUILD.gn
index a199d64..c5cb8f0 100644
--- a/components/download/internal/common/BUILD.gn
+++ b/components/download/internal/common/BUILD.gn
@@ -26,6 +26,7 @@
     "download_ukm_helper.cc",
     "download_utils.cc",
     "download_worker.cc",
+    "parallel_download_job.cc",
     "parallel_download_utils.cc",
     "rate_estimator.cc",
     "resource_downloader.cc",
@@ -57,6 +58,7 @@
     "download_file_unittest.cc",
     "download_stats_unittest.cc",
     "download_ukm_helper_unittest.cc",
+    "parallel_download_job_unittest.cc",
     "parallel_download_utils_unittest.cc",
     "rate_estimator_unittest.cc",
   ]
diff --git a/components/download/internal/common/DEPS b/components/download/internal/common/DEPS
index cea69eb..9d81a1a 100644
--- a/components/download/internal/common/DEPS
+++ b/components/download/internal/common/DEPS
@@ -14,6 +14,7 @@
   "+net/http/http_response_headers.h",
   "+net/http/http_status_code.h",
   "+net/http/http_util.h",
+  "+net/traffic_annotation/network_traffic_annotation.h",
   "+services/metrics/public/cpp",
   "+services/network/public/cpp",
 ]
diff --git a/content/browser/download/parallel_download_job.cc b/components/download/internal/common/parallel_download_job.cc
similarity index 75%
rename from content/browser/download/parallel_download_job.cc
rename to components/download/internal/common/parallel_download_job.cc
index 3aefcb6..202d3b29 100644
--- a/content/browser/download/parallel_download_job.cc
+++ b/components/download/internal/common/parallel_download_job.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/browser/download/parallel_download_job.h"
+#include "components/download/public/common/parallel_download_job.h"
 
 #include <algorithm>
 
@@ -13,49 +13,43 @@
 #include "components/download/public/common/download_create_info.h"
 #include "components/download/public/common/download_stats.h"
 #include "components/download/public/common/parallel_download_utils.h"
-#include "content/browser/download/download_utils.h"
-#include "content/browser/download/parallel_download_utils.h"
-#include "content/browser/storage_partition_impl.h"
-#include "content/public/browser/browser_context.h"
-#include "content/public/browser/download_item_utils.h"
-#include "content/public/browser/storage_partition.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 
-namespace content {
+namespace download {
 namespace {
-
 const int kDownloadJobVerboseLevel = 1;
-
 }  // namespace
 
 ParallelDownloadJob::ParallelDownloadJob(
-    download::DownloadItem* download_item,
-    std::unique_ptr<download::DownloadRequestHandleInterface> request_handle,
-    const download::DownloadCreateInfo& create_info,
-    scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory)
-    : download::DownloadJobImpl(download_item, std::move(request_handle), true),
+    DownloadItem* download_item,
+    std::unique_ptr<DownloadRequestHandleInterface> request_handle,
+    const DownloadCreateInfo& create_info,
+    scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory,
+    net::URLRequestContextGetter* url_request_context_getter)
+    : DownloadJobImpl(download_item, std::move(request_handle), true),
       initial_request_offset_(create_info.offset),
       initial_received_slices_(download_item->GetReceivedSlices()),
       content_length_(create_info.total_bytes),
       requests_sent_(false),
       is_canceled_(false),
-      shared_url_loader_factory_(std::move(shared_url_loader_factory)) {}
+      shared_url_loader_factory_(std::move(shared_url_loader_factory)),
+      url_request_context_getter_(url_request_context_getter) {}
 
 ParallelDownloadJob::~ParallelDownloadJob() = default;
 
 void ParallelDownloadJob::OnDownloadFileInitialized(
-    download::DownloadFile::InitializeCallback callback,
-    download::DownloadInterruptReason result,
+    DownloadFile::InitializeCallback callback,
+    DownloadInterruptReason result,
     int64_t bytes_wasted) {
-  download::DownloadJobImpl::OnDownloadFileInitialized(std::move(callback),
-                                                       result, bytes_wasted);
-  if (result == download::DOWNLOAD_INTERRUPT_REASON_NONE)
+  DownloadJobImpl::OnDownloadFileInitialized(std::move(callback), result,
+                                             bytes_wasted);
+  if (result == DOWNLOAD_INTERRUPT_REASON_NONE)
     BuildParallelRequestAfterDelay();
 }
 
 void ParallelDownloadJob::Cancel(bool user_cancel) {
   is_canceled_ = true;
-  download::DownloadJobImpl::Cancel(user_cancel);
+  DownloadJobImpl::Cancel(user_cancel);
 
   if (!requests_sent_) {
     timer_.Stop();
@@ -67,7 +61,7 @@
 }
 
 void ParallelDownloadJob::Pause() {
-  download::DownloadJobImpl::Pause();
+  DownloadJobImpl::Pause();
 
   if (!requests_sent_) {
     timer_.Stop();
@@ -79,7 +73,7 @@
 }
 
 void ParallelDownloadJob::Resume(bool resume_request) {
-  download::DownloadJobImpl::Resume(resume_request);
+  DownloadJobImpl::Resume(resume_request);
   if (!resume_request)
     return;
 
@@ -108,7 +102,7 @@
 
 void ParallelDownloadJob::CancelRequestWithOffset(int64_t offset) {
   if (initial_request_offset_ == offset) {
-    download::DownloadJobImpl::Cancel(false);
+    DownloadJobImpl::Cancel(false);
     return;
   }
 
@@ -127,11 +121,11 @@
 }
 
 void ParallelDownloadJob::OnInputStreamReady(
-    download::DownloadWorker* worker,
-    std::unique_ptr<download::InputStream> input_stream) {
+    DownloadWorker* worker,
+    std::unique_ptr<InputStream> input_stream) {
   bool success = DownloadJob::AddInputStream(
       std::move(input_stream), worker->offset(), worker->length());
-  download::RecordParallelDownloadAddStreamSuccess(success);
+  RecordParallelDownloadAddStreamSuccess(success);
 
   // Destroy the request if the sink is gone.
   if (!success) {
@@ -144,8 +138,8 @@
 void ParallelDownloadJob::BuildParallelRequests() {
   DCHECK(!requests_sent_);
   DCHECK(!is_paused());
-  if (is_canceled_ || download_item_->GetState() !=
-                          download::DownloadItem::DownloadState::IN_PROGRESS) {
+  if (is_canceled_ ||
+      download_item_->GetState() != DownloadItem::DownloadState::IN_PROGRESS) {
     return;
   }
 
@@ -156,10 +150,10 @@
   // Get the next |kParallelRequestCount - 1| slices and fork
   // new requests. For the remaining slices, they will be handled once some
   // of the workers finish their job.
-  const download::DownloadItem::ReceivedSlices& received_slices =
+  const DownloadItem::ReceivedSlices& received_slices =
       download_item_->GetReceivedSlices();
-  download::DownloadItem::ReceivedSlices slices_to_download =
-      download::FindSlicesToDownload(received_slices);
+  DownloadItem::ReceivedSlices slices_to_download =
+      FindSlicesToDownload(received_slices);
 
   DCHECK(!slices_to_download.empty());
   int64_t first_slice_offset = slices_to_download[0].offset;
@@ -194,9 +188,8 @@
           content_length_ - first_slice_offset + initial_request_offset_,
           GetParallelRequestCount(), GetMinSliceSize());
     } else {
-      download::RecordParallelDownloadCreationEvent(
-          download::ParallelDownloadCreationEvent::
-              FALLBACK_REASON_REMAINING_TIME);
+      RecordParallelDownloadCreationEvent(
+          ParallelDownloadCreationEvent::FALLBACK_REASON_REMAINING_TIME);
     }
   }
 
@@ -209,18 +202,18 @@
     slices_to_download.pop_back();
 
   ForkSubRequests(slices_to_download);
-  download::RecordParallelDownloadRequestCount(
+  RecordParallelDownloadRequestCount(
       static_cast<int>(slices_to_download.size()));
   requests_sent_ = true;
 }
 
 void ParallelDownloadJob::ForkSubRequests(
-    const download::DownloadItem::ReceivedSlices& slices_to_download) {
+    const DownloadItem::ReceivedSlices& slices_to_download) {
   // If the initial request is working on the first hole, don't create parallel
   // request for this hole.
   bool skip_first_slice = true;
-  download::DownloadItem::ReceivedSlices initial_slices_to_download =
-      download::FindSlicesToDownload(initial_received_slices_);
+  DownloadItem::ReceivedSlices initial_slices_to_download =
+      FindSlicesToDownload(initial_received_slices_);
   if (initial_slices_to_download.size() > 1) {
     DCHECK_EQ(initial_request_offset_, initial_slices_to_download[0].offset);
     int64_t first_hole_max = initial_slices_to_download[0].offset +
@@ -239,21 +232,15 @@
     // All parallel requests are half open, which sends request headers like
     // "Range:50-".
     // If server rejects a certain request, others should take over.
-    CreateRequest(it->offset, download::DownloadSaveInfo::kLengthFullContent);
+    CreateRequest(it->offset, DownloadSaveInfo::kLengthFullContent);
   }
 }
 
 void ParallelDownloadJob::CreateRequest(int64_t offset, int64_t length) {
   DCHECK(download_item_);
-  DCHECK_EQ(download::DownloadSaveInfo::kLengthFullContent, length);
+  DCHECK_EQ(DownloadSaveInfo::kLengthFullContent, length);
 
-  auto worker =
-      std::make_unique<download::DownloadWorker>(this, offset, length);
-
-  StoragePartition* storage_partition =
-      BrowserContext::GetStoragePartitionForSite(
-          DownloadItemUtils::GetBrowserContext(download_item_),
-          download_item_->GetSiteUrl());
+  auto worker = std::make_unique<DownloadWorker>(this, offset, length);
 
   net::NetworkTrafficAnnotationTag traffic_annotation =
       net::DefineNetworkTrafficAnnotation("parallel_download_job", R"(
@@ -278,10 +265,10 @@
           }
         })");
   // The parallel requests only use GET method.
-  std::unique_ptr<download::DownloadUrlParameters> download_params(
-      new download::DownloadUrlParameters(
-          download_item_->GetURL(), storage_partition->GetURLRequestContext(),
-          traffic_annotation));
+  std::unique_ptr<DownloadUrlParameters> download_params(
+      new DownloadUrlParameters(download_item_->GetURL(),
+                                url_request_context_getter_.get(),
+                                traffic_annotation));
   download_params->set_file_path(download_item_->GetFullPath());
   download_params->set_last_modified(download_item_->GetLastModifiedTime());
   download_params->set_etag(download_item_->GetETag());
@@ -305,4 +292,4 @@
   workers_[offset] = std::move(worker);
 }
 
-}  // namespace content
+}  // namespace download
diff --git a/content/browser/download/parallel_download_job_unittest.cc b/components/download/internal/common/parallel_download_job_unittest.cc
similarity index 71%
rename from content/browser/download/parallel_download_job_unittest.cc
rename to components/download/internal/common/parallel_download_job_unittest.cc
index e39ab4a..490b7a8 100644
--- a/content/browser/download/parallel_download_job_unittest.cc
+++ b/components/download/internal/common/parallel_download_job_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/browser/download/parallel_download_job.h"
+#include "components/download/public/common/parallel_download_job.h"
 
 #include <utility>
 #include <vector>
@@ -11,14 +11,13 @@
 #include "base/run_loop.h"
 #include "base/test/mock_callback.h"
 #include "base/test/scoped_task_environment.h"
+#include "components/download/public/common/download_create_info.h"
 #include "components/download/public/common/download_destination_observer.h"
 #include "components/download/public/common/download_file_impl.h"
 #include "components/download/public/common/download_task_runner.h"
+#include "components/download/public/common/mock_download_item.h"
 #include "components/download/public/common/mock_input_stream.h"
-#include "content/browser/download/download_item_impl_delegate.h"
-#include "content/browser/download/mock_download_item_impl.h"
-#include "content/browser/download/parallel_download_utils.h"
-#include "content/public/test/test_browser_thread_bundle.h"
+#include "components/download/public/common/parallel_download_utils.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -28,27 +27,25 @@
 using ::testing::ReturnRef;
 using ::testing::StrictMock;
 
-namespace content {
+namespace download {
 
 namespace {
 
-class MockDownloadRequestHandle
-    : public download::DownloadRequestHandleInterface {
+class MockDownloadRequestHandle : public DownloadRequestHandleInterface {
  public:
   MOCK_METHOD0(PauseRequest, void());
   MOCK_METHOD0(ResumeRequest, void());
   MOCK_METHOD1(CancelRequest, void(bool));
 };
 
-class MockDownloadDestinationObserver
-    : public download::DownloadDestinationObserver {
+class MockDownloadDestinationObserver : public DownloadDestinationObserver {
  public:
   MOCK_METHOD3(DestinationUpdate,
                void(int64_t,
                     int64_t,
-                    const std::vector<download::DownloadItem::ReceivedSlice>&));
+                    const std::vector<DownloadItem::ReceivedSlice>&));
   void DestinationError(
-      download::DownloadInterruptReason reason,
+      DownloadInterruptReason reason,
       int64_t bytes_so_far,
       std::unique_ptr<crypto::SecureHash> hash_state) override {}
   void DestinationCompleted(
@@ -62,23 +59,23 @@
 class ParallelDownloadJobForTest : public ParallelDownloadJob {
  public:
   ParallelDownloadJobForTest(
-      DownloadItemImpl* download_item,
-      std::unique_ptr<download::DownloadRequestHandleInterface> request_handle,
-      const download::DownloadCreateInfo& create_info,
+      DownloadItem* download_item,
+      std::unique_ptr<DownloadRequestHandleInterface> request_handle,
+      const DownloadCreateInfo& create_info,
       int request_count,
       int64_t min_slice_size,
       int min_remaining_time)
       : ParallelDownloadJob(download_item,
                             std::move(request_handle),
                             create_info,
+                            nullptr,
                             nullptr),
         request_count_(request_count),
         min_slice_size_(min_slice_size),
         min_remaining_time_(min_remaining_time) {}
 
   void CreateRequest(int64_t offset, int64_t length) override {
-    auto worker =
-        std::make_unique<download::DownloadWorker>(this, offset, length);
+    auto worker = std::make_unique<DownloadWorker>(this, offset, length);
 
     DCHECK(workers_.find(offset) == workers_.end());
     workers_[offset] = std::move(worker);
@@ -86,8 +83,8 @@
 
   ParallelDownloadJob::WorkerMap& workers() { return workers_; }
 
-  void MakeFileInitialized(download::DownloadFile::InitializeCallback callback,
-                           download::DownloadInterruptReason result) {
+  void MakeFileInitialized(DownloadFile::InitializeCallback callback,
+                           DownloadInterruptReason result) {
     ParallelDownloadJob::OnDownloadFileInitialized(std::move(callback), result,
                                                    0);
   }
@@ -98,9 +95,8 @@
     return min_remaining_time_;
   }
 
-  void OnInputStreamReady(
-      download::DownloadWorker* worker,
-      std::unique_ptr<download::InputStream> input_stream) override {
+  void OnInputStreamReady(DownloadWorker* worker,
+                          std::unique_ptr<InputStream> input_stream) override {
     CountOnInputStreamReady();
   }
 
@@ -122,14 +118,12 @@
 
   void CreateParallelJob(int64_t initial_request_offset,
                          int64_t content_length,
-                         const download::DownloadItem::ReceivedSlices& slices,
+                         const DownloadItem::ReceivedSlices& slices,
                          int request_count,
                          int64_t min_slice_size,
                          int min_remaining_time) {
-    item_delegate_ = std::make_unique<DownloadItemImplDelegate>();
     received_slices_ = slices;
-    download_item_ =
-        std::make_unique<NiceMock<MockDownloadItemImpl>>(item_delegate_.get());
+    download_item_ = std::make_unique<NiceMock<MockDownloadItem>>();
     EXPECT_CALL(*download_item_, GetTotalBytes())
         .WillRepeatedly(Return(initial_request_offset + content_length));
     EXPECT_CALL(*download_item_, GetReceivedBytes())
@@ -137,7 +131,7 @@
     EXPECT_CALL(*download_item_, GetReceivedSlices())
         .WillRepeatedly(ReturnRef(received_slices_));
 
-    download::DownloadCreateInfo info;
+    DownloadCreateInfo info;
     info.offset = initial_request_offset;
     info.total_bytes = content_length;
     std::unique_ptr<MockDownloadRequestHandle> request_handle =
@@ -152,30 +146,28 @@
   void DestroyParallelJob() {
     job_.reset();
     download_item_.reset();
-    item_delegate_.reset();
     mock_request_handle_ = nullptr;
   }
 
   void BuildParallelRequests() { job_->BuildParallelRequests(); }
 
-  void set_received_slices(
-      const download::DownloadItem::ReceivedSlices& slices) {
+  void set_received_slices(const DownloadItem::ReceivedSlices& slices) {
     received_slices_ = slices;
   }
 
   bool IsJobCanceled() const { return job_->is_canceled_; };
 
   void MakeWorkerReady(
-      download::DownloadWorker* worker,
+      DownloadWorker* worker,
       std::unique_ptr<MockDownloadRequestHandle> request_handle) {
-    download::UrlDownloadHandler::Delegate* delegate =
-        static_cast<download::UrlDownloadHandler::Delegate*>(worker);
-    std::unique_ptr<download::DownloadCreateInfo> create_info =
-        std::make_unique<download::DownloadCreateInfo>();
+    UrlDownloadHandler::Delegate* delegate =
+        static_cast<UrlDownloadHandler::Delegate*>(worker);
+    std::unique_ptr<DownloadCreateInfo> create_info =
+        std::make_unique<DownloadCreateInfo>();
     create_info->request_handle = std::move(request_handle);
-    delegate->OnUrlDownloadStarted(
-        std::move(create_info), std::make_unique<download::MockInputStream>(),
-        nullptr, download::DownloadUrlParameters::OnStartedCallback());
+    delegate->OnUrlDownloadStarted(std::move(create_info),
+                                   std::make_unique<MockInputStream>(), nullptr,
+                                   DownloadUrlParameters::OnStartedCallback());
   }
 
   void VerifyWorker(int64_t offset, int64_t length) const {
@@ -184,15 +176,12 @@
     EXPECT_EQ(length, job_->workers_[offset]->length());
   }
 
-  void OnFileInitialized(download::DownloadInterruptReason result,
-                         int64_t bytes_wasted) {
+  void OnFileInitialized(DownloadInterruptReason result, int64_t bytes_wasted) {
     file_initialized_ = true;
   }
 
   base::test::ScopedTaskEnvironment task_environment_;
-  content::TestBrowserThreadBundle browser_threads_;
-  std::unique_ptr<DownloadItemImplDelegate> item_delegate_;
-  std::unique_ptr<MockDownloadItemImpl> download_item_;
+  std::unique_ptr<MockDownloadItem> download_item_;
   std::unique_ptr<ParallelDownloadJobForTest> job_;
   bool file_initialized_;
   // Request handle for the original request.
@@ -200,7 +189,7 @@
 
   // The received slices used to return in
   // |MockDownloadItemImpl::GetReceivedSlices| mock function.
-  download::DownloadItem::ReceivedSlices received_slices_;
+  DownloadItem::ReceivedSlices received_slices_;
 };
 
 // Test if parallel requests can be built correctly for a new download without
@@ -209,7 +198,7 @@
   // Totally 2 requests for 100 bytes.
   // Original request:  Range:0-, for 50 bytes.
   // Task 1:  Range:50-, for 50 bytes.
-  CreateParallelJob(0, 100, download::DownloadItem::ReceivedSlices(), 2, 1, 10);
+  CreateParallelJob(0, 100, DownloadItem::ReceivedSlices(), 2, 1, 10);
   BuildParallelRequests();
   EXPECT_EQ(1u, job_->workers().size());
   VerifyWorker(50, 0);
@@ -219,7 +208,7 @@
   // Original request:  Range:0-, for 33 bytes.
   // Task 1:  Range:33-, for 33 bytes.
   // Task 2:  Range:66-, for 34 bytes.
-  CreateParallelJob(0, 100, download::DownloadItem::ReceivedSlices(), 3, 1, 10);
+  CreateParallelJob(0, 100, DownloadItem::ReceivedSlices(), 3, 1, 10);
   BuildParallelRequests();
   EXPECT_EQ(2u, job_->workers().size());
   VerifyWorker(33, 0);
@@ -227,18 +216,18 @@
   DestroyParallelJob();
 
   // Less than 2 requests, do nothing.
-  CreateParallelJob(0, 100, download::DownloadItem::ReceivedSlices(), 1, 1, 10);
+  CreateParallelJob(0, 100, DownloadItem::ReceivedSlices(), 1, 1, 10);
   BuildParallelRequests();
   EXPECT_TRUE(job_->workers().empty());
   DestroyParallelJob();
 
-  CreateParallelJob(0, 100, download::DownloadItem::ReceivedSlices(), 0, 1, 10);
+  CreateParallelJob(0, 100, DownloadItem::ReceivedSlices(), 0, 1, 10);
   BuildParallelRequests();
   EXPECT_TRUE(job_->workers().empty());
   DestroyParallelJob();
 
   // Content-length is 0, do nothing.
-  CreateParallelJob(0, 0, download::DownloadItem::ReceivedSlices(), 3, 1, 10);
+  CreateParallelJob(0, 0, DownloadItem::ReceivedSlices(), 3, 1, 10);
   BuildParallelRequests();
   EXPECT_TRUE(job_->workers().empty());
   DestroyParallelJob();
@@ -252,8 +241,7 @@
   // Original request:  Range:12-43.
   // Task 1:  Range:44-70, for 27 bytes.
   // Task 2:  Range:71-, for 29 bytes.
-  download::DownloadItem::ReceivedSlices slices = {
-      download::DownloadItem::ReceivedSlice(0, 17)};
+  DownloadItem::ReceivedSlices slices = {DownloadItem::ReceivedSlice(0, 17)};
   CreateParallelJob(12, 88, slices, 3, 1, 10);
   BuildParallelRequests();
   EXPECT_EQ(2u, job_->workers().size());
@@ -267,7 +255,7 @@
   // 40 bytes left for 4 requests. Only 1 additional request.
   // Original request: Range:60-79, for 20 bytes.
   // Task 1:  Range:80-, for 20 bytes.
-  slices = {download::DownloadItem::ReceivedSlice(0, 60)};
+  slices = {DownloadItem::ReceivedSlice(0, 60)};
   CreateParallelJob(60, 40, slices, 4, 20, 10);
   BuildParallelRequests();
   EXPECT_EQ(1u, job_->workers().size());
@@ -275,7 +263,7 @@
   DestroyParallelJob();
 
   // Content-Length is 0, no additional requests.
-  slices = {download::DownloadItem::ReceivedSlice(0, 100)};
+  slices = {DownloadItem::ReceivedSlice(0, 100)};
   CreateParallelJob(100, 0, slices, 3, 1, 10);
   BuildParallelRequests();
   EXPECT_TRUE(job_->workers().empty());
@@ -286,10 +274,9 @@
   // The request count is 2, however the file contains 3 holes, and we don't
   // know if the last slice is completed, so there should be 3 requests in
   // parallel and the last request is an out-of-range request.
-  slices = {download::DownloadItem::ReceivedSlice(10, 10),
-            download::DownloadItem::ReceivedSlice(20, 10),
-            download::DownloadItem::ReceivedSlice(40, 10),
-            download::DownloadItem::ReceivedSlice(90, 10)};
+  slices = {
+      DownloadItem::ReceivedSlice(10, 10), DownloadItem::ReceivedSlice(20, 10),
+      DownloadItem::ReceivedSlice(40, 10), DownloadItem::ReceivedSlice(90, 10)};
   CreateParallelJob(0, 12, slices, 2, 1, 10);
   BuildParallelRequests();
   EXPECT_EQ(3u, job_->workers().size());
@@ -302,13 +289,12 @@
 // Ensure that in download resumption, if the first hole is filled before
 // sending multiple requests, the new requests can be correctly calculated.
 TEST_F(ParallelDownloadJobTest, CreateResumptionRequestsFirstSliceFilled) {
-  download::DownloadItem::ReceivedSlices slices = {
-      download::DownloadItem::ReceivedSlice(0, 10),
-      download::DownloadItem::ReceivedSlice(40, 10),
-      download::DownloadItem::ReceivedSlice(80, 10)};
+  DownloadItem::ReceivedSlices slices = {DownloadItem::ReceivedSlice(0, 10),
+                                         DownloadItem::ReceivedSlice(40, 10),
+                                         DownloadItem::ReceivedSlice(80, 10)};
 
   // The updated slices that has filled the first hole.
-  download::DownloadItem::ReceivedSlices updated_slices = slices;
+  DownloadItem::ReceivedSlices updated_slices = slices;
   updated_slices[0].received_bytes = 40;
 
   CreateParallelJob(10, 90, slices, 3, 1, 10);
@@ -330,8 +316,7 @@
 // This may not happen under current implementation, but should be also handled
 // correctly.
 TEST_F(ParallelDownloadJobTest, CreateResumptionRequestsTwoSlicesToFill) {
-  download::DownloadItem::ReceivedSlices slices = {
-      download::DownloadItem::ReceivedSlice(40, 10)};
+  DownloadItem::ReceivedSlices slices = {DownloadItem::ReceivedSlice(40, 10)};
 
   CreateParallelJob(0, 100, slices, 3, 1, 10);
   BuildParallelRequests();
@@ -340,9 +325,8 @@
   VerifyWorker(50, 0);
   DestroyParallelJob();
 
-  download::DownloadItem::ReceivedSlices updated_slices = {
-      download::DownloadItem::ReceivedSlice(0, 10),
-      download::DownloadItem::ReceivedSlice(40, 10)};
+  DownloadItem::ReceivedSlices updated_slices = {
+      DownloadItem::ReceivedSlice(0, 10), DownloadItem::ReceivedSlice(40, 10)};
 
   CreateParallelJob(0, 100, slices, 3, 1, 10);
   // Now let download item to return an updated received slice, that the first
@@ -362,8 +346,8 @@
 TEST_F(ParallelDownloadJobTest, LastReceivedSliceFinished) {
   // One finished slice, no parallel requests should be created. Content length
   // should be 0.
-  download::DownloadItem::ReceivedSlices slices = {
-      download::DownloadItem::ReceivedSlice(0, 100, true)};
+  DownloadItem::ReceivedSlices slices = {
+      DownloadItem::ReceivedSlice(0, 100, true)};
   CreateParallelJob(100, 0, slices, 3, 1, 10);
   BuildParallelRequests();
   EXPECT_EQ(0u, job_->workers().size());
@@ -372,8 +356,8 @@
   // Two received slices with one hole in the middle. Since the second slice is
   // finished, and the hole will be filled by original request, no parallel
   // requests will be created.
-  slices = {download::DownloadItem::ReceivedSlice(0, 25),
-            download::DownloadItem::ReceivedSlice(75, 25, true)};
+  slices = {DownloadItem::ReceivedSlice(0, 25),
+            DownloadItem::ReceivedSlice(75, 25, true)};
   CreateParallelJob(25, 100, slices, 3, 1, 10);
   BuildParallelRequests();
   EXPECT_EQ(0u, job_->workers().size());
@@ -382,9 +366,9 @@
   // Three received slices with two hole in the middle and the last slice is
   // finished. The original request will work on the first hole and one parallel
   // request is created to fill the second hole.
-  slices = {download::DownloadItem::ReceivedSlice(0, 25),
-            download::DownloadItem::ReceivedSlice(50, 25),
-            download::DownloadItem::ReceivedSlice(100, 25, true)};
+  slices = {DownloadItem::ReceivedSlice(0, 25),
+            DownloadItem::ReceivedSlice(50, 25),
+            DownloadItem::ReceivedSlice(100, 25, true)};
   CreateParallelJob(25, 125, slices, 3, 1, 10);
   BuildParallelRequests();
   EXPECT_EQ(1u, job_->workers().size());
@@ -393,9 +377,9 @@
 
   // Three received slices with two hole in the middle and the last slice is
   // finished.
-  slices = {download::DownloadItem::ReceivedSlice(0, 25),
-            download::DownloadItem::ReceivedSlice(50, 25),
-            download::DownloadItem::ReceivedSlice(100, 25, true)};
+  slices = {DownloadItem::ReceivedSlice(0, 25),
+            DownloadItem::ReceivedSlice(50, 25),
+            DownloadItem::ReceivedSlice(100, 25, true)};
   CreateParallelJob(25, 125, slices, 3, 1, 10);
 
   // If the first hole is filled by the original request after the job is
@@ -416,7 +400,7 @@
 // Ensure cancel before building the requests will result in no requests are
 // built.
 TEST_F(ParallelDownloadJobTest, EarlyCancelBeforeBuildRequests) {
-  CreateParallelJob(0, 100, download::DownloadItem::ReceivedSlices(), 2, 1, 10);
+  CreateParallelJob(0, 100, DownloadItem::ReceivedSlices(), 2, 1, 10);
   EXPECT_CALL(*mock_request_handle_, CancelRequest(_));
 
   // Job is canceled before building parallel requests.
@@ -432,7 +416,7 @@
 // Ensure cancel before adding the byte stream will result in workers being
 // canceled.
 TEST_F(ParallelDownloadJobTest, EarlyCancelBeforeByteStreamReady) {
-  CreateParallelJob(0, 100, download::DownloadItem::ReceivedSlices(), 2, 1, 10);
+  CreateParallelJob(0, 100, DownloadItem::ReceivedSlices(), 2, 1, 10);
   EXPECT_CALL(*mock_request_handle_, CancelRequest(_));
 
   BuildParallelRequests();
@@ -456,7 +440,7 @@
 // Ensure pause before adding the byte stream will result in workers being
 // paused.
 TEST_F(ParallelDownloadJobTest, EarlyPauseBeforeByteStreamReady) {
-  CreateParallelJob(0, 100, download::DownloadItem::ReceivedSlices(), 2, 1, 10);
+  CreateParallelJob(0, 100, DownloadItem::ReceivedSlices(), 2, 1, 10);
   EXPECT_CALL(*mock_request_handle_, PauseRequest());
 
   BuildParallelRequests();
@@ -481,8 +465,7 @@
 // Test that parallel request is not created if the remaining content can be
 // finish downloading soon.
 TEST_F(ParallelDownloadJobTest, RemainingContentWillFinishSoon) {
-  download::DownloadItem::ReceivedSlices slices = {
-      download::DownloadItem::ReceivedSlice(0, 99)};
+  DownloadItem::ReceivedSlices slices = {DownloadItem::ReceivedSlice(0, 99)};
   CreateParallelJob(99, 1, slices, 3, 1, 10);
   BuildParallelRequests();
   EXPECT_EQ(0u, job_->workers().size());
@@ -492,22 +475,21 @@
 
 // Test that parallel request is not created until download file is initialized.
 TEST_F(ParallelDownloadJobTest, ParallelRequestNotCreatedUntilFileInitialized) {
-  auto save_info = std::make_unique<download::DownloadSaveInfo>();
-  StrictMock<download::MockInputStream>* input_stream =
-      new StrictMock<download::MockInputStream>();
+  auto save_info = std::make_unique<DownloadSaveInfo>();
+  StrictMock<MockInputStream>* input_stream = new StrictMock<MockInputStream>();
   auto observer =
       std::make_unique<StrictMock<MockDownloadDestinationObserver>>();
-  base::WeakPtrFactory<download::DownloadDestinationObserver> observer_factory(
+  base::WeakPtrFactory<DownloadDestinationObserver> observer_factory(
       observer.get());
-  auto download_file = std::make_unique<download::DownloadFileImpl>(
+  auto download_file = std::make_unique<DownloadFileImpl>(
       std::move(save_info), base::FilePath(),
-      std::unique_ptr<download::MockInputStream>(input_stream),
-      download::DownloadItem::kInvalidId, observer_factory.GetWeakPtr());
-  CreateParallelJob(0, 100, download::DownloadItem::ReceivedSlices(), 2, 0, 0);
+      std::unique_ptr<MockInputStream>(input_stream), DownloadItem::kInvalidId,
+      observer_factory.GetWeakPtr());
+  CreateParallelJob(0, 100, DownloadItem::ReceivedSlices(), 2, 0, 0);
   job_->Start(download_file.get(),
               base::Bind(&ParallelDownloadJobTest::OnFileInitialized,
                          base::Unretained(this)),
-              download::DownloadItem::ReceivedSlices());
+              DownloadItem::ReceivedSlices());
   EXPECT_FALSE(file_initialized_);
   EXPECT_EQ(0u, job_->workers().size());
   EXPECT_CALL(*input_stream, RegisterDataReadyCallback(_));
@@ -520,28 +502,24 @@
 
   // The download file lives on the download sequence, and must
   // be deleted there.
-  download::GetDownloadTaskRunner()->DeleteSoon(FROM_HERE,
-                                                std::move(download_file));
+  GetDownloadTaskRunner()->DeleteSoon(FROM_HERE, std::move(download_file));
   task_environment_.RunUntilIdle();
 }
 
 // Interruption from IO thread after the file initialized and before building
 // the parallel requests, should correctly stop the download.
 TEST_F(ParallelDownloadJobTest, InterruptOnStartup) {
-  download::DownloadItem::ReceivedSlices slices = {
-      download::DownloadItem::ReceivedSlice(0, 99)};
+  DownloadItem::ReceivedSlices slices = {DownloadItem::ReceivedSlice(0, 99)};
   CreateParallelJob(99, 1, slices, 3, 1, 10);
 
   // Start to build the requests without any error.
-  base::MockCallback<download::DownloadFile::InitializeCallback> callback;
+  base::MockCallback<DownloadFile::InitializeCallback> callback;
   EXPECT_CALL(callback, Run(_, _)).Times(1);
-  job_->MakeFileInitialized(callback.Get(),
-                            download::DOWNLOAD_INTERRUPT_REASON_NONE);
+  job_->MakeFileInitialized(callback.Get(), DOWNLOAD_INTERRUPT_REASON_NONE);
 
   // Simulate and inject an error from IO thread after file initialized.
   EXPECT_CALL(*download_item_.get(), GetState())
-      .WillRepeatedly(
-          Return(download::DownloadItem::DownloadState::INTERRUPTED));
+      .WillRepeatedly(Return(DownloadItem::DownloadState::INTERRUPTED));
 
   // Because of the error, no parallel requests are built.
   task_environment_.RunUntilIdle();
@@ -550,4 +528,4 @@
   DestroyParallelJob();
 }
 
-}  // namespace content
+}  // namespace download
diff --git a/components/download/internal/common/parallel_download_utils.cc b/components/download/internal/common/parallel_download_utils.cc
index f88df77..f1c56cf 100644
--- a/components/download/internal/common/parallel_download_utils.cc
+++ b/components/download/internal/common/parallel_download_utils.cc
@@ -4,10 +4,27 @@
 
 #include "components/download/public/common/parallel_download_utils.h"
 
+#include "base/metrics/field_trial_params.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/time/time.h"
+#include "components/download/public/common/download_features.h"
+#include "components/download/public/common/download_save_info.h"
+
 namespace download {
 
 namespace {
 
+// Default value for |kMinSliceSizeFinchKey|, when no parameter is specified.
+const int64_t kMinSliceSizeParallelDownload = 1365333;
+
+// Default value for |kParallelRequestCountFinchKey|, when no parameter is
+// specified.
+const int kParallelRequestCount = 3;
+
+// The default remaining download time in seconds required for parallel request
+// creation.
+const int kDefaultRemainingTimeInSeconds = 2;
+
 // TODO(qinmin): replace this with a comparator operator in
 // DownloadItem::ReceivedSlice.
 bool compareReceivedSlices(const DownloadItem::ReceivedSlice& lhs,
@@ -118,4 +135,86 @@
   }
 }
 
+std::vector<DownloadItem::ReceivedSlice> FindSlicesForRemainingContent(
+    int64_t current_offset,
+    int64_t total_length,
+    int request_count,
+    int64_t min_slice_size) {
+  std::vector<DownloadItem::ReceivedSlice> new_slices;
+
+  if (request_count > 0) {
+    int64_t slice_size =
+        std::max<int64_t>(total_length / request_count, min_slice_size);
+    slice_size = slice_size > 0 ? slice_size : 1;
+    for (int i = 0, num_requests = total_length / slice_size;
+         i < num_requests - 1; ++i) {
+      new_slices.emplace_back(current_offset, slice_size);
+      current_offset += slice_size;
+    }
+  }
+
+  // No strong assumption that content length header is correct. So the last
+  // slice is always half open, which sends range request like "Range:50-".
+  new_slices.emplace_back(current_offset, DownloadSaveInfo::kLengthFullContent);
+  return new_slices;
+}
+
+int64_t GetMinSliceSizeConfig() {
+  std::string finch_value = base::GetFieldTrialParamValueByFeature(
+      features::kParallelDownloading, kMinSliceSizeFinchKey);
+  int64_t result;
+  return base::StringToInt64(finch_value, &result)
+             ? result
+             : kMinSliceSizeParallelDownload;
+}
+
+int GetParallelRequestCountConfig() {
+  std::string finch_value = base::GetFieldTrialParamValueByFeature(
+      features::kParallelDownloading, kParallelRequestCountFinchKey);
+  int result;
+  return base::StringToInt(finch_value, &result) ? result
+                                                 : kParallelRequestCount;
+}
+
+base::TimeDelta GetParallelRequestDelayConfig() {
+  std::string finch_value = base::GetFieldTrialParamValueByFeature(
+      features::kParallelDownloading, kParallelRequestDelayFinchKey);
+  int64_t time_ms = 0;
+  return base::StringToInt64(finch_value, &time_ms)
+             ? base::TimeDelta::FromMilliseconds(time_ms)
+             : base::TimeDelta::FromMilliseconds(0);
+}
+
+base::TimeDelta GetParallelRequestRemainingTimeConfig() {
+  std::string finch_value = base::GetFieldTrialParamValueByFeature(
+      features::kParallelDownloading, kParallelRequestRemainingTimeFinchKey);
+  int time_in_seconds = 0;
+  return base::StringToInt(finch_value, &time_in_seconds)
+             ? base::TimeDelta::FromSeconds(time_in_seconds)
+             : base::TimeDelta::FromSeconds(kDefaultRemainingTimeInSeconds);
+}
+
+int64_t GetMaxContiguousDataBlockSizeFromBeginning(
+    const DownloadItem::ReceivedSlices& slices) {
+  std::vector<DownloadItem::ReceivedSlice>::const_iterator iter =
+      slices.begin();
+
+  int64_t size = 0;
+  while (iter != slices.end() && iter->offset == size) {
+    size += iter->received_bytes;
+    iter++;
+  }
+  return size;
+}
+
+bool IsParallelDownloadEnabled() {
+  bool feature_enabled =
+      base::FeatureList::IsEnabled(features::kParallelDownloading);
+  // Disabled when |kEnableParallelDownloadFinchKey| Finch config is set to
+  // false.
+  bool enabled_parameter = GetFieldTrialParamByFeatureAsBool(
+      features::kParallelDownloading, kEnableParallelDownloadFinchKey, true);
+  return feature_enabled && enabled_parameter;
+}
+
 }  // namespace download
diff --git a/components/download/internal/common/parallel_download_utils_unittest.cc b/components/download/internal/common/parallel_download_utils_unittest.cc
index ae72f2f1..5a239a0 100644
--- a/components/download/internal/common/parallel_download_utils_unittest.cc
+++ b/components/download/internal/common/parallel_download_utils_unittest.cc
@@ -4,6 +4,14 @@
 
 #include "components/download/public/common/parallel_download_utils.h"
 
+#include <map>
+#include <memory>
+
+#include "base/strings/string_number_conversions.h"
+#include "base/test/scoped_feature_list.h"
+#include "components/download/public/common/download_features.h"
+#include "components/download/public/common/download_file_impl.h"
+#include "components/download/public/common/download_save_info.h"
 #include "components/download/public/common/mock_input_stream.h"
 #include "components/download/public/common/parallel_download_utils.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -264,4 +272,129 @@
                         ParallelDownloadUtilsRecoverErrorTest,
                         ::testing::Values(0, 20, 80));
 
+// Ensure the minimum slice size is correctly applied.
+TEST_F(ParallelDownloadUtilsTest, FindSlicesForRemainingContentMinSliceSize) {
+  // Minimum slice size is smaller than total length, only one slice returned.
+  DownloadItem::ReceivedSlices slices =
+      FindSlicesForRemainingContent(0, 100, 3, 150);
+  EXPECT_EQ(1u, slices.size());
+  EXPECT_EQ(0, slices[0].offset);
+  EXPECT_EQ(0, slices[0].received_bytes);
+
+  // Request count is large, the minimum slice size should limit the number of
+  // slices returned.
+  slices = FindSlicesForRemainingContent(0, 100, 33, 50);
+  EXPECT_EQ(2u, slices.size());
+  EXPECT_EQ(0, slices[0].offset);
+  EXPECT_EQ(50, slices[0].received_bytes);
+  EXPECT_EQ(50, slices[1].offset);
+  EXPECT_EQ(0, slices[1].received_bytes);
+
+  // Can chunk 2 slices under minimum slice size, but request count is only 1,
+  // request count should win.
+  slices = FindSlicesForRemainingContent(0, 100, 1, 50);
+  EXPECT_EQ(1u, slices.size());
+  EXPECT_EQ(0, slices[0].offset);
+  EXPECT_EQ(0, slices[0].received_bytes);
+
+  // A total 100 bytes data and a 51 bytes minimum slice size, only one slice is
+  // returned.
+  slices = FindSlicesForRemainingContent(0, 100, 3, 51);
+  EXPECT_EQ(1u, slices.size());
+  EXPECT_EQ(0, slices[0].offset);
+  EXPECT_EQ(0, slices[0].received_bytes);
+
+  // Extreme case where size is smaller than request number.
+  slices = FindSlicesForRemainingContent(0, 1, 3, 1);
+  EXPECT_EQ(1u, slices.size());
+  EXPECT_EQ(DownloadItem::ReceivedSlice(0, 0), slices[0]);
+
+  // Normal case.
+  slices = FindSlicesForRemainingContent(0, 100, 3, 5);
+  EXPECT_EQ(3u, slices.size());
+  EXPECT_EQ(DownloadItem::ReceivedSlice(0, 33), slices[0]);
+  EXPECT_EQ(DownloadItem::ReceivedSlice(33, 33), slices[1]);
+  EXPECT_EQ(DownloadItem::ReceivedSlice(66, 0), slices[2]);
+}
+
+TEST_F(ParallelDownloadUtilsTest, GetMaxContiguousDataBlockSizeFromBeginning) {
+  std::vector<DownloadItem::ReceivedSlice> slices;
+  slices.emplace_back(500, 500);
+  EXPECT_EQ(0, GetMaxContiguousDataBlockSizeFromBeginning(slices));
+
+  DownloadItem::ReceivedSlice slice1(0, 200);
+  AddOrMergeReceivedSliceIntoSortedArray(slice1, slices);
+  EXPECT_EQ(200, GetMaxContiguousDataBlockSizeFromBeginning(slices));
+
+  DownloadItem::ReceivedSlice slice2(200, 300);
+  AddOrMergeReceivedSliceIntoSortedArray(slice2, slices);
+  EXPECT_EQ(1000, GetMaxContiguousDataBlockSizeFromBeginning(slices));
+}
+
+// Test to verify Finch parameters for enabled experiment group is read
+// correctly.
+TEST_F(ParallelDownloadUtilsTest, FinchConfigEnabled) {
+  base::test::ScopedFeatureList feature_list;
+  std::map<std::string, std::string> params = {
+      {kMinSliceSizeFinchKey, "1234"},
+      {kParallelRequestCountFinchKey, "6"},
+      {kParallelRequestDelayFinchKey, "2000"},
+      {kParallelRequestRemainingTimeFinchKey, "3"}};
+  feature_list.InitAndEnableFeatureWithParameters(
+      features::kParallelDownloading, params);
+  EXPECT_TRUE(IsParallelDownloadEnabled());
+  EXPECT_EQ(GetMinSliceSizeConfig(), 1234);
+  EXPECT_EQ(GetParallelRequestCountConfig(), 6);
+  EXPECT_EQ(GetParallelRequestDelayConfig(), base::TimeDelta::FromSeconds(2));
+  EXPECT_EQ(GetParallelRequestRemainingTimeConfig(),
+            base::TimeDelta::FromSeconds(3));
+}
+
+// Test to verify the disable experiment group will actually disable the
+// feature.
+TEST_F(ParallelDownloadUtilsTest, FinchConfigDisabled) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndDisableFeature(features::kParallelDownloading);
+  EXPECT_FALSE(IsParallelDownloadEnabled());
+}
+
+// Test to verify that the Finch parameter |enable_parallel_download| works
+// correctly.
+TEST_F(ParallelDownloadUtilsTest, FinchConfigDisabledWithParameter) {
+  {
+    base::test::ScopedFeatureList feature_list;
+    std::map<std::string, std::string> params = {
+        {kMinSliceSizeFinchKey, "4321"},
+        {kEnableParallelDownloadFinchKey, "false"}};
+    feature_list.InitAndEnableFeatureWithParameters(
+        features::kParallelDownloading, params);
+    // Use |enable_parallel_download| to disable parallel download in enabled
+    // experiment group.
+    EXPECT_FALSE(IsParallelDownloadEnabled());
+    EXPECT_EQ(GetMinSliceSizeConfig(), 4321);
+  }
+  {
+    base::test::ScopedFeatureList feature_list;
+    std::map<std::string, std::string> params = {
+        {kMinSliceSizeFinchKey, "4321"},
+        {kEnableParallelDownloadFinchKey, "true"}};
+    feature_list.InitAndEnableFeatureWithParameters(
+        features::kParallelDownloading, params);
+    // Disable only if |enable_parallel_download| sets to false.
+    EXPECT_TRUE(IsParallelDownloadEnabled());
+    EXPECT_EQ(GetMinSliceSizeConfig(), 4321);
+  }
+  {
+    base::test::ScopedFeatureList feature_list;
+    std::map<std::string, std::string> params = {
+        {kMinSliceSizeFinchKey, "4321"}};
+    feature_list.InitAndEnableFeatureWithParameters(
+        features::kParallelDownloading, params);
+    // Empty |enable_parallel_download| in an enabled experiment group will have
+    // no impact.
+    EXPECT_TRUE(IsParallelDownloadEnabled());
+    EXPECT_EQ(GetMinSliceSizeConfig(), 4321);
+  }
+}
+
 }  // namespace download
diff --git a/components/download/public/common/BUILD.gn b/components/download/public/common/BUILD.gn
index 4a1a44e..482fbe73 100644
--- a/components/download/public/common/BUILD.gn
+++ b/components/download/public/common/BUILD.gn
@@ -46,6 +46,7 @@
     "download_worker.h",
     "input_stream.cc",
     "input_stream.h",
+    "parallel_download_job.h",
     "parallel_download_utils.h",
     "rate_estimator.h",
     "resource_downloader.h",
diff --git a/content/browser/download/parallel_download_job.h b/components/download/public/common/parallel_download_job.h
similarity index 64%
rename from content/browser/download/parallel_download_job.h
rename to components/download/public/common/parallel_download_job.h
index 5a32b8ab..50f2d9a1 100644
--- a/content/browser/download/parallel_download_job.h
+++ b/components/download/public/common/parallel_download_job.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CONTENT_BROWSER_DOWNLOAD_PARALLEL_DOWNLOAD_JOB_H_
-#define CONTENT_BROWSER_DOWNLOAD_PARALLEL_DOWNLOAD_JOB_H_
+#ifndef COMPONENTS_DOWNLOAD_PUBLIC_COMMON_PARALLEL_DOWNLOAD_JOB_H_
+#define COMPONENTS_DOWNLOAD_PUBLIC_COMMON_PARALLEL_DOWNLOAD_JOB_H_
 
 #include <memory>
 #include <unordered_map>
@@ -11,24 +11,31 @@
 
 #include "base/macros.h"
 #include "base/timer/timer.h"
+#include "components/download/public/common/download_export.h"
 #include "components/download/public/common/download_job_impl.h"
 #include "components/download/public/common/download_worker.h"
-#include "content/common/content_export.h"
 
-namespace content {
+namespace net {
+class URLRequestContextGetter;
+}
+
+namespace download {
 
 // DownloadJob that can create concurrent range requests to fetch different
 // parts of the file.
 // The original request is hold in base class.
-class CONTENT_EXPORT ParallelDownloadJob
-    : public download::DownloadJobImpl,
-      public download::DownloadWorker::Delegate {
+class COMPONENTS_DOWNLOAD_EXPORT ParallelDownloadJob
+    : public DownloadJobImpl,
+      public DownloadWorker::Delegate {
  public:
+  // TODO(qinmin): Remove |url_request_context_getter| once network service is
+  // enabled.
   ParallelDownloadJob(
-      download::DownloadItem* download_item,
-      std::unique_ptr<download::DownloadRequestHandleInterface> request_handle,
-      const download::DownloadCreateInfo& create_info,
-      scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory);
+      DownloadItem* download_item,
+      std::unique_ptr<DownloadRequestHandleInterface> request_handle,
+      const DownloadCreateInfo& create_info,
+      scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory,
+      net::URLRequestContextGetter* url_request_context_getter);
   ~ParallelDownloadJob() override;
 
   // DownloadJobImpl implementation.
@@ -39,10 +46,9 @@
 
  protected:
   // DownloadJobImpl implementation.
-  void OnDownloadFileInitialized(
-      download::DownloadFile::InitializeCallback callback,
-      download::DownloadInterruptReason result,
-      int64_t bytes_wasted) override;
+  void OnDownloadFileInitialized(DownloadFile::InitializeCallback callback,
+                                 DownloadInterruptReason result,
+                                 int64_t bytes_wasted) override;
 
   // Virtual for testing.
   virtual int GetParallelRequestCount() const;
@@ -50,7 +56,7 @@
   virtual int GetMinRemainingTimeInSeconds() const;
 
   using WorkerMap =
-      std::unordered_map<int64_t, std::unique_ptr<download::DownloadWorker>>;
+      std::unordered_map<int64_t, std::unique_ptr<DownloadWorker>>;
 
   // Map from the offset position of the slice to the worker that downloads the
   // slice.
@@ -60,9 +66,8 @@
   friend class ParallelDownloadJobTest;
 
   // DownloadWorker::Delegate implementation.
-  void OnInputStreamReady(
-      download::DownloadWorker* worker,
-      std::unique_ptr<download::InputStream> input_stream) override;
+  void OnInputStreamReady(DownloadWorker* worker,
+                          std::unique_ptr<InputStream> input_stream) override;
 
   // Build parallel requests after a delay, to effectively measure the single
   // stream bandwidth.
@@ -74,8 +79,7 @@
 
   // Build one http request for each slice from the second slice.
   // The first slice represents the original request.
-  void ForkSubRequests(
-      const download::DownloadItem::ReceivedSlices& slices_to_download);
+  void ForkSubRequests(const DownloadItem::ReceivedSlices& slices_to_download);
 
   // Create one range request, virtual for testing. Range request will start
   // from |offset| to |length|. Range request will be half open, e.g.
@@ -88,7 +92,7 @@
   // A snapshot of received slices when creating the parallel download job.
   // Download item's received slices may be different from this snapshot when
   // |BuildParallelRequests| is called.
-  download::DownloadItem::ReceivedSlices initial_received_slices_;
+  DownloadItem::ReceivedSlices initial_received_slices_;
 
   // The length of the response body of the original request.
   // Used to estimate the remaining size of the content when the initial
@@ -105,12 +109,16 @@
   // If the download progress is canceled.
   bool is_canceled_;
 
-  // SharedURLLoaderFactory to issue network requests.
+  // SharedURLLoaderFactory to issue network requests with network service
   scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory_;
 
+  // URLRequestContextGetter for issueing network requests when network service
+  // is disabled.
+  scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_;
+
   DISALLOW_COPY_AND_ASSIGN(ParallelDownloadJob);
 };
 
-}  //  namespace content
+}  //  namespace download
 
-#endif  // CONTENT_BROWSER_DOWNLOAD_PARALLEL_DOWNLOAD_JOB_H_
+#endif  // COMPONENTS_DOWNLOAD_PUBLIC_COMMON_PARALLEL_DOWNLOAD_JOB_H_
diff --git a/components/download/public/common/parallel_download_utils.h b/components/download/public/common/parallel_download_utils.h
index e08a92af..2e76d9b 100644
--- a/components/download/public/common/parallel_download_utils.h
+++ b/components/download/public/common/parallel_download_utils.h
@@ -15,6 +15,28 @@
 // parallel download code is moved to components/download.
 namespace download {
 
+// Finch parameter key value to enable parallel download. Used in enabled
+// experiment group that needs other parameters, such as min_slice_size, but
+// don't want to actually do parallel download.
+constexpr char kEnableParallelDownloadFinchKey[] = "enable_parallel_download";
+
+// Finch parameter key value for minimum slice size in bytes to use parallel
+// download.
+constexpr char kMinSliceSizeFinchKey[] = "min_slice_size";
+
+// Finch parameter key value for number of parallel requests in a parallel
+// download, including the original request.
+constexpr char kParallelRequestCountFinchKey[] = "request_count";
+
+// Finch parameter key value for the delay time in milliseconds to send
+// parallel requests after response of the original request is handled.
+constexpr char kParallelRequestDelayFinchKey[] = "parallel_request_delay";
+
+// Finch parameter key value for the remaining time in seconds that is required
+// to send parallel requests.
+constexpr char kParallelRequestRemainingTimeFinchKey[] =
+    "parallel_request_remaining_time";
+
 // Given an array of slices that are received, returns an array of slices to
 // download. |received_slices| must be ordered by offsets.
 COMPONENTS_DOWNLOAD_EXPORT std::vector<DownloadItem::ReceivedSlice>
@@ -35,6 +57,44 @@
     const DownloadFileImpl::SourceStream* error_stream,
     const DownloadFileImpl::SourceStream* preceding_neighbor);
 
+// Chunks the content that starts from |current_offset|, into at most
+// std::max(|request_count|, 1) smaller slices.
+// Each slice contains at least |min_slice_size| bytes unless |total_length|
+// is less than |min_slice_size|.
+// The last slice is half opened.
+COMPONENTS_DOWNLOAD_EXPORT std::vector<download::DownloadItem::ReceivedSlice>
+FindSlicesForRemainingContent(int64_t current_offset,
+                              int64_t total_length,
+                              int request_count,
+                              int64_t min_slice_size);
+
+// Finch configuration utilities.
+//
+// Get the minimum slice size to use parallel download from finch configuration.
+// A slice won't be further chunked into smaller slices if the size is less
+// than the minimum size.
+COMPONENTS_DOWNLOAD_EXPORT int64_t GetMinSliceSizeConfig();
+
+// Get the request count for parallel download from finch configuration.
+COMPONENTS_DOWNLOAD_EXPORT int GetParallelRequestCountConfig();
+
+// Get the time delay to send parallel requests after the response of original
+// request is handled.
+COMPONENTS_DOWNLOAD_EXPORT base::TimeDelta GetParallelRequestDelayConfig();
+
+// Get the required remaining time before creating parallel requests.
+COMPONENTS_DOWNLOAD_EXPORT base::TimeDelta
+GetParallelRequestRemainingTimeConfig();
+
+// Given an ordered array of slices, get the maximum size of a contiguous data
+// block that starts from offset 0. If the first slice doesn't start from offset
+// 0, return 0.
+COMPONENTS_DOWNLOAD_EXPORT int64_t GetMaxContiguousDataBlockSizeFromBeginning(
+    const download::DownloadItem::ReceivedSlices& slices);
+
+// Returns whether parallel download is enabled.
+COMPONENTS_DOWNLOAD_EXPORT bool IsParallelDownloadEnabled();
+
 // Print the states of received slices for debugging.
 void DebugSlicesInfo(const DownloadItem::ReceivedSlices& slices);
 
diff --git a/components/signin/core/browser/account_reconcilor_unittest.cc b/components/signin/core/browser/account_reconcilor_unittest.cc
index 16464c4..748684a 100644
--- a/components/signin/core/browser/account_reconcilor_unittest.cc
+++ b/components/signin/core/browser/account_reconcilor_unittest.cc
@@ -714,7 +714,7 @@
     else
       token_service()->UpdateCredentials(account_id, "refresh_token");
     if (token.has_error) {
-      token_service_delegate()->SetLastErrorForAccount(
+      token_service_delegate()->UpdateAuthError(
           account_id, GoogleServiceAuthError(
                           GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
     }
@@ -1835,7 +1835,7 @@
 
   // Now that we've tried once, the token service knows that the primary
   // account has an auth error.
-  token_service_delegate()->SetLastErrorForAccount(account_id1, error);
+  token_service_delegate()->UpdateAuthError(account_id1, error);
 
   // A second attempt to reconcile should be a noop.
   reconcilor->StartReconcile();
@@ -1854,7 +1854,7 @@
   token_service()->UpdateCredentials(account_id2, "refresh_token");
 
   // Mark the secondary account in auth error state.
-  token_service_delegate()->SetLastErrorForAccount(
+  token_service_delegate()->UpdateAuthError(
       account_id2,
       GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
 
diff --git a/components/signin/core/browser/fake_signin_manager.cc b/components/signin/core/browser/fake_signin_manager.cc
index ab4c9747..a59df220 100644
--- a/components/signin/core/browser/fake_signin_manager.cc
+++ b/components/signin/core/browser/fake_signin_manager.cc
@@ -88,7 +88,7 @@
 void FakeSigninManager::DoSignOut(
     signin_metrics::ProfileSignout signout_source_metric,
     signin_metrics::SignoutDelete signout_delete_metric,
-    bool remove_all_accounts) {
+    RemoveAccountsOption remove_option) {
   if (IsSignoutProhibited())
     return;
   set_auth_in_progress(std::string());
@@ -97,8 +97,19 @@
   const std::string account_id = GetAuthenticatedAccountId();
   const std::string username = account_info.email;
   authenticated_account_id_.clear();
-  if (token_service_ && remove_all_accounts)
-    token_service_->RevokeAllCredentials();
+  switch (remove_option) {
+    case RemoveAccountsOption::kRemoveAllAccounts:
+      if (token_service_)
+        token_service_->RevokeAllCredentials();
+      break;
+    case RemoveAccountsOption::kRemoveAuthenticatedAccountIfInError:
+      if (token_service_ && token_service_->RefreshTokenHasError(account_id))
+        token_service_->RevokeCredentials(account_id);
+      break;
+    case RemoveAccountsOption::kKeepAllAccounts:
+      // Do nothing.
+      break;
+  }
 
   FireGoogleSignedOut(account_id, account_info);
 }
diff --git a/components/signin/core/browser/fake_signin_manager.h b/components/signin/core/browser/fake_signin_manager.h
index 26cc7f8..3f3e9ce 100644
--- a/components/signin/core/browser/fake_signin_manager.h
+++ b/components/signin/core/browser/fake_signin_manager.h
@@ -66,7 +66,7 @@
  protected:
   void DoSignOut(signin_metrics::ProfileSignout signout_source_metric,
                  signin_metrics::SignoutDelete signout_delete_metric,
-                 bool remove_all_accounts) override;
+                 RemoveAccountsOption remove_option) override;
 
   // Username specified in StartSignInWithRefreshToken() call.
   std::string username_;
diff --git a/components/signin/core/browser/signin_manager.cc b/components/signin/core/browser/signin_manager.cc
index a7460b6..5b92a34 100644
--- a/components/signin/core/browser/signin_manager.cc
+++ b/components/signin/core/browser/signin_manager.cc
@@ -160,38 +160,41 @@
 void SigninManager::SignOut(
     signin_metrics::ProfileSignout signout_source_metric,
     signin_metrics::SignoutDelete signout_delete_metric) {
-  StartSignOut(signout_source_metric, signout_delete_metric,
-               account_consistency_ != signin::AccountConsistencyMethod::kDice);
+  RemoveAccountsOption remove_option =
+      (account_consistency_ == signin::AccountConsistencyMethod::kDice)
+          ? RemoveAccountsOption::kRemoveAuthenticatedAccountIfInError
+          : RemoveAccountsOption::kRemoveAllAccounts;
+  StartSignOut(signout_source_metric, signout_delete_metric, remove_option);
 }
 
 void SigninManager::SignOutAndRemoveAllAccounts(
     signin_metrics::ProfileSignout signout_source_metric,
     signin_metrics::SignoutDelete signout_delete_metric) {
   StartSignOut(signout_source_metric, signout_delete_metric,
-               true /* remove_all_tokens */);
+               RemoveAccountsOption::kRemoveAllAccounts);
 }
 
 void SigninManager::SignOutAndKeepAllAccounts(
     signin_metrics::ProfileSignout signout_source_metric,
     signin_metrics::SignoutDelete signout_delete_metric) {
   StartSignOut(signout_source_metric, signout_delete_metric,
-               false /* remove_all_tokens */);
+               RemoveAccountsOption::kKeepAllAccounts);
 }
 
 void SigninManager::StartSignOut(
     signin_metrics::ProfileSignout signout_source_metric,
     signin_metrics::SignoutDelete signout_delete_metric,
-    bool remove_all_accounts) {
-  client_->PreSignOut(base::Bind(&SigninManager::DoSignOut,
-                                 base::Unretained(this), signout_source_metric,
-                                 signout_delete_metric, remove_all_accounts),
-                      signout_source_metric);
+    RemoveAccountsOption remove_option) {
+  client_->PreSignOut(
+      base::Bind(&SigninManager::DoSignOut, base::Unretained(this),
+                 signout_source_metric, signout_delete_metric, remove_option),
+      signout_source_metric);
 }
 
 void SigninManager::DoSignOut(
     signin_metrics::ProfileSignout signout_source_metric,
     signin_metrics::SignoutDelete signout_delete_metric,
-    bool remove_all_accounts) {
+    RemoveAccountsOption remove_option) {
   DCHECK(IsInitialized());
 
   signin_metrics::LogSignout(signout_source_metric, signout_delete_metric);
@@ -241,10 +244,19 @@
   // Revoke all tokens before sending signed_out notification, because there
   // may be components that don't listen for token service events when the
   // profile is not connected to an account.
-  if (remove_all_accounts) {
-    LOG(WARNING) << "Revoking all refresh tokens on server. Reason: sign out, "
-                 << "IsSigninAllowed: " << IsSigninAllowed();
-    token_service_->RevokeAllCredentials();
+  switch (remove_option) {
+    case RemoveAccountsOption::kRemoveAllAccounts:
+      VLOG(0) << "Revoking all refresh tokens on server. Reason: sign out, "
+              << "IsSigninAllowed: " << IsSigninAllowed();
+      token_service_->RevokeAllCredentials();
+      break;
+    case RemoveAccountsOption::kRemoveAuthenticatedAccountIfInError:
+      if (token_service_->RefreshTokenHasError(account_id))
+        token_service_->RevokeCredentials(account_id);
+      break;
+    case RemoveAccountsOption::kKeepAllAccounts:
+      // Do nothing.
+      break;
   }
 
   FireGoogleSignedOut(account_id, account_info);
diff --git a/components/signin/core/browser/signin_manager.h b/components/signin/core/browser/signin_manager.h
index 72f2697..8b7d54c 100644
--- a/components/signin/core/browser/signin_manager.h
+++ b/components/signin/core/browser/signin_manager.h
@@ -62,6 +62,16 @@
   // signin. The callback is passed the just-fetched OAuth login refresh token.
   typedef base::Callback<void(const std::string&)> OAuthTokenFetchedCallback;
 
+  // Used to remove accounts from the token service and the account tracker.
+  enum class RemoveAccountsOption {
+    // Do not remove accounts.
+    kKeepAllAccounts,
+    // Remove all the accounts.
+    kRemoveAllAccounts,
+    // Removes the authenticated account if it is in authentication error.
+    kRemoveAuthenticatedAccountIfInError
+  };
+
   // This is used to distinguish URLs belonging to the special web signin flow
   // running in the special signin process from other URLs on the same domain.
   // We do not grant WebUI privilieges / bindings to this process or to URLs of
@@ -109,8 +119,9 @@
   // associated with the authenticated user, and canceling all auth in progress.
   // On mobile and on desktop pre-DICE, this also removes all accounts from
   // Chrome by revoking all refresh tokens.
-  // On desktop with DICE enabled, this will not remove all accounts from
-  // Chrome.
+  // On desktop with DICE enabled, this will remove the authenticated account
+  // from Chrome only if it is in authentication error. No other accounts are
+  // removed.
   void SignOut(signin_metrics::ProfileSignout signout_source_metric,
                signin_metrics::SignoutDelete signout_delete_metric);
 
@@ -183,7 +194,7 @@
   // The sign out process which is started by SigninClient::PreSignOut()
   virtual void DoSignOut(signin_metrics::ProfileSignout signout_source_metric,
                          signin_metrics::SignoutDelete signout_delete_metric,
-                         bool remove_all_accounts);
+                         RemoveAccountsOption remove_option);
 
  private:
   // Interface that gives information on internal SigninManager operations. Only
@@ -265,7 +276,7 @@
   // Starts the sign out process.
   void StartSignOut(signin_metrics::ProfileSignout signout_source_metric,
                     signin_metrics::SignoutDelete signout_delete_metric,
-                    bool remove_all_accounts);
+                    RemoveAccountsOption remove_option);
 
   void OnSigninAllowedPrefChanged();
   void OnGoogleServicesUsernamePatternChanged();
diff --git a/components/signin/core/browser/signin_manager_unittest.cc b/components/signin/core/browser/signin_manager_unittest.cc
index 7fa807de..72ae828e 100644
--- a/components/signin/core/browser/signin_manager_unittest.cc
+++ b/components/signin/core/browser/signin_manager_unittest.cc
@@ -85,7 +85,8 @@
         cookie_manager_service_(&token_service_,
                                 GaiaConstants::kChromeSource,
                                 &test_signin_client_),
-        url_fetcher_factory_(nullptr) {
+        url_fetcher_factory_(nullptr),
+        account_consistency_(signin::AccountConsistencyMethod::kDisabled) {
     test_signin_client_.SetURLRequestContext(
         new net::TestURLRequestContextGetter(loop_.task_runner()));
     cookie_manager_service_.Init(&url_fetcher_factory_);
@@ -131,7 +132,7 @@
     manager_ = std::make_unique<SigninManager>(
         &test_signin_client_, &token_service_, &account_tracker_,
         &cookie_manager_service_, nullptr /* signin_error_controller */,
-        signin::AccountConsistencyMethod::kDisabled);
+        account_consistency_);
     manager_->Initialize(&local_state_);
     manager_->AddObserver(&test_observer_);
   }
@@ -176,6 +177,7 @@
   TestSigninManagerObserver test_observer_;
   std::vector<std::string> oauth_tokens_fetched_;
   std::vector<std::string> cookies_;
+  signin::AccountConsistencyMethod account_consistency_;
 };
 
 TEST_F(SigninManagerTest, SignInWithRefreshToken) {
@@ -258,6 +260,79 @@
   EXPECT_TRUE(manager_->GetAuthenticatedAccountId().empty());
 }
 
+TEST_F(SigninManagerTest, SignOutRevoke) {
+  CreateSigninManager();
+  std::string main_account_id =
+      AddToAccountTracker("main_id", "user@gmail.com");
+  std::string other_account_id =
+      AddToAccountTracker("other_id", "other@gmail.com");
+  token_service_.UpdateCredentials(main_account_id, "token");
+  token_service_.UpdateCredentials(other_account_id, "token");
+  manager_->OnExternalSigninCompleted("user@gmail.com");
+  EXPECT_TRUE(manager_->IsAuthenticated());
+  EXPECT_EQ(main_account_id, manager_->GetAuthenticatedAccountId());
+
+  manager_->SignOut(signin_metrics::SIGNOUT_TEST,
+                    signin_metrics::SignoutDelete::IGNORE_METRIC);
+
+  // Tokens are revoked.
+  EXPECT_FALSE(manager_->IsAuthenticated());
+  EXPECT_TRUE(token_service_.GetAccounts().empty());
+}
+
+TEST_F(SigninManagerTest, SignOutDiceNoRevoke) {
+  account_consistency_ = signin::AccountConsistencyMethod::kDice;
+  CreateSigninManager();
+  std::string main_account_id =
+      AddToAccountTracker("main_id", "user@gmail.com");
+  std::string other_account_id =
+      AddToAccountTracker("other_id", "other@gmail.com");
+  token_service_.UpdateCredentials(main_account_id, "token");
+  token_service_.UpdateCredentials(other_account_id, "token");
+  manager_->OnExternalSigninCompleted("user@gmail.com");
+  EXPECT_TRUE(manager_->IsAuthenticated());
+  EXPECT_EQ(main_account_id, manager_->GetAuthenticatedAccountId());
+
+  manager_->SignOut(signin_metrics::SIGNOUT_TEST,
+                    signin_metrics::SignoutDelete::IGNORE_METRIC);
+
+  // Tokens are not revoked.
+  EXPECT_FALSE(manager_->IsAuthenticated());
+  std::vector<std::string> expected_tokens = {main_account_id,
+                                              other_account_id};
+  EXPECT_EQ(expected_tokens, token_service_.GetAccounts());
+}
+
+TEST_F(SigninManagerTest, SignOutDiceWithError) {
+  account_consistency_ = signin::AccountConsistencyMethod::kDice;
+  CreateSigninManager();
+  std::string main_account_id =
+      AddToAccountTracker("main_id", "user@gmail.com");
+  std::string other_account_id =
+      AddToAccountTracker("other_id", "other@gmail.com");
+  token_service_.UpdateCredentials(main_account_id, "token");
+  token_service_.UpdateCredentials(other_account_id, "token");
+  manager_->OnExternalSigninCompleted("user@gmail.com");
+
+  GoogleServiceAuthError error(
+      GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS);
+  token_service_.GetDelegate()->UpdateAuthError(main_account_id, error);
+  token_service_.GetDelegate()->UpdateAuthError(other_account_id, error);
+  ASSERT_TRUE(token_service_.RefreshTokenHasError(main_account_id));
+  ASSERT_TRUE(token_service_.RefreshTokenHasError(other_account_id));
+
+  EXPECT_TRUE(manager_->IsAuthenticated());
+  EXPECT_EQ(main_account_id, manager_->GetAuthenticatedAccountId());
+
+  manager_->SignOut(signin_metrics::SIGNOUT_TEST,
+                    signin_metrics::SignoutDelete::IGNORE_METRIC);
+
+  // Only main token is revoked.
+  EXPECT_FALSE(manager_->IsAuthenticated());
+  std::vector<std::string> expected_tokens = {other_account_id};
+  EXPECT_EQ(expected_tokens, token_service_.GetAccounts());
+}
+
 TEST_F(SigninManagerTest, SignOutWhileProhibited) {
   CreateSigninManager();
   EXPECT_FALSE(manager_->IsAuthenticated());
diff --git a/components/visitedlink/browser/visitedlink_event_listener.cc b/components/visitedlink/browser/visitedlink_event_listener.cc
index d1e6040d..a38fc34 100644
--- a/components/visitedlink/browser/visitedlink_event_listener.cc
+++ b/components/visitedlink/browser/visitedlink_event_listener.cc
@@ -49,11 +49,9 @@
   }
 
   // Informs the renderer about a new visited link table.
-  void SendVisitedLinkTable(mojo::SharedBufferHandle table) {
-    mojo::ScopedSharedBufferHandle client_table =
-        table.Clone(mojo::SharedBufferHandle::AccessMode::READ_ONLY);
-    if (client_table.is_valid())
-      sink_->UpdateVisitedLinks(std::move(client_table));
+  void SendVisitedLinkTable(base::ReadOnlySharedMemoryRegion* region) {
+    if (region->IsValid())
+      sink_->UpdateVisitedLinks(region->Duplicate());
   }
 
   // Buffers |links| to update, but doesn't actually relay them.
@@ -135,10 +133,11 @@
     pending_visited_links_.clear();
 }
 
-void VisitedLinkEventListener::NewTable(mojo::SharedBufferHandle table) {
-  DCHECK(table.is_valid());
-  shared_memory_ = table.Clone(mojo::SharedBufferHandle::AccessMode::READ_ONLY);
-  if (!shared_memory_.is_valid())
+void VisitedLinkEventListener::NewTable(
+    base::ReadOnlySharedMemoryRegion* table_region) {
+  DCHECK(table_region && table_region->IsValid());
+  table_region_ = table_region->Duplicate();
+  if (!table_region_.IsValid())
     return;
 
   // Send to all RenderProcessHosts.
@@ -149,7 +148,7 @@
     if (!process)
       continue;
 
-    i->second->SendVisitedLinkTable(shared_memory_.get());
+    i->second->SendVisitedLinkTable(&table_region_);
   }
 }
 
@@ -201,12 +200,12 @@
         return;
 
       // Happens on browser start up.
-      if (!shared_memory_.is_valid())
+      if (!table_region_.IsValid())
         return;
 
       updaters_[process->GetID()].reset(
           new VisitedLinkUpdater(process->GetID()));
-      updaters_[process->GetID()]->SendVisitedLinkTable(shared_memory_.get());
+      updaters_[process->GetID()]->SendVisitedLinkTable(&table_region_);
       break;
     }
     case content::NOTIFICATION_RENDERER_PROCESS_TERMINATED: {
diff --git a/components/visitedlink/browser/visitedlink_event_listener.h b/components/visitedlink/browser/visitedlink_event_listener.h
index 15b4dd8..449cc2cc 100644
--- a/components/visitedlink/browser/visitedlink_event_listener.h
+++ b/components/visitedlink/browser/visitedlink_event_listener.h
@@ -9,6 +9,7 @@
 #include <memory>
 
 #include "base/macros.h"
+#include "base/memory/read_only_shared_memory_region.h"
 #include "base/timer/timer.h"
 #include "components/visitedlink/browser/visitedlink_master.h"
 #include "content/public/browser/notification_observer.h"
@@ -31,7 +32,7 @@
   explicit VisitedLinkEventListener(content::BrowserContext* browser_context);
   ~VisitedLinkEventListener() override;
 
-  void NewTable(mojo::SharedBufferHandle table) override;
+  void NewTable(base::ReadOnlySharedMemoryRegion* table_region) override;
   void Add(VisitedLinkMaster::Fingerprint fingerprint) override;
   void Reset(bool invalidate_hashes) override;
 
@@ -62,7 +63,7 @@
   typedef std::map<int, std::unique_ptr<VisitedLinkUpdater>> Updaters;
   Updaters updaters_;
 
-  mojo::ScopedSharedBufferHandle shared_memory_;
+  base::ReadOnlySharedMemoryRegion table_region_;
 
   // Used to filter RENDERER_PROCESS_CREATED notifications to renderers that
   // belong to this BrowserContext.
diff --git a/components/visitedlink/browser/visitedlink_master.cc b/components/visitedlink/browser/visitedlink_master.cc
index 7415812..8290597 100644
--- a/components/visitedlink/browser/visitedlink_master.cc
+++ b/components/visitedlink/browser/visitedlink_master.cc
@@ -126,15 +126,13 @@
 struct VisitedLinkMaster::LoadFromFileResult
     : public base::RefCountedThreadSafe<LoadFromFileResult> {
   LoadFromFileResult(base::ScopedFILE file,
-                     mojo::ScopedSharedBufferHandle shared_memory,
-                     mojo::ScopedSharedBufferMapping hash_table,
+                     base::MappedReadOnlyRegion hash_table_memory,
                      int32_t num_entries,
                      int32_t used_count,
                      uint8_t salt[LINK_SALT_LENGTH]);
 
   base::ScopedFILE file;
-  mojo::ScopedSharedBufferHandle shared_memory;
-  mojo::ScopedSharedBufferMapping hash_table;
+  base::MappedReadOnlyRegion hash_table_memory;
   int32_t num_entries;
   int32_t used_count;
   uint8_t salt[LINK_SALT_LENGTH];
@@ -148,14 +146,12 @@
 
 VisitedLinkMaster::LoadFromFileResult::LoadFromFileResult(
     base::ScopedFILE file,
-    mojo::ScopedSharedBufferHandle shared_memory,
-    mojo::ScopedSharedBufferMapping hash_table,
+    base::MappedReadOnlyRegion hash_table_memory,
     int32_t num_entries,
     int32_t used_count,
     uint8_t salt[LINK_SALT_LENGTH])
     : file(std::move(file)),
-      shared_memory(std::move(shared_memory)),
-      hash_table(std::move(hash_table)),
+      hash_table_memory(std::move(hash_table_memory)),
       num_entries(num_entries),
       used_count(used_count) {
   memcpy(this->salt, salt, LINK_SALT_LENGTH);
@@ -281,8 +277,8 @@
   if (!CreateURLTable(DefaultTableSize()))
     return false;
 
-  if (shared_memory_.is_valid())
-    listener_->NewTable(shared_memory_.get());
+  if (mapped_table_memory_.region.IsValid())
+    listener_->NewTable(&mapped_table_memory_.region);
 
 #ifndef NDEBUG
   DebugValidate();
@@ -651,20 +647,19 @@
     return false;  // Header isn't valid.
 
   // Allocate and read the table.
-  mojo::ScopedSharedBufferHandle shared_memory;
-  mojo::ScopedSharedBufferMapping hash_table;
-  if (!CreateApartURLTable(num_entries, salt, &shared_memory, &hash_table))
+  base::MappedReadOnlyRegion hash_table_memory;
+  if (!CreateApartURLTable(num_entries, salt, &hash_table_memory))
     return false;
 
   if (!ReadFromFile(file_closer.get(), kFileHeaderSize,
-                    GetHashTableFromMapping(hash_table),
+                    GetHashTableFromMapping(hash_table_memory.mapping),
                     num_entries * sizeof(Fingerprint))) {
     return false;
   }
 
   *load_from_file_result = new LoadFromFileResult(
-      std::move(file_closer), std::move(shared_memory), std::move(hash_table),
-      num_entries, used_count, salt);
+      std::move(file_closer), std::move(hash_table_memory), num_entries,
+      used_count, salt);
   return true;
 }
 
@@ -705,9 +700,8 @@
   DCHECK(load_from_file_result.get());
 
   // Delete the previous table.
-  DCHECK(shared_memory_.is_valid());
-  shared_memory_.reset();
-  hash_table_mapping_.reset();
+  DCHECK(mapped_table_memory_.region.IsValid());
+  mapped_table_memory_ = base::MappedReadOnlyRegion();
 
   // Assign the open file.
   DCHECK(!file_);
@@ -716,12 +710,11 @@
   *file_ = load_from_file_result->file.release();
 
   // Assign the loaded table.
-  DCHECK(load_from_file_result->shared_memory.is_valid());
-  DCHECK(load_from_file_result->hash_table);
+  DCHECK(load_from_file_result->hash_table_memory.region.IsValid() &&
+         load_from_file_result->hash_table_memory.mapping.IsValid());
   memcpy(salt_, load_from_file_result->salt, LINK_SALT_LENGTH);
-  shared_memory_ = std::move(load_from_file_result->shared_memory);
-  hash_table_mapping_ = std::move(load_from_file_result->hash_table);
-  hash_table_ = GetHashTableFromMapping(hash_table_mapping_);
+  mapped_table_memory_ = std::move(load_from_file_result->hash_table_memory);
+  hash_table_ = GetHashTableFromMapping(mapped_table_memory_.mapping);
   table_length_ = load_from_file_result->num_entries;
   used_items_ = load_from_file_result->used_count;
 
@@ -730,7 +723,7 @@
 #endif
 
   // Send an update notification to all child processes.
-  listener_->NewTable(shared_memory_.get());
+  listener_->NewTable(&mapped_table_memory_.region);
 
   if (!added_since_load_.empty() || !deleted_since_load_.empty()) {
     // Resize the table if the table doesn't have enough capacity.
@@ -850,12 +843,10 @@
 // Initializes the shared memory structure. The salt should already be filled
 // in so that it can be written to the shared memory
 bool VisitedLinkMaster::CreateURLTable(int32_t num_entries) {
-  mojo::ScopedSharedBufferHandle shared_memory;
-  mojo::ScopedSharedBufferMapping hash_table;
-  if (CreateApartURLTable(num_entries, salt_, &shared_memory, &hash_table)) {
-    shared_memory_ = std::move(shared_memory);
-    hash_table_mapping_ = std::move(hash_table);
-    hash_table_ = GetHashTableFromMapping(hash_table_mapping_);
+  base::MappedReadOnlyRegion table_memory;
+  if (CreateApartURLTable(num_entries, salt_, &table_memory)) {
+    mapped_table_memory_ = std::move(table_memory);
+    hash_table_ = GetHashTableFromMapping(mapped_table_memory_.mapping);
     table_length_ = num_entries;
     used_items_ = 0;
     return true;
@@ -868,49 +859,36 @@
 bool VisitedLinkMaster::CreateApartURLTable(
     int32_t num_entries,
     const uint8_t salt[LINK_SALT_LENGTH],
-    mojo::ScopedSharedBufferHandle* shared_memory,
-    mojo::ScopedSharedBufferMapping* hash_table) {
+    base::MappedReadOnlyRegion* memory) {
   DCHECK(salt);
-  DCHECK(shared_memory);
-  DCHECK(hash_table);
+  DCHECK(memory);
 
   // The table is the size of the table followed by the entries.
   uint32_t alloc_size =
       num_entries * sizeof(Fingerprint) + sizeof(SharedHeader);
 
   // Create the shared memory object.
-  mojo::ScopedSharedBufferHandle shared_buffer =
-      mojo::SharedBufferHandle::Create(alloc_size);
-  if (!shared_buffer.is_valid())
-    return false;
-  mojo::ScopedSharedBufferMapping hash_table_mapping =
-      shared_buffer->Map(alloc_size);
-  if (!hash_table_mapping)
+  *memory = base::ReadOnlySharedMemoryRegion::Create(alloc_size);
+  if (!memory->region.IsValid() || !memory->mapping.IsValid())
     return false;
 
-  memset(hash_table_mapping.get(), 0, alloc_size);
+  memset(memory->mapping.memory(), 0, alloc_size);
 
   // Save the header for other processes to read.
-  SharedHeader* header = static_cast<SharedHeader*>(hash_table_mapping.get());
+  SharedHeader* header = static_cast<SharedHeader*>(memory->mapping.memory());
   header->length = num_entries;
   memcpy(header->salt, salt, LINK_SALT_LENGTH);
 
-  *shared_memory = std::move(shared_buffer);
-  *hash_table = std::move(hash_table_mapping);
-
   return true;
 }
 
 bool VisitedLinkMaster::BeginReplaceURLTable(int32_t num_entries) {
-  mojo::ScopedSharedBufferHandle old_shared_memory = std::move(shared_memory_);
-  mojo::ScopedSharedBufferMapping old_hash_table_mapping =
-      std::move(hash_table_mapping_);
+  base::MappedReadOnlyRegion old_memory = std::move(mapped_table_memory_);
   int32_t old_table_length = table_length_;
   if (!CreateURLTable(num_entries)) {
     // Try to put back the old state.
-    shared_memory_ = std::move(old_shared_memory);
-    hash_table_mapping_ = std::move(old_hash_table_mapping);
-    hash_table_ = GetHashTableFromMapping(hash_table_mapping_);
+    mapped_table_memory_ = std::move(old_memory);
+    hash_table_ = GetHashTableFromMapping(mapped_table_memory_.mapping);
     table_length_ = old_table_length;
     return false;
   }
@@ -923,8 +901,7 @@
 }
 
 void VisitedLinkMaster::FreeURLTable() {
-  shared_memory_.reset();
-  hash_table_mapping_.reset();
+  mapped_table_memory_ = base::MappedReadOnlyRegion();
   if (!persist_to_disk_ || !file_)
     return;
   PostIOTask(FROM_HERE, base::Bind(&AsyncClose, file_));
@@ -957,19 +934,19 @@
 }
 
 void VisitedLinkMaster::ResizeTable(int32_t new_size) {
-  DCHECK(shared_memory_.is_valid() && hash_table_mapping_);
+  DCHECK(mapped_table_memory_.region.IsValid() &&
+         mapped_table_memory_.mapping.IsValid());
   shared_memory_serial_++;
 
 #ifndef NDEBUG
   DebugValidate();
 #endif
 
-  mojo::ScopedSharedBufferMapping old_hash_table_mapping =
-      std::move(hash_table_mapping_);
+  auto old_hash_table_mapping = std::move(mapped_table_memory_.mapping);
   int32_t old_table_length = table_length_;
   if (!BeginReplaceURLTable(new_size)) {
-    hash_table_mapping_ = std::move(old_hash_table_mapping);
-    hash_table_ = GetHashTableFromMapping(hash_table_mapping_);
+    mapped_table_memory_.mapping = std::move(old_hash_table_mapping);
+    hash_table_ = GetHashTableFromMapping(mapped_table_memory_.mapping);
     return;
   }
   {
@@ -983,11 +960,10 @@
         AddFingerprint(cur, false);
     }
   }
-  old_hash_table_mapping.reset();
 
   // Send an update notification to all child processes so they read the new
   // table.
-  listener_->NewTable(shared_memory_.get());
+  listener_->NewTable(&mapped_table_memory_.region);
 
 #ifndef NDEBUG
   DebugValidate();
@@ -1075,7 +1051,7 @@
       deleted_since_rebuild_.clear();
 
       // Send an update notification to all child processes.
-      listener_->NewTable(shared_memory_.get());
+      listener_->NewTable(&mapped_table_memory_.region);
       // All tabs which was loaded when table was being rebuilt
       // invalidate their links again.
       listener_->Reset(false);
@@ -1186,11 +1162,11 @@
 
 // static
 VisitedLinkCommon::Fingerprint* VisitedLinkMaster::GetHashTableFromMapping(
-    const mojo::ScopedSharedBufferMapping& hash_table_mapping) {
-  DCHECK(hash_table_mapping);
+    const base::WritableSharedMemoryMapping& hash_table_mapping) {
+  DCHECK(hash_table_mapping.IsValid());
   // Our table pointer is just the data immediately following the header.
   return reinterpret_cast<Fingerprint*>(
-      static_cast<char*>(hash_table_mapping.get()) + sizeof(SharedHeader));
+      static_cast<char*>(hash_table_mapping.memory()) + sizeof(SharedHeader));
 }
 
 }  // namespace visitedlink
diff --git a/components/visitedlink/browser/visitedlink_master.h b/components/visitedlink/browser/visitedlink_master.h
index fd30484..5b30a98 100644
--- a/components/visitedlink/browser/visitedlink_master.h
+++ b/components/visitedlink/browser/visitedlink_master.h
@@ -17,13 +17,14 @@
 #include "base/files/file_path.h"
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
+#include "base/memory/read_only_shared_memory_region.h"
 #include "base/memory/ref_counted.h"
+#include "base/memory/shared_memory_mapping.h"
 #include "base/memory/weak_ptr.h"
 #include "base/sequenced_task_runner.h"
 #include "base/task_scheduler/post_task.h"
 #include "build/build_config.h"
 #include "components/visitedlink/common/visitedlink_common.h"
-#include "mojo/public/cpp/system/buffer.h"
 
 #if defined(OS_WIN)
 #include <windows.h>
@@ -58,8 +59,8 @@
     virtual ~Listener() {}
 
     // Called when link coloring database has been created or replaced. The
-    // argument is the new table handle.
-    virtual void NewTable(mojo::SharedBufferHandle table) = 0;
+    // argument is a memory region containing the new table.
+    virtual void NewTable(base::ReadOnlySharedMemoryRegion* table_region) = 0;
 
     // Called when new link has been added. The argument is the fingerprint
     // (hash) of the link.
@@ -106,8 +107,8 @@
   // object won't work.
   bool Init();
 
-  const mojo::SharedBufferHandle& shared_memory() {
-    return shared_memory_.get();
+  base::MappedReadOnlyRegion& mapped_table_memory() {
+    return mapped_table_memory_;
   }
 
   // Adds a URL to the table.
@@ -317,12 +318,10 @@
 
   // Allocates the Fingerprint structure and length. Returns true on success.
   // Structure is filled with 0s and shared header with salt. The result of
-  // allocation is saved into |shared_memory| and |hash_table| points to the
-  // beginning of Fingerprint table in |shared_memory|.
+  // allocation is saved into |mapped_region|.
   static bool CreateApartURLTable(int32_t num_entries,
                                   const uint8_t salt[LINK_SALT_LENGTH],
-                                  mojo::ScopedSharedBufferHandle* shared_memory,
-                                  mojo::ScopedSharedBufferMapping* hash_table);
+                                  base::MappedReadOnlyRegion* memory);
 
   // A wrapper for CreateURLTable, this will allocate a new table, initialized
   // to empty. The caller is responsible for saving the shared memory pointer
@@ -391,7 +390,7 @@
   // Returns a pointer to the start of the hash table, given the mapping
   // containing the hash table.
   static Fingerprint* GetHashTableFromMapping(
-      const mojo::ScopedSharedBufferMapping& hash_table_mapping);
+      const base::WritableSharedMemoryMapping& hash_table_mapping);
 
   // Reference to the browser context that this object belongs to
   // (it knows the path to where the data is stored)
@@ -441,12 +440,7 @@
   bool persist_to_disk_;
 
   // Shared memory consists of a SharedHeader followed by the table.
-  mojo::ScopedSharedBufferHandle shared_memory_;
-
-  // A mapping of the table including the SharedHeader.
-  // GetHashTableFromMapping() can be used to obtain a pointer to the hash table
-  // contained in this mapping.
-  mojo::ScopedSharedBufferMapping hash_table_mapping_;
+  base::MappedReadOnlyRegion mapped_table_memory_;
 
   // When we generate new tables, we increment the serial number of the
   // shared memory object.
diff --git a/components/visitedlink/common/BUILD.gn b/components/visitedlink/common/BUILD.gn
index b131dd1..15c465a 100644
--- a/components/visitedlink/common/BUILD.gn
+++ b/components/visitedlink/common/BUILD.gn
@@ -26,4 +26,8 @@
   sources = [
     "visitedlink.mojom",
   ]
+
+  public_deps = [
+    "//mojo/public/mojom/base",
+  ]
 }
diff --git a/components/visitedlink/common/visitedlink.mojom b/components/visitedlink/common/visitedlink.mojom
index 9a8ce86..4f916fd 100644
--- a/components/visitedlink/common/visitedlink.mojom
+++ b/components/visitedlink/common/visitedlink.mojom
@@ -4,10 +4,12 @@
 
 module visitedlink.mojom;
 
+import "mojo/public/mojom/base/shared_memory.mojom";
+
 interface VisitedLinkNotificationSink {
   // Notification that the visited link database has been replaced. It has one
   // SharedMemoryHandle argument consisting of the table handle.
-  UpdateVisitedLinks(handle<shared_buffer> table_handle);
+  UpdateVisitedLinks(mojo_base.mojom.ReadOnlySharedMemoryRegion table_region);
 
   // Notification that one or more links have been added and the link coloring
   // state for the given hashes must be re-calculated.
diff --git a/components/visitedlink/renderer/visitedlink_slave.cc b/components/visitedlink/renderer/visitedlink_slave.cc
index 3c2faa4..7413e7d 100644
--- a/components/visitedlink/renderer/visitedlink_slave.cc
+++ b/components/visitedlink/renderer/visitedlink_slave.cc
@@ -28,8 +28,7 @@
 // Initializes the table with the given shared memory handle. This memory is
 // mapped into the process.
 void VisitedLinkSlave::UpdateVisitedLinks(
-    mojo::ScopedSharedBufferHandle table) {
-  DCHECK(table.is_valid()) << "Bad table handle";
+    base::ReadOnlySharedMemoryRegion table_region) {
   // Since this function may be called again to change the table, we may need
   // to free old objects.
   FreeTable();
@@ -39,24 +38,25 @@
   {
     // Map the header into our process so we can see how long the rest is,
     // and set the salt.
-    mojo::ScopedSharedBufferMapping header_memory =
-        table->Map(sizeof(SharedHeader));
-    if (!header_memory)
+    base::ReadOnlySharedMemoryMapping header_mapping =
+        table_region.MapAt(0, sizeof(SharedHeader));
+    if (!header_mapping.IsValid())
       return;
 
-    SharedHeader* header = static_cast<SharedHeader*>(header_memory.get());
+    const SharedHeader* header =
+        static_cast<const SharedHeader*>(header_mapping.memory());
     table_len = header->length;
     memcpy(salt_, header->salt, sizeof(salt_));
   }
 
   // Now we know the length, so map the table contents.
-  table_mapping_ =
-      table->MapAtOffset(table_len * sizeof(Fingerprint), sizeof(SharedHeader));
-  if (!table_mapping_)
+  table_mapping_ = table_region.Map();
+  if (!table_mapping_.IsValid())
     return;
 
   // Commit the data.
-  hash_table_ = reinterpret_cast<Fingerprint*>(table_mapping_.get());
+  hash_table_ = const_cast<Fingerprint*>(reinterpret_cast<const Fingerprint*>(
+      static_cast<const SharedHeader*>(table_mapping_.memory()) + 1));
   table_length_ = table_len;
 }
 
@@ -74,7 +74,7 @@
   if (!hash_table_)
     return;
 
-  table_mapping_.reset();
+  table_mapping_ = base::ReadOnlySharedMemoryMapping();
   hash_table_ = nullptr;
   table_length_ = 0;
 }
diff --git a/components/visitedlink/renderer/visitedlink_slave.h b/components/visitedlink/renderer/visitedlink_slave.h
index bbf0cfd..92c9433 100644
--- a/components/visitedlink/renderer/visitedlink_slave.h
+++ b/components/visitedlink/renderer/visitedlink_slave.h
@@ -7,11 +7,12 @@
 
 #include "base/compiler_specific.h"
 #include "base/macros.h"
+#include "base/memory/read_only_shared_memory_region.h"
+#include "base/memory/shared_memory_mapping.h"
 #include "base/memory/weak_ptr.h"
 #include "components/visitedlink/common/visitedlink.mojom.h"
 #include "components/visitedlink/common/visitedlink_common.h"
 #include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/system/buffer.h"
 
 namespace visitedlink {
 
@@ -27,7 +28,8 @@
   GetBindCallback();
 
   // mojom::VisitedLinkNotificationSink overrides.
-  void UpdateVisitedLinks(mojo::ScopedSharedBufferHandle table) override;
+  void UpdateVisitedLinks(
+      base::ReadOnlySharedMemoryRegion table_region) override;
   void AddVisitedLinks(
       const std::vector<VisitedLinkSlave::Fingerprint>& fingerprints) override;
   void ResetVisitedLinks(bool invalidate_hashes) override;
@@ -37,7 +39,7 @@
 
   void Bind(mojom::VisitedLinkNotificationSinkRequest request);
 
-  mojo::ScopedSharedBufferMapping table_mapping_;
+  base::ReadOnlySharedMemoryMapping table_mapping_;
 
   mojo::Binding<mojom::VisitedLinkNotificationSink> binding_;
 
diff --git a/components/visitedlink/test/visitedlink_perftest.cc b/components/visitedlink/test/visitedlink_perftest.cc
index 74d858a..d75cf61 100644
--- a/components/visitedlink/test/visitedlink_perftest.cc
+++ b/components/visitedlink/test/visitedlink_perftest.cc
@@ -72,7 +72,7 @@
 class DummyVisitedLinkEventListener : public VisitedLinkMaster::Listener {
  public:
   DummyVisitedLinkEventListener() {}
-  void NewTable(mojo::SharedBufferHandle) override {}
+  void NewTable(base::ReadOnlySharedMemoryRegion*) override {}
   void Add(VisitedLinkCommon::Fingerprint) override {}
   void Reset(bool invalidate_hashes) override {}
 };
diff --git a/components/visitedlink/test/visitedlink_unittest.cc b/components/visitedlink/test/visitedlink_unittest.cc
index 7e91065..99caa55 100644
--- a/components/visitedlink/test/visitedlink_unittest.cc
+++ b/components/visitedlink/test/visitedlink_unittest.cc
@@ -121,12 +121,11 @@
         completely_reset_count_(0),
         add_count_(0) {}
 
-  void NewTable(mojo::SharedBufferHandle table) override {
-    if (table.is_valid()) {
+  void NewTable(base::ReadOnlySharedMemoryRegion* table_region) override {
+    if (table_region->IsValid()) {
       for (std::vector<VisitedLinkSlave>::size_type i = 0;
            i < g_slaves.size(); i++) {
-        g_slaves[i]->UpdateVisitedLinks(
-            table.Clone(mojo::SharedBufferHandle::AccessMode::READ_ONLY));
+        g_slaves[i]->UpdateVisitedLinks(table_region->Duplicate());
       }
     }
   }
@@ -206,8 +205,7 @@
 
     // Create a slave database.
     VisitedLinkSlave slave;
-    slave.UpdateVisitedLinks(master_->shared_memory().Clone(
-        mojo::SharedBufferHandle::AccessMode::READ_ONLY));
+    slave.UpdateVisitedLinks(master_->mapped_table_memory().region.Duplicate());
     g_slaves.push_back(&slave);
 
     bool found;
@@ -335,8 +333,7 @@
 
   {
     VisitedLinkSlave slave;
-    slave.UpdateVisitedLinks(master_->shared_memory().Clone(
-        mojo::SharedBufferHandle::AccessMode::READ_ONLY));
+    slave.UpdateVisitedLinks(master_->mapped_table_memory().region.Duplicate());
     g_slaves.push_back(&slave);
 
     // Add the test URLs.
@@ -380,8 +377,7 @@
 
   // ...and a slave
   VisitedLinkSlave slave;
-  slave.UpdateVisitedLinks(master_->shared_memory().Clone(
-      mojo::SharedBufferHandle::AccessMode::READ_ONLY));
+  slave.UpdateVisitedLinks(master_->mapped_table_memory().region.Duplicate());
   g_slaves.push_back(&slave);
 
   int32_t used_count = master_->GetUsedCount();
@@ -558,7 +554,7 @@
   }
 
   void UpdateVisitedLinks(
-      mojo::ScopedSharedBufferHandle table_handle) override {
+      base::ReadOnlySharedMemoryRegion table_region) override {
     new_table_count_++;
     NotifyUpdate();
   }
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index ca674e6..b4250c7 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -721,10 +721,6 @@
     "download/mhtml_extra_parts_impl.h",
     "download/mhtml_generation_manager.cc",
     "download/mhtml_generation_manager.h",
-    "download/parallel_download_job.cc",
-    "download/parallel_download_job.h",
-    "download/parallel_download_utils.cc",
-    "download/parallel_download_utils.h",
     "download/save_file.cc",
     "download/save_file.h",
     "download/save_file_manager.cc",
@@ -2189,6 +2185,14 @@
       # Most webauth code is non-Android
       "webauth/authenticator_impl.cc",
       "webauth/authenticator_impl.h",
+      "webauth/authenticator_type_converters.cc",
+      "webauth/authenticator_type_converters.h",
+      "webauth/scoped_virtual_authenticator_environment.cc",
+      "webauth/scoped_virtual_authenticator_environment.h",
+      "webauth/virtual_authenticator.cc",
+      "webauth/virtual_authenticator.h",
+      "webauth/virtual_discovery.cc",
+      "webauth/virtual_discovery.h",
     ]
     deps += [ "//third_party/flac" ]
   }
diff --git a/content/browser/DEPS b/content/browser/DEPS
index 4ed4529..5b52dcb 100644
--- a/content/browser/DEPS
+++ b/content/browser/DEPS
@@ -145,6 +145,7 @@
   "+third_party/WebKit/public/platform/modules/permissions/permission_status.mojom.h",
   "+third_party/WebKit/public/platform/modules/presentation/presentation.mojom.h",
   "+third_party/WebKit/public/platform/modules/webauth/authenticator.mojom.h",
+  "+third_party/WebKit/public/platform/modules/webauth/virtual_authenticator.mojom.h",
   "+third_party/WebKit/public/platform/modules/webdatabase/web_database.mojom.h",
   "+third_party/WebKit/public/platform/modules/websockets/websocket.mojom.h",
   "+third_party/WebKit/public/platform/oom_intervention.mojom.h",
diff --git a/content/browser/cache_storage/cache_storage_dispatcher_host.cc b/content/browser/cache_storage/cache_storage_dispatcher_host.cc
index 58ff8d1..1ba9d11 100644
--- a/content/browser/cache_storage/cache_storage_dispatcher_host.cc
+++ b/content/browser/cache_storage/cache_storage_dispatcher_host.cc
@@ -271,6 +271,8 @@
     bindings_.ReportBadMessage("CSDH_INVALID_ORIGIN");
     return;
   }
+  if (!ValidState())
+    return;
   context_->cache_manager()->HasCache(
       origin, base::UTF16ToUTF8(cache_name),
       base::BindOnce(&CacheStorageDispatcherHost::OnHasCallback, this,
@@ -287,6 +289,8 @@
     bindings_.ReportBadMessage("CSDH_INVALID_ORIGIN");
     return;
   }
+  if (!ValidState())
+    return;
   context_->cache_manager()->OpenCache(
       origin, base::UTF16ToUTF8(cache_name),
       base::BindOnce(&CacheStorageDispatcherHost::OnOpenCallback, this, origin,
@@ -303,6 +307,8 @@
     bindings_.ReportBadMessage("CSDH_INVALID_ORIGIN");
     return;
   }
+  if (!ValidState())
+    return;
   context_->cache_manager()->DeleteCache(origin, base::UTF16ToUTF8(cache_name),
                                          std::move(callback));
 }
@@ -317,6 +323,8 @@
     bindings_.ReportBadMessage("CSDH_INVALID_ORIGIN");
     return;
   }
+  if (!ValidState())
+    return;
   context_->cache_manager()->EnumerateCaches(
       origin, base::BindOnce(&CacheStorageDispatcherHost::OnKeysCallback, this,
                              std::move(callback)));
@@ -333,6 +341,8 @@
     bindings_.ReportBadMessage("CSDH_INVALID_ORIGIN");
     return;
   }
+  if (!ValidState())
+    return;
   auto scoped_request = std::make_unique<ServiceWorkerFetchRequest>(
       request.url, request.method, request.headers, request.referrer,
       request.is_reload);
@@ -442,4 +452,13 @@
   bindings_.AddBinding(this, std::move(request), origin);
 }
 
+bool CacheStorageDispatcherHost::ValidState() {
+  // cache_manager() can return nullptr when process is shutting down.
+  if (!(context_ && context_->cache_manager())) {
+    bindings_.CloseAllBindings();
+    return false;
+  }
+  return true;
+}
+
 }  // namespace content
diff --git a/content/browser/cache_storage/cache_storage_dispatcher_host.h b/content/browser/cache_storage/cache_storage_dispatcher_host.h
index 8b093667..67e92dd1 100644
--- a/content/browser/cache_storage/cache_storage_dispatcher_host.h
+++ b/content/browser/cache_storage/cache_storage_dispatcher_host.h
@@ -100,6 +100,11 @@
   void StoreBlobDataHandle(const storage::BlobDataHandle& blob_data_handle);
   void DropBlobDataHandle(const std::string& uuid);
 
+  // Validate the current state of required members, returns false if they
+  // aren't valid and also close |bindings_|, so it's safe to not run
+  // mojo callbacks.
+  bool ValidState();
+
   UUIDToBlobDataHandleList blob_handle_store_;
 
   scoped_refptr<CacheStorageContextImpl> context_;
diff --git a/content/browser/download/download_browsertest.cc b/content/browser/download/download_browsertest.cc
index 1d7b83ae..744b8b0 100644
--- a/content/browser/download/download_browsertest.cc
+++ b/content/browser/download/download_browsertest.cc
@@ -36,10 +36,10 @@
 #include "components/download/public/common/download_file_factory.h"
 #include "components/download/public/common/download_file_impl.h"
 #include "components/download/public/common/download_task_runner.h"
+#include "components/download/public/common/parallel_download_utils.h"
 #include "content/browser/download/download_item_impl.h"
 #include "content/browser/download/download_manager_impl.h"
 #include "content/browser/download/download_resource_handler.h"
-#include "content/browser/download/parallel_download_utils.h"
 #include "content/browser/web_contents/web_contents_impl.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/download_request_utils.h"
@@ -914,11 +914,11 @@
  protected:
   ParallelDownloadTest() {
     std::map<std::string, std::string> params = {
-        {content::kMinSliceSizeFinchKey, "1"},
-        {content::kParallelRequestCountFinchKey,
+        {download::kMinSliceSizeFinchKey, "1"},
+        {download::kParallelRequestCountFinchKey,
          base::IntToString(kTestRequestCount)},
-        {content::kParallelRequestDelayFinchKey, "0"},
-        {content::kParallelRequestRemainingTimeFinchKey, "0"}};
+        {download::kParallelRequestDelayFinchKey, "0"},
+        {download::kParallelRequestRemainingTimeFinchKey, "0"}};
     scoped_feature_list_.InitAndEnableFeatureWithParameters(
         download::features::kParallelDownloading, params);
   }
diff --git a/content/browser/download/download_item_impl.cc b/content/browser/download/download_item_impl.cc
index 71b24e6..82cd5fb 100644
--- a/content/browser/download/download_item_impl.cc
+++ b/content/browser/download/download_item_impl.cc
@@ -53,7 +53,6 @@
 #include "content/browser/download/download_job_factory.h"
 #include "content/browser/download/download_request_handle.h"
 #include "content/browser/download/download_utils.h"
-#include "content/browser/download/parallel_download_utils.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/download_item_utils.h"
 #include "net/http/http_response_headers.h"
@@ -415,7 +414,7 @@
       weak_ptr_factory_(this) {
   job_ = DownloadJobFactory::CreateJob(this, std::move(request_handle),
                                        download::DownloadCreateInfo(), true,
-                                       nullptr);
+                                       nullptr, nullptr);
   delegate_->Attach();
   Init(true /* actively downloading */, TYPE_SAVE_PAGE_AS);
 }
@@ -1402,7 +1401,8 @@
     std::unique_ptr<download::DownloadFile> file,
     std::unique_ptr<download::DownloadRequestHandleInterface> req_handle,
     const download::DownloadCreateInfo& new_create_info,
-    scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory) {
+    scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory,
+    net::URLRequestContextGetter* url_request_context_getter) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK(!download_file_.get());
   DVLOG(20) << __func__ << "() this=" << DebugString(true);
@@ -1410,12 +1410,12 @@
                                           download_source_);
 
   download_file_ = std::move(file);
-  job_ = DownloadJobFactory::CreateJob(this, std::move(req_handle),
-                                       new_create_info, false,
-                                       std::move(shared_url_loader_factory));
+  job_ = DownloadJobFactory::CreateJob(
+      this, std::move(req_handle), new_create_info, false,
+      std::move(shared_url_loader_factory), url_request_context_getter);
   if (job_->IsParallelizable()) {
-    download::RecordParallelizableDownloadCount(download::START_COUNT,
-                                                IsParallelDownloadEnabled());
+    download::RecordParallelizableDownloadCount(
+        download::START_COUNT, download::IsParallelDownloadEnabled());
   }
 
   deferred_interrupt_reason_ = download::DOWNLOAD_INTERRUPT_REASON_NONE;
@@ -1468,8 +1468,8 @@
     download::RecordDownloadCountWithSource(download::NEW_DOWNLOAD_COUNT,
                                             download_source_);
     if (job_->IsParallelizable()) {
-      download::RecordParallelizableDownloadCount(download::NEW_DOWNLOAD_COUNT,
-                                                  IsParallelDownloadEnabled());
+      download::RecordParallelizableDownloadCount(
+          download::NEW_DOWNLOAD_COUNT, download::IsParallelDownloadEnabled());
     }
     download::RecordDownloadMimeType(mime_type_);
     download::DownloadContent file_type =
@@ -1849,8 +1849,8 @@
         download::COMPLETED_COUNT_NORMAL_PROFILE, download_source_);
   }
   if (is_parallelizable) {
-    download::RecordParallelizableDownloadCount(download::COMPLETED_COUNT,
-                                                IsParallelDownloadEnabled());
+    download::RecordParallelizableDownloadCount(
+        download::COMPLETED_COUNT, download::IsParallelDownloadEnabled());
     int64_t content_length = -1;
     if (response_headers_->response_code() != net::HTTP_PARTIAL_CONTENT) {
       content_length = response_headers_->GetContentLength();
@@ -2027,8 +2027,8 @@
     download::RecordDownloadCountWithSource(download::CANCELLED_COUNT,
                                             download_source_);
     if (job_ && job_->IsParallelizable()) {
-      download::RecordParallelizableDownloadCount(download::CANCELLED_COUNT,
-                                                  IsParallelDownloadEnabled());
+      download::RecordParallelizableDownloadCount(
+          download::CANCELLED_COUNT, download::IsParallelDownloadEnabled());
     }
     DCHECK_EQ(last_reason_, reason);
     TransitionTo(CANCELLED_INTERNAL);
@@ -2037,7 +2037,7 @@
 
   download::RecordDownloadInterrupted(reason, GetReceivedBytes(), total_bytes_,
                                       job_ && job_->IsParallelizable(),
-                                      IsParallelDownloadEnabled(),
+                                      download::IsParallelDownloadEnabled(),
                                       download_source_);
 
   base::TimeDelta time_since_start = base::Time::Now() - GetStartTime();
diff --git a/content/browser/download/download_item_impl.h b/content/browser/download/download_item_impl.h
index f3b8171..434d6790 100644
--- a/content/browser/download/download_item_impl.h
+++ b/content/browser/download/download_item_impl.h
@@ -34,6 +34,10 @@
 class DownloadJob;
 }  // namespace download
 
+namespace net {
+class URLRequestContextGetter;
+}
+
 namespace content {
 class BrowserContext;
 class DownloadItemImplDelegate;
@@ -298,11 +302,14 @@
   // parameters. It may be different from the DownloadCreateInfo used to create
   // the download::DownloadItem if Start() is being called in response for a
   // download resumption request.
+  // TODO(qinmin): Remove |url_request_context_getter| once network service is
+  // enabled.
   virtual void Start(
       std::unique_ptr<download::DownloadFile> download_file,
       std::unique_ptr<download::DownloadRequestHandleInterface> req_handle,
       const download::DownloadCreateInfo& new_create_info,
-      scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory);
+      scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory,
+      net::URLRequestContextGetter* url_request_context_getter);
 
   // Needed because of intertwining with DownloadManagerImpl -------------------
 
diff --git a/content/browser/download/download_item_impl_unittest.cc b/content/browser/download/download_item_impl_unittest.cc
index 40fba062..6fce1f3 100644
--- a/content/browser/download/download_item_impl_unittest.cc
+++ b/content/browser/download/download_item_impl_unittest.cc
@@ -324,7 +324,7 @@
     std::unique_ptr<MockRequestHandle> request_handle =
         std::make_unique<NiceMock<MockRequestHandle>>();
     item->Start(std::move(download_file), std::move(request_handle),
-                *create_info_, nullptr);
+                *create_info_, nullptr, nullptr);
     task_environment_.RunUntilIdle();
 
     // So that we don't have a function writing to a stack variable
@@ -622,7 +622,7 @@
   EXPECT_CALL(*mock_download_file, Initialize(_, _, _, _));
   EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(_, _));
   item->Start(std::move(download_file), std::move(request_handle),
-              *create_info(), nullptr);
+              *create_info(), nullptr, nullptr);
 
   item->Pause();
   ASSERT_TRUE(observer.CheckAndResetDownloadUpdated());
@@ -875,7 +875,7 @@
     // Copied key parts of DoIntermediateRename & CallDownloadItemStart
     // to allow for holding onto the request handle.
     item->Start(std::move(mock_download_file), std::move(mock_request_handle),
-                *create_info(), nullptr);
+                *create_info(), nullptr, nullptr);
     task_environment_.RunUntilIdle();
 
     base::FilePath target_path(kDummyTargetPath);
@@ -1176,7 +1176,7 @@
       new NiceMock<MockRequestHandle>);
   EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _));
   item->Start(std::move(download_file), std::move(request_handle),
-              *create_info(), nullptr);
+              *create_info(), nullptr, nullptr);
   task_environment_.RunUntilIdle();
 
   CleanupItem(item, mock_download_file, download::DownloadItem::IN_PROGRESS);
@@ -1203,7 +1203,7 @@
       .WillOnce(SaveArg<1>(&download_target_callback));
 
   item->Start(std::move(file), std::move(request_handle), *create_info(),
-              nullptr);
+              nullptr, nullptr);
   task_environment_.RunUntilIdle();
 
   download_target_callback.Run(
@@ -1241,7 +1241,7 @@
   EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _))
       .WillOnce(SaveArg<1>(&download_target_callback));
   item->Start(std::move(null_download_file), std::move(null_request_handle),
-              *create_info(), nullptr);
+              *create_info(), nullptr, nullptr);
   EXPECT_EQ(download::DownloadItem::IN_PROGRESS, item->GetState());
   task_environment_.RunUntilIdle();
 
@@ -2317,7 +2317,7 @@
   EXPECT_CALL(*file_, Initialize(_, _, _, _))
       .WillOnce(SaveArg<0>(&initialize_callback));
   item_->Start(std::move(file_), std::move(request_handle_), *create_info(),
-               nullptr);
+               nullptr, nullptr);
   task_environment_.RunUntilIdle();
 
   base::WeakPtr<download::DownloadDestinationObserver> destination_observer =
@@ -2365,7 +2365,7 @@
       .WillOnce(SaveArg<0>(&initialize_callback));
 
   item_->Start(std::move(file_), std::move(request_handle_), *create_info(),
-               nullptr);
+               nullptr, nullptr);
   task_environment_.RunUntilIdle();
 
   base::WeakPtr<download::DownloadDestinationObserver> destination_observer =
@@ -2430,7 +2430,7 @@
       .WillOnce(SaveArg<0>(&initialize_callback));
 
   item_->Start(std::move(file_), std::move(request_handle_), *create_info(),
-               nullptr);
+               nullptr, nullptr);
   task_environment_.RunUntilIdle();
 
   base::WeakPtr<download::DownloadDestinationObserver> destination_observer =
diff --git a/content/browser/download/download_job_factory.cc b/content/browser/download/download_job_factory.cc
index 4f9b3d3..b520cca 100644
--- a/content/browser/download/download_job_factory.cc
+++ b/content/browser/download/download_job_factory.cc
@@ -10,8 +10,8 @@
 #include "components/download/public/common/download_item.h"
 #include "components/download/public/common/download_job_impl.h"
 #include "components/download/public/common/download_stats.h"
-#include "content/browser/download/parallel_download_job.h"
-#include "content/browser/download/parallel_download_utils.h"
+#include "components/download/public/common/parallel_download_job.h"
+#include "components/download/public/common/parallel_download_utils.h"
 #include "content/browser/download/save_package_download_job.h"
 #include "content/public/common/content_features.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
@@ -41,7 +41,7 @@
   bool has_content_length = create_info.total_bytes > 0;
   bool satisfy_min_file_size =
       !download_item->GetReceivedSlices().empty() ||
-      create_info.total_bytes >= GetMinSliceSizeConfig();
+      create_info.total_bytes >= download::GetMinSliceSizeConfig();
   bool satisfy_connection_type = create_info.connection_info ==
                                  net::HttpResponseInfo::CONNECTION_INFO_HTTP1_1;
   bool http_get_method =
@@ -51,7 +51,7 @@
                            has_content_length && satisfy_min_file_size &&
                            satisfy_connection_type && http_get_method;
 
-  if (!IsParallelDownloadEnabled())
+  if (!download::IsParallelDownloadEnabled())
     return is_parallelizable;
 
   download::RecordParallelDownloadCreationEvent(
@@ -100,7 +100,8 @@
     std::unique_ptr<download::DownloadRequestHandleInterface> req_handle,
     const download::DownloadCreateInfo& create_info,
     bool is_save_package_download,
-    scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory) {
+    scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory,
+    net::URLRequestContextGetter* url_request_context_getter) {
   if (is_save_package_download) {
     return std::make_unique<SavePackageDownloadJob>(download_item,
                                                     std::move(req_handle));
@@ -108,10 +109,10 @@
 
   bool is_parallelizable = IsParallelizableDownload(create_info, download_item);
   // Build parallel download job.
-  if (IsParallelDownloadEnabled() && is_parallelizable) {
-    return std::make_unique<ParallelDownloadJob>(
+  if (download::IsParallelDownloadEnabled() && is_parallelizable) {
+    return std::make_unique<download::ParallelDownloadJob>(
         download_item, std::move(req_handle), create_info,
-        std::move(shared_url_loader_factory));
+        std::move(shared_url_loader_factory), url_request_context_getter);
   }
 
   // An ordinary download job.
diff --git a/content/browser/download/download_job_factory.h b/content/browser/download/download_job_factory.h
index daf7431..5497649 100644
--- a/content/browser/download/download_job_factory.h
+++ b/content/browser/download/download_job_factory.h
@@ -16,6 +16,10 @@
 class DownloadRequestHandleInterface;
 }
 
+namespace net {
+class URLRequestContextGetter;
+}
+
 namespace network {
 class SharedURLLoaderFactory;
 }  // namespace network
@@ -30,7 +34,8 @@
       std::unique_ptr<download::DownloadRequestHandleInterface> req_handle,
       const download::DownloadCreateInfo& create_info,
       bool is_save_package_download,
-      scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory);
+      scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory,
+      net::URLRequestContextGetter* url_request_context_getter);
 
  private:
   DISALLOW_COPY_AND_ASSIGN(DownloadJobFactory);
diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc
index 69470c5..b49b992 100644
--- a/content/browser/download/download_manager_impl.cc
+++ b/content/browser/download/download_manager_impl.cc
@@ -695,8 +695,13 @@
   // so that the download::DownloadItem can salvage what it can out of a failed
   // resumption attempt.
 
-  download->Start(std::move(download_file), std::move(info->request_handle),
-                  *info, std::move(shared_url_loader_factory));
+  StoragePartition* storage_partition = GetStoragePartition(
+      browser_context_, info->render_process_id, info->render_frame_id);
+
+  download->Start(
+      std::move(download_file), std::move(info->request_handle), *info,
+      std::move(shared_url_loader_factory),
+      storage_partition ? storage_partition->GetURLRequestContext() : nullptr);
 
   // For interrupted downloads, Start() will transition the state to
   // IN_PROGRESS and consumers will be notified via OnDownloadUpdated().
diff --git a/content/browser/download/download_manager_impl_unittest.cc b/content/browser/download/download_manager_impl_unittest.cc
index 1f77885..dd88e88 100644
--- a/content/browser/download/download_manager_impl_unittest.cc
+++ b/content/browser/download/download_manager_impl_unittest.cc
@@ -38,6 +38,7 @@
 #include "content/browser/download/mock_download_item_impl.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/download_manager_delegate.h"
+#include "content/public/browser/storage_partition.h"
 #include "content/public/test/test_browser_context.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -45,10 +46,6 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/origin.h"
 
-#if !defined(OS_ANDROID)
-#include "content/public/browser/zoom_level_delegate.h"
-#endif  // !defined(OS_ANDROID)
-
 using ::testing::AllOf;
 using ::testing::DoAll;
 using ::testing::Eq;
@@ -310,61 +307,6 @@
   }
 };
 
-class MockBrowserContext : public BrowserContext {
- public:
-  MockBrowserContext() {
-    content::BrowserContext::Initialize(this, base::FilePath());
-  }
-  ~MockBrowserContext() { BrowserContext::NotifyWillBeDestroyed(this); }
-
-  MOCK_CONST_METHOD0(GetPath, base::FilePath());
-#if !defined(OS_ANDROID)
-  MOCK_METHOD1(CreateZoomLevelDelegateMock,
-               ZoomLevelDelegate*(const base::FilePath&));
-#endif  // !defined(OS_ANDROID)
-  MOCK_CONST_METHOD0(IsOffTheRecord, bool());
-  MOCK_METHOD0(GetResourceContext, ResourceContext*());
-  MOCK_METHOD0(GetDownloadManagerDelegate, DownloadManagerDelegate*());
-  MOCK_METHOD0(GetGuestManager, BrowserPluginGuestManager* ());
-  MOCK_METHOD0(GetSpecialStoragePolicy, storage::SpecialStoragePolicy*());
-  MOCK_METHOD0(GetPushMessagingService, PushMessagingService*());
-  MOCK_METHOD0(GetSSLHostStateDelegate, SSLHostStateDelegate*());
-  MOCK_METHOD0(GetPermissionManager, PermissionManager*());
-  MOCK_METHOD0(GetBackgroundFetchDelegate, BackgroundFetchDelegate*());
-  MOCK_METHOD0(GetBackgroundSyncController, BackgroundSyncController*());
-  MOCK_METHOD0(GetBrowsingDataRemoverDelegate, BrowsingDataRemoverDelegate*());
-  MOCK_METHOD0(CreateMediaRequestContext,
-               net::URLRequestContextGetter*());
-  MOCK_METHOD2(CreateMediaRequestContextForStoragePartition,
-               net::URLRequestContextGetter*(
-                   const base::FilePath& partition_path, bool in_memory));
-
-  // Define these two methods to avoid a
-  // 'cannot access private member declared in class
-  // URLRequestInterceptorScopedVector'
-  // build error if they're put in MOCK_METHOD.
-  net::URLRequestContextGetter* CreateRequestContext(
-      ProtocolHandlerMap* protocol_handlers,
-      URLRequestInterceptorScopedVector request_interceptors) override {
-    return nullptr;
-  }
-
-  net::URLRequestContextGetter* CreateRequestContextForStoragePartition(
-      const base::FilePath& partition_path,
-      bool in_memory,
-      ProtocolHandlerMap* protocol_handlers,
-      URLRequestInterceptorScopedVector request_interceptors) override {
-    return nullptr;
-  }
-#if !defined(OS_ANDROID)
-  std::unique_ptr<ZoomLevelDelegate> CreateZoomLevelDelegate(
-      const base::FilePath& path) override {
-    return std::unique_ptr<ZoomLevelDelegate>(
-        CreateZoomLevelDelegateMock(path));
-  }
-#endif  // !defined(OS_ANDROID)
-};
-
 class MockDownloadManagerObserver : public DownloadManager::Observer {
  public:
   MockDownloadManagerObserver() {}
@@ -413,12 +355,8 @@
         new StrictMock<MockDownloadManagerDelegate>);
     EXPECT_CALL(*mock_download_manager_delegate_.get(), Shutdown())
         .WillOnce(Return());
-    mock_browser_context_.reset(new StrictMock<MockBrowserContext>);
-    EXPECT_CALL(*mock_browser_context_.get(), IsOffTheRecord())
-        .WillRepeatedly(Return(false));
-
-    download_manager_.reset(
-        new DownloadManagerImpl(mock_browser_context_.get()));
+    browser_context_ = std::make_unique<TestBrowserContext>();
+    download_manager_.reset(new DownloadManagerImpl(browser_context_.get()));
     download_manager_->SetDownloadItemFactoryForTesting(
         std::unique_ptr<DownloadItemFactory>(
             mock_download_item_factory_.get()));
@@ -448,7 +386,6 @@
     base::RunLoop().RunUntilIdle();
     ASSERT_FALSE(mock_download_item_factory_);
     mock_download_manager_delegate_.reset();
-    mock_browser_context_.reset();
     download_urls_.clear();
   }
 
@@ -468,7 +405,7 @@
     // in the factory.
     std::unique_ptr<download::DownloadRequestHandleInterface> req_handle;
     item.Start(std::unique_ptr<download::DownloadFile>(), std::move(req_handle),
-               info, nullptr);
+               info, nullptr, nullptr);
     DCHECK(id < download_urls_.size());
     EXPECT_CALL(item, GetURL()).WillRepeatedly(ReturnRef(download_urls_[id]));
 
@@ -539,8 +476,8 @@
   TestBrowserThreadBundle thread_bundle_;
   base::WeakPtr<MockDownloadItemFactory> mock_download_item_factory_;
   std::unique_ptr<MockDownloadManagerDelegate> mock_download_manager_delegate_;
-  std::unique_ptr<MockBrowserContext> mock_browser_context_;
   std::unique_ptr<MockDownloadManagerObserver> observer_;
+  std::unique_ptr<TestBrowserContext> browser_context_;
   uint32_t next_download_id_;
 
   DISALLOW_COPY_AND_ASSIGN(DownloadManagerTest);
diff --git a/content/browser/download/mock_download_item_impl.h b/content/browser/download/mock_download_item_impl.h
index a951838..9854dacd 100644
--- a/content/browser/download/mock_download_item_impl.h
+++ b/content/browser/download/mock_download_item_impl.h
@@ -53,8 +53,8 @@
       std::unique_ptr<download::DownloadFile> download_file,
       std::unique_ptr<download::DownloadRequestHandleInterface> req_handle,
       const download::DownloadCreateInfo& create_info,
-      scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory)
-      override {
+      scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory,
+      net::URLRequestContextGetter* url_request_context_getter) override {
     MockStart(download_file.get(), req_handle.get());
   }
 
diff --git a/content/browser/download/parallel_download_utils.cc b/content/browser/download/parallel_download_utils.cc
deleted file mode 100644
index c8ef164..0000000
--- a/content/browser/download/parallel_download_utils.cc
+++ /dev/null
@@ -1,115 +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 "content/browser/download/parallel_download_utils.h"
-
-#include "base/metrics/field_trial_params.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/time/time.h"
-#include "components/download/public/common/download_features.h"
-#include "components/download/public/common/download_save_info.h"
-
-namespace content {
-
-namespace {
-
-// Default value for |kMinSliceSizeFinchKey|, when no parameter is specified.
-const int64_t kMinSliceSizeParallelDownload = 1365333;
-
-// Default value for |kParallelRequestCountFinchKey|, when no parameter is
-// specified.
-const int kParallelRequestCount = 3;
-
-// The default remaining download time in seconds required for parallel request
-// creation.
-const int kDefaultRemainingTimeInSeconds = 2;
-
-}  // namespace
-
-std::vector<download::DownloadItem::ReceivedSlice>
-FindSlicesForRemainingContent(int64_t current_offset,
-                              int64_t total_length,
-                              int request_count,
-                              int64_t min_slice_size) {
-  std::vector<download::DownloadItem::ReceivedSlice> new_slices;
-
-  if (request_count > 0) {
-    int64_t slice_size =
-        std::max<int64_t>(total_length / request_count, min_slice_size);
-    slice_size = slice_size > 0 ? slice_size : 1;
-    for (int i = 0, num_requests = total_length / slice_size;
-         i < num_requests - 1; ++i) {
-      new_slices.emplace_back(current_offset, slice_size);
-      current_offset += slice_size;
-    }
-  }
-
-  // No strong assumption that content length header is correct. So the last
-  // slice is always half open, which sends range request like "Range:50-".
-  new_slices.emplace_back(current_offset,
-                          download::DownloadSaveInfo::kLengthFullContent);
-  return new_slices;
-}
-
-int64_t GetMinSliceSizeConfig() {
-  std::string finch_value = base::GetFieldTrialParamValueByFeature(
-      download::features::kParallelDownloading, kMinSliceSizeFinchKey);
-  int64_t result;
-  return base::StringToInt64(finch_value, &result)
-             ? result
-             : kMinSliceSizeParallelDownload;
-}
-
-int GetParallelRequestCountConfig() {
-  std::string finch_value = base::GetFieldTrialParamValueByFeature(
-      download::features::kParallelDownloading, kParallelRequestCountFinchKey);
-  int result;
-  return base::StringToInt(finch_value, &result) ? result
-                                                 : kParallelRequestCount;
-}
-
-base::TimeDelta GetParallelRequestDelayConfig() {
-  std::string finch_value = base::GetFieldTrialParamValueByFeature(
-      download::features::kParallelDownloading, kParallelRequestDelayFinchKey);
-  int64_t time_ms = 0;
-  return base::StringToInt64(finch_value, &time_ms)
-             ? base::TimeDelta::FromMilliseconds(time_ms)
-             : base::TimeDelta::FromMilliseconds(0);
-}
-
-base::TimeDelta GetParallelRequestRemainingTimeConfig() {
-  std::string finch_value = base::GetFieldTrialParamValueByFeature(
-      download::features::kParallelDownloading,
-      kParallelRequestRemainingTimeFinchKey);
-  int time_in_seconds = 0;
-  return base::StringToInt(finch_value, &time_in_seconds)
-             ? base::TimeDelta::FromSeconds(time_in_seconds)
-             : base::TimeDelta::FromSeconds(kDefaultRemainingTimeInSeconds);
-}
-
-int64_t GetMaxContiguousDataBlockSizeFromBeginning(
-    const download::DownloadItem::ReceivedSlices& slices) {
-  std::vector<download::DownloadItem::ReceivedSlice>::const_iterator iter =
-      slices.begin();
-
-  int64_t size = 0;
-  while (iter != slices.end() && iter->offset == size) {
-    size += iter->received_bytes;
-    iter++;
-  }
-  return size;
-}
-
-bool IsParallelDownloadEnabled() {
-  bool feature_enabled =
-      base::FeatureList::IsEnabled(download::features::kParallelDownloading);
-  // Disabled when |kEnableParallelDownloadFinchKey| Finch config is set to
-  // false.
-  bool enabled_parameter = GetFieldTrialParamByFeatureAsBool(
-      download::features::kParallelDownloading, kEnableParallelDownloadFinchKey,
-      true);
-  return feature_enabled && enabled_parameter;
-}
-
-}  // namespace content
diff --git a/content/browser/download/parallel_download_utils.h b/content/browser/download/parallel_download_utils.h
deleted file mode 100644
index d1fa372..0000000
--- a/content/browser/download/parallel_download_utils.h
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_BROWSER_DOWNLOAD_PARALLEL_DOWNLOAD_UTILS_H_
-#define CONTENT_BROWSER_DOWNLOAD_PARALLEL_DOWNLOAD_UTILS_H_
-
-#include <vector>
-
-#include "components/download/public/common/download_create_info.h"
-#include "components/download/public/common/download_item.h"
-#include "content/common/content_export.h"
-
-namespace content {
-
-// Finch parameter key value to enable parallel download. Used in enabled
-// experiment group that needs other parameters, such as min_slice_size, but
-// don't want to actually do parallel download.
-constexpr char kEnableParallelDownloadFinchKey[] = "enable_parallel_download";
-
-// Finch parameter key value for minimum slice size in bytes to use parallel
-// download.
-constexpr char kMinSliceSizeFinchKey[] = "min_slice_size";
-
-// Finch parameter key value for number of parallel requests in a parallel
-// download, including the original request.
-constexpr char kParallelRequestCountFinchKey[] = "request_count";
-
-// Finch parameter key value for the delay time in milliseconds to send
-// parallel requests after response of the original request is handled.
-constexpr char kParallelRequestDelayFinchKey[] = "parallel_request_delay";
-
-// Finch parameter key value for the remaining time in seconds that is required
-// to send parallel requests.
-constexpr char kParallelRequestRemainingTimeFinchKey[] =
-    "parallel_request_remaining_time";
-
-// Chunks the content that starts from |current_offset|, into at most
-// std::max(|request_count|, 1) smaller slices.
-// Each slice contains at least |min_slice_size| bytes unless |total_length|
-// is less than |min_slice_size|.
-// The last slice is half opened.
-CONTENT_EXPORT std::vector<download::DownloadItem::ReceivedSlice>
-FindSlicesForRemainingContent(int64_t current_offset,
-                              int64_t total_length,
-                              int request_count,
-                              int64_t min_slice_size);
-
-// Finch configuration utilities.
-//
-// Get the minimum slice size to use parallel download from finch configuration.
-// A slice won't be further chunked into smaller slices if the size is less
-// than the minimum size.
-CONTENT_EXPORT int64_t GetMinSliceSizeConfig();
-
-// Get the request count for parallel download from finch configuration.
-CONTENT_EXPORT int GetParallelRequestCountConfig();
-
-// Get the time delay to send parallel requests after the response of original
-// request is handled.
-CONTENT_EXPORT base::TimeDelta GetParallelRequestDelayConfig();
-
-// Get the required remaining time before creating parallel requests.
-CONTENT_EXPORT base::TimeDelta GetParallelRequestRemainingTimeConfig();
-
-// Given an ordered array of slices, get the maximum size of a contiguous data
-// block that starts from offset 0. If the first slice doesn't start from offset
-// 0, return 0.
-CONTENT_EXPORT int64_t GetMaxContiguousDataBlockSizeFromBeginning(
-    const download::DownloadItem::ReceivedSlices& slices);
-
-// Returns whether parallel download is enabled.
-CONTENT_EXPORT bool IsParallelDownloadEnabled();
-
-}  //  namespace content
-
-#endif  // CONTENT_BROWSER_DOWNLOAD_PARALLEL_DOWNLOAD_UTILS_H_
diff --git a/content/browser/download/parallel_download_utils_unittest.cc b/content/browser/download/parallel_download_utils_unittest.cc
deleted file mode 100644
index d5e31a8..0000000
--- a/content/browser/download/parallel_download_utils_unittest.cc
+++ /dev/null
@@ -1,147 +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 "content/browser/download/parallel_download_utils.h"
-
-#include <map>
-#include <memory>
-
-#include "base/strings/string_number_conversions.h"
-#include "base/test/scoped_feature_list.h"
-#include "components/download/public/common/download_features.h"
-#include "components/download/public/common/download_file_impl.h"
-#include "components/download/public/common/download_save_info.h"
-#include "components/download/public/common/parallel_download_utils.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace content {
-
-class ParallelDownloadUtilsTest : public testing::Test {};
-
-// Ensure the minimum slice size is correctly applied.
-TEST_F(ParallelDownloadUtilsTest, FindSlicesForRemainingContentMinSliceSize) {
-  // Minimum slice size is smaller than total length, only one slice returned.
-  download::DownloadItem::ReceivedSlices slices =
-      FindSlicesForRemainingContent(0, 100, 3, 150);
-  EXPECT_EQ(1u, slices.size());
-  EXPECT_EQ(0, slices[0].offset);
-  EXPECT_EQ(0, slices[0].received_bytes);
-
-  // Request count is large, the minimum slice size should limit the number of
-  // slices returned.
-  slices = FindSlicesForRemainingContent(0, 100, 33, 50);
-  EXPECT_EQ(2u, slices.size());
-  EXPECT_EQ(0, slices[0].offset);
-  EXPECT_EQ(50, slices[0].received_bytes);
-  EXPECT_EQ(50, slices[1].offset);
-  EXPECT_EQ(0, slices[1].received_bytes);
-
-  // Can chunk 2 slices under minimum slice size, but request count is only 1,
-  // request count should win.
-  slices = FindSlicesForRemainingContent(0, 100, 1, 50);
-  EXPECT_EQ(1u, slices.size());
-  EXPECT_EQ(0, slices[0].offset);
-  EXPECT_EQ(0, slices[0].received_bytes);
-
-  // A total 100 bytes data and a 51 bytes minimum slice size, only one slice is
-  // returned.
-  slices = FindSlicesForRemainingContent(0, 100, 3, 51);
-  EXPECT_EQ(1u, slices.size());
-  EXPECT_EQ(0, slices[0].offset);
-  EXPECT_EQ(0, slices[0].received_bytes);
-
-  // Extreme case where size is smaller than request number.
-  slices = FindSlicesForRemainingContent(0, 1, 3, 1);
-  EXPECT_EQ(1u, slices.size());
-  EXPECT_EQ(download::DownloadItem::ReceivedSlice(0, 0), slices[0]);
-
-  // Normal case.
-  slices = FindSlicesForRemainingContent(0, 100, 3, 5);
-  EXPECT_EQ(3u, slices.size());
-  EXPECT_EQ(download::DownloadItem::ReceivedSlice(0, 33), slices[0]);
-  EXPECT_EQ(download::DownloadItem::ReceivedSlice(33, 33), slices[1]);
-  EXPECT_EQ(download::DownloadItem::ReceivedSlice(66, 0), slices[2]);
-}
-
-TEST_F(ParallelDownloadUtilsTest, GetMaxContiguousDataBlockSizeFromBeginning) {
-  std::vector<download::DownloadItem::ReceivedSlice> slices;
-  slices.emplace_back(500, 500);
-  EXPECT_EQ(0, GetMaxContiguousDataBlockSizeFromBeginning(slices));
-
-  download::DownloadItem::ReceivedSlice slice1(0, 200);
-  download::AddOrMergeReceivedSliceIntoSortedArray(slice1, slices);
-  EXPECT_EQ(200, GetMaxContiguousDataBlockSizeFromBeginning(slices));
-
-  download::DownloadItem::ReceivedSlice slice2(200, 300);
-  download::AddOrMergeReceivedSliceIntoSortedArray(slice2, slices);
-  EXPECT_EQ(1000, GetMaxContiguousDataBlockSizeFromBeginning(slices));
-}
-
-// Test to verify Finch parameters for enabled experiment group is read
-// correctly.
-TEST_F(ParallelDownloadUtilsTest, FinchConfigEnabled) {
-  base::test::ScopedFeatureList feature_list;
-  std::map<std::string, std::string> params = {
-      {content::kMinSliceSizeFinchKey, "1234"},
-      {content::kParallelRequestCountFinchKey, "6"},
-      {content::kParallelRequestDelayFinchKey, "2000"},
-      {content::kParallelRequestRemainingTimeFinchKey, "3"}};
-  feature_list.InitAndEnableFeatureWithParameters(
-      download::features::kParallelDownloading, params);
-  EXPECT_TRUE(IsParallelDownloadEnabled());
-  EXPECT_EQ(GetMinSliceSizeConfig(), 1234);
-  EXPECT_EQ(GetParallelRequestCountConfig(), 6);
-  EXPECT_EQ(GetParallelRequestDelayConfig(), base::TimeDelta::FromSeconds(2));
-  EXPECT_EQ(GetParallelRequestRemainingTimeConfig(),
-            base::TimeDelta::FromSeconds(3));
-}
-
-// Test to verify the disable experiment group will actually disable the
-// feature.
-TEST_F(ParallelDownloadUtilsTest, FinchConfigDisabled) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndDisableFeature(download::features::kParallelDownloading);
-  EXPECT_FALSE(IsParallelDownloadEnabled());
-}
-
-// Test to verify that the Finch parameter |enable_parallel_download| works
-// correctly.
-TEST_F(ParallelDownloadUtilsTest, FinchConfigDisabledWithParameter) {
-  {
-    base::test::ScopedFeatureList feature_list;
-    std::map<std::string, std::string> params = {
-        {content::kMinSliceSizeFinchKey, "4321"},
-        {content::kEnableParallelDownloadFinchKey, "false"}};
-    feature_list.InitAndEnableFeatureWithParameters(
-        download::features::kParallelDownloading, params);
-    // Use |enable_parallel_download| to disable parallel download in enabled
-    // experiment group.
-    EXPECT_FALSE(IsParallelDownloadEnabled());
-    EXPECT_EQ(GetMinSliceSizeConfig(), 4321);
-  }
-  {
-    base::test::ScopedFeatureList feature_list;
-    std::map<std::string, std::string> params = {
-        {content::kMinSliceSizeFinchKey, "4321"},
-        {content::kEnableParallelDownloadFinchKey, "true"}};
-    feature_list.InitAndEnableFeatureWithParameters(
-        download::features::kParallelDownloading, params);
-    // Disable only if |enable_parallel_download| sets to false.
-    EXPECT_TRUE(IsParallelDownloadEnabled());
-    EXPECT_EQ(GetMinSliceSizeConfig(), 4321);
-  }
-  {
-    base::test::ScopedFeatureList feature_list;
-    std::map<std::string, std::string> params = {
-        {content::kMinSliceSizeFinchKey, "4321"}};
-    feature_list.InitAndEnableFeatureWithParameters(
-        download::features::kParallelDownloading, params);
-    // Empty |enable_parallel_download| in an enabled experiment group will have
-    // no impact.
-    EXPECT_TRUE(IsParallelDownloadEnabled());
-    EXPECT_EQ(GetMinSliceSizeConfig(), 4321);
-  }
-}
-
-}  // namespace content
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index 95d0fc9..e8456c1 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -83,6 +83,7 @@
 #include "content/browser/shared_worker/shared_worker_service_impl.h"
 #include "content/browser/storage_partition_impl.h"
 #include "content/browser/webauth/authenticator_impl.h"
+#include "content/browser/webauth/scoped_virtual_authenticator_environment.h"
 #include "content/browser/websockets/websocket_manager.h"
 #include "content/browser/webui/url_data_manager_backend.h"
 #include "content/browser/webui/web_ui_controller_factory_registry.h"
@@ -153,6 +154,7 @@
 #include "third_party/WebKit/public/common/feature_policy/feature_policy.h"
 #include "third_party/WebKit/public/common/frame/frame_policy.h"
 #include "third_party/WebKit/public/mojom/page/page_visibility_state.mojom.h"
+#include "third_party/WebKit/public/platform/modules/webauth/virtual_authenticator.mojom.h"
 #include "ui/accessibility/ax_tree.h"
 #include "ui/accessibility/ax_tree_id_registry.h"
 #include "ui/accessibility/ax_tree_update.h"
@@ -3206,6 +3208,14 @@
     registry_->AddInterface(
         base::Bind(&RenderFrameHostImpl::BindAuthenticatorRequest,
                    base::Unretained(this)));
+    if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+            switches::kEnableWebAuthTestingAPI)) {
+      auto* environment_singleton =
+          ScopedVirtualAuthenticatorEnvironment::GetInstance();
+      registry_->AddInterface(base::BindRepeating(
+          &ScopedVirtualAuthenticatorEnvironment::AddBinding,
+          base::Unretained(environment_singleton)));
+    }
   }
 #endif  // !defined(OS_ANDROID)
 
diff --git a/content/browser/frame_host/render_frame_proxy_host.cc b/content/browser/frame_host/render_frame_proxy_host.cc
index 1f23b4f6..b44b0fd 100644
--- a/content/browser/frame_host/render_frame_proxy_host.cc
+++ b/content/browser/frame_host/render_frame_proxy_host.cc
@@ -149,6 +149,7 @@
   IPC_BEGIN_MESSAGE_MAP(RenderFrameProxyHost, msg)
     IPC_MESSAGE_HANDLER(FrameHostMsg_Detach, OnDetach)
     IPC_MESSAGE_HANDLER(FrameHostMsg_OpenURL, OnOpenURL)
+    IPC_MESSAGE_HANDLER(FrameHostMsg_CheckCompleted, OnCheckCompleted)
     IPC_MESSAGE_HANDLER(FrameHostMsg_RouteMessageEvent, OnRouteMessageEvent)
     IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeOpener, OnDidChangeOpener)
     IPC_MESSAGE_HANDLER(FrameHostMsg_AdvanceFocus, OnAdvanceFocus)
@@ -307,6 +308,11 @@
       params.suggested_filename);
 }
 
+void RenderFrameProxyHost::OnCheckCompleted() {
+  RenderFrameHostImpl* target_rfh = frame_tree_node()->current_frame_host();
+  target_rfh->Send(new FrameMsg_CheckCompleted(target_rfh->GetRoutingID()));
+}
+
 void RenderFrameProxyHost::OnRouteMessageEvent(
     const FrameMsg_PostMessage_Params& params) {
   RenderFrameHostImpl* target_rfh = frame_tree_node()->current_frame_host();
diff --git a/content/browser/frame_host/render_frame_proxy_host.h b/content/browser/frame_host/render_frame_proxy_host.h
index c732fa4..cd7aa23 100644
--- a/content/browser/frame_host/render_frame_proxy_host.h
+++ b/content/browser/frame_host/render_frame_proxy_host.h
@@ -145,6 +145,7 @@
   // IPC Message handlers.
   void OnDetach();
   void OnOpenURL(const FrameHostMsg_OpenURL_Params& params);
+  void OnCheckCompleted();
   void OnRouteMessageEvent(const FrameMsg_PostMessage_Params& params);
   void OnDidChangeOpener(int32_t opener_routing_id);
   void OnAdvanceFocus(blink::WebFocusType type, int32_t source_routing_id);
diff --git a/content/browser/loader/cross_site_document_resource_handler.cc b/content/browser/loader/cross_site_document_resource_handler.cc
index 2761390..71b375a4 100644
--- a/content/browser/loader/cross_site_document_resource_handler.cc
+++ b/content/browser/loader/cross_site_document_resource_handler.cc
@@ -35,7 +35,7 @@
 #include "services/metrics/public/cpp/ukm_recorder.h"
 
 using MimeType = network::CrossOriginReadBlocking::MimeType;
-using SniffingResult = network::CrossOriginReadBlocking::Result;
+using SniffingResult = network::CrossOriginReadBlocking::SniffingResult;
 
 namespace content {
 
diff --git a/content/browser/mach_broker_mac.h b/content/browser/mach_broker_mac.h
index 32ff5d6e..d146728b 100644
--- a/content/browser/mach_broker_mac.h
+++ b/content/browser/mach_broker_mac.h
@@ -15,8 +15,7 @@
 #include "base/process/process_handle.h"
 #include "base/synchronization/lock.h"
 #include "content/public/browser/browser_child_process_observer.h"
-#include "content/public/browser/notification_observer.h"
-#include "content/public/browser/notification_registrar.h"
+#include "content/public/browser/render_process_host_observer.h"
 
 namespace content {
 
@@ -24,7 +23,7 @@
 // access to mach task ports for content child processes.
 class CONTENT_EXPORT MachBroker : public base::PortProvider,
                                   public BrowserChildProcessObserver,
-                                  public NotificationObserver,
+                                  public RenderProcessHostObserver,
                                   public base::PortProvider::Observer {
  public:
   // For use in child processes. This will send the task port of the current
@@ -59,10 +58,11 @@
   void BrowserChildProcessCrashed(const ChildProcessData& data,
       int exit_code) override;
 
-  // Implement |NotificationObserver|.
-  void Observe(int type,
-               const NotificationSource& source,
-               const NotificationDetails& details) override;
+  // Implement |RenderProcessHostObserver|.
+  void RenderProcessExited(RenderProcessHost* host,
+                           base::TerminationStatus status,
+                           int exit_code) override;
+  void RenderProcessHostDestroyed(RenderProcessHost* host) override;
 
   // Returns the Mach port name to use when sending or receiving messages.
   // Does the Right Thing in the browser and in child processes.
@@ -87,10 +87,6 @@
   // Whether or not the class has been initialized.
   bool initialized_;
 
-  // Used to register for notifications received by NotificationObserver.
-  // Accessed only on the UI thread.
-  NotificationRegistrar registrar_;
-
   // Stores the Child process unique id (RenderProcessHost ID) for every
   // process. Protected by base::MachPortBroker::GetLock().
   typedef std::map<int, base::ProcessHandle> ChildProcessIdMap;
diff --git a/content/browser/mach_broker_mac.mm b/content/browser/mach_broker_mac.mm
index dfbf71f..3cdb0b0 100644
--- a/content/browser/mach_broker_mac.mm
+++ b/content/browser/mach_broker_mac.mm
@@ -8,11 +8,9 @@
 #include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/logging.h"
-#include "content/browser/renderer_host/render_process_host_impl.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/child_process_data.h"
-#include "content/public/browser/notification_service.h"
-#include "content/public/browser/notification_types.h"
+#include "content/public/browser/render_process_host.h"
 #include "content/public/common/content_switches.h"
 
 namespace content {
@@ -75,20 +73,14 @@
   InvalidateChildProcessId(data.id);
 }
 
-void MachBroker::Observe(int type,
-                         const NotificationSource& source,
-                         const NotificationDetails& details) {
-  switch (type) {
-    case NOTIFICATION_RENDERER_PROCESS_TERMINATED:
-    case NOTIFICATION_RENDERER_PROCESS_CLOSED: {
-      RenderProcessHost* host = Source<RenderProcessHost>(source).ptr();
-      InvalidateChildProcessId(host->GetID());
-      break;
-    }
-    default:
-      NOTREACHED() << "Unexpected notification";
-      break;
-  }
+void MachBroker::RenderProcessExited(RenderProcessHost* host,
+                                     base::TerminationStatus status,
+                                     int exit_code) {
+  InvalidateChildProcessId(host->GetID());
+}
+
+void MachBroker::RenderProcessHostDestroyed(RenderProcessHost* host) {
+  InvalidateChildProcessId(host->GetID());
 }
 
 // static
@@ -123,11 +115,6 @@
 }
 
 void MachBroker::RegisterNotifications() {
-  registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSED,
-                 NotificationService::AllBrowserContextsAndSources());
-  registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_TERMINATED,
-                 NotificationService::AllBrowserContextsAndSources());
-
   // No corresponding StopObservingBrowserChildProcesses,
   // we leak this singleton.
   BrowserChildProcessObserver::Add(this);
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 3ca2bfab..5ded056d 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -1424,6 +1424,9 @@
       GetID(), storage_partition_impl_->GetServiceWorkerContext()));
 
   AddObserver(indexed_db_factory_.get());
+#if defined(OS_MACOSX)
+  AddObserver(MachBroker::GetInstance());
+#endif
 
   InitializeChannelProxy();
 
diff --git a/content/browser/web_contents/web_contents_impl_browsertest.cc b/content/browser/web_contents/web_contents_impl_browsertest.cc
index 188c253..790c9fd 100644
--- a/content/browser/web_contents/web_contents_impl_browsertest.cc
+++ b/content/browser/web_contents/web_contents_impl_browsertest.cc
@@ -263,6 +263,92 @@
             load_observer.controller_);
 }
 
+namespace {
+
+// Class that waits for a particular load to finish in any frame.  This happens
+// after the commit event.
+class LoadFinishedWaiter : public WebContentsObserver {
+ public:
+  LoadFinishedWaiter(WebContents* web_contents, const GURL& expected_url)
+      : WebContentsObserver(web_contents),
+        expected_url_(expected_url),
+        run_loop_(new base::RunLoop()) {
+    EXPECT_TRUE(web_contents != nullptr);
+  }
+
+  void Wait() { run_loop_->Run(); }
+
+ private:
+  void DidFinishLoad(RenderFrameHost* render_frame_host,
+                     const GURL& url) override {
+    if (url == expected_url_)
+      run_loop_->Quit();
+  }
+
+  GURL expected_url_;
+  std::unique_ptr<base::RunLoop> run_loop_;
+};
+
+}  // namespace
+
+// Ensure that cross-site subframes always notify their parents when they finish
+// loading, so that the page eventually reaches DidStopLoading.  There was a bug
+// where an OOPIF would not notify its parent if (1) it finished loading, but
+// (2) later added a subframe that kept the main frame in the loading state, and
+// (3) all subframes then finished loading.
+// Note that this test makes sense to run with and without OOPIFs.
+// See https://crbug.com/822013#c12.
+IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest,
+                       DidStopLoadingWithNestedFrames) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  WebContentsImpl* web_contents =
+      static_cast<WebContentsImpl*>(shell()->web_contents());
+
+  // Navigate to an A(B, C) page where B is slow to load.  Wait for C to reach
+  // load stop.  A will still be loading due to B.
+  GURL url_a = embedded_test_server()->GetURL(
+      "a.com", "/cross_site_iframe_factory.html?a(b,c)");
+  GURL url_b = embedded_test_server()->GetURL(
+      "b.com", "/cross_site_iframe_factory.html?b()");
+  GURL url_c = embedded_test_server()->GetURL(
+      "c.com", "/cross_site_iframe_factory.html?c()");
+  TestNavigationManager delayer_b(web_contents, url_b);
+  LoadFinishedWaiter load_waiter_c(web_contents, url_c);
+  shell()->LoadURL(url_a);
+  EXPECT_TRUE(delayer_b.WaitForRequestStart());
+  load_waiter_c.Wait();
+  EXPECT_TRUE(web_contents->IsLoading());
+
+  // At this point, C has finished loading and B is stalled.  Add a slow D frame
+  // within C.
+  GURL url_d = embedded_test_server()->GetURL("d.com", "/title1.html");
+  FrameTreeNode* subframe_c = web_contents->GetFrameTree()->root()->child_at(1);
+  EXPECT_EQ(url_c, subframe_c->current_url());
+  TestNavigationManager delayer_d(web_contents, url_d);
+  const std::string add_d_script = base::StringPrintf(
+      "var f = document.createElement('iframe');"
+      "f.src='%s';"
+      "document.body.appendChild(f);",
+      url_d.spec().c_str());
+  EXPECT_TRUE(content::ExecuteScript(subframe_c, add_d_script));
+  EXPECT_TRUE(delayer_d.WaitForRequestStart());
+  EXPECT_TRUE(web_contents->IsLoading());
+
+  // Let B finish and wait for another load stop.  A will still be loading due
+  // to D.
+  LoadFinishedWaiter load_waiter_b(web_contents, url_b);
+  delayer_b.WaitForNavigationFinished();
+  load_waiter_b.Wait();
+  EXPECT_TRUE(web_contents->IsLoading());
+
+  // Let D finish.  We should get a load stop in the main frame.
+  LoadFinishedWaiter load_waiter_d(web_contents, url_d);
+  delayer_d.WaitForNavigationFinished();
+  load_waiter_d.Wait();
+  EXPECT_TRUE(WaitForLoadStop(web_contents));
+  EXPECT_FALSE(web_contents->IsLoading());
+}
+
 // Test that a renderer-initiated navigation to an invalid URL does not leave
 // around a pending entry that could be used in a URL spoof.  We test this in
 // a browser test because our unit test framework incorrectly calls
diff --git a/content/browser/webauth/OWNERS b/content/browser/webauth/OWNERS
index e2c72da..f1f0a3e 100644
--- a/content/browser/webauth/OWNERS
+++ b/content/browser/webauth/OWNERS
@@ -2,4 +2,8 @@
 mkwst@chromium.org
 vasilii@chromium.org
 
-# Component: Blink>WebAuth
\ No newline at end of file
+per-file *_type_converter*.*=set noparent
+per-file *_type_converter*.*=file://ipc/SECURITY_OWNERS
+
+# Component: Blink>WebAuthentication
+# TEAM: identity-dev@chromium.org
diff --git a/content/browser/webauth/authenticator_type_converters.cc b/content/browser/webauth/authenticator_type_converters.cc
new file mode 100644
index 0000000..956063a2
--- /dev/null
+++ b/content/browser/webauth/authenticator_type_converters.cc
@@ -0,0 +1,28 @@
+// Copyright 2018 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/webauth/authenticator_type_converters.h"
+
+#include "base/logging.h"
+
+namespace mojo {
+
+// static
+::device::U2fTransportProtocol
+TypeConverter<::device::U2fTransportProtocol,
+              ::webauth::mojom::AuthenticatorTransport>::
+    Convert(const ::webauth::mojom::AuthenticatorTransport& input) {
+  switch (input) {
+    case ::webauth::mojom::AuthenticatorTransport::USB:
+      return ::device::U2fTransportProtocol::kUsbHumanInterfaceDevice;
+    case ::webauth::mojom::AuthenticatorTransport::NFC:
+      return ::device::U2fTransportProtocol::kNearFieldCommunication;
+    case ::webauth::mojom::AuthenticatorTransport::BLE:
+      return ::device::U2fTransportProtocol::kBluetoothLowEnergy;
+  }
+  NOTREACHED();
+  return ::device::U2fTransportProtocol::kUsbHumanInterfaceDevice;
+}
+
+}  // namespace mojo
diff --git a/content/browser/webauth/authenticator_type_converters.h b/content/browser/webauth/authenticator_type_converters.h
new file mode 100644
index 0000000..004f297
--- /dev/null
+++ b/content/browser/webauth/authenticator_type_converters.h
@@ -0,0 +1,23 @@
+// Copyright 2018 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_WEBAUTH_AUTHENTICATOR_TYPE_CONVERTERS_H_
+#define CONTENT_BROWSER_WEBAUTH_AUTHENTICATOR_TYPE_CONVERTERS_H_
+
+#include "device/fido/u2f_transport_protocol.h"
+#include "mojo/public/cpp/bindings/type_converter.h"
+#include "third_party/WebKit/public/platform/modules/webauth/authenticator.mojom.h"
+
+namespace mojo {
+
+template <>
+struct TypeConverter<::device::U2fTransportProtocol,
+                     ::webauth::mojom::AuthenticatorTransport> {
+  static ::device::U2fTransportProtocol Convert(
+      const ::webauth::mojom::AuthenticatorTransport& input);
+};
+
+}  // namespace mojo
+
+#endif  // CONTENT_BROWSER_WEBAUTH_AUTHENTICATOR_TYPE_CONVERTERS_H_
diff --git a/content/browser/webauth/scoped_virtual_authenticator_environment.cc b/content/browser/webauth/scoped_virtual_authenticator_environment.cc
new file mode 100644
index 0000000..2a68e84
--- /dev/null
+++ b/content/browser/webauth/scoped_virtual_authenticator_environment.cc
@@ -0,0 +1,119 @@
+// Copyright 2018 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/webauth/scoped_virtual_authenticator_environment.h"
+
+#include <utility>
+
+#include "base/stl_util.h"
+#include "content/browser/webauth/authenticator_type_converters.h"
+#include "content/browser/webauth/virtual_authenticator.h"
+#include "content/browser/webauth/virtual_discovery.h"
+
+namespace content {
+
+namespace {
+
+webauth::test::mojom::VirtualAuthenticatorPtr GetMojoPtrToVirtualAuthenticator(
+    VirtualAuthenticator* authenticator) {
+  webauth::test::mojom::VirtualAuthenticatorPtr mojo_authenticator_ptr;
+  authenticator->AddBinding(mojo::MakeRequest(&mojo_authenticator_ptr));
+  return mojo_authenticator_ptr;
+}
+
+}  // namespace
+
+// static
+ScopedVirtualAuthenticatorEnvironment*
+ScopedVirtualAuthenticatorEnvironment::GetInstance() {
+  static base::NoDestructor<ScopedVirtualAuthenticatorEnvironment> environment;
+  return environment.get();
+}
+
+ScopedVirtualAuthenticatorEnvironment::ScopedVirtualAuthenticatorEnvironment() =
+    default;
+ScopedVirtualAuthenticatorEnvironment::
+    ~ScopedVirtualAuthenticatorEnvironment() = default;
+
+void ScopedVirtualAuthenticatorEnvironment::AddBinding(
+    webauth::test::mojom::VirtualAuthenticatorManagerRequest request) {
+  bindings_.AddBinding(this, std::move(request));
+}
+
+void ScopedVirtualAuthenticatorEnvironment::CreateAuthenticator(
+    webauth::test::mojom::VirtualAuthenticatorOptionsPtr options,
+    CreateAuthenticatorCallback callback) {
+  auto authenticator = std::make_unique<VirtualAuthenticator>(
+      mojo::ConvertTo<::device::U2fTransportProtocol>(options->transport));
+  auto* authenticator_ptr = authenticator.get();
+  authenticators_.emplace(authenticator_ptr->unique_id(),
+                          std::move(authenticator));
+
+  for (auto* discovery : discoveries_) {
+    if (discovery->transport() != authenticator_ptr->transport())
+      continue;
+    discovery->AddVirtualDevice(authenticator_ptr->ConstructDevice());
+  }
+
+  std::move(callback).Run(GetMojoPtrToVirtualAuthenticator(authenticator_ptr));
+}
+
+void ScopedVirtualAuthenticatorEnvironment::GetAuthenticators(
+    GetAuthenticatorsCallback callback) {
+  std::vector<webauth::test::mojom::VirtualAuthenticatorPtrInfo>
+      mojo_authenticators;
+  for (auto& authenticator : authenticators_) {
+    mojo_authenticators.push_back(
+        GetMojoPtrToVirtualAuthenticator(authenticator.second.get())
+            .PassInterface());
+  }
+
+  std::move(callback).Run(std::move(mojo_authenticators));
+}
+
+void ScopedVirtualAuthenticatorEnvironment::RemoveAuthenticator(
+    const std::string& id,
+    RemoveAuthenticatorCallback callback) {
+  const bool removed = authenticators_.erase(id);
+  if (removed) {
+    for (auto* discovery : discoveries_)
+      discovery->RemoveVirtualDevice(id);
+  }
+
+  std::move(callback).Run(removed);
+}
+
+void ScopedVirtualAuthenticatorEnvironment::ClearAuthenticators(
+    ClearAuthenticatorsCallback callback) {
+  for (auto& authenticator : authenticators_) {
+    for (auto* discovery : discoveries_) {
+      discovery->RemoveVirtualDevice(authenticator.second->unique_id());
+    }
+  }
+  authenticators_.clear();
+
+  std::move(callback).Run();
+}
+
+std::unique_ptr<::device::FidoDiscovery>
+ScopedVirtualAuthenticatorEnvironment::CreateFidoDiscovery(
+    device::U2fTransportProtocol transport,
+    ::service_manager::Connector* connector) {
+  auto discovery = std::make_unique<VirtualFidoDiscovery>(this, transport);
+  for (auto& authenticator : authenticators_) {
+    if (discovery->transport() != authenticator.second->transport())
+      continue;
+    discovery->AddVirtualDevice(authenticator.second->ConstructDevice());
+  }
+  discoveries_.insert(discovery.get());
+  return discovery;
+}
+
+void ScopedVirtualAuthenticatorEnvironment::OnDiscoveryDestroyed(
+    VirtualFidoDiscovery* discovery) {
+  DCHECK(base::ContainsKey(discoveries_, discovery));
+  discoveries_.erase(discovery);
+}
+
+}  // namespace content
diff --git a/content/browser/webauth/scoped_virtual_authenticator_environment.h b/content/browser/webauth/scoped_virtual_authenticator_environment.h
new file mode 100644
index 0000000..10b5bd1
--- /dev/null
+++ b/content/browser/webauth/scoped_virtual_authenticator_environment.h
@@ -0,0 +1,81 @@
+// Copyright 2018 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_WEBAUTH_SCOPED_VIRTUAL_AUTHENTICATOR_ENVIRONMENT_H_
+#define CONTENT_BROWSER_WEBAUTH_SCOPED_VIRTUAL_AUTHENTICATOR_ENVIRONMENT_H_
+
+#include <map>
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "base/macros.h"
+#include "base/no_destructor.h"
+#include "content/common/content_export.h"
+#include "device/fido/fido_discovery.h"
+#include "mojo/public/cpp/bindings/binding_set.h"
+#include "third_party/WebKit/public/platform/modules/webauth/virtual_authenticator.mojom.h"
+
+namespace content {
+
+class VirtualAuthenticator;
+class VirtualFidoDiscovery;
+
+// Implements the Mojo interface representing a scoped virtual environment for
+// the Web Authentication API. While in scope, the API is disconnected from the
+// real world and allows setting up and configuration of virtual authenticator
+// devices for testing.
+//
+// This class is a singleton. The virtual state is persisted for the entire
+// lifetime of the browser process and shared by all frames in all WebContents
+// and across all BrowserContexts.
+class CONTENT_EXPORT ScopedVirtualAuthenticatorEnvironment
+    : public webauth::test::mojom::VirtualAuthenticatorManager,
+      protected device::internal::ScopedFidoDiscoveryFactory {
+ public:
+  static ScopedVirtualAuthenticatorEnvironment* GetInstance();
+
+  void AddBinding(
+      webauth::test::mojom::VirtualAuthenticatorManagerRequest request);
+
+ protected:
+  ScopedVirtualAuthenticatorEnvironment();
+  ~ScopedVirtualAuthenticatorEnvironment() override;
+
+  // webauth::test::mojom::VirtualAuthenticatorManager:
+  void CreateAuthenticator(
+      webauth::test::mojom::VirtualAuthenticatorOptionsPtr options,
+      CreateAuthenticatorCallback callback) override;
+  void GetAuthenticators(GetAuthenticatorsCallback callback) override;
+  void RemoveAuthenticator(const std::string& id,
+                           RemoveAuthenticatorCallback callback) override;
+  void ClearAuthenticators(ClearAuthenticatorsCallback callback) override;
+
+  // ScopedFidoDiscoveryFactory:
+  std::unique_ptr<::device::FidoDiscovery> CreateFidoDiscovery(
+      device::U2fTransportProtocol transport,
+      ::service_manager::Connector* connector) override;
+
+ private:
+  friend class base::NoDestructor<ScopedVirtualAuthenticatorEnvironment>;
+  friend class VirtualFidoDiscovery;
+
+  // Called by VirtualFidoDiscoveries when they are destructed.
+  void OnDiscoveryDestroyed(VirtualFidoDiscovery* discovery);
+
+  mojo::BindingSet<webauth::test::mojom::VirtualAuthenticatorManager> bindings_;
+
+  // The key is the unique_id of the corresponding value (the authenticator).
+  std::map<std::string, std::unique_ptr<VirtualAuthenticator>> authenticators_;
+
+  // Discoveries are owned by U2fRequest and FidoRequestHandler, and
+  // automatically unregister themselves upon their destruction.
+  std::set<VirtualFidoDiscovery*> discoveries_;
+
+  DISALLOW_COPY_AND_ASSIGN(ScopedVirtualAuthenticatorEnvironment);
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_WEBAUTH_SCOPED_VIRTUAL_AUTHENTICATOR_ENVIRONMENT_H_
diff --git a/content/browser/webauth/virtual_authenticator.cc b/content/browser/webauth/virtual_authenticator.cc
new file mode 100644
index 0000000..d17051ce
--- /dev/null
+++ b/content/browser/webauth/virtual_authenticator.cc
@@ -0,0 +1,83 @@
+// Copyright 2018 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/webauth/virtual_authenticator.h"
+
+#include <utility>
+#include <vector>
+
+#include "base/guid.h"
+#include "base/memory/ptr_util.h"
+#include "crypto/ec_private_key.h"
+
+namespace content {
+
+VirtualAuthenticator::VirtualAuthenticator(
+    ::device::U2fTransportProtocol transport)
+    : transport_(transport),
+      unique_id_(base::GenerateGUID()),
+      state_(base::MakeRefCounted<::device::VirtualFidoDevice::State>()) {}
+
+VirtualAuthenticator::~VirtualAuthenticator() = default;
+
+void VirtualAuthenticator::AddBinding(
+    webauth::test::mojom::VirtualAuthenticatorRequest request) {
+  binding_set_.AddBinding(this, std::move(request));
+}
+
+std::unique_ptr<::device::FidoDevice> VirtualAuthenticator::ConstructDevice() {
+  return std::make_unique<::device::VirtualFidoDevice>(state_);
+}
+
+void VirtualAuthenticator::GetUniqueId(GetUniqueIdCallback callback) {
+  std::move(callback).Run(unique_id_);
+}
+
+void VirtualAuthenticator::GetRegistrations(GetRegistrationsCallback callback) {
+  std::vector<webauth::test::mojom::RegisteredKeyPtr> mojo_registered_keys;
+  for (const auto& registration : state_->registrations) {
+    auto mojo_registered_key = webauth::test::mojom::RegisteredKey::New();
+    mojo_registered_key->key_handle = registration.first;
+    mojo_registered_key->counter = registration.second.counter;
+    mojo_registered_key->application_parameter =
+        registration.second.application_parameter;
+    registration.second.private_key->ExportPrivateKey(
+        &mojo_registered_key->private_key);
+    mojo_registered_keys.push_back(std::move(mojo_registered_key));
+  }
+  std::move(callback).Run(std::move(mojo_registered_keys));
+}
+
+void VirtualAuthenticator::AddRegistration(
+    webauth::test::mojom::RegisteredKeyPtr registration,
+    AddRegistrationCallback callback) {
+  bool success = false;
+  std::tie(std::ignore, success) = state_->registrations.emplace(
+      std::move(registration->key_handle),
+      ::device::VirtualFidoDevice::RegistrationData(
+          crypto::ECPrivateKey::CreateFromPrivateKeyInfo(
+              registration->private_key),
+          std::move(registration->application_parameter),
+          registration->counter));
+  std::move(callback).Run(success);
+}
+
+void VirtualAuthenticator::ClearRegistrations(
+    ClearRegistrationsCallback callback) {
+  state_->registrations.clear();
+  std::move(callback).Run();
+}
+
+void VirtualAuthenticator::SetUserPresence(bool present,
+                                           SetUserPresenceCallback callback) {
+  // TODO(https://crbug.com/785955): Implement once VirtualFidoDevice supports
+  // this.
+  std::move(callback).Run();
+}
+
+void VirtualAuthenticator::GetUserPresence(GetUserPresenceCallback callback) {
+  std::move(callback).Run(false);
+}
+
+}  // namespace content
diff --git a/content/browser/webauth/virtual_authenticator.h b/content/browser/webauth/virtual_authenticator.h
new file mode 100644
index 0000000..6e2a98a
--- /dev/null
+++ b/content/browser/webauth/virtual_authenticator.h
@@ -0,0 +1,68 @@
+// Copyright 2018 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_WEBAUTH_VIRTUAL_AUTHENTICATOR_H_
+#define CONTENT_BROWSER_WEBAUTH_VIRTUAL_AUTHENTICATOR_H_
+
+#include <memory>
+#include <string>
+
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "content/common/content_export.h"
+#include "device/fido/u2f_transport_protocol.h"
+#include "device/fido/virtual_fido_device.h"
+#include "mojo/public/cpp/bindings/binding_set.h"
+#include "third_party/WebKit/public/platform/modules/webauth/virtual_authenticator.mojom.h"
+
+namespace content {
+
+// Implements the Mojo interface representing a stateful virtual authenticator.
+//
+// This class has very little logic itself, it merely stores a unique ID and the
+// state of the authenticator, whereas performing all cryptographic operations
+// is delegated to the VirtualFidoDevice class.
+class CONTENT_EXPORT VirtualAuthenticator
+    : public webauth::test::mojom::VirtualAuthenticator {
+ public:
+  explicit VirtualAuthenticator(::device::U2fTransportProtocol transport);
+  ~VirtualAuthenticator() override;
+
+  void AddBinding(webauth::test::mojom::VirtualAuthenticatorRequest request);
+
+  ::device::U2fTransportProtocol transport() const { return transport_; }
+  const std::string& unique_id() const { return unique_id_; }
+
+  // Constructs a VirtualFidoDevice instance that will perform cryptographic
+  // operations on behalf of, and using the state stored in this virtual
+  // authenticator.
+  //
+  // There is an N:1 relationship between VirtualFidoDevices and this class, so
+  // this method can be called any number of times.
+  std::unique_ptr<::device::FidoDevice> ConstructDevice();
+
+ protected:
+  // webauth::test::mojom::VirtualAuthenticator:
+  void GetUniqueId(GetUniqueIdCallback callback) override;
+
+  void GetRegistrations(GetRegistrationsCallback callback) override;
+  void AddRegistration(webauth::test::mojom::RegisteredKeyPtr registration,
+                       AddRegistrationCallback callback) override;
+  void ClearRegistrations(ClearRegistrationsCallback callback) override;
+
+  void SetUserPresence(bool present, SetUserPresenceCallback callback) override;
+  void GetUserPresence(GetUserPresenceCallback callback) override;
+
+ private:
+  const ::device::U2fTransportProtocol transport_;
+  const std::string unique_id_;
+  scoped_refptr<::device::VirtualFidoDevice::State> state_;
+  mojo::BindingSet<webauth::test::mojom::VirtualAuthenticator> binding_set_;
+
+  DISALLOW_COPY_AND_ASSIGN(VirtualAuthenticator);
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_WEBAUTH_VIRTUAL_AUTHENTICATOR_H_
diff --git a/content/browser/webauth/virtual_discovery.cc b/content/browser/webauth/virtual_discovery.cc
new file mode 100644
index 0000000..947e088
--- /dev/null
+++ b/content/browser/webauth/virtual_discovery.cc
@@ -0,0 +1,52 @@
+// Copyright 2018 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/webauth/virtual_discovery.h"
+
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "base/location.h"
+#include "base/logging.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "content/browser/webauth/scoped_virtual_authenticator_environment.h"
+#include "device/fido/fido_device.h"
+
+namespace content {
+
+VirtualFidoDiscovery::VirtualFidoDiscovery(
+    ScopedVirtualAuthenticatorEnvironment* environment,
+    ::device::U2fTransportProtocol transport)
+    : FidoDiscovery(transport), environment_(environment) {}
+
+VirtualFidoDiscovery::~VirtualFidoDiscovery() {
+  environment_->OnDiscoveryDestroyed(this);
+}
+
+void VirtualFidoDiscovery::AddVirtualDevice(
+    std::unique_ptr<::device::FidoDevice> device) {
+  // The real implementation would never notify the client's observer about
+  // devices before the client calls Start(), mimic the same behavior.
+  if (is_start_requested()) {
+    FidoDiscovery::AddDevice(std::move(device));
+  } else {
+    devices_pending_discovery_start_.push_back(std::move(device));
+  }
+}
+
+bool VirtualFidoDiscovery::RemoveVirtualDevice(base::StringPiece device_id) {
+  DCHECK(is_start_requested());
+  return ::device::FidoDiscovery::RemoveDevice(device_id);
+}
+
+void VirtualFidoDiscovery::StartInternal() {
+  for (auto& device : devices_pending_discovery_start_)
+    FidoDiscovery::AddDevice(std::move(device));
+  devices_pending_discovery_start_.clear();
+
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE, base::BindOnce(&VirtualFidoDiscovery::NotifyDiscoveryStarted,
+                                base::Unretained(this), true /* success */));
+}
+
+}  // namespace content
diff --git a/content/browser/webauth/virtual_discovery.h b/content/browser/webauth/virtual_discovery.h
new file mode 100644
index 0000000..8fc7eb3b
--- /dev/null
+++ b/content/browser/webauth/virtual_discovery.h
@@ -0,0 +1,53 @@
+// Copyright 2018 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_WEBAUTH_VIRTUAL_DISCOVERY_H_
+#define CONTENT_BROWSER_WEBAUTH_VIRTUAL_DISCOVERY_H_
+
+#include <memory>
+#include <vector>
+
+#include "base/macros.h"
+#include "base/strings/string_piece.h"
+#include "content/common/content_export.h"
+#include "device/fido/fido_discovery.h"
+
+namespace device {
+class FidoDevice;
+}
+
+namespace content {
+
+class ScopedVirtualAuthenticatorEnvironment;
+
+// A fully automated FidoDiscovery implementation, which is disconnected from
+// the real world, and discovers VirtualFidoDevice instances.
+class CONTENT_EXPORT VirtualFidoDiscovery : public ::device::FidoDiscovery {
+ public:
+  // The |environment| must outlive this instance.
+  VirtualFidoDiscovery(ScopedVirtualAuthenticatorEnvironment* environment,
+                       ::device::U2fTransportProtocol transport);
+
+  // Notifies the |environment| of this instance being destroyed.
+  ~VirtualFidoDiscovery() override;
+
+  void AddVirtualDevice(std::unique_ptr<::device::FidoDevice> device);
+  bool RemoveVirtualDevice(base::StringPiece device_id);
+
+ protected:
+  // FidoDiscovery:
+  void StartInternal() override;
+
+ private:
+  ScopedVirtualAuthenticatorEnvironment* environment_ = nullptr;
+
+  std::vector<std::unique_ptr<::device::FidoDevice>>
+      devices_pending_discovery_start_;
+
+  DISALLOW_COPY_AND_ASSIGN(VirtualFidoDiscovery);
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_WEBAUTH_VIRTUAL_DISCOVERY_H_
diff --git a/content/browser/webauth/webauth_browsertest.cc b/content/browser/webauth/webauth_browsertest.cc
index 7ae630e..b31ea991 100644
--- a/content/browser/webauth/webauth_browsertest.cc
+++ b/content/browser/webauth/webauth_browsertest.cc
@@ -22,6 +22,7 @@
 #include "content/shell/browser/shell.h"
 #include "device/fido/fake_fido_discovery.h"
 #include "device/fido/fake_hid_impl_for_testing.h"
+#include "device/fido/test_callback_receiver.h"
 #include "net/dns/mock_host_resolver.h"
 #include "services/device/public/mojom/constants.mojom.h"
 #include "services/service_manager/public/cpp/connector.h"
@@ -38,58 +39,28 @@
 using webauth::mojom::GetAssertionAuthenticatorResponsePtr;
 using webauth::mojom::MakeCredentialAuthenticatorResponsePtr;
 
-class MockCreateCallback {
- public:
-  MockCreateCallback() = default;
-  MOCK_METHOD1_T(Run, void(AuthenticatorStatus));
+using TestCreateCallbackReceiver =
+    ::device::test::StatusAndValueCallbackReceiver<
+        AuthenticatorStatus,
+        MakeCredentialAuthenticatorResponsePtr>;
 
-  using MakeCredentialCallback =
-      base::OnceCallback<void(AuthenticatorStatus,
-                              MakeCredentialAuthenticatorResponsePtr)>;
+using TestGetCallbackReceiver = ::device::test::StatusAndValueCallbackReceiver<
+    AuthenticatorStatus,
+    GetAssertionAuthenticatorResponsePtr>;
 
-  void RunWrapper(AuthenticatorStatus status,
-                  MakeCredentialAuthenticatorResponsePtr unused_response) {
-    Run(status);
-  }
+}  // namespace
 
-  MakeCredentialCallback Get() {
-    return base::BindOnce(&MockCreateCallback::RunWrapper,
-                          base::Unretained(this));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockCreateCallback);
-};
-
-class MockGetCallback {
- public:
-  MockGetCallback() = default;
-  MOCK_METHOD1_T(Run, void(AuthenticatorStatus));
-
-  using GetAssertionCallback =
-      base::OnceCallback<void(AuthenticatorStatus,
-                              GetAssertionAuthenticatorResponsePtr)>;
-
-  void RunWrapper(AuthenticatorStatus status,
-                  GetAssertionAuthenticatorResponsePtr unused_response) {
-    Run(status);
-  }
-
-  GetAssertionCallback Get() {
-    return base::BindOnce(&MockGetCallback::RunWrapper, base::Unretained(this));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockGetCallback);
-};
-
-// Helper object for common tasks.
+// Test fixture base class for common tasks.
 class WebAuthBrowserTestBase : public content::ContentBrowserTest {
  protected:
   WebAuthBrowserTestBase()
       : https_server_(net::EmbeddedTestServer::TYPE_HTTPS) {}
 
-  void SetUp() override { content::ContentBrowserTest::SetUp(); }
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    command_line->AppendSwitch(
+        switches::kEnableExperimentalWebPlatformFeatures);
+    command_line->AppendSwitch(switches::kIgnoreCertificateErrors);
+  }
 
   void SetUpOnMainThread() override {
     host_resolver()->AddRule("*", "127.0.0.1");
@@ -100,20 +71,12 @@
     ConnectToAuthenticator(shell()->web_contents());
   }
 
-  virtual void ConnectToAuthenticator(WebContents* web_contents) {
+  void ConnectToAuthenticator(WebContents* web_contents) {
     authenticator_impl_.reset(
         new content::AuthenticatorImpl(web_contents->GetMainFrame()));
     authenticator_impl_->Bind(mojo::MakeRequest(&authenticator_ptr_));
   }
 
-  void SetUpCommandLine(base::CommandLine* command_line) override {
-    command_line->AppendSwitch(
-        switches::kEnableExperimentalWebPlatformFeatures);
-    command_line->AppendSwitch(switches::kIgnoreCertificateErrors);
-  }
-
-  static constexpr int32_t kCOSEAlgorithmIdentifierES256 = -7;
-
   webauth::mojom::PublicKeyCredentialCreationOptionsPtr
   BuildBasicCreateOptions() {
     auto rp = webauth::mojom::PublicKeyCredentialRpEntity::New(
@@ -123,6 +86,7 @@
     auto user = webauth::mojom::PublicKeyCredentialUserEntity::New(
         kTestUserId, "name", base::nullopt, "displayName");
 
+    static constexpr int32_t kCOSEAlgorithmIdentifierES256 = -7;
     auto param = webauth::mojom::PublicKeyCredentialParameters::New();
     param->type = webauth::mojom::PublicKeyCredentialType::PUBLIC_KEY;
     param->algorithm_identifier = kCOSEAlgorithmIdentifierES256;
@@ -159,7 +123,7 @@
     return mojo_options;
   }
 
-  void ResetAuthenticatorImplAndWaitForConnectionError() {
+  void SimulateNavigationAndWaitForConnectionError() {
     EXPECT_TRUE(authenticator_impl_);
     EXPECT_TRUE(authenticator_ptr_);
     EXPECT_TRUE(authenticator_ptr_.is_bound());
@@ -179,14 +143,17 @@
 
   AuthenticatorPtr& authenticator() { return authenticator_ptr_; }
   net::EmbeddedTestServer& https_server() { return https_server_; }
+  device::test::ScopedFakeFidoDiscoveryFactory* discovery_factory() {
+    return &factory_;
+  }
 
  private:
   net::EmbeddedTestServer https_server_;
+  device::test::ScopedFakeFidoDiscoveryFactory factory_;
   std::unique_ptr<content::AuthenticatorImpl> authenticator_impl_;
   AuthenticatorPtr authenticator_ptr_;
 };
 
-}  // namespace
 
 class WebAuthBrowserTest : public WebAuthBrowserTestBase {
  public:
@@ -294,49 +261,88 @@
 // pending create(publicKey) request.
 IN_PROC_BROWSER_TEST_F(WebAuthBrowserTest,
                        CreatePublicKeyCredentialNavigateAway) {
-  MockCreateCallback create_callback;
-  EXPECT_CALL(create_callback, Run(::testing::_)).Times(0);
-
+  auto* fake_hid_discovery = discovery_factory()->ForgeNextHidDiscovery();
+  TestCreateCallbackReceiver create_callback_receiver;
   authenticator()->MakeCredential(BuildBasicCreateOptions(),
-                                  create_callback.Get());
-  authenticator().FlushForTesting();
+                                  create_callback_receiver.callback());
 
-  ResetAuthenticatorImplAndWaitForConnectionError();
+  fake_hid_discovery->WaitForCallToStartAndSimulateSuccess();
+  SimulateNavigationAndWaitForConnectionError();
 }
 
 // Tests that no crash occurs when the implementation is destroyed with a
 // pending get(publicKey) request.
 IN_PROC_BROWSER_TEST_F(WebAuthBrowserTest, GetPublicKeyCredentialNavigateAway) {
-  MockGetCallback get_callback;
-  EXPECT_CALL(get_callback, Run(::testing::_)).Times(0);
+  auto* fake_hid_discovery = discovery_factory()->ForgeNextHidDiscovery();
+  TestGetCallbackReceiver get_callback_receiver;
+  authenticator()->GetAssertion(BuildBasicGetOptions(),
+                                get_callback_receiver.callback());
 
-  authenticator()->GetAssertion(BuildBasicGetOptions(), get_callback.Get());
-  authenticator().FlushForTesting();
-
-  ResetAuthenticatorImplAndWaitForConnectionError();
+  fake_hid_discovery->WaitForCallToStartAndSimulateSuccess();
+  SimulateNavigationAndWaitForConnectionError();
 }
 
 // Regression test for https://crbug.com/818219.
 IN_PROC_BROWSER_TEST_F(WebAuthBrowserTest,
                        CreatePublicKeyCredentialTwiceInARow) {
-  MockCreateCallback callback_1;
-  MockCreateCallback callback_2;
-  EXPECT_CALL(callback_1, Run(::testing::_)).Times(0);
-  EXPECT_CALL(callback_2, Run(AuthenticatorStatus::PENDING_REQUEST)).Times(1);
-  authenticator()->MakeCredential(BuildBasicCreateOptions(), callback_1.Get());
-  authenticator()->MakeCredential(BuildBasicCreateOptions(), callback_2.Get());
-  authenticator().FlushForTesting();
+  TestCreateCallbackReceiver callback_receiver_1;
+  TestCreateCallbackReceiver callback_receiver_2;
+  authenticator()->MakeCredential(BuildBasicCreateOptions(),
+                                  callback_receiver_1.callback());
+  authenticator()->MakeCredential(BuildBasicCreateOptions(),
+                                  callback_receiver_2.callback());
+  callback_receiver_2.WaitForCallback();
+
+  EXPECT_EQ(AuthenticatorStatus::PENDING_REQUEST, callback_receiver_2.status());
+  EXPECT_FALSE(callback_receiver_1.was_called());
 }
 
 // Regression test for https://crbug.com/818219.
 IN_PROC_BROWSER_TEST_F(WebAuthBrowserTest, GetPublicKeyCredentialTwiceInARow) {
-  MockGetCallback callback_1;
-  MockGetCallback callback_2;
-  EXPECT_CALL(callback_1, Run(::testing::_)).Times(0);
-  EXPECT_CALL(callback_2, Run(AuthenticatorStatus::PENDING_REQUEST)).Times(1);
-  authenticator()->GetAssertion(BuildBasicGetOptions(), callback_1.Get());
-  authenticator()->GetAssertion(BuildBasicGetOptions(), callback_2.Get());
-  authenticator().FlushForTesting();
+  TestGetCallbackReceiver callback_receiver_1;
+  TestGetCallbackReceiver callback_receiver_2;
+  authenticator()->GetAssertion(BuildBasicGetOptions(),
+                                callback_receiver_1.callback());
+  authenticator()->GetAssertion(BuildBasicGetOptions(),
+                                callback_receiver_2.callback());
+  callback_receiver_2.WaitForCallback();
+
+  EXPECT_EQ(AuthenticatorStatus::PENDING_REQUEST, callback_receiver_2.status());
+  EXPECT_FALSE(callback_receiver_1.was_called());
+}
+
+IN_PROC_BROWSER_TEST_F(WebAuthBrowserTest,
+                       CreatePublicKeyCredentialWhileRequestIsPending) {
+  auto* fake_hid_discovery = discovery_factory()->ForgeNextHidDiscovery();
+  TestCreateCallbackReceiver callback_receiver_1;
+  TestCreateCallbackReceiver callback_receiver_2;
+  authenticator()->MakeCredential(BuildBasicCreateOptions(),
+                                  callback_receiver_1.callback());
+  fake_hid_discovery->WaitForCallToStartAndSimulateSuccess();
+
+  authenticator()->MakeCredential(BuildBasicCreateOptions(),
+                                  callback_receiver_2.callback());
+  callback_receiver_2.WaitForCallback();
+
+  EXPECT_EQ(AuthenticatorStatus::PENDING_REQUEST, callback_receiver_2.status());
+  EXPECT_FALSE(callback_receiver_1.was_called());
+}
+
+IN_PROC_BROWSER_TEST_F(WebAuthBrowserTest,
+                       GetPublicKeyCredentialWhileRequestIsPending) {
+  auto* fake_hid_discovery = discovery_factory()->ForgeNextHidDiscovery();
+  TestGetCallbackReceiver callback_receiver_1;
+  TestGetCallbackReceiver callback_receiver_2;
+  authenticator()->GetAssertion(BuildBasicGetOptions(),
+                                callback_receiver_1.callback());
+  fake_hid_discovery->WaitForCallToStartAndSimulateSuccess();
+
+  authenticator()->GetAssertion(BuildBasicGetOptions(),
+                                callback_receiver_2.callback());
+  callback_receiver_2.WaitForCallback();
+
+  EXPECT_EQ(AuthenticatorStatus::PENDING_REQUEST, callback_receiver_2.status());
+  EXPECT_FALSE(callback_receiver_1.was_called());
 }
 
 // Tests that when navigator.credentials.create() is called with unsupported
@@ -365,14 +371,13 @@
 // Tests that the BLE discovery does not start when the WebAuthnBle feature
 // flag is disabled.
 IN_PROC_BROWSER_TEST_F(WebAuthBrowserBleDisabledTest, CheckBleDisabled) {
-  device::test::ScopedFakeFidoDiscoveryFactory factory;
-  auto* fake_hid_discovery = factory.ForgeNextHidDiscovery();
-  auto* fake_ble_discovery = factory.ForgeNextBleDiscovery();
+  auto* fake_hid_discovery = discovery_factory()->ForgeNextHidDiscovery();
+  auto* fake_ble_discovery = discovery_factory()->ForgeNextBleDiscovery();
 
   // Do something that will start discoveries.
-  MockCreateCallback create_callback;
+  TestCreateCallbackReceiver create_callback_receiver;
   authenticator()->MakeCredential(BuildBasicCreateOptions(),
-                                  create_callback.Get());
+                                  create_callback_receiver.callback());
 
   fake_hid_discovery->WaitForCallToStart();
   EXPECT_TRUE(fake_hid_discovery->is_start_requested());
diff --git a/content/browser/webui/web_ui_data_source_impl.cc b/content/browser/webui/web_ui_data_source_impl.cc
index 33b118e..ab6ccbba4 100644
--- a/content/browser/webui/web_ui_data_source_impl.cc
+++ b/content/browser/webui/web_ui_data_source_impl.cc
@@ -112,24 +112,24 @@
 WebUIDataSourceImpl::~WebUIDataSourceImpl() {
 }
 
-void WebUIDataSourceImpl::AddString(const std::string& name,
+void WebUIDataSourceImpl::AddString(base::StringPiece name,
                                     const base::string16& value) {
   // TODO(dschuyler): Share only one copy of these strings.
   localized_strings_.SetKey(name, base::Value(value));
-  replacements_[name] = base::UTF16ToUTF8(value);
+  replacements_[name.as_string()] = base::UTF16ToUTF8(value);
 }
 
-void WebUIDataSourceImpl::AddString(const std::string& name,
+void WebUIDataSourceImpl::AddString(base::StringPiece name,
                                     const std::string& value) {
   localized_strings_.SetKey(name, base::Value(value));
-  replacements_[name] = value;
+  replacements_[name.as_string()] = value;
 }
 
-void WebUIDataSourceImpl::AddLocalizedString(const std::string& name, int ids) {
+void WebUIDataSourceImpl::AddLocalizedString(base::StringPiece name, int ids) {
   std::string utf8_str =
       base::UTF16ToUTF8(GetContentClient()->GetLocalizedString(ids));
   localized_strings_.SetKey(name, base::Value(utf8_str));
-  replacements_[name] = utf8_str;
+  replacements_[name.as_string()] = utf8_str;
 }
 
 void WebUIDataSourceImpl::AddLocalizedStrings(
@@ -139,7 +139,7 @@
                                               &replacements_);
 }
 
-void WebUIDataSourceImpl::AddBoolean(const std::string& name, bool value) {
+void WebUIDataSourceImpl::AddBoolean(base::StringPiece name, bool value) {
   localized_strings_.SetBoolean(name, value);
   // TODO(dschuyler): Change name of |localized_strings_| to |load_time_data_|
   // or similar. These values haven't been found as strings for
@@ -148,21 +148,21 @@
   // replacements.
 }
 
-void WebUIDataSourceImpl::AddInteger(const std::string& name, int32_t value) {
+void WebUIDataSourceImpl::AddInteger(base::StringPiece name, int32_t value) {
   localized_strings_.SetInteger(name, value);
 }
 
-void WebUIDataSourceImpl::SetJsonPath(const std::string& path) {
+void WebUIDataSourceImpl::SetJsonPath(base::StringPiece path) {
   DCHECK(json_path_.empty());
   DCHECK(!path.empty());
 
-  json_path_ = path;
+  json_path_ = path.as_string();
   excluded_paths_.insert(json_path_);
 }
 
-void WebUIDataSourceImpl::AddResourcePath(const std::string &path,
+void WebUIDataSourceImpl::AddResourcePath(base::StringPiece path,
                                           int resource_id) {
-  path_to_idr_map_[path] = resource_id;
+  path_to_idr_map_[path.as_string()] = resource_id;
 }
 
 void WebUIDataSourceImpl::SetDefaultResource(int resource_id) {
diff --git a/content/browser/webui/web_ui_data_source_impl.h b/content/browser/webui/web_ui_data_source_impl.h
index a230f31..18c4875 100644
--- a/content/browser/webui/web_ui_data_source_impl.h
+++ b/content/browser/webui/web_ui_data_source_impl.h
@@ -30,15 +30,15 @@
                                            public WebUIDataSource {
  public:
   // WebUIDataSource implementation:
-  void AddString(const std::string& name, const base::string16& value) override;
-  void AddString(const std::string& name, const std::string& value) override;
-  void AddLocalizedString(const std::string& name, int ids) override;
+  void AddString(base::StringPiece name, const base::string16& value) override;
+  void AddString(base::StringPiece name, const std::string& value) override;
+  void AddLocalizedString(base::StringPiece name, int ids) override;
   void AddLocalizedStrings(
       const base::DictionaryValue& localized_strings) override;
-  void AddBoolean(const std::string& name, bool value) override;
-  void AddInteger(const std::string& name, int32_t value) override;
-  void SetJsonPath(const std::string& path) override;
-  void AddResourcePath(const std::string& path, int resource_id) override;
+  void AddBoolean(base::StringPiece name, bool value) override;
+  void AddInteger(base::StringPiece name, int32_t value) override;
+  void SetJsonPath(base::StringPiece path) override;
+  void AddResourcePath(base::StringPiece path, int resource_id) override;
   void SetDefaultResource(int resource_id) override;
   void SetRequestFilter(
       const WebUIDataSource::HandleRequestCallback& callback) override;
diff --git a/content/browser/webui/web_ui_impl.cc b/content/browser/webui/web_ui_impl.cc
index 7c7803f..2cbd988 100644
--- a/content/browser/webui/web_ui_impl.cc
+++ b/content/browser/webui/web_ui_impl.cc
@@ -239,9 +239,9 @@
   ExecuteJavascript(GetJavascriptCall(function_name, args));
 }
 
-void WebUIImpl::RegisterMessageCallback(const std::string &message,
+void WebUIImpl::RegisterMessageCallback(base::StringPiece message,
                                         const MessageCallback& callback) {
-  message_callbacks_.insert(std::make_pair(message, callback));
+  message_callbacks_.emplace(message, callback);
 }
 
 void WebUIImpl::ProcessWebUIMessage(const GURL& source_url,
diff --git a/content/browser/webui/web_ui_impl.h b/content/browser/webui/web_ui_impl.h
index 387362f..9a42c610 100644
--- a/content/browser/webui/web_ui_impl.h
+++ b/content/browser/webui/web_ui_impl.h
@@ -51,7 +51,7 @@
   int GetBindings() const override;
   void SetBindings(int bindings) override;
   void AddMessageHandler(std::unique_ptr<WebUIMessageHandler> handler) override;
-  void RegisterMessageCallback(const std::string& message,
+  void RegisterMessageCallback(base::StringPiece message,
                                const MessageCallback& callback) override;
   void ProcessWebUIMessage(const GURL& source_url,
                            const std::string& message,
diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h
index 130fbd0a..c5262f8 100644
--- a/content/common/frame_messages.h
+++ b/content/common/frame_messages.h
@@ -965,6 +965,10 @@
 IPC_MESSAGE_ROUTED1(FrameMsg_SetTextTrackSettings,
                     FrameMsg_TextTrackSettings_Params /* params */)
 
+// Sent to a frame when one of its remote children finishes loading, so that the
+// frame can update its loading state.
+IPC_MESSAGE_ROUTED0(FrameMsg_CheckCompleted)
+
 // Posts a message from a frame in another process to the current renderer.
 IPC_MESSAGE_ROUTED1(FrameMsg_PostMessageEvent, FrameMsg_PostMessage_Params)
 
@@ -1613,6 +1617,10 @@
 // out-of-process parent frame.
 IPC_MESSAGE_ROUTED0(FrameHostMsg_DispatchLoad)
 
+// Sent by a frame proxy to the browser when a child frame finishes loading, so
+// that the corresponding RenderFrame can check whether its load has completed.
+IPC_MESSAGE_ROUTED0(FrameHostMsg_CheckCompleted)
+
 // Sent to the browser from a frame proxy to post a message to the frame's
 // active renderer.
 IPC_MESSAGE_ROUTED1(FrameHostMsg_RouteMessageEvent,
diff --git a/content/public/app/mojo/content_browser_manifest.json b/content/public/app/mojo/content_browser_manifest.json
index 138da657..0e33dd3 100644
--- a/content/public/app/mojo/content_browser_manifest.json
+++ b/content/public/app/mojo/content_browser_manifest.json
@@ -191,7 +191,8 @@
           "shape_detection::mojom::FaceDetectionProvider",
           "shape_detection::mojom::TextDetection",
           "ui::mojom::Gpu",
-          "webauth::mojom::Authenticator"
+          "webauth::mojom::Authenticator",
+          "webauth::test::mojom::VirtualAuthenticatorManager"
         ]
       },
       "requires": {
diff --git a/content/public/browser/web_ui.h b/content/public/browser/web_ui.h
index a95b5aa..4d320806 100644
--- a/content/public/browser/web_ui.h
+++ b/content/public/browser/web_ui.h
@@ -9,6 +9,7 @@
 
 #include "base/callback.h"
 #include "base/strings/string16.h"
+#include "base/strings/string_piece.h"
 #include "content/common/content_export.h"
 #include "ui/base/page_transition_types.h"
 
@@ -72,7 +73,7 @@
   // Used by WebUIMessageHandlers. If the given message is already registered,
   // the call has no effect.
   using MessageCallback = base::RepeatingCallback<void(const base::ListValue*)>;
-  virtual void RegisterMessageCallback(const std::string& message,
+  virtual void RegisterMessageCallback(base::StringPiece message,
                                        const MessageCallback& callback) = 0;
 
   // This is only needed if an embedder overrides handling of a WebUIMessage and
diff --git a/content/public/browser/web_ui_data_source.h b/content/public/browser/web_ui_data_source.h
index a1a6c97..4adac767 100644
--- a/content/public/browser/web_ui_data_source.h
+++ b/content/public/browser/web_ui_data_source.h
@@ -13,6 +13,7 @@
 
 #include "base/callback.h"
 #include "base/strings/string16.h"
+#include "base/strings/string_piece.h"
 #include "content/common/content_export.h"
 
 namespace base {
@@ -44,33 +45,33 @@
       std::unique_ptr<base::DictionaryValue> update);
 
   // Adds a string keyed to its name to our dictionary.
-  virtual void AddString(const std::string& name,
+  virtual void AddString(base::StringPiece name,
                          const base::string16& value) = 0;
 
   // Adds a string keyed to its name to our dictionary.
-  virtual void AddString(const std::string& name, const std::string& value) = 0;
+  virtual void AddString(base::StringPiece name, const std::string& value) = 0;
 
   // Adds a localized string with resource |ids| keyed to its name to our
   // dictionary.
-  virtual void AddLocalizedString(const std::string& name, int ids) = 0;
+  virtual void AddLocalizedString(base::StringPiece name, int ids) = 0;
 
   // Add strings from |localized_strings| to our dictionary.
   virtual void AddLocalizedStrings(
       const base::DictionaryValue& localized_strings) = 0;
 
   // Adds a boolean keyed to its name to our dictionary.
-  virtual void AddBoolean(const std::string& name, bool value) = 0;
+  virtual void AddBoolean(base::StringPiece name, bool value) = 0;
 
   // Adds a signed 32-bit integer keyed to its name to our dictionary. Larger
   // integers may not be exactly representable in JavaScript. See
   // MAX_SAFE_INTEGER in /v8/src/globals.h.
-  virtual void AddInteger(const std::string& name, int32_t value) = 0;
+  virtual void AddInteger(base::StringPiece name, int32_t value) = 0;
 
   // Sets the path which will return the JSON strings.
-  virtual void SetJsonPath(const std::string& path) = 0;
+  virtual void SetJsonPath(base::StringPiece path) = 0;
 
   // Adds a mapping between a path name and a resource to return.
-  virtual void AddResourcePath(const std::string& path, int resource_id) = 0;
+  virtual void AddResourcePath(base::StringPiece path, int resource_id) = 0;
 
   // Sets the resource to returned when no other paths match.
   virtual void SetDefaultResource(int resource_id) = 0;
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index af8df2b..b426c4a 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -519,7 +519,7 @@
 
 // Use GpuMemoryBuffer backed VideoFrames in media streams.
 const base::Feature kWebRtcUseGpuMemoryBufferVideoFrames{
-    "WebRTC-UseGpuMemoryBufferVideoFrames", base::FEATURE_DISABLED_BY_DEFAULT};
+    "WebRTC-UseGpuMemoryBufferVideoFrames", base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Controls whether the WebUSB API is enabled:
 // https://wicg.github.io/webusb
diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc
index 60218026..efd47c9c 100644
--- a/content/public/common/content_switches.cc
+++ b/content/public/common/content_switches.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 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.
 
@@ -461,6 +461,10 @@
 // Enable Vulkan support, must also have ENABLE_VULKAN defined.
 const char kEnableVulkan[] = "enable-vulkan";
 
+// Enable the Web Authentication Testing API.
+// https://w3c.github.io/webauthn
+const char kEnableWebAuthTestingAPI[] = "enable-web-authentication-testing-api";
+
 // Enables WebGL extensions not yet approved by the community.
 const char kEnableWebGLDraftExtensions[] = "enable-webgl-draft-extensions";
 
diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h
index 0a5526d..f4d15a0 100644
--- a/content/public/common/content_switches.h
+++ b/content/public/common/content_switches.h
@@ -143,6 +143,7 @@
 CONTENT_EXPORT extern const char kEnableViewport[];
 CONTENT_EXPORT extern const char kEnableVtune[];
 CONTENT_EXPORT extern const char kEnableVulkan[];
+CONTENT_EXPORT extern const char kEnableWebAuthTestingAPI[];
 CONTENT_EXPORT extern const char kEnableWebGLDraftExtensions[];
 CONTENT_EXPORT extern const char kEnableWebGLImageChromium[];
 CONTENT_EXPORT extern const char kEnableWebVR[];
diff --git a/content/public/test/test_browser_thread_bundle.cc b/content/public/test/test_browser_thread_bundle.cc
index 4b3f779..1f090d9 100644
--- a/content/public/test/test_browser_thread_bundle.cc
+++ b/content/public/test/test_browser_thread_bundle.cc
@@ -98,9 +98,8 @@
                 ? base::test::ScopedTaskEnvironment::MainThreadType::IO
                 : base::test::ScopedTaskEnvironment::MainThreadType::UI);
   }
-  CHECK(base::MessageLoop::current()->IsType(options_ & IO_MAINLOOP
-                                                 ? base::MessageLoop::TYPE_IO
-                                                 : base::MessageLoop::TYPE_UI));
+  CHECK(options_ & IO_MAINLOOP ? base::MessageLoopForIO::IsCurrent()
+                               : base::MessageLoopForUI::IsCurrent());
 
   // Set the current thread as the UI thread.
   ui_thread_ = std::make_unique<TestBrowserThread>(
diff --git a/content/public/test/test_web_ui.h b/content/public/test/test_web_ui.h
index 3a46d345..4b41ba4a 100644
--- a/content/public/test/test_web_ui.h
+++ b/content/public/test/test_web_ui.h
@@ -35,7 +35,7 @@
   int GetBindings() const override;
   void SetBindings(int bindings) override {}
   void AddMessageHandler(std::unique_ptr<WebUIMessageHandler> handler) override;
-  void RegisterMessageCallback(const std::string& message,
+  void RegisterMessageCallback(base::StringPiece message,
                                const MessageCallback& callback) override {}
   void ProcessWebUIMessage(const GURL& source_url,
                            const std::string& message,
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.cc b/content/renderer/pepper/pepper_plugin_instance_impl.cc
index 8b7ecb9..5e957e7 100644
--- a/content/renderer/pepper/pepper_plugin_instance_impl.cc
+++ b/content/renderer/pepper/pepper_plugin_instance_impl.cc
@@ -2562,120 +2562,6 @@
       render_frame_->render_view()->webkit_preferences().default_encoding);
 }
 
-// These PPB_ContentDecryptor_Private calls are responses to
-// PPP_ContentDecryptor_Private calls, which should never be made since pepper
-// CDM is deprecated.
-// TODO(crbug.com/772160): Remove these after ppapi/ is updated.
-void PepperPluginInstanceImpl::PromiseResolved(PP_Instance instance,
-                                               uint32_t promise_id) {
-  NOTREACHED();
-}
-
-void PepperPluginInstanceImpl::PromiseResolvedWithKeyStatus(
-    PP_Instance instance,
-    uint32_t promise_id,
-    PP_CdmKeyStatus key_status) {
-  NOTREACHED();
-}
-
-void PepperPluginInstanceImpl::PromiseResolvedWithSession(
-    PP_Instance instance,
-    uint32_t promise_id,
-    PP_Var session_id_var) {
-  NOTREACHED();
-}
-
-void PepperPluginInstanceImpl::PromiseRejected(
-    PP_Instance instance,
-    uint32_t promise_id,
-    PP_CdmExceptionCode exception_code,
-    uint32_t system_code,
-    PP_Var error_description_var) {
-  NOTREACHED();
-}
-
-void PepperPluginInstanceImpl::SessionMessage(PP_Instance instance,
-                                              PP_Var session_id_var,
-                                              PP_CdmMessageType message_type,
-                                              PP_Var message_var,
-                                              PP_Var legacy_destination_url) {
-  NOTREACHED();
-}
-
-void PepperPluginInstanceImpl::SessionKeysChange(
-    PP_Instance instance,
-    PP_Var session_id_var,
-    PP_Bool has_additional_usable_key,
-    uint32_t key_count,
-    const struct PP_KeyInformation key_information[]) {
-  NOTREACHED();
-}
-
-void PepperPluginInstanceImpl::SessionExpirationChange(
-    PP_Instance instance,
-    PP_Var session_id_var,
-    PP_Time new_expiry_time) {
-  NOTREACHED();
-}
-
-void PepperPluginInstanceImpl::SessionClosed(PP_Instance instance,
-                                             PP_Var session_id_var) {
-  NOTREACHED();
-}
-
-void PepperPluginInstanceImpl::LegacySessionError(
-    PP_Instance instance,
-    PP_Var session_id_var,
-    PP_CdmExceptionCode exception_code,
-    uint32_t system_code,
-    PP_Var error_description_var) {
-  // Obsolete.
-  NOTREACHED();
-}
-
-void PepperPluginInstanceImpl::DeliverBlock(
-    PP_Instance instance,
-    PP_Resource decrypted_block,
-    const PP_DecryptedBlockInfo* block_info) {
-  NOTREACHED();
-}
-
-void PepperPluginInstanceImpl::DecoderInitializeDone(
-    PP_Instance instance,
-    PP_DecryptorStreamType decoder_type,
-    uint32_t request_id,
-    PP_Bool success) {
-  NOTREACHED();
-}
-
-void PepperPluginInstanceImpl::DecoderDeinitializeDone(
-    PP_Instance instance,
-    PP_DecryptorStreamType decoder_type,
-    uint32_t request_id) {
-  NOTREACHED();
-}
-
-void PepperPluginInstanceImpl::DecoderResetDone(
-    PP_Instance instance,
-    PP_DecryptorStreamType decoder_type,
-    uint32_t request_id) {
-  NOTREACHED();
-}
-
-void PepperPluginInstanceImpl::DeliverFrame(
-    PP_Instance instance,
-    PP_Resource decrypted_frame,
-    const PP_DecryptedFrameInfo* frame_info) {
-  NOTREACHED();
-}
-
-void PepperPluginInstanceImpl::DeliverSamples(
-    PP_Instance instance,
-    PP_Resource audio_frames,
-    const PP_DecryptedSampleInfo* sample_info) {
-  NOTREACHED();
-}
-
 void PepperPluginInstanceImpl::SetPluginToHandleFindRequests(
     PP_Instance instance) {
   if (!LoadFindInterface())
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.h b/content/renderer/pepper/pepper_plugin_instance_impl.h
index 2e34f02..090d58c 100644
--- a/content/renderer/pepper/pepper_plugin_instance_impl.h
+++ b/content/renderer/pepper/pepper_plugin_instance_impl.h
@@ -46,7 +46,6 @@
 #include "ppapi/c/ppp_graphics_3d.h"
 #include "ppapi/c/ppp_input_event.h"
 #include "ppapi/c/ppp_mouse_lock.h"
-#include "ppapi/c/private/ppb_content_decryptor_private.h"
 #include "ppapi/c/private/ppp_find_private.h"
 #include "ppapi/c/private/ppp_instance_private.h"
 #include "ppapi/c/private/ppp_pdf.h"
@@ -487,59 +486,6 @@
   PP_Var GetPluginReferrerURL(PP_Instance instance,
                               PP_URLComponents_Dev* components) override;
 
-  // PPB_ContentDecryptor_Private implementation.
-  void PromiseResolved(PP_Instance instance, uint32_t promise_id) override;
-  void PromiseResolvedWithKeyStatus(PP_Instance instance,
-                                    uint32_t promise_id,
-                                    PP_CdmKeyStatus key_status) override;
-  void PromiseResolvedWithSession(PP_Instance instance,
-                                  uint32_t promise_id,
-                                  PP_Var session_id_var) override;
-  void PromiseRejected(PP_Instance instance,
-                       uint32_t promise_id,
-                       PP_CdmExceptionCode exception_code,
-                       uint32_t system_code,
-                       PP_Var error_description_var) override;
-  void SessionMessage(PP_Instance instance,
-                      PP_Var session_id_var,
-                      PP_CdmMessageType message_type,
-                      PP_Var message_var,
-                      PP_Var legacy_destination_url) override;
-  void SessionKeysChange(
-      PP_Instance instance,
-      PP_Var session_id_var,
-      PP_Bool has_additional_usable_key,
-      uint32_t key_count,
-      const struct PP_KeyInformation key_information[]) override;
-  void SessionExpirationChange(PP_Instance instance,
-                               PP_Var session_id_var,
-                               PP_Time new_expiry_time) override;
-  void SessionClosed(PP_Instance instance, PP_Var session_id_var) override;
-  void LegacySessionError(PP_Instance instance,
-                          PP_Var session_id_var,
-                          PP_CdmExceptionCode exception_code,
-                          uint32_t system_code,
-                          PP_Var error_description_var) override;
-  void DeliverBlock(PP_Instance instance,
-                    PP_Resource decrypted_block,
-                    const PP_DecryptedBlockInfo* block_info) override;
-  void DecoderInitializeDone(PP_Instance instance,
-                             PP_DecryptorStreamType decoder_type,
-                             uint32_t request_id,
-                             PP_Bool success) override;
-  void DecoderDeinitializeDone(PP_Instance instance,
-                               PP_DecryptorStreamType decoder_type,
-                               uint32_t request_id) override;
-  void DecoderResetDone(PP_Instance instance,
-                        PP_DecryptorStreamType decoder_type,
-                        uint32_t request_id) override;
-  void DeliverFrame(PP_Instance instance,
-                    PP_Resource decrypted_frame,
-                    const PP_DecryptedFrameInfo* frame_info) override;
-  void DeliverSamples(PP_Instance instance,
-                      PP_Resource audio_frames,
-                      const PP_DecryptedSampleInfo* sample_info) override;
-
   // Reset this instance as proxied. Assigns the instance a new module, resets
   // cached interfaces to point to the out-of-process proxy and re-sends
   // DidCreate, DidChangeView, and HandleDocumentLoad (if necessary).
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index ea59a6e..99725b5 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -1795,6 +1795,7 @@
     IPC_MESSAGE_HANDLER(FrameMsg_SetFocusedFrame, OnSetFocusedFrame)
     IPC_MESSAGE_HANDLER(FrameMsg_SetTextTrackSettings,
                         OnTextTrackSettingsChanged)
+    IPC_MESSAGE_HANDLER(FrameMsg_CheckCompleted, OnCheckCompleted)
     IPC_MESSAGE_HANDLER(FrameMsg_PostMessageEvent, OnPostMessageEvent)
     IPC_MESSAGE_HANDLER(FrameMsg_ReportContentSecurityPolicyViolation,
                         OnReportContentSecurityPolicyViolation)
@@ -2493,6 +2494,10 @@
       WebString::FromUTF8(params.text_track_text_size));
 }
 
+void RenderFrameImpl::OnCheckCompleted() {
+  frame_->CheckCompleted();
+}
+
 void RenderFrameImpl::OnPostMessageEvent(
     const FrameMsg_PostMessage_Params& params) {
   // Find the source frame if it exists.
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index 1b1c7e71..43695e8 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -1054,6 +1054,7 @@
   void OnSetFocusedFrame();
   void OnTextTrackSettingsChanged(
       const FrameMsg_TextTrackSettings_Params& params);
+  void OnCheckCompleted();
   void OnPostMessageEvent(const FrameMsg_PostMessage_Params& params);
   void OnReportContentSecurityPolicyViolation(
       const content::CSPViolationParams& violation_params);
diff --git a/content/renderer/render_frame_proxy.cc b/content/renderer/render_frame_proxy.cc
index 20a197e..03dcf6c2 100644
--- a/content/renderer/render_frame_proxy.cc
+++ b/content/renderer/render_frame_proxy.cc
@@ -667,6 +667,10 @@
   delete this;
 }
 
+void RenderFrameProxy::CheckCompleted() {
+  Send(new FrameHostMsg_CheckCompleted(routing_id_));
+}
+
 void RenderFrameProxy::ForwardPostMessage(
     blink::WebLocalFrame* source_frame,
     blink::WebRemoteFrame* target_frame,
diff --git a/content/renderer/render_frame_proxy.h b/content/renderer/render_frame_proxy.h
index 4bec0360..608231ebe 100644
--- a/content/renderer/render_frame_proxy.h
+++ b/content/renderer/render_frame_proxy.h
@@ -175,6 +175,7 @@
 
   // blink::WebRemoteFrameClient implementation:
   void FrameDetached(DetachType type) override;
+  void CheckCompleted() override;
   void ForwardPostMessage(blink::WebLocalFrame* sourceFrame,
                           blink::WebRemoteFrame* targetFrame,
                           blink::WebSecurityOrigin target,
diff --git a/content/renderer/service_worker/service_worker_provider_context.cc b/content/renderer/service_worker/service_worker_provider_context.cc
index 05aa0767..42a9a4fa 100644
--- a/content/renderer/service_worker/service_worker_provider_context.cc
+++ b/content/renderer/service_worker/service_worker_provider_context.cc
@@ -199,9 +199,8 @@
   }
   DCHECK(ServiceWorkerUtils::IsServicificationEnabled());
   if (!state->subresource_loader_factory) {
-    mojo::MakeStrongBinding(
-        std::make_unique<ServiceWorkerSubresourceLoaderFactory>(
-            state->controller_connector, state->default_loader_factory),
+    ServiceWorkerSubresourceLoaderFactory::Create(
+        state->controller_connector, state->default_loader_factory,
         mojo::MakeRequest(&state->subresource_loader_factory));
   }
   return state->subresource_loader_factory.get();
diff --git a/content/renderer/service_worker/service_worker_subresource_loader.cc b/content/renderer/service_worker/service_worker_subresource_loader.cc
index 05a2446..53309d8b 100644
--- a/content/renderer/service_worker/service_worker_subresource_loader.cc
+++ b/content/renderer/service_worker/service_worker_subresource_loader.cc
@@ -541,12 +541,27 @@
 
 // ServiceWorkerSubresourceLoaderFactory ------------------------------------
 
+// static
+void ServiceWorkerSubresourceLoaderFactory::Create(
+    scoped_refptr<ControllerServiceWorkerConnector> controller_connector,
+    scoped_refptr<network::SharedURLLoaderFactory> network_loader_factory,
+    network::mojom::URLLoaderFactoryRequest request) {
+  new ServiceWorkerSubresourceLoaderFactory(std::move(controller_connector),
+                                            std::move(network_loader_factory),
+                                            std::move(request));
+}
+
 ServiceWorkerSubresourceLoaderFactory::ServiceWorkerSubresourceLoaderFactory(
     scoped_refptr<ControllerServiceWorkerConnector> controller_connector,
-    scoped_refptr<network::SharedURLLoaderFactory> network_loader_factory)
+    scoped_refptr<network::SharedURLLoaderFactory> network_loader_factory,
+    network::mojom::URLLoaderFactoryRequest request)
     : controller_connector_(std::move(controller_connector)),
       network_loader_factory_(std::move(network_loader_factory)) {
   DCHECK(network_loader_factory_);
+  bindings_.AddBinding(this, std::move(request));
+  bindings_.set_connection_error_handler(base::BindRepeating(
+      &ServiceWorkerSubresourceLoaderFactory::OnConnectionError,
+      base::Unretained(this)));
 }
 
 ServiceWorkerSubresourceLoaderFactory::
@@ -572,7 +587,13 @@
 
 void ServiceWorkerSubresourceLoaderFactory::Clone(
     network::mojom::URLLoaderFactoryRequest request) {
-  NOTREACHED();
+  bindings_.AddBinding(this, std::move(request));
+}
+
+void ServiceWorkerSubresourceLoaderFactory::OnConnectionError() {
+  if (!bindings_.empty())
+    return;
+  delete this;
 }
 
 }  // namespace content
diff --git a/content/renderer/service_worker/service_worker_subresource_loader.h b/content/renderer/service_worker/service_worker_subresource_loader.h
index 3bc88bd..464b233 100644
--- a/content/renderer/service_worker/service_worker_subresource_loader.h
+++ b/content/renderer/service_worker/service_worker_subresource_loader.h
@@ -14,6 +14,7 @@
 #include "content/common/service_worker/service_worker_status_code.h"
 #include "content/renderer/service_worker/controller_service_worker_connector.h"
 #include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/binding_set.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 #include "net/url_request/redirect_info.h"
 #include "services/network/public/mojom/url_loader_factory.mojom.h"
@@ -155,6 +156,7 @@
 // S13nServiceWorker:
 // A custom URLLoaderFactory implementation used by Service Worker controllees
 // for loading subresources via the controller Service Worker.
+// Self destroys when no more bindings exist.
 class CONTENT_EXPORT ServiceWorkerSubresourceLoaderFactory
     : public network::mojom::URLLoaderFactory {
  public:
@@ -164,9 +166,10 @@
   // default URLLoaderFactory for network fallback. This should be the
   // URLLoaderFactory that directly goes to network without going through
   // any custom URLLoader factories.
-  ServiceWorkerSubresourceLoaderFactory(
+  static void Create(
       scoped_refptr<ControllerServiceWorkerConnector> controller_connector,
-      scoped_refptr<network::SharedURLLoaderFactory> network_loader_factory);
+      scoped_refptr<network::SharedURLLoaderFactory> network_loader_factory,
+      network::mojom::URLLoaderFactoryRequest request);
 
   ~ServiceWorkerSubresourceLoaderFactory() override;
 
@@ -182,12 +185,21 @@
   void Clone(network::mojom::URLLoaderFactoryRequest request) override;
 
  private:
+  ServiceWorkerSubresourceLoaderFactory(
+      scoped_refptr<ControllerServiceWorkerConnector> controller_connector,
+      scoped_refptr<network::SharedURLLoaderFactory> network_loader_factory,
+      network::mojom::URLLoaderFactoryRequest request);
+
+  void OnConnectionError();
+
   scoped_refptr<ControllerServiceWorkerConnector> controller_connector_;
 
   // A URLLoaderFactory that directly goes to network, used when a request
   // falls back to network.
   scoped_refptr<network::SharedURLLoaderFactory> network_loader_factory_;
 
+  mojo::BindingSet<network::mojom::URLLoaderFactory> bindings_;
+
   DISALLOW_COPY_AND_ASSIGN(ServiceWorkerSubresourceLoaderFactory);
 };
 
diff --git a/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc b/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc
index 023895cc..510ac07 100644
--- a/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc
+++ b/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc
@@ -357,14 +357,16 @@
         std::move(fake_loader_factory));
   }
 
-  std::unique_ptr<ServiceWorkerSubresourceLoaderFactory>
-  CreateSubresourceLoaderFactory() {
+  network::mojom::URLLoaderFactoryPtr CreateSubresourceLoaderFactory() {
     if (!connector_) {
       connector_ = base::MakeRefCounted<ControllerServiceWorkerConnector>(
           &fake_container_host_);
     }
-    return std::make_unique<ServiceWorkerSubresourceLoaderFactory>(
-        connector_, loader_factory_);
+    network::mojom::URLLoaderFactoryPtr service_worker_url_loader_factory;
+    ServiceWorkerSubresourceLoaderFactory::Create(
+        connector_, loader_factory_,
+        mojo::MakeRequest(&service_worker_url_loader_factory));
+    return service_worker_url_loader_factory;
   }
 
   // Starts |request| using |loader_factory| and sets |out_loader| and
@@ -373,7 +375,7 @@
   // completion. Calling fake_controller_->RunUntilFetchEvent() also advances
   // the load to until |fake_controller_| receives the fetch event.
   void StartRequest(
-      ServiceWorkerSubresourceLoaderFactory* loader_factory,
+      const network::mojom::URLLoaderFactoryPtr& loader_factory,
       const network::ResourceRequest& request,
       network::mojom::URLLoaderPtr* out_loader,
       std::unique_ptr<network::TestURLLoaderClient>* out_loader_client) {
@@ -420,7 +422,7 @@
   void RunFallbackWithRequestBodyTest(
       scoped_refptr<network::ResourceRequestBody> request_body,
       const std::string& expected_body) {
-    std::unique_ptr<ServiceWorkerSubresourceLoaderFactory> factory =
+    network::mojom::URLLoaderFactoryPtr factory =
         CreateSubresourceLoaderFactory();
 
     // Create a request with the body.
@@ -436,7 +438,7 @@
     // Perform the request.
     network::mojom::URLLoaderPtr loader;
     std::unique_ptr<network::TestURLLoaderClient> client;
-    StartRequest(factory.get(), request, &loader, &client);
+    StartRequest(factory, request, &loader, &client);
     client->RunUntilComplete();
 
     // Verify that the request body was passed to the fetch event.
@@ -462,13 +464,13 @@
 };
 
 TEST_F(ServiceWorkerSubresourceLoaderTest, Basic) {
-  std::unique_ptr<ServiceWorkerSubresourceLoaderFactory> factory =
+  network::mojom::URLLoaderFactoryPtr factory =
       CreateSubresourceLoaderFactory();
   network::ResourceRequest request =
       CreateRequest(GURL("https://www.example.com/foo.png"));
   network::mojom::URLLoaderPtr loader;
   std::unique_ptr<network::TestURLLoaderClient> client;
-  StartRequest(factory.get(), request, &loader, &client);
+  StartRequest(factory, request, &loader, &client);
   fake_controller_.RunUntilFetchEvent();
 
   EXPECT_EQ(request.url, fake_controller_.fetch_event_request().url);
@@ -480,7 +482,7 @@
 TEST_F(ServiceWorkerSubresourceLoaderTest, Abort) {
   fake_controller_.AbortEventWithNoResponse();
 
-  std::unique_ptr<ServiceWorkerSubresourceLoaderFactory> factory =
+  network::mojom::URLLoaderFactoryPtr factory =
       CreateSubresourceLoaderFactory();
 
   // Perform the request.
@@ -488,21 +490,21 @@
       CreateRequest(GURL("https://www.example.com/foo.png"));
   network::mojom::URLLoaderPtr loader;
   std::unique_ptr<network::TestURLLoaderClient> client;
-  StartRequest(factory.get(), request, &loader, &client);
+  StartRequest(factory, request, &loader, &client);
   client->RunUntilComplete();
 
   EXPECT_EQ(net::ERR_FAILED, client->completion_status().error_code);
 }
 
 TEST_F(ServiceWorkerSubresourceLoaderTest, DropController) {
-  std::unique_ptr<ServiceWorkerSubresourceLoaderFactory> factory =
+  network::mojom::URLLoaderFactoryPtr factory =
       CreateSubresourceLoaderFactory();
   {
     network::ResourceRequest request =
         CreateRequest(GURL("https://www.example.com/foo.png"));
     network::mojom::URLLoaderPtr loader;
     std::unique_ptr<network::TestURLLoaderClient> client;
-    StartRequest(factory.get(), request, &loader, &client);
+    StartRequest(factory, request, &loader, &client);
     fake_controller_.RunUntilFetchEvent();
 
     EXPECT_EQ(request.url, fake_controller_.fetch_event_request().url);
@@ -519,7 +521,7 @@
         CreateRequest(GURL("https://www.example.com/foo2.png"));
     network::mojom::URLLoaderPtr loader;
     std::unique_ptr<network::TestURLLoaderClient> client;
-    StartRequest(factory.get(), request, &loader, &client);
+    StartRequest(factory, request, &loader, &client);
     fake_controller_.RunUntilFetchEvent();
 
     EXPECT_EQ(request.url, fake_controller_.fetch_event_request().url);
@@ -538,7 +540,7 @@
         CreateRequest(GURL("https://www.example.com/foo3.png"));
     network::mojom::URLLoaderPtr loader;
     std::unique_ptr<network::TestURLLoaderClient> client;
-    StartRequest(factory.get(), request, &loader, &client);
+    StartRequest(factory, request, &loader, &client);
     fake_controller_.RunUntilFetchEvent();
 
     EXPECT_EQ(request.url, fake_controller_.fetch_event_request().url);
@@ -549,14 +551,14 @@
 }
 
 TEST_F(ServiceWorkerSubresourceLoaderTest, NoController) {
-  std::unique_ptr<ServiceWorkerSubresourceLoaderFactory> factory =
+  network::mojom::URLLoaderFactoryPtr factory =
       CreateSubresourceLoaderFactory();
   {
     network::ResourceRequest request =
         CreateRequest(GURL("https://www.example.com/foo.png"));
     network::mojom::URLLoaderPtr loader;
     std::unique_ptr<network::TestURLLoaderClient> client;
-    StartRequest(factory.get(), request, &loader, &client);
+    StartRequest(factory, request, &loader, &client);
     fake_controller_.RunUntilFetchEvent();
 
     EXPECT_EQ(request.url, fake_controller_.fetch_event_request().url);
@@ -575,7 +577,7 @@
         CreateRequest(GURL("https://www.example.com/foo2.png"));
     network::mojom::URLLoaderPtr loader;
     std::unique_ptr<network::TestURLLoaderClient> client;
-    StartRequest(factory.get(), request, &loader, &client);
+    StartRequest(factory, request, &loader, &client);
     client->RunUntilComplete();
 
     EXPECT_TRUE(client->has_received_completion());
@@ -587,7 +589,7 @@
 }
 
 TEST_F(ServiceWorkerSubresourceLoaderTest, DropController_RestartFetchEvent) {
-  std::unique_ptr<ServiceWorkerSubresourceLoaderFactory> factory =
+  network::mojom::URLLoaderFactoryPtr factory =
       CreateSubresourceLoaderFactory();
 
   {
@@ -595,7 +597,7 @@
         CreateRequest(GURL("https://www.example.com/foo.png"));
     network::mojom::URLLoaderPtr loader;
     std::unique_ptr<network::TestURLLoaderClient> client;
-    StartRequest(factory.get(), request, &loader, &client);
+    StartRequest(factory, request, &loader, &client);
     fake_controller_.RunUntilFetchEvent();
 
     EXPECT_EQ(request.url, fake_controller_.fetch_event_request().url);
@@ -612,7 +614,7 @@
         CreateRequest(GURL("https://www.example.com/foo2.png"));
     network::mojom::URLLoaderPtr loader;
     std::unique_ptr<network::TestURLLoaderClient> client;
-    StartRequest(factory.get(), request, &loader, &client);
+    StartRequest(factory, request, &loader, &client);
     fake_controller_.RunUntilFetchEvent();
 
     EXPECT_EQ(request.url, fake_controller_.fetch_event_request().url);
@@ -625,7 +627,7 @@
       CreateRequest(GURL("https://www.example.com/foo3.png"));
   network::mojom::URLLoaderPtr loader;
   std::unique_ptr<network::TestURLLoaderClient> client;
-  StartRequest(factory.get(), request, &loader, &client);
+  StartRequest(factory, request, &loader, &client);
 
   // Drop the connection to the ControllerServiceWorker.
   fake_controller_.CloseAllBindings();
@@ -643,13 +645,13 @@
   // Simulate the container host fails to start a service worker.
   fake_container_host_.set_fake_controller(nullptr);
 
-  std::unique_ptr<ServiceWorkerSubresourceLoaderFactory> factory =
+  network::mojom::URLLoaderFactoryPtr factory =
       CreateSubresourceLoaderFactory();
   network::ResourceRequest request =
       CreateRequest(GURL("https://www.example.com/foo.png"));
   network::mojom::URLLoaderPtr loader;
   std::unique_ptr<network::TestURLLoaderClient> client;
-  StartRequest(factory.get(), request, &loader, &client);
+  StartRequest(factory, request, &loader, &client);
 
   // Try to dispatch fetch event to the bad worker.
   base::RunLoop().RunUntilIdle();
@@ -669,7 +671,7 @@
   fake_controller_.RespondWithStream(mojo::MakeRequest(&stream_callback),
                                      std::move(data_pipe.consumer_handle));
 
-  std::unique_ptr<ServiceWorkerSubresourceLoaderFactory> factory =
+  network::mojom::URLLoaderFactoryPtr factory =
       CreateSubresourceLoaderFactory();
 
   // Perform the request.
@@ -677,7 +679,7 @@
       CreateRequest(GURL("https://www.example.com/foo.png"));
   network::mojom::URLLoaderPtr loader;
   std::unique_ptr<network::TestURLLoaderClient> client;
-  StartRequest(factory.get(), request, &loader, &client);
+  StartRequest(factory, request, &loader, &client);
   client->RunUntilResponseReceived();
 
   const network::ResourceResponseHead& info = client->response_head();
@@ -711,7 +713,7 @@
   fake_controller_.RespondWithStream(mojo::MakeRequest(&stream_callback),
                                      std::move(data_pipe.consumer_handle));
 
-  std::unique_ptr<ServiceWorkerSubresourceLoaderFactory> factory =
+  network::mojom::URLLoaderFactoryPtr factory =
       CreateSubresourceLoaderFactory();
 
   // Perform the request.
@@ -719,7 +721,7 @@
       CreateRequest(GURL("https://www.example.com/foo.txt"));
   network::mojom::URLLoaderPtr loader;
   std::unique_ptr<network::TestURLLoaderClient> client;
-  StartRequest(factory.get(), request, &loader, &client);
+  StartRequest(factory, request, &loader, &client);
   client->RunUntilResponseReceived();
 
   const network::ResourceResponseHead& info = client->response_head();
@@ -750,7 +752,7 @@
 TEST_F(ServiceWorkerSubresourceLoaderTest, FallbackResponse) {
   fake_controller_.RespondWithFallback();
 
-  std::unique_ptr<ServiceWorkerSubresourceLoaderFactory> factory =
+  network::mojom::URLLoaderFactoryPtr factory =
       CreateSubresourceLoaderFactory();
 
   // Perform the request.
@@ -758,7 +760,7 @@
       CreateRequest(GURL("https://www.example.com/foo.png"));
   network::mojom::URLLoaderPtr loader;
   std::unique_ptr<network::TestURLLoaderClient> client;
-  StartRequest(factory.get(), request, &loader, &client);
+  StartRequest(factory, request, &loader, &client);
   client->RunUntilComplete();
 
   // OnFallback() should complete the network request using network loader.
@@ -769,7 +771,7 @@
 TEST_F(ServiceWorkerSubresourceLoaderTest, ErrorResponse) {
   fake_controller_.RespondWithError();
 
-  std::unique_ptr<ServiceWorkerSubresourceLoaderFactory> factory =
+  network::mojom::URLLoaderFactoryPtr factory =
       CreateSubresourceLoaderFactory();
 
   // Perform the request.
@@ -777,7 +779,7 @@
       CreateRequest(GURL("https://www.example.com/foo.png"));
   network::mojom::URLLoaderPtr loader;
   std::unique_ptr<network::TestURLLoaderClient> client;
-  StartRequest(factory.get(), request, &loader, &client);
+  StartRequest(factory, request, &loader, &client);
   client->RunUntilComplete();
 
   EXPECT_EQ(net::ERR_FAILED, client->completion_status().error_code);
@@ -786,7 +788,7 @@
 TEST_F(ServiceWorkerSubresourceLoaderTest, RedirectResponse) {
   fake_controller_.RespondWithRedirect("https://www.example.com/bar.png");
 
-  std::unique_ptr<ServiceWorkerSubresourceLoaderFactory> factory =
+  network::mojom::URLLoaderFactoryPtr factory =
       CreateSubresourceLoaderFactory();
 
   // Perform the request.
@@ -794,7 +796,7 @@
       CreateRequest(GURL("https://www.example.com/foo.png"));
   network::mojom::URLLoaderPtr loader;
   std::unique_ptr<network::TestURLLoaderClient> client;
-  StartRequest(factory.get(), request, &loader, &client);
+  StartRequest(factory, request, &loader, &client);
   client->RunUntilRedirectReceived();
 
   EXPECT_EQ(net::OK, client->completion_status().error_code);
@@ -862,7 +864,7 @@
       std::string("https://www.example.com/redirect_") +
       base::IntToString(count);
   fake_controller_.RespondWithRedirect(redirect_location);
-  std::unique_ptr<ServiceWorkerSubresourceLoaderFactory> factory =
+  network::mojom::URLLoaderFactoryPtr factory =
       CreateSubresourceLoaderFactory();
 
   // Perform the request.
@@ -870,7 +872,7 @@
       CreateRequest(GURL("https://www.example.com/foo.png"));
   network::mojom::URLLoaderPtr loader;
   std::unique_ptr<network::TestURLLoaderClient> client;
-  StartRequest(factory.get(), request, &loader, &client);
+  StartRequest(factory, request, &loader, &client);
 
   // The Fetch spec says: "If request’s redirect count is twenty, return a
   // network error." https://fetch.spec.whatwg.org/#http-redirect-fetch
@@ -907,7 +909,7 @@
 TEST_F(ServiceWorkerSubresourceLoaderTest, CORSFallbackResponse) {
   fake_controller_.RespondWithFallback();
 
-  std::unique_ptr<ServiceWorkerSubresourceLoaderFactory> factory =
+  network::mojom::URLLoaderFactoryPtr factory =
       CreateSubresourceLoaderFactory();
 
   struct TestCase {
@@ -961,7 +963,7 @@
     request.request_initiator = test.request_initiator;
     network::mojom::URLLoaderPtr loader;
     std::unique_ptr<network::TestURLLoaderClient> client;
-    StartRequest(factory.get(), request, &loader, &client);
+    StartRequest(factory, request, &loader, &client);
     client->RunUntilResponseReceived();
 
     const network::ResourceResponseHead& info = client->response_head();
diff --git a/content/renderer/service_worker/worker_fetch_context_impl.cc b/content/renderer/service_worker/worker_fetch_context_impl.cc
index 87b8e59..77a5224 100644
--- a/content/renderer/service_worker/worker_fetch_context_impl.cc
+++ b/content/renderer/service_worker/worker_fetch_context_impl.cc
@@ -297,11 +297,10 @@
     return;
   }
   network::mojom::URLLoaderFactoryPtr service_worker_url_loader_factory;
-  mojo::MakeStrongBinding(
-      std::make_unique<ServiceWorkerSubresourceLoaderFactory>(
-          base::MakeRefCounted<ControllerServiceWorkerConnector>(
-              service_worker_container_host_.get()),
-          direct_network_loader_factory_),
+  ServiceWorkerSubresourceLoaderFactory::Create(
+      base::MakeRefCounted<ControllerServiceWorkerConnector>(
+          service_worker_container_host_.get()),
+      direct_network_loader_factory_,
       mojo::MakeRequest(&service_worker_url_loader_factory));
   url_loader_factory_->SetServiceWorkerURLLoaderFactory(
       std::move(service_worker_url_loader_factory));
diff --git a/content/shell/app/shell_main_delegate.cc b/content/shell/app/shell_main_delegate.cc
index 4ff4b8d..934bfb6 100644
--- a/content/shell/app/shell_main_delegate.cc
+++ b/content/shell/app/shell_main_delegate.cc
@@ -227,6 +227,7 @@
                                    "MAP *.test 127.0.0.1");
 
     command_line.AppendSwitch(switches::kEnablePartialRaster);
+    command_line.AppendSwitch(switches::kEnableWebAuthTestingAPI);
 
     if (!command_line.HasSwitch(switches::kForceGpuRasterization) &&
         !command_line.HasSwitch(switches::kEnableGpuRasterization)) {
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 35386c5..3cfe3421 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -1272,8 +1272,6 @@
     "../browser/download/download_item_impl_unittest.cc",
     "../browser/download/download_manager_impl_unittest.cc",
     "../browser/download/download_request_core_unittest.cc",
-    "../browser/download/parallel_download_job_unittest.cc",
-    "../browser/download/parallel_download_utils_unittest.cc",
     "../browser/download/save_package_unittest.cc",
     "../browser/fileapi/browser_file_system_helper_unittest.cc",
     "../browser/fileapi/file_system_operation_runner_unittest.cc",
diff --git a/content/test/data/htxg/README b/content/test/data/htxg/README
index 607c0ef..605e9b7 100644
--- a/content/test/data/htxg/README
+++ b/content/test/data/htxg/README
@@ -9,20 +9,11 @@
  [2] https://github.com/nyaxt/webpackage
  [3] https://jyasskin.github.io/webpackage/implementation-draft/draft-yasskin-httpbis-origin-signed-exchanges-impl.html
 
-# Download the webpackage repository
-go get -d github.com/WICG/webpackage/go/signedexchange
-
-# Switch to the fork repository
-cd ${GOPATH:-~/go}/src/github.com/WICG/webpackage
-git remote add impl https://github.com/nyaxt/webpackage.git
-git fetch impl master
-git checkout -b impl impl/master
-
 # Install gen-certurl command
-go get github.com/WICG/webpackage/go/signedexchange/cmd/gen-certurl
+go get github.com/nyaxt/webpackage/go/signedexchange/cmd/gen-certurl
 
 # Install gen-signedexchange command
-go get github.com/WICG/webpackage/go/signedexchange/cmd/gen-signedexchange
+go get github.com/nyaxt/webpackage/go/signedexchange/cmd/gen-signedexchange
 
 
 # Get the private key of "*.example.org".
diff --git a/content/test/data/media/getusermedia.html b/content/test/data/media/getusermedia.html
index d6b19a3..805a1ee 100644
--- a/content/test/data/media/getusermedia.html
+++ b/content/test/data/media/getusermedia.html
@@ -599,7 +599,7 @@
         var big_stream = new MediaStream();
         big_stream.addTrack(canvas_stream.getVideoTracks()[0]);
         big_stream.addTrack(gum_stream.getVideoTracks()[0]);
-        video.onprogress = function() {
+        video.onloadedmetadata = function() {
           assertEquals(canvas_width, video.videoWidth);
           assertEquals(canvas_height, video.videoHeight);
           assertNotEquals(video.videoWidth, gum_width)
@@ -753,7 +753,7 @@
     var video = document.createElement('video');
     video.autoplay = true;
     assertEquals(video.srcObject, null);
-    video.onprogress = () => {
+    video.onloadedmetadata = () => {
       assertEquals(video.videoWidth, canvas_width);
       assertEquals(video.videoHeight, canvas_height);
       var new_width = canvas_width - 1;
diff --git a/device/bluetooth/BUILD.gn b/device/bluetooth/BUILD.gn
index 3d888d36..8e253ca 100644
--- a/device/bluetooth/BUILD.gn
+++ b/device/bluetooth/BUILD.gn
@@ -394,7 +394,28 @@
       }
       deps += [ "//dbus" ]
     } else {  # !use_dbus
-      sources += [ "bluetooth_adapter_stub.cc" ]
+      if (is_chromecast && is_linux) {
+        sources += [
+          "cast/bluetooth_adapter_cast.cc",
+          "cast/bluetooth_adapter_cast.h",
+          "cast/bluetooth_device_cast.cc",
+          "cast/bluetooth_device_cast.h",
+          "cast/bluetooth_remote_gatt_characteristic_cast.cc",
+          "cast/bluetooth_remote_gatt_characteristic_cast.h",
+          "cast/bluetooth_remote_gatt_descriptor_cast.cc",
+          "cast/bluetooth_remote_gatt_descriptor_cast.h",
+          "cast/bluetooth_remote_gatt_service_cast.cc",
+          "cast/bluetooth_remote_gatt_service_cast.h",
+        ]
+
+        deps += [
+          "//chromecast/device/bluetooth:util",
+          "//chromecast/device/bluetooth/le",
+        ]
+      } else {
+        sources += [ "bluetooth_adapter_stub.cc" ]
+      }
+
       if (is_linux) {
         defines += [ "LINUX_WITHOUT_DBUS" ]
         sources += [
diff --git a/device/bluetooth/cast/DEPS b/device/bluetooth/cast/DEPS
new file mode 100644
index 0000000..5ee2eca
--- /dev/null
+++ b/device/bluetooth/cast/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+chromecast/device/bluetooth"
+]
diff --git a/device/bluetooth/cast/bluetooth_adapter_cast.cc b/device/bluetooth/cast/bluetooth_adapter_cast.cc
new file mode 100644
index 0000000..ae47064
--- /dev/null
+++ b/device/bluetooth/cast/bluetooth_adapter_cast.cc
@@ -0,0 +1,414 @@
+// Copyright 2018 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 "device/bluetooth/cast/bluetooth_adapter_cast.h"
+
+#include "base/bind.h"
+#include "base/location.h"
+#include "base/task_scheduler/post_task.h"
+#include "base/threading/sequenced_task_runner_handle.h"
+#include "chromecast/device/bluetooth/bluetooth_util.h"
+#include "chromecast/device/bluetooth/le/gatt_client_manager.h"
+#include "chromecast/device/bluetooth/le/le_scan_manager.h"
+#include "chromecast/device/bluetooth/le/remote_device.h"
+#include "device/bluetooth/bluetooth_device.h"
+#include "device/bluetooth/bluetooth_discovery_session_outcome.h"
+#include "device/bluetooth/cast/bluetooth_device_cast.h"
+
+namespace device {
+namespace {
+
+// The classes in //device/bluetooth expect addresses to be in the canonical
+// format: "AA:BB:CC:DD:EE:FF". Use this utility whenever an address from the
+// Cast stack is converted.
+std::string GetCanonicalAddress(
+    const chromecast::bluetooth_v2_shlib::Addr& addr) {
+  return BluetoothDevice::CanonicalizeAddress(
+      chromecast::bluetooth::util::AddrToString(addr));
+}
+
+}  // namespace
+
+BluetoothAdapterCast::BluetoothAdapterCast(
+    chromecast::bluetooth::GattClientManager* gatt_client_manager,
+    chromecast::bluetooth::LeScanManager* le_scan_manager)
+    : gatt_client_manager_(gatt_client_manager),
+      le_scan_manager_(le_scan_manager),
+      weak_factory_(this) {
+  DCHECK(gatt_client_manager_);
+  DCHECK(le_scan_manager_);
+  gatt_client_manager_->AddObserver(this);
+  le_scan_manager_->AddObserver(this);
+}
+
+BluetoothAdapterCast::~BluetoothAdapterCast() {
+  gatt_client_manager_->RemoveObserver(this);
+  le_scan_manager_->RemoveObserver(this);
+}
+
+std::string BluetoothAdapterCast::GetAddress() const {
+  // TODO(slan|bcf): Right now, we aren't surfacing the address of the GATT
+  // client to the caller, because there is no apparent need and this
+  // information is potentially PII. Implement this when it's needed.
+  return std::string();
+}
+
+std::string BluetoothAdapterCast::GetName() const {
+  return name_;
+}
+
+void BluetoothAdapterCast::SetName(const std::string& name,
+                                   const base::Closure& callback,
+                                   const ErrorCallback& error_callback) {
+  name_ = name;
+  callback.Run();
+}
+
+bool BluetoothAdapterCast::IsInitialized() const {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  return initialized_;
+}
+
+bool BluetoothAdapterCast::IsPresent() const {
+  // The BluetoothAdapter is always present on Cast devices.
+  return true;
+}
+
+bool BluetoothAdapterCast::IsPowered() const {
+  // The BluetoothAdapter is always powered on Cast devices.
+  return true;
+}
+
+void BluetoothAdapterCast::SetPowered(bool powered,
+                                      const base::Closure& callback,
+                                      const ErrorCallback& error_callback) {
+  // This class cannot change the powered state of the BT stack. Assume that it
+  // is always powered.
+  if (powered) {
+    callback.Run();
+  } else {
+    LOG(ERROR) << "Cannot change the powered state of the BT stack.";
+    error_callback.Run();
+  }
+}
+
+bool BluetoothAdapterCast::IsDiscoverable() const {
+  VLOG(2) << __func__ << " GATT server mode not supported";
+  return false;
+}
+
+void BluetoothAdapterCast::SetDiscoverable(
+    bool discoverable,
+    const base::Closure& callback,
+    const ErrorCallback& error_callback) {
+  NOTIMPLEMENTED() << __func__ << " GATT server mode not supported";
+  error_callback.Run();
+}
+
+bool BluetoothAdapterCast::IsDiscovering() const {
+  return true;
+}
+
+BluetoothAdapter::UUIDList BluetoothAdapterCast::GetUUIDs() const {
+  NOTIMPLEMENTED() << __func__ << " GATT server mode not supported";
+  return UUIDList();
+}
+
+void BluetoothAdapterCast::CreateRfcommService(
+    const BluetoothUUID& uuid,
+    const ServiceOptions& options,
+    const CreateServiceCallback& callback,
+    const CreateServiceErrorCallback& error_callback) {
+  NOTIMPLEMENTED() << __func__ << " GATT server mode not supported";
+  error_callback.Run("Not Implemented");
+}
+
+void BluetoothAdapterCast::CreateL2capService(
+    const BluetoothUUID& uuid,
+    const ServiceOptions& options,
+    const CreateServiceCallback& callback,
+    const CreateServiceErrorCallback& error_callback) {
+  NOTIMPLEMENTED() << __func__ << " GATT server mode not supported";
+  error_callback.Run("Not Implemented");
+}
+
+void BluetoothAdapterCast::RegisterAdvertisement(
+    std::unique_ptr<BluetoothAdvertisement::Data> advertisement_data,
+    const CreateAdvertisementCallback& callback,
+    const AdvertisementErrorCallback& error_callback) {
+  NOTIMPLEMENTED() << __func__ << " GATT server mode not supported";
+  error_callback.Run(BluetoothAdvertisement::ERROR_UNSUPPORTED_PLATFORM);
+}
+
+void BluetoothAdapterCast::SetAdvertisingInterval(
+    const base::TimeDelta& min,
+    const base::TimeDelta& max,
+    const base::Closure& callback,
+    const AdvertisementErrorCallback& error_callback) {
+  NOTIMPLEMENTED() << __func__ << " GATT server mode not supported";
+  error_callback.Run(BluetoothAdvertisement::ERROR_UNSUPPORTED_PLATFORM);
+}
+
+void BluetoothAdapterCast::ResetAdvertising(
+    const base::Closure& callback,
+    const AdvertisementErrorCallback& error_callback) {
+  NOTIMPLEMENTED() << __func__ << " GATT server mode not supported";
+  error_callback.Run(BluetoothAdvertisement::ERROR_UNSUPPORTED_PLATFORM);
+}
+
+BluetoothLocalGattService* BluetoothAdapterCast::GetGattService(
+    const std::string& identifier) const {
+  NOTIMPLEMENTED() << __func__ << " GATT server mode not supported";
+  return nullptr;
+}
+
+bool BluetoothAdapterCast::SetPoweredImpl(bool powered) {
+  NOTREACHED() << "This method is not invoked when SetPowered() is overridden.";
+  return true;
+}
+
+void BluetoothAdapterCast::AddDiscoverySession(
+    BluetoothDiscoveryFilter* discovery_filter,
+    const base::Closure& callback,
+    const DiscoverySessionErrorCallback& error_callback) {
+  // TODO(slan): Implement this or properly stub.
+  NOTIMPLEMENTED();
+  error_callback.Run(UMABluetoothDiscoverySessionOutcome::NOT_IMPLEMENTED);
+}
+
+void BluetoothAdapterCast::RemoveDiscoverySession(
+    BluetoothDiscoveryFilter* discovery_filter,
+    const base::Closure& callback,
+    const DiscoverySessionErrorCallback& error_callback) {
+  // TODO(slan): Implement this or properly stub.
+  NOTIMPLEMENTED();
+  error_callback.Run(UMABluetoothDiscoverySessionOutcome::NOT_IMPLEMENTED);
+}
+
+void BluetoothAdapterCast::SetDiscoveryFilter(
+    std::unique_ptr<BluetoothDiscoveryFilter> discovery_filter,
+    const base::Closure& callback,
+    const DiscoverySessionErrorCallback& error_callback) {
+  // TODO(slan): Implement this or properly stub.
+  NOTIMPLEMENTED();
+  error_callback.Run(UMABluetoothDiscoverySessionOutcome::NOT_IMPLEMENTED);
+}
+
+void BluetoothAdapterCast::RemovePairingDelegateInternal(
+    BluetoothDevice::PairingDelegate* pairing_delegate) {
+  // TODO(slan): Implement this or properly stub.
+  NOTIMPLEMENTED();
+}
+
+void BluetoothAdapterCast::OnConnectChanged(
+    scoped_refptr<chromecast::bluetooth::RemoteDevice> device,
+    bool connected) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  auto address = GetCanonicalAddress(device->addr());
+  VLOG(1) << __func__ << " " << address << " connected: " << connected;
+
+  // This method could be called before this device is detected in a scan and
+  // GetDevice() is called. Add it if needed.
+  if (devices_.find(address) == devices_.end())
+    AddDevice(std::move(device));
+
+  BluetoothDeviceCast* cast_device = GetCastDevice(address);
+  cast_device->SetConnected(connected);
+}
+
+void BluetoothAdapterCast::OnMtuChanged(
+    scoped_refptr<chromecast::bluetooth::RemoteDevice> device,
+    int mtu) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  DVLOG(3) << __func__ << " " << GetCanonicalAddress(device->addr())
+           << " mtu: " << mtu;
+}
+
+void BluetoothAdapterCast::OnServicesUpdated(
+    scoped_refptr<chromecast::bluetooth::RemoteDevice> device,
+    std::vector<scoped_refptr<chromecast::bluetooth::RemoteService>> services) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  auto it = devices_.find(GetCanonicalAddress(device->addr()));
+  if (it == devices_.end())
+    return;
+  it->second->SetGattServicesDiscoveryComplete(true);
+}
+
+void BluetoothAdapterCast::OnCharacteristicNotification(
+    scoped_refptr<chromecast::bluetooth::RemoteDevice> device,
+    scoped_refptr<chromecast::bluetooth::RemoteCharacteristic> characteristic,
+    std::vector<uint8_t> value) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  DVLOG(1) << __func__ << " " << GetCanonicalAddress(device->addr())
+           << " updated.";
+
+  // TODO(slan): Add an Observer interface to RemoteCharacteristc so this can be
+  // wired directly to the BluetoothRemoteGattCharacteristicCast proxy, rather
+  // than by performing a search of the services on device for |characteristc|.
+  NOTIMPLEMENTED();
+}
+
+void BluetoothAdapterCast::OnNewScanResult(
+    chromecast::bluetooth::LeScanManager::ScanResult result) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  auto address = GetCanonicalAddress(result.addr);
+
+  // If we haven't created a BluetoothDeviceCast for this address yet, we need
+  // to send an async request to |gatt_client_manager_| for a handle to the
+  // device.
+  if (devices_.find(address) == devices_.end()) {
+    // Only send a request if this is the first time we've seen this |address|
+    // in a scan. This may happen if we pick up additional GAP advertisements
+    // while the first request is in-flight.
+    if (pending_scan_results_.find(address) == pending_scan_results_.end()) {
+      gatt_client_manager_->GetDevice(
+          result.addr, base::BindOnce(&BluetoothAdapterCast::OnGetDevice,
+                                      weak_factory_.GetWeakPtr()));
+    }
+
+    // These results will be used to construct the BluetoothDeviceCast.
+    pending_scan_results_[address].push_back(result);
+    return;
+  }
+
+  // Update the device with the ScanResult.
+  BluetoothDeviceCast* device = GetCastDevice(address);
+  if (device->UpdateWithScanResult(result)) {
+    for (auto& observer : observers_)
+      observer.DeviceChanged(this, device);
+  }
+}
+
+void BluetoothAdapterCast::OnScanEnableChanged(bool enabled) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  scan_enabled_ = enabled;
+  if (enabled)
+    return;
+
+  // This is called when the state of |le_scan_manager_| changes. If it has been
+  // disabled suddenly, log a warning.
+  // TODO(slan): We may need to re-enable this on requestDevice() calls.
+  LOG(WARNING) << "BLE scan has been disabled!";
+}
+
+BluetoothDeviceCast* BluetoothAdapterCast::GetCastDevice(
+    const std::string& address) {
+  return static_cast<BluetoothDeviceCast*>(devices_[address].get());
+}
+
+void BluetoothAdapterCast::AddDevice(
+    scoped_refptr<chromecast::bluetooth::RemoteDevice> remote_device) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  // This method should not be called if we already have a BluetoothDeviceCast
+  // registered for this device.
+  auto address = GetCanonicalAddress(remote_device->addr());
+  DCHECK(devices_.find(address) == devices_.end());
+
+  devices_[address] =
+      std::make_unique<BluetoothDeviceCast>(this, remote_device);
+  BluetoothDeviceCast* device = GetCastDevice(address);
+
+  const auto scan_results = std::move(pending_scan_results_[address]);
+  pending_scan_results_.erase(address);
+
+  // Update the device with the ScanResults.
+  for (const auto& result : scan_results)
+    device->UpdateWithScanResult(result);
+
+  // Update the observers of the new device.
+  for (auto& observer : observers_)
+    observer.DeviceAdded(this, device);
+}
+
+void BluetoothAdapterCast::OnScanEnabled(bool enabled) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  if (!enabled) {
+    LOG(WARNING) << "Failed to start scan.";
+    // TODO(slan): Retry the scan after some amount of time.
+    return;
+  }
+
+  scan_enabled_ = true;
+  le_scan_manager_->GetScanResults(base::BindOnce(
+      &BluetoothAdapterCast::OnGetScanResults, weak_factory_.GetWeakPtr()));
+}
+
+void BluetoothAdapterCast::OnGetDevice(
+    scoped_refptr<chromecast::bluetooth::RemoteDevice> remote_device) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  auto address = GetCanonicalAddress(remote_device->addr());
+
+  // This callback could run before or after the device becomes connected and
+  // OnConnectChanged() is called for a particular device. If that happened,
+  // |remote_device| already has a handle. In this case, there should be no
+  // |pending_scan_results_| and we should fast-return.
+  if (devices_.find(address) != devices_.end()) {
+    DCHECK(pending_scan_results_.find(address) == pending_scan_results_.end());
+    return;
+  }
+
+  // If there is not a device already, there should be at least one ScanResult
+  // which triggered the GetDevice() call.
+  DCHECK(pending_scan_results_.find(address) != pending_scan_results_.end());
+  AddDevice(std::move(remote_device));
+}
+
+void BluetoothAdapterCast::OnGetScanResults(
+    std::vector<chromecast::bluetooth::LeScanManager::ScanResult> results) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  for (auto& result : results)
+    OnNewScanResult(result);
+}
+
+void BluetoothAdapterCast::InitializeAsynchronously(InitCallback callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  initialized_ = true;
+  le_scan_manager_->SetScanEnable(
+      true, base::BindOnce(&BluetoothAdapterCast::OnScanEnabled,
+                           weak_factory_.GetWeakPtr()));
+
+  // Subsequent calls will get the scan results.
+  std::move(callback).Run();
+}
+
+// static
+base::WeakPtr<BluetoothAdapter> BluetoothAdapterCast::Create(
+    InitCallback callback) {
+  // TODO(slan): We need to figure out how to get these classes properly.
+  chromecast::bluetooth::GattClientManager* gatt_client_manager = nullptr;
+  chromecast::bluetooth::LeScanManager* le_scan_manager = nullptr;
+
+  // TODO(slan): Consider life-cycle management. Currently this just leaks.
+  auto* adapter =
+      new BluetoothAdapterCast(gatt_client_manager, le_scan_manager);
+  base::WeakPtr<BluetoothAdapterCast> weak_ptr =
+      adapter->weak_factory_.GetWeakPtr();
+
+  // BluetoothAdapterFactory assumes that |init_callback| will be called
+  // asynchronously the first time, and that IsInitialized() will return false.
+  // Post init_callback to this sequence so that it gets called back later.
+  base::SequencedTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE, base::BindOnce(&BluetoothAdapterCast::InitializeAsynchronously,
+                                weak_ptr, std::move(callback)));
+  return weak_ptr;
+}
+
+// static
+base::WeakPtr<BluetoothAdapter> BluetoothAdapter::CreateAdapter(
+    const InitCallback& init_callback) {
+  return BluetoothAdapterCast::Create(std::move(init_callback));
+}
+
+}  // namespace device
diff --git a/device/bluetooth/cast/bluetooth_adapter_cast.h b/device/bluetooth/cast/bluetooth_adapter_cast.h
new file mode 100644
index 0000000..58bc596
--- /dev/null
+++ b/device/bluetooth/cast/bluetooth_adapter_cast.h
@@ -0,0 +1,167 @@
+// Copyright 2018 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 DEVICE_BLUETOOTH_CAST_BLUETOOTH_ADAPTER_CAST_H_
+#define DEVICE_BLUETOOTH_CAST_BLUETOOTH_ADAPTER_CAST_H_
+
+#include <map>
+#include <string>
+#include <vector>
+
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
+#include "base/sequence_checker.h"
+#include "chromecast/device/bluetooth/le/gatt_client_manager.h"
+#include "chromecast/device/bluetooth/le/le_scan_manager.h"
+#include "device/bluetooth/bluetooth_adapter.h"
+
+namespace device {
+
+class BluetoothDeviceCast;
+
+// This class allows callers to discover, connect to, and interact with remote
+// BLE peripherals. Upon creation, it scans for devices and observes the Cast
+// bluetooth stack for events in remote BLE peripherals. This class does not
+// support functionality needed only for Bluetooth Classic. It also does not
+// act as a GATT server.
+//
+// THREADING
+// This class is created and called on a single thread. It makes aysnchronous
+// calls to the Cast bluetooth stack, which may live on another thread. Unless
+// noted otherwise, callbacks will always be posted on the calling thread.
+class BluetoothAdapterCast : public BluetoothAdapter,
+                             chromecast::bluetooth::GattClientManager::Observer,
+                             chromecast::bluetooth::LeScanManager::Observer {
+ public:
+  // BluetoothAdapter implementation:
+  std::string GetAddress() const override;
+  std::string GetName() const override;
+  void SetName(const std::string& name,
+               const base::Closure& callback,
+               const ErrorCallback& error_callback) override;
+  bool IsInitialized() const override;
+  bool IsPresent() const override;
+  bool IsPowered() const override;
+  void SetPowered(bool powered,
+                  const base::Closure& callback,
+                  const ErrorCallback& error_callback) override;
+  bool IsDiscoverable() const override;
+  void SetDiscoverable(bool discoverable,
+                       const base::Closure& callback,
+                       const ErrorCallback& error_callback) override;
+  bool IsDiscovering() const override;
+  UUIDList GetUUIDs() const override;
+  void CreateRfcommService(
+      const BluetoothUUID& uuid,
+      const ServiceOptions& options,
+      const CreateServiceCallback& callback,
+      const CreateServiceErrorCallback& error_callback) override;
+  void CreateL2capService(
+      const BluetoothUUID& uuid,
+      const ServiceOptions& options,
+      const CreateServiceCallback& callback,
+      const CreateServiceErrorCallback& error_callback) override;
+  void RegisterAdvertisement(
+      std::unique_ptr<BluetoothAdvertisement::Data> advertisement_data,
+      const CreateAdvertisementCallback& callback,
+      const AdvertisementErrorCallback& error_callback) override;
+  void SetAdvertisingInterval(
+      const base::TimeDelta& min,
+      const base::TimeDelta& max,
+      const base::Closure& callback,
+      const AdvertisementErrorCallback& error_callback) override;
+  void ResetAdvertising(
+      const base::Closure& callback,
+      const AdvertisementErrorCallback& error_callback) override;
+  BluetoothLocalGattService* GetGattService(
+      const std::string& identifier) const override;
+  bool SetPoweredImpl(bool powered) override;
+  void AddDiscoverySession(
+      BluetoothDiscoveryFilter* discovery_filter,
+      const base::Closure& callback,
+      const DiscoverySessionErrorCallback& error_callback) override;
+  void RemoveDiscoverySession(
+      BluetoothDiscoveryFilter* discovery_filter,
+      const base::Closure& callback,
+      const DiscoverySessionErrorCallback& error_callback) override;
+  void SetDiscoveryFilter(
+      std::unique_ptr<BluetoothDiscoveryFilter> discovery_filter,
+      const base::Closure& callback,
+      const DiscoverySessionErrorCallback& error_callback) override;
+  void RemovePairingDelegateInternal(
+      BluetoothDevice::PairingDelegate* pairing_delegate) override;
+
+  // Creates a BluetoothAdapterCast. |callback| will be executed asynchronously
+  // on the calling sequence.
+  static base::WeakPtr<BluetoothAdapter> Create(InitCallback callback);
+
+ private:
+  // Neither |gatt_client_manager| nor |le_scan_manager| are owned by this
+  // class. Both must outlive |this|.
+  BluetoothAdapterCast(
+      chromecast::bluetooth::GattClientManager* gatt_client_manager,
+      chromecast::bluetooth::LeScanManager* le_scan_manager);
+  ~BluetoothAdapterCast() override;
+
+  // chromecast::bluetooth::GattClientManager::Observer implementation:
+  void OnConnectChanged(
+      scoped_refptr<chromecast::bluetooth::RemoteDevice> device,
+      bool connected) override;
+  void OnMtuChanged(scoped_refptr<chromecast::bluetooth::RemoteDevice> device,
+                    int mtu) override;
+  void OnServicesUpdated(
+      scoped_refptr<chromecast::bluetooth::RemoteDevice> device,
+      std::vector<scoped_refptr<chromecast::bluetooth::RemoteService>> services)
+      override;
+  void OnCharacteristicNotification(
+      scoped_refptr<chromecast::bluetooth::RemoteDevice> device,
+      scoped_refptr<chromecast::bluetooth::RemoteCharacteristic> characteristic,
+      std::vector<uint8_t> value) override;
+
+  // chromecast::bluetooth::LeScanManager::Observer implementation:
+  void OnNewScanResult(
+      chromecast::bluetooth::LeScanManager::ScanResult) override;
+  void OnScanEnableChanged(bool enabled) override;
+
+  // Helper method to access |devices_| as BluetoothDeviceCast*.
+  BluetoothDeviceCast* GetCastDevice(const std::string& address);
+
+  // Runs |callback|. After this method returns, |this| is initialized. This
+  // must run on the same sequence on which |this| is created.
+  void InitializeAsynchronously(InitCallback callback);
+
+  // Creates a BluetoothDeviceCast for |remote_device|, adds it to |devices_|,
+  // and updates observers.
+  void AddDevice(
+      scoped_refptr<chromecast::bluetooth::RemoteDevice> remote_device);
+
+  // Called when the scanner has enabled scanning.
+  void OnScanEnabled(bool success);
+  void OnGetDevice(scoped_refptr<chromecast::bluetooth::RemoteDevice> device);
+  void OnGetScanResults(
+      std::vector<chromecast::bluetooth::LeScanManager::ScanResult> results);
+
+  // Maps address to ScanResults received from |le_scan_manager_|.
+  std::map<std::string,
+           std::list<chromecast::bluetooth::LeScanManager::ScanResult>>
+      pending_scan_results_;
+
+  chromecast::bluetooth::GattClientManager* const gatt_client_manager_;
+  chromecast::bluetooth::LeScanManager* const le_scan_manager_;
+
+  bool initialized_ = false;
+  bool scan_enabled_ = false;
+
+  std::string name_;
+
+  SEQUENCE_CHECKER(sequence_checker_);
+  base::WeakPtrFactory<BluetoothAdapterCast> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(BluetoothAdapterCast);
+};
+
+}  // namespace device
+
+#endif  // DEVICE_BLUETOOTH_CAST_BLUETOOTH_ADAPTER_CAST_H_
\ No newline at end of file
diff --git a/device/bluetooth/cast/bluetooth_device_cast.cc b/device/bluetooth/cast/bluetooth_device_cast.cc
new file mode 100644
index 0000000..6817ed3
--- /dev/null
+++ b/device/bluetooth/cast/bluetooth_device_cast.cc
@@ -0,0 +1,304 @@
+// Copyright 2018 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 "device/bluetooth/cast/bluetooth_device_cast.h"
+
+#include "base/strings/stringprintf.h"
+#include "chromecast/device/bluetooth/bluetooth_util.h"
+
+namespace device {
+namespace {
+
+// BluetoothUUID expects uuids in this format.
+const char kServiceUuid128BitFormat[] =
+    "%02hhx%02hhx%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx-"
+    "%02hhx%02hhx-%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx";
+
+// http://www.argenox.com/bluetooth-low-energy-ble-v4-0-development/library/a-ble-advertising-primer.
+const uint8_t kComplete128BitServiceUuids = 0x07;
+
+BluetoothDevice::UUIDSet ExtractServiceUuids(
+    const chromecast::bluetooth::LeScanManager::ScanResult& result,
+    const std::string& debug_name) {
+  BluetoothDevice::UUIDSet uuids;
+
+  // Handle 128-bit UUIDs.
+  // TODO(slan): Parse more services.
+  auto it = result.type_to_data.find(kComplete128BitServiceUuids);
+  if (it != result.type_to_data.end()) {
+    // Iterate through this data in 16-byte chunks.
+    const auto& data = it->second;
+    for (size_t i = 0; i < data.size(); i += 16) {
+      auto raw = base::StringPrintf(
+          kServiceUuid128BitFormat, data[i + 15], data[i + 14], data[i + 13],
+          data[i + 12], data[i + 11], data[i + 10], data[i + 9], data[i + 8],
+          data[i + 7], data[i + 6], data[i + 5], data[i + 4], data[i + 3],
+          data[i + 2], data[i + 1], data[i + 0]);
+      BluetoothUUID uuid(raw);
+      LOG_IF(ERROR, !uuid.IsValid()) << raw << " is not a valid uuid.";
+
+      uuids.insert(std::move(uuid));
+    }
+  }
+  return uuids;
+}
+
+}  // namespace
+
+BluetoothDeviceCast::BluetoothDeviceCast(
+    BluetoothAdapter* adapter,
+    scoped_refptr<chromecast::bluetooth::RemoteDevice> device)
+    : BluetoothDevice(adapter),
+      remote_device_(std::move(device)),
+      address_(CanonicalizeAddress(
+          chromecast::bluetooth::util::AddrToString(remote_device_->addr()))),
+      weak_factory_(this) {}
+
+BluetoothDeviceCast::~BluetoothDeviceCast() {}
+
+uint32_t BluetoothDeviceCast::GetBluetoothClass() const {
+  return 0;
+}
+
+BluetoothTransport BluetoothDeviceCast::GetType() const {
+  return BLUETOOTH_TRANSPORT_LE;
+}
+
+std::string BluetoothDeviceCast::GetAddress() const {
+  return address_;
+}
+
+BluetoothDevice::VendorIDSource BluetoothDeviceCast::GetVendorIDSource() const {
+  return VENDOR_ID_UNKNOWN;
+}
+
+uint16_t BluetoothDeviceCast::GetVendorID() const {
+  return 0;
+}
+
+uint16_t BluetoothDeviceCast::GetProductID() const {
+  return 0;
+}
+
+uint16_t BluetoothDeviceCast::GetDeviceID() const {
+  return 0;
+}
+
+uint16_t BluetoothDeviceCast::GetAppearance() const {
+  return 0;
+}
+
+base::Optional<std::string> BluetoothDeviceCast::GetName() const {
+  return name_;
+}
+
+bool BluetoothDeviceCast::IsPaired() const {
+  return false;
+}
+
+bool BluetoothDeviceCast::IsConnected() const {
+  return connected_;
+}
+
+bool BluetoothDeviceCast::IsGattConnected() const {
+  return IsConnected();
+}
+
+bool BluetoothDeviceCast::IsConnectable() const {
+  NOTREACHED() << "This is only called on ChromeOS";
+  return true;
+}
+
+bool BluetoothDeviceCast::IsConnecting() const {
+  return pending_connect_;
+}
+
+BluetoothDevice::UUIDSet BluetoothDeviceCast::GetUUIDs() const {
+  // TODO(slan): Remove if we do not need this.
+  return BluetoothDevice::GetUUIDs();
+}
+
+base::Optional<int8_t> BluetoothDeviceCast::GetInquiryRSSI() const {
+  // TODO(slan): Plumb this from the type_to_data field of ScanResult.
+  return BluetoothDevice::GetInquiryRSSI();
+}
+
+base::Optional<int8_t> BluetoothDeviceCast::GetInquiryTxPower() const {
+  // TODO(slan): Remove if we do not need this.
+  return BluetoothDevice::GetInquiryTxPower();
+}
+
+bool BluetoothDeviceCast::ExpectingPinCode() const {
+  // TODO(slan): Implement this or rely on lower layers to do so.
+  NOTIMPLEMENTED();
+  return false;
+}
+
+bool BluetoothDeviceCast::ExpectingPasskey() const {
+  NOTIMPLEMENTED() << "Only BLE functionality is supported.";
+  return false;
+}
+
+bool BluetoothDeviceCast::ExpectingConfirmation() const {
+  NOTIMPLEMENTED() << "Only BLE functionality is supported.";
+  return false;
+}
+
+void BluetoothDeviceCast::GetConnectionInfo(
+    const ConnectionInfoCallback& callback) {
+  // TODO(slan): Implement this?
+  NOTIMPLEMENTED();
+}
+
+void BluetoothDeviceCast::SetConnectionLatency(
+    ConnectionLatency connection_latency,
+    const base::Closure& callback,
+    const ErrorCallback& error_callback) {
+  // TODO(slan): This many be needed for some high-performance BLE devices.
+  NOTIMPLEMENTED();
+  error_callback.Run();
+}
+
+void BluetoothDeviceCast::Connect(PairingDelegate* pairing_delegate,
+                                  const base::Closure& callback,
+                                  const ConnectErrorCallback& error_callback) {
+  // This method is used only for Bluetooth classic.
+  NOTIMPLEMENTED() << __func__ << " Only BLE functionality is supported.";
+  error_callback.Run(BluetoothDevice::ERROR_UNSUPPORTED_DEVICE);
+}
+
+void BluetoothDeviceCast::Pair(PairingDelegate* pairing_delegate,
+                               const base::Closure& callback,
+                               const ConnectErrorCallback& error_callback) {
+  // TODO(slan): Implement this or delegate to lower level.
+  NOTIMPLEMENTED();
+  error_callback.Run(BluetoothDevice::ERROR_UNSUPPORTED_DEVICE);
+}
+
+void BluetoothDeviceCast::SetPinCode(const std::string& pincode) {
+  NOTREACHED() << "Pairing not supported.";
+}
+
+void BluetoothDeviceCast::SetPasskey(uint32_t passkey) {
+  NOTREACHED() << "Pairing not supported.";
+}
+
+void BluetoothDeviceCast::ConfirmPairing() {
+  NOTREACHED() << "Pairing not supported.";
+}
+
+// Rejects a pairing or connection request from a remote device.
+void BluetoothDeviceCast::RejectPairing() {
+  NOTREACHED() << "Pairing not supported.";
+}
+
+void BluetoothDeviceCast::CancelPairing() {
+  NOTREACHED() << "Pairing not supported.";
+}
+
+void BluetoothDeviceCast::Disconnect(const base::Closure& callback,
+                                     const ErrorCallback& error_callback) {
+  // This method is used only for Bluetooth classic.
+  NOTIMPLEMENTED() << __func__ << " Only BLE functionality is supported.";
+  error_callback.Run();
+}
+
+void BluetoothDeviceCast::Forget(const base::Closure& callback,
+                                 const ErrorCallback& error_callback) {
+  NOTIMPLEMENTED() << __func__ << " Only BLE functionality is supported.";
+  error_callback.Run();
+}
+
+void BluetoothDeviceCast::ConnectToService(
+    const BluetoothUUID& uuid,
+    const ConnectToServiceCallback& callback,
+    const ConnectToServiceErrorCallback& error_callback) {
+  NOTIMPLEMENTED() << __func__ << " GATT server mode not supported";
+  error_callback.Run("Not Implemented");
+}
+
+void BluetoothDeviceCast::ConnectToServiceInsecurely(
+    const device::BluetoothUUID& uuid,
+    const ConnectToServiceCallback& callback,
+    const ConnectToServiceErrorCallback& error_callback) {
+  NOTIMPLEMENTED() << __func__ << " GATT server mode not supported";
+  error_callback.Run("Not Implemented");
+}
+
+bool BluetoothDeviceCast::UpdateWithScanResult(
+    const chromecast::bluetooth::LeScanManager::ScanResult& result) {
+  bool changed = false;
+
+  // Advertisements for the same device can use different names. For now, the
+  // last name wins.
+  // TODO(slan): Make sure that this doesn't spam us with name changes.
+  if (!name_ || result.name != *name_) {
+    changed = true;
+    name_ = result.name;
+  }
+
+  // Replace |device_uuids_| with newly advertised services. Currently this just
+  // replaces them, but depending on what we see in the field, we may need to
+  // take the union here instead. Note that this would require eviction of stale
+  // services, preferably from the LeScanManager.
+  // TODO(slan): Think about whether this is needed.
+  UUIDSet prev_uuids = device_uuids_.GetUUIDs();
+  UUIDSet new_uuids = ExtractServiceUuids(result, *GetName());
+  if (prev_uuids != new_uuids) {
+    device_uuids_.ReplaceAdvertisedUUIDs(
+        UUIDList(new_uuids.begin(), new_uuids.end()));
+    changed = true;
+  }
+
+  return changed;
+}
+
+bool BluetoothDeviceCast::SetConnected(bool connected) {
+  DVLOG(2) << __func__ << " connected: " << connected;
+  bool changed = false;
+  if (!connected_ && connected) {
+    DidConnectGatt();
+    changed = true;
+  } else if (connected_ && !connected) {
+    DidDisconnectGatt();
+    changed = true;
+  }
+
+  connected_ = connected;
+  return changed;
+}
+
+void BluetoothDeviceCast::CreateGattConnectionImpl() {
+  if (pending_connect_)
+    return;
+  pending_connect_ = true;
+  remote_device_->Connect(base::BindOnce(&BluetoothDeviceCast::OnConnect,
+                                         weak_factory_.GetWeakPtr()));
+}
+
+void BluetoothDeviceCast::DisconnectGatt() {
+  if (pending_disconnect_)
+    return;
+  pending_disconnect_ = true;
+  remote_device_->Disconnect(base::BindOnce(&BluetoothDeviceCast::OnDisconnect,
+                                            weak_factory_.GetWeakPtr()));
+}
+
+void BluetoothDeviceCast::OnConnect(bool success) {
+  pending_connect_ = false;
+  if (success)
+    SetConnected(true);
+  else
+    DidFailToConnectGatt(ERROR_FAILED);
+}
+
+void BluetoothDeviceCast::OnDisconnect(bool success) {
+  pending_disconnect_ = false;
+  if (success)
+    SetConnected(false);
+  else
+    LOG(ERROR) << "Request to DisconnectGatt() failed!";
+}
+
+}  // namespace device
diff --git a/device/bluetooth/cast/bluetooth_device_cast.h b/device/bluetooth/cast/bluetooth_device_cast.h
new file mode 100644
index 0000000..8d205bb1
--- /dev/null
+++ b/device/bluetooth/cast/bluetooth_device_cast.h
@@ -0,0 +1,131 @@
+// Copyright 2018 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 DEVICE_BLUETOOTH_CAST_BLUETOOTH_DEVICE_CAST_H_
+#define DEVICE_BLUETOOTH_CAST_BLUETOOTH_DEVICE_CAST_H_
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "base/callback.h"
+#include "base/gtest_prod_util.h"
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/optional.h"
+#include "base/strings/string16.h"
+#include "build/build_config.h"
+#include "chromecast/device/bluetooth/le/gatt_client_manager.h"
+#include "chromecast/device/bluetooth/le/le_scan_manager.h"
+#include "chromecast/device/bluetooth/le/remote_device.h"
+#include "device/bluetooth/bluetooth_device.h"
+#include "device/bluetooth/bluetooth_remote_gatt_service.h"
+#include "device/bluetooth/bluetooth_uuid.h"
+
+namespace device {
+
+class BluetoothDeviceCast : public BluetoothDevice {
+ public:
+  BluetoothDeviceCast(
+      BluetoothAdapter* adapter,
+      scoped_refptr<chromecast::bluetooth::RemoteDevice> device);
+  ~BluetoothDeviceCast() override;
+
+  // BluetoothDevice implementation:
+  uint32_t GetBluetoothClass() const override;
+  BluetoothTransport GetType() const override;
+  std::string GetAddress() const override;
+  VendorIDSource GetVendorIDSource() const override;
+  uint16_t GetVendorID() const override;
+  uint16_t GetProductID() const override;
+  uint16_t GetDeviceID() const override;
+  uint16_t GetAppearance() const override;
+  base::Optional<std::string> GetName() const override;
+  bool IsPaired() const override;
+  bool IsConnected() const override;
+  bool IsGattConnected() const override;
+  bool IsConnectable() const override;
+  bool IsConnecting() const override;
+  UUIDSet GetUUIDs() const override;
+  base::Optional<int8_t> GetInquiryRSSI() const override;
+  base::Optional<int8_t> GetInquiryTxPower() const override;
+  bool ExpectingPinCode() const override;
+  bool ExpectingPasskey() const override;
+  bool ExpectingConfirmation() const override;
+  void GetConnectionInfo(const ConnectionInfoCallback& callback) override;
+  void SetConnectionLatency(ConnectionLatency connection_latency,
+                            const base::Closure& callback,
+                            const ErrorCallback& error_callback) override;
+  void Connect(PairingDelegate* pairing_delegate,
+               const base::Closure& callback,
+               const ConnectErrorCallback& error_callback) override;
+  void Pair(PairingDelegate* pairing_delegate,
+            const base::Closure& callback,
+            const ConnectErrorCallback& error_callback) override;
+  void SetPinCode(const std::string& pincode) override;
+  void SetPasskey(uint32_t passkey) override;
+  void ConfirmPairing() override;
+  void RejectPairing() override;
+  void CancelPairing() override;
+  void Disconnect(const base::Closure& callback,
+                  const ErrorCallback& error_callback) override;
+  void Forget(const base::Closure& callback,
+              const ErrorCallback& error_callback) override;
+  void ConnectToService(
+      const BluetoothUUID& uuid,
+      const ConnectToServiceCallback& callback,
+      const ConnectToServiceErrorCallback& error_callback) override;
+  void ConnectToServiceInsecurely(
+      const device::BluetoothUUID& uuid,
+      const ConnectToServiceCallback& callback,
+      const ConnectToServiceErrorCallback& error_callback) override;
+
+  // Called by BluetoothAdapterCast to update the device to reflect the
+  // information obtained from a scan. Returns true if the device changed as a
+  // result.
+  bool UpdateWithScanResult(
+      const chromecast::bluetooth::LeScanManager::ScanResult& result);
+
+  // Called by BluetoothAdapterCast when the connection state changes, and
+  // by OnConnect() and OnDisconnect() when asynchronous requests return. Calls
+  // DisConnectGatt() or DidDisconnectGatt() as needed. Returns true if the
+  // connection state changed as a result.
+  bool SetConnected(bool connected);
+
+ private:
+  // Implements platform specific operations to initiate a GATT connection.
+  // Subclasses must also call DidConnectGatt, DidFailToConnectGatt, or
+  // DidDisconnectGatt immediately or asynchronously as the connection state
+  // changes.
+  void CreateGattConnectionImpl() override;
+
+  // Disconnects GATT connection on platforms that maintain a specific GATT
+  // connection.
+  void DisconnectGatt() override;
+
+  // Called back from connect requests generated from CreateGattConnectionImpl.
+  void OnConnect(bool success);
+
+  // Called back from disconnect requests.
+  void OnDisconnect(bool success);
+
+  bool connected_ = false;
+  bool pending_connect_ = false;
+  bool pending_disconnect_ = false;
+
+  const scoped_refptr<chromecast::bluetooth::RemoteDevice> remote_device_;
+  const std::string address_;
+  base::Optional<std::string> name_;
+
+  base::WeakPtrFactory<BluetoothDeviceCast> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(BluetoothDeviceCast);
+};
+
+}  // namespace device
+
+#endif  // DEVICE_BLUETOOTH_CAST_BLUETOOTH_DEVICE_CAST_H_
\ No newline at end of file
diff --git a/device/bluetooth/cast/bluetooth_remote_gatt_characteristic_cast.cc b/device/bluetooth/cast/bluetooth_remote_gatt_characteristic_cast.cc
new file mode 100644
index 0000000..e055b46
--- /dev/null
+++ b/device/bluetooth/cast/bluetooth_remote_gatt_characteristic_cast.cc
@@ -0,0 +1,186 @@
+// Copyright 2018 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 "device/bluetooth/cast/bluetooth_remote_gatt_characteristic_cast.h"
+
+#include "base/callback.h"
+#include "base/callback_forward.h"
+#include "base/containers/queue.h"
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "chromecast/device/bluetooth/bluetooth_util.h"
+#include "chromecast/device/bluetooth/le/remote_characteristic.h"
+#include "chromecast/device/bluetooth/le/remote_descriptor.h"
+#include "device/bluetooth/bluetooth_uuid.h"
+#include "device/bluetooth/cast/bluetooth_remote_gatt_descriptor_cast.h"
+#include "device/bluetooth/cast/bluetooth_remote_gatt_service_cast.h"
+
+namespace device {
+namespace {
+
+// Called back when subscribing or unsubscribing to a remote characteristic.
+// If |success| is true, run |callback|. Otherwise run |error_callback|.
+void OnSubscribeOrUnsubscribe(
+    const base::Closure& callback,
+    const BluetoothGattCharacteristic::ErrorCallback& error_callback,
+    bool success) {
+  if (success)
+    callback.Run();
+  else
+    error_callback.Run(BluetoothGattService::GATT_ERROR_FAILED);
+}
+
+}  // namespace
+
+BluetoothRemoteGattCharacteristicCast::BluetoothRemoteGattCharacteristicCast(
+    BluetoothRemoteGattServiceCast* service,
+    scoped_refptr<chromecast::bluetooth::RemoteCharacteristic> characteristic)
+    : service_(service),
+      remote_characteristic_(std::move(characteristic)),
+      weak_factory_(this) {
+  auto descriptors = remote_characteristic_->GetDescriptors();
+  descriptors_.reserve(descriptors.size());
+  for (const auto& descriptor : descriptors) {
+    descriptors_.push_back(
+        std::make_unique<BluetoothRemoteGattDescriptorCast>(this, descriptor));
+  }
+}
+
+BluetoothRemoteGattCharacteristicCast::
+    ~BluetoothRemoteGattCharacteristicCast() {}
+
+std::string BluetoothRemoteGattCharacteristicCast::GetIdentifier() const {
+  return chromecast::bluetooth::util::UuidToString(
+      remote_characteristic_->uuid());
+}
+
+BluetoothUUID BluetoothRemoteGattCharacteristicCast::GetUUID() const {
+  return BluetoothUUID(chromecast::bluetooth::util::UuidToString(
+      remote_characteristic_->uuid()));
+}
+
+BluetoothGattCharacteristic::Properties
+BluetoothRemoteGattCharacteristicCast::GetProperties() const {
+  // TODO(slan): Convert these from
+  // bluetooth_v2_shlib::Characteristic::properties.
+  NOTIMPLEMENTED();
+  return Properties();
+}
+
+BluetoothGattCharacteristic::Permissions
+BluetoothRemoteGattCharacteristicCast::GetPermissions() const {
+  // TODO(slan): Convert these from
+  // bluetooth_v2_shlib::Characteristic::permissions.
+  NOTIMPLEMENTED();
+  return Permissions();
+}
+
+const std::vector<uint8_t>& BluetoothRemoteGattCharacteristicCast::GetValue()
+    const {
+  return value_;
+}
+
+BluetoothRemoteGattService* BluetoothRemoteGattCharacteristicCast::GetService()
+    const {
+  return service_;
+}
+
+std::vector<BluetoothRemoteGattDescriptor*>
+BluetoothRemoteGattCharacteristicCast::GetDescriptors() const {
+  std::vector<BluetoothRemoteGattDescriptor*> descriptors;
+  descriptors.reserve(descriptors_.size());
+  for (auto& descriptor : descriptors_) {
+    descriptors.push_back(descriptor.get());
+  }
+  return descriptors;
+}
+
+BluetoothRemoteGattDescriptor*
+BluetoothRemoteGattCharacteristicCast::GetDescriptor(
+    const std::string& identifier) const {
+  for (auto& descriptor : descriptors_) {
+    if (descriptor->GetIdentifier() == identifier) {
+      return descriptor.get();
+    }
+  }
+  return nullptr;
+}
+
+void BluetoothRemoteGattCharacteristicCast::ReadRemoteCharacteristic(
+    const ValueCallback& callback,
+    const ErrorCallback& error_callback) {
+  remote_characteristic_->Read(base::BindOnce(
+      &BluetoothRemoteGattCharacteristicCast::OnReadRemoteCharacteristic,
+      weak_factory_.GetWeakPtr(), callback, error_callback));
+}
+
+void BluetoothRemoteGattCharacteristicCast::WriteRemoteCharacteristic(
+    const std::vector<uint8_t>& value,
+    const base::Closure& callback,
+    const ErrorCallback& error_callback) {
+  remote_characteristic_->Write(
+      chromecast::bluetooth_v2_shlib::Gatt::WriteType::WRITE_TYPE_DEFAULT,
+      value,
+      base::BindOnce(
+          &BluetoothRemoteGattCharacteristicCast::OnWriteRemoteCharacteristic,
+          weak_factory_.GetWeakPtr(), value, callback, error_callback));
+}
+
+void BluetoothRemoteGattCharacteristicCast::SubscribeToNotifications(
+    BluetoothRemoteGattDescriptor* ccc_descriptor,
+    const base::Closure& callback,
+    const ErrorCallback& error_callback) {
+  // |remote_characteristic_| exposes a method which writes the CCCD after
+  // subscribing the GATT client to the notification. This is syntactically
+  // nicer and saves us a thread-hop, so we can ignore |ccc_descriptor| for now.
+  (void)ccc_descriptor;
+
+  remote_characteristic_->SetRegisterNotification(
+      true,
+      base::BindOnce(&OnSubscribeOrUnsubscribe, callback, error_callback));
+}
+
+void BluetoothRemoteGattCharacteristicCast::UnsubscribeFromNotifications(
+    BluetoothRemoteGattDescriptor* ccc_descriptor,
+    const base::Closure& callback,
+    const ErrorCallback& error_callback) {
+  // |remote_characteristic_| exposes a method which writes the CCCD after
+  // subscribing the GATT client to the notification. This is syntactically
+  // nicer and saves us a thread-hop, so we can ignore |ccc_descriptor| for now.
+  (void)ccc_descriptor;
+
+  // TODO(slan|bcf): Should we actually be using SetRegisterNotification() here
+  // to unset the CCCD bit on the peripheral? What does the standard say?
+  remote_characteristic_->SetNotification(
+      false,
+      base::BindOnce(&OnSubscribeOrUnsubscribe, callback, error_callback));
+}
+
+void BluetoothRemoteGattCharacteristicCast::OnReadRemoteCharacteristic(
+    const ValueCallback& callback,
+    const ErrorCallback& error_callback,
+    bool success,
+    const std::vector<uint8_t>& result) {
+  if (success) {
+    value_ = result;
+    callback.Run(result);
+    return;
+  }
+  error_callback.Run(BluetoothGattService::GATT_ERROR_FAILED);
+}
+
+void BluetoothRemoteGattCharacteristicCast::OnWriteRemoteCharacteristic(
+    const std::vector<uint8_t>& written_value,
+    const base::Closure& callback,
+    const ErrorCallback& error_callback,
+    bool success) {
+  if (success) {
+    value_ = written_value;
+    callback.Run();
+    return;
+  }
+  error_callback.Run(BluetoothGattService::GATT_ERROR_FAILED);
+}
+
+}  // namespace device
diff --git a/device/bluetooth/cast/bluetooth_remote_gatt_characteristic_cast.h b/device/bluetooth/cast/bluetooth_remote_gatt_characteristic_cast.h
new file mode 100644
index 0000000..f521770
--- /dev/null
+++ b/device/bluetooth/cast/bluetooth_remote_gatt_characteristic_cast.h
@@ -0,0 +1,103 @@
+// Copyright 2018 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 DEVICE_BLUETOOTH_CAST_BLUETOOTH_REMOTE_GATT_CHARACTERISTIC_CAST_H_
+#define DEVICE_BLUETOOTH_CAST_BLUETOOTH_REMOTE_GATT_CHARACTERISTIC_CAST_H_
+
+#include <stdint.h>
+
+#include <set>
+#include <string>
+#include <vector>
+
+#include "base/callback.h"
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "device/bluetooth/bluetooth_remote_gatt_characteristic.h"
+
+namespace chromecast {
+namespace bluetooth {
+class RemoteCharacteristic;
+}  // namespace bluetooth
+}  // namespace chromecast
+
+namespace device {
+
+class BluetoothRemoteGattDescriptorCast;
+class BluetoothRemoteGattServiceCast;
+
+class BluetoothRemoteGattCharacteristicCast
+    : public BluetoothRemoteGattCharacteristic {
+ public:
+  BluetoothRemoteGattCharacteristicCast(
+      BluetoothRemoteGattServiceCast* service,
+      scoped_refptr<chromecast::bluetooth::RemoteCharacteristic>
+          characteristic);
+  ~BluetoothRemoteGattCharacteristicCast() override;
+
+  // BluetoothGattCharacteristic implementation:
+  std::string GetIdentifier() const override;
+  BluetoothUUID GetUUID() const override;
+  Properties GetProperties() const override;
+  Permissions GetPermissions() const override;
+
+  // BluetoothRemoteGattCharacteristic implementation:
+  const std::vector<uint8_t>& GetValue() const override;
+  BluetoothRemoteGattService* GetService() const override;
+  std::vector<BluetoothRemoteGattDescriptor*> GetDescriptors() const override;
+  BluetoothRemoteGattDescriptor* GetDescriptor(
+      const std::string& identifier) const override;
+  void ReadRemoteCharacteristic(const ValueCallback& callback,
+                                const ErrorCallback& error_callback) override;
+  void WriteRemoteCharacteristic(const std::vector<uint8_t>& value,
+                                 const base::Closure& callback,
+                                 const ErrorCallback& error_callback) override;
+
+  // Called by BluetoothAdapterCast to set the value when a new notification
+  // comes in.
+  void SetValue(const std::vector<uint8_t>& value) { value_ = value; }
+
+ private:
+  // BluetoothRemoteGattCharacteristic implementation:
+  void SubscribeToNotifications(BluetoothRemoteGattDescriptor* ccc_descriptor,
+                                const base::Closure& callback,
+                                const ErrorCallback& error_callback) override;
+  void UnsubscribeFromNotifications(
+      BluetoothRemoteGattDescriptor* ccc_descriptor,
+      const base::Closure& callback,
+      const ErrorCallback& error_callback) override;
+
+  // Called when the remote characteristic has been read or the operation has
+  // failed. If the former, |success| will be true, and |result| will be
+  // valid. In this case, |value_| is updated and |callback| is run with
+  // |result|. If |success| is false, |result| is ignored and |error_callback|
+  // is run.
+  void OnReadRemoteCharacteristic(const ValueCallback& callback,
+                                  const ErrorCallback& error_callback,
+                                  bool success,
+                                  const std::vector<uint8_t>& result);
+
+  // Called back when the remote characteristic has been written or the
+  // operation has failed. Each of the parameters corresponds to a parameter to
+  // WriteRemoteDescriptor(), and |success| is true if the write was successful.
+  // If successful, |value_| will be updated.
+  void OnWriteRemoteCharacteristic(const std::vector<uint8_t>& written_value,
+                                   const base::Closure& callback,
+                                   const ErrorCallback& error_callback,
+                                   bool success);
+
+  BluetoothRemoteGattServiceCast* const service_;
+  scoped_refptr<chromecast::bluetooth::RemoteCharacteristic>
+      remote_characteristic_;
+  std::vector<uint8_t> value_;
+
+  std::vector<std::unique_ptr<BluetoothRemoteGattDescriptorCast>> descriptors_;
+  base::WeakPtrFactory<BluetoothRemoteGattCharacteristicCast> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(BluetoothRemoteGattCharacteristicCast);
+};
+
+}  // namespace device
+
+#endif  // DEVICE_BLUETOOTH_CAST_BLUETOOTH_REMOTE_GATT_CHARACTERISTIC_CAST_H_
\ No newline at end of file
diff --git a/device/bluetooth/cast/bluetooth_remote_gatt_descriptor_cast.cc b/device/bluetooth/cast/bluetooth_remote_gatt_descriptor_cast.cc
new file mode 100644
index 0000000..f4505c5
--- /dev/null
+++ b/device/bluetooth/cast/bluetooth_remote_gatt_descriptor_cast.cc
@@ -0,0 +1,98 @@
+// Copyright 2018 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 "device/bluetooth/cast/bluetooth_remote_gatt_descriptor_cast.h"
+
+#include <stdint.h>
+#include <vector>
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "chromecast/device/bluetooth/bluetooth_util.h"
+#include "chromecast/device/bluetooth/le/remote_descriptor.h"
+#include "device/bluetooth/bluetooth_gatt_service.h"
+#include "device/bluetooth/cast/bluetooth_remote_gatt_characteristic_cast.h"
+
+namespace device {
+
+BluetoothRemoteGattDescriptorCast::BluetoothRemoteGattDescriptorCast(
+    BluetoothRemoteGattCharacteristicCast* characteristic,
+    scoped_refptr<chromecast::bluetooth::RemoteDescriptor> remote_descriptor)
+    : characteristic_(characteristic),
+      remote_descriptor_(remote_descriptor),
+      weak_factory_(this) {}
+
+BluetoothRemoteGattDescriptorCast::~BluetoothRemoteGattDescriptorCast() {}
+
+std::string BluetoothRemoteGattDescriptorCast::GetIdentifier() const {
+  return chromecast::bluetooth::util::UuidToString(remote_descriptor_->uuid());
+}
+
+BluetoothUUID BluetoothRemoteGattDescriptorCast::GetUUID() const {
+  return BluetoothUUID(
+      chromecast::bluetooth::util::UuidToString(remote_descriptor_->uuid()));
+}
+
+BluetoothGattCharacteristic::Permissions
+BluetoothRemoteGattDescriptorCast::GetPermissions() const {
+  NOTIMPLEMENTED();
+  return BluetoothGattCharacteristic::Permissions();
+}
+
+const std::vector<uint8_t>& BluetoothRemoteGattDescriptorCast::GetValue()
+    const {
+  return value_;
+}
+
+BluetoothRemoteGattCharacteristic*
+BluetoothRemoteGattDescriptorCast::GetCharacteristic() const {
+  return characteristic_;
+}
+
+void BluetoothRemoteGattDescriptorCast::ReadRemoteDescriptor(
+    const ValueCallback& callback,
+    const ErrorCallback& error_callback) {
+  remote_descriptor_->Read(
+      base::BindOnce(&BluetoothRemoteGattDescriptorCast::OnReadRemoteDescriptor,
+                     weak_factory_.GetWeakPtr(), callback, error_callback));
+}
+
+void BluetoothRemoteGattDescriptorCast::WriteRemoteDescriptor(
+    const std::vector<uint8_t>& new_value,
+    const base::Closure& callback,
+    const ErrorCallback& error_callback) {
+  remote_descriptor_->Write(
+      new_value,
+      base::BindOnce(
+          &BluetoothRemoteGattDescriptorCast::OnWriteRemoteDescriptor,
+          weak_factory_.GetWeakPtr(), new_value, callback, error_callback));
+}
+
+void BluetoothRemoteGattDescriptorCast::OnReadRemoteDescriptor(
+    const ValueCallback& callback,
+    const ErrorCallback& error_callback,
+    bool success,
+    const std::vector<uint8_t>& result) {
+  if (success) {
+    value_ = result;
+    callback.Run(result);
+    return;
+  }
+  error_callback.Run(BluetoothGattService::GATT_ERROR_FAILED);
+}
+
+void BluetoothRemoteGattDescriptorCast::OnWriteRemoteDescriptor(
+    const std::vector<uint8_t>& written_value,
+    const base::Closure& callback,
+    const ErrorCallback& error_callback,
+    bool success) {
+  if (success) {
+    value_ = written_value;
+    callback.Run();
+    return;
+  }
+  error_callback.Run(BluetoothGattService::GATT_ERROR_FAILED);
+}
+
+}  // namespace device
diff --git a/device/bluetooth/cast/bluetooth_remote_gatt_descriptor_cast.h b/device/bluetooth/cast/bluetooth_remote_gatt_descriptor_cast.h
new file mode 100644
index 0000000..0c74564
--- /dev/null
+++ b/device/bluetooth/cast/bluetooth_remote_gatt_descriptor_cast.h
@@ -0,0 +1,79 @@
+// Copyright 2018 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 DEVICE_BLUETOOTH_CAST_BLUETOOTH_REMOTE_GATT_DESCRIPTOR_CAST_H_
+#define DEVICE_BLUETOOTH_CAST_BLUETOOTH_REMOTE_GATT_DESCRIPTOR_CAST_H_
+
+#include <stdint.h>
+
+#include <vector>
+
+#include "base/callback.h"
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
+#include "device/bluetooth/bluetooth_remote_gatt_descriptor.h"
+
+namespace chromecast {
+namespace bluetooth {
+class RemoteDescriptor;
+}  // namespace bluetooth
+}  // namespace chromecast
+
+namespace device {
+
+class BluetoothRemoteGattCharacteristicCast;
+
+class BluetoothRemoteGattDescriptorCast : public BluetoothRemoteGattDescriptor {
+ public:
+  BluetoothRemoteGattDescriptorCast(
+      BluetoothRemoteGattCharacteristicCast* characteristic,
+      scoped_refptr<chromecast::bluetooth::RemoteDescriptor> remote_descriptor);
+  ~BluetoothRemoteGattDescriptorCast() override;
+
+  // BluetoothGattDescriptor implementation:
+  std::string GetIdentifier() const override;
+  BluetoothUUID GetUUID() const override;
+  BluetoothGattCharacteristic::Permissions GetPermissions() const override;
+
+  // BluetoothRemoteGattDescriptor implementation:
+  const std::vector<uint8_t>& GetValue() const override;
+  BluetoothRemoteGattCharacteristic* GetCharacteristic() const override;
+  void ReadRemoteDescriptor(const ValueCallback& callback,
+                            const ErrorCallback& error_callback) override;
+  void WriteRemoteDescriptor(const std::vector<uint8_t>& new_value,
+                             const base::Closure& callback,
+                             const ErrorCallback& error_callback) override;
+
+ private:
+  // Called when the remote descriptor has been read or the operation has
+  // failed. If the former, |success| will be true, and |result| will be
+  // valid. In this case, |value_| is updated and |callback| is run with
+  // |result|. If |success| is false, |result| is ignored and |error_callback|
+  // is run.
+  void OnReadRemoteDescriptor(const ValueCallback& callback,
+                              const ErrorCallback& error_callback,
+                              bool success,
+                              const std::vector<uint8_t>& result);
+
+  // Called back when the remote descriptor has been written or the operation
+  // has failed. Each of the parameters corresponds to a parameter to
+  // WriteRemoteDescriptor(), and |success| is true if the write was successful.
+  // If successful, |value_| will be updated.
+  void OnWriteRemoteDescriptor(const std::vector<uint8_t>& written_value,
+                               const base::Closure& callback,
+                               const ErrorCallback& error_callback,
+                               bool success);
+
+  BluetoothRemoteGattCharacteristicCast* const characteristic_;
+  scoped_refptr<chromecast::bluetooth::RemoteDescriptor> remote_descriptor_;
+  std::vector<uint8_t> value_;
+
+  base::WeakPtrFactory<BluetoothRemoteGattDescriptorCast> weak_factory_;
+  DISALLOW_COPY_AND_ASSIGN(BluetoothRemoteGattDescriptorCast);
+};
+
+}  // namespace device
+
+#endif  // DEVICE_BLUETOOTH_CAST_BLUETOOTH_REMOTE_GATT_DESCRIPTOR_CAST_H_
\ No newline at end of file
diff --git a/device/bluetooth/cast/bluetooth_remote_gatt_service_cast.cc b/device/bluetooth/cast/bluetooth_remote_gatt_service_cast.cc
new file mode 100644
index 0000000..e5d5e794
--- /dev/null
+++ b/device/bluetooth/cast/bluetooth_remote_gatt_service_cast.cc
@@ -0,0 +1,86 @@
+// Copyright 2018 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 "device/bluetooth/cast/bluetooth_remote_gatt_service_cast.h"
+
+#include <string>
+#include <vector>
+
+#include "base/bind.h"
+#include "chromecast/device/bluetooth/bluetooth_util.h"
+#include "chromecast/device/bluetooth/le/remote_characteristic.h"
+#include "chromecast/device/bluetooth/le/remote_service.h"
+#include "device/bluetooth/cast/bluetooth_device_cast.h"
+#include "device/bluetooth/cast/bluetooth_remote_gatt_characteristic_cast.h"
+
+namespace device {
+
+BluetoothRemoteGattServiceCast::BluetoothRemoteGattServiceCast(
+    BluetoothDeviceCast* device,
+    scoped_refptr<chromecast::bluetooth::RemoteService> remote_service)
+    : device_(device),
+      remote_service_(std::move(remote_service)),
+      weak_factory_(this) {
+  remote_service_->GetCharacteristics(
+      base::BindOnce(&BluetoothRemoteGattServiceCast::OnGetCharacteristics,
+                     weak_factory_.GetWeakPtr()));
+}
+
+BluetoothRemoteGattServiceCast::~BluetoothRemoteGattServiceCast() {}
+
+std::string BluetoothRemoteGattServiceCast::GetIdentifier() const {
+  return chromecast::bluetooth::util::UuidToString(remote_service_->uuid());
+}
+
+BluetoothUUID BluetoothRemoteGattServiceCast::GetUUID() const {
+  return BluetoothUUID(
+      chromecast::bluetooth::util::UuidToString(remote_service_->uuid()));
+}
+
+bool BluetoothRemoteGattServiceCast::IsPrimary() const {
+  return remote_service_->primary();
+};
+
+BluetoothDevice* BluetoothRemoteGattServiceCast::GetDevice() const {
+  return device_;
+}
+
+std::vector<BluetoothRemoteGattCharacteristic*>
+BluetoothRemoteGattServiceCast::GetCharacteristics() const {
+  std::vector<BluetoothRemoteGattCharacteristic*> results;
+  results.reserve(characteristics_.size());
+  for (auto& characteristic : characteristics_)
+    results.push_back(characteristic.get());
+  return results;
+}
+
+std::vector<BluetoothRemoteGattService*>
+BluetoothRemoteGattServiceCast::GetIncludedServices() const {
+  NOTIMPLEMENTED();
+  return std::vector<BluetoothRemoteGattService*>();
+}
+
+BluetoothRemoteGattCharacteristic*
+BluetoothRemoteGattServiceCast::GetCharacteristic(
+    const std::string& identifier) const {
+  for (auto& characteristic : characteristics_) {
+    if (characteristic->GetIdentifier() == identifier)
+      return characteristic.get();
+  }
+  return nullptr;
+}
+
+void BluetoothRemoteGattServiceCast::OnGetCharacteristics(
+    std::vector<scoped_refptr<chromecast::bluetooth::RemoteCharacteristic>>
+        characteristics) {
+  characteristics_.reserve(characteristics.size());
+  for (auto& characteristic : characteristics) {
+    characteristics_.push_back(
+        std::make_unique<BluetoothRemoteGattCharacteristicCast>(
+            this, characteristic));
+  }
+  SetDiscoveryComplete(true);
+}
+
+}  // namespace device
diff --git a/device/bluetooth/cast/bluetooth_remote_gatt_service_cast.h b/device/bluetooth/cast/bluetooth_remote_gatt_service_cast.h
new file mode 100644
index 0000000..bca752b
--- /dev/null
+++ b/device/bluetooth/cast/bluetooth_remote_gatt_service_cast.h
@@ -0,0 +1,67 @@
+// Copyright 2018 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 DEVICE_BLUETOOTH_CAST_BLUETOOTH_REMOTE_GATT_SERVICE_CAST_H_
+#define DEVICE_BLUETOOTH_CAST_BLUETOOTH_REMOTE_GATT_SERVICE_CAST_H_
+
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
+#include "device/bluetooth/bluetooth_remote_gatt_service.h"
+
+namespace chromecast {
+namespace bluetooth {
+class RemoteCharacteristic;
+class RemoteService;
+}  // namespace bluetooth
+}  // namespace chromecast
+
+namespace device {
+
+class BluetoothDeviceCast;
+class BluetoothRemoteGattCharacteristicCast;
+
+class BluetoothRemoteGattServiceCast : public BluetoothRemoteGattService {
+ public:
+  BluetoothRemoteGattServiceCast(
+      BluetoothDeviceCast* device,
+      scoped_refptr<chromecast::bluetooth::RemoteService> remote_service);
+  ~BluetoothRemoteGattServiceCast() override;
+
+  // BluetoothGattService implementation:
+  std::string GetIdentifier() const override;
+  BluetoothUUID GetUUID() const override;
+  bool IsPrimary() const override;
+
+  // BluetoothRemoteGattService implementation:
+  BluetoothDevice* GetDevice() const override;
+  std::vector<BluetoothRemoteGattCharacteristic*> GetCharacteristics()
+      const override;
+  std::vector<BluetoothRemoteGattService*> GetIncludedServices() const override;
+  BluetoothRemoteGattCharacteristic* GetCharacteristic(
+      const std::string& identifier) const override;
+
+ private:
+  void OnGetCharacteristics(
+      std::vector<scoped_refptr<chromecast::bluetooth::RemoteCharacteristic>>);
+
+  BluetoothDeviceCast* const device_;
+  scoped_refptr<chromecast::bluetooth::RemoteService> remote_service_;
+
+  std::vector<std::unique_ptr<BluetoothRemoteGattCharacteristicCast>>
+      characteristics_;
+
+  base::WeakPtrFactory<BluetoothRemoteGattServiceCast> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(BluetoothRemoteGattServiceCast);
+};
+
+}  // namespace device
+
+#endif  // DEVICE_BLUETOOTH_CAST_BLUETOOTH_REMOTE_GATT_SERVICE_CAST_H_
\ No newline at end of file
diff --git a/device/fido/fake_fido_discovery.cc b/device/fido/fake_fido_discovery.cc
index 60b6f025..78cf132 100644
--- a/device/fido/fake_fido_discovery.cc
+++ b/device/fido/fake_fido_discovery.cc
@@ -59,6 +59,13 @@
   return next_hid_discovery_.get();
 }
 
+FakeFidoDiscovery* ScopedFakeFidoDiscoveryFactory::ForgeNextNfcDiscovery(
+    FakeFidoDiscovery::StartMode mode) {
+  next_nfc_discovery_ = std::make_unique<FakeFidoDiscovery>(
+      U2fTransportProtocol::kNearFieldCommunication, mode);
+  return next_nfc_discovery_.get();
+}
+
 FakeFidoDiscovery* ScopedFakeFidoDiscoveryFactory::ForgeNextBleDiscovery(
     FakeFidoDiscovery::StartMode mode) {
   next_ble_discovery_ = std::make_unique<FakeFidoDiscovery>(
@@ -71,12 +78,12 @@
     U2fTransportProtocol transport,
     ::service_manager::Connector* connector) {
   switch (transport) {
-    case U2fTransportProtocol::kBluetoothLowEnergy:
-      DCHECK(next_ble_discovery_);
-      return std::move(next_ble_discovery_);
     case U2fTransportProtocol::kUsbHumanInterfaceDevice:
-      DCHECK(next_hid_discovery_);
       return std::move(next_hid_discovery_);
+    case U2fTransportProtocol::kNearFieldCommunication:
+      return std::move(next_nfc_discovery_);
+    case U2fTransportProtocol::kBluetoothLowEnergy:
+      return std::move(next_ble_discovery_);
   }
   NOTREACHED();
   return nullptr;
diff --git a/device/fido/fake_fido_discovery.h b/device/fido/fake_fido_discovery.h
index a9b7249..e04b309b 100644
--- a/device/fido/fake_fido_discovery.h
+++ b/device/fido/fake_fido_discovery.h
@@ -110,6 +110,7 @@
   // It is an error not to call the relevant method prior to a call to
   // FidoDiscovery::Create with the respective transport.
   FakeFidoDiscovery* ForgeNextHidDiscovery(StartMode mode = StartMode::kManual);
+  FakeFidoDiscovery* ForgeNextNfcDiscovery(StartMode mode = StartMode::kManual);
   FakeFidoDiscovery* ForgeNextBleDiscovery(StartMode mode = StartMode::kManual);
 
  protected:
@@ -119,6 +120,7 @@
 
  private:
   std::unique_ptr<FakeFidoDiscovery> next_hid_discovery_;
+  std::unique_ptr<FakeFidoDiscovery> next_nfc_discovery_;
   std::unique_ptr<FakeFidoDiscovery> next_ble_discovery_;
 
   DISALLOW_COPY_AND_ASSIGN(ScopedFakeFidoDiscoveryFactory);
diff --git a/device/fido/fido_discovery.cc b/device/fido/fido_discovery.cc
index fee879b..48bcad0f 100644
--- a/device/fido/fido_discovery.cc
+++ b/device/fido/fido_discovery.cc
@@ -22,24 +22,23 @@
 std::unique_ptr<FidoDiscovery> CreateFidoDiscoveryImpl(
     U2fTransportProtocol transport,
     service_manager::Connector* connector) {
-  std::unique_ptr<FidoDiscovery> discovery;
   switch (transport) {
     case U2fTransportProtocol::kUsbHumanInterfaceDevice:
 #if !defined(OS_ANDROID)
       DCHECK(connector);
-      discovery = std::make_unique<FidoHidDiscovery>(connector);
+      return std::make_unique<FidoHidDiscovery>(connector);
 #else
       NOTREACHED() << "USB HID not supported on Android.";
+      return nullptr;
 #endif  // !defined(OS_ANDROID)
-      break;
     case U2fTransportProtocol::kBluetoothLowEnergy:
-      discovery = std::make_unique<FidoBleDiscovery>();
-      break;
+      return std::make_unique<FidoBleDiscovery>();
+    case U2fTransportProtocol::kNearFieldCommunication:
+      // TODO(https://crbug.com/825949): Add NFC support.
+      return nullptr;
   }
-
-  DCHECK(discovery);
-  DCHECK_EQ(discovery->transport(), transport);
-  return discovery;
+  NOTREACHED();
+  return nullptr;
 }
 
 }  // namespace
@@ -143,14 +142,15 @@
 namespace internal {
 
 ScopedFidoDiscoveryFactory::ScopedFidoDiscoveryFactory() {
-  original_factory_ = std::exchange(g_current_factory, this);
+  DCHECK(!g_current_factory);
+  g_current_factory = this;
   original_factory_func_ =
       std::exchange(FidoDiscovery::g_factory_func_,
                     &ForwardCreateFidoDiscoveryToCurrentFactory);
 }
 
 ScopedFidoDiscoveryFactory::~ScopedFidoDiscoveryFactory() {
-  g_current_factory = original_factory_;
+  g_current_factory = nullptr;
   FidoDiscovery::g_factory_func_ = original_factory_func_;
 }
 
diff --git a/device/fido/fido_discovery.h b/device/fido/fido_discovery.h
index 3686770..90d94b4d 100644
--- a/device/fido/fido_discovery.h
+++ b/device/fido/fido_discovery.h
@@ -126,6 +126,7 @@
 // invoked instead.
 class COMPONENT_EXPORT(DEVICE_FIDO) ScopedFidoDiscoveryFactory {
  public:
+  // There should be at most one instance of any subclass in scope at a time.
   ScopedFidoDiscoveryFactory();
   virtual ~ScopedFidoDiscoveryFactory();
 
@@ -141,7 +142,6 @@
       ::service_manager::Connector* connector);
 
   static ScopedFidoDiscoveryFactory* g_current_factory;
-  ScopedFidoDiscoveryFactory* original_factory_;
   FidoDiscovery::FactoryFuncPtr original_factory_func_;
 
   DISALLOW_COPY_AND_ASSIGN(ScopedFidoDiscoveryFactory);
diff --git a/device/fido/u2f_request.cc b/device/fido/u2f_request.cc
index 0228f38..a492e40 100644
--- a/device/fido/u2f_request.cc
+++ b/device/fido/u2f_request.cc
@@ -31,8 +31,8 @@
   for (const auto transport : transports) {
     auto discovery = FidoDiscovery::Create(transport, connector);
     if (discovery == nullptr) {
-      // This can occur in tests when a ScopedVirtualFidoDevice is in effect and
-      // non-HID transports are configured.
+      // This can occur if the given transport is not supported, or in tests
+      // when the given transport is not configured.
       continue;
     }
     discovery->set_observer(this);
diff --git a/device/fido/u2f_sign.cc b/device/fido/u2f_sign.cc
index e2190691..5632980 100644
--- a/device/fido/u2f_sign.cc
+++ b/device/fido/u2f_sign.cc
@@ -136,6 +136,11 @@
             GetU2fSignApduCommand(*alt_application_parameter_, *it),
             base::Bind(&U2fSign::OnTryDevice, weak_factory_.GetWeakPtr(), it,
                        ApplicationParameterType::kAlternative));
+      } else if (it == registered_keys_.cend()) {
+        // The fake enrollment errored out. Move on to the next device.
+        state_ = State::IDLE;
+        current_device_ = nullptr;
+        Transition();
       } else if (++it != registered_keys_.end()) {
         // Key is not for this device. Try signing with the next key.
         InitiateDeviceTransaction(
diff --git a/device/fido/u2f_sign_unittest.cc b/device/fido/u2f_sign_unittest.cc
index fbd582c..c4fdc9f8 100644
--- a/device/fido/u2f_sign_unittest.cc
+++ b/device/fido/u2f_sign_unittest.cc
@@ -263,8 +263,10 @@
   discovery()->WaitForCallToStartAndSimulateSuccess();
 
   auto device = std::make_unique<VirtualFidoDevice>();
-  device->AddRegistration(key_handle, std::move(private_key),
-                          GetTestRelyingPartyIdSHA256(), 42);
+  device->mutable_state()->registrations.emplace(
+      key_handle,
+      VirtualFidoDevice::RegistrationData(std::move(private_key),
+                                          GetTestRelyingPartyIdSHA256(), 42));
   discovery()->AddDevice(std::move(device));
 
   sign_callback_receiver().WaitForCallback();
@@ -428,6 +430,38 @@
   EXPECT_FALSE(sign_callback_receiver().value());
 }
 
+TEST_F(U2fSignTest, TestFakeEnrollErroringOut) {
+  auto request = CreateSignRequestWithKeys({std::vector<uint8_t>(32, 0x0A)});
+  request->Start();
+  // First device errors out on all requests (including the sign request and
+  // fake registration attempt). The device should then be abandoned to prevent
+  // the test from crashing or timing out.
+  auto device0 = std::make_unique<MockFidoDevice>();
+  EXPECT_CALL(*device0, GetId()).WillRepeatedly(::testing::Return("device0"));
+  EXPECT_CALL(*device0, DeviceTransactPtr(_, _))
+      .WillRepeatedly(::testing::Invoke(MockFidoDevice::WrongData));
+  // One wink per device.
+  EXPECT_CALL(*device0, TryWinkRef(_))
+      .WillOnce(::testing::Invoke(MockFidoDevice::WinkDoNothing));
+  discovery()->AddDevice(std::move(device0));
+
+  // Second device will have a successful touch and sign on the first attempt.
+  auto device1 = std::make_unique<MockFidoDevice>();
+  EXPECT_CALL(*device1, GetId()).WillRepeatedly(::testing::Return("device1"));
+  EXPECT_CALL(*device1, DeviceTransactPtr(_, _))
+      .WillOnce(::testing::Invoke(MockFidoDevice::NoErrorSign));
+  // One wink per device.
+  EXPECT_CALL(*device1, TryWinkRef(_))
+      .WillOnce(::testing::Invoke(MockFidoDevice::WinkDoNothing));
+  discovery()->AddDevice(std::move(device1));
+  discovery()->WaitForCallToStartAndSimulateSuccess();
+
+  // Correct key was sent so a sign response is expected.
+  sign_callback_receiver().WaitForCallback();
+  EXPECT_EQ(GetTestAssertionSignature(),
+            sign_callback_receiver().value()->signature());
+}
+
 TEST_F(U2fSignTest, TestAuthenticatorDataForSign) {
   constexpr uint8_t flags =
       static_cast<uint8_t>(AuthenticatorData::Flag::kTestOfUserPresence);
diff --git a/device/fido/u2f_transport_protocol.h b/device/fido/u2f_transport_protocol.h
index 0d61c12..ae419269 100644
--- a/device/fido/u2f_transport_protocol.h
+++ b/device/fido/u2f_transport_protocol.h
@@ -11,6 +11,7 @@
 // supported.
 enum class U2fTransportProtocol {
   kUsbHumanInterfaceDevice,
+  kNearFieldCommunication,
   kBluetoothLowEnergy,
 };
 
diff --git a/device/fido/virtual_fido_device.cc b/device/fido/virtual_fido_device.cc
index e13f8926..6f006cf 100644
--- a/device/fido/virtual_fido_device.cc
+++ b/device/fido/virtual_fido_device.cc
@@ -4,6 +4,7 @@
 
 #include "device/fido/virtual_fido_device.h"
 
+#include <tuple>
 #include <utility>
 
 #include "base/bind.h"
@@ -18,41 +19,11 @@
 #include "crypto/ec_signature_creator.h"
 #include "crypto/sha2.h"
 #include "device/fido/fido_constants.h"
+#include "device/fido/u2f_parsing_utils.h"
 #include "net/cert/x509_util.h"
 
 namespace device {
 
-struct RegistrationData {
-  RegistrationData() = default;
-  RegistrationData(std::unique_ptr<crypto::ECPrivateKey> private_key,
-                   std::vector<uint8_t> application_parameter,
-                   uint32_t counter)
-      : private_key(std::move(private_key)),
-        application_parameter(std::move(application_parameter)),
-        counter(counter) {}
-  RegistrationData(RegistrationData&& data) = default;
-  ~RegistrationData() = default;
-
-  RegistrationData& operator=(RegistrationData&& other) = default;
-
-  std::unique_ptr<crypto::ECPrivateKey> private_key;
-  std::vector<uint8_t> application_parameter;
-  uint32_t counter = 0;
-
-  DISALLOW_COPY_AND_ASSIGN(RegistrationData);
-};
-
-struct VirtualFidoDevice::State::Internal {
-  // Keyed on key handle (a.k.a. "credential ID").
-  std::map<std::vector<uint8_t>, RegistrationData> registrations;
-};
-
-VirtualFidoDevice::State::State()
-    : attestation_cert_common_name("Batch Certificate"),
-      individual_attestation_cert_common_name("Individual Certificate"),
-      internal_(new Internal) {}
-
-VirtualFidoDevice::State::~State() = default;
 
 namespace {
 
@@ -98,9 +69,34 @@
 
 }  // namespace
 
+// VirtualFidoDevice::RegistrationData ----------------------------------------
+
+VirtualFidoDevice::RegistrationData::RegistrationData() = default;
+VirtualFidoDevice::RegistrationData::RegistrationData(
+    std::unique_ptr<crypto::ECPrivateKey> private_key,
+    std::vector<uint8_t> application_parameter,
+    uint32_t counter)
+    : private_key(std::move(private_key)),
+      application_parameter(std::move(application_parameter)),
+      counter(counter) {}
+VirtualFidoDevice::RegistrationData::RegistrationData(RegistrationData&& data) =
+    default;
+VirtualFidoDevice::RegistrationData::~RegistrationData() = default;
+
+VirtualFidoDevice::RegistrationData& VirtualFidoDevice::RegistrationData::
+operator=(RegistrationData&& other) = default;
+
+// VirtualFidoDevice::State ---------------------------------------------------
+
+VirtualFidoDevice::State::State()
+    : attestation_cert_common_name("Batch Certificate"),
+      individual_attestation_cert_common_name("Individual Certificate") {}
+VirtualFidoDevice::State::~State() = default;
 VirtualFidoDevice::VirtualFidoDevice()
     : state_(new State), weak_factory_(this) {}
 
+// VirtualFidoDevice ----------------------------------------------------------
+
 VirtualFidoDevice::VirtualFidoDevice(scoped_refptr<State> state)
     : state_(std::move(state)), weak_factory_(this) {}
 
@@ -115,15 +111,6 @@
   return "VirtualFidoDevice-" + std::to_string((size_t)this % 0xffe1);
 }
 
-void VirtualFidoDevice::AddRegistration(
-    std::vector<uint8_t> key_handle,
-    std::unique_ptr<crypto::ECPrivateKey> private_key,
-    std::vector<uint8_t> application_parameter,
-    uint32_t counter) {
-  state_->internal_->registrations[std::move(key_handle)] = RegistrationData(
-      std::move(private_key), std::move(application_parameter), counter);
-}
-
 void VirtualFidoDevice::DeviceTransact(std::vector<uint8_t> command,
                                        DeviceCallback cb) {
   // Note, here we are using the code-under-test in this fake.
@@ -232,11 +219,15 @@
   AppendTo(&response, attestation_cert);
   AppendTo(&response, sig);
 
-  // Store the registration.
-  AddRegistration(std::move(key_handle), std::move(private_key),
-                  std::vector<uint8_t>(application_parameter.begin(),
-                                       application_parameter.end()),
-                  1);
+  // Store the registration. Because the key handle is the hashed public key we
+  // just generated, no way this should already be registered.
+  bool did_insert = false;
+  std::tie(std::ignore, did_insert) = state_->registrations.emplace(
+      std::move(key_handle),
+      RegistrationData(std::move(private_key),
+                       u2f_parsing_utils::Materialize(application_parameter),
+                       1));
+  DCHECK(did_insert);
 
   return apdu::ApduResponse(std::move(response),
                             apdu::ApduResponse::Status::SW_NO_ERROR)
@@ -257,21 +248,16 @@
   auto challenge_param = data.first(32);
   auto application_parameter = data.subspan(32, 32);
   size_t key_handle_length = data[64];
-  if (key_handle_length != 32) {
-    // Our own keyhandles are always 32 bytes long, if the request has something
-    // else then we already know it is not ours.
-    return ErrorStatus(apdu::ApduResponse::Status::SW_WRONG_DATA);
-  }
   if (data.size() != 32 + 32 + 1 + key_handle_length) {
     return ErrorStatus(apdu::ApduResponse::Status::SW_WRONG_LENGTH);
   }
   auto key_handle = data.last(key_handle_length);
 
   // Check if this is our key_handle and it's for this appId.
-  auto it = state_->internal_->registrations.find(
+  auto it = state_->registrations.find(
       std::vector<uint8_t>(key_handle.cbegin(), key_handle.cend()));
 
-  if (it == state_->internal_->registrations.end()) {
+  if (it == state_->registrations.end()) {
     return ErrorStatus(apdu::ApduResponse::Status::SW_WRONG_DATA);
   }
 
diff --git a/device/fido/virtual_fido_device.h b/device/fido/virtual_fido_device.h
index fcc2b046..0504281e 100644
--- a/device/fido/virtual_fido_device.h
+++ b/device/fido/virtual_fido_device.h
@@ -27,6 +27,26 @@
 
 class COMPONENT_EXPORT(DEVICE_FIDO) VirtualFidoDevice : public FidoDevice {
  public:
+  // Encapsulates information corresponding to one registered key on the virtual
+  // authenticator device.
+  struct COMPONENT_EXPORT(DEVICE_FIDO) RegistrationData {
+    RegistrationData();
+    RegistrationData(std::unique_ptr<crypto::ECPrivateKey> private_key,
+                     std::vector<uint8_t> application_parameter,
+                     uint32_t counter);
+
+    RegistrationData(RegistrationData&& data);
+    RegistrationData& operator=(RegistrationData&& other);
+
+    ~RegistrationData();
+
+    std::unique_ptr<crypto::ECPrivateKey> private_key;
+    std::vector<uint8_t> application_parameter;
+    uint32_t counter = 0;
+
+    DISALLOW_COPY_AND_ASSIGN(RegistrationData);
+  };
+
   // Stores the state of the device. Since |U2fDevice| objects only persist for
   // the lifetime of a single request, keeping state in an external object is
   // neccessary in order to provide continuity between requests.
@@ -41,13 +61,14 @@
     // is requested.
     std::string individual_attestation_cert_common_name;
 
+    // Registered keys. Keyed on key handle (a.k.a. "credential ID").
+    std::map<std::vector<uint8_t>, RegistrationData> registrations;
+
    private:
-    friend class ::device::VirtualFidoDevice;
     friend class base::RefCounted<State>;
     ~State();
 
-    struct Internal;
-    std::unique_ptr<Internal> internal_;
+    DISALLOW_COPY_AND_ASSIGN(State);
   };
 
   // Constructs an object with ephemeral state. In order to have the state of
@@ -60,10 +81,7 @@
 
   ~VirtualFidoDevice() override;
 
-  void AddRegistration(std::vector<uint8_t> key_handle,
-                       std::unique_ptr<crypto::ECPrivateKey> private_key,
-                       std::vector<uint8_t> application_parameter,
-                       uint32_t counter);
+  State* mutable_state() { return state_.get(); }
 
  protected:
   // U2fDevice:
diff --git a/google_apis/gaia/fake_oauth2_token_service_delegate.cc b/google_apis/gaia/fake_oauth2_token_service_delegate.cc
index 1ce991cb..94173be 100644
--- a/google_apis/gaia/fake_oauth2_token_service_delegate.cc
+++ b/google_apis/gaia/fake_oauth2_token_service_delegate.cc
@@ -101,7 +101,7 @@
   return request_context_.get();
 }
 
-void FakeOAuth2TokenServiceDelegate::SetLastErrorForAccount(
+void FakeOAuth2TokenServiceDelegate::UpdateAuthError(
     const std::string& account_id,
     const GoogleServiceAuthError& error) {
   auto it = refresh_tokens_.find(account_id);
diff --git a/google_apis/gaia/fake_oauth2_token_service_delegate.h b/google_apis/gaia/fake_oauth2_token_service_delegate.h
index 0000f69..447b4b66 100644
--- a/google_apis/gaia/fake_oauth2_token_service_delegate.h
+++ b/google_apis/gaia/fake_oauth2_token_service_delegate.h
@@ -24,6 +24,8 @@
   // Overriden to make sure it works on Android.
   bool RefreshTokenIsAvailable(const std::string& account_id) const override;
   bool RefreshTokenHasError(const std::string& account_id) const override;
+  void UpdateAuthError(const std::string& account_id,
+                       const GoogleServiceAuthError& error) override;
 
   std::vector<std::string> GetAccounts() override;
   void RevokeAllCredentials() override;
@@ -40,9 +42,6 @@
     request_context_ = request_context;
   }
 
-  void SetLastErrorForAccount(const std::string& account_id,
-                              const GoogleServiceAuthError& error);
-
   std::string GetRefreshToken(const std::string& account_id) const;
 
  private:
diff --git a/ios/chrome/app/BUILD.gn b/ios/chrome/app/BUILD.gn
index 9f7b32e3..cbd2506 100644
--- a/ios/chrome/app/BUILD.gn
+++ b/ios/chrome/app/BUILD.gn
@@ -205,6 +205,7 @@
     "//ios/chrome/browser/ui/tab_grid",
     "//ios/chrome/browser/ui/tab_grid:tab_grid_ui",
     "//ios/chrome/browser/ui/tab_switcher",
+    "//ios/chrome/browser/ui/tab_switcher:modes",
     "//ios/chrome/browser/ui/tabs",
     "//ios/chrome/browser/ui/toolbar/clean:toolbar_ui",
     "//ios/chrome/browser/ui/toolbar/public",
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm
index baa4905e..05d61caa 100644
--- a/ios/chrome/app/main_controller.mm
+++ b/ios/chrome/app/main_controller.mm
@@ -133,6 +133,7 @@
 #import "ios/chrome/browser/ui/stack_view/stack_view_controller.h"
 #include "ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_controller.h"
+#import "ios/chrome/browser/ui/tab_switcher/tab_switcher_mode.h"
 #import "ios/chrome/browser/ui/toolbar/public/omnibox_focuser.h"
 #include "ios/chrome/browser/ui/ui_util.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
@@ -242,19 +243,6 @@
 // that it can be set to |NONE| when not in use.
 enum class TabSwitcherDismissalMode { NONE, NORMAL, INCOGNITO };
 
-// The style of tab switcher, with a utility function to fetch it.
-enum class TabSwitcherMode { STACK, TABLET_SWITCHER, GRID };
-
-TabSwitcherMode SwitcherMode() {
-  if (IsUIRefreshPhase1Enabled()) {
-    return TabSwitcherMode::GRID;
-  } else if (IsIPadIdiom()) {
-    return TabSwitcherMode::TABLET_SWITCHER;
-  } else {
-    return TabSwitcherMode::STACK;
-  }
-}
-
 // The delay, in seconds, for cleaning external files.
 const int kExternalFilesCleanupDelaySeconds = 60;
 
@@ -861,7 +849,7 @@
 
 - (void)deleteIncognitoBrowserState {
   BOOL otrBVCIsCurrent = (self.currentBVC == self.otrBVC);
-  TabSwitcherMode mode = SwitcherMode();
+  TabSwitcherMode mode = GetTabSwitcherMode();
 
   // If the stack view is in use,and the current BVC is the otr BVC, then the
   // user should be in the tab switcher (the stack view).
@@ -916,7 +904,7 @@
   }
   if (!_mainCoordinator) {
     // Lazily create the main coordinator.
-    if (SwitcherMode() == TabSwitcherMode::GRID) {
+    if (GetTabSwitcherMode() == TabSwitcherMode::GRID) {
       TabGridCoordinator* tabGridCoordinator =
           [[TabGridCoordinator alloc] initWithWindow:self.window
                           applicationCommandEndpoint:self];
@@ -1798,7 +1786,7 @@
     return;
   }
 
-  if (SwitcherMode() == TabSwitcherMode::TABLET_SWITCHER) {
+  if (GetTabSwitcherMode() == TabSwitcherMode::TABLET_SWITCHER) {
     [self showTabSwitcher];
   } else {
     self.currentBVC = self.mainBVC;
@@ -1888,7 +1876,7 @@
   }
   _tabSwitcherIsActive = YES;
   [_tabSwitcher setDelegate:self];
-  switch (SwitcherMode()) {
+  switch (GetTabSwitcherMode()) {
     case TabSwitcherMode::TABLET_SWITCHER: {
       TabSwitcherTransitionContext* transitionContext =
           [TabSwitcherTransitionContext
@@ -1992,7 +1980,7 @@
   _dismissingTabSwitcher = YES;
   // Prevent wayward touches from wreaking havoc while the stack view is being
   // dismissed.
-  if (SwitcherMode() == TabSwitcherMode::STACK) {
+  if (GetTabSwitcherMode() == TabSwitcherMode::STACK) {
     [[_tabSwitcher viewController].view setUserInteractionEnabled:NO];
   }
 
@@ -2319,6 +2307,14 @@
   // services it wraps.
   ios::GetChromeBrowserProvider()->GetChromeIdentityService()->DismissDialogs();
 
+  // MailtoHandlerProvider is responsible for the dialogs displayed by the
+  // services it wraps.
+  if (base::FeatureList::IsEnabled(kMailtoHandledWithGoogleUI)) {
+    ios::GetChromeBrowserProvider()
+        ->GetMailtoHandlerProvider()
+        ->DismissAllMailtoHandlerInterfaces();
+  }
+
   // Cancel interaction with SSO.
   // First, cancel the signin interaction.
   [self.signinInteractionCoordinator cancel];
@@ -2541,7 +2537,7 @@
 
 // Creates and returns a tab switcher object according to the tab switcher stye.
 - (id<TabSwitcher>)newTabSwitcher {
-  switch (SwitcherMode()) {
+  switch (GetTabSwitcherMode()) {
     case TabSwitcherMode::GRID: {
       DCHECK(_mainCoordinator)
           << " Main coordinator not created when tab switcher needed.";
diff --git a/ios/chrome/browser/ui/external_search/external_search_mediator.mm b/ios/chrome/browser/ui/external_search/external_search_mediator.mm
index 97b9241..6c69388 100644
--- a/ios/chrome/browser/ui/external_search/external_search_mediator.mm
+++ b/ios/chrome/browser/ui/external_search/external_search_mediator.mm
@@ -25,16 +25,9 @@
   NSURL* externalSearchAppLaunchURL = ios::GetChromeBrowserProvider()
                                           ->GetExternalSearchProvider()
                                           ->GetLaunchURL();
-  if (@available(iOS 10, *)) {
-    [self.application openURL:externalSearchAppLaunchURL
-                      options:@{}
-            completionHandler:nil];
-  }
-#if !defined(__IPHONE_10_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_10_0
-  else {
-    [self.application openURL:externalSearchAppLaunchURL];
-  }
-#endif
+  [self.application openURL:externalSearchAppLaunchURL
+                    options:@{}
+          completionHandler:nil];
 }
 
 @end
diff --git a/ios/chrome/browser/ui/external_search/external_search_mediator_unittest.mm b/ios/chrome/browser/ui/external_search/external_search_mediator_unittest.mm
index ee94771..1b3fb5d6 100644
--- a/ios/chrome/browser/ui/external_search/external_search_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/external_search/external_search_mediator_unittest.mm
@@ -24,16 +24,9 @@
   id application = OCMClassMock([UIApplication class]);
   mediator.application = application;
   NSURL* expectedURL = [NSURL URLWithString:@"testexternalsearch://"];
-  if (@available(iOS 10, *)) {
-    OCMExpect([application openURL:expectedURL
-                           options:[OCMArg any]
-                 completionHandler:[OCMArg any]]);
-  }
-#if !defined(__IPHONE_10_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_10_0
-  else {
-    OCMExpect([application openURL:expectedURL]);
-  }
-#endif
+  OCMExpect([application openURL:expectedURL
+                         options:[OCMArg any]
+               completionHandler:[OCMArg any]]);
   [mediator launchExternalSearch];
 
   EXPECT_OCMOCK_VERIFY(application);
diff --git a/ios/chrome/browser/ui/history/BUILD.gn b/ios/chrome/browser/ui/history/BUILD.gn
index 493241a..7ea6bd3 100644
--- a/ios/chrome/browser/ui/history/BUILD.gn
+++ b/ios/chrome/browser/ui/history/BUILD.gn
@@ -94,11 +94,15 @@
 source_set("history_ui") {
   configs += [ "//build/config/compiler:enable_arc" ]
   sources = [
+    "history_table_container_view_controller.h",
+    "history_table_container_view_controller.mm",
     "history_table_view_controller.h",
     "history_table_view_controller.mm",
   ]
   deps = [
+    "//components/strings",
     "//ios/chrome/browser/ui/table_view",
+    "//ui/base",
   ]
 }
 
diff --git a/ios/chrome/browser/ui/history/history_coordinator.mm b/ios/chrome/browser/ui/history/history_coordinator.mm
index 95a7147..26fc067 100644
--- a/ios/chrome/browser/ui/history/history_coordinator.mm
+++ b/ios/chrome/browser/ui/history/history_coordinator.mm
@@ -5,8 +5,8 @@
 #include "ios/chrome/browser/ui/history/history_coordinator.h"
 
 #include "components/strings/grit/components_strings.h"
+#import "ios/chrome/browser/ui/history/history_table_container_view_controller.h"
 #include "ios/chrome/browser/ui/history/history_table_view_controller.h"
-#import "ios/chrome/browser/ui/table_view/table_container_view_controller.h"
 #import "ios/chrome/browser/ui/util/form_sheet_navigation_controller.h"
 #include "ui/base/l10n/l10n_util.h"
 
@@ -17,7 +17,7 @@
 @interface HistoryCoordinator ()
 // ViewController being managed by this Coordinator.
 @property(nonatomic, strong)
-    TableContainerViewController* historyContainerViewController;
+    HistoryTableContainerViewController* historyContainerViewController;
 @end
 
 @implementation HistoryCoordinator
@@ -33,8 +33,9 @@
   historyTableViewController.loader = self.loader;
 
   // Initialize and configure HistoryContainerViewController.
-  self.historyContainerViewController = [[TableContainerViewController alloc]
-      initWithTable:historyTableViewController];
+  self.historyContainerViewController =
+      [[HistoryTableContainerViewController alloc]
+          initWithTable:historyTableViewController];
   self.historyContainerViewController.title =
       l10n_util::GetNSString(IDS_HISTORY_TITLE);
   // TODO(crbug.com/805192): Move this configuration code to
diff --git a/ios/chrome/browser/ui/history/history_table_container_view_controller.h b/ios/chrome/browser/ui/history/history_table_container_view_controller.h
new file mode 100644
index 0000000..0fdeaff
--- /dev/null
+++ b/ios/chrome/browser/ui/history/history_table_container_view_controller.h
@@ -0,0 +1,16 @@
+// Copyright 2018 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_HISTORY_HISTORY_TABLE_CONTAINER_VIEW_CONTROLLER_H_
+#define IOS_CHROME_BROWSER_UI_HISTORY_HISTORY_TABLE_CONTAINER_VIEW_CONTROLLER_H_
+
+#import "ios/chrome/browser/ui/table_view/table_container_view_controller.h"
+
+@class HistoryTableViewController;
+// Container for handling the interaction between its TableViewController, the
+// container BottomToolbar and the SearchController.
+@interface HistoryTableContainerViewController : TableContainerViewController
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_HISTORY_HISTORY_TABLE_CONTAINER_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/history/history_table_container_view_controller.mm b/ios/chrome/browser/ui/history/history_table_container_view_controller.mm
new file mode 100644
index 0000000..76f63ef
--- /dev/null
+++ b/ios/chrome/browser/ui/history/history_table_container_view_controller.mm
@@ -0,0 +1,34 @@
+// Copyright 2018 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/history/history_table_container_view_controller.h"
+
+#include "base/mac/foundation_util.h"
+#include "components/strings/grit/components_strings.h"
+#import "ios/chrome/browser/ui/table_view/table_container_bottom_toolbar.h"
+#include "ui/base/l10n/l10n_util_mac.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@implementation HistoryTableContainerViewController
+
+- (instancetype)initWithTable:(ChromeTableViewController*)table {
+  self = [super initWithTable:table];
+  if (self) {
+    NSString* leadingButtonString = l10n_util::GetNSStringWithFixup(
+        IDS_HISTORY_OPEN_CLEAR_BROWSING_DATA_DIALOG);
+    NSString* trailingButtonString =
+        l10n_util::GetNSString(IDS_HISTORY_START_EDITING_BUTTON);
+    TableContainerBottomToolbar* toolbar = [[TableContainerBottomToolbar alloc]
+        initWithLeadingButtonText:leadingButtonString
+               trailingButtonText:trailingButtonString];
+    [toolbar.leadingButton setTitleColor:[UIColor redColor]
+                                forState:UIControlStateNormal];
+    self.bottomToolbar = toolbar;
+  }
+  return self;
+}
+@end
diff --git a/ios/chrome/browser/ui/history/history_ui_egtest.mm b/ios/chrome/browser/ui/history/history_ui_egtest.mm
index 56093d1e..b60dc73f 100644
--- a/ios/chrome/browser/ui/history/history_ui_egtest.mm
+++ b/ios/chrome/browser/ui/history/history_ui_egtest.mm
@@ -82,7 +82,7 @@
 }
 // Matcher for the history button in the tools menu.
 id<GREYMatcher> HistoryButton() {
-  return ButtonWithAccessibilityLabelId(IDS_HISTORY_SHOW_HISTORY);
+  return grey_accessibilityID(kToolsMenuHistoryId);
 }
 // Matcher for the edit button in the navigation bar.
 id<GREYMatcher> NavigationEditButton() {
@@ -427,8 +427,7 @@
 
 - (void)openHistoryPanel {
   [ChromeEarlGreyUI openToolsMenu];
-  [[EarlGrey selectElementWithMatcher:HistoryButton()]
-      performAction:grey_tap()];
+  [ChromeEarlGreyUI tapToolsMenuButton:HistoryButton()];
 }
 
 - (void)assertNoHistoryShown {
diff --git a/ios/chrome/browser/ui/popup_menu/BUILD.gn b/ios/chrome/browser/ui/popup_menu/BUILD.gn
index 8e027ff7..50257d86 100644
--- a/ios/chrome/browser/ui/popup_menu/BUILD.gn
+++ b/ios/chrome/browser/ui/popup_menu/BUILD.gn
@@ -49,10 +49,28 @@
   deps = [
     ":flags",
     "resources:popup_background",
+    "resources:popup_menu_bookmarks",
+    "resources:popup_menu_find_in_page",
+    "resources:popup_menu_help",
+    "resources:popup_menu_history",
+    "resources:popup_menu_new_incognito_tab",
+    "resources:popup_menu_new_tab",
+    "resources:popup_menu_read_later",
+    "resources:popup_menu_reading_list",
+    "resources:popup_menu_recent_tabs",
+    "resources:popup_menu_reload",
+    "resources:popup_menu_report_an_issue",
+    "resources:popup_menu_request_desktop_site",
+    "resources:popup_menu_request_mobile_site",
+    "resources:popup_menu_settings",
+    "resources:popup_menu_shadow",
+    "resources:popup_menu_site_information",
+    "resources:popup_menu_stop",
     "//base",
     "//ios/chrome/app/strings",
     "//ios/chrome/browser/ui",
     "//ios/chrome/browser/ui/commands",
+    "//ios/chrome/browser/ui/image_util",
     "//ios/chrome/browser/ui/popup_menu/cells",
     "//ios/chrome/browser/ui/presenters",
     "//ios/chrome/browser/ui/table_view",
diff --git a/ios/chrome/browser/ui/popup_menu/cells/popup_menu_tools_item.mm b/ios/chrome/browser/ui/popup_menu/cells/popup_menu_tools_item.mm
index e3b6bf3..4c542ba4 100644
--- a/ios/chrome/browser/ui/popup_menu/cells/popup_menu_tools_item.mm
+++ b/ios/chrome/browser/ui/popup_menu/cells/popup_menu_tools_item.mm
@@ -116,7 +116,7 @@
                        attributes:attributes
                           context:nil];
   CGSize size = rectForString.size;
-  size.height = MAX(size.height, kImageLength);
+  size.height = MAX(size.height, kCellHeight);
   size.width += nonTitleElementWidth;
   return size;
 }
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm
index ee2e2f7b..089ad22 100644
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm
+++ b/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm
@@ -34,15 +34,17 @@
 namespace {
 PopupMenuToolsItem* CreateTableViewItem(int titleID,
                                         PopupMenuAction action,
+                                        NSString* imageName,
                                         NSString* accessibilityID) {
   PopupMenuToolsItem* item =
       [[PopupMenuToolsItem alloc] initWithType:kItemTypeEnumZero];
   item.title = l10n_util::GetNSString(titleID);
   item.actionIdentifier = action;
   item.accessibilityIdentifier = accessibilityID;
-  // TODO(crbug.com/817795): Use real assets instead.
-  item.image = [ImageWithColor([UIColor colorWithWhite:0 alpha:0.75])
-      imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
+  if (imageName) {
+    item.image = [[UIImage imageNamed:imageName]
+        imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
+  }
   return item;
 }
 }
@@ -216,6 +218,11 @@
 
 - (void)setPopupMenu:(PopupMenuTableViewController*)popupMenu {
   _popupMenu = popupMenu;
+
+  if (self.type == PopupMenuTypeToolsMenu) {
+    _popupMenu.tableView.accessibilityIdentifier = kToolsMenuTableViewId;
+  }
+
   [_popupMenu setPopupMenuItems:self.items];
   _popupMenu.commandHandler = self;
   if (self.webState) {
@@ -282,14 +289,20 @@
   // TODO(crbug.com/804773): update the items to take into account the state.
   self.readLater.enabled = [self isWebURL];
   self.findInPage.enabled = [self isFindInPageEnabled];
-  if ([self isPageLoading]) {
+  if ([self isPageLoading] &&
+      self.reloadStop.accessibilityIdentifier == kToolsMenuReload) {
     self.reloadStop.title = l10n_util::GetNSString(IDS_IOS_TOOLS_MENU_STOP);
     self.reloadStop.actionIdentifier = PopupMenuActionStop;
     self.reloadStop.accessibilityIdentifier = kToolsMenuStop;
-  } else {
+    self.reloadStop.image = [[UIImage imageNamed:@"popup_menu_stop"]
+        imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
+  } else if (![self isPageLoading] &&
+             self.reloadStop.accessibilityIdentifier == kToolsMenuStop) {
     self.reloadStop.title = l10n_util::GetNSString(IDS_IOS_TOOLS_MENU_RELOAD);
     self.reloadStop.actionIdentifier = PopupMenuActionReload;
     self.reloadStop.accessibilityIdentifier = kToolsMenuReload;
+    self.reloadStop.image = [[UIImage imageNamed:@"popup_menu_reload"]
+        imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
   }
 
   // Reload the items.
@@ -328,12 +341,12 @@
   if (self.isIncognito) {
     [items addObject:CreateTableViewItem(
                          IDS_IOS_TOOLS_MENU_CLOSE_ALL_INCOGNITO_TABS,
-                         PopupMenuActionCloseAllIncognitoTabs,
+                         PopupMenuActionCloseAllIncognitoTabs, nil,
                          kToolsMenuCloseAllIncognitoTabsId)];
   }
 
   [items addObject:CreateTableViewItem(IDS_IOS_TOOLS_MENU_CLOSE_TAB,
-                                       PopupMenuActionCloseTab,
+                                       PopupMenuActionCloseTab, nil,
                                        kToolsMenuCloseTabId)];
 
   self.items = @[ items ];
@@ -342,8 +355,9 @@
 // Creates the menu items for the tools menu.
 - (void)createToolsMenuItems {
   // Reload or stop page action, created as reload.
-  self.reloadStop = CreateTableViewItem(
-      IDS_IOS_TOOLS_MENU_RELOAD, PopupMenuActionReload, kToolsMenuReload);
+  self.reloadStop =
+      CreateTableViewItem(IDS_IOS_TOOLS_MENU_RELOAD, PopupMenuActionReload,
+                          @"popup_menu_reload", kToolsMenuReload);
 
   NSArray* tabActions = [@[ self.reloadStop ]
       arrayByAddingObjectsFromArray:[self itemsForNewTab]];
@@ -359,12 +373,12 @@
   // Open New Tab.
   TableViewItem* openNewTabItem =
       CreateTableViewItem(IDS_IOS_TOOLS_MENU_NEW_TAB, PopupMenuActionOpenNewTab,
-                          kToolsMenuNewTabId);
+                          @"popup_menu_new_tab", kToolsMenuNewTabId);
 
-  // Open New Incogntio Tab.
+  // Open New Incognito Tab.
   TableViewItem* openNewIncognitoTabItem = CreateTableViewItem(
       IDS_IOS_TOOLS_MENU_NEW_INCOGNITO_TAB, PopupMenuActionOpenNewIncognitoTab,
-      kToolsMenuNewIncognitoTabId);
+      @"popup_menu_new_incognito_tab", kToolsMenuNewIncognitoTabId);
 
   return @[ openNewTabItem, openNewIncognitoTabItem ];
 }
@@ -372,22 +386,22 @@
 - (NSArray<TableViewItem*>*)actionItems {
   NSMutableArray* actionsArray = [NSMutableArray array];
   // Read Later.
-  self.readLater =
-      CreateTableViewItem(IDS_IOS_CONTENT_CONTEXT_ADDTOREADINGLIST,
-                          PopupMenuActionReadLater, kToolsMenuReadLater);
+  self.readLater = CreateTableViewItem(
+      IDS_IOS_CONTENT_CONTEXT_ADDTOREADINGLIST, PopupMenuActionReadLater,
+      @"popup_menu_read_later", kToolsMenuReadLater);
   [actionsArray addObject:self.readLater];
 
   // Find in Pad.
-  self.findInPage =
-      CreateTableViewItem(IDS_IOS_TOOLS_MENU_FIND_IN_PAGE,
-                          PopupMenuActionFindInPage, kToolsMenuFindInPageId);
+  self.findInPage = CreateTableViewItem(
+      IDS_IOS_TOOLS_MENU_FIND_IN_PAGE, PopupMenuActionFindInPage,
+      @"popup_menu_find_in_page", kToolsMenuFindInPageId);
   [actionsArray addObject:self.findInPage];
 
   if ([self userAgentType] != web::UserAgentType::DESKTOP) {
     // Request Desktop Site.
     PopupMenuToolsItem* requestDesktopSite = CreateTableViewItem(
         IDS_IOS_TOOLS_MENU_REQUEST_DESKTOP_SITE, PopupMenuActionRequestDesktop,
-        kToolsMenuRequestDesktopId);
+        @"popup_menu_request_desktop_site", kToolsMenuRequestDesktopId);
     // Disable the action if the user agent is not mobile.
     requestDesktopSite.enabled =
         [self userAgentType] == web::UserAgentType::MOBILE;
@@ -396,14 +410,14 @@
     // Request Mobile Site.
     TableViewItem* requestMobileSite = CreateTableViewItem(
         IDS_IOS_TOOLS_MENU_REQUEST_MOBILE_SITE, PopupMenuActionRequestMobile,
-        kToolsMenuRequestMobileId);
+        @"popup_menu_request_mobile_site", kToolsMenuRequestMobileId);
     [actionsArray addObject:requestMobileSite];
   }
 
   // Site Information.
   self.siteInformation = CreateTableViewItem(
       IDS_IOS_TOOLS_MENU_SITE_INFORMATION, PopupMenuActionSiteInformation,
-      kToolsMenuSiteInformation);
+      @"popup_menu_site_information", kToolsMenuSiteInformation);
   [actionsArray addObject:self.siteInformation];
 
   // Report an Issue.
@@ -412,13 +426,14 @@
           ->IsUserFeedbackEnabled()) {
     TableViewItem* reportIssue = CreateTableViewItem(
         IDS_IOS_OPTIONS_REPORT_AN_ISSUE, PopupMenuActionReportIssue,
-        kToolsMenuReportAnIssueId);
+        @"popup_menu_report_an_issue", kToolsMenuReportAnIssueId);
     [actionsArray addObject:reportIssue];
   }
 
   // Help.
-  TableViewItem* help = CreateTableViewItem(
-      IDS_IOS_TOOLS_MENU_HELP_MOBILE, PopupMenuActionHelp, kToolsMenuHelpId);
+  TableViewItem* help =
+      CreateTableViewItem(IDS_IOS_TOOLS_MENU_HELP_MOBILE, PopupMenuActionHelp,
+                          @"popup_menu_help", kToolsMenuHelpId);
   [actionsArray addObject:help];
 
   return actionsArray;
@@ -426,28 +441,29 @@
 
 - (NSArray<TableViewItem*>*)collectionItems {
   // Bookmarks.
-  TableViewItem* bookmarks =
-      CreateTableViewItem(IDS_IOS_TOOLS_MENU_BOOKMARKS,
-                          PopupMenuActionBookmarks, kToolsMenuBookmarksId);
+  TableViewItem* bookmarks = CreateTableViewItem(
+      IDS_IOS_TOOLS_MENU_BOOKMARKS, PopupMenuActionBookmarks,
+      @"popup_menu_bookmarks", kToolsMenuBookmarksId);
 
   // Reading List.
-  TableViewItem* readingList =
-      CreateTableViewItem(IDS_IOS_TOOLS_MENU_READING_LIST,
-                          PopupMenuActionReadingList, kToolsMenuReadingListId);
+  TableViewItem* readingList = CreateTableViewItem(
+      IDS_IOS_TOOLS_MENU_READING_LIST, PopupMenuActionReadingList,
+      @"popup_menu_reading_list", kToolsMenuReadingListId);
 
   // Recent Tabs.
-  TableViewItem* recentTabs =
-      CreateTableViewItem(IDS_IOS_TOOLS_MENU_RECENT_TABS,
-                          PopupMenuActionRecentTabs, kToolsMenuOtherDevicesId);
+  TableViewItem* recentTabs = CreateTableViewItem(
+      IDS_IOS_TOOLS_MENU_RECENT_TABS, PopupMenuActionRecentTabs,
+      @"popup_menu_recent_tabs", kToolsMenuOtherDevicesId);
 
   // History.
-  TableViewItem* history = CreateTableViewItem(
-      IDS_IOS_TOOLS_MENU_HISTORY, PopupMenuActionHistory, kToolsMenuHistoryId);
+  TableViewItem* history =
+      CreateTableViewItem(IDS_IOS_TOOLS_MENU_HISTORY, PopupMenuActionHistory,
+                          @"popup_menu_history", kToolsMenuHistoryId);
 
   // Settings.
   TableViewItem* settings =
       CreateTableViewItem(IDS_IOS_TOOLS_MENU_SETTINGS, PopupMenuActionSettings,
-                          kToolsMenuSettingsId);
+                          @"popup_menu_settings", kToolsMenuSettingsId);
 
   return @[ bookmarks, readingList, recentTabs, history, settings ];
 }
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_mediator_unittest.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_mediator_unittest.mm
index 1f335d1..a989cfd5 100644
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/popup_menu/popup_menu_mediator_unittest.mm
@@ -99,29 +99,3 @@
   // Mock refusing all calls except -setPopupMenuItems:.
   id popup_menu_strict_;
 };
-
-// Test no setup is being done on the PopupMenu if there's no Webstate.
-TEST_F(PopupMenuMediatorTest, TestPopupMenuSetupWithNoWebstateIncognito) {
-  mediator_incognito_.popupMenu = popup_menu_strict_;
-  EXPECT_OCMOCK_VERIFY(popup_menu_strict_);
-}
-
-// Test no setup is being done on the PopupMenu if there's no Webstate.
-TEST_F(PopupMenuMediatorTest, TestPopupMenuSetupWithNoWebstate) {
-  mediator_non_incognito_.popupMenu = popup_menu_strict_;
-  EXPECT_OCMOCK_VERIFY(popup_menu_strict_);
-}
-
-// Test no setup is being done on the PopupMenu if there's no active Webstate.
-TEST_F(PopupMenuMediatorTest, TestPopupMenuSetupWithNoActiveWebstateIncognito) {
-  mediator_incognito_.webStateList = web_state_list_.get();
-  mediator_incognito_.popupMenu = popup_menu_strict_;
-  EXPECT_OCMOCK_VERIFY(popup_menu_strict_);
-}
-
-// Test no setup is being done on the PopupMenu if there's no active Webstate.
-TEST_F(PopupMenuMediatorTest, TestPopupMenuSetupWithNoActiveWebstate) {
-  mediator_non_incognito_.webStateList = web_state_list_.get();
-  mediator_non_incognito_.popupMenu = popup_menu_strict_;
-  EXPECT_OCMOCK_VERIFY(popup_menu_strict_);
-}
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_presenter.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_presenter.mm
index e9c3398..41d4db6 100644
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_presenter.mm
+++ b/ios/chrome/browser/ui/popup_menu/popup_menu_presenter.mm
@@ -71,8 +71,10 @@
   // Use preferredSize if it is set.
   CGSize preferredSize = self.presentedViewController.preferredContentSize;
   CGFloat width = fittingSize.width;
+  CGFloat height = fittingSize.height;
   if (!CGSizeEqualToSize(preferredSize, CGSizeZero)) {
     width = preferredSize.width;
+    height = preferredSize.height;
   }
 
   // Set the sizing constraints, in case the UIViewController is using a
@@ -86,7 +88,7 @@
 
   NSLayoutConstraint* heightConstraint =
       [self.presentedViewController.view.heightAnchor
-          constraintEqualToConstant:fittingSize.height];
+          constraintEqualToConstant:height];
   heightConstraint.priority = UILayoutPriorityDefaultHigh + 1;
 
   UIView* popup = self.popupViewController.contentContainer;
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_table_view_controller.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_table_view_controller.mm
index d39cf8e..d50e4e0f 100644
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_table_view_controller.mm
+++ b/ios/chrome/browser/ui/popup_menu/popup_menu_table_view_controller.mm
@@ -87,6 +87,8 @@
       height += ceil(sizeForCell.height);
     }
   }
+  height +=
+      self.tableView.contentInset.top + self.tableView.contentInset.bottom;
   return CGSizeMake(width, height);
 }
 
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_view_controller.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_view_controller.mm
index a72395c..d6b28f9e8 100644
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_view_controller.mm
+++ b/ios/chrome/browser/ui/popup_menu/popup_menu_view_controller.mm
@@ -5,6 +5,7 @@
 #import "ios/chrome/browser/ui/popup_menu/popup_menu_view_controller.h"
 
 #import "ios/chrome/browser/ui/commands/browser_commands.h"
+#import "ios/chrome/browser/ui/image_util/image_util.h"
 #import "ios/chrome/browser/ui/util/constraints_ui_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -12,11 +13,9 @@
 #endif
 
 namespace {
+const CGFloat kImageMargin = 196;
 const CGFloat kCornerRadius = 13;
-const CGFloat kShadowRadius = 10;
-const CGFloat kShadowOpacity = 0.3;
-const CGFloat kBlurBackgroundGreyScale = 0.98;
-const CGFloat kBlurBackgroundAlpha = 0.95;
+const CGFloat kBackgroundGreyScale = 0.98;
 }  // namespace
 
 @interface PopupMenuViewController ()<UIGestureRecognizerDelegate>
@@ -58,30 +57,21 @@
 - (void)setUpContentContainer {
   _contentContainer = [[UIView alloc] init];
 
-  if (UIAccessibilityIsReduceTransparencyEnabled()) {
-    _contentContainer.backgroundColor =
-        [UIColor colorWithWhite:kBlurBackgroundGreyScale alpha:1];
-  } else {
-    _contentContainer.backgroundColor = [UIColor clearColor];
-    UIBlurEffect* blurEffect =
-        [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
-    UIVisualEffectView* blur =
-        [[UIVisualEffectView alloc] initWithEffect:blurEffect];
-    blur.contentView.backgroundColor =
-        [UIColor colorWithWhite:kBlurBackgroundGreyScale
-                          alpha:kBlurBackgroundAlpha];
-    [_contentContainer addSubview:blur];
-    blur.translatesAutoresizingMaskIntoConstraints = NO;
-    blur.layer.cornerRadius = kCornerRadius;
-    blur.layer.masksToBounds = YES;
-    AddSameConstraints(blur, _contentContainer);
-  }
+  _contentContainer.backgroundColor =
+      [UIColor colorWithWhite:kBackgroundGreyScale alpha:1];
 
+  UIImageView* shadow = [[UIImageView alloc]
+      initWithImage:StretchableImageNamed(@"popup_menu_shadow")];
+  [_contentContainer addSubview:shadow];
+  shadow.translatesAutoresizingMaskIntoConstraints = NO;
+  AddSameConstraintsToSidesWithInsets(
+      _contentContainer, shadow,
+      LayoutSides::kTop | LayoutSides::kBottom | LayoutSides::kLeading |
+          LayoutSides::kTrailing,
+      ChromeDirectionalEdgeInsetsMake(kImageMargin, kImageMargin, kImageMargin,
+                                      kImageMargin));
   _contentContainer.layer.cornerRadius = kCornerRadius;
-  _contentContainer.layer.shadowRadius = kShadowRadius;
-  _contentContainer.layer.shadowOpacity = kShadowOpacity;
   _contentContainer.translatesAutoresizingMaskIntoConstraints = NO;
-  // TODO(crbug.com/821765): Add update the shadow.
   [self.view addSubview:_contentContainer];
 }
 
diff --git a/ios/chrome/browser/ui/popup_menu/resources/BUILD.gn b/ios/chrome/browser/ui/popup_menu/resources/BUILD.gn
index 38ec1c1..36375a6f 100644
--- a/ios/chrome/browser/ui/popup_menu/resources/BUILD.gn
+++ b/ios/chrome/browser/ui/popup_menu/resources/BUILD.gn
@@ -4,6 +4,51 @@
 
 import("//build/config/ios/asset_catalog.gni")
 
+imageset("popup_menu_read_later") {
+  sources = [
+    "popup_menu_read_later.imageset/Contents.json",
+    "popup_menu_read_later.imageset/popup_menu_read_later.png",
+    "popup_menu_read_later.imageset/popup_menu_read_later@2x.png",
+    "popup_menu_read_later.imageset/popup_menu_read_later@3x.png",
+  ]
+}
+
+imageset("popup_menu_site_information") {
+  sources = [
+    "popup_menu_site_information.imageset/Contents.json",
+    "popup_menu_site_information.imageset/popup_menu_site_information.png",
+    "popup_menu_site_information.imageset/popup_menu_site_information@2x.png",
+    "popup_menu_site_information.imageset/popup_menu_site_information@3x.png",
+  ]
+}
+
+imageset("popup_menu_request_desktop_site") {
+  sources = [
+    "popup_menu_request_desktop_site.imageset/Contents.json",
+    "popup_menu_request_desktop_site.imageset/popup_menu_request_desktop_site.png",
+    "popup_menu_request_desktop_site.imageset/popup_menu_request_desktop_site@2x.png",
+    "popup_menu_request_desktop_site.imageset/popup_menu_request_desktop_site@3x.png",
+  ]
+}
+
+imageset("popup_menu_history") {
+  sources = [
+    "popup_menu_history.imageset/Contents.json",
+    "popup_menu_history.imageset/popup_menu_history.png",
+    "popup_menu_history.imageset/popup_menu_history@2x.png",
+    "popup_menu_history.imageset/popup_menu_history@3x.png",
+  ]
+}
+
+imageset("popup_menu_settings") {
+  sources = [
+    "popup_menu_settings.imageset/Contents.json",
+    "popup_menu_settings.imageset/popup_menu_settings.png",
+    "popup_menu_settings.imageset/popup_menu_settings@2x.png",
+    "popup_menu_settings.imageset/popup_menu_settings@3x.png",
+  ]
+}
+
 imageset("popup_background") {
   sources = [
     "popup_background.imageset/Contents.json",
@@ -12,3 +57,111 @@
     "popup_background.imageset/popup_background@3x.png",
   ]
 }
+
+imageset("popup_menu_shadow") {
+  sources = [
+    "popup_menu_shadow.imageset/Contents.json",
+    "popup_menu_shadow.imageset/popup_menu_shadow.png",
+    "popup_menu_shadow.imageset/popup_menu_shadow@2x.png",
+    "popup_menu_shadow.imageset/popup_menu_shadow@3x.png",
+  ]
+}
+
+imageset("popup_menu_new_incognito_tab") {
+  sources = [
+    "popup_menu_new_incognito_tab.imageset/Contents.json",
+    "popup_menu_new_incognito_tab.imageset/popup_menu_new_incognito_tab.png",
+    "popup_menu_new_incognito_tab.imageset/popup_menu_new_incognito_tab@2x.png",
+    "popup_menu_new_incognito_tab.imageset/popup_menu_new_incognito_tab@3x.png",
+  ]
+}
+
+imageset("popup_menu_find_in_page") {
+  sources = [
+    "popup_menu_find_in_page.imageset/Contents.json",
+    "popup_menu_find_in_page.imageset/popup_menu_find_in_page.png",
+    "popup_menu_find_in_page.imageset/popup_menu_find_in_page@2x.png",
+    "popup_menu_find_in_page.imageset/popup_menu_find_in_page@3x.png",
+  ]
+}
+
+imageset("popup_menu_recent_tabs") {
+  sources = [
+    "popup_menu_recent_tabs.imageset/Contents.json",
+    "popup_menu_recent_tabs.imageset/popup_menu_recent_tabs.png",
+    "popup_menu_recent_tabs.imageset/popup_menu_recent_tabs@2x.png",
+    "popup_menu_recent_tabs.imageset/popup_menu_recent_tabs@3x.png",
+  ]
+}
+
+imageset("popup_menu_reading_list") {
+  sources = [
+    "popup_menu_reading_list.imageset/Contents.json",
+    "popup_menu_reading_list.imageset/popup_menu_reading_list.png",
+    "popup_menu_reading_list.imageset/popup_menu_reading_list@2x.png",
+    "popup_menu_reading_list.imageset/popup_menu_reading_list@3x.png",
+  ]
+}
+
+imageset("popup_menu_reload") {
+  sources = [
+    "popup_menu_reload.imageset/Contents.json",
+    "popup_menu_reload.imageset/popup_menu_reload.png",
+    "popup_menu_reload.imageset/popup_menu_reload@2x.png",
+    "popup_menu_reload.imageset/popup_menu_reload@3x.png",
+  ]
+}
+
+imageset("popup_menu_bookmarks") {
+  sources = [
+    "popup_menu_bookmarks.imageset/Contents.json",
+    "popup_menu_bookmarks.imageset/popup_menu_bookmarks.png",
+    "popup_menu_bookmarks.imageset/popup_menu_bookmarks@2x.png",
+    "popup_menu_bookmarks.imageset/popup_menu_bookmarks@3x.png",
+  ]
+}
+
+imageset("popup_menu_request_mobile_site") {
+  sources = [
+    "popup_menu_request_mobile_site.imageset/Contents.json",
+    "popup_menu_request_mobile_site.imageset/popup_menu_request_mobile_site.png",
+    "popup_menu_request_mobile_site.imageset/popup_menu_request_mobile_site@2x.png",
+    "popup_menu_request_mobile_site.imageset/popup_menu_request_mobile_site@3x.png",
+  ]
+}
+
+imageset("popup_menu_stop") {
+  sources = [
+    "popup_menu_stop.imageset/Contents.json",
+    "popup_menu_stop.imageset/popup_menu_stop.png",
+    "popup_menu_stop.imageset/popup_menu_stop@2x.png",
+    "popup_menu_stop.imageset/popup_menu_stop@3x.png",
+  ]
+}
+
+imageset("popup_menu_report_an_issue") {
+  sources = [
+    "popup_menu_report_an_issue.imageset/Contents.json",
+    "popup_menu_report_an_issue.imageset/popup_menu_report_an_issue.png",
+    "popup_menu_report_an_issue.imageset/popup_menu_report_an_issue@2x.png",
+    "popup_menu_report_an_issue.imageset/popup_menu_report_an_issue@3x.png",
+  ]
+}
+
+imageset("popup_menu_new_tab") {
+  sources = [
+    "popup_menu_new_tab.imageset/Contents.json",
+    "popup_menu_new_tab.imageset/popup_menu_new_tab.png",
+    "popup_menu_new_tab.imageset/popup_menu_new_tab@2x.png",
+    "popup_menu_new_tab.imageset/popup_menu_new_tab@3x.png",
+  ]
+}
+
+imageset("popup_menu_help") {
+  sources = [
+    "popup_menu_help.imageset/Contents.json",
+    "popup_menu_help.imageset/popup_menu_help.png",
+    "popup_menu_help.imageset/popup_menu_help@2x.png",
+    "popup_menu_help.imageset/popup_menu_help@3x.png",
+  ]
+}
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_bookmarks.imageset/Contents.json b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_bookmarks.imageset/Contents.json
new file mode 100644
index 0000000..18c5ff58
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_bookmarks.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+    "images": [
+        {
+            "idiom": "universal",
+            "scale": "1x",
+            "filename": "popup_menu_bookmarks.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "2x",
+            "filename": "popup_menu_bookmarks@2x.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "3x",
+            "filename": "popup_menu_bookmarks@3x.png"
+        }
+    ],
+    "info": {
+        "version": 1,
+        "author": "xcode"
+    }
+}
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_bookmarks.imageset/popup_menu_bookmarks.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_bookmarks.imageset/popup_menu_bookmarks.png
new file mode 100644
index 0000000..009bf05
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_bookmarks.imageset/popup_menu_bookmarks.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_bookmarks.imageset/popup_menu_bookmarks@2x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_bookmarks.imageset/popup_menu_bookmarks@2x.png
new file mode 100644
index 0000000..1514a87
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_bookmarks.imageset/popup_menu_bookmarks@2x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_bookmarks.imageset/popup_menu_bookmarks@3x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_bookmarks.imageset/popup_menu_bookmarks@3x.png
new file mode 100644
index 0000000..dd295af
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_bookmarks.imageset/popup_menu_bookmarks@3x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_find_in_page.imageset/Contents.json b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_find_in_page.imageset/Contents.json
new file mode 100644
index 0000000..1172036
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_find_in_page.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+    "images": [
+        {
+            "idiom": "universal",
+            "scale": "1x",
+            "filename": "popup_menu_find_in_page.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "2x",
+            "filename": "popup_menu_find_in_page@2x.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "3x",
+            "filename": "popup_menu_find_in_page@3x.png"
+        }
+    ],
+    "info": {
+        "version": 1,
+        "author": "xcode"
+    }
+}
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_find_in_page.imageset/popup_menu_find_in_page.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_find_in_page.imageset/popup_menu_find_in_page.png
new file mode 100644
index 0000000..73ae5c2
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_find_in_page.imageset/popup_menu_find_in_page.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_find_in_page.imageset/popup_menu_find_in_page@2x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_find_in_page.imageset/popup_menu_find_in_page@2x.png
new file mode 100644
index 0000000..4f7941e1
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_find_in_page.imageset/popup_menu_find_in_page@2x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_find_in_page.imageset/popup_menu_find_in_page@3x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_find_in_page.imageset/popup_menu_find_in_page@3x.png
new file mode 100644
index 0000000..c51229db
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_find_in_page.imageset/popup_menu_find_in_page@3x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_help.imageset/Contents.json b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_help.imageset/Contents.json
new file mode 100644
index 0000000..91332a1
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_help.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+    "images": [
+        {
+            "idiom": "universal",
+            "scale": "1x",
+            "filename": "popup_menu_help.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "2x",
+            "filename": "popup_menu_help@2x.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "3x",
+            "filename": "popup_menu_help@3x.png"
+        }
+    ],
+    "info": {
+        "version": 1,
+        "author": "xcode"
+    }
+}
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_help.imageset/popup_menu_help.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_help.imageset/popup_menu_help.png
new file mode 100644
index 0000000..55969348
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_help.imageset/popup_menu_help.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_help.imageset/popup_menu_help@2x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_help.imageset/popup_menu_help@2x.png
new file mode 100644
index 0000000..e0e6c3d7
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_help.imageset/popup_menu_help@2x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_help.imageset/popup_menu_help@3x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_help.imageset/popup_menu_help@3x.png
new file mode 100644
index 0000000..07313b6
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_help.imageset/popup_menu_help@3x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_history.imageset/Contents.json b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_history.imageset/Contents.json
new file mode 100644
index 0000000..017e5b7
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_history.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+    "images": [
+        {
+            "idiom": "universal",
+            "scale": "1x",
+            "filename": "popup_menu_history.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "2x",
+            "filename": "popup_menu_history@2x.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "3x",
+            "filename": "popup_menu_history@3x.png"
+        }
+    ],
+    "info": {
+        "version": 1,
+        "author": "xcode"
+    }
+}
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_history.imageset/popup_menu_history.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_history.imageset/popup_menu_history.png
new file mode 100644
index 0000000..7b0795b
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_history.imageset/popup_menu_history.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_history.imageset/popup_menu_history@2x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_history.imageset/popup_menu_history@2x.png
new file mode 100644
index 0000000..14aeea74
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_history.imageset/popup_menu_history@2x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_history.imageset/popup_menu_history@3x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_history.imageset/popup_menu_history@3x.png
new file mode 100644
index 0000000..7e22a63
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_history.imageset/popup_menu_history@3x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_incognito_tab.imageset/Contents.json b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_incognito_tab.imageset/Contents.json
new file mode 100644
index 0000000..3f70d99
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_incognito_tab.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+    "images": [
+        {
+            "idiom": "universal",
+            "scale": "1x",
+            "filename": "popup_menu_new_incognito_tab.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "2x",
+            "filename": "popup_menu_new_incognito_tab@2x.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "3x",
+            "filename": "popup_menu_new_incognito_tab@3x.png"
+        }
+    ],
+    "info": {
+        "version": 1,
+        "author": "xcode"
+    }
+}
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_incognito_tab.imageset/popup_menu_new_incognito_tab.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_incognito_tab.imageset/popup_menu_new_incognito_tab.png
new file mode 100644
index 0000000..421170ab
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_incognito_tab.imageset/popup_menu_new_incognito_tab.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_incognito_tab.imageset/popup_menu_new_incognito_tab@2x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_incognito_tab.imageset/popup_menu_new_incognito_tab@2x.png
new file mode 100644
index 0000000..3fbb48f
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_incognito_tab.imageset/popup_menu_new_incognito_tab@2x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_incognito_tab.imageset/popup_menu_new_incognito_tab@3x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_incognito_tab.imageset/popup_menu_new_incognito_tab@3x.png
new file mode 100644
index 0000000..fc88721
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_incognito_tab.imageset/popup_menu_new_incognito_tab@3x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_tab.imageset/Contents.json b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_tab.imageset/Contents.json
new file mode 100644
index 0000000..2e74144c
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_tab.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+    "images": [
+        {
+            "idiom": "universal",
+            "scale": "1x",
+            "filename": "popup_menu_new_tab.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "2x",
+            "filename": "popup_menu_new_tab@2x.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "3x",
+            "filename": "popup_menu_new_tab@3x.png"
+        }
+    ],
+    "info": {
+        "version": 1,
+        "author": "xcode"
+    }
+}
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_tab.imageset/popup_menu_new_tab.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_tab.imageset/popup_menu_new_tab.png
new file mode 100644
index 0000000..fb0141b9
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_tab.imageset/popup_menu_new_tab.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_tab.imageset/popup_menu_new_tab@2x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_tab.imageset/popup_menu_new_tab@2x.png
new file mode 100644
index 0000000..dd7f0bf3
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_tab.imageset/popup_menu_new_tab@2x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_tab.imageset/popup_menu_new_tab@3x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_tab.imageset/popup_menu_new_tab@3x.png
new file mode 100644
index 0000000..c74defa
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_tab.imageset/popup_menu_new_tab@3x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_read_later.imageset/Contents.json b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_read_later.imageset/Contents.json
new file mode 100644
index 0000000..46cc743
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_read_later.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+    "images": [
+        {
+            "idiom": "universal",
+            "scale": "1x",
+            "filename": "popup_menu_read_later.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "2x",
+            "filename": "popup_menu_read_later@2x.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "3x",
+            "filename": "popup_menu_read_later@3x.png"
+        }
+    ],
+    "info": {
+        "version": 1,
+        "author": "xcode"
+    }
+}
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_read_later.imageset/popup_menu_read_later.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_read_later.imageset/popup_menu_read_later.png
new file mode 100644
index 0000000..c680f9ba
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_read_later.imageset/popup_menu_read_later.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_read_later.imageset/popup_menu_read_later@2x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_read_later.imageset/popup_menu_read_later@2x.png
new file mode 100644
index 0000000..a299f39
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_read_later.imageset/popup_menu_read_later@2x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_read_later.imageset/popup_menu_read_later@3x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_read_later.imageset/popup_menu_read_later@3x.png
new file mode 100644
index 0000000..136e7eee
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_read_later.imageset/popup_menu_read_later@3x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_reading_list.imageset/Contents.json b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_reading_list.imageset/Contents.json
new file mode 100644
index 0000000..ed4d342
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_reading_list.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+    "images": [
+        {
+            "idiom": "universal",
+            "scale": "1x",
+            "filename": "popup_menu_reading_list.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "2x",
+            "filename": "popup_menu_reading_list@2x.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "3x",
+            "filename": "popup_menu_reading_list@3x.png"
+        }
+    ],
+    "info": {
+        "version": 1,
+        "author": "xcode"
+    }
+}
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_reading_list.imageset/popup_menu_reading_list.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_reading_list.imageset/popup_menu_reading_list.png
new file mode 100644
index 0000000..dd533b17
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_reading_list.imageset/popup_menu_reading_list.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_reading_list.imageset/popup_menu_reading_list@2x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_reading_list.imageset/popup_menu_reading_list@2x.png
new file mode 100644
index 0000000..7c2e847
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_reading_list.imageset/popup_menu_reading_list@2x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_reading_list.imageset/popup_menu_reading_list@3x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_reading_list.imageset/popup_menu_reading_list@3x.png
new file mode 100644
index 0000000..763fc702
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_reading_list.imageset/popup_menu_reading_list@3x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_recent_tabs.imageset/Contents.json b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_recent_tabs.imageset/Contents.json
new file mode 100644
index 0000000..0b771f7
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_recent_tabs.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+    "images": [
+        {
+            "idiom": "universal",
+            "scale": "1x",
+            "filename": "popup_menu_recent_tabs.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "2x",
+            "filename": "popup_menu_recent_tabs@2x.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "3x",
+            "filename": "popup_menu_recent_tabs@3x.png"
+        }
+    ],
+    "info": {
+        "version": 1,
+        "author": "xcode"
+    }
+}
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_recent_tabs.imageset/popup_menu_recent_tabs.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_recent_tabs.imageset/popup_menu_recent_tabs.png
new file mode 100644
index 0000000..513a287
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_recent_tabs.imageset/popup_menu_recent_tabs.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_recent_tabs.imageset/popup_menu_recent_tabs@2x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_recent_tabs.imageset/popup_menu_recent_tabs@2x.png
new file mode 100644
index 0000000..a2e045a
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_recent_tabs.imageset/popup_menu_recent_tabs@2x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_recent_tabs.imageset/popup_menu_recent_tabs@3x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_recent_tabs.imageset/popup_menu_recent_tabs@3x.png
new file mode 100644
index 0000000..201cbae
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_recent_tabs.imageset/popup_menu_recent_tabs@3x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_reload.imageset/Contents.json b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_reload.imageset/Contents.json
new file mode 100644
index 0000000..26eeeae
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_reload.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+    "images": [
+        {
+            "idiom": "universal",
+            "scale": "1x",
+            "filename": "popup_menu_reload.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "2x",
+            "filename": "popup_menu_reload@2x.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "3x",
+            "filename": "popup_menu_reload@3x.png"
+        }
+    ],
+    "info": {
+        "version": 1,
+        "author": "xcode"
+    }
+}
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_reload.imageset/popup_menu_reload.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_reload.imageset/popup_menu_reload.png
new file mode 100644
index 0000000..bee0386
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_reload.imageset/popup_menu_reload.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_reload.imageset/popup_menu_reload@2x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_reload.imageset/popup_menu_reload@2x.png
new file mode 100644
index 0000000..c47d3798
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_reload.imageset/popup_menu_reload@2x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_reload.imageset/popup_menu_reload@3x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_reload.imageset/popup_menu_reload@3x.png
new file mode 100644
index 0000000..0f2f88e6
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_reload.imageset/popup_menu_reload@3x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_report_an_issue.imageset/Contents.json b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_report_an_issue.imageset/Contents.json
new file mode 100644
index 0000000..b64986b
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_report_an_issue.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+    "images": [
+        {
+            "idiom": "universal",
+            "scale": "1x",
+            "filename": "popup_menu_report_an_issue.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "2x",
+            "filename": "popup_menu_report_an_issue@2x.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "3x",
+            "filename": "popup_menu_report_an_issue@3x.png"
+        }
+    ],
+    "info": {
+        "version": 1,
+        "author": "xcode"
+    }
+}
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_report_an_issue.imageset/popup_menu_report_an_issue.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_report_an_issue.imageset/popup_menu_report_an_issue.png
new file mode 100644
index 0000000..12b2be03
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_report_an_issue.imageset/popup_menu_report_an_issue.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_report_an_issue.imageset/popup_menu_report_an_issue@2x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_report_an_issue.imageset/popup_menu_report_an_issue@2x.png
new file mode 100644
index 0000000..abc5980
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_report_an_issue.imageset/popup_menu_report_an_issue@2x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_report_an_issue.imageset/popup_menu_report_an_issue@3x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_report_an_issue.imageset/popup_menu_report_an_issue@3x.png
new file mode 100644
index 0000000..d5f83bd
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_report_an_issue.imageset/popup_menu_report_an_issue@3x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_request_desktop_site.imageset/Contents.json b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_request_desktop_site.imageset/Contents.json
new file mode 100644
index 0000000..bf8314cc
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_request_desktop_site.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+    "images": [
+        {
+            "idiom": "universal",
+            "scale": "1x",
+            "filename": "popup_menu_request_desktop_site.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "2x",
+            "filename": "popup_menu_request_desktop_site@2x.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "3x",
+            "filename": "popup_menu_request_desktop_site@3x.png"
+        }
+    ],
+    "info": {
+        "version": 1,
+        "author": "xcode"
+    }
+}
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_request_desktop_site.imageset/popup_menu_request_desktop_site.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_request_desktop_site.imageset/popup_menu_request_desktop_site.png
new file mode 100644
index 0000000..a49de98d
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_request_desktop_site.imageset/popup_menu_request_desktop_site.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_request_desktop_site.imageset/popup_menu_request_desktop_site@2x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_request_desktop_site.imageset/popup_menu_request_desktop_site@2x.png
new file mode 100644
index 0000000..01f702d
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_request_desktop_site.imageset/popup_menu_request_desktop_site@2x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_request_desktop_site.imageset/popup_menu_request_desktop_site@3x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_request_desktop_site.imageset/popup_menu_request_desktop_site@3x.png
new file mode 100644
index 0000000..540d8ee
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_request_desktop_site.imageset/popup_menu_request_desktop_site@3x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_request_mobile_site.imageset/Contents.json b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_request_mobile_site.imageset/Contents.json
new file mode 100644
index 0000000..f4e13f7
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_request_mobile_site.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+    "images": [
+        {
+            "idiom": "universal",
+            "scale": "1x",
+            "filename": "popup_menu_request_mobile_site.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "2x",
+            "filename": "popup_menu_request_mobile_site@2x.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "3x",
+            "filename": "popup_menu_request_mobile_site@3x.png"
+        }
+    ],
+    "info": {
+        "version": 1,
+        "author": "xcode"
+    }
+}
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_request_mobile_site.imageset/popup_menu_request_mobile_site.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_request_mobile_site.imageset/popup_menu_request_mobile_site.png
new file mode 100644
index 0000000..1d6ffbb
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_request_mobile_site.imageset/popup_menu_request_mobile_site.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_request_mobile_site.imageset/popup_menu_request_mobile_site@2x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_request_mobile_site.imageset/popup_menu_request_mobile_site@2x.png
new file mode 100644
index 0000000..31a6dd9
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_request_mobile_site.imageset/popup_menu_request_mobile_site@2x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_request_mobile_site.imageset/popup_menu_request_mobile_site@3x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_request_mobile_site.imageset/popup_menu_request_mobile_site@3x.png
new file mode 100644
index 0000000..d4d0218
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_request_mobile_site.imageset/popup_menu_request_mobile_site@3x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_settings.imageset/Contents.json b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_settings.imageset/Contents.json
new file mode 100644
index 0000000..8e4995b
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_settings.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+    "images": [
+        {
+            "idiom": "universal",
+            "scale": "1x",
+            "filename": "popup_menu_settings.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "2x",
+            "filename": "popup_menu_settings@2x.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "3x",
+            "filename": "popup_menu_settings@3x.png"
+        }
+    ],
+    "info": {
+        "version": 1,
+        "author": "xcode"
+    }
+}
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_settings.imageset/popup_menu_settings.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_settings.imageset/popup_menu_settings.png
new file mode 100644
index 0000000..0f9e306
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_settings.imageset/popup_menu_settings.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_settings.imageset/popup_menu_settings@2x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_settings.imageset/popup_menu_settings@2x.png
new file mode 100644
index 0000000..2514af1
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_settings.imageset/popup_menu_settings@2x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_settings.imageset/popup_menu_settings@3x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_settings.imageset/popup_menu_settings@3x.png
new file mode 100644
index 0000000..ff2fcbe
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_settings.imageset/popup_menu_settings@3x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_shadow.imageset/Contents.json b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_shadow.imageset/Contents.json
new file mode 100644
index 0000000..2f7a347
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_shadow.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+    "images": [
+        {
+            "idiom": "universal",
+            "scale": "1x",
+            "filename": "popup_menu_shadow.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "2x",
+            "filename": "popup_menu_shadow@2x.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "3x",
+            "filename": "popup_menu_shadow@3x.png"
+        }
+    ],
+    "info": {
+        "version": 1,
+        "author": "xcode"
+    }
+}
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_shadow.imageset/popup_menu_shadow.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_shadow.imageset/popup_menu_shadow.png
new file mode 100644
index 0000000..ab08648
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_shadow.imageset/popup_menu_shadow.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_shadow.imageset/popup_menu_shadow@2x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_shadow.imageset/popup_menu_shadow@2x.png
new file mode 100644
index 0000000..b40fd587
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_shadow.imageset/popup_menu_shadow@2x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_shadow.imageset/popup_menu_shadow@3x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_shadow.imageset/popup_menu_shadow@3x.png
new file mode 100644
index 0000000..7c81dd0
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_shadow.imageset/popup_menu_shadow@3x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_site_information.imageset/Contents.json b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_site_information.imageset/Contents.json
new file mode 100644
index 0000000..ce52ad0
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_site_information.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+    "images": [
+        {
+            "idiom": "universal",
+            "scale": "1x",
+            "filename": "popup_menu_site_information.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "2x",
+            "filename": "popup_menu_site_information@2x.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "3x",
+            "filename": "popup_menu_site_information@3x.png"
+        }
+    ],
+    "info": {
+        "version": 1,
+        "author": "xcode"
+    }
+}
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_site_information.imageset/popup_menu_site_information.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_site_information.imageset/popup_menu_site_information.png
new file mode 100644
index 0000000..f2faf44c
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_site_information.imageset/popup_menu_site_information.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_site_information.imageset/popup_menu_site_information@2x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_site_information.imageset/popup_menu_site_information@2x.png
new file mode 100644
index 0000000..ebd27c9d
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_site_information.imageset/popup_menu_site_information@2x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_site_information.imageset/popup_menu_site_information@3x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_site_information.imageset/popup_menu_site_information@3x.png
new file mode 100644
index 0000000..d10c07b
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_site_information.imageset/popup_menu_site_information@3x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_stop.imageset/Contents.json b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_stop.imageset/Contents.json
new file mode 100644
index 0000000..0ac0395c
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_stop.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+    "images": [
+        {
+            "idiom": "universal",
+            "scale": "1x",
+            "filename": "popup_menu_stop.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "2x",
+            "filename": "popup_menu_stop@2x.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "3x",
+            "filename": "popup_menu_stop@3x.png"
+        }
+    ],
+    "info": {
+        "version": 1,
+        "author": "xcode"
+    }
+}
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_stop.imageset/popup_menu_stop.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_stop.imageset/popup_menu_stop.png
new file mode 100644
index 0000000..cb53a8c
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_stop.imageset/popup_menu_stop.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_stop.imageset/popup_menu_stop@2x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_stop.imageset/popup_menu_stop@2x.png
new file mode 100644
index 0000000..842db9e
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_stop.imageset/popup_menu_stop@2x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_stop.imageset/popup_menu_stop@3x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_stop.imageset/popup_menu_stop@3x.png
new file mode 100644
index 0000000..9170c50
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_stop.imageset/popup_menu_stop@3x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/print/print_controller.mm b/ios/chrome/browser/ui/print/print_controller.mm
index 99f7301..5c7303d 100644
--- a/ios/chrome/browser/ui/print/print_controller.mm
+++ b/ios/chrome/browser/ui/print/print_controller.mm
@@ -10,7 +10,6 @@
 #include <memory>
 
 #include "base/callback_helpers.h"
-#import "base/ios/ios_util.h"
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/mac/bind_objc_block.h"
@@ -136,45 +135,6 @@
       NSError* error) {
     if (error)
       DLOG(ERROR) << "Air printing error: " << error.description;
-
-    // When printing a NSData object given to the
-    // UIPrintInteractionController's |printingItem| object, a PDF file
-    // representing the NSData object is created in the app's tmp directory
-    // by the OS and never deleted. So, this workaround deletes PDF files in
-    // tmp now that printing is done. When iOS9 is deprecated, this can
-    // be removed since PDFs will no longer need to be downloaded to print,
-    // and |printingItem| will no longer be used.
-    if (!base::ios::IsRunningOnIOS10OrLater() && isPDF) {
-      base::PostTaskWithTraits(
-          FROM_HERE, {base::MayBlock(), base::TaskPriority::BACKGROUND},
-          base::BindBlockArc(^{
-            NSFileManager* manager = [NSFileManager defaultManager];
-            NSString* tempDir = NSTemporaryDirectory();
-            NSError* tempDirError = nil;
-
-            // Iterate over files in tmp directory.
-            for (NSString* file in
-                 [manager contentsOfDirectoryAtPath:tempDir
-                                              error:&tempDirError]) {
-              // If the file is a PDF file, delete it.
-              if ([[file pathExtension] isEqualToString:@"pdf"]) {
-                NSError* deletionError = nil;
-                NSString* fullFilePath =
-                    [tempDir stringByAppendingPathComponent:file];
-                BOOL success = [manager removeItemAtPath:fullFilePath
-                                                   error:&deletionError];
-                if (!success) {
-                  DLOG(ERROR) << "AirPrint unable to remove tmp file:" << file
-                              << " error: " << deletionError.description;
-                }
-              }
-            }
-            if (tempDirError) {
-              DLOG(ERROR) << "AirPrint tmp dir access error:"
-                          << tempDirError.description;
-            }
-          }));
-    }
   };
   [printInteractionController presentAnimated:YES
                             completionHandler:completionHandler];
@@ -202,47 +162,13 @@
   printInfo.outputType = UIPrintInfoOutputGeneral;
   printInfo.jobName = title;
   printInteractionController.printInfo = printInfo;
-#if !defined(__IPHONE_10_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_10_0
-  printInteractionController.showsPageRange = YES;
-#endif
 
-  // Print Formatters do not work for PDFs in iOS9 WKWebView, but do in iOS10.
-  // Instead, download the PDF and (eventually) pass it to the
-  // UIPrintInteractionController. Remove this workaround and all associated PDF
-  // specific code when iOS9 is deprecated.
-  BOOL isPDFURL = NO;
-  if (!base::ios::IsRunningOnIOS10OrLater() &&
-      [view isMemberOfClass:[WKWebView class]]) {
-    WKWebView* webView = base::mac::ObjCCastStrict<WKWebView>(view);
-    NSURL* URL = webView.URL;
-    CFStringRef UTI = UTTypeCreatePreferredIdentifierForTag(
-        kUTTagClassFilenameExtension,
-        (__bridge CFStringRef)[[URL path] pathExtension], NULL);
-    if (UTI) {
-      CFStringRef MIMEType =
-          UTTypeCopyPreferredTagWithClass(UTI, kUTTagClassMIMEType);
-      if (MIMEType) {
-        isPDFURL =
-            [@(kPDFMimeType) isEqualToString:(__bridge NSString*)MIMEType];
-        if (isPDFURL) {
-          [self downloadPDFFileWithURL:net::GURLWithNSURL(URL)
-                        viewController:viewController];
-        }
-        CFRelease(MIMEType);
-      }
-      CFRelease(UTI);
-    }
-  }
-
-  if (!isPDFURL) {
-    UIPrintPageRenderer* renderer = [[UIPrintPageRenderer alloc] init];
-    [renderer addPrintFormatter:[view viewPrintFormatter]
-          startingAtPageAtIndex:0];
-    printInteractionController.printPageRenderer = renderer;
-    [PrintController
-        displayPrintInteractionController:printInteractionController
-                                   forPDF:NO];
-  }
+  UIPrintPageRenderer* renderer = [[UIPrintPageRenderer alloc] init];
+  [renderer addPrintFormatter:[view viewPrintFormatter]
+        startingAtPageAtIndex:0];
+  printInteractionController.printPageRenderer = renderer;
+  [PrintController displayPrintInteractionController:printInteractionController
+                                              forPDF:NO];
 }
 
 - (void)dismissAnimated:(BOOL)animated {
diff --git a/ios/chrome/browser/ui/tab_switcher/BUILD.gn b/ios/chrome/browser/ui/tab_switcher/BUILD.gn
index 317cd62..2bd2492 100644
--- a/ios/chrome/browser/ui/tab_switcher/BUILD.gn
+++ b/ios/chrome/browser/ui/tab_switcher/BUILD.gn
@@ -109,6 +109,18 @@
   ]
 }
 
+source_set("modes") {
+  configs += [ "//build/config/compiler:enable_arc" ]
+  sources = [
+    "tab_switcher_mode.h",
+    "tab_switcher_mode.mm",
+  ]
+  deps = [
+    "//base",
+    "//ios/chrome/browser/ui",
+  ]
+}
+
 source_set("utils") {
   configs += [ "//build/config/compiler:enable_arc" ]
   sources = [
@@ -183,6 +195,7 @@
   ]
   deps = [
     ":egtest_support",
+    ":modes",
     ":tab_switcher",
     "//base",
     "//base/test:test_support",
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_switcher_controller_egtest.mm b/ios/chrome/browser/ui/tab_switcher/tab_switcher_controller_egtest.mm
index c7af661..825fcb63 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_switcher_controller_egtest.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_switcher_controller_egtest.mm
@@ -10,6 +10,7 @@
 #include "ios/chrome/browser/chrome_switches.h"
 #import "ios/chrome/browser/ui/authentication/signin_earlgrey_utils.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_egtest_util.h"
+#include "ios/chrome/browser/ui/tab_switcher/tab_switcher_mode.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_cell.h"
 #import "ios/chrome/browser/ui/ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
@@ -85,8 +86,10 @@
 
 // Tests entering and leaving the tab switcher.
 - (void)testEnteringTabSwitcher {
-  if (!IsIPadIdiom())
-    return;
+  if (GetTabSwitcherMode() != TabSwitcherMode::TABLET_SWITCHER) {
+    EARL_GREY_TEST_SKIPPED(
+        @"TabSwitcher tests are not applicable in this configuration");
+  }
 
   [self assertTabSwitcherIsInactive];
 
@@ -108,8 +111,10 @@
 // Tests entering tab switcher by closing all tabs, and leaving the tab switcher
 // by creating a new tab.
 - (void)testClosingAllTabsAndCreatingNewTab {
-  if (!IsIPadIdiom())
-    return;
+  if (GetTabSwitcherMode() != TabSwitcherMode::TABLET_SWITCHER) {
+    EARL_GREY_TEST_SKIPPED(
+        @"TabSwitcher tests are not applicable in this configuration");
+  }
 
   [self assertTabSwitcherIsInactive];
 
@@ -132,8 +137,10 @@
 
 // Tests entering tab switcher from incognito mode.
 - (void)testIncognitoTabs {
-  if (!IsIPadIdiom())
-    return;
+  if (GetTabSwitcherMode() != TabSwitcherMode::TABLET_SWITCHER) {
+    EARL_GREY_TEST_SKIPPED(
+        @"TabSwitcher tests are not applicable in this configuration");
+  }
 
   [self assertTabSwitcherIsInactive];
 
@@ -176,8 +183,10 @@
 
 // Tests leaving the tab switcher while on the "Other Devices" panel.
 - (void)testLeavingSwitcherFromOtherDevices {
-  if (!IsIPadIdiom())
-    return;
+  if (GetTabSwitcherMode() != TabSwitcherMode::TABLET_SWITCHER) {
+    EARL_GREY_TEST_SKIPPED(
+        @"TabSwitcher tests are not applicable in this configuration");
+  }
 
   [self assertTabSwitcherIsInactive];
 
@@ -216,8 +225,10 @@
 // Tests that elements on iPad tab switcher are accessible.
 // TODO: (crbug.com/691095) Open tabs label is not accessible
 - (void)DISABLED_testAccessibilityOnTabSwitcher {
-  if (!IsIPadIdiom())
-    return;
+  if (GetTabSwitcherMode() != TabSwitcherMode::TABLET_SWITCHER) {
+    EARL_GREY_TEST_SKIPPED(
+        @"TabSwitcher tests are not applicable in this configuration");
+  }
   [self assertTabSwitcherIsInactive];
 
   [[EarlGrey selectElementWithMatcher:TabletTabSwitcherOpenButton()]
@@ -239,8 +250,10 @@
 // Tests that elements on iPad tab switcher incognito tab are accessible.
 // TODO: (crbug.com/691095) Incognito tabs label should be tappable.
 - (void)DISABLED_testAccessibilityOnIncognitoTabSwitcher {
-  if (!IsIPadIdiom())
-    return;
+  if (GetTabSwitcherMode() != TabSwitcherMode::TABLET_SWITCHER) {
+    EARL_GREY_TEST_SKIPPED(
+        @"TabSwitcher tests are not applicable in this configuration");
+  }
   [self assertTabSwitcherIsInactive];
 
   [[EarlGrey selectElementWithMatcher:TabletTabSwitcherOpenButton()]
@@ -267,8 +280,10 @@
 // Tests that elements on iPad tab switcher other devices are accessible.
 // TODO: (crbug.com/691095) Other devices label should be tappable.
 - (void)DISABLED_testAccessibilityOnOtherDeviceTabSwitcher {
-  if (!IsIPadIdiom())
-    return;
+  if (GetTabSwitcherMode() != TabSwitcherMode::TABLET_SWITCHER) {
+    EARL_GREY_TEST_SKIPPED(
+        @"TabSwitcher tests are not applicable in this configuration");
+  }
   [self assertTabSwitcherIsInactive];
 
   [[EarlGrey selectElementWithMatcher:TabletTabSwitcherOpenButton()]
@@ -295,9 +310,10 @@
 // Tests that closing a Tab that has a queued dialog successfully cancels the
 // dialog.
 - (void)testCloseTabWithDialog {
-  // The TabSwitcherController is only used on iPhones.
-  if (!IsIPadIdiom())
-    EARL_GREY_TEST_SKIPPED(@"TabSwitcherController is only used on iPads.");
+  if (GetTabSwitcherMode() != TabSwitcherMode::TABLET_SWITCHER) {
+    EARL_GREY_TEST_SKIPPED(
+        @"TabSwitcher tests are not applicable in this configuration");
+  }
 
   // Load the blank test page so that JavaScript can be executed.
   const GURL kBlankPageURL = HttpServer::MakeUrl("http://blank-page");
@@ -345,8 +361,10 @@
 
 // Tests sign-in promo view in cold state.
 - (void)testColdSigninPromoView {
-  if (!IsIPadIdiom())
-    return;
+  if (GetTabSwitcherMode() != TabSwitcherMode::TABLET_SWITCHER) {
+    EARL_GREY_TEST_SKIPPED(
+        @"TabSwitcher tests are not applicable in this configuration");
+  }
 
   // Enter the tab switcher and press the "Other Devices" button.
   [[EarlGrey selectElementWithMatcher:TabletTabSwitcherOpenButton()]
@@ -362,8 +380,10 @@
 
 // Tests sign-in promo view in warm state.
 - (void)testWarmSigninPromoView {
-  if (!IsIPadIdiom())
-    return;
+  if (GetTabSwitcherMode() != TabSwitcherMode::TABLET_SWITCHER) {
+    EARL_GREY_TEST_SKIPPED(
+        @"TabSwitcher tests are not applicable in this configuration");
+  }
 
   // Set up a fake identity.
   ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
@@ -399,8 +419,10 @@
 // Tests to reload the other devices tab after sign-in.
 // See crbug.comm/832527
 - (void)testReloadOtherTabDevicesTab {
-  if (!IsIPadIdiom())
-    return;
+  if (GetTabSwitcherMode() != TabSwitcherMode::TABLET_SWITCHER) {
+    EARL_GREY_TEST_SKIPPED(
+        @"TabSwitcher tests are not applicable in this configuration");
+  }
 
   // Set up a fake identity.
   ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_switcher_mode.h b/ios/chrome/browser/ui/tab_switcher/tab_switcher_mode.h
new file mode 100644
index 0000000..751f1c4
--- /dev/null
+++ b/ios/chrome/browser/ui/tab_switcher/tab_switcher_mode.h
@@ -0,0 +1,14 @@
+// Copyright 2018 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_TAB_SWITCHER_TAB_SWITCHER_MODE_H_
+#define IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_SWITCHER_MODE_H_
+
+// The style of tab switcher.
+enum class TabSwitcherMode { STACK, TABLET_SWITCHER, GRID };
+
+// Returns the current tab switcher mode.
+TabSwitcherMode GetTabSwitcherMode();
+
+#endif  // IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_SWITCHER_MODE_H_
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_switcher_mode.mm b/ios/chrome/browser/ui/tab_switcher/tab_switcher_mode.mm
new file mode 100644
index 0000000..0198ebf
--- /dev/null
+++ b/ios/chrome/browser/ui/tab_switcher/tab_switcher_mode.mm
@@ -0,0 +1,21 @@
+// Copyright 2018 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/tab_switcher/tab_switcher_mode.h"
+
+#include "ios/chrome/browser/ui/ui_util.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+TabSwitcherMode GetTabSwitcherMode() {
+  if (IsUIRefreshPhase1Enabled()) {
+    return TabSwitcherMode::GRID;
+  } else if (IsIPadIdiom()) {
+    return TabSwitcherMode::TABLET_SWITCHER;
+  } else {
+    return TabSwitcherMode::STACK;
+  }
+}
diff --git a/ios/chrome/browser/ui/table_view/BUILD.gn b/ios/chrome/browser/ui/table_view/BUILD.gn
index 9b035930..9c48af9 100644
--- a/ios/chrome/browser/ui/table_view/BUILD.gn
+++ b/ios/chrome/browser/ui/table_view/BUILD.gn
@@ -7,6 +7,8 @@
   sources = [
     "chrome_table_view_controller.h",
     "chrome_table_view_controller.mm",
+    "table_container_bottom_toolbar.h",
+    "table_container_bottom_toolbar.mm",
     "table_container_view_controller.h",
     "table_container_view_controller.mm",
     "table_view_model.h",
@@ -48,6 +50,7 @@
   testonly = true
   sources = [
     "chrome_table_view_controller_unittest.mm",
+    "table_container_bottom_toolbar_unittest.mm",
     "table_view_model_unittest.mm",
   ]
   deps = [
diff --git a/ios/chrome/browser/ui/table_view/table_container_bottom_toolbar.h b/ios/chrome/browser/ui/table_view/table_container_bottom_toolbar.h
new file mode 100644
index 0000000..c61c0a5
--- /dev/null
+++ b/ios/chrome/browser/ui/table_view/table_container_bottom_toolbar.h
@@ -0,0 +1,27 @@
+// Copyright 2018 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_TABLE_VIEW_TABLE_CONTAINER_BOTTOM_TOOLBAR_H_
+#define IOS_CHROME_BROWSER_UI_TABLE_VIEW_TABLE_CONTAINER_BOTTOM_TOOLBAR_H_
+
+#import <UIKit/UIKit.h>
+
+// TableContainer Bottom Toolbar that contains action buttons.
+@interface TableContainerBottomToolbar : UIView
+// Returns a Toolbar with leading and/or trailing buttons. If any of the
+// parameters are nil or an empty string, a button will not be created.
+- (instancetype)initWithLeadingButtonText:(NSString*)leadingButtonText
+                       trailingButtonText:(NSString*)trailingButtonText
+    NS_DESIGNATED_INITIALIZER;
+- (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE;
+- (instancetype)initWithCoder:(NSCoder*)aDecoder NS_UNAVAILABLE;
+
+// Leading Toolbar button, nil if there's no leading button.
+@property(nonatomic, strong, readonly) UIButton* leadingButton;
+// Trailing Toolbar button, nil if there's no trailing button.
+@property(nonatomic, strong, readonly) UIButton* trailingButton;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_TABLE_VIEW_TABLE_CONTAINER_BOTTOM_TOOLBAR_H_
diff --git a/ios/chrome/browser/ui/table_view/table_container_bottom_toolbar.mm b/ios/chrome/browser/ui/table_view/table_container_bottom_toolbar.mm
new file mode 100644
index 0000000..a5418445
--- /dev/null
+++ b/ios/chrome/browser/ui/table_view/table_container_bottom_toolbar.mm
@@ -0,0 +1,73 @@
+// Copyright 2018 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/table_view/table_container_bottom_toolbar.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace {
+// Horizontal margins.
+const CGFloat kHorizontalMargin = 10.0;
+}
+
+@interface TableContainerBottomToolbar ()
+// Re-declare as readwrite.
+@property(nonatomic, strong, readwrite) UIButton* leadingButton;
+// Re-declare as readwrite.
+@property(nonatomic, strong, readwrite) UIButton* trailingButton;
+// StackView that contains the buttons.
+@property(nonatomic, strong) UIStackView* stackView;
+@end
+
+@implementation TableContainerBottomToolbar
+@synthesize leadingButton = _leadingButton;
+@synthesize trailingButton = _trailingButton;
+@synthesize stackView = _stackView;
+
+- (instancetype)initWithLeadingButtonText:(NSString*)leadingButtonText
+                       trailingButtonText:(NSString*)trailingButtonText {
+  self = [super initWithFrame:CGRectZero];
+  if (self) {
+    _stackView = [[UIStackView alloc] initWithFrame:CGRectZero];
+    // Configure and add the buttons to _stackView.
+    if (leadingButtonText && ![leadingButtonText isEqualToString:@""]) {
+      _leadingButton = [UIButton buttonWithType:UIButtonTypeCustom];
+      [_leadingButton setTitle:leadingButtonText forState:UIControlStateNormal];
+      [_leadingButton setTitleColor:self.tintColor
+                           forState:UIControlStateNormal];
+      [_stackView addArrangedSubview:_leadingButton];
+    }
+
+    if (trailingButtonText && ![trailingButtonText isEqualToString:@""]) {
+      _trailingButton = [UIButton buttonWithType:UIButtonTypeCustom];
+      [_trailingButton setTitle:trailingButtonText
+                       forState:UIControlStateNormal];
+      [_trailingButton setTitleColor:self.tintColor
+                            forState:UIControlStateNormal];
+      [_stackView addArrangedSubview:_trailingButton];
+    }
+
+    // Configure the stackView.
+    _stackView.translatesAutoresizingMaskIntoConstraints = NO;
+    _stackView.distribution = UIStackViewDistributionEqualSpacing;
+    _stackView.axis = UILayoutConstraintAxisHorizontal;
+    _stackView.alignment = UIStackViewAlignmentCenter;
+    [self addSubview:_stackView];
+
+    // Set and activate constraints.
+    [NSLayoutConstraint activateConstraints:@[
+      [_stackView.leadingAnchor constraintEqualToAnchor:self.leadingAnchor
+                                               constant:kHorizontalMargin],
+      [_stackView.trailingAnchor constraintEqualToAnchor:self.trailingAnchor
+                                                constant:-kHorizontalMargin],
+      [_stackView.topAnchor constraintEqualToAnchor:self.topAnchor],
+      [_stackView.bottomAnchor constraintEqualToAnchor:self.bottomAnchor],
+    ]];
+  }
+  return self;
+}
+
+@end
diff --git a/ios/chrome/browser/ui/table_view/table_container_bottom_toolbar_unittest.mm b/ios/chrome/browser/ui/table_view/table_container_bottom_toolbar_unittest.mm
new file mode 100644
index 0000000..d9e05f7
--- /dev/null
+++ b/ios/chrome/browser/ui/table_view/table_container_bottom_toolbar_unittest.mm
@@ -0,0 +1,64 @@
+// Copyright 2018 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/table_view/table_container_bottom_toolbar.h"
+
+#include "testing/platform_test.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace {
+
+using TableContainerBottomToolbarTest = PlatformTest;
+
+TEST_F(TableContainerBottomToolbarTest, ButtonsText) {
+  TableContainerBottomToolbar* toolbar =
+      [[TableContainerBottomToolbar alloc] initWithLeadingButtonText:@"Left"
+                                                  trailingButtonText:@"Right"];
+
+  EXPECT_EQ(@"Left", toolbar.leadingButton.titleLabel.text);
+  EXPECT_EQ(@"Right", toolbar.trailingButton.titleLabel.text);
+}
+
+TEST_F(TableContainerBottomToolbarTest, NoButtonsWithNil) {
+  TableContainerBottomToolbar* toolbar =
+      [[TableContainerBottomToolbar alloc] initWithLeadingButtonText:@"Left"
+                                                  trailingButtonText:nil];
+  EXPECT_EQ(@"Left", toolbar.leadingButton.titleLabel.text);
+  EXPECT_EQ(nil, toolbar.trailingButton);
+
+  toolbar =
+      [[TableContainerBottomToolbar alloc] initWithLeadingButtonText:nil
+                                                  trailingButtonText:@"Right"];
+  EXPECT_EQ(nil, toolbar.leadingButton);
+  EXPECT_EQ(@"Right", toolbar.trailingButton.titleLabel.text);
+
+  toolbar = [[TableContainerBottomToolbar alloc] initWithLeadingButtonText:nil
+                                                        trailingButtonText:nil];
+  EXPECT_EQ(nil, toolbar.leadingButton);
+  EXPECT_EQ(nil, toolbar.trailingButton);
+}
+
+TEST_F(TableContainerBottomToolbarTest, NoButtonsWithEmptyString) {
+  TableContainerBottomToolbar* toolbar =
+      [[TableContainerBottomToolbar alloc] initWithLeadingButtonText:@"Left"
+                                                  trailingButtonText:@""];
+  EXPECT_EQ(@"Left", toolbar.leadingButton.titleLabel.text);
+  EXPECT_EQ(nil, toolbar.trailingButton);
+
+  toolbar =
+      [[TableContainerBottomToolbar alloc] initWithLeadingButtonText:@""
+                                                  trailingButtonText:@"Right"];
+  EXPECT_EQ(nil, toolbar.leadingButton);
+  EXPECT_EQ(@"Right", toolbar.trailingButton.titleLabel.text);
+
+  toolbar = [[TableContainerBottomToolbar alloc] initWithLeadingButtonText:@""
+                                                        trailingButtonText:@""];
+  EXPECT_EQ(nil, toolbar.leadingButton);
+  EXPECT_EQ(nil, toolbar.trailingButton);
+}
+
+}  // namespace
diff --git a/ios/chrome/browser/ui/table_view/table_container_view_controller.mm b/ios/chrome/browser/ui/table_view/table_container_view_controller.mm
index 533ed2f..443a1b4 100644
--- a/ios/chrome/browser/ui/table_view/table_container_view_controller.mm
+++ b/ios/chrome/browser/ui/table_view/table_container_view_controller.mm
@@ -42,9 +42,9 @@
 // TODO(crbug.com/805178): Temporary Toolbar code for prototyping purposes.
 - (void)setBottomToolbar:(UIView*)bottomToolbar {
   _bottomToolbar = bottomToolbar;
-  _bottomToolbar.backgroundColor = [UIColor grayColor];
+  _bottomToolbar.backgroundColor = [UIColor lightGrayColor];
   _bottomToolbar.translatesAutoresizingMaskIntoConstraints = NO;
-  _bottomToolbar.alpha = 0.5;
+  _bottomToolbar.alpha = 0.8;
 }
 
 #pragma mark - View Lifecycle
diff --git a/ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h b/ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h
index 74ee3470..9dd86d5 100644
--- a/ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h
+++ b/ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h
@@ -17,6 +17,9 @@
 // Notification that the tools menu did dismiss.
 extern NSString* const kToolsMenuDidHideNotification;
 
+// Tools menu table view ID.
+extern NSString* const kToolsMenuTableViewId;
+
 // Tools Menu item IDs.
 // Reload item accessibility Identifier.
 extern NSString* const kToolsMenuReload;
diff --git a/ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.mm b/ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.mm
index 09b5843..f23cd20b 100644
--- a/ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.mm
+++ b/ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.mm
@@ -18,6 +18,9 @@
 NSString* const kToolsMenuDidHideNotification =
     @"kToolsMenuDidHideNotification";
 
+// Tools menu table view ID.
+NSString* const kToolsMenuTableViewId = @"kToolsMenuTableViewId";
+
 // Tools menu item IDs.
 NSString* const kToolsMenuReload = @"kToolsMenuReload";
 NSString* const kToolsMenuStop = @"kToolsMenuStop";
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 f76434da..7d6c78b8 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
@@ -26,7 +26,6 @@
 #import "ios/chrome/browser/ui/tools_menu/tools_menu_model.h"
 #import "ios/chrome/browser/ui/tools_menu/tools_menu_view_item.h"
 #import "ios/chrome/browser/ui/tools_menu/tools_menu_view_tools_cell.h"
-#import "ios/chrome/browser/ui/tools_menu/tools_popup_controller.h"
 #include "ios/chrome/browser/ui/ui_util.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/chrome/browser/ui/util/constraints_ui_util.h"
diff --git a/ios/chrome/browser/ui/tools_menu/tools_popup_controller.h b/ios/chrome/browser/ui/tools_menu/tools_popup_controller.h
index 985a902..bcdc38a 100644
--- a/ios/chrome/browser/ui/tools_menu/tools_popup_controller.h
+++ b/ios/chrome/browser/ui/tools_menu/tools_popup_controller.h
@@ -10,9 +10,6 @@
 #include "base/ios/block_types.h"
 #import "ios/chrome/browser/ui/popup_menu/popup_menu_controller.h"
 
-// The a11y ID of the tools menu table view (used by integration tests).
-extern NSString* const kToolsMenuTableViewId;
-
 @protocol ApplicationCommands;
 @protocol BrowserCommands;
 @class ToolsMenuConfiguration;
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 69b5599..1447ad7 100644
--- a/ios/chrome/browser/ui/tools_menu/tools_popup_controller.mm
+++ b/ios/chrome/browser/ui/tools_menu/tools_popup_controller.mm
@@ -23,8 +23,6 @@
 
 using base::UserMetricsAction;
 
-NSString* const kToolsMenuTableViewId = @"kToolsMenuTableViewId";
-
 namespace {
 
 const CGFloat kToolsPopupMenuWidth = 280.0;
diff --git a/ios/chrome/test/earl_grey/chrome_matchers.mm b/ios/chrome/test/earl_grey/chrome_matchers.mm
index 7cc940d..8768c2e 100644
--- a/ios/chrome/test/earl_grey/chrome_matchers.mm
+++ b/ios/chrome/test/earl_grey/chrome_matchers.mm
@@ -29,7 +29,6 @@
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h"
 #import "ios/chrome/browser/ui/toolbar/legacy/toolbar_controller_constants.h"
 #import "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
-#import "ios/chrome/browser/ui/tools_menu/tools_popup_controller.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
diff --git a/ios/showcase/table_view/sc_table_container_coordinator.mm b/ios/showcase/table_view/sc_table_container_coordinator.mm
index e9fd423..6d5a440 100644
--- a/ios/showcase/table_view/sc_table_container_coordinator.mm
+++ b/ios/showcase/table_view/sc_table_container_coordinator.mm
@@ -5,6 +5,7 @@
 #import "ios/showcase/table_view/sc_table_container_coordinator.h"
 
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_controller.h"
+#import "ios/chrome/browser/ui/table_view/table_container_bottom_toolbar.h"
 #import "ios/chrome/browser/ui/table_view/table_container_view_controller.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -24,7 +25,12 @@
       initWithTable:[[ChromeTableViewController alloc]
                         initWithStyle:UITableViewStylePlain]];
   self.viewController.title = @"Table View";
-  self.viewController.bottomToolbar = [[UIView alloc] initWithFrame:CGRectZero];
+  TableContainerBottomToolbar* toolbar =
+      [[TableContainerBottomToolbar alloc] initWithLeadingButtonText:@"Left"
+                                                  trailingButtonText:@"Right"];
+  [toolbar.trailingButton setTitleColor:[UIColor redColor]
+                               forState:UIControlStateNormal];
+  self.viewController.bottomToolbar = toolbar;
   [self.baseViewController pushViewController:self.viewController animated:YES];
 }
 
diff --git a/ios/web/BUILD.gn b/ios/web/BUILD.gn
index eeb7bc8..6ce8d96 100644
--- a/ios/web/BUILD.gn
+++ b/ios/web/BUILD.gn
@@ -255,7 +255,6 @@
     "navigation/navigation_manager_impl_unittest.mm",
     "navigation/navigation_manager_util_unittest.mm",
     "navigation/nscoder_util_unittest.mm",
-    "navigation/placeholder_navigation_util_unittest.mm",
     "navigation/serializable_user_data_manager_impl_unittest.mm",
     "navigation/wk_based_navigation_manager_impl_unittest.mm",
     "navigation/wk_navigation_util_unittest.mm",
diff --git a/ios/web/navigation/BUILD.gn b/ios/web/navigation/BUILD.gn
index 8c564f84..cda071a 100644
--- a/ios/web/navigation/BUILD.gn
+++ b/ios/web/navigation/BUILD.gn
@@ -60,8 +60,6 @@
     "navigation_manager_impl.mm",
     "navigation_manager_util.h",
     "navigation_manager_util.mm",
-    "placeholder_navigation_util.h",
-    "placeholder_navigation_util.mm",
     "wk_navigation_util.h",
     "wk_navigation_util.mm",
   ]
diff --git a/ios/web/navigation/placeholder_navigation_util.h b/ios/web/navigation/placeholder_navigation_util.h
deleted file mode 100644
index cda2a68..0000000
--- a/ios/web/navigation/placeholder_navigation_util.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_WEB_NAVIGATION_PLACEHOLDER_NAVIGATION_UTIL_H_
-#define IOS_WEB_NAVIGATION_PLACEHOLDER_NAVIGATION_UTIL_H_
-
-#include "url/gurl.h"
-
-// Utility functions for creating and managing URLs for placeholder navigations.
-// A placeholder navigation is an "about:blank" page loaded into the WKWebView
-// that corresponds to Native View or WebUI URL. This navigation is inserted to
-// generate a WKBackForwardListItem for the Native View or WebUI URL in the
-// WebView so that the WKBackForwardList contains the full list of user-visible
-// navigations.
-// See "Handling App-specific URLs" section in go/bling-navigation-experiment
-// for more details.
-
-namespace web {
-namespace placeholder_navigation_util {
-
-// Returns true if |URL| is a placeholder navigation URL.
-bool IsPlaceholderUrl(const GURL& url);
-
-// Creates the URL for the placeholder navigation required for Native View and
-// WebUI URLs.
-GURL CreatePlaceholderUrlForUrl(const GURL& original_url);
-
-// Extracts the original URL from the placeholder URL.
-GURL ExtractUrlFromPlaceholderUrl(const GURL& url);
-
-}  // namespace placeholder_navigation_util
-}  // namespace web
-
-#endif  // IOS_WEB_NAVIGATION_PLACEHOLDER_NAVIGATION_UTIL_H_
diff --git a/ios/web/navigation/placeholder_navigation_util.mm b/ios/web/navigation/placeholder_navigation_util.mm
deleted file mode 100644
index b80d050..0000000
--- a/ios/web/navigation/placeholder_navigation_util.mm
+++ /dev/null
@@ -1,50 +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 "ios/web/navigation/placeholder_navigation_util.h"
-
-#include <string>
-
-#include "base/strings/string_util.h"
-#include "net/base/escape.h"
-#include "net/base/url_util.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-namespace web {
-namespace placeholder_navigation_util {
-
-bool IsPlaceholderUrl(const GURL& url) {
-  return url.IsAboutBlank() &&
-         base::StartsWith(url.query(), "for=", base::CompareCase::SENSITIVE);
-}
-
-GURL CreatePlaceholderUrlForUrl(const GURL& original_url) {
-  if (!original_url.is_valid())
-    return GURL::EmptyGURL();
-
-  GURL::Replacements query_replacements;
-  std::string encoded = "for=" + net::EscapeQueryParamValue(
-                                     original_url.spec(), false /* use_plus */);
-  query_replacements.SetQueryStr(encoded);
-  GURL placeholder_url =
-      GURL(url::kAboutBlankURL).ReplaceComponents(query_replacements);
-  DCHECK(placeholder_url.is_valid());
-  return placeholder_url;
-}
-
-GURL ExtractUrlFromPlaceholderUrl(const GURL& url) {
-  std::string value;
-  if (IsPlaceholderUrl(url) && net::GetValueForKeyInQuery(url, "for", &value)) {
-    GURL decoded_url(value);
-    if (decoded_url.is_valid())
-      return decoded_url;
-  }
-  return GURL::EmptyGURL();
-}
-
-}  // namespace placeholder_navigation_util
-}  // namespace
diff --git a/ios/web/navigation/placeholder_navigation_util_unittest.mm b/ios/web/navigation/placeholder_navigation_util_unittest.mm
deleted file mode 100644
index e3a008c..0000000
--- a/ios/web/navigation/placeholder_navigation_util_unittest.mm
+++ /dev/null
@@ -1,58 +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 "ios/web/navigation/placeholder_navigation_util.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/platform_test.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-namespace web {
-namespace placeholder_navigation_util {
-
-typedef PlatformTest PlaceholderNavigationUtilTest;
-
-TEST_F(PlaceholderNavigationUtilTest, IsPlaceholderUrl) {
-  // Valid placeholder URLs.
-  EXPECT_TRUE(IsPlaceholderUrl(GURL("about:blank?for=")));
-  EXPECT_TRUE(IsPlaceholderUrl(GURL("about:blank?for=chrome%3A%2F%2Fnewtab")));
-
-  // Not an about:blank URL.
-  EXPECT_FALSE(IsPlaceholderUrl(GURL::EmptyGURL()));
-  // Missing ?for= query parameter.
-  EXPECT_FALSE(IsPlaceholderUrl(GURL("about:blank")));
-  EXPECT_FALSE(IsPlaceholderUrl(GURL("about:blank?chrome:%3A%2F%2Fnewtab")));
-}
-
-TEST_F(PlaceholderNavigationUtilTest, EncodReturnsEmptyOnInvalidUrls) {
-  EXPECT_EQ(GURL::EmptyGURL(), CreatePlaceholderUrlForUrl(GURL::EmptyGURL()));
-  EXPECT_EQ(GURL::EmptyGURL(), CreatePlaceholderUrlForUrl(GURL("notaurl")));
-}
-
-TEST_F(PlaceholderNavigationUtilTest, EncodeDecodeValidUrls) {
-  {
-    GURL original("chrome://chrome-urls");
-    GURL encoded("about:blank?for=chrome%3A%2F%2Fchrome-urls");
-    EXPECT_EQ(encoded, CreatePlaceholderUrlForUrl(original));
-    EXPECT_EQ(original, ExtractUrlFromPlaceholderUrl(encoded));
-  }
-  {
-    GURL original("about:blank");
-    GURL encoded("about:blank?for=about%3Ablank");
-    EXPECT_EQ(encoded, CreatePlaceholderUrlForUrl(original));
-    EXPECT_EQ(original, ExtractUrlFromPlaceholderUrl(encoded));
-  }
-}
-
-// Tests that invalid URLs will be rejected in decoding.
-TEST_F(PlaceholderNavigationUtilTest, DecodeRejectInvalidUrls) {
-  GURL encoded("about:blank?for=thisisnotanurl");
-  EXPECT_EQ(GURL::EmptyGURL(), ExtractUrlFromPlaceholderUrl(encoded));
-}
-
-}  // namespace placeholder_navigation_util
-}  // namespace web
diff --git a/ios/web/navigation/wk_based_navigation_manager_impl.mm b/ios/web/navigation/wk_based_navigation_manager_impl.mm
index 3be38c4..b3e2365 100644
--- a/ios/web/navigation/wk_based_navigation_manager_impl.mm
+++ b/ios/web/navigation/wk_based_navigation_manager_impl.mm
@@ -15,7 +15,6 @@
 #import "ios/web/navigation/navigation_item_impl.h"
 #include "ios/web/navigation/navigation_item_impl_list.h"
 #import "ios/web/navigation/navigation_manager_delegate.h"
-#include "ios/web/navigation/placeholder_navigation_util.h"
 #import "ios/web/navigation/wk_navigation_util.h"
 #include "ios/web/public/load_committed_details.h"
 #import "ios/web/public/navigation_item.h"
@@ -143,9 +142,8 @@
   GURL current_item_url = net::GURLWithNSURL(current_wk_item.URL);
   bool current_item_is_pending_item =
       current_item_url == pending_item_->GetURL() ||
-      current_item_url ==
-          placeholder_navigation_util::CreatePlaceholderUrlForUrl(
-              pending_item_->GetURL());
+      current_item_url == wk_navigation_util::CreatePlaceholderUrlForUrl(
+                              pending_item_->GetURL());
   if (proxy.backForwardList.currentItem &&
       current_item_url == net::GURLWithNSURL(proxy.URL) &&
       current_item_is_pending_item) {
@@ -538,7 +536,7 @@
 }
 
 bool WKBasedNavigationManagerImpl::IsPlaceholderUrl(const GURL& url) const {
-  return placeholder_navigation_util::IsPlaceholderUrl(url);
+  return wk_navigation_util::IsPlaceholderUrl(url);
 }
 
 int WKBasedNavigationManagerImpl::GetWKCurrentItemIndex() const {
diff --git a/ios/web/navigation/wk_navigation_util.h b/ios/web/navigation/wk_navigation_util.h
index dfef6ef0..3f05a46 100644
--- a/ios/web/navigation/wk_navigation_util.h
+++ b/ios/web/navigation/wk_navigation_util.h
@@ -2,7 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// This file contains utility functions for WKBasedNavigationManagerImpl.
+// This file contains utility functions for creating and managing magic URLs
+// used to implement WKBasedNavigationManagerImpl.
+//
+// A restore session URL is a specific local file that is used to inject history
+// into a new web view. See ios/web/navigation/resources/restore_session.html.
+//
+// A placeholder navigation is an "about:blank" page loaded into the WKWebView
+// that corresponds to Native View or WebUI URL. This navigation is inserted to
+// generate a WKBackForwardListItem for the Native View or WebUI URL in the
+// WebView so that the WKBackForwardList contains the full list of user-visible
+// navigations. See "Handling App-specific URLs" section in
+// go/bling-navigation-experiment for more details.
 
 #ifndef IOS_WEB_NAVIGATION_WK_NAVIGATION_UTIL_H_
 #define IOS_WEB_NAVIGATION_WK_NAVIGATION_UTIL_H_
@@ -25,6 +36,9 @@
 // Query parameter key used to encode target URL in a restore_session.html URL.
 extern const char kRestoreSessionTargetUrlQueryKey[];
 
+// Returns true if |url| is a placeholder URL or restore_session.html URL.
+bool IsWKInternalUrl(const GURL& url);
+
 // Returns a file:// URL that points to the magic restore_session.html file.
 // This is used in unit tests.
 GURL GetRestoreSessionBaseUrl();
@@ -53,6 +67,16 @@
 // component exists, returns false.
 bool ExtractTargetURL(const GURL& restore_session_url, GURL* target_url);
 
+// Returns true if |URL| is a placeholder navigation URL.
+bool IsPlaceholderUrl(const GURL& url);
+
+// Creates the URL for the placeholder navigation required for Native View and
+// WebUI URLs.
+GURL CreatePlaceholderUrlForUrl(const GURL& original_url);
+
+// Extracts the original URL from the placeholder URL.
+GURL ExtractUrlFromPlaceholderUrl(const GURL& url);
+
 }  // namespace wk_navigation_util
 }  // namespace web
 
diff --git a/ios/web/navigation/wk_navigation_util.mm b/ios/web/navigation/wk_navigation_util.mm
index 9d898ba..a9d5d98c 100644
--- a/ios/web/navigation/wk_navigation_util.mm
+++ b/ios/web/navigation/wk_navigation_util.mm
@@ -6,11 +6,12 @@
 
 #include "base/json/json_writer.h"
 #include "base/mac/bundle_locations.h"
+#include "base/strings/string_util.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/values.h"
-#include "ios/web/navigation/placeholder_navigation_util.h"
 #import "ios/web/public/navigation_item.h"
 #import "ios/web/public/web_client.h"
+#include "net/base/escape.h"
 #include "net/base/url_util.h"
 #include "url/url_constants.h"
 
@@ -23,6 +24,11 @@
 
 const char kRestoreSessionSessionQueryKey[] = "session";
 const char kRestoreSessionTargetUrlQueryKey[] = "targetUrl";
+const char kOriginalUrlKey[] = "for";
+
+bool IsWKInternalUrl(const GURL& url) {
+  return IsPlaceholderUrl(url) || IsRestoreSessionUrl(url);
+}
 
 GURL GetRestoreSessionBaseUrl() {
   std::string restore_session_resource_path = base::SysNSStringToUTF8(
@@ -51,8 +57,7 @@
     GURL original_url = items[index]->GetURL();
     GURL restored_url = original_url;
     if (web::GetWebClient()->IsAppSpecificURL(original_url)) {
-      restored_url =
-          placeholder_navigation_util::CreatePlaceholderUrlForUrl(original_url);
+      restored_url = CreatePlaceholderUrlForUrl(original_url);
     }
     restored_urls.GetList().push_back(base::Value(restored_url.spec()));
     restored_titles.GetList().push_back(base::Value(items[index]->GetTitle()));
@@ -92,5 +97,31 @@
   return success;
 }
 
+bool IsPlaceholderUrl(const GURL& url) {
+  return url.IsAboutBlank() && base::StartsWith(url.query(), kOriginalUrlKey,
+                                                base::CompareCase::SENSITIVE);
+}
+
+GURL CreatePlaceholderUrlForUrl(const GURL& original_url) {
+  if (!original_url.is_valid())
+    return GURL::EmptyGURL();
+
+  GURL placeholder_url = net::AppendQueryParameter(
+      GURL(url::kAboutBlankURL), kOriginalUrlKey, original_url.spec());
+  DCHECK(placeholder_url.is_valid());
+  return placeholder_url;
+}
+
+GURL ExtractUrlFromPlaceholderUrl(const GURL& url) {
+  std::string value;
+  if (IsPlaceholderUrl(url) &&
+      net::GetValueForKeyInQuery(url, kOriginalUrlKey, &value)) {
+    GURL decoded_url(value);
+    if (decoded_url.is_valid())
+      return decoded_url;
+  }
+  return GURL::EmptyGURL();
+}
+
 }  // namespace wk_navigation_util
 }  // namespace web
diff --git a/ios/web/navigation/wk_navigation_util_unittest.mm b/ios/web/navigation/wk_navigation_util_unittest.mm
index bd08dfb2..18b8fab 100644
--- a/ios/web/navigation/wk_navigation_util_unittest.mm
+++ b/ios/web/navigation/wk_navigation_util_unittest.mm
@@ -73,5 +73,43 @@
   EXPECT_EQ(target_url, extracted_url);
 }
 
+TEST_F(WKNavigationUtilTest, IsPlaceholderUrl) {
+  // Valid placeholder URLs.
+  EXPECT_TRUE(IsPlaceholderUrl(GURL("about:blank?for=")));
+  EXPECT_TRUE(IsPlaceholderUrl(GURL("about:blank?for=chrome%3A%2F%2Fnewtab")));
+
+  // Not an about:blank URL.
+  EXPECT_FALSE(IsPlaceholderUrl(GURL::EmptyGURL()));
+  // Missing ?for= query parameter.
+  EXPECT_FALSE(IsPlaceholderUrl(GURL("about:blank")));
+  EXPECT_FALSE(IsPlaceholderUrl(GURL("about:blank?chrome:%3A%2F%2Fnewtab")));
+}
+
+TEST_F(WKNavigationUtilTest, EncodReturnsEmptyOnInvalidUrls) {
+  EXPECT_EQ(GURL::EmptyGURL(), CreatePlaceholderUrlForUrl(GURL::EmptyGURL()));
+  EXPECT_EQ(GURL::EmptyGURL(), CreatePlaceholderUrlForUrl(GURL("notaurl")));
+}
+
+TEST_F(WKNavigationUtilTest, EncodeDecodeValidUrls) {
+  {
+    GURL original("chrome://chrome-urls");
+    GURL encoded("about:blank?for=chrome%3A%2F%2Fchrome-urls");
+    EXPECT_EQ(encoded, CreatePlaceholderUrlForUrl(original));
+    EXPECT_EQ(original, ExtractUrlFromPlaceholderUrl(encoded));
+  }
+  {
+    GURL original("about:blank");
+    GURL encoded("about:blank?for=about%3Ablank");
+    EXPECT_EQ(encoded, CreatePlaceholderUrlForUrl(original));
+    EXPECT_EQ(original, ExtractUrlFromPlaceholderUrl(encoded));
+  }
+}
+
+// Tests that invalid URLs will be rejected in decoding.
+TEST_F(WKNavigationUtilTest, DecodeRejectInvalidUrls) {
+  GURL encoded("about:blank?for=thisisnotanurl");
+  EXPECT_EQ(GURL::EmptyGURL(), ExtractUrlFromPlaceholderUrl(encoded));
+}
+
 }  // namespace wk_navigation_util
 }  // namespace web
diff --git a/ios/web/web_state/navigation_and_load_callbacks_inttest.mm b/ios/web/web_state/navigation_and_load_callbacks_inttest.mm
index 567efdb2..9016cd9 100644
--- a/ios/web/web_state/navigation_and_load_callbacks_inttest.mm
+++ b/ios/web/web_state/navigation_and_load_callbacks_inttest.mm
@@ -1097,14 +1097,8 @@
   }
 
   EXPECT_CALL(observer_, DidStartNavigation(web_state(), _));
-  if (@available(iOS 10, *)) {
-    // Starting from iOS10, ShouldAllowResponse is not called when going back
-    // after form submission.
-  } else {
-    EXPECT_CALL(*decider_, ShouldAllowResponse(_, /*for_main_frame=*/true))
-        .WillOnce(Return(true));
-  }
   EXPECT_CALL(observer_, DidFinishNavigation(web_state(), _));
+  // ShouldAllowResponse is not called when going back after form submission.
   EXPECT_CALL(observer_, DidStopLoading(web_state()));
   EXPECT_CALL(observer_,
               PageLoaded(web_state(), PageLoadCompletionStatus::SUCCESS));
diff --git a/ios/web/web_state/ui/crw_context_menu_controller.mm b/ios/web/web_state/ui/crw_context_menu_controller.mm
index 43981773..893e5ba99 100644
--- a/ios/web/web_state/ui/crw_context_menu_controller.mm
+++ b/ios/web/web_state/ui/crw_context_menu_controller.mm
@@ -51,6 +51,26 @@
 // response.
 NSString* const kFindElementResultHandlerName = @"FindElementResultHandler";
 
+// Enum used to record element details fetched for the context menu.
+enum class ContextMenuElementFrame {
+  // Recorded when the element was found in the main frame.
+  MainFrame = 0,
+  // Recorded when the element was found in an iframe.
+  Iframe = 1,
+  Count
+};
+
+// Struct to track the details of the element at |location| in |webView|.
+struct ContextMenuInfo {
+  // The location of the long press.
+  CGPoint location;
+  // True if the element is in the page's main frame, false if in an iframe.
+  BOOL is_main_frame;
+  // DOM element information. May contain the keys defined in
+  // ios/web/web_state/context_menu_constants.h. All values are strings.
+  NSDictionary* dom_element;
+};
+
 }  // namespace
 
 @interface CRWContextMenuController ()<UIGestureRecognizerDelegate>
@@ -80,11 +100,11 @@
 // Cancels all touch events in the web view (long presses, tapping, scrolling).
 - (void)cancelAllTouches;
 // Asynchronously fetches information about DOM element for the given point (in
-// UIView coordinates). |handler| can not be nil. See |_DOMElementForLastTouch|
-// for element format description.
+// UIView coordinates). |handler| can not be nil. See
+// |_contextMenuInfoForLastTouch.dom_element| for element format description.
 - (void)fetchDOMElementAtPoint:(CGPoint)point
              completionHandler:(void (^)(NSDictionary*))handler;
-// Sets the value of |_DOMElementForLastTouch|.
+// Sets the value of |_contextMenuInfoForLastTouch.dom_element|.
 - (void)setDOMElementForLastTouch:(NSDictionary*)element;
 // Called to process a message received from JavaScript.
 - (void)didReceiveScriptMessage:(WKScriptMessage*)message;
@@ -104,11 +124,9 @@
   // Long press recognizer that allows showing context menus.
   UILongPressGestureRecognizer* _contextMenuRecognizer;
   // DOM element information for the point where the user made the last touch.
-  // Can be nil if has not been calculated yet. Precalculation is necessary
-  // because retreiving DOM element relies on async API so element info can not
-  // be built on demand. May contain the keys defined in
-  // ios/web/web_state/context_menu_constants.h. All values are strings.
-  NSDictionary* _DOMElementForLastTouch;
+  // Precalculation is necessary because retreiving DOM element relies on async
+  // API so element info can not be built on demand.
+  ContextMenuInfo _contextMenuInfoForLastTouch;
   // Whether or not the cotext menu should be displayed as soon as the DOM
   // element details are returned. Since fetching the details from the |webView|
   // of the element the user long pressed is asyncrounous, it may not be
@@ -117,8 +135,6 @@
   // |_contextMenuRecognizer| finished, but couldn't yet show the context menu
   // becuase the DOM element details were not yet available.
   BOOL _contextMenuNeedsDisplay;
-  // The location of the last reconized long press in the |webView|.
-  CGPoint _locationForLastTouch;
   // Details for currently in progress element fetches. The objects are
   // instances of HTMLElementFetchRequest and are keyed by a unique requestId
   // string.
@@ -140,6 +156,10 @@
     _delegate = delegate;
     _injectionEvaluator = injectionEvaluator;
     _pendingElementFetchRequests = [[NSMutableDictionary alloc] init];
+    // Default to assuming all elements are from the main frame since this value
+    // will not be updated unless the
+    // |web::features::kContextMenuElementPostMessage| feature is enabled.
+    _contextMenuInfoForLastTouch.is_main_frame = YES;
 
     // The system context menu triggers after 0.55 second. Add a gesture
     // recognizer with a shorter delay to be able to cancel the system menu if
@@ -251,7 +271,7 @@
 }
 
 - (void)longPressGestureRecognizerBegan {
-  if ([_DOMElementForLastTouch count]) {
+  if ([_contextMenuInfoForLastTouch.dom_element count]) {
     // User long pressed on a link or an image. Cancelling all touches will
     // intentionally suppress system context menu UI.
     [self cancelAllTouches];
@@ -261,9 +281,10 @@
   }
 
   if ([_delegate respondsToSelector:@selector(webView:handleContextMenu:)]) {
-    _locationForLastTouch = [_contextMenuRecognizer locationInView:_webView];
+    _contextMenuInfoForLastTouch.location =
+        [_contextMenuRecognizer locationInView:_webView];
 
-    if ([_DOMElementForLastTouch count]) {
+    if ([_contextMenuInfoForLastTouch.dom_element count]) {
       [self showContextMenu];
     } else {
       // Shows the context menu once the DOM element information is set.
@@ -274,7 +295,7 @@
 
 - (void)longPressGestureRecognizerChanged {
   if (!_contextMenuNeedsDisplay ||
-      CGPointEqualToPoint(_locationForLastTouch, CGPointZero)) {
+      CGPointEqualToPoint(_contextMenuInfoForLastTouch.location, CGPointZero)) {
     return;
   }
 
@@ -284,8 +305,10 @@
   // |_contextMenuNeedsDisplay| has already been set to True.
   CGPoint currentTouchLocation =
       [_contextMenuRecognizer locationInView:_webView];
-  float deltaX = std::abs(_locationForLastTouch.x - currentTouchLocation.x);
-  float deltaY = std::abs(_locationForLastTouch.y - currentTouchLocation.y);
+  float deltaX = std::abs(_contextMenuInfoForLastTouch.location.x -
+                          currentTouchLocation.x);
+  float deltaY = std::abs(_contextMenuInfoForLastTouch.location.y -
+                          currentTouchLocation.y);
   if (deltaX > kLongPressMoveDeltaPixels ||
       deltaY > kLongPressMoveDeltaPixels) {
     [self cancelContextMenuDisplay];
@@ -293,10 +316,17 @@
 }
 
 - (void)showContextMenu {
-  web::ContextMenuParams params =
-      web::ContextMenuParamsFromElementDictionary(_DOMElementForLastTouch);
+  // Log if the element is in the main frame or a child frame.
+  UMA_HISTOGRAM_ENUMERATION("ContextMenu.DOMElementFrame",
+                            (_contextMenuInfoForLastTouch.is_main_frame
+                                 ? ContextMenuElementFrame::MainFrame
+                                 : ContextMenuElementFrame::Iframe),
+                            ContextMenuElementFrame::Count);
+
+  web::ContextMenuParams params = web::ContextMenuParamsFromElementDictionary(
+      _contextMenuInfoForLastTouch.dom_element);
   params.view = _webView;
-  params.location = _locationForLastTouch;
+  params.location = _contextMenuInfoForLastTouch.location;
   [_delegate webView:_webView handleContextMenu:params];
 }
 
@@ -320,14 +350,16 @@
 }
 
 - (void)setDOMElementForLastTouch:(NSDictionary*)element {
-  _DOMElementForLastTouch = [element copy];
+  _contextMenuInfoForLastTouch.dom_element = [element copy];
   if (_contextMenuNeedsDisplay) {
     [self showContextMenu];
   }
 }
 
 - (void)didReceiveScriptMessage:(WKScriptMessage*)message {
-  NSDictionary* response = message.body;
+  NSMutableDictionary* response =
+      [[NSMutableDictionary alloc] initWithDictionary:message.body];
+  _contextMenuInfoForLastTouch.is_main_frame = message.frameInfo.mainFrame;
   NSString* requestID = response[web::kContextMenuElementRequestId];
   HTMLElementFetchRequest* fetchRequest =
       _pendingElementFetchRequests[requestID];
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm
index 2a152d64..8a9d0429 100644
--- a/ios/web/web_state/ui/crw_web_controller.mm
+++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -43,7 +43,6 @@
 #import "ios/web/navigation/navigation_item_impl.h"
 #import "ios/web/navigation/navigation_manager_impl.h"
 #include "ios/web/navigation/navigation_manager_util.h"
-#include "ios/web/navigation/placeholder_navigation_util.h"
 #import "ios/web/navigation/wk_navigation_util.h"
 #include "ios/web/net/cert_host_pair.h"
 #import "ios/web/net/crw_cert_verification_controller.h"
@@ -121,10 +120,11 @@
 
 namespace {
 
-using web::placeholder_navigation_util::IsPlaceholderUrl;
-using web::placeholder_navigation_util::CreatePlaceholderUrlForUrl;
-using web::placeholder_navigation_util::ExtractUrlFromPlaceholderUrl;
+using web::wk_navigation_util::IsPlaceholderUrl;
+using web::wk_navigation_util::CreatePlaceholderUrlForUrl;
+using web::wk_navigation_util::ExtractUrlFromPlaceholderUrl;
 using web::wk_navigation_util::IsRestoreSessionUrl;
+using web::wk_navigation_util::IsWKInternalUrl;
 
 // Struct to capture data about a user interaction. Records the time of the
 // interaction and the main document URL at that time.
@@ -1032,25 +1032,14 @@
 }
 
 - (NSDictionary*)WKWebViewObservers {
-  NSMutableDictionary* result = [NSMutableDictionary dictionary];
-  if (@available(iOS 10, *)) {
-    result[@"serverTrust"] = @"webViewSecurityFeaturesDidChange";
-  }
-#if !defined(__IPHONE_10_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_10_0
-  else {
-    result[@"certificateChain"] = @"webViewSecurityFeaturesDidChange";
-  }
-#endif
-
-  [result addEntriesFromDictionary:@{
+  return @{
+    @"serverTrust" : @"webViewSecurityFeaturesDidChange",
     @"estimatedProgress" : @"webViewEstimatedProgressDidChange",
     @"hasOnlySecureContent" : @"webViewSecurityFeaturesDidChange",
     @"title" : @"webViewTitleDidChange",
     @"loading" : @"webViewLoadingStateDidChange",
     @"URL" : @"webViewURLDidChange",
-  }];
-
-  return result;
+  };
 }
 
 // NativeControllerDelegate method, called to inform that title has changed.
@@ -1196,8 +1185,7 @@
   // it can be implemented using NavigationManager API after removal of legacy
   // navigation stack.
   GURL webViewURL = net::GURLWithNSURL(_webView.URL);
-  if (_webView && !IsPlaceholderUrl(webViewURL) &&
-      !IsRestoreSessionUrl(webViewURL)) {
+  if (_webView && !IsWKInternalUrl(webViewURL)) {
     return [self webURLWithTrustLevel:trustLevel];
   }
   // Any non-web URL source is trusted.
@@ -2080,9 +2068,7 @@
   [self restoreStateFromHistory];
   // Placeholder and restore session URLs are implementation details so should
   // not notify WebStateObservers.
-  bool isInternalURL = context && (IsPlaceholderUrl(context->GetUrl()) ||
-                                   IsRestoreSessionUrl(context->GetUrl()));
-  if (!isInternalURL) {
+  if (!context || !IsWKInternalUrl(context->GetUrl())) {
     _webStateImpl->SetIsLoading(false);
     _webStateImpl->OnPageLoaded(currentURL, loadSuccess);
   }
@@ -3672,14 +3658,7 @@
   NSString* host = base::SysUTF8ToNSString(_documentURL.host());
   BOOL hasOnlySecureContent = [_webView hasOnlySecureContent];
   base::ScopedCFTypeRef<SecTrustRef> trust;
-  if (@available(iOS 10, *)) {
-    trust.reset([_webView serverTrust], base::scoped_policy::RETAIN);
-  }
-#if !defined(__IPHONE_10_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_10_0
-  else {
-    trust = web::CreateServerTrustFromChain([_webView certificateChain], host);
-  }
-#endif
+  trust.reset([_webView serverTrust], base::scoped_policy::RETAIN);
 
   [_SSLStatusUpdater updateSSLStatusForNavigationItem:currentNavItem
                                          withCertHost:host
@@ -4633,14 +4612,7 @@
   // Report cases where SSL cert is missing for a secure connection.
   if (_documentURL.SchemeIsCryptographic()) {
     scoped_refptr<net::X509Certificate> cert;
-    if (@available(iOS 10, *)) {
-      cert = web::CreateCertFromTrust([_webView serverTrust]);
-    }
-#if !defined(__IPHONE_10_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_10_0
-    else {
-      cert = web::CreateCertFromChain([_webView certificateChain]);
-    }
-#endif
+    cert = web::CreateCertFromTrust([_webView serverTrust]);
     UMA_HISTOGRAM_BOOLEAN("WebController.WKWebViewHasCertForSecureConnection",
                           static_cast<bool>(cert));
   }
diff --git a/ios/web/web_state/ui/crw_web_controller_unittest.mm b/ios/web/web_state/ui/crw_web_controller_unittest.mm
index 523dfbb..25e2974 100644
--- a/ios/web/web_state/ui/crw_web_controller_unittest.mm
+++ b/ios/web/web_state/ui/crw_web_controller_unittest.mm
@@ -161,15 +161,7 @@
   // Creates WebView mock.
   UIView* CreateMockWebView() {
     id result = [OCMockObject mockForClass:[WKWebView class]];
-
-    if (@available(iOS 10, *)) {
-      [[result stub] serverTrust];
-    }
-#if !defined(__IPHONE_10_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_10_0
-    else {
-      [[result stub] certificateChain];
-    }
-#endif
+    [[result stub] serverTrust];
 
     mock_wk_list_ = [[CRWFakeBackForwardList alloc] init];
     OCMStub([result backForwardList]).andReturn(mock_wk_list_);
diff --git a/ios/web/web_state/web_state_impl.mm b/ios/web/web_state/web_state_impl.mm
index d9d8e4df..e88125a 100644
--- a/ios/web/web_state/web_state_impl.mm
+++ b/ios/web/web_state/web_state_impl.mm
@@ -17,9 +17,9 @@
 #import "ios/web/navigation/crw_session_controller.h"
 #import "ios/web/navigation/legacy_navigation_manager_impl.h"
 #import "ios/web/navigation/navigation_item_impl.h"
-#include "ios/web/navigation/placeholder_navigation_util.h"
 #import "ios/web/navigation/session_storage_builder.h"
 #import "ios/web/navigation/wk_based_navigation_manager_impl.h"
+#import "ios/web/navigation/wk_navigation_util.h"
 #include "ios/web/public/browser_state.h"
 #import "ios/web/public/crw_navigation_item_storage.h"
 #import "ios/web/public/crw_session_storage.h"
@@ -50,8 +50,6 @@
 #error "This file requires ARC support."
 #endif
 
-using web::placeholder_navigation_util::IsPlaceholderUrl;
-
 namespace web {
 
 /* static */
@@ -249,9 +247,10 @@
 }
 
 void WebStateImpl::OnPageLoaded(const GURL& url, bool load_success) {
-  // Native Content and WebUI placeholder URL is an internal implementation
-  // detail of //ios/web/ navigation. Do not trigger external callbacks.
-  if (IsPlaceholderUrl(url))
+  // Navigation manager loads internal URLs to restore session history and
+  // create back-forward entries for Native View and WebUI. Do not trigger
+  // external callbacks.
+  if (wk_navigation_util::IsWKInternalUrl(url))
     return;
 
   PageLoadCompletionStatus load_completion_status =
@@ -750,9 +749,10 @@
 }
 
 void WebStateImpl::OnNavigationStarted(web::NavigationContext* context) {
-  // Native Content and WebUI placeholder URL is an internal implementation
-  // detail of //ios/web/ navigation. Do not trigger external callbacks.
-  if (IsPlaceholderUrl(context->GetUrl()))
+  // Navigation manager loads internal URLs to restore session history and
+  // create back-forward entries for Native View and WebUI. Do not trigger
+  // external callbacks.
+  if (wk_navigation_util::IsWKInternalUrl(context->GetUrl()))
     return;
 
   for (auto& observer : observers_)
@@ -760,9 +760,10 @@
 }
 
 void WebStateImpl::OnNavigationFinished(web::NavigationContext* context) {
-  // Native Content and WebUI placeholder URL is an internal implementation
-  // detail of //ios/web/ navigation. Do not trigger external callbacks.
-  if (IsPlaceholderUrl(context->GetUrl()))
+  // Navigation manager loads internal URLs to restore session history and
+  // create back-forward entries for Native View and WebUI. Do not trigger
+  // external callbacks.
+  if (wk_navigation_util::IsWKInternalUrl(context->GetUrl()))
     return;
 
   for (auto& observer : observers_)
diff --git a/ios/web/web_state/web_state_impl_unittest.mm b/ios/web/web_state/web_state_impl_unittest.mm
index 6384664..151da3e 100644
--- a/ios/web/web_state/web_state_impl_unittest.mm
+++ b/ios/web/web_state/web_state_impl_unittest.mm
@@ -17,7 +17,7 @@
 #import "base/strings/sys_string_conversions.h"
 #import "base/test/ios/wait_util.h"
 #include "base/test/scoped_feature_list.h"
-#include "ios/web/navigation/placeholder_navigation_util.h"
+#import "ios/web/navigation/wk_navigation_util.h"
 #import "ios/web/public/crw_navigation_item_storage.h"
 #import "ios/web/public/crw_session_storage.h"
 #include "ios/web/public/features.h"
@@ -495,8 +495,8 @@
 TEST_F(WebStateImplTest, PlaceholderNavigationNotExposedToObservers) {
   TestWebStateObserver observer(web_state_.get());
   FakeNavigationContext context;
-  context.SetUrl(placeholder_navigation_util::CreatePlaceholderUrlForUrl(
-      GURL("chrome://newtab")));
+  context.SetUrl(
+      wk_navigation_util::CreatePlaceholderUrlForUrl(GURL("chrome://newtab")));
 
   // Test that OnPageLoaded() is not called.
   web_state_->OnPageLoaded(context.GetUrl(), true /* load_success */);
diff --git a/ios/web/web_state/wk_web_view_security_util.h b/ios/web/web_state/wk_web_view_security_util.h
index dca7837..1755608 100644
--- a/ios/web/web_state/wk_web_view_security_util.h
+++ b/ios/web/web_state/wk_web_view_security_util.h
@@ -34,6 +34,8 @@
 
 // Creates server trust object from an array of SecCertificateRef objects.
 // Returns null if |certs| is null or empty.
+// TODO(crbug.com/827554): This method is only used from tests and should be
+// removed from here.
 base::ScopedCFTypeRef<SecTrustRef> CreateServerTrustFromChain(NSArray* certs,
                                                               NSString* host);
 
diff --git a/ipc/ipc_message_start.h b/ipc/ipc_message_start.h
index a5fad5e..99d8d4ad 100644
--- a/ipc/ipc_message_start.h
+++ b/ipc/ipc_message_start.h
@@ -23,10 +23,8 @@
   GpuChannelMsgStart,
   MediaMsgStart,
   PpapiMsgStart,
-  FirefoxImporterUnittestMsgStart,
   DOMStorageMsgStart,
   SpeechRecognitionMsgStart,
-  SafeBrowsingMsgStart,
   P2PMsgStart,
   ResourceMsgStart,
   FileSystemMsgStart,
@@ -36,7 +34,6 @@
   ChromeMsgStart,
   DragMsgStart,
   PrintMsgStart,
-  SpellCheckMsgStart,
   ExtensionMsgStart,
   TextInputClientMsgStart,
   JavaBridgeMsgStart,
@@ -46,8 +43,6 @@
   ChromotingMsgStart,
   BrowserPluginMsgStart,
   AndroidWebViewMsgStart,
-  MetroViewerMsgStart,
-  CCMsgStart,
   MediaPlayerMsgStart,
   TracingMsgStart,
   PeerConnectionTrackerMsgStart,
@@ -56,7 +51,6 @@
   TtsMsgStart,
   NaClHostMsgStart,
   EncryptedMediaMsgStart,
-  CacheStorageMsgStart,
   ServiceWorkerMsgStart,
   CastMsgStart,
   ChromeExtensionMsgStart,
@@ -76,7 +70,6 @@
   CastCryptoMsgStart,
   CastChannelMsgStart,
   IPCTestMsgStart,
-  DWriteFontProxyMsgStart,
   MediaPlayerDelegateMsgStart,
   SurfaceViewManagerMsgStart,
   ExtensionWorkerMsgStart,
diff --git a/media/audio/BUILD.gn b/media/audio/BUILD.gn
index 10d786f..1458c36 100644
--- a/media/audio/BUILD.gn
+++ b/media/audio/BUILD.gn
@@ -184,6 +184,8 @@
       "mac/audio_low_latency_input_mac.h",
       "mac/audio_manager_mac.cc",
       "mac/audio_manager_mac.h",
+      "mac/core_audio_util_mac.cc",
+      "mac/core_audio_util_mac.h",
       "mac/coreaudio_dispatch_override.cc",
       "mac/coreaudio_dispatch_override.h",
       "mac/scoped_audio_unit.cc",
diff --git a/media/audio/audio_device_name.cc b/media/audio/audio_device_name.cc
index a0d8e73..7812688 100644
--- a/media/audio/audio_device_name.cc
+++ b/media/audio/audio_device_name.cc
@@ -3,17 +3,17 @@
 // found in the LICENSE file.
 
 #include "media/audio/audio_device_name.h"
+
+#include <utility>
+
 #include "media/audio/audio_device_description.h"
 
 namespace media {
 
 AudioDeviceName::AudioDeviceName() = default;
 
-AudioDeviceName::AudioDeviceName(const std::string& device_name,
-                                 const std::string& unique_id)
-    : device_name(device_name),
-      unique_id(unique_id) {
-}
+AudioDeviceName::AudioDeviceName(std::string device_name, std::string unique_id)
+    : device_name(std::move(device_name)), unique_id(std::move(unique_id)) {}
 
 // static
 AudioDeviceName AudioDeviceName::CreateDefault() {
diff --git a/media/audio/audio_device_name.h b/media/audio/audio_device_name.h
index 534abea..1d74d19 100644
--- a/media/audio/audio_device_name.h
+++ b/media/audio/audio_device_name.h
@@ -13,8 +13,7 @@
 
 struct MEDIA_EXPORT AudioDeviceName {
   AudioDeviceName();
-  AudioDeviceName(const std::string& device_name,
-                  const std::string& unique_id);
+  AudioDeviceName(std::string device_name, std::string unique_id);
 
   // Creates default device representation.
   static AudioDeviceName CreateDefault();
diff --git a/media/audio/mac/audio_manager_mac.cc b/media/audio/mac/audio_manager_mac.cc
index 1a74579e..6b76f16 100644
--- a/media/audio/mac/audio_manager_mac.cc
+++ b/media/audio/mac/audio_manager_mac.cc
@@ -16,6 +16,7 @@
 #include "base/mac/scoped_cftyperef.h"
 #include "base/macros.h"
 #include "base/memory/free_deleter.h"
+#include "base/optional.h"
 #include "base/power_monitor/power_monitor.h"
 #include "base/power_monitor/power_observer.h"
 #include "base/strings/sys_string_conversions.h"
@@ -24,6 +25,7 @@
 #include "media/audio/mac/audio_auhal_mac.h"
 #include "media/audio/mac/audio_input_mac.h"
 #include "media/audio/mac/audio_low_latency_input_mac.h"
+#include "media/audio/mac/core_audio_util_mac.h"
 #include "media/audio/mac/coreaudio_dispatch_override.h"
 #include "media/audio/mac/scoped_audio_unit.h"
 #include "media/base/audio_parameters.h"
@@ -126,106 +128,23 @@
 static void GetAudioDeviceInfo(bool is_input,
                                media::AudioDeviceNames* device_names) {
   DCHECK(AudioManager::Get()->GetTaskRunner()->BelongsToCurrentThread());
-  // Query the number of total devices.
-  AudioObjectPropertyAddress property_address = {
-    kAudioHardwarePropertyDevices,
-    kAudioObjectPropertyScopeGlobal,
-    kAudioObjectPropertyElementMaster
-  };
-  UInt32 size = 0;
-  OSStatus result = AudioObjectGetPropertyDataSize(kAudioObjectSystemObject,
-                                                   &property_address,
-                                                   0,
-                                                   NULL,
-                                                   &size);
-  if (result || !size)
-    return;
-
-  int device_count = size / sizeof(AudioDeviceID);
-
-  // Get the array of device ids for all the devices, which includes both
-  // input devices and output devices.
-  std::unique_ptr<AudioDeviceID, base::FreeDeleter> devices(
-      static_cast<AudioDeviceID*>(malloc(size)));
-  AudioDeviceID* device_ids = devices.get();
-  result = AudioObjectGetPropertyData(kAudioObjectSystemObject,
-                                      &property_address,
-                                      0,
-                                      NULL,
-                                      &size,
-                                      device_ids);
-  if (result)
-    return;
-
-  // Iterate over all available devices to gather information.
-  for (int i = 0; i < device_count; ++i) {
-    // Get the number of input or output channels of the device.
-    property_address.mScope = is_input ?
-        kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput;
-    property_address.mSelector = kAudioDevicePropertyStreams;
-    size = 0;
-    result = AudioObjectGetPropertyDataSize(device_ids[i],
-                                            &property_address,
-                                            0,
-                                            NULL,
-                                            &size);
-    if (result || !size)
+  std::vector<AudioObjectID> device_ids =
+      core_audio_mac::GetAllAudioDeviceIDs();
+  for (AudioObjectID device_id : device_ids) {
+    if (core_audio_mac::GetNumStreams(device_id, is_input) == 0)
       continue;
 
-    // Ignore aggregate devices that get created when we use
-    // kAudioUnitSubType_VoiceProcessingIO.
-    property_address.mSelector = kAudioDevicePropertyTransportType;
-    property_address.mScope = kAudioObjectPropertyScopeGlobal;
-    UInt32 transport_type = 0;
-    size = sizeof(transport_type);
-    result = AudioObjectGetPropertyData(device_ids[i], &property_address, 0,
-                                        NULL, &size, &transport_type);
-    if (result == noErr && transport_type == kAudioDeviceTransportTypeAggregate)
+    base::Optional<std::string> unique_id =
+        core_audio_mac::GetDeviceUniqueID(device_id);
+    if (!unique_id)
       continue;
 
-    // Get device UID.
-    CFStringRef uid = NULL;
-    size = sizeof(uid);
-    property_address.mSelector = kAudioDevicePropertyDeviceUID;
-    property_address.mScope = kAudioObjectPropertyScopeGlobal;
-    result = AudioObjectGetPropertyData(device_ids[i],
-                                        &property_address,
-                                        0,
-                                        NULL,
-                                        &size,
-                                        &uid);
-    if (result)
+    base::Optional<std::string> label =
+        core_audio_mac::GetDeviceLabel(device_id, is_input);
+    if (!label)
       continue;
 
-    // Get device name.
-    CFStringRef name = NULL;
-    property_address.mSelector = kAudioObjectPropertyName;
-    property_address.mScope = kAudioObjectPropertyScopeGlobal;
-    result = AudioObjectGetPropertyData(device_ids[i],
-                                        &property_address,
-                                        0,
-                                        NULL,
-                                        &size,
-                                        &name);
-    if (result) {
-      if (uid)
-        CFRelease(uid);
-      continue;
-    }
-
-    // Store the device name and UID.
-    media::AudioDeviceName device_name;
-    device_name.device_name = base::SysCFStringRefToUTF8(name);
-    device_name.unique_id = base::SysCFStringRefToUTF8(uid);
-    device_names->push_back(device_name);
-
-    // We are responsible for releasing the returned CFObject.  See the
-    // comment in the AudioHardware.h for constant
-    // kAudioDevicePropertyDeviceUID.
-    if (uid)
-      CFRelease(uid);
-    if (name)
-      CFRelease(name);
+    device_names->emplace_back(std::move(*label), std::move(*unique_id));
   }
 
   if (!device_names->empty()) {
@@ -731,82 +650,33 @@
 }
 
 std::string AudioManagerMac::GetAssociatedOutputDeviceID(
-    const std::string& input_device_id) {
+    const std::string& input_device_unique_id) {
   DCHECK(GetTaskRunner()->BelongsToCurrentThread());
-  AudioDeviceID device = GetAudioDeviceIdByUId(true, input_device_id);
-  if (device == kAudioObjectUnknown)
+  AudioObjectID input_device_id =
+      GetAudioDeviceIdByUId(true, input_device_unique_id);
+  if (input_device_id == kAudioObjectUnknown)
     return std::string();
 
-  UInt32 size = 0;
-  AudioObjectPropertyAddress pa = {
-    kAudioDevicePropertyRelatedDevices,
-    kAudioDevicePropertyScopeOutput,
-    kAudioObjectPropertyElementMaster
-  };
-  OSStatus result = AudioObjectGetPropertyDataSize(device, &pa, 0, 0, &size);
-  if (result || !size)
-    return std::string();
+  std::vector<AudioObjectID> related_device_ids =
+      core_audio_mac::GetRelatedDeviceIDs(input_device_id);
 
-  int device_count = size / sizeof(AudioDeviceID);
-  std::unique_ptr<AudioDeviceID, base::FreeDeleter> devices(
-      static_cast<AudioDeviceID*>(malloc(size)));
-  result = AudioObjectGetPropertyData(
-      device, &pa, 0, NULL, &size, devices.get());
-  if (result)
-    return std::string();
-
-  std::vector<std::string> associated_devices;
-  for (int i = 0; i < device_count; ++i) {
-    // Get the number of output channels of the device.
-    pa.mSelector = kAudioDevicePropertyStreams;
-    size = 0;
-    result = AudioObjectGetPropertyDataSize(devices.get()[i],
-                                            &pa,
-                                            0,
-                                            NULL,
-                                            &size);
-    if (result || !size)
-      continue;  // Skip if there aren't any output channels.
-
-    // Get device UID.
-    CFStringRef uid = NULL;
-    size = sizeof(uid);
-    pa.mSelector = kAudioDevicePropertyDeviceUID;
-    result = AudioObjectGetPropertyData(devices.get()[i],
-                                        &pa,
-                                        0,
-                                        NULL,
-                                        &size,
-                                        &uid);
-    if (result || !uid)
-      continue;
-
-    std::string ret(base::SysCFStringRefToUTF8(uid));
-    CFRelease(uid);
-    associated_devices.push_back(ret);
+  std::vector<AudioObjectID> related_output_device_ids;
+  for (AudioObjectID device_id : related_device_ids) {
+    if (core_audio_mac::GetNumStreams(device_id, false /* is_input */) > 0)
+      related_output_device_ids.push_back(device_id);
   }
 
-  // No matching device found.
-  if (associated_devices.empty())
-    return std::string();
-
-  // Return the device if there is only one associated device.
-  if (associated_devices.size() == 1)
-    return associated_devices[0];
-
+  // Return the device ID if there is only one associated device.
   // When there are multiple associated devices, we currently do not have a way
   // to detect if a device (e.g. a digital output device) is actually connected
   // to an endpoint, so we cannot randomly pick a device.
-  // We pick the device iff the associated device is the default output device.
-  const std::string default_device = GetDefaultOutputDeviceID();
-  for (std::vector<std::string>::const_iterator iter =
-           associated_devices.begin();
-       iter != associated_devices.end(); ++iter) {
-    if (default_device == *iter)
-      return *iter;
+  if (related_output_device_ids.size() == 1) {
+    base::Optional<std::string> related_unique_id =
+        core_audio_mac::GetDeviceUniqueID(related_output_device_ids[0]);
+    if (related_unique_id)
+      return std::move(*related_unique_id);
   }
 
-  // Failed to figure out which is the matching device, return an empty string.
   return std::string();
 }
 
diff --git a/media/audio/mac/core_audio_util_mac.cc b/media/audio/mac/core_audio_util_mac.cc
new file mode 100644
index 0000000..b38275d2
--- /dev/null
+++ b/media/audio/mac/core_audio_util_mac.cc
@@ -0,0 +1,238 @@
+// Copyright 2018 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/audio/mac/core_audio_util_mac.h"
+
+#include <utility>
+
+#include "base/mac/mac_logging.h"
+#include "base/single_thread_task_runner.h"
+#include "base/strings/string_util.h"
+#include "base/strings/sys_string_conversions.h"
+#include "media/audio/audio_manager.h"
+
+namespace media {
+namespace core_audio_mac {
+
+namespace {
+
+AudioObjectPropertyScope InputOutputScope(bool is_input) {
+  return is_input ? kAudioObjectPropertyScopeInput
+                  : kAudioObjectPropertyScopeOutput;
+}
+
+base::Optional<std::string> GetDeviceStringProperty(
+    AudioObjectID device_id,
+    AudioObjectPropertySelector property_selector) {
+  DCHECK(AudioManager::Get()->GetTaskRunner()->BelongsToCurrentThread());
+  CFStringRef property_value = nullptr;
+  UInt32 size = sizeof(property_value);
+  AudioObjectPropertyAddress property_address = {
+      property_selector, kAudioObjectPropertyScopeGlobal,
+      kAudioObjectPropertyElementMaster};
+
+  OSStatus result = AudioObjectGetPropertyData(
+      device_id, &property_address, 0 /* inQualifierDataSize */,
+      nullptr /* inQualifierData */, &size, &property_value);
+  if (result != noErr) {
+    OSSTATUS_DLOG(WARNING, result)
+        << "Failed to read string property " << property_selector
+        << " for device " << device_id;
+    return base::nullopt;
+  }
+
+  if (!property_value)
+    return base::nullopt;
+
+  std::string device_property = base::SysCFStringRefToUTF8(property_value);
+  CFRelease(property_value);
+
+  return device_property;
+}
+
+base::Optional<uint32_t> GetDeviceUint32Property(
+    AudioObjectID device_id,
+    AudioObjectPropertySelector property_selector,
+    AudioObjectPropertyScope property_scope) {
+  DCHECK(AudioManager::Get()->GetTaskRunner()->BelongsToCurrentThread());
+  AudioObjectPropertyAddress property_address = {
+      property_selector, property_scope, kAudioObjectPropertyElementMaster};
+  UInt32 property_value;
+  UInt32 size = sizeof(property_value);
+  OSStatus result = AudioObjectGetPropertyData(
+      device_id, &property_address, 0 /* inQualifierDataSize */,
+      nullptr /* inQualifierData */, &size, &property_value);
+  if (result != noErr) {
+    OSSTATUS_DLOG(WARNING, result)
+        << "Failed to read UInt32 property " << property_selector
+        << " for device " << device_id;
+    return base::nullopt;
+  }
+  return property_value;
+}
+
+uint32_t GetDevicePropertySize(AudioObjectID device_id,
+                               AudioObjectPropertySelector property_selector,
+                               AudioObjectPropertyScope property_scope) {
+  DCHECK(AudioManager::Get()->GetTaskRunner()->BelongsToCurrentThread());
+  AudioObjectPropertyAddress property_address = {
+      property_selector, property_scope, kAudioObjectPropertyElementMaster};
+  UInt32 size = 0;
+  OSStatus result = AudioObjectGetPropertyDataSize(
+      device_id, &property_address, 0 /* inQualifierDataSize */,
+      nullptr /* inQualifierData */, &size);
+  if (result != noErr) {
+    OSSTATUS_DLOG(WARNING, result)
+        << "Failed to read size of property " << property_selector
+        << " for device " << device_id;
+    return 0;
+  }
+  return size;
+}
+
+std::vector<AudioObjectID> GetAudioDeviceIDs(
+    AudioObjectID audio_object_id,
+    AudioObjectPropertySelector property_selector) {
+  DCHECK(AudioManager::Get()->GetTaskRunner()->BelongsToCurrentThread());
+  AudioObjectPropertyAddress property_address = {
+      property_selector, kAudioObjectPropertyScopeGlobal,
+      kAudioObjectPropertyElementMaster};
+  UInt32 size = 0;
+  OSStatus result = AudioObjectGetPropertyDataSize(
+      audio_object_id, &property_address, 0 /* inQualifierDataSize */,
+      nullptr /* inQualifierData */, &size);
+  if (result != noErr) {
+    OSSTATUS_DLOG(WARNING, result)
+        << "Failed to read size of property " << property_selector
+        << " for device/object " << audio_object_id;
+    return {};
+  }
+
+  if (size == 0)
+    return {};
+
+  size_t device_count = size / sizeof(AudioObjectID);
+  // Get the array of device ids for all the devices, which includes both
+  // input devices and output devices.
+  std::vector<AudioObjectID> device_ids(device_count);
+  result = AudioObjectGetPropertyData(
+      audio_object_id, &property_address, 0 /* inQualifierDataSize */,
+      nullptr /* inQualifierData */, &size, device_ids.data());
+  if (result != noErr) {
+    OSSTATUS_DLOG(WARNING, result)
+        << "Failed to read devuce IDs for property " << property_selector
+        << " for device/object " << audio_object_id;
+    return {};
+  }
+
+  return device_ids;
+}
+
+base::Optional<std::string> GetDeviceName(AudioObjectID device_id) {
+  return GetDeviceStringProperty(device_id, kAudioObjectPropertyName);
+}
+
+base::Optional<std::string> GetDeviceModel(AudioObjectID device_id) {
+  return GetDeviceStringProperty(device_id, kAudioDevicePropertyModelUID);
+}
+
+base::Optional<uint32_t> GetDeviceTransportType(AudioObjectID device_id) {
+  return GetDeviceUint32Property(device_id, kAudioDevicePropertyTransportType,
+                                 kAudioObjectPropertyScopeGlobal);
+}
+
+bool ModelContainsVidPid(const std::string& model) {
+  return model.size() > 10 && model[model.size() - 5] == ':' &&
+         model[model.size() - 10] == ':';
+}
+
+std::string UsbVidPidFromModel(const std::string& model) {
+  return ModelContainsVidPid(model)
+             ? base::ToLowerASCII(model.substr(model.size() - 9))
+             : std::string();
+}
+
+std::string TransportTypeToString(uint32_t transport_type) {
+  switch (transport_type) {
+    case kAudioDeviceTransportTypeBuiltIn:
+      return "Built-in";
+    case kAudioDeviceTransportTypeAggregate:
+      return "Aggregate";
+    case kAudioDeviceTransportTypeAutoAggregate:
+      return "AutoAggregate";
+    case kAudioDeviceTransportTypeVirtual:
+      return "Virtual";
+    case kAudioDeviceTransportTypePCI:
+      return "PCI";
+    case kAudioDeviceTransportTypeUSB:
+      return "USB";
+    case kAudioDeviceTransportTypeFireWire:
+      return "FireWire";
+    case kAudioDeviceTransportTypeBluetooth:
+      return "Bluetooth";
+    case kAudioDeviceTransportTypeBluetoothLE:
+      return "Bluetooth LE";
+    case kAudioDeviceTransportTypeHDMI:
+      return "HDMI";
+    case kAudioDeviceTransportTypeDisplayPort:
+      return "DisplayPort";
+    case kAudioDeviceTransportTypeAirPlay:
+      return "AirPlay";
+    case kAudioDeviceTransportTypeAVB:
+      return "AVB";
+    case kAudioDeviceTransportTypeThunderbolt:
+      return "Thunderbolt";
+    case kAudioDeviceTransportTypeUnknown:
+    default:
+      return std::string();
+  }
+}
+
+}  // namespace
+
+std::vector<AudioObjectID> GetAllAudioDeviceIDs() {
+  return GetAudioDeviceIDs(kAudioObjectSystemObject,
+                           kAudioHardwarePropertyDevices);
+}
+
+std::vector<AudioObjectID> GetRelatedDeviceIDs(AudioObjectID device_id) {
+  return GetAudioDeviceIDs(device_id, kAudioDevicePropertyRelatedDevices);
+}
+
+base::Optional<std::string> GetDeviceUniqueID(AudioObjectID device_id) {
+  return GetDeviceStringProperty(device_id, kAudioDevicePropertyDeviceUID);
+}
+
+base::Optional<std::string> GetDeviceLabel(AudioObjectID device_id,
+                                           bool is_input) {
+  base::Optional<std::string> device_label = GetDeviceName(device_id);
+  if (!device_label)
+    return base::nullopt;
+
+  std::string suffix;
+  base::Optional<uint32_t> transport_type = GetDeviceTransportType(device_id);
+  if (transport_type) {
+    if (*transport_type == kAudioDeviceTransportTypeUSB) {
+      base::Optional<std::string> model = GetDeviceModel(device_id);
+      if (model) {
+        suffix = UsbVidPidFromModel(*model);
+      }
+    } else {
+      suffix = TransportTypeToString(*transport_type);
+    }
+  }
+
+  if (!suffix.empty())
+    *device_label += " (" + suffix + ")";
+
+  return device_label;
+}
+
+uint32_t GetNumStreams(AudioObjectID device_id, bool is_input) {
+  return GetDevicePropertySize(device_id, kAudioDevicePropertyStreams,
+                               InputOutputScope(is_input));
+}
+
+}  // namespace core_audio_mac
+}  // namespace media
diff --git a/media/audio/mac/core_audio_util_mac.h b/media/audio/mac/core_audio_util_mac.h
new file mode 100644
index 0000000..eb16316
--- /dev/null
+++ b/media/audio/mac/core_audio_util_mac.h
@@ -0,0 +1,44 @@
+// Copyright 2018 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_AUDIO_MAC_CORE_AUDIO_UTIL_MAC_H_
+#define MEDIA_AUDIO_MAC_CORE_AUDIO_UTIL_MAC_H_
+
+#include <CoreAudio/AudioHardware.h>
+
+#include <string>
+#include <vector>
+
+#include "base/optional.h"
+
+namespace media {
+namespace core_audio_mac {
+
+// Returns a vector with the IDs of all audio devices in the system.
+// The vector is empty if there are no devices or if there is an error.
+std::vector<AudioObjectID> GetAllAudioDeviceIDs();
+
+// Returns a vector with the IDs of all devices related to the given
+// |device_id|. The vector is empty if there are no related devices or
+// if there is an error.
+std::vector<AudioObjectID> GetRelatedDeviceIDs(AudioObjectID device_id);
+
+// Returns a string with a unique device ID for the given |device_id|, or no
+// value if there is an error.
+base::Optional<std::string> GetDeviceUniqueID(AudioObjectID device_id);
+
+// Returns a string with a descriptive label for the given |device_id|, or no
+// value if there is an error. The returned label is based on several
+// characteristics of the device.
+base::Optional<std::string> GetDeviceLabel(AudioObjectID device_id,
+                                           bool is_input);
+
+// Returns the number of input or output streams associated with the given
+// |device_id|. Returns zero if there are no streams or if there is an error.
+uint32_t GetNumStreams(AudioObjectID device_id, bool is_input);
+
+}  // namespace core_audio_mac
+}  // namespace media
+
+#endif  // MEDIA_AUDIO_MAC_CORE_AUDIO_UTIL_MAC_H_
diff --git a/mojo/public/cpp/base/BUILD.gn b/mojo/public/cpp/base/BUILD.gn
index 826b951..8f6c57a 100644
--- a/mojo/public/cpp/base/BUILD.gn
+++ b/mojo/public/cpp/base/BUILD.gn
@@ -55,6 +55,7 @@
     "process_id_unittest.cc",
     "read_only_buffer_unittest.cc",
     "ref_counted_memory_unittest.cc",
+    "shared_memory_unittest.cc",
     "string16_unittest.cc",
     "text_direction_unittest.cc",
     "thread_priority_unittest.cc",
diff --git a/mojo/public/cpp/base/shared_memory.typemap b/mojo/public/cpp/base/shared_memory.typemap
new file mode 100644
index 0000000..77d44a8
--- /dev/null
+++ b/mojo/public/cpp/base/shared_memory.typemap
@@ -0,0 +1,27 @@
+# Copyright 2018 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 = "//mojo/public/mojom/base/shared_memory.mojom"
+public_headers = [
+  "//base/memory/platform_shared_memory_region.h",
+  "//base/memory/read_only_shared_memory_region.h",
+  "//base/memory/unsafe_shared_memory_region.h",
+  "//base/memory/writable_shared_memory_region.h",
+]
+traits_headers = [ "//mojo/public/cpp/base/shared_memory_mojom_traits.h" ]
+sources = [
+  "//mojo/public/cpp/base/shared_memory_mojom_traits.cc",
+  "//mojo/public/cpp/base/shared_memory_mojom_traits.h",
+]
+public_deps = [
+  "//base",
+]
+type_mappings = [
+  "mojo_base.mojom.PlatformSharedMemoryHandle=base::subtle::PlatformSharedMemoryRegion::ScopedPlatformHandle[move_only]",
+  "mojo_base.mojom.PlatformSharedMemoryRegion=base::subtle::PlatformSharedMemoryRegion[move_only]",
+  "mojo_base.mojom.PlatformSharedMemoryRegion.Mode=base::subtle::PlatformSharedMemoryRegion::Mode",
+  "mojo_base.mojom.ReadOnlySharedMemoryRegion=base::ReadOnlySharedMemoryRegion[move_only,nullable_is_same_type]",
+  "mojo_base.mojom.UnsafeSharedMemoryRegion=base::UnsafeSharedMemoryRegion[move_only,nullable_is_same_type]",
+  "mojo_base.mojom.WritableSharedMemoryRegion=base::WritableSharedMemoryRegion[move_only,nullable_is_same_type]",
+]
diff --git a/mojo/public/cpp/base/shared_memory_mojom_traits.cc b/mojo/public/cpp/base/shared_memory_mojom_traits.cc
new file mode 100644
index 0000000..8c391701
--- /dev/null
+++ b/mojo/public/cpp/base/shared_memory_mojom_traits.cc
@@ -0,0 +1,323 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "mojo/public/cpp/base/shared_memory_mojom_traits.h"
+
+#include "base/logging.h"
+#include "base/numerics/safe_conversions.h"
+#include "mojo/public/c/system/platform_handle.h"
+
+namespace mojo {
+
+// static
+mojo::ScopedHandle
+StructTraits<mojo_base::mojom::PlatformSharedMemoryHandleDataView,
+             base::subtle::PlatformSharedMemoryRegion::ScopedPlatformHandle>::
+    handle_value(base::subtle::PlatformSharedMemoryRegion::ScopedPlatformHandle&
+                     handle) {
+  MojoPlatformHandle platform_handle;
+  platform_handle.struct_size = sizeof(platform_handle);
+#if defined(OS_WIN)
+  platform_handle.type = MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE;
+  platform_handle.value = reinterpret_cast<uint64_t>(handle.Take());
+#elif defined(OS_FUCHSIA)
+  platform_handle.type = MOJO_PLATFORM_HANDLE_TYPE_FUCHSIA_HANDLE;
+  platform_handle.value = static_cast<uint64_t>(handle.release());
+#elif defined(OS_MACOSX) && !defined(OS_IOS)
+  platform_handle.type = MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT;
+  platform_handle.value = static_cast<uint64_t>(handle.release());
+#elif defined(OS_ANDROID)
+  platform_handle.type = MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR;
+  platform_handle.value = static_cast<uint64_t>(handle.release());
+#else
+  platform_handle.type = MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR;
+  platform_handle.value = static_cast<uint64_t>(handle.fd.release());
+#endif
+  MojoHandle mojo_handle;
+  MojoResult result = MojoWrapPlatformHandle(&platform_handle, &mojo_handle);
+  if (result != MOJO_RESULT_OK)
+    return mojo::ScopedHandle();
+  return mojo::ScopedHandle(mojo::Handle(mojo_handle));
+}
+
+#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_FUCHSIA) && \
+    (!defined(OS_MACOSX) || defined(OS_IOS))
+// static
+mojo::ScopedHandle
+StructTraits<mojo_base::mojom::PlatformSharedMemoryHandleDataView,
+             base::subtle::PlatformSharedMemoryRegion::ScopedPlatformHandle>::
+    readonly_fd(base::subtle::PlatformSharedMemoryRegion::ScopedPlatformHandle&
+                    handle) {
+  if (!handle.readonly_fd.is_valid())
+    return mojo::ScopedHandle();
+  MojoPlatformHandle platform_handle;
+  platform_handle.struct_size = sizeof(platform_handle);
+  platform_handle.type = MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR;
+  platform_handle.value = static_cast<uint64_t>(handle.readonly_fd.release());
+
+  MojoHandle mojo_handle;
+  MojoResult result = MojoWrapPlatformHandle(&platform_handle, &mojo_handle);
+  if (result != MOJO_RESULT_OK)
+    return mojo::ScopedHandle();
+
+  return mojo::ScopedHandle(mojo::Handle(mojo_handle));
+}
+#endif
+
+bool StructTraits<
+    mojo_base::mojom::PlatformSharedMemoryHandleDataView,
+    base::subtle::PlatformSharedMemoryRegion::ScopedPlatformHandle>::
+    Read(mojo_base::mojom::PlatformSharedMemoryHandleDataView data,
+         base::subtle::PlatformSharedMemoryRegion::ScopedPlatformHandle* out) {
+  mojo::ScopedHandle mojo_handle = data.TakeHandleValue();
+  if (!mojo_handle.is_valid())
+    return false;
+
+  MojoPlatformHandle platform_handle;
+  platform_handle.struct_size = sizeof(platform_handle);
+  MojoResult result =
+      MojoUnwrapPlatformHandle(mojo_handle.release().value(), &platform_handle);
+  if (result != MOJO_RESULT_OK)
+    return false;
+
+#if defined(OS_WIN)
+  if (platform_handle.type != MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE)
+    return false;
+  out->Set(reinterpret_cast<HANDLE>(platform_handle.value));
+#elif defined(OS_FUCHSIA)
+  if (platform_handle.type != MOJO_PLATFORM_HANDLE_TYPE_FUCHSIA_HANDLE)
+    return false;
+  out->reset(static_cast<zx_handle_t>(platform_handle.value));
+#elif defined(OS_MACOSX) && !defined(OS_IOS)
+  if (platform_handle.type != MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT)
+    return false;
+  out->reset(static_cast<mach_port_t>(platform_handle.value));
+#elif defined(OS_ANDROID)
+  if (platform_handle.type != MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR)
+    return false;
+  out->reset(static_cast<int>(platform_handle.value));
+#else
+  if (platform_handle.type != MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR)
+    return false;
+  out->fd.reset(static_cast<int>(platform_handle.value));
+
+  // Other POSIX platforms may have an additional FD to support eventual
+  // read-only duplication.
+  mojo::ScopedHandle readonly_mojo_handle = data.TakeReadonlyFd();
+
+  MojoPlatformHandle readonly_platform_handle;
+  readonly_platform_handle.struct_size = sizeof(readonly_platform_handle);
+  readonly_platform_handle.type = MOJO_PLATFORM_HANDLE_TYPE_INVALID;
+  if (readonly_mojo_handle.is_valid()) {
+    MojoResult result = MojoUnwrapPlatformHandle(
+        readonly_mojo_handle.release().value(), &readonly_platform_handle);
+    if (result != MOJO_RESULT_OK ||
+        readonly_platform_handle.type !=
+            MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR) {
+      return false;
+    }
+    out->readonly_fd.reset(static_cast<int>(readonly_platform_handle.value));
+  }
+#endif
+
+  return true;
+}
+
+// static
+mojo_base::mojom::PlatformSharedMemoryRegion_Mode
+EnumTraits<mojo_base::mojom::PlatformSharedMemoryRegion_Mode,
+           base::subtle::PlatformSharedMemoryRegion::Mode>::
+    ToMojom(base::subtle::PlatformSharedMemoryRegion::Mode input) {
+  switch (input) {
+    case base::subtle::PlatformSharedMemoryRegion::Mode::kReadOnly:
+      return mojo_base::mojom::PlatformSharedMemoryRegion_Mode::kReadOnly;
+    case base::subtle::PlatformSharedMemoryRegion::Mode::kWritable:
+      return mojo_base::mojom::PlatformSharedMemoryRegion_Mode::kWritable;
+    case base::subtle::PlatformSharedMemoryRegion::Mode::kUnsafe:
+      return mojo_base::mojom::PlatformSharedMemoryRegion_Mode::kUnsafe;
+    default:
+      NOTREACHED();
+      return mojo_base::mojom::PlatformSharedMemoryRegion_Mode::kUnsafe;
+  }
+}
+
+// static
+bool EnumTraits<mojo_base::mojom::PlatformSharedMemoryRegion_Mode,
+                base::subtle::PlatformSharedMemoryRegion::Mode>::
+    FromMojom(mojo_base::mojom::PlatformSharedMemoryRegion_Mode input,
+              base::subtle::PlatformSharedMemoryRegion::Mode* output) {
+  switch (input) {
+    case mojo_base::mojom::PlatformSharedMemoryRegion_Mode::kReadOnly:
+      *output = base::subtle::PlatformSharedMemoryRegion::Mode::kReadOnly;
+      break;
+    case mojo_base::mojom::PlatformSharedMemoryRegion_Mode::kWritable:
+      *output = base::subtle::PlatformSharedMemoryRegion::Mode::kWritable;
+      break;
+    case mojo_base::mojom::PlatformSharedMemoryRegion_Mode::kUnsafe:
+      *output = base::subtle::PlatformSharedMemoryRegion::Mode::kUnsafe;
+      break;
+    default:
+      NOTREACHED();
+      return false;
+  }
+  return true;
+}
+
+// static
+base::subtle::PlatformSharedMemoryRegion::ScopedPlatformHandle
+StructTraits<mojo_base::mojom::PlatformSharedMemoryRegionDataView,
+             base::subtle::PlatformSharedMemoryRegion>::
+    platform_handle(base::subtle::PlatformSharedMemoryRegion& region) {
+  return region.PassPlatformHandle();
+}
+
+// static
+base::subtle::PlatformSharedMemoryRegion::Mode
+StructTraits<mojo_base::mojom::PlatformSharedMemoryRegionDataView,
+             base::subtle::PlatformSharedMemoryRegion>::
+    mode(const base::subtle::PlatformSharedMemoryRegion& region) {
+  return region.GetMode();
+}
+
+// static
+uint64_t StructTraits<mojo_base::mojom::PlatformSharedMemoryRegionDataView,
+                      base::subtle::PlatformSharedMemoryRegion>::
+    size(const base::subtle::PlatformSharedMemoryRegion& region) {
+  return region.GetSize();
+}
+
+// static
+base::UnguessableToken
+StructTraits<mojo_base::mojom::PlatformSharedMemoryRegionDataView,
+             base::subtle::PlatformSharedMemoryRegion>::
+    guid(const base::subtle::PlatformSharedMemoryRegion& region) {
+  return region.GetGUID();
+}
+
+// static
+bool StructTraits<mojo_base::mojom::PlatformSharedMemoryRegionDataView,
+                  base::subtle::PlatformSharedMemoryRegion>::
+    Read(mojo_base::mojom::PlatformSharedMemoryRegionDataView data,
+         base::subtle::PlatformSharedMemoryRegion* out) {
+  if (!base::IsValueInRangeForNumericType<size_t>(data.size()))
+    return false;
+  size_t size = static_cast<size_t>(data.size());
+  base::subtle::PlatformSharedMemoryRegion::ScopedPlatformHandle handle;
+  base::subtle::PlatformSharedMemoryRegion::Mode mode;
+  base::UnguessableToken guid;
+  if (!data.ReadPlatformHandle(&handle) || !data.ReadMode(&mode) ||
+      !data.ReadGuid(&guid)) {
+    return false;
+  }
+  *out = base::subtle::PlatformSharedMemoryRegion::Take(std::move(handle), mode,
+                                                        size, guid);
+  return out->IsValid();
+}
+
+// static
+bool StructTraits<mojo_base::mojom::ReadOnlySharedMemoryRegionDataView,
+                  base::ReadOnlySharedMemoryRegion>::
+    IsNull(const base::ReadOnlySharedMemoryRegion& region) {
+  return !region.IsValid();
+}
+
+// static
+void StructTraits<mojo_base::mojom::ReadOnlySharedMemoryRegionDataView,
+                  base::ReadOnlySharedMemoryRegion>::
+    SetToNull(base::ReadOnlySharedMemoryRegion* region) {
+  *region = base::ReadOnlySharedMemoryRegion();
+}
+
+// static
+base::subtle::PlatformSharedMemoryRegion StructTraits<
+    mojo_base::mojom::ReadOnlySharedMemoryRegionDataView,
+    base::ReadOnlySharedMemoryRegion>::region(base::ReadOnlySharedMemoryRegion&
+                                                  in_region) {
+  return base::ReadOnlySharedMemoryRegion::TakeHandleForSerialization(
+      std::move(in_region));
+}
+
+// static
+bool StructTraits<mojo_base::mojom::ReadOnlySharedMemoryRegionDataView,
+                  base::ReadOnlySharedMemoryRegion>::
+    Read(mojo_base::mojom::ReadOnlySharedMemoryRegionDataView data,
+         base::ReadOnlySharedMemoryRegion* out) {
+  base::subtle::PlatformSharedMemoryRegion region;
+  if (!data.ReadRegion(&region))
+    return false;
+  *out = base::ReadOnlySharedMemoryRegion::Deserialize(std::move(region));
+  return out->IsValid();
+}
+
+// static
+bool StructTraits<mojo_base::mojom::UnsafeSharedMemoryRegionDataView,
+                  base::UnsafeSharedMemoryRegion>::
+    IsNull(const base::UnsafeSharedMemoryRegion& region) {
+  return !region.IsValid();
+}
+
+// static
+void StructTraits<mojo_base::mojom::UnsafeSharedMemoryRegionDataView,
+                  base::UnsafeSharedMemoryRegion>::
+    SetToNull(base::UnsafeSharedMemoryRegion* region) {
+  *region = base::UnsafeSharedMemoryRegion();
+}
+
+// static
+base::subtle::PlatformSharedMemoryRegion StructTraits<
+    mojo_base::mojom::UnsafeSharedMemoryRegionDataView,
+    base::UnsafeSharedMemoryRegion>::region(base::UnsafeSharedMemoryRegion&
+                                                in_region) {
+  return base::UnsafeSharedMemoryRegion::TakeHandleForSerialization(
+      std::move(in_region));
+}
+
+// static
+bool StructTraits<mojo_base::mojom::UnsafeSharedMemoryRegionDataView,
+                  base::UnsafeSharedMemoryRegion>::
+    Read(mojo_base::mojom::UnsafeSharedMemoryRegionDataView data,
+         base::UnsafeSharedMemoryRegion* out) {
+  base::subtle::PlatformSharedMemoryRegion region;
+  if (!data.ReadRegion(&region))
+    return false;
+  *out = base::UnsafeSharedMemoryRegion::Deserialize(std::move(region));
+  return out->IsValid();
+}
+
+// static
+bool StructTraits<mojo_base::mojom::WritableSharedMemoryRegionDataView,
+                  base::WritableSharedMemoryRegion>::
+    IsNull(const base::WritableSharedMemoryRegion& region) {
+  return !region.IsValid();
+}
+
+// static
+void StructTraits<mojo_base::mojom::WritableSharedMemoryRegionDataView,
+                  base::WritableSharedMemoryRegion>::
+    SetToNull(base::WritableSharedMemoryRegion* region) {
+  *region = base::WritableSharedMemoryRegion();
+}
+
+// static
+base::subtle::PlatformSharedMemoryRegion StructTraits<
+    mojo_base::mojom::WritableSharedMemoryRegionDataView,
+    base::WritableSharedMemoryRegion>::region(base::WritableSharedMemoryRegion&
+                                                  in_region) {
+  return base::WritableSharedMemoryRegion::TakeHandleForSerialization(
+      std::move(in_region));
+}
+
+// static
+bool StructTraits<mojo_base::mojom::WritableSharedMemoryRegionDataView,
+                  base::WritableSharedMemoryRegion>::
+    Read(mojo_base::mojom::WritableSharedMemoryRegionDataView data,
+         base::WritableSharedMemoryRegion* out) {
+  base::subtle::PlatformSharedMemoryRegion region;
+  if (!data.ReadRegion(&region))
+    return false;
+  *out = base::WritableSharedMemoryRegion::Deserialize(std::move(region));
+  return out->IsValid();
+}
+
+}  // namespace mojo
diff --git a/mojo/public/cpp/base/shared_memory_mojom_traits.h b/mojo/public/cpp/base/shared_memory_mojom_traits.h
new file mode 100644
index 0000000..7fa5754
--- /dev/null
+++ b/mojo/public/cpp/base/shared_memory_mojom_traits.h
@@ -0,0 +1,110 @@
+// Copyright 2018 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 MOJO_PUBLIC_CPP_BASE_SHARED_MEMORY_MOJOM_TRAITS_H_
+#define MOJO_PUBLIC_CPP_BASE_SHARED_MEMORY_MOJOM_TRAITS_H_
+
+#include <cstdint>
+
+#include "base/component_export.h"
+#include "base/memory/platform_shared_memory_region.h"
+#include "base/memory/read_only_shared_memory_region.h"
+#include "base/memory/unsafe_shared_memory_region.h"
+#include "base/memory/writable_shared_memory_region.h"
+#include "base/unguessable_token.h"
+#include "build/build_config.h"
+#include "mojo/public/cpp/base/unguessable_token_mojom_traits.h"
+#include "mojo/public/cpp/bindings/enum_traits.h"
+#include "mojo/public/cpp/bindings/struct_traits.h"
+#include "mojo/public/cpp/system/handle.h"
+#include "mojo/public/mojom/base/shared_memory.mojom-shared.h"
+
+namespace mojo {
+
+template <>
+struct COMPONENT_EXPORT(MOJO_BASE_MOJOM) StructTraits<
+    mojo_base::mojom::PlatformSharedMemoryHandleDataView,
+    base::subtle::PlatformSharedMemoryRegion::ScopedPlatformHandle> {
+  static mojo::ScopedHandle handle_value(
+      base::subtle::PlatformSharedMemoryRegion::ScopedPlatformHandle& handle);
+#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_FUCHSIA) && \
+    (!defined(OS_MACOSX) || defined(OS_IOS))
+  static mojo::ScopedHandle readonly_fd(
+      base::subtle::PlatformSharedMemoryRegion::ScopedPlatformHandle& handle);
+#endif
+
+  static bool Read(
+      mojo_base::mojom::PlatformSharedMemoryHandleDataView data,
+      base::subtle::PlatformSharedMemoryRegion::ScopedPlatformHandle* out);
+};
+
+template <>
+struct COMPONENT_EXPORT(MOJO_BASE_MOJOM)
+    EnumTraits<mojo_base::mojom::PlatformSharedMemoryRegion_Mode,
+               base::subtle::PlatformSharedMemoryRegion::Mode> {
+  static mojo_base::mojom::PlatformSharedMemoryRegion_Mode ToMojom(
+      base::subtle::PlatformSharedMemoryRegion::Mode input);
+
+  static bool FromMojom(mojo_base::mojom::PlatformSharedMemoryRegion_Mode input,
+                        base::subtle::PlatformSharedMemoryRegion::Mode* output);
+};
+
+template <>
+struct COMPONENT_EXPORT(MOJO_BASE_MOJOM)
+    StructTraits<mojo_base::mojom::PlatformSharedMemoryRegionDataView,
+                 base::subtle::PlatformSharedMemoryRegion> {
+  static base::subtle::PlatformSharedMemoryRegion::ScopedPlatformHandle
+  platform_handle(base::subtle::PlatformSharedMemoryRegion& region);
+
+  static base::subtle::PlatformSharedMemoryRegion::Mode mode(
+      const base::subtle::PlatformSharedMemoryRegion& region);
+
+  static uint64_t size(const base::subtle::PlatformSharedMemoryRegion& region);
+
+  static base::UnguessableToken guid(
+      const base::subtle::PlatformSharedMemoryRegion& region);
+
+  static bool Read(mojo_base::mojom::PlatformSharedMemoryRegionDataView data,
+                   base::subtle::PlatformSharedMemoryRegion* out);
+};
+
+template <>
+struct COMPONENT_EXPORT(MOJO_BASE_MOJOM)
+    StructTraits<mojo_base::mojom::ReadOnlySharedMemoryRegionDataView,
+                 base::ReadOnlySharedMemoryRegion> {
+  static bool IsNull(const base::ReadOnlySharedMemoryRegion& region);
+  static void SetToNull(base::ReadOnlySharedMemoryRegion* region);
+  static base::subtle::PlatformSharedMemoryRegion region(
+      base::ReadOnlySharedMemoryRegion& in_region);
+  static bool Read(mojo_base::mojom::ReadOnlySharedMemoryRegionDataView data,
+                   base::ReadOnlySharedMemoryRegion* out);
+};
+
+template <>
+struct COMPONENT_EXPORT(MOJO_BASE_MOJOM)
+    StructTraits<mojo_base::mojom::UnsafeSharedMemoryRegionDataView,
+                 base::UnsafeSharedMemoryRegion> {
+  static bool IsNull(const base::UnsafeSharedMemoryRegion& region);
+  static void SetToNull(base::UnsafeSharedMemoryRegion* region);
+  static base::subtle::PlatformSharedMemoryRegion region(
+      base::UnsafeSharedMemoryRegion& in_region);
+  static bool Read(mojo_base::mojom::UnsafeSharedMemoryRegionDataView data,
+                   base::UnsafeSharedMemoryRegion* out);
+};
+
+template <>
+struct COMPONENT_EXPORT(MOJO_BASE_MOJOM)
+    StructTraits<mojo_base::mojom::WritableSharedMemoryRegionDataView,
+                 base::WritableSharedMemoryRegion> {
+  static bool IsNull(const base::WritableSharedMemoryRegion& region);
+  static void SetToNull(base::WritableSharedMemoryRegion* region);
+  static base::subtle::PlatformSharedMemoryRegion region(
+      base::WritableSharedMemoryRegion& in_region);
+  static bool Read(mojo_base::mojom::WritableSharedMemoryRegionDataView data,
+                   base::WritableSharedMemoryRegion* out);
+};
+
+}  // namespace mojo
+
+#endif  // MOJO_PUBLIC_CPP_BASE_SHARED_MEMORY_MOJOM_TRAITS_H_
diff --git a/mojo/public/cpp/base/shared_memory_unittest.cc b/mojo/public/cpp/base/shared_memory_unittest.cc
new file mode 100644
index 0000000..7904f5d
--- /dev/null
+++ b/mojo/public/cpp/base/shared_memory_unittest.cc
@@ -0,0 +1,53 @@
+// Copyright 2018 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 <string>
+
+#include "mojo/public/cpp/base/shared_memory_mojom_traits.h"
+#include "mojo/public/cpp/test_support/test_utils.h"
+#include "mojo/public/mojom/base/shared_memory.mojom.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+TEST(SharedMemoryMojomTest, ReadOnly) {
+  auto region = base::ReadOnlySharedMemoryRegion::Create(64);
+  const std::string kTestData = "Hello, world!";
+  memcpy(region.mapping.memory(), kTestData.data(), kTestData.size());
+
+  base::ReadOnlySharedMemoryRegion read_only_out;
+  EXPECT_TRUE(mojo::test::SerializeAndDeserialize<
+              mojo_base::mojom::ReadOnlySharedMemoryRegion>(&region.region,
+                                                            &read_only_out));
+  base::ReadOnlySharedMemoryMapping mapping = read_only_out.Map();
+  EXPECT_EQ(0, memcmp(mapping.memory(), kTestData.data(), kTestData.size()));
+}
+
+TEST(SharedMemoryMojomTest, Writable) {
+  auto region = base::WritableSharedMemoryRegion::Create(64);
+  auto mapping = region.Map();
+  const std::string kTestData = "Hello, world!";
+  memcpy(mapping.memory(), kTestData.data(), kTestData.size());
+
+  base::WritableSharedMemoryRegion writable_out;
+  EXPECT_TRUE(mojo::test::SerializeAndDeserialize<
+              mojo_base::mojom::WritableSharedMemoryRegion>(&region,
+                                                            &writable_out));
+
+  mapping = writable_out.Map();
+  EXPECT_EQ(0, memcmp(mapping.memory(), kTestData.data(), kTestData.size()));
+}
+
+TEST(SharedMemoryMojomTest, Unsafe) {
+  auto region = base::UnsafeSharedMemoryRegion::Create(64);
+  auto mapping = region.Map();
+  const std::string kTestData = "Hello, world!";
+  memcpy(mapping.memory(), kTestData.data(), kTestData.size());
+
+  base::UnsafeSharedMemoryRegion unsafe_out;
+  EXPECT_TRUE(
+      mojo::test::SerializeAndDeserialize<
+          mojo_base::mojom::UnsafeSharedMemoryRegion>(&region, &unsafe_out));
+
+  mapping = unsafe_out.Map();
+  EXPECT_EQ(0, memcmp(mapping.memory(), kTestData.data(), kTestData.size()));
+}
diff --git a/mojo/public/cpp/base/typemaps.gni b/mojo/public/cpp/base/typemaps.gni
index 091803c..668dc8e 100644
--- a/mojo/public/cpp/base/typemaps.gni
+++ b/mojo/public/cpp/base/typemaps.gni
@@ -13,6 +13,7 @@
   "//mojo/public/cpp/base/memory_allocator_dump_cross_process_uid.typemap",
   "//mojo/public/cpp/base/process_id.typemap",
   "//mojo/public/cpp/base/ref_counted_memory.typemap",
+  "//mojo/public/cpp/base/shared_memory.typemap",
   "//mojo/public/cpp/base/string16.typemap",
   "//mojo/public/cpp/base/logfont_win.typemap",
   "//mojo/public/cpp/base/text_direction.typemap",
diff --git a/mojo/public/mojom/base/BUILD.gn b/mojo/public/mojom/base/BUILD.gn
index d80a937..acbc814 100644
--- a/mojo/public/mojom/base/BUILD.gn
+++ b/mojo/public/mojom/base/BUILD.gn
@@ -15,6 +15,7 @@
     "memory_allocator_dump_cross_process_uid.mojom",
     "process_id.mojom",
     "ref_counted_memory.mojom",
+    "shared_memory.mojom",
     "string16.mojom",
     "text_direction.mojom",
     "thread_priority.mojom",
@@ -27,6 +28,10 @@
     sources += [ "logfont_win.mojom" ]
   }
 
+  if (is_posix && !is_android && !is_fuchsia && !is_mac) {
+    enabled_features = [ "shared_memory_region_uses_fd_pair" ]
+  }
+
   output_prefix = "mojo_base_mojom"
   macro_prefix = "MOJO_BASE_MOJOM"
 }
diff --git a/mojo/public/mojom/base/shared_memory.mojom b/mojo/public/mojom/base/shared_memory.mojom
new file mode 100644
index 0000000..e11ed2d7
--- /dev/null
+++ b/mojo/public/mojom/base/shared_memory.mojom
@@ -0,0 +1,59 @@
+// Copyright 2018 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 mojo_base.mojom;
+
+import "mojo/public/mojom/base/unguessable_token.mojom";
+
+// Mirrors the base::subtle::PlatformSharedMemoryRegion::ScopedPlatformHandle
+// type.
+//
+// TODO(https://crbug.com/826213): Remove this once Mojo shared buffers are
+// properly backed by base::subtle::PlatformSharedMemoryRegion.
+struct PlatformSharedMemoryHandle {
+  handle handle_value;
+
+  [EnableIf=shared_memory_region_uses_fd_pair]
+  handle? readonly_fd;
+};
+
+// Mirrors the base::subtle::PlatformSharedMemoryRegion type.
+//
+// This should not be used directly. Use one of the specific region types below
+// instead.
+//
+// TODO(https://crbug.com/826213): Remove this once Mojo shared buffers are
+// properly backed by base::subtle::PlatformSharedMemoryRegion.
+struct PlatformSharedMemoryRegion {
+  enum Mode {
+    kReadOnly,
+    kWritable,
+    kUnsafe,
+  };
+
+  PlatformSharedMemoryHandle platform_handle;
+  Mode mode;
+  uint64 size;
+  UnguessableToken guid;
+};
+
+// Wraps a shared memory handle with additional type information to convey that
+// the handle is only mappable to read-only memory.
+struct ReadOnlySharedMemoryRegion {
+  PlatformSharedMemoryRegion region;
+};
+
+// Wraps a shared memory handle with additional type information to convey that
+// the handle is mappable to writable memory but can also be converted to
+// a ReadOnlySharedMemoryRegion for sharing with other clients.
+struct WritableSharedMemoryRegion {
+  PlatformSharedMemoryRegion region;
+};
+
+// Wraps a shared memory handle with additional type information to convey that
+// the handle is always mappable to writable memory by any client which obtains
+// a handle duplicated from this one.
+struct UnsafeSharedMemoryRegion {
+  PlatformSharedMemoryRegion region;
+};
diff --git a/net/BUILD.gn b/net/BUILD.gn
index 4df55c5b..5b857835 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -484,11 +484,6 @@
       "base/network_interfaces_posix.h",
       "base/network_interfaces_win.cc",
       "base/network_interfaces_win.h",
-      "base/network_throttle_manager.h",
-      "base/network_throttle_manager_impl.cc",
-      "base/network_throttle_manager_impl.h",
-      "base/percentile_estimator.cc",
-      "base/percentile_estimator.h",
       "base/platform_mime_util.h",
       "base/platform_mime_util_linux.cc",
       "base/platform_mime_util_mac.mm",
@@ -4711,9 +4706,7 @@
     "base/network_interfaces_linux_unittest.cc",
     "base/network_interfaces_unittest.cc",
     "base/network_interfaces_win_unittest.cc",
-    "base/network_throttle_manager_impl_unittest.cc",
     "base/parse_number_unittest.cc",
-    "base/percentile_estimator_unittest.cc",
     "base/port_util_unittest.cc",
     "base/prioritized_dispatcher_unittest.cc",
     "base/priority_queue_unittest.cc",
diff --git a/net/base/load_states_list.h b/net/base/load_states_list.h
index 4e776c7..4a88e01 100644
--- a/net/base/load_states_list.h
+++ b/net/base/load_states_list.h
@@ -20,88 +20,84 @@
 // called Read yet).
 LOAD_STATE(IDLE, 0)
 
-// This state corresponds to a resource load that is throttled by the
-// network layer waiting for some other resource load or loads to complete.
-LOAD_STATE(THROTTLED, 1)
-
 // When a socket pool group is below the maximum number of sockets allowed per
 // group, but a new socket cannot be created due to the per-pool socket limit,
 // this state is returned by all requests for the group waiting on an idle
 // connection, except those that may be serviced by a pending new connection.
-LOAD_STATE(WAITING_FOR_STALLED_SOCKET_POOL, 2)
+LOAD_STATE(WAITING_FOR_STALLED_SOCKET_POOL, 1)
 
 // When a socket pool group has reached the maximum number of sockets allowed
 // per group, this state is returned for all requests that don't have a socket,
 // except those that correspond to a pending new connection.
-LOAD_STATE(WAITING_FOR_AVAILABLE_SOCKET, 3)
+LOAD_STATE(WAITING_FOR_AVAILABLE_SOCKET, 2)
 
 // This state indicates that the URLRequest delegate has chosen to block this
 // request before it was sent over the network. When in this state, the
 // delegate should set a load state parameter on the URLRequest describing
 // the nature of the delay (i.e. "Waiting for <description given by
 // delegate>").
-LOAD_STATE(WAITING_FOR_DELEGATE, 4)
+LOAD_STATE(WAITING_FOR_DELEGATE, 3)
 
 // This state corresponds to a resource load that is blocked waiting for
 // access to a resource in the cache.  If multiple requests are made for the
 // same resource, the first request will be responsible for writing (or
 // updating) the cache entry and the second request will be deferred until
 // the first completes.  This may be done to optimize for cache reuse.
-LOAD_STATE(WAITING_FOR_CACHE, 5)
+LOAD_STATE(WAITING_FOR_CACHE, 4)
 
 // This state corresponds to a resource load that is blocked waiting for
 // access to a resource in the AppCache.
 // Note: This is a layering violation, but being the only one it's not that
 // bad. TODO(rvargas): Reconsider what to do if we need to add more.
-LOAD_STATE(WAITING_FOR_APPCACHE, 6)
+LOAD_STATE(WAITING_FOR_APPCACHE, 5)
 
 // This state corresponds to a resource being blocked waiting for the
 // PAC script to be downloaded.
-LOAD_STATE(DOWNLOADING_PAC_FILE, 7)
+LOAD_STATE(DOWNLOADING_PAC_FILE, 6)
 
 // This state corresponds to a resource load that is blocked waiting for a
 // proxy autoconfig script to return a proxy server to use.
-LOAD_STATE(RESOLVING_PROXY_FOR_URL, 8)
+LOAD_STATE(RESOLVING_PROXY_FOR_URL, 7)
 
 // This state corresponds to a resource load that is blocked waiting for a
 // proxy autoconfig script to return a proxy server to use, but that proxy
 // script is busy resolving the IP address of a host.
-LOAD_STATE(RESOLVING_HOST_IN_PAC_FILE, 9)
+LOAD_STATE(RESOLVING_HOST_IN_PAC_FILE, 8)
 
 // This state indicates that we're in the process of establishing a tunnel
 // through the proxy server.
-LOAD_STATE(ESTABLISHING_PROXY_TUNNEL, 10)
+LOAD_STATE(ESTABLISHING_PROXY_TUNNEL, 9)
 
 // This state corresponds to a resource load that is blocked waiting for a
 // host name to be resolved.  This could either indicate resolution of the
 // origin server corresponding to the resource or to the host name of a proxy
 // server used to fetch the resource.
-LOAD_STATE(RESOLVING_HOST, 11)
+LOAD_STATE(RESOLVING_HOST, 10)
 
 // This state corresponds to a resource load that is blocked waiting for a
 // TCP connection (or other network connection) to be established.  HTTP
 // requests that reuse a keep-alive connection skip this state.
-LOAD_STATE(CONNECTING, 12)
+LOAD_STATE(CONNECTING, 11)
 
 // This state corresponds to a resource load that is blocked waiting for the
 // SSL handshake to complete.
-LOAD_STATE(SSL_HANDSHAKE, 13)
+LOAD_STATE(SSL_HANDSHAKE, 12)
 
 // This state corresponds to a resource load that is blocked waiting to
 // completely upload a request to a server.  In the case of a HTTP POST
 // request, this state includes the period of time during which the message
 // body is being uploaded.
-LOAD_STATE(SENDING_REQUEST, 14)
+LOAD_STATE(SENDING_REQUEST, 13)
 
 // This state corresponds to a resource load that is blocked waiting for the
 // response to a network request.  In the case of a HTTP transaction, this
 // corresponds to the period after the request is sent and before all of the
 // response headers have been received.
-LOAD_STATE(WAITING_FOR_RESPONSE, 15)
+LOAD_STATE(WAITING_FOR_RESPONSE, 14)
 
 // This state corresponds to a resource load that is blocked waiting for a
 // read to complete.  In the case of a HTTP transaction, this corresponds to
 // the period after the response headers have been received and before all of
 // the response body has been downloaded.  (NOTE: This state only applies for
 // an URLRequest while there is an outstanding Read operation.)
-LOAD_STATE(READING_RESPONSE, 16)
+LOAD_STATE(READING_RESPONSE, 15)
diff --git a/net/base/network_throttle_manager.h b/net/base/network_throttle_manager.h
deleted file mode 100644
index 96a864e..0000000
--- a/net/base/network_throttle_manager.h
+++ /dev/null
@@ -1,97 +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 NET_BASE_NETWORK_THROTTLE_MANAGER_H_
-#define NET_BASE_NETWORK_THROTTLE_MANAGER_H_
-
-#include <memory>
-
-#include "base/memory/weak_ptr.h"
-#include "net/base/net_export.h"
-#include "net/base/request_priority.h"
-
-namespace net {
-
-// This class controls throttling based on priority level and number of
-// outstanding requests.  It vends Throttle objects, and tracks
-// outstanding requests by the lifetime of those objects.  Consumers
-// determine whether or not they are throttled by consulting those
-// Throttle objects.
-//
-// This class must outlive all Throttles created from it via CreateThrottle().
-//
-// Methods are virtual to allow for test mocks.
-class NET_EXPORT_PRIVATE NetworkThrottleManager {
- public:
-  class Throttle;
-
-  // Abstract base class other classes can inherit from to get
-  // notifications from throttle state changes.
-  class NET_EXPORT_PRIVATE ThrottleDelegate {
-   public:
-    // Called when a throttle is unblocked.
-    //
-    // Note that this call may occur as the result of either a call to
-    // Throttle::SetPriority (on the throttle related to this delegate
-    // or another throttle) or the destruction of a Throttle, and if
-    // so will occur synchronously during those events.  It will not
-    // be called from the destructor of the Throttle associated with
-    // the ThrottleDelegate.
-    virtual void OnThrottleUnblocked(Throttle* throttle) = 0;
-
-   protected:
-    virtual ~ThrottleDelegate() {}
-  };
-
-  // Class owned by external stream representations that
-  // routes notifications.  It may be constructed in either the
-  // blocked or unblocked state according to the state of the
-  // NetworkThrottleManager; if it's constructed in the unblocked
-  // state, it will only make a single transition to unblocked,
-  // which will be signaled by delegate->OnThrottleUnblocked(this).
-  // If it's constructed in the unblocked state, it will remain
-  // there.
-  class NET_EXPORT_PRIVATE Throttle {
-   public:
-    virtual ~Throttle() {}
-
-    virtual bool IsBlocked() const = 0;
-
-    virtual RequestPriority Priority() const = 0;
-
-    // Note that this may result in a possibly reentrant call to
-    // |ThrottleDelegate::OnThrottleUnblocked|, as well as the resumption
-    // of this or other requests, which may result in request completion
-    // and destruction before return.  Any caller of this function
-    // should not rely on this object or containing objects surviving
-    // this call.
-    //
-    // This call is a no-op if the priority is set to its current value.
-    virtual void SetPriority(RequestPriority priority) = 0;
-
-   protected:
-    Throttle() {}
-
-   private:
-    DISALLOW_COPY_AND_ASSIGN(Throttle);
-  };
-
-  virtual ~NetworkThrottleManager() {}
-
-  // Caller must ensure that |*delegate| outlives the returned
-  // Throttle.
-  virtual std::unique_ptr<Throttle> CreateThrottle(ThrottleDelegate* delegate,
-                                                   RequestPriority priority,
-                                                   bool ignore_limits) = 0;
-
- protected:
-  NetworkThrottleManager() {}
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(NetworkThrottleManager);
-};
-
-}  // namespace net
-
-#endif  // NET_BASE_NETWORK_THROTTLE_MANAGER_H_
diff --git a/net/base/network_throttle_manager_impl.cc b/net/base/network_throttle_manager_impl.cc
deleted file mode 100644
index 5e33729..0000000
--- a/net/base/network_throttle_manager_impl.cc
+++ /dev/null
@@ -1,326 +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 "net/base/network_throttle_manager_impl.h"
-
-#include "base/logging.h"
-#include "base/stl_util.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "base/time/default_tick_clock.h"
-
-namespace net {
-
-const size_t NetworkThrottleManagerImpl::kActiveRequestThrottlingLimit = 2;
-const int NetworkThrottleManagerImpl::kMedianLifetimeMultiple = 5;
-
-// Initial estimate based on the median in the
-// Net.RequestTime2.Success histogram, excluding cached results by eye.
-const int NetworkThrottleManagerImpl::kInitialMedianInMs = 400;
-
-// Set timers slightly further into the future than they need to be set, so
-// that the algorithm isn't vulnerable to timer round off errors triggering
-// the callback before the throttle would be considered aged out of the set.
-// Set to 17 to hanlde systems with |!base::TimeTicks::IsHighResolution()|.
-// Note that even if the timer goes off before it should, all that should cost
-// is a second task; this class does not rely on timer accuracy for its
-// correctness.
-const int kTimerFudgeInMs = 17;
-
-class NetworkThrottleManagerImpl::ThrottleImpl
-    : public NetworkThrottleManager::Throttle {
- public:
-  // Allowed state transitions are BLOCKED -> OUTSTANDING -> AGED.
-  // Throttles may be created in the BLOCKED or OUTSTANDING states.
-  enum class State {
-    // Not allowed to proceed by manager.
-    BLOCKED,
-
-    // Allowed to proceed, counts as an "outstanding" request for
-    // manager accounting purposes.
-    OUTSTANDING,
-
-    // Old enough to not count as "outstanding" anymore for
-    // manager accounting purposes.
-    AGED
-  };
-
-  using ThrottleListQueuePointer =
-      NetworkThrottleManagerImpl::ThrottleList::iterator;
-
-  // Caller must arrange that |*delegate| and |*manager| outlive
-  // the ThrottleImpl class.
-  ThrottleImpl(bool blocked,
-               RequestPriority priority,
-               ThrottleDelegate* delegate,
-               NetworkThrottleManagerImpl* manager,
-               ThrottleListQueuePointer queue_pointer);
-
-  ~ThrottleImpl() override;
-
-  // Throttle:
-  bool IsBlocked() const override;
-  RequestPriority Priority() const override;
-  void SetPriority(RequestPriority priority) override;
-
-  State state() const { return state_; }
-
-  ThrottleListQueuePointer queue_pointer() const { return queue_pointer_; }
-  void set_queue_pointer(const ThrottleListQueuePointer& pointer) {
-    if (state_ != State::AGED)
-      DCHECK_EQ(this, *pointer);
-    queue_pointer_ = pointer;
-  }
-
-  void set_start_time(base::TimeTicks start_time) { start_time_ = start_time; }
-  base::TimeTicks start_time() const { return start_time_; }
-
-  // Change the throttle's state to AGED.  The previous
-  // state must be OUTSTANDING.
-  void SetAged();
-
-  // Note that this call calls the delegate, and hence may result in
-  // re-entrant calls into the manager or ThrottleImpl.  The manager should
-  // not rely on any state other than its own existence being persistent
-  // across this call.
-  void NotifyUnblocked();
-
- private:
-  State state_;
-  RequestPriority priority_;
-  ThrottleDelegate* const delegate_;
-  NetworkThrottleManagerImpl* const manager_;
-
-  base::TimeTicks start_time_;
-
-  // To allow deletion from the blocked queue (when the throttle is in the
-  // blocked queue).
-  ThrottleListQueuePointer queue_pointer_;
-
-  DISALLOW_COPY_AND_ASSIGN(ThrottleImpl);
-};
-
-NetworkThrottleManagerImpl::ThrottleImpl::ThrottleImpl(
-    bool blocked,
-    RequestPriority priority,
-    NetworkThrottleManager::ThrottleDelegate* delegate,
-    NetworkThrottleManagerImpl* manager,
-    ThrottleListQueuePointer queue_pointer)
-    : state_(blocked ? State::BLOCKED : State::OUTSTANDING),
-      priority_(priority),
-      delegate_(delegate),
-      manager_(manager),
-      queue_pointer_(queue_pointer) {
-  DCHECK(delegate);
-  if (!blocked)
-    start_time_ = manager->tick_clock_->NowTicks();
-}
-
-NetworkThrottleManagerImpl::ThrottleImpl::~ThrottleImpl() {
-  manager_->OnThrottleDestroyed(this);
-}
-
-bool NetworkThrottleManagerImpl::ThrottleImpl::IsBlocked() const {
-  return state_ == State::BLOCKED;
-}
-
-RequestPriority NetworkThrottleManagerImpl::ThrottleImpl::Priority() const {
-  return priority_;
-}
-
-void NetworkThrottleManagerImpl::ThrottleImpl::SetPriority(
-    RequestPriority new_priority) {
-  RequestPriority old_priority(priority_);
-  if (old_priority == new_priority)
-    return;
-  priority_ = new_priority;
-  manager_->OnThrottlePriorityChanged(this, old_priority, new_priority);
-}
-
-void NetworkThrottleManagerImpl::ThrottleImpl::SetAged() {
-  DCHECK_EQ(State::OUTSTANDING, state_);
-  state_ = State::AGED;
-}
-
-void NetworkThrottleManagerImpl::ThrottleImpl::NotifyUnblocked() {
-  // This method should only be called once, and only if the
-  // current state is blocked.
-  DCHECK_EQ(State::BLOCKED, state_);
-  state_ = State::OUTSTANDING;
-  delegate_->OnThrottleUnblocked(this);
-}
-
-NetworkThrottleManagerImpl::NetworkThrottleManagerImpl()
-    : lifetime_median_estimate_(PercentileEstimator::kMedianPercentile,
-                                kInitialMedianInMs),
-      outstanding_recomputation_timer_(
-          std::make_unique<base::Timer>(false /* retain_user_task */,
-                                        false /* is_repeating */)),
-      tick_clock_(base::DefaultTickClock::GetInstance()),
-      weak_ptr_factory_(this) {}
-
-NetworkThrottleManagerImpl::~NetworkThrottleManagerImpl() = default;
-
-std::unique_ptr<NetworkThrottleManager::Throttle>
-NetworkThrottleManagerImpl::CreateThrottle(
-    NetworkThrottleManager::ThrottleDelegate* delegate,
-    RequestPriority priority,
-    bool ignore_limits) {
-  bool blocked =
-      (!ignore_limits && priority == THROTTLED &&
-       outstanding_throttles_.size() >= kActiveRequestThrottlingLimit);
-
-  std::unique_ptr<NetworkThrottleManagerImpl::ThrottleImpl> throttle(
-      new ThrottleImpl(blocked, priority, delegate, this,
-                       blocked_throttles_.end()));
-
-  ThrottleList& insert_list(blocked ? blocked_throttles_
-                                    : outstanding_throttles_);
-
-  throttle->set_queue_pointer(
-      insert_list.insert(insert_list.end(), throttle.get()));
-
-  // In case oustanding_throttles_ was empty, set up timer.
-  if (!blocked)
-    RecomputeOutstanding();
-
-  return std::move(throttle);
-}
-
-void NetworkThrottleManagerImpl::SetTickClockForTesting(
-    base::TickClock* tick_clock) {
-  tick_clock_ = tick_clock;
-  DCHECK(!outstanding_recomputation_timer_->IsRunning());
-  outstanding_recomputation_timer_ = std::make_unique<base::Timer>(
-      false /* retain_user_task */, false /* is_repeating */, tick_clock_);
-}
-
-bool NetworkThrottleManagerImpl::ConditionallyTriggerTimerForTesting() {
-  if (!outstanding_recomputation_timer_->IsRunning() ||
-      (tick_clock_->NowTicks() <
-       outstanding_recomputation_timer_->desired_run_time())) {
-    return false;
-  }
-
-  base::Closure timer_callback(outstanding_recomputation_timer_->user_task());
-  outstanding_recomputation_timer_->Stop();
-  timer_callback.Run();
-  return true;
-}
-
-void NetworkThrottleManagerImpl::OnThrottlePriorityChanged(
-    NetworkThrottleManagerImpl::ThrottleImpl* throttle,
-    RequestPriority old_priority,
-    RequestPriority new_priority) {
-  // The only case requiring a state change is if the priority change
-  // implies unblocking, which can only happen on a transition from blocked
-  // (implies THROTTLED) to non-THROTTLED.
-  if (throttle->IsBlocked() && new_priority != THROTTLED) {
-    // May result in re-entrant calls into this class.
-    UnblockThrottle(throttle);
-  }
-}
-
-void NetworkThrottleManagerImpl::OnThrottleDestroyed(ThrottleImpl* throttle) {
-  switch (throttle->state()) {
-    case ThrottleImpl::State::BLOCKED:
-      DCHECK(throttle->queue_pointer() != blocked_throttles_.end());
-      DCHECK_EQ(throttle, *(throttle->queue_pointer()));
-      blocked_throttles_.erase(throttle->queue_pointer());
-      break;
-    case ThrottleImpl::State::OUTSTANDING:
-      DCHECK(throttle->queue_pointer() != outstanding_throttles_.end());
-      DCHECK_EQ(throttle, *(throttle->queue_pointer()));
-      outstanding_throttles_.erase(throttle->queue_pointer());
-      FALLTHROUGH;
-    case ThrottleImpl::State::AGED:
-      DCHECK(!throttle->start_time().is_null());
-      lifetime_median_estimate_.AddSample(
-          (tick_clock_->NowTicks() - throttle->start_time())
-              .InMillisecondsRoundedUp());
-      break;
-  }
-
-  DCHECK(!base::ContainsValue(blocked_throttles_, throttle));
-  DCHECK(!base::ContainsValue(outstanding_throttles_, throttle));
-
-  // Unblock the throttles if there's some chance there's a throttle to
-  // unblock.
-  if (outstanding_throttles_.size() < kActiveRequestThrottlingLimit &&
-      !blocked_throttles_.empty()) {
-    // Via PostTask so there aren't upcalls from within destructors.
-    base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE,
-        base::Bind(&NetworkThrottleManagerImpl::MaybeUnblockThrottles,
-                   weak_ptr_factory_.GetWeakPtr()));
-  }
-}
-
-void NetworkThrottleManagerImpl::RecomputeOutstanding() {
-  // Remove all throttles that have aged out of the outstanding set.
-  base::TimeTicks now(tick_clock_->NowTicks());
-  base::TimeDelta age_horizon(base::TimeDelta::FromMilliseconds((
-      kMedianLifetimeMultiple * lifetime_median_estimate_.current_estimate())));
-  while (!outstanding_throttles_.empty()) {
-    ThrottleImpl* throttle = *outstanding_throttles_.begin();
-    if (throttle->start_time() + age_horizon >= now)
-      break;
-
-    outstanding_throttles_.erase(outstanding_throttles_.begin());
-    throttle->SetAged();
-    throttle->set_queue_pointer(outstanding_throttles_.end());
-  }
-
-  if (outstanding_throttles_.empty())
-    return;
-
-  // If the timer is already running, be conservative and leave it alone;
-  // the time for which it would be set will only be later than when it's
-  // currently set.
-  // This addresses, e.g., situations where a RecomputeOutstanding() races
-  // with a running timer which would unblock blocked throttles.
-  if (outstanding_recomputation_timer_->IsRunning())
-    return;
-
-  ThrottleImpl* first_throttle(*outstanding_throttles_.begin());
-  DCHECK_GE(first_throttle->start_time() + age_horizon, now);
-
-  outstanding_recomputation_timer_->Start(
-      FROM_HERE,
-      ((first_throttle->start_time() + age_horizon) - now +
-       base::TimeDelta::FromMilliseconds(kTimerFudgeInMs)),
-      // Unretained use of |this| is safe because the timer is
-      // owned by this object, and will be torn down if this object
-      // is destroyed.
-      base::Bind(&NetworkThrottleManagerImpl::MaybeUnblockThrottles,
-                 base::Unretained(this)));
-}
-
-void NetworkThrottleManagerImpl::UnblockThrottle(ThrottleImpl* throttle) {
-  DCHECK(throttle->IsBlocked());
-
-  blocked_throttles_.erase(throttle->queue_pointer());
-  throttle->set_start_time(tick_clock_->NowTicks());
-  throttle->set_queue_pointer(
-      outstanding_throttles_.insert(outstanding_throttles_.end(), throttle));
-
-  // Called in case |*throttle| was added to a null set.
-  RecomputeOutstanding();
-
-  // May result in re-entrant calls into this class.
-  throttle->NotifyUnblocked();
-}
-
-void NetworkThrottleManagerImpl::MaybeUnblockThrottles() {
-  RecomputeOutstanding();
-
-  while (outstanding_throttles_.size() < kActiveRequestThrottlingLimit &&
-         !blocked_throttles_.empty()) {
-    // NOTE: This call may result in reentrant calls into
-    // NetworkThrottleManagerImpl; no state should be assumed to be
-    // persistent across this call.
-    UnblockThrottle(blocked_throttles_.front());
-  }
-}
-
-}  // namespace net
diff --git a/net/base/network_throttle_manager_impl.h b/net/base/network_throttle_manager_impl.h
deleted file mode 100644
index 620da45..0000000
--- a/net/base/network_throttle_manager_impl.h
+++ /dev/null
@@ -1,152 +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 NET_BASE_NETWORK_THROTTLE_MANAGER_IMPL_H_
-#define NET_BASE_NETWORK_THROTTLE_MANAGER_IMPL_H_
-
-#include <list>
-#include <memory>
-#include <set>
-
-#include "base/memory/weak_ptr.h"
-#include "base/time/tick_clock.h"
-#include "base/time/time.h"
-#include "base/timer/timer.h"
-#include "net/base/network_throttle_manager.h"
-#include "net/base/percentile_estimator.h"
-
-namespace net {
-
-// The NetworkThrottleManagerImpl implements the following semantics:
-// * All throttles of priority above THROTTLED are created unblocked.
-// * Throttles of priority THROTTLED are created unblocked, unless
-//   there are |kActiveRequestThrottlingLimit| or more throttles active,
-//   in which case they are created blocked.
-//   When that condition is no longer true, throttles of priority
-//   THROTTLED are unblocked, in FIFO order.
-// * Throttles that have been alive for more than |kMedianLifetimeMultiple|
-//   times the current estimate of the throttle median lifetime do
-//   not count against the |kActiveRequestThrottlingLimit| limit.
-class NET_EXPORT NetworkThrottleManagerImpl : public NetworkThrottleManager {
- public:
-  // Maximum number of active requests before new THROTTLED throttles
-  // are created blocked.  Throttles are unblocked as the active requests
-  // fall below this limit.
-  static const size_t kActiveRequestThrottlingLimit;
-
-  // Note that the following constants are implementation details exposed in the
-  // header file only for testing, and should not be relied on by consumers.
-
-  // Constants used for the running estimate of the median lifetime
-  // for throttles created by this class.  That estimate is used to detect
-  // throttles that are "unusually old" and hence may represent hanging GETs
-  // or long-running streams.  Such throttles should not be considered
-  // "active" for the purposes of determining whether THROTTLED throttles
-  // should be created in a blocked state.
-  // Note that the precise details of this algorithm aren't very important;
-  // specifically, if it takes a while for the median estimate to reach the
-  // "actual" median of a request stream, the consequence is either a bit more
-  // of a delay in unblocking THROTTLED requests or more THROTTLED requests
-  // being unblocked than would be ideal (i.e. performance tweaks at
-  // the margins).
-
-  // Multiple of the current median lifetime beyond which a throttle is
-  // considered "unusually old" and not considered in counting active
-  // requests. This is used instead of a percentile estimate because the goal
-  // is eliminating requests that are qualitatively different
-  // (e.g. hanging gets, streams), and the percentage of all requests
-  // that are in that category can vary greatly.
-  static const int kMedianLifetimeMultiple;
-
-  // The median lifetime estimate starts at class creation at
-  // |kInitialMedianInMs|.
-  static const int kInitialMedianInMs;
-
-  NetworkThrottleManagerImpl();
-  ~NetworkThrottleManagerImpl() override;
-
-  // NetworkThrottleManager:
-  std::unique_ptr<Throttle> CreateThrottle(ThrottleDelegate* delegate,
-                                           RequestPriority priority,
-                                           bool ignore_limits) override;
-
-  void SetTickClockForTesting(base::TickClock* tick_clock);
-
-  // If the |NowTicks()| value of |tick_clock_| is greater than the
-  // time the outstanding_recomputation_timer_ has set to go off, Stop()
-  // the timer and manually run the associated user task.  This is to allow
-  // "fast-forwarding" of the clock for testing by working around
-  // base::Timer's direct use of base::TimeTicks rather than a base::TickClock.
-  //
-  // Note specifically that base::Timer::Start takes a time delta into the
-  // future and adds it to base::TimeTicks::Now() to get
-  // base::Timer::desired_run_time(), which is what this method compares
-  // |tick_clock_->NowTicks()| against.  So tests should be written so that
-  // the timer Start() routine whose callback should be run is called
-  // with |tick_clock_| in accord with wallclock time.  This routine can then
-  // be called with |tick_clock_| set into the future.
-  //
-  // Returns true if there was a timer running and it was triggerred
-  // (|tick_clock_->NowTicks() >
-  //   outstanding_recomputation_timer_.desired_run_time()|).
-  bool ConditionallyTriggerTimerForTesting();
-
- private:
-  class ThrottleImpl;
-  using ThrottleList = std::list<ThrottleImpl*>;
-
-  void OnThrottlePriorityChanged(ThrottleImpl* throttle,
-                                 RequestPriority old_priority,
-                                 RequestPriority new_priority);
-  void OnThrottleDestroyed(ThrottleImpl* throttle);
-
-  // Recompute how many requests count as outstanding (i.e.
-  // are not older than kMedianLifetimeMultiple * MedianThrottleLifetime()).
-  // If outstanding_recomputation_timer_ is not set, it will be set
-  // to the earliest a throttle might "age out" of the outstanding list.
-  void RecomputeOutstanding();
-
-  // Unblock the specified throttle.  May result in re-entrant calls
-  // into NetworkThrottleManagerImpl.
-  void UnblockThrottle(ThrottleImpl* throttle);
-
-  // Recomputes how many requests count as outstanding, checks to see
-  // if any currently blocked throttles should be unblocked,
-  // and unblock them if so.  Note that unblocking may result in
-  // re-entrant calls to this class, so no assumptions about state persistence
-  // should be made across this call.
-  void MaybeUnblockThrottles();
-
-  PercentileEstimator lifetime_median_estimate_;
-
-  // base::Timer controlling outstanding request recomputation.
-  //
-  // This is started whenever it is not running and a new throttle is
-  // added to |outstanding_throttles_|, and is never cleared except by
-  // execution, which re-starts it if there are any
-  // outstanding_throttles_.  So it should always be running if any
-  // throttles are outstanding.  This guarantees that the class will
-  // eventually detect aging out of outstanding throttles and unblock
-  // throttles blocked on those outstanding throttles.
-  std::unique_ptr<base::Timer> outstanding_recomputation_timer_;
-
-  // FIFO of OUTSTANDING throttles (ordered by time of entry into the
-  // OUTSTANDING state).
-  ThrottleList outstanding_throttles_;
-
-  // FIFO list of BLOCKED throttles.  This is a list so that the
-  // throttles can store iterators to themselves.
-  ThrottleList blocked_throttles_;
-
-  // For testing.
-  base::TickClock* tick_clock_;
-
-  base::WeakPtrFactory<NetworkThrottleManagerImpl> weak_ptr_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(NetworkThrottleManagerImpl);
-};
-
-}  // namespace net
-
-#endif  // NET_BASE_NETWORK_THROTTLE_MANAGER_IMPL_H_
diff --git a/net/base/network_throttle_manager_impl_unittest.cc b/net/base/network_throttle_manager_impl_unittest.cc
deleted file mode 100644
index 713b2680..0000000
--- a/net/base/network_throttle_manager_impl_unittest.cc
+++ /dev/null
@@ -1,564 +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 "net/base/network_throttle_manager_impl.h"
-
-#include <memory>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/callback_helpers.h"
-#include "base/run_loop.h"
-#include "base/test/simple_test_tick_clock.h"
-#include "base/test/test_message_loop.h"
-#include "net/base/request_priority.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace net {
-
-namespace {
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-const int kInitialAgeHorizonForUncountedRequests =
-    (NetworkThrottleManagerImpl::kInitialMedianInMs *
-     NetworkThrottleManagerImpl::kMedianLifetimeMultiple);
-
-// Must be greater than the corresponding fudge factor in
-// network_throttle_manager_impl.cc.
-const int kAgeHorizonFudgeFactor = 20;
-
-// Test fixture for throttle manager tests.
-
-// Note that the manager owned and managed by this fixture has a clock
-// that is set to base::TimeTicks::Now() (which value is also exposed
-// via an accessor) on creation but does not change without
-// intervention by tests (to make the tests more predictable).
-//
-// HOWEVER, also note that that manager uses the base::Timer class, which
-// uses the system clock, which isn't affected by the setting of the
-// test fixture clock.  So test should be written to a) avoid situations
-// in which the manager's timer will actually go off based on the system
-// clock, and b) call ConditionallyTriggerTimerForTesting() (which does
-// evaluate the manager's clock) when timer based tests are necessary.
-class NetworkThrottleManagerTest : public testing::Test,
-                                   NetworkThrottleManager::ThrottleDelegate {
- public:
-  NetworkThrottleManagerTest()
-      : now_(base::TimeTicks::Now()),
-        throttle_state_change_count_(0),
-        last_throttle_to_change_state_(nullptr),
-        throttle_manager_(new NetworkThrottleManagerImpl) {
-    clock_.SetNowTicks(now_);
-    throttle_manager_->SetTickClockForTesting(&clock_);
-  }
-
- protected:
-  enum ExpectedThrottleBlockState { BLOCKED, UNBLOCKED };
-
-  base::TimeTicks now() { return now_; }
-  NetworkThrottleManagerImpl* throttle_manager() {
-    return throttle_manager_.get();
-  }
-
-  // Set the offset of the test clock from now_.
-  void SetClockDelta(base::TimeDelta time_delta) {
-    clock_.SetNowTicks(now_ + time_delta);
-  }
-
-  // Throttle creation
-  std::unique_ptr<NetworkThrottleManager::Throttle> CreateThrottle(
-      net::RequestPriority priority,
-      ExpectedThrottleBlockState throttle_state) {
-    std::unique_ptr<NetworkThrottleManager::Throttle> throttle(
-        throttle_manager_->CreateThrottle(this, priority, false));
-    EXPECT_EQ(throttle_state == BLOCKED, throttle->IsBlocked());
-    return throttle;
-  }
-  std::unique_ptr<NetworkThrottleManager::Throttle>
-  CreateThrottleIgnoringLimits(net::RequestPriority priority) {
-    std::unique_ptr<NetworkThrottleManager::Throttle> throttle(
-        throttle_manager_->CreateThrottle(this, priority, true));
-    EXPECT_FALSE(throttle->IsBlocked());
-    return throttle;
-  }
-
-  // Throttle state change information.
-  int throttle_state_change_count() { return throttle_state_change_count_; }
-  NetworkThrottleManager::Throttle* last_throttle_to_change_state() {
-    return last_throttle_to_change_state_;
-  }
-
-  // Setting a callback to be invoked when a throttle's state changes.
-  void SetThrottleStateChangedCallback(const base::Closure& callback) {
-    throttle_state_changed_callback_ = callback;
-  }
-
- private:
-  // NetworkThrottleManager::Delegate
-  void OnThrottleUnblocked(
-      NetworkThrottleManager::Throttle* throttle) override {
-    ++throttle_state_change_count_;
-    last_throttle_to_change_state_ = throttle;
-    if (!throttle_state_changed_callback_.is_null())
-      base::ResetAndReturn(&throttle_state_changed_callback_).Run();
-  }
-
-  base::SimpleTestTickClock clock_;
-  base::TimeTicks now_;
-  int throttle_state_change_count_;
-  NetworkThrottleManager::Throttle* last_throttle_to_change_state_;
-  std::unique_ptr<NetworkThrottleManagerImpl> throttle_manager_;
-  base::Closure throttle_state_changed_callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(NetworkThrottleManagerTest);
-};
-
-// Check to confirm that all created throttles at priorities other than
-// THROTTLED start unblocked.
-TEST_F(NetworkThrottleManagerTest, AllUnthrottled) {
-  for (int i = MINIMUM_PRIORITY; i <= MAXIMUM_PRIORITY; ++i) {
-    if (i == THROTTLED)
-      continue;
-    CreateThrottle(static_cast<RequestPriority>(i), UNBLOCKED);
-  }
-}
-
-// Check for basic semantics around the new THROTTLED level.
-TEST_F(NetworkThrottleManagerTest, ThrottledBlocking) {
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle1(
-      CreateThrottle(THROTTLED, UNBLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle2(
-      CreateThrottle(THROTTLED, UNBLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle3(
-      CreateThrottle(THROTTLED, BLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle4(
-      CreateThrottle(THROTTLED, BLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle5(
-      CreateThrottle(THROTTLED, BLOCKED));
-
-  EXPECT_EQ(0, throttle_state_change_count());
-
-  throttle1.reset();
-  base::RunLoop().RunUntilIdle();  // Allow posttasks to run.
-  EXPECT_EQ(1, throttle_state_change_count());
-  EXPECT_EQ(throttle3.get(), last_throttle_to_change_state());
-
-  EXPECT_FALSE(throttle3->IsBlocked());
-  EXPECT_TRUE(throttle4->IsBlocked());
-  EXPECT_TRUE(throttle5->IsBlocked());
-
-  throttle2.reset();
-  base::RunLoop().RunUntilIdle();  // Allow posttasks to run.
-  EXPECT_EQ(2, throttle_state_change_count());
-  EXPECT_EQ(throttle4.get(), last_throttle_to_change_state());
-
-  EXPECT_FALSE(throttle3->IsBlocked());
-  EXPECT_FALSE(throttle4->IsBlocked());
-  EXPECT_TRUE(throttle5->IsBlocked());
-}
-
-// Check that THROTTLED semantics are dependent on all outstanding requests.
-TEST_F(NetworkThrottleManagerTest, ThrottledBlockingMultiPriority) {
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle1(
-      CreateThrottle(HIGHEST, UNBLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle2(
-      CreateThrottle(LOW, UNBLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle3(
-      CreateThrottle(IDLE, UNBLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle4(
-      CreateThrottle(THROTTLED, BLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle5(
-      CreateThrottle(THROTTLED, BLOCKED));
-
-  EXPECT_EQ(0, throttle_state_change_count());
-
-  throttle1.reset();
-  base::RunLoop().RunUntilIdle();  // Allow posttasks to run.
-  EXPECT_EQ(0, throttle_state_change_count());
-  EXPECT_FALSE(throttle3->IsBlocked());
-  EXPECT_TRUE(throttle4->IsBlocked());
-  EXPECT_TRUE(throttle5->IsBlocked());
-
-  throttle2.reset();
-  base::RunLoop().RunUntilIdle();  // Allow posttasks to run.
-  EXPECT_EQ(1, throttle_state_change_count());
-  EXPECT_EQ(throttle4.get(), last_throttle_to_change_state());
-
-  EXPECT_FALSE(throttle3->IsBlocked());
-  EXPECT_FALSE(throttle4->IsBlocked());
-  EXPECT_TRUE(throttle5->IsBlocked());
-
-  throttle3.reset();
-  base::RunLoop().RunUntilIdle();  // Allow posttasks to run.
-  EXPECT_EQ(2, throttle_state_change_count());
-  EXPECT_EQ(throttle5.get(), last_throttle_to_change_state());
-
-  EXPECT_FALSE(throttle4->IsBlocked());
-  EXPECT_FALSE(throttle5->IsBlocked());
-}
-
-// Check that a SetPriority() away from THROTTLED results in unblocking
-// and an upcall.
-TEST_F(NetworkThrottleManagerTest, ThrottledSetPriority) {
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle1(
-      CreateThrottle(THROTTLED, UNBLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle2(
-      CreateThrottle(THROTTLED, UNBLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle3(
-      CreateThrottle(THROTTLED, BLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle4(
-      CreateThrottle(THROTTLED, BLOCKED));
-
-  EXPECT_EQ(0, throttle_state_change_count());
-
-  throttle3->SetPriority(LOW);
-  EXPECT_EQ(1, throttle_state_change_count());
-  EXPECT_EQ(throttle3.get(), last_throttle_to_change_state());
-  EXPECT_FALSE(throttle3->IsBlocked());
-  EXPECT_TRUE(throttle4->IsBlocked());
-}
-
-void ResetThrottles(
-    bool* function_called,
-    std::vector<std::unique_ptr<NetworkThrottleManager::Throttle>> throttles) {
-  *function_called = true;
-  // All pointers in the vector should be deleted on exit.
-}
-
-// Check that tearing down all elements in the NTM on a SetPriority
-// upcall doesn't create any problems.
-TEST_F(NetworkThrottleManagerTest, ThrottleTeardown) {
-  std::vector<std::unique_ptr<NetworkThrottleManager::Throttle>> throttles;
-
-  throttles.push_back(CreateThrottle(THROTTLED, UNBLOCKED));
-  throttles.push_back(CreateThrottle(THROTTLED, UNBLOCKED));
-
-  // Note that if there is more than one throttle blocked, then the
-  // number of throttle state changes is dependent on destruction order.
-  // So only one blocked throttle is created.
-  auto throttle_temporary = CreateThrottle(THROTTLED, BLOCKED);
-  NetworkThrottleManager::Throttle* throttle3 = throttle_temporary.get();
-  throttles.push_back(std::move(throttle_temporary));
-
-  bool callback_called(false);
-  SetThrottleStateChangedCallback(
-      base::Bind(&ResetThrottles, &callback_called, base::Passed(&throttles)));
-
-  EXPECT_EQ(0, throttle_state_change_count());
-
-  throttle3->SetPriority(LOW);
-
-  // If the test is functioning as expected, throttle3 now points to
-  // a deleted object and can no longer be indirected through.
-
-  EXPECT_TRUE(callback_called);
-  EXPECT_EQ(1, throttle_state_change_count());
-  EXPECT_EQ(throttle3, last_throttle_to_change_state());
-}
-
-// Note that this routine is dependent on priority setting *not* resulting in
-// destruction of any throttle and should only be used in tests where that is
-// true.
-void SetAllToPriority(
-    RequestPriority priority,
-    std::vector<NetworkThrottleManager::Throttle*> throttles) {
-  for (size_t i = 0; i < throttles.size(); ++i)
-    throttles[i]->SetPriority(priority);
-}
-
-// Check that modifying all the priorities of the allocated throttles in
-// the callback works properly.
-TEST_F(NetworkThrottleManagerTest, ThrottlePriorityReset) {
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle1(
-      CreateThrottle(THROTTLED, UNBLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle2(
-      CreateThrottle(THROTTLED, UNBLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle3(
-      CreateThrottle(THROTTLED, BLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle4(
-      CreateThrottle(THROTTLED, BLOCKED));
-
-  std::vector<NetworkThrottleManager::Throttle*> throttles;
-  throttles.push_back(throttle1.get());
-  throttles.push_back(throttle2.get());
-  throttles.push_back(throttle3.get());
-
-  SetThrottleStateChangedCallback(
-      base::Bind(&SetAllToPriority, MEDIUM, base::Passed(&throttles)));
-
-  EXPECT_EQ(0, throttle_state_change_count());
-  throttle3->SetPriority(HIGHEST);
-
-  // Expected result: throttles 1-3 @ medium priority (the callback should
-  // have overridden the priority setting above), only throttle 4 blocked
-  // (throttle3 should have been unblocked by either of the priority changes),
-  // and one state changes (the unblocking).
-  EXPECT_EQ(MEDIUM, throttle1->Priority());
-  EXPECT_EQ(MEDIUM, throttle2->Priority());
-  EXPECT_EQ(MEDIUM, throttle3->Priority());
-  EXPECT_EQ(THROTTLED, throttle4->Priority());
-  EXPECT_FALSE(throttle1->IsBlocked());
-  EXPECT_FALSE(throttle2->IsBlocked());
-  EXPECT_FALSE(throttle3->IsBlocked());
-  EXPECT_TRUE(throttle4->IsBlocked());
-  EXPECT_EQ(1, throttle_state_change_count());
-}
-
-// Check that modifying the priority of a request from a non-THROTTLED
-// value to THROTTLED causes no change in behavior.
-TEST_F(NetworkThrottleManagerTest, ThrottlePriorityResetToThrottled) {
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle1(
-      CreateThrottle(THROTTLED, UNBLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle2(
-      CreateThrottle(THROTTLED, UNBLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle3(
-      CreateThrottle(LOW, UNBLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle4(
-      CreateThrottle(THROTTLED, BLOCKED));
-
-  EXPECT_EQ(0, throttle_state_change_count());
-  throttle3->SetPriority(THROTTLED);
-  EXPECT_EQ(0, throttle_state_change_count());
-
-  EXPECT_FALSE(throttle1->IsBlocked());
-  EXPECT_FALSE(throttle2->IsBlocked());
-  EXPECT_FALSE(throttle3->IsBlocked());
-  EXPECT_TRUE(throttle4->IsBlocked());
-
-  EXPECT_EQ(THROTTLED, throttle1->Priority());
-  EXPECT_EQ(THROTTLED, throttle2->Priority());
-  EXPECT_EQ(THROTTLED, throttle3->Priority());
-  EXPECT_EQ(THROTTLED, throttle4->Priority());
-}
-
-// Confirm that old requests don't count against the limit.
-TEST_F(NetworkThrottleManagerTest, DontCountAgedRequests) {
-  const int age_in_days_of_old_throttles = 4;
-
-  // Confirm default median and timing means that 4 days is long enough ago
-  // to be aged out.
-  EXPECT_GT(age_in_days_of_old_throttles * 24 * 60 * 60 * 1000,
-            kInitialAgeHorizonForUncountedRequests);
-
-  SetClockDelta(-base::TimeDelta::FromDays(age_in_days_of_old_throttles));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle1(
-      CreateThrottle(IDLE, UNBLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle2(
-      CreateThrottle(IDLE, UNBLOCKED));
-
-  SetClockDelta(base::TimeDelta());
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle3(
-      CreateThrottle(LOW, UNBLOCKED));
-
-  // First throttled request should not be blocked.
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle4(
-      CreateThrottle(THROTTLED, UNBLOCKED));
-
-  // Second should be.
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle5(
-      CreateThrottle(THROTTLED, BLOCKED));
-
-  // Destroying the old requests should not result in any upcalls.
-  EXPECT_EQ(0, throttle_state_change_count());
-  throttle1.reset();
-  base::RunLoop().RunUntilIdle();  // Allow posttasks to run.
-  EXPECT_EQ(0, throttle_state_change_count());
-  throttle2.reset();
-  base::RunLoop().RunUntilIdle();  // Allow posttasks to run.
-  EXPECT_EQ(0, throttle_state_change_count());
-
-  // But destroying a new request should result in a state change.
-  throttle3.reset();
-  base::RunLoop().RunUntilIdle();  // Allow posttasks to run.
-  EXPECT_EQ(1, throttle_state_change_count());
-  EXPECT_EQ(throttle5.get(), last_throttle_to_change_state());
-}
-
-// Confirm that a slew of throttles of a specific age will shift the
-// median for determining "aged requests" to that age.
-TEST_F(NetworkThrottleManagerTest, ShiftMedian) {
-  // Setup two throttles of age *just short* of aging out; confirm
-  // they result in blocked THROTTLED requests.
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle1(
-      CreateThrottle(IDLE, UNBLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle2(
-      CreateThrottle(IDLE, UNBLOCKED));
-  SetClockDelta(base::TimeDelta::FromMilliseconds(
-      kInitialAgeHorizonForUncountedRequests - 1));
-  EXPECT_FALSE(throttle_manager()->ConditionallyTriggerTimerForTesting());
-
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle3(
-      CreateThrottle(THROTTLED, BLOCKED));
-
-  throttle1.reset();
-  throttle2.reset();
-  throttle3.reset();
-  base::RunLoop().RunUntilIdle();  // Allow posttasks to run.
-
-  // Create 100 throttles and destroy them, effectively with lifetime zero.
-  // This should substantially decrease the median age estimate.
-  SetClockDelta(base::TimeDelta());
-  for (int i = 0; i < 100; ++i) {
-    std::unique_ptr<NetworkThrottleManager::Throttle> tmp(
-        CreateThrottle(IDLE, UNBLOCKED));
-  }
-
-  // Clear out any possible leftover timer by setting the clock to a point
-  // in the future at which it will definitely go off, and triggering it.
-  SetClockDelta(base::TimeDelta::FromMilliseconds(
-      2 * kInitialAgeHorizonForUncountedRequests + kAgeHorizonFudgeFactor));
-  throttle_manager()->ConditionallyTriggerTimerForTesting();
-
-  // The identical test above should no longer result in blocked throttles.
-  SetClockDelta(base::TimeDelta());
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle5(
-      CreateThrottle(IDLE, UNBLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle6(
-      CreateThrottle(IDLE, UNBLOCKED));
-  SetClockDelta(base::TimeDelta::FromMilliseconds(
-      kInitialAgeHorizonForUncountedRequests - 1));
-  EXPECT_TRUE(throttle_manager()->ConditionallyTriggerTimerForTesting());
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle7(
-      CreateThrottle(THROTTLED, UNBLOCKED));
-}
-
-// Confirm that just "aging out" requests will result in unblocking
-// blocked requests.
-TEST_F(NetworkThrottleManagerTest, AgeInvalidThrottles) {
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle1(
-      CreateThrottle(IDLE, UNBLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle2(
-      CreateThrottle(IDLE, UNBLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle3(
-      CreateThrottle(THROTTLED, BLOCKED));
-
-  EXPECT_EQ(0, throttle_state_change_count());
-  SetClockDelta(base::TimeDelta::FromMilliseconds(
-      kInitialAgeHorizonForUncountedRequests + kAgeHorizonFudgeFactor));
-  EXPECT_TRUE(throttle_manager()->ConditionallyTriggerTimerForTesting());
-  EXPECT_EQ(1, throttle_state_change_count());
-  EXPECT_EQ(throttle3.get(), last_throttle_to_change_state());
-  EXPECT_FALSE(throttle3->IsBlocked());
-}
-
-// Confirm that if throttles are unblocked and made active by all
-// existing outstanding throttles aging out, they will also eventually
-// age out and let new throttles through.
-TEST_F(NetworkThrottleManagerTest, NewlyUnblockedThrottlesAlsoAge) {
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle1(
-      CreateThrottle(IDLE, UNBLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle2(
-      CreateThrottle(IDLE, UNBLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle3(
-      CreateThrottle(THROTTLED, BLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle4(
-      CreateThrottle(THROTTLED, BLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle5(
-      CreateThrottle(THROTTLED, BLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle6(
-      CreateThrottle(THROTTLED, BLOCKED));
-
-  // Age the first two throttles out of the outstanding, which should
-  // result in the next two throttles becoming unblocked (and in the
-  // oustanding list).  (The internal implementation will zero out
-  // the outstanding queue and then add in the two new unblocked throttles.)
-  EXPECT_EQ(0, throttle_state_change_count());
-  SetClockDelta(base::TimeDelta::FromMilliseconds(
-      kInitialAgeHorizonForUncountedRequests + kAgeHorizonFudgeFactor));
-  EXPECT_TRUE(throttle_manager()->ConditionallyTriggerTimerForTesting());
-  EXPECT_EQ(2, throttle_state_change_count());
-  EXPECT_FALSE(throttle3->IsBlocked());
-  EXPECT_FALSE(throttle4->IsBlocked());
-
-  // Age the next two throttles out of the outstanding queue, which
-  // should result in the next two throttles becoming unblocked (and
-  // in the oustanding list).  This will only happen if a timer was properly
-  // set in the above age process as the oustanding queue went through
-  // the empty state.
-  SetClockDelta(base::TimeDelta::FromMilliseconds(
-      2 * (kInitialAgeHorizonForUncountedRequests + kAgeHorizonFudgeFactor)));
-  EXPECT_TRUE(throttle_manager()->ConditionallyTriggerTimerForTesting());
-  EXPECT_EQ(4, throttle_state_change_count());
-  EXPECT_FALSE(throttle5->IsBlocked());
-  EXPECT_FALSE(throttle6->IsBlocked());
-}
-
-// Confirm that throttles that are blocked for a while and then
-// unblocked don't "age out".
-TEST_F(NetworkThrottleManagerTest, AgeBlockedThrottles) {
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle1(
-      CreateThrottle(IDLE, UNBLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle2(
-      CreateThrottle(IDLE, UNBLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle3(
-      CreateThrottle(THROTTLED, BLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle4(
-      CreateThrottle(THROTTLED, BLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle5(
-      CreateThrottle(THROTTLED, BLOCKED));
-
-  EXPECT_EQ(0, throttle_state_change_count());
-  SetClockDelta(base::TimeDelta::FromMilliseconds(
-      kInitialAgeHorizonForUncountedRequests + kAgeHorizonFudgeFactor));
-  EXPECT_TRUE(throttle_manager()->ConditionallyTriggerTimerForTesting());
-
-  // If blocked throttles aged out, all three throttles should have been
-  // unblocked.  If not, only the two replacing the IDLE throttles should
-  // have.
-  EXPECT_EQ(2, throttle_state_change_count());
-}
-
-// Confirm that deleting old throttles before they age out doesn't
-// interfere with the aging out of more recent throttles.
-TEST_F(NetworkThrottleManagerTest, DeletionAgingInterference) {
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle1(
-      CreateThrottle(IDLE, UNBLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle2(
-      CreateThrottle(IDLE, UNBLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle3(
-      CreateThrottle(THROTTLED, BLOCKED));
-  EXPECT_EQ(0, throttle_state_change_count());
-
-  SetClockDelta(base::TimeDelta::FromMilliseconds(
-      kInitialAgeHorizonForUncountedRequests / 2));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle4(
-      CreateThrottle(IDLE, UNBLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle5(
-      CreateThrottle(IDLE, UNBLOCKED));
-  EXPECT_FALSE(throttle_manager()->ConditionallyTriggerTimerForTesting());
-  EXPECT_EQ(0, throttle_state_change_count());
-
-  throttle1.reset();
-  throttle2.reset();
-  EXPECT_FALSE(throttle_manager()->ConditionallyTriggerTimerForTesting());
-  EXPECT_EQ(0, throttle_state_change_count());
-
-  SetClockDelta(base::TimeDelta::FromMilliseconds(
-      (3 * kInitialAgeHorizonForUncountedRequests / 2 +
-       2 * kAgeHorizonFudgeFactor)));
-  EXPECT_TRUE(throttle_manager()->ConditionallyTriggerTimerForTesting());
-  EXPECT_EQ(1, throttle_state_change_count());
-  EXPECT_EQ(throttle3.get(), last_throttle_to_change_state());
-  EXPECT_FALSE(throttle3->IsBlocked());
-}
-
-// Confirm that "ignore_limits" boolean is respected.
-TEST_F(NetworkThrottleManagerTest, IgnoreLimits) {
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle1(
-      CreateThrottle(HIGHEST, UNBLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle2(
-      CreateThrottle(LOW, UNBLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle3(
-      CreateThrottle(IDLE, UNBLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle4(
-      CreateThrottle(THROTTLED, BLOCKED));
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle5(
-      CreateThrottleIgnoringLimits(THROTTLED));
-}
-
-}  // namespace
-
-}  // namespace net
diff --git a/net/base/percentile_estimator.cc b/net/base/percentile_estimator.cc
deleted file mode 100644
index 216d6e6..0000000
--- a/net/base/percentile_estimator.cc
+++ /dev/null
@@ -1,100 +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 "percentile_estimator.h"
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/rand_util.h"
-
-namespace {
-
-// Random number wrapper to allow substitutions for testing.
-int GenerateRand0To99() {
-  return base::RandInt(0, 99);
-}
-
-}  // namespace
-
-namespace net {
-
-// The algorithm used for percentile estimation is "Algorithm 3" from
-// https://arxiv.org/pdf/1407.1121v1.pdf.  There are several parts to the
-// algorithm:
-// * The estimate is conditionally moved towards the sample by a step amount.
-//   This means that if the samples are clustered around a value the estimates
-//   will converge to that sample.
-// * The percentile requested (e.g. 90%l) is handled by the conditional move.
-//   If the estimate is accurate, there is a chance equal to the percentile
-//   value that a sample will be lower than it, and a chance equal to
-//   1-percentile that it will be higher.  So the code balances those
-//   probabilities by increasing the estimate in the percentile fraction
-//   of the cases where the sample is over the estimate, and decreases the
-//   estimate in (1-percentile) fraction of the cases where the sample is under
-//   the estimate.
-//   E.g. in the case of the 90%l estimation, the estimate would
-//   move up in 90% of the cases in which the sample was above the
-//   estimate (which would be 10% of the total samples, presuming the
-//   estimate was accurate), and it would move down in 10% of the cases
-//   in which the sample was below the estimate.
-// * Every time the estimate moves in the same direction, the step
-//   amount is increased by one, and every time the estimate reverses
-//   direction, the step amount is decreased (to 1, if greater than 1,
-//   by one, if zero or negative).  The effective step amount is
-//   Max(step, 1).
-// * If the estimate
-//   would be moved beyond the sample causing its move, it is moved to
-//   be equal to the same (and the step amount set to the distance to
-//   the sample).  See the paper for further details.
-
-PercentileEstimator::PercentileEstimator(int percentile, int initial_estimate)
-    : percentile_(percentile),
-      sign_positive_(true),
-      current_estimate_(initial_estimate),
-      current_step_(1),
-      generator_callback_(base::Bind(&GenerateRand0To99)) {}
-
-PercentileEstimator::~PercentileEstimator() = default;
-
-void PercentileEstimator::AddSample(int sample) {
-  int rand100 = generator_callback_.Run();
-  if (sample > current_estimate_ && rand100 > 1 - percentile_) {
-    current_step_ += sign_positive_ ? 1 : -1;
-    current_estimate_ += (current_step_ > 0) ? current_step_ : 1;
-
-    // Clamp movement to distance to sample.
-    if (current_estimate_ > sample) {
-      current_step_ -= current_estimate_ - sample;
-      current_estimate_ = sample;
-    }
-
-    // If we've reversed direction, reset the step down.
-    if (!sign_positive_ && current_step_ > 1)
-      current_step_ = 1;
-
-    sign_positive_ = true;
-  } else if (sample < current_estimate_ && rand100 > percentile_) {
-    current_step_ += !sign_positive_ ? 1 : -1;
-    current_estimate_ -= (current_step_ > 0) ? current_step_ : 1;
-
-    // Clamp movement to distance to sample.
-    if (current_estimate_ < sample) {
-      current_step_ -= sample - current_estimate_;
-      current_estimate_ = sample;
-    }
-
-    // If we've reversed direction, reset the step down.
-    if (sign_positive_ && current_step_ > 1)
-      current_step_ = 1;
-
-    sign_positive_ = false;
-  }
-}
-
-void PercentileEstimator::SetRandomNumberGeneratorForTesting(
-    RandomNumberCallback generator_callback) {
-  generator_callback_ = generator_callback;
-}
-
-}  // namespace net
diff --git a/net/base/percentile_estimator.h b/net/base/percentile_estimator.h
deleted file mode 100644
index 0ff7b81..0000000
--- a/net/base/percentile_estimator.h
+++ /dev/null
@@ -1,59 +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 NET_BASE_PERCENTILE_ESTIMATOR_H_
-#define NET_BASE_PERCENTILE_ESTIMATOR_H_
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "net/base/net_export.h"
-
-namespace net {
-
-// This class estimates statistical percentiles (e.g. 10%l, 50%l) for
-// integer distributions presented in stream form.  These estimates
-// adjust automatically when the stream distribution changes.
-// TODO(rdsmith): Expand the class to maintain floating point
-// estimates rather than integer estimates, when there's a use case
-// for that that deserves the extra complexity and pitfalls of
-// floating point arithmetic.
-class NET_EXPORT PercentileEstimator {
- public:
-  using RandomNumberCallback = base::Callback<int(void)>;
-
-  static const int kMedianPercentile = 50;
-
-  // |percentile| is a number between 0 and 100 indicating what percentile
-  // should be estimated (e.g. 50 would be a median estimate).
-  // |initial_estimate| is the value the class is seeded with; in other
-  // words, if AddSample() is never called,
-  // |CurrentEstimate() == initial_estimate|.
-  PercentileEstimator(int percentile, int initial_estimate);
-
-  ~PercentileEstimator();
-
-  int current_estimate() const { return current_estimate_; }
-  void AddSample(int sample);
-
-  // Specify a callback that will generate a "random" number
-  // in the range [0,99] on each call.  Used so that tests can
-  // rely on reproducible behavior.
-  void SetRandomNumberGeneratorForTesting(
-      RandomNumberCallback generator_callback);
-
- private:
-  const int percentile_;
-
-  bool sign_positive_;
-  int current_estimate_;
-  int current_step_;
-
-  RandomNumberCallback generator_callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(PercentileEstimator);
-};
-
-}  // namespace net
-
-#endif  // NET_BASE_PERCENTILE_ESTIMATOR_H_
diff --git a/net/base/percentile_estimator_unittest.cc b/net/base/percentile_estimator_unittest.cc
deleted file mode 100644
index 71d9c1d..0000000
--- a/net/base/percentile_estimator_unittest.cc
+++ /dev/null
@@ -1,242 +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 "net/base/percentile_estimator.h"
-
-#include "base/bind.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-// A number to turn sawtooth ramps from 0->100 into something that looks more
-// random to the algorithm.
-const int kPrimeMultipleToRandomizeRamps = 71;
-
-// Random numbers (fixed here for repeatability of tests).  Generated originally
-// by using python's random module with randrange(0,100).
-int random_numbers[] = {
-    83, 11, 33, 98, 49, 54, 83, 19, 93, 37, 98, 39, 59, 13, 51, 39, 69, 18, 17,
-    17, 6,  85, 95, 51, 83, 39, 18, 82, 88, 47, 69, 27, 20, 82, 86, 38, 98, 65,
-    53, 13, 71, 66, 29, 40, 70, 28, 64, 35, 47, 50, 84, 90, 36, 54, 15, 93, 98,
-    51, 82, 50, 17, 46, 12, 18, 26, 39, 95, 61, 52, 63, 97, 92, 12, 71, 7,  15,
-    74, 10, 64, 57, 25, 82, 95, 40, 76, 8,  28, 83, 58, 1,  22, 58, 17, 33, 61,
-    94, 40, 50, 84, 47, 81, 9,  79, 16, 45, 78, 15, 3,  97, 60, 70, 25, 11, 11,
-    68, 64, 61, 84, 52, 64, 54, 72, 24, 46, 48, 4,  46, 34, 10, 97, 2,  42, 13,
-    9,  95, 75, 11, 99, 92, 33, 65, 48, 19, 72, 63, 39, 0,  10, 83, 62, 12, 99,
-    67, 98, 99, 83, 40, 45, 34, 80, 13, 94, 22, 74, 8,  11, 11, 98, 35, 86, 80,
-    94, 87, 60, 16, 46, 9,  25, 75, 50, 54, 23, 31, 63, 9,  50, 5,  18, 87, 16,
-    47, 72, 24, 93, 14, 1,  26, 41, 50, 49, 41, 77, 54, 48, 50, 3,  50, 16, 54,
-    97, 57, 63, 83, 33, 65, 90, 48, 55, 44, 11, 71, 6,  86, 29, 46, 61, 20, 8,
-    88, 3,  70, 76, 84, 59, 36, 50, 77, 63, 10, 55, 32, 82, 58, 19, 97, 8,  73,
-    47, 55, 74, 46, 52, 62, 19, 65, 75, 57, 23, 98, 39, 63, 19, 75, 48, 93, 58,
-    29, 96, 57, 31, 17, 33, 8,  69, 89, 90, 17, 79, 59, 67, 34, 20, 44, 80, 71,
-    79, 24, 63, 13, 27, 28, 61, 38, 67, 82, 46, 9,  4,  69, 41, 49, 49, 10, 3,
-    93, 46, 57, 96, 78, 51, 45, 37, 0,  6,  99, 93, 87, 18, 72, 83, 95, 39, 54,
-    84, 12, 47, 14, 55, 15, 27, 95, 6,  13, 80, 40, 8,  39, 18, 15, 52, 31, 66,
-    59, 67, 90, 12, 61, 77, 66, 61, 33, 89, 47, 40, 86, 34, 98, 13, 76, 30, 43,
-    56, 57, 88, 34, 48, 67, 6,  29, 92, 38, 11, 23, 74, 45, 38, 35, 94, 15, 72,
-    65, 20, 94, 72, 97, 78, 61, 79, 75, 0,  45, 38, 32, 94, 3,  5,  67, 91, 34,
-    37, 12, 11, 15, 75, 14, 73, 34, 55, 78, 64, 52, 29, 60, 62, 16, 51, 44, 78,
-    0,  15, 41, 5,  52, 4,  68, 53, 39, 39, 68, 71, 66, 68, 97, 65, 55, 39, 94,
-    57, 43, 81, 67, 22, 30, 64, 37, 42, 35, 60, 61, 2,  51, 49, 43, 82, 61, 70,
-    63, 47, 57, 8,  55, 96, 68, 7,  46, 69, 8,  43, 18, 9,  25, 8,  97, 98, 83,
-    79, 19, 92, 54, 90, 72, 80, 92, 94, 26, 48, 94, 74, 32, 29, 44, 34, 55, 56,
-    97, 40, 86, 35, 64, 25, 85, 13, 57, 2,  29, 77, 19, 94, 46, 85, 15, 71, 81,
-    25, 45, 2,  1,  62, 77, 28, 95, 72, 72, 28, 3,  36, 76, 81, 56, 52, 27, 62,
-    8,  5,  62, 1,  43, 68, 40, 68, 22, 65, 30, 50, 36, 89, 5,  71, 68, 99, 53,
-    22, 26, 0,  1,  72, 76, 79, 50, 2,  32, 39, 40, 6,  99, 60, 59, 55, 28, 17,
-    12, 94, 51, 3,  4,  71, 36, 88, 26, 99, 25, 13, 80, 53, 4,  57, 55, 44, 26,
-    82, 4,  53, 34, 47, 16, 97, 56, 30, 0,  73, 85, 59, 86, 24, 70, 73, 53, 68,
-    15, 91, 90, 74, 39, 61, 32, 98, 14, 82, 99, 31, 7,  99, 34, 6,  3,  30, 57,
-    44, 58, 86, 37, 12, 63, 82, 78, 94, 4,  93, 89, 92, 59, 40, 94, 88, 97, 95,
-    5,  88, 40, 80, 79, 0,  2,  46, 86, 46, 75, 87, 86, 8,  23, 35, 62, 79, 66,
-    16, 16, 45, 11, 78, 76, 40, 73, 85, 28, 44, 33, 34, 22, 11, 62, 8,  35, 88,
-    92, 35, 53, 50, 51, 54, 75, 41, 21, 83, 57, 82, 80, 84, 65, 19, 11, 85, 41,
-    80, 86, 62, 34, 54, 54, 79, 81, 52, 87, 54, 54, 43, 17, 44, 63, 54, 14, 88,
-    84, 86, 73, 58, 44, 2,  70, 86, 80, 94, 13, 85, 78, 6,  44, 11, 11, 97, 67,
-    65, 28, 42, 40, 84, 92, 66, 85, 75, 29, 84, 82, 54, 50, 26, 12, 83, 57, 90,
-    9,  40, 69, 38, 70, 65, 76, 85, 76, 4,  30, 86, 43, 79, 77, 69, 53, 35, 12,
-    98, 7,  47, 12, 63, 10, 81, 39, 88, 12, 16, 88, 22, 72, 25, 41, 22, 34, 87,
-    68, 51, 86, 45, 27, 51, 80, 69, 89, 64, 89, 68, 61, 80, 6,  83, 47, 18, 86,
-    73, 16, 61, 89, 47, 5,  33, 59, 47, 75, 15, 60, 28, 18, 59, 65, 51, 13, 28,
-    26, 84, 89, 80, 51, 15, 92, 36, 89, 83, 28, 56, 65, 25, 44, 84, 70, 26, 10,
-    74, 91, 55, 85, 73, 25, 24, 64, 11, 1,  55, 32, 45, 74, 4,  55, 98, 42, 91,
-    88, 18, 79, 37, 15, 5,  98, 63, 65, 77, 66, 18, 99, 1,  78, 96, 15, 16, 16,
-    51, 11, 47, 58, 1,  12, 46, 5,  56, 34, 40, 36, 20, 4,  89, 59, 4,  13, 3,
-    8,  74, 41, 21, 64, 88, 97, 42, 14, 29, 38, 53, 65, 55, 67, 33, 69, 17, 79,
-    45, 2,  63, 2,  97, 47, 73, 22, 86, 32, 31, 95, 90, 84, 25, 86, 91, 77, 1,
-    5,  6,  22, 91, 3,  94, 52, 2,  95, 17, 1,  19, 22, 34, 49, 96, 88, 63, 26,
-    5,  25, 75, 23, 25, 80, 21, 83, 86, 81, 11, 70, 67, 11, 95, 81, 57, 63, 8,
-    43, 60, 40, 42, 67, 50, 2,  51, 43, 34, 7,  1,  90, 59, 74, 87, 23, 23, 71,
-    20, 89, 2,  75, 21, 91, 32, 87, 67, 98, 99, 22, 31, 59, 50, 64, 55, 22, 84,
-    9,  31, 31, 84, 36, 92, 60, 37, 85, 18, 12, 38, 55, 55, 93, 36, 9,  46, 48,
-    24, 91, 60, 95, 55, 73, 63, 27, 55, 96, 79, 50, 41, 5,  67, 85, 99, 95, 3,
-    97, 28, 27, 78, 38, 11, 77, 11, 64, 25, 22, 88, 34, 86, 30, 78, 95, 17, 9,
-    29, 58, 35, 22, 99, 28, 66, 35, 60, 10, 7,  51, 64, 86, 30, 27, 97, 63, 0,
-    36, 87, 52, 16, 5,  90, 8,  66, 58, 91, 85, 3,  95, 31, 73, 87, 30, 78, 46,
-    30, 75, 36, 44, 52, 76, 24, 58, 8,  70, 58, 95, 88, 0,  35, 86, 21, 96, 90,
-    54, 85, 56, 30, 37, 30, 62, 56, 63, 91, 25, 56, 20, 56, 23, 12, 8,  70, 56,
-    83, 49, 70, 67, 61, 95, 50, 41, 88, 37, 89, 37, 21, 63, 25, 46, 16, 75, 73,
-    86, 39, 4,  55, 41, 39, 45, 31, 97, 6,  81, 68, 38, 49, 80, 9,  87, 22, 37,
-    41, 28, 47, 74, 76, 34, 72, 65, 34, 41, 59, 42, 73, 32, 75, 25, 18, 26, 71,
-    93, 92, 12, 76, 93, 84, 44, 43, 4,  9,  3,  90, 91, 45, 0,  10, 43, 45, 65,
-    34, 82, 54, 1,  78, 36, 74, 58, 3,  26, 89, 21, 57, 42, 37, 12, 90, 97, 48,
-    27, 75, 40, 69, 61, 56, 44, 75, 77, 55, 31, 0,  77, 12, 23, 16, 98, 77, 8,
-    96, 92, 91, 26, 50, 42, 65, 38, 58, 41, 45, 69, 42, 37, 89, 92, 40, 74, 68,
-    86, 80, 49, 16, 48, 74, 50, 92, 54, 6,  82, 21, 35, 57, 81, 29, 10, 60, 74,
-    41, 70, 18, 65, 44, 77, 64, 8,  87, 90, 24, 52, 67, 58, 56, 89, 47, 15, 20,
-    4,  87, 72, 87, 13, 79, 3,  26, 43, 52, 72, 83, 17, 99, 29, 10, 61, 62, 42,
-    35, 47, 42, 40, 17, 71, 54, 30, 99, 64, 78, 70, 75, 38, 32, 51, 2,  49, 47,
-    0,  41, 50, 41, 64, 57, 78, 22, 17, 94, 24, 65, 84, 38, 75, 3,  58, 18, 51,
-    91, 72, 91, 55, 6,  70, 76, 73, 30, 54, 73, 77, 45, 85, 88, 58, 25, 80, 35,
-    99, 57, 73, 15, 55, 71, 44, 44, 79, 20, 63, 29, 14, 51, 10, 46, 80, 36, 47,
-    80, 53, 15, 64, 42, 59, 94, 55, 99, 28, 76, 80, 51, 4,  98, 98, 38, 59, 71,
-    9,  93, 91, 46, 74, 63, 10, 39, 1,  43, 11, 64, 39, 59, 54, 9,  44, 78, 52,
-    98, 9,  73, 24, 15, 40, 5,  55, 23, 83, 67, 10, 58, 45, 64, 41, 92, 85, 72,
-    18, 67, 65, 30, 56, 84, 63, 96, 51, 55, 19, 70, 48, 81, 2,  37, 85, 77};
-
-class PercentileEstimatorTest : public testing::Test {
- public:
-  PercentileEstimatorTest() : index_(0) {}
-
-  // Create a new estimator with the given parameters.
-  void SetUpEstimator(int percentile, int initial_estimate) {
-    estimator_.reset(
-        new net::PercentileEstimator(percentile, initial_estimate));
-    estimator_->SetRandomNumberGeneratorForTesting(
-        base::Bind(&PercentileEstimatorTest::GetRandomNumber,
-                   // Safe since |estimator_| is owned by and
-                   // will not survive destruction of |this|.
-                   base::Unretained(this)));
-  }
-
-  int CurrentEstimate() { return estimator_->current_estimate(); }
-  void AddSample(int sample) { estimator_->AddSample(sample); }
-
-  // Add the sample until there's a change in the estimate, then return the
-  // new estimate.  To get around the randomness of whether samples are
-  // incorporated or not.
-  int AddSampleUntilRegistered(int sample) {
-    int old_estimate = estimator_->current_estimate();
-    while (old_estimate == estimator_->current_estimate())
-      estimator_->AddSample(sample);
-
-    return estimator_->current_estimate();
-  }
-
-  int GetRandomNumber() {
-    int result = random_numbers[index_];
-    ++index_;
-    if (static_cast<unsigned long>(index_) >=
-        sizeof(random_numbers) / sizeof(int)) {
-      index_ = 0;
-    }
-    return result;
-  }
-
- private:
-  int index_;
-  std::unique_ptr<net::PercentileEstimator> estimator_;
-
-  DISALLOW_COPY_AND_ASSIGN(PercentileEstimatorTest);
-};
-
-// Converges upwards fairly quickly.
-TEST_F(PercentileEstimatorTest, MedianConvergesUpwards) {
-  SetUpEstimator(50, 100);
-
-  for (int i = 0; i < 40; ++i)
-    AddSample(150);
-
-  EXPECT_EQ(150, CurrentEstimate());
-}
-
-// Converges downwards fairly quickly.
-TEST_F(PercentileEstimatorTest, MedianConvergesDownwards) {
-  SetUpEstimator(50, 100);
-
-  for (int i = 0; i < 40; ++i)
-    AddSample(50);
-
-  EXPECT_EQ(50, CurrentEstimate());
-}
-
-// Stable if the value is bouncing around.
-TEST_F(PercentileEstimatorTest, BounceStable) {
-  SetUpEstimator(50, 100);
-
-  for (int i = 0; i < 20; ++i)
-    AddSample(50 + (i % 2) * 100);
-
-  EXPECT_LE(97, CurrentEstimate());
-  EXPECT_LE(CurrentEstimate(), 103);
-}
-
-// Correctly converges to a 90%l value upwards.
-TEST_F(PercentileEstimatorTest, NinetythConvergesUpwards) {
-  SetUpEstimator(90, 50);
-
-  for (int i = 0; i < 10000; ++i)
-    AddSample((i * kPrimeMultipleToRandomizeRamps) % 100);
-
-  EXPECT_LE(86, CurrentEstimate());
-  EXPECT_LE(CurrentEstimate(), 94);
-}
-
-// Correctly converges to a 90%l value downwards.
-TEST_F(PercentileEstimatorTest, NinetythConvergesDownwards) {
-  SetUpEstimator(90, 150);
-
-  for (int i = 0; i < 1000; ++i)
-    AddSample((i * kPrimeMultipleToRandomizeRamps) % 100);
-
-  EXPECT_LT(86, CurrentEstimate());
-  EXPECT_LT(CurrentEstimate(), 94);
-}
-
-// Doesn't overshoot sample heading upwards.
-TEST_F(PercentileEstimatorTest, NoUpwardsOvershoot) {
-  SetUpEstimator(50, 100);
-
-  // Crank up the step size
-  for (int i = 0; i < 20; ++i)
-    AddSample(1000);
-
-  // Derive the step size.
-  int e1 = CurrentEstimate();
-  int e2 = AddSampleUntilRegistered(1000);
-  int step_size = e2 - e1;
-  ASSERT_GT(step_size, 1);
-
-  // Increment by less than the current step size.
-  int new_sample = e2 + step_size / 2;
-  AddSampleUntilRegistered(new_sample);
-  EXPECT_EQ(new_sample, CurrentEstimate());
-  AddSampleUntilRegistered(1000);
-  EXPECT_GT(new_sample + step_size, CurrentEstimate());
-}
-
-// Doesn't overshoot sample heading downwards
-TEST_F(PercentileEstimatorTest, NoDownwardsOvershoot) {
-  SetUpEstimator(50, 1000);
-
-  // Crank up the step size
-  for (int i = 0; i < 20; ++i)
-    AddSample(100);
-
-  // Derive the step size.
-  int e1 = CurrentEstimate();
-  int e2 = AddSampleUntilRegistered(100);
-  int step_size = e1 - e2;
-  ASSERT_GT(step_size, 1);
-
-  // Increment by less than the current step size.
-  int new_sample = e2 - step_size / 2;
-  AddSampleUntilRegistered(new_sample);
-  EXPECT_EQ(new_sample, CurrentEstimate());
-  AddSampleUntilRegistered(100);
-  EXPECT_LT(new_sample - step_size, CurrentEstimate());
-}
-
-}  // namespace
diff --git a/net/disk_cache/backend_unittest.cc b/net/disk_cache/backend_unittest.cc
index 2feb502..bb4c3e13d0 100644
--- a/net/disk_cache/backend_unittest.cc
+++ b/net/disk_cache/backend_unittest.cc
@@ -4311,3 +4311,36 @@
   histogram_tester.ExpectBucketCount("SimpleCache.FileDescriptorLimiterAction",
                                      disk_cache::FD_LIMIT_FAIL_REOPEN_FILE, 0);
 }
+
+TEST_F(DiskCacheBackendTest, SparseEvict) {
+  const int kMaxSize = 512;
+
+  SetMaxSize(kMaxSize);
+  InitCache();
+
+  scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(64));
+  CacheTestFillBuffer(buffer->data(), 64, false);
+
+  disk_cache::Entry* entry0 = nullptr;
+  ASSERT_THAT(CreateEntry("http://www.0.com/", &entry0), IsOk());
+
+  disk_cache::Entry* entry1 = nullptr;
+  ASSERT_THAT(CreateEntry("http://www.1.com/", &entry1), IsOk());
+
+  disk_cache::Entry* entry2 = nullptr;
+  // This strange looking domain name affects cache trim order
+  // due to hashing
+  ASSERT_THAT(CreateEntry("http://www.15360.com/", &entry2), IsOk());
+
+  // Write sparse data to put us over the eviction threshold
+  ASSERT_EQ(64, WriteSparseData(entry0, 0, buffer.get(), 64));
+  ASSERT_EQ(1, WriteSparseData(entry0, 67108923, buffer.get(), 1));
+  ASSERT_EQ(1, WriteSparseData(entry1, 53, buffer.get(), 1));
+  ASSERT_EQ(1, WriteSparseData(entry2, 0, buffer.get(), 1));
+
+  // Closing these in a special order should not lead to buggy reentrant
+  // eviction.
+  entry1->Close();
+  entry2->Close();
+  entry0->Close();
+}
diff --git a/net/disk_cache/blockfile/backend_impl.cc b/net/disk_cache/blockfile/backend_impl.cc
index ec1f955..601f46a 100644
--- a/net/disk_cache/blockfile/backend_impl.cc
+++ b/net/disk_cache/blockfile/backend_impl.cc
@@ -168,6 +168,7 @@
       new_eviction_(false),
       first_timer_(true),
       user_load_(false),
+      consider_evicting_at_op_end_(false),
       net_log_(net_log),
       done_(base::WaitableEvent::ResetPolicy::MANUAL,
             base::WaitableEvent::InitialState::NOT_SIGNALED),
@@ -195,6 +196,7 @@
       new_eviction_(false),
       first_timer_(true),
       user_load_(false),
+      consider_evicting_at_op_end_(false),
       net_log_(net_log),
       done_(base::WaitableEvent::ResetPolicy::MANUAL,
             base::WaitableEvent::InitialState::NOT_SIGNALED),
@@ -913,9 +915,16 @@
 
 void BackendImpl::OnEntryDestroyEnd() {
   DecreaseNumRefs();
-  if (data_->header.num_bytes > max_size_ && !read_only_ &&
-      (up_ticks_ > kTrimDelay || user_flags_ & kNoRandom))
-    eviction_.TrimCache(false);
+  consider_evicting_at_op_end_ = true;
+}
+
+void BackendImpl::OnSyncBackendOpComplete() {
+  if (consider_evicting_at_op_end_) {
+    if (data_->header.num_bytes > max_size_ && !read_only_ &&
+        (up_ticks_ > kTrimDelay || user_flags_ & kNoRandom))
+      eviction_.TrimCache(false);
+    consider_evicting_at_op_end_ = false;
+  }
 }
 
 EntryImpl* BackendImpl::GetOpenEntry(CacheRankingsBlock* rankings) const {
diff --git a/net/disk_cache/blockfile/backend_impl.h b/net/disk_cache/blockfile/backend_impl.h
index 324f4f8..26b4ab27 100644
--- a/net/disk_cache/blockfile/backend_impl.h
+++ b/net/disk_cache/blockfile/backend_impl.h
@@ -89,6 +89,9 @@
   void SyncEndEnumeration(std::unique_ptr<Rankings::Iterator> iterator);
   void SyncOnExternalCacheHit(const std::string& key);
 
+  // Called at end of any backend operation on the background thread.
+  void OnSyncBackendOpComplete();
+
   // Open or create an entry for the given |key| or |iter|.
   scoped_refptr<EntryImpl> OpenEntryImpl(const std::string& key);
   scoped_refptr<EntryImpl> CreateEntryImpl(const std::string& key);
@@ -418,6 +421,9 @@
   bool first_timer_;  // True if the timer has not been called.
   bool user_load_;  // True if we see a high load coming from the caller.
 
+  // True if we should consider doing eviction at end of current operation.
+  bool consider_evicting_at_op_end_;
+
   net::NetLog* net_log_;
 
   Stats stats_;  // Usage statistics.
diff --git a/net/disk_cache/blockfile/in_flight_backend_io.cc b/net/disk_cache/blockfile/in_flight_backend_io.cc
index 2ea9b81..fc203781 100644
--- a/net/disk_cache/blockfile/in_flight_backend_io.cc
+++ b/net/disk_cache/blockfile/in_flight_backend_io.cc
@@ -310,6 +310,7 @@
   }
   DCHECK_NE(net::ERR_IO_PENDING, result_);
   NotifyController();
+  backend_->OnSyncBackendOpComplete();
 }
 
 // Runs on the background thread.
diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc
index c733e8a..960daf08 100644
--- a/net/http/http_network_session.cc
+++ b/net/http/http_network_session.cc
@@ -20,7 +20,6 @@
 #include "base/trace_event/memory_dump_request_args.h"
 #include "base/trace_event/process_memory_dump.h"
 #include "base/values.h"
-#include "net/base/network_throttle_manager_impl.h"
 #include "net/http/http_auth_handler_factory.h"
 #include "net/http/http_response_body_drainer.h"
 #include "net/http/http_stream_factory_impl.h"
@@ -235,7 +234,6 @@
                          AddDefaultHttp2Settings(params.http2_settings),
                          params.time_func),
       http_stream_factory_(std::make_unique<HttpStreamFactoryImpl>(this)),
-      network_stream_throttler_(std::make_unique<NetworkThrottleManagerImpl>()),
       params_(params),
       context_(context) {
   DCHECK(proxy_resolution_service_);
diff --git a/net/http/http_network_session.h b/net/http/http_network_session.h
index 5500de3..a2fd2ee 100644
--- a/net/http/http_network_session.h
+++ b/net/http/http_network_session.h
@@ -57,7 +57,6 @@
 class HttpServerProperties;
 class NetLog;
 class NetworkQualityProvider;
-class NetworkThrottleManager;
 class ProxyDelegate;
 class ProxyResolutionService;
 class QuicClock;
@@ -296,9 +295,6 @@
   HttpStreamFactory* http_stream_factory() {
     return http_stream_factory_.get();
   }
-  NetworkThrottleManager* throttler() {
-    return network_stream_throttler_.get();
-  }
   NetLog* net_log() {
     return net_log_;
   }
@@ -376,8 +372,6 @@
   std::unique_ptr<HttpStreamFactory> http_stream_factory_;
   std::map<HttpResponseBodyDrainer*, std::unique_ptr<HttpResponseBodyDrainer>>
       response_drainers_;
-  std::unique_ptr<NetworkThrottleManager> network_stream_throttler_;
-
   NextProtoVector next_protos_;
 
   Params params_;
diff --git a/net/http/http_network_session_peer.cc b/net/http/http_network_session_peer.cc
index e44be7fe..bfcc592 100644
--- a/net/http/http_network_session_peer.cc
+++ b/net/http/http_network_session_peer.cc
@@ -4,7 +4,6 @@
 
 #include "net/http/http_network_session_peer.h"
 
-#include "net/base/network_throttle_manager.h"
 #include "net/http/http_proxy_client_socket_pool.h"
 #include "net/proxy_resolution/proxy_resolution_service.h"
 #include "net/socket/client_socket_pool_manager.h"
@@ -29,11 +28,6 @@
   session_->http_stream_factory_.swap(http_stream_factory);
 }
 
-void HttpNetworkSessionPeer::SetNetworkStreamThrottler(
-    std::unique_ptr<NetworkThrottleManager> network_throttle_manager) {
-  session_->network_stream_throttler_.swap(network_throttle_manager);
-}
-
 HttpNetworkSession::Params* HttpNetworkSessionPeer::params() {
   return &(session_->params_);
 }
diff --git a/net/http/http_network_session_peer.h b/net/http/http_network_session_peer.h
index bb0d0c7d..b173f5de 100644
--- a/net/http/http_network_session_peer.h
+++ b/net/http/http_network_session_peer.h
@@ -16,7 +16,6 @@
 
 class ClientSocketPoolManager;
 class HttpStreamFactory;
-class NetworkThrottleManager;
 
 class NET_EXPORT_PRIVATE HttpNetworkSessionPeer {
  public:
@@ -30,9 +29,6 @@
   void SetHttpStreamFactory(
       std::unique_ptr<HttpStreamFactory> http_stream_factory);
 
-  void SetNetworkStreamThrottler(
-      std::unique_ptr<NetworkThrottleManager> network_throttle_manager);
-
   HttpNetworkSession::Params* params();
 
  private:
diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc
index dd3dba8..299fe75 100644
--- a/net/http/http_network_transaction.cc
+++ b/net/http/http_network_transaction.cc
@@ -157,7 +157,7 @@
   if (request_->load_flags & LOAD_PREFETCH)
     response_.unused_since_prefetch = true;
 
-  next_state_ = STATE_THROTTLE;
+  next_state_ = STATE_NOTIFY_BEFORE_CREATE_STREAM;
   int rv = DoLoop(OK);
   if (rv == ERR_IO_PENDING)
     callback_ = callback;
@@ -389,8 +389,6 @@
   // TODO(wtc): Define a new LoadState value for the
   // STATE_INIT_CONNECTION_COMPLETE state, which delays the HTTP request.
   switch (next_state_) {
-    case STATE_THROTTLE_COMPLETE:
-      return LOAD_STATE_THROTTLED;
     case STATE_CREATE_STREAM:
       return LOAD_STATE_WAITING_FOR_DELEGATE;
     case STATE_CREATE_STREAM_COMPLETE:
@@ -442,23 +440,11 @@
 void HttpNetworkTransaction::SetPriority(RequestPriority priority) {
   priority_ = priority;
 
-  // TODO(rdsmith): Note that if any code indirectly executed by
-  // |stream_request_->SetPriority()| or |stream_->SetPriority()|
-  // ever implements a throttling mechanism where changing a request's
-  // priority may cause a this or another request to synchronously succeed
-  // or fail, that callback could synchronously delete |*this|, causing
-  // a crash on return to this code.
-  //
-  // |throttle_->SetPriority()| has exactly the above attributes, which
-  // is why it's the last call in this function.
-
   if (stream_request_)
     stream_request_->SetPriority(priority);
   if (stream_)
     stream_->SetPriority(priority);
 
-  if (throttle_)
-    throttle_->SetPriority(priority);
   // The above call may have resulted in deleting |*this|.
 }
 
@@ -640,18 +626,6 @@
   *out = connection_attempts_;
 }
 
-void HttpNetworkTransaction::OnThrottleUnblocked(
-    NetworkThrottleManager::Throttle* throttle) {
-  // TODO(rdsmith): This DCHECK is dependent on the only transition
-  // being from blocked->unblocked.  That is true right now, but may not
-  // be so in the future.
-  DCHECK_EQ(STATE_THROTTLE_COMPLETE, next_state_);
-
-  net_log_.EndEvent(NetLogEventType::HTTP_TRANSACTION_THROTTLED);
-
-  DoLoop(OK);
-}
-
 bool HttpNetworkTransaction::IsSecureRequest() const {
   return request_->url.SchemeIsCryptographic();
 }
@@ -720,14 +694,6 @@
     State state = next_state_;
     next_state_ = STATE_NONE;
     switch (state) {
-      case STATE_THROTTLE:
-        DCHECK_EQ(OK, rv);
-        rv = DoThrottle();
-        break;
-      case STATE_THROTTLE_COMPLETE:
-        DCHECK_EQ(OK, rv);
-        rv = DoThrottleComplete();
-        break;
       case STATE_NOTIFY_BEFORE_CREATE_STREAM:
         DCHECK_EQ(OK, rv);
         rv = DoNotifyBeforeCreateStream();
@@ -843,29 +809,6 @@
   return rv;
 }
 
-int HttpNetworkTransaction::DoThrottle() {
-  DCHECK(!throttle_);
-  throttle_ = session_->throttler()->CreateThrottle(
-      this, priority_, (request_->load_flags & LOAD_IGNORE_LIMITS) != 0);
-  next_state_ = STATE_THROTTLE_COMPLETE;
-
-  if (throttle_->IsBlocked()) {
-    net_log_.BeginEvent(NetLogEventType::HTTP_TRANSACTION_THROTTLED);
-    return ERR_IO_PENDING;
-  }
-
-  return OK;
-}
-
-int HttpNetworkTransaction::DoThrottleComplete() {
-  DCHECK(throttle_);
-  DCHECK(!throttle_->IsBlocked());
-
-  next_state_ = STATE_NOTIFY_BEFORE_CREATE_STREAM;
-
-  return OK;
-}
-
 int HttpNetworkTransaction::DoNotifyBeforeCreateStream() {
   next_state_ = STATE_CREATE_STREAM;
   bool defer = false;
diff --git a/net/http/http_network_transaction.h b/net/http/http_network_transaction.h
index b6021b71..f80aedfa 100644
--- a/net/http/http_network_transaction.h
+++ b/net/http/http_network_transaction.h
@@ -17,7 +17,6 @@
 #include "crypto/ec_private_key.h"
 #include "net/base/net_error_details.h"
 #include "net/base/net_export.h"
-#include "net/base/network_throttle_manager.h"
 #include "net/base/request_priority.h"
 #include "net/http/http_auth.h"
 #include "net/http/http_request_headers.h"
@@ -49,8 +48,7 @@
 
 class NET_EXPORT_PRIVATE HttpNetworkTransaction
     : public HttpTransaction,
-      public HttpStreamRequest::Delegate,
-      public NetworkThrottleManager::ThrottleDelegate {
+      public HttpStreamRequest::Delegate {
  public:
   HttpNetworkTransaction(RequestPriority priority,
                          HttpNetworkSession* session);
@@ -127,9 +125,6 @@
   void OnQuicBroken() override;
   void GetConnectionAttempts(ConnectionAttempts* out) const override;
 
-  // NetworkThrottleManager::Delegate methods:
-  void OnThrottleUnblocked(NetworkThrottleManager::Throttle* throttle) override;
-
  private:
   FRIEND_TEST_ALL_PREFIXES(HttpNetworkTransactionTest, ResetStateForRestart);
   FRIEND_TEST_ALL_PREFIXES(SpdyNetworkTransactionTest, WindowUpdateReceived);
@@ -142,8 +137,6 @@
                            FlowControlNegativeSendWindowSize);
 
   enum State {
-    STATE_THROTTLE,
-    STATE_THROTTLE_COMPLETE,
     STATE_NOTIFY_BEFORE_CREATE_STREAM,
     STATE_CREATE_STREAM,
     STATE_CREATE_STREAM_COMPLETE,
@@ -190,8 +183,6 @@
   // argument receive the result from the previous state.  If a method returns
   // ERR_IO_PENDING, then the result from OnIOComplete will be passed to the
   // next state method as the result arg.
-  int DoThrottle();
-  int DoThrottleComplete();
   int DoNotifyBeforeCreateStream();
   int DoCreateStream();
   int DoCreateStreamComplete(int result);
@@ -412,10 +403,6 @@
   // Network error details for this transaction.
   NetErrorDetails net_error_details_;
 
-  // Communicate lifetime of transaction to the throttler, and
-  // throttled state to the transaction.
-  std::unique_ptr<NetworkThrottleManager::Throttle> throttle_;
-
   // Number of retries made for network errors like ERR_SPDY_PING_FAILED,
   // ERR_SPDY_SERVER_REFUSED_STREAM, ERR_QUIC_HANDSHAKE_FAILED and
   // ERR_QUIC_PROTOCOL_ERROR. Currently we stop after 3 tries
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc
index e7e1cd3..960990d 100644
--- a/net/http/http_network_transaction_unittest.cc
+++ b/net/http/http_network_transaction_unittest.cc
@@ -37,7 +37,6 @@
 #include "net/base/load_timing_info.h"
 #include "net/base/load_timing_info_test_util.h"
 #include "net/base/net_errors.h"
-#include "net/base/network_throttle_manager.h"
 #include "net/base/proxy_delegate.h"
 #include "net/base/proxy_server.h"
 #include "net/base/request_priority.h"
@@ -122,105 +121,6 @@
 
 namespace {
 
-class TestNetworkStreamThrottler : public NetworkThrottleManager {
- public:
-  TestNetworkStreamThrottler()
-      : throttle_new_requests_(false),
-        num_set_priority_calls_(0),
-        last_priority_set_(IDLE) {}
-
-  ~TestNetworkStreamThrottler() override {
-    EXPECT_TRUE(outstanding_throttles_.empty());
-  }
-
-  // NetworkThrottleManager
-  std::unique_ptr<Throttle> CreateThrottle(ThrottleDelegate* delegate,
-                                           RequestPriority priority,
-                                           bool ignore_limits) override {
-    auto test_throttle =
-        std::make_unique<TestThrottle>(throttle_new_requests_, delegate, this);
-    outstanding_throttles_.insert(test_throttle.get());
-    return std::move(test_throttle);
-  }
-
-  void UnthrottleAllRequests() {
-    std::set<TestThrottle*> outstanding_throttles_copy(outstanding_throttles_);
-    for (auto* throttle : outstanding_throttles_copy) {
-      if (throttle->IsBlocked())
-        throttle->Unthrottle();
-    }
-  }
-
-  void set_throttle_new_requests(bool throttle_new_requests) {
-    throttle_new_requests_ = throttle_new_requests;
-  }
-
-  // Includes both throttled and unthrottled throttles.
-  size_t num_outstanding_requests() const {
-    return outstanding_throttles_.size();
-  }
-
-  int num_set_priority_calls() const { return num_set_priority_calls_; }
-  RequestPriority last_priority_set() const { return last_priority_set_; }
-  void set_priority_change_closure(
-      const base::Closure& priority_change_closure) {
-    priority_change_closure_ = priority_change_closure;
-  }
-
- private:
-  class TestThrottle : public NetworkThrottleManager::Throttle {
-   public:
-    ~TestThrottle() override { throttler_->OnThrottleDestroyed(this); }
-
-    // Throttle
-    bool IsBlocked() const override { return throttled_; }
-    RequestPriority Priority() const override {
-      NOTREACHED();
-      return IDLE;
-    }
-    void SetPriority(RequestPriority priority) override {
-      throttler_->SetPriorityCalled(priority);
-    }
-
-    TestThrottle(bool throttled,
-                 ThrottleDelegate* delegate,
-                 TestNetworkStreamThrottler* throttler)
-        : throttled_(throttled), delegate_(delegate), throttler_(throttler) {}
-
-    void Unthrottle() {
-      EXPECT_TRUE(throttled_);
-
-      throttled_ = false;
-      delegate_->OnThrottleUnblocked(this);
-    }
-
-    bool throttled_;
-    ThrottleDelegate* delegate_;
-    TestNetworkStreamThrottler* throttler_;
-  };
-
-  void OnThrottleDestroyed(TestThrottle* throttle) {
-    EXPECT_NE(0u, outstanding_throttles_.count(throttle));
-    outstanding_throttles_.erase(throttle);
-  }
-
-  void SetPriorityCalled(RequestPriority priority) {
-    ++num_set_priority_calls_;
-    last_priority_set_ = priority;
-    if (!priority_change_closure_.is_null())
-      priority_change_closure_.Run();
-  }
-
-  // Includes both throttled and unthrottled throttles.
-  std::set<TestThrottle*> outstanding_throttles_;
-  bool throttle_new_requests_;
-  int num_set_priority_calls_;
-  RequestPriority last_priority_set_;
-  base::Closure priority_change_closure_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestNetworkStreamThrottler);
-};
-
 const base::string16 kBar(ASCIIToUTF16("bar"));
 const base::string16 kBar2(ASCIIToUTF16("bar2"));
 const base::string16 kBar3(ASCIIToUTF16("bar3"));
@@ -360,23 +260,6 @@
   return SpdySessionDependencies::SpdyCreateSession(session_deps);
 }
 
-// Note that the pointer written into |*throttler| will only be valid
-// for the lifetime of the returned HttpNetworkSession.
-std::unique_ptr<HttpNetworkSession> CreateSessionWithThrottler(
-    SpdySessionDependencies* session_deps,
-    TestNetworkStreamThrottler** throttler) {
-  std::unique_ptr<HttpNetworkSession> session(
-      SpdySessionDependencies::SpdyCreateSession(session_deps));
-
-  auto owned_throttler = std::make_unique<TestNetworkStreamThrottler>();
-  *throttler = owned_throttler.get();
-
-  HttpNetworkSessionPeer peer(session.get());
-  peer.SetNetworkStreamThrottler(std::move(owned_throttler));
-
-  return session;
-}
-
 class FailingProxyResolverFactory : public ProxyResolverFactory {
  public:
   FailingProxyResolverFactory() : ProxyResolverFactory(false) {}
@@ -17607,306 +17490,6 @@
             trans.GetTotalReceivedBytes());
 }
 
-// Confirm that transactions whose throttle is created in (and stays in)
-// the unthrottled state are not blocked.
-TEST_F(HttpNetworkTransactionTest, ThrottlingUnthrottled) {
-  TestNetworkStreamThrottler* throttler(nullptr);
-  std::unique_ptr<HttpNetworkSession> session(
-      CreateSessionWithThrottler(&session_deps_, &throttler));
-
-  // Send a simple request and make sure it goes through.
-  HttpRequestInfo request;
-  request.method = "GET";
-  request.url = GURL("http://www.example.org/");
-  request.traffic_annotation =
-      net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
-
-  auto trans =
-      std::make_unique<HttpNetworkTransaction>(DEFAULT_PRIORITY, session.get());
-
-  MockWrite data_writes[] = {
-      MockWrite("GET / HTTP/1.1\r\n"
-                "Host: www.example.org\r\n"
-                "Connection: keep-alive\r\n\r\n"),
-  };
-  MockRead data_reads[] = {
-      MockRead("HTTP/1.0 200 OK\r\n\r\n"), MockRead("hello world"),
-      MockRead(SYNCHRONOUS, OK),
-  };
-  StaticSocketDataProvider reads(data_reads, arraysize(data_reads), data_writes,
-                                 arraysize(data_writes));
-  session_deps_.socket_factory->AddSocketDataProvider(&reads);
-
-  TestCompletionCallback callback;
-  trans->Start(&request, callback.callback(), NetLogWithSource());
-  EXPECT_EQ(OK, callback.WaitForResult());
-}
-
-// Confirm requests can be blocked by a throttler, and are resumed
-// when the throttle is unblocked.
-TEST_F(HttpNetworkTransactionTest, ThrottlingBasic) {
-  TestNetworkStreamThrottler* throttler(nullptr);
-  std::unique_ptr<HttpNetworkSession> session(
-      CreateSessionWithThrottler(&session_deps_, &throttler));
-
-  // Send a simple request and make sure it goes through.
-  HttpRequestInfo request;
-  request.method = "GET";
-  request.url = GURL("http://www.example.org/");
-  request.traffic_annotation =
-      net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
-
-  MockWrite data_writes[] = {
-      MockWrite("GET / HTTP/1.1\r\n"
-                "Host: www.example.org\r\n"
-                "Connection: keep-alive\r\n\r\n"),
-  };
-  MockRead data_reads[] = {
-      MockRead("HTTP/1.0 200 OK\r\n\r\n"), MockRead("hello world"),
-      MockRead(SYNCHRONOUS, OK),
-  };
-  StaticSocketDataProvider reads(data_reads, arraysize(data_reads), data_writes,
-                                 arraysize(data_writes));
-  session_deps_.socket_factory->AddSocketDataProvider(&reads);
-
-  // Start a request that will be throttled at start; confirm it
-  // doesn't complete.
-  throttler->set_throttle_new_requests(true);
-  auto trans =
-      std::make_unique<HttpNetworkTransaction>(DEFAULT_PRIORITY, session.get());
-
-  TestCompletionCallback callback;
-  int rv = trans->Start(&request, callback.callback(), NetLogWithSource());
-  EXPECT_EQ(ERR_IO_PENDING, rv);
-
-  base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(LOAD_STATE_THROTTLED, trans->GetLoadState());
-  EXPECT_FALSE(callback.have_result());
-
-  // Confirm the request goes on to complete when unthrottled.
-  throttler->UnthrottleAllRequests();
-  base::RunLoop().RunUntilIdle();
-  ASSERT_TRUE(callback.have_result());
-  EXPECT_EQ(OK, callback.WaitForResult());
-}
-
-// Destroy a request while it's throttled.
-TEST_F(HttpNetworkTransactionTest, ThrottlingDestruction) {
-  TestNetworkStreamThrottler* throttler(nullptr);
-  std::unique_ptr<HttpNetworkSession> session(
-      CreateSessionWithThrottler(&session_deps_, &throttler));
-
-  // Send a simple request and make sure it goes through.
-  HttpRequestInfo request;
-  request.method = "GET";
-  request.url = GURL("http://www.example.org/");
-  request.traffic_annotation =
-      net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
-
-  MockWrite data_writes[] = {
-      MockWrite("GET / HTTP/1.1\r\n"
-                "Host: www.example.org\r\n"
-                "Connection: keep-alive\r\n\r\n"),
-  };
-  MockRead data_reads[] = {
-      MockRead("HTTP/1.0 200 OK\r\n\r\n"), MockRead("hello world"),
-      MockRead(SYNCHRONOUS, OK),
-  };
-  StaticSocketDataProvider reads(data_reads, arraysize(data_reads), data_writes,
-                                 arraysize(data_writes));
-  session_deps_.socket_factory->AddSocketDataProvider(&reads);
-
-  // Start a request that will be throttled at start; confirm it
-  // doesn't complete.
-  throttler->set_throttle_new_requests(true);
-  auto trans =
-      std::make_unique<HttpNetworkTransaction>(DEFAULT_PRIORITY, session.get());
-
-  TestCompletionCallback callback;
-  int rv = trans->Start(&request, callback.callback(), NetLogWithSource());
-  EXPECT_EQ(ERR_IO_PENDING, rv);
-
-  base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(LOAD_STATE_THROTTLED, trans->GetLoadState());
-  EXPECT_FALSE(callback.have_result());
-
-  EXPECT_EQ(1u, throttler->num_outstanding_requests());
-  trans.reset();
-  EXPECT_EQ(0u, throttler->num_outstanding_requests());
-}
-
-// Confirm the throttler receives SetPriority calls.
-TEST_F(HttpNetworkTransactionTest, ThrottlingPrioritySet) {
-  TestNetworkStreamThrottler* throttler(nullptr);
-  std::unique_ptr<HttpNetworkSession> session(
-      CreateSessionWithThrottler(&session_deps_, &throttler));
-
-  // Send a simple request and make sure it goes through.
-  HttpRequestInfo request;
-  request.method = "GET";
-  request.url = GURL("http://www.example.org/");
-  request.traffic_annotation =
-      net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
-
-  MockWrite data_writes[] = {
-      MockWrite("GET / HTTP/1.1\r\n"
-                "Host: www.example.org\r\n"
-                "Connection: keep-alive\r\n\r\n"),
-  };
-  MockRead data_reads[] = {
-      MockRead("HTTP/1.0 200 OK\r\n\r\n"), MockRead("hello world"),
-      MockRead(SYNCHRONOUS, OK),
-  };
-  StaticSocketDataProvider reads(data_reads, arraysize(data_reads), data_writes,
-                                 arraysize(data_writes));
-  session_deps_.socket_factory->AddSocketDataProvider(&reads);
-
-  throttler->set_throttle_new_requests(true);
-  auto trans = std::make_unique<HttpNetworkTransaction>(IDLE, session.get());
-  // Start the transaction to associate a throttle with it.
-  TestCompletionCallback callback;
-  int rv = trans->Start(&request, callback.callback(), NetLogWithSource());
-  EXPECT_EQ(ERR_IO_PENDING, rv);
-
-  EXPECT_EQ(0, throttler->num_set_priority_calls());
-  trans->SetPriority(LOW);
-  EXPECT_EQ(1, throttler->num_set_priority_calls());
-  EXPECT_EQ(LOW, throttler->last_priority_set());
-
-  throttler->UnthrottleAllRequests();
-  base::RunLoop().RunUntilIdle();
-  ASSERT_TRUE(callback.have_result());
-  EXPECT_EQ(OK, callback.WaitForResult());
-}
-
-// Confirm that unthrottling from a SetPriority call by the
-// throttler works properly.
-TEST_F(HttpNetworkTransactionTest, ThrottlingPrioritySetUnthrottle) {
-  TestNetworkStreamThrottler* throttler(nullptr);
-  std::unique_ptr<HttpNetworkSession> session(
-      CreateSessionWithThrottler(&session_deps_, &throttler));
-
-  // Send a simple request and make sure it goes through.
-  HttpRequestInfo request;
-  request.method = "GET";
-  request.url = GURL("http://www.example.org/");
-  request.traffic_annotation =
-      net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
-
-  MockWrite data_writes[] = {
-      MockWrite("GET / HTTP/1.1\r\n"
-                "Host: www.example.org\r\n"
-                "Connection: keep-alive\r\n\r\n"),
-  };
-  MockRead data_reads[] = {
-      MockRead("HTTP/1.0 200 OK\r\n\r\n"), MockRead("hello world"),
-      MockRead(SYNCHRONOUS, OK),
-  };
-  StaticSocketDataProvider reads(data_reads, arraysize(data_reads), data_writes,
-                                 arraysize(data_writes));
-  session_deps_.socket_factory->AddSocketDataProvider(&reads);
-
-  StaticSocketDataProvider reads1(data_reads, arraysize(data_reads),
-                                  data_writes, arraysize(data_writes));
-  session_deps_.socket_factory->AddSocketDataProvider(&reads1);
-
-  // Start a request that will be throttled at start; confirm it
-  // doesn't complete.
-  throttler->set_throttle_new_requests(true);
-  auto trans =
-      std::make_unique<HttpNetworkTransaction>(DEFAULT_PRIORITY, session.get());
-
-  TestCompletionCallback callback;
-  int rv = trans->Start(&request, callback.callback(), NetLogWithSource());
-  EXPECT_EQ(ERR_IO_PENDING, rv);
-
-  base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(LOAD_STATE_THROTTLED, trans->GetLoadState());
-  EXPECT_FALSE(callback.have_result());
-
-  // Create a new request, call SetPriority on it to unthrottle,
-  // and make sure that allows the original request to complete.
-  auto trans1 = std::make_unique<HttpNetworkTransaction>(LOW, session.get());
-  throttler->set_priority_change_closure(
-      base::Bind(&TestNetworkStreamThrottler::UnthrottleAllRequests,
-                 base::Unretained(throttler)));
-
-  // Start the transaction to associate a throttle with it.
-  TestCompletionCallback callback1;
-  rv = trans1->Start(&request, callback1.callback(), NetLogWithSource());
-  EXPECT_EQ(ERR_IO_PENDING, rv);
-
-  trans1->SetPriority(IDLE);
-
-  base::RunLoop().RunUntilIdle();
-  ASSERT_TRUE(callback.have_result());
-  EXPECT_EQ(OK, callback.WaitForResult());
-  ASSERT_TRUE(callback1.have_result());
-  EXPECT_EQ(OK, callback1.WaitForResult());
-}
-
-// Transaction will be destroyed when the unique_ptr goes out of scope.
-void DestroyTransaction(std::unique_ptr<HttpNetworkTransaction> transaction) {}
-
-// Confirm that destroying a transaction from a SetPriority call by the
-// throttler works properly.
-TEST_F(HttpNetworkTransactionTest, ThrottlingPrioritySetDestroy) {
-  TestNetworkStreamThrottler* throttler(nullptr);
-  std::unique_ptr<HttpNetworkSession> session(
-      CreateSessionWithThrottler(&session_deps_, &throttler));
-
-  // Send a simple request and make sure it goes through.
-  HttpRequestInfo request;
-  request.method = "GET";
-  request.url = GURL("http://www.example.org/");
-  request.traffic_annotation =
-      net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
-
-  MockWrite data_writes[] = {
-      MockWrite("GET / HTTP/1.1\r\n"
-                "Host: www.example.org\r\n"
-                "Connection: keep-alive\r\n\r\n"),
-  };
-  MockRead data_reads[] = {
-      MockRead("HTTP/1.0 200 OK\r\n\r\n"), MockRead("hello world"),
-      MockRead(SYNCHRONOUS, OK),
-  };
-  StaticSocketDataProvider reads(data_reads, arraysize(data_reads), data_writes,
-                                 arraysize(data_writes));
-  session_deps_.socket_factory->AddSocketDataProvider(&reads);
-
-  StaticSocketDataProvider reads1(data_reads, arraysize(data_reads),
-                                  data_writes, arraysize(data_writes));
-  session_deps_.socket_factory->AddSocketDataProvider(&reads1);
-
-  // Start a request that will be throttled at start; confirm it
-  // doesn't complete.
-  throttler->set_throttle_new_requests(true);
-  auto trans =
-      std::make_unique<HttpNetworkTransaction>(DEFAULT_PRIORITY, session.get());
-
-  TestCompletionCallback callback;
-  int rv = trans->Start(&request, callback.callback(), NetLogWithSource());
-  EXPECT_EQ(ERR_IO_PENDING, rv);
-
-  base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(LOAD_STATE_THROTTLED, trans->GetLoadState());
-  EXPECT_FALSE(callback.have_result());
-
-  // Arrange for the set priority call on the above transaction to delete
-  // the transaction.
-  HttpNetworkTransaction* trans_ptr(trans.get());
-  throttler->set_priority_change_closure(
-      base::Bind(&DestroyTransaction, base::Passed(&trans)));
-
-  // Call it and check results (partially a "doesn't crash" test).
-  trans_ptr->SetPriority(IDLE);
-  trans_ptr = nullptr;  // No longer a valid pointer.
-
-  base::RunLoop().RunUntilIdle();
-  ASSERT_FALSE(callback.have_result());
-}
-
 #if !defined(OS_IOS)
 TEST_F(HttpNetworkTransactionTest, TokenBindingSpdy) {
   const std::string https_url = "https://www.example.com";
diff --git a/net/log/net_log_event_type_list.h b/net/log/net_log_event_type_list.h
index 9f3f4bf7..09a19f6 100644
--- a/net/log/net_log_event_type_list.h
+++ b/net/log/net_log_event_type_list.h
@@ -1220,12 +1220,6 @@
 // Measures the time taken to look up the key used for Token Binding.
 EVENT_TYPE(HTTP_TRANSACTION_GET_TOKEN_BINDING_KEY)
 
-// Measures the time taken due to throttling by the NetworkThrottleManager.
-EVENT_TYPE(HTTP_TRANSACTION_THROTTLED)
-
-// Record priority changes on the network transaction.
-EVENT_TYPE(HTTP_TRANSACTION_SET_PRIORITY)
-
 // This event is sent when we try to restart a transaction after an error.
 // The following parameters are attached:
 //   {
diff --git a/net/reporting/reporting_header_parser.cc b/net/reporting/reporting_header_parser.cc
index 001fc0e..cd1f7900 100644
--- a/net/reporting/reporting_header_parser.cc
+++ b/net/reporting/reporting_header_parser.cc
@@ -276,6 +276,8 @@
     if (new_endpoints.count(old_endpoint) == 0u)
       cache->RemoveClientForOriginAndEndpoint(origin, old_endpoint);
   }
+
+  RecordHeaderOutcome(HeaderOutcome::PARSED);
 }
 
 }  // namespace net
diff --git a/net/socket/ssl_client_socket_impl.cc b/net/socket/ssl_client_socket_impl.cc
index d9fae48..04c85c9 100644
--- a/net/socket/ssl_client_socket_impl.cc
+++ b/net/socket/ssl_client_socket_impl.cc
@@ -487,8 +487,7 @@
   cert_request_info->cert_authorities.clear();
   const STACK_OF(CRYPTO_BUFFER)* authorities =
       SSL_get0_server_requested_CAs(ssl_.get());
-  for (size_t i = 0; i < sk_CRYPTO_BUFFER_num(authorities); i++) {
-    const CRYPTO_BUFFER* ca_name = sk_CRYPTO_BUFFER_value(authorities, i);
+  for (const CRYPTO_BUFFER* ca_name : authorities) {
     cert_request_info->cert_authorities.push_back(
         std::string(reinterpret_cast<const char*>(CRYPTO_BUFFER_data(ca_name)),
                     CRYPTO_BUFFER_len(ca_name)));
@@ -755,8 +754,7 @@
   const STACK_OF(CRYPTO_BUFFER)* server_cert_chain =
       SSL_get0_peer_certificates(ssl_.get());
   if (server_cert_chain) {
-    for (size_t i = 0; i < sk_CRYPTO_BUFFER_num(server_cert_chain); ++i) {
-      const CRYPTO_BUFFER* cert = sk_CRYPTO_BUFFER_value(server_cert_chain, i);
+    for (const CRYPTO_BUFFER* cert : server_cert_chain) {
       stats->cert_size += CRYPTO_BUFFER_len(cert);
     }
     stats->cert_count = sk_CRYPTO_BUFFER_num(server_cert_chain);
diff --git a/net/spdy/chromium/spdy_network_transaction_unittest.cc b/net/spdy/chromium/spdy_network_transaction_unittest.cc
index f4b99e4..b3e2021 100644
--- a/net/spdy/chromium/spdy_network_transaction_unittest.cc
+++ b/net/spdy/chromium/spdy_network_transaction_unittest.cc
@@ -7217,6 +7217,117 @@
   helper.VerifyDataConsumed();
 }
 
+// Plaintext WebSocket over HTTP/2 is not implemented, see
+// https://crbug.com/684681.
+TEST_F(SpdyNetworkTransactionTest, PlaintextWebSocketOverHttp2Proxy) {
+  SpdySerializedFrame req(spdy_util_.ConstructSpdyConnect(
+      nullptr, 0, 1, LOWEST, HostPortPair("www.example.org", 80)));
+  MockWrite writes[] = {CreateMockWrite(req, 0)};
+
+  SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
+  MockRead reads[] = {CreateMockRead(resp, 1), MockRead(ASYNC, 0, 2)};
+
+  SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
+
+  request_.url = GURL("ws://www.example.org/");
+  auto session_deps = std::make_unique<SpdySessionDependencies>(
+      ProxyResolutionService::CreateFixed("https://proxy:70",
+                                          TRAFFIC_ANNOTATION_FOR_TESTS));
+  NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
+                                     std::move(session_deps));
+  helper.RunPreTestSetup();
+  helper.AddData(&data);
+
+  HttpNetworkTransaction* trans = helper.trans();
+  TestWebSocketHandshakeStreamCreateHelper websocket_stream_create_helper;
+  trans->SetWebSocketHandshakeStreamCreateHelper(
+      &websocket_stream_create_helper);
+
+  EXPECT_TRUE(helper.StartDefaultTest());
+  helper.WaitForCallbackToComplete();
+  EXPECT_THAT(helper.output().rv, IsError(ERR_NOT_IMPLEMENTED));
+
+  helper.VerifyDataConsumed();
+}
+
+TEST_F(SpdyNetworkTransactionTest, SecureWebSocketOverHttp2Proxy) {
+  SpdySerializedFrame connect_request(spdy_util_.ConstructSpdyConnect(
+      nullptr, 0, 1, LOWEST, HostPortPair("www.example.org", 443)));
+  const char kWebSocketRequest[] =
+      "GET / HTTP/1.1\r\n"
+      "Host: www.example.org\r\n"
+      "Connection: Upgrade\r\n"
+      "Upgrade: websocket\r\n"
+      "Origin: http://www.example.org\r\n"
+      "Sec-WebSocket-Version: 13\r\n"
+      "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
+      "Sec-WebSocket-Extensions: permessage-deflate; "
+      "client_max_window_bits\r\n\r\n";
+  SpdySerializedFrame websocket_request(
+      spdy_util_.ConstructSpdyDataFrame(1, kWebSocketRequest, false));
+  MockWrite writes[] = {CreateMockWrite(connect_request, 0),
+                        CreateMockWrite(websocket_request, 2)};
+
+  SpdySerializedFrame connect_response(
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
+  const char kWebSocketResponse[] =
+      "HTTP/1.1 101 Switching Protocols\r\n"
+      "Upgrade: websocket\r\n"
+      "Connection: Upgrade\r\n"
+      "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n\r\n";
+  SpdySerializedFrame websocket_response(
+      spdy_util_.ConstructSpdyDataFrame(1, kWebSocketResponse, false));
+  MockRead reads[] = {CreateMockRead(connect_response, 1),
+                      CreateMockRead(websocket_response, 3),
+                      MockRead(ASYNC, 0, 4)};
+
+  SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
+
+  request_.url = GURL("wss://www.example.org/");
+  request_.extra_headers.SetHeader("Connection", "Upgrade");
+  request_.extra_headers.SetHeader("Upgrade", "websocket");
+  request_.extra_headers.SetHeader("Origin", "http://www.example.org");
+  request_.extra_headers.SetHeader("Sec-WebSocket-Version", "13");
+  auto session_deps = std::make_unique<SpdySessionDependencies>(
+      ProxyResolutionService::CreateFixed("https://proxy:70",
+                                          TRAFFIC_ANNOTATION_FOR_TESTS));
+  NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_,
+                                     std::move(session_deps));
+  helper.RunPreTestSetup();
+  helper.AddData(&data);
+
+  // Add SSL data for the tunneled connection.
+  SSLSocketDataProvider ssl_provider(ASYNC, OK);
+  ssl_provider.ssl_info.cert =
+      ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem");
+  // This test uses WebSocket over HTTP/1.1.
+  ssl_provider.next_proto = kProtoHTTP11;
+  helper.session_deps()->socket_factory->AddSSLSocketDataProvider(
+      &ssl_provider);
+
+  HttpNetworkTransaction* trans = helper.trans();
+  TestWebSocketHandshakeStreamCreateHelper websocket_stream_create_helper;
+  trans->SetWebSocketHandshakeStreamCreateHelper(
+      &websocket_stream_create_helper);
+
+  EXPECT_TRUE(helper.StartDefaultTest());
+  helper.WaitForCallbackToComplete();
+  EXPECT_THAT(helper.output().rv, IsOk());
+  const HttpResponseInfo* response = trans->GetResponseInfo();
+  ASSERT_TRUE(response);
+  EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1_1,
+            response->connection_info);
+  EXPECT_TRUE(response->was_alpn_negotiated);
+  EXPECT_FALSE(response->was_fetched_via_spdy);
+  EXPECT_EQ(70, response->socket_address.port());
+  ASSERT_TRUE(response->headers);
+  EXPECT_EQ("HTTP/1.1 101 Switching Protocols",
+            response->headers->GetStatusLine());
+
+  base::RunLoop().RunUntilIdle();
+  helper.VerifyDataConsumed();
+}
+
 #endif  // BUILDFLAG(ENABLE_WEBSOCKETS)
 
 }  // namespace net
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc
index dc599e8..8001e35 100644
--- a/net/url_request/url_request_unittest.cc
+++ b/net/url_request/url_request_unittest.cc
@@ -422,18 +422,8 @@
     USER_CALLBACK,  // User takes care of doing a callback.  |retval_| and
                     // |auth_retval_| are ignored. In every blocking stage the
                     // message loop is quit.
-    USER_NOTIFY,    // User is notified by a provided callback of the
-                    // blocking, and synchronously returns instructions
-                    // for handling it.
   };
 
-  using NotificationCallback =
-      base::Callback<Error(const CompletionCallback&, const URLRequest*)>;
-
-  using NotificationAuthCallback =
-      base::Callback<NetworkDelegate::AuthRequiredResponse(const AuthCallback&,
-                                                           const URLRequest*)>;
-
   // Creates a delegate which does not block at all.
   explicit BlockingNetworkDelegate(BlockMode block_mode);
 
@@ -470,17 +460,6 @@
     block_on_ = block_on;
   }
 
-  // Only valid if |block_mode_| == USER_NOTIFY
-  void set_notification_callback(
-      const NotificationCallback& notification_callback) {
-    notification_callback_ = notification_callback;
-  }
-
-  void set_notification_auth_callback(
-      const NotificationAuthCallback& notification_auth_callback) {
-    notification_auth_callback_ = notification_auth_callback;
-  }
-
   // Allows the user to check in which state did we block.
   Stage stage_blocked_for_callback() const {
     EXPECT_EQ(USER_CALLBACK, block_mode_);
@@ -520,7 +499,6 @@
   // Checks whether we should block in |stage|. If yes, returns an error code
   // and optionally sets up callback based on |block_mode_|. If no, returns OK.
   int MaybeBlockStage(Stage stage,
-                      const URLRequest* request,
                       const CompletionCallback& callback);
 
   // Configuration parameters, can be adjusted by public methods:
@@ -548,10 +526,6 @@
   CompletionCallback callback_;
   AuthCallback auth_callback_;
 
-  // Callback to request user instructions for blocking.
-  NotificationCallback notification_callback_;
-  NotificationAuthCallback notification_auth_callback_;
-
   base::WeakPtrFactory<BlockingNetworkDelegate> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(BlockingNetworkDelegate);
@@ -611,7 +585,7 @@
   if (!redirect_url_.is_empty())
     *new_url = redirect_url_;
 
-  return MaybeBlockStage(ON_BEFORE_URL_REQUEST, request, callback);
+  return MaybeBlockStage(ON_BEFORE_URL_REQUEST, callback);
 }
 
 int BlockingNetworkDelegate::OnBeforeStartTransaction(
@@ -620,7 +594,7 @@
     HttpRequestHeaders* headers) {
   TestNetworkDelegate::OnBeforeStartTransaction(request, callback, headers);
 
-  return MaybeBlockStage(ON_BEFORE_SEND_HEADERS, request, callback);
+  return MaybeBlockStage(ON_BEFORE_SEND_HEADERS, callback);
 }
 
 int BlockingNetworkDelegate::OnHeadersReceived(
@@ -635,7 +609,7 @@
                                          override_response_headers,
                                          allowed_unsafe_redirect_url);
 
-  return MaybeBlockStage(ON_HEADERS_RECEIVED, request, callback);
+  return MaybeBlockStage(ON_HEADERS_RECEIVED, callback);
 }
 
 NetworkDelegate::AuthRequiredResponse BlockingNetworkDelegate::OnAuthRequired(
@@ -673,11 +647,6 @@
       base::ThreadTaskRunnerHandle::Get()->PostTask(
           FROM_HERE, base::MessageLoop::QuitWhenIdleClosure());
       return AUTH_REQUIRED_RESPONSE_IO_PENDING;
-
-    case USER_NOTIFY:
-      // If the callback returns ERR_IO_PENDING, the user has accepted
-      // responsibility for running the callback in the future.
-      return notification_auth_callback_.Run(callback, request);
   }
   NOTREACHED();
   return AUTH_REQUIRED_RESPONSE_NO_ACTION;  // Dummy value.
@@ -692,7 +661,6 @@
 
 int BlockingNetworkDelegate::MaybeBlockStage(
     BlockingNetworkDelegate::Stage stage,
-    const URLRequest* request,
     const CompletionCallback& callback) {
   // Check that the user has provided callback for the previous blocked stage.
   EXPECT_EQ(NOT_BLOCKED, stage_blocked_for_callback_);
@@ -718,11 +686,6 @@
       base::ThreadTaskRunnerHandle::Get()->PostTask(
           FROM_HERE, base::MessageLoop::QuitWhenIdleClosure());
       return ERR_IO_PENDING;
-
-    case USER_NOTIFY:
-      // If the callback returns ERR_IO_PENDING, the user has accepted
-      // responsibility for running the callback in the future.
-      return notification_callback_.Run(callback, request);
   }
   NOTREACHED();
   return 0;
@@ -8913,290 +8876,6 @@
   EXPECT_TRUE(req->status().is_success());
 }
 
-// A class to hold state for responding to USER_NOTIFY callbacks from
-// BlockingNetworkDelegate.  It also accepts a RunLoop that will be
-// signaled via QuitWhenIdle() when any request is blocked.
-//
-class NotificationCallbackHandler {
- public:
-  // Default constructed object doesn't block anything.
-  NotificationCallbackHandler() : run_loop_(nullptr) {}
-
-  void AddURLRequestToBlockList(const URLRequest* request) {
-    requests_to_block_.insert(request);
-  }
-
-  Error ShouldBlockRequest(const CompletionCallback& callback,
-                           const URLRequest* request) {
-    if (requests_to_block_.find(request) == requests_to_block_.end()) {
-      return OK;
-    }
-
-    DCHECK(blocked_callbacks_.find(request) == blocked_callbacks_.end());
-    blocked_callbacks_[request] = callback;
-    if (run_loop_ && blocked_callbacks_.size() == requests_to_block_.size())
-      run_loop_->QuitWhenIdle();
-    return ERR_IO_PENDING;
-  }
-
-  // Erases object's memory of blocked callbacks as a side effect.
-  void GetBlockedCallbacks(
-      std::map<const URLRequest*, CompletionCallback>* blocked_callbacks) {
-    blocked_callbacks_.swap(*blocked_callbacks);
-  }
-
-  // Set a RunLoop that, if non-null, will be signaled if any request
-  // is blocked.  It is the callers responsibility to make sure the
-  // passed object lives past the destruction of this class or
-  // next call to SetRunLoop().
-  void SetRunLoop(base::RunLoop* run_loop) { run_loop_ = run_loop; }
-
- private:
-  std::set<const URLRequest*> requests_to_block_;
-  std::map<const URLRequest*, CompletionCallback> blocked_callbacks_;
-
-  base::RunLoop* run_loop_;
-
-  DISALLOW_COPY_AND_ASSIGN(NotificationCallbackHandler);
-};
-
-TEST_F(URLRequestTestHTTP, MultiThrottledPriority) {
-  ASSERT_TRUE(http_test_server()->Start());
-
-  base::RunLoop run_until_request_blocked;
-
-  NotificationCallbackHandler notification_handler;
-  notification_handler.SetRunLoop(&run_until_request_blocked);
-  BlockingNetworkDelegate network_delegate(
-      BlockingNetworkDelegate::USER_NOTIFY);
-  network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED);
-  network_delegate.set_notification_callback(
-      base::Bind(&NotificationCallbackHandler::ShouldBlockRequest,
-                 // Both objects are owned by this function, and
-                 // |*network_delegate| will be destroyed first, so
-                 // it's safe to pass it an unretained pointer.
-                 base::Unretained(&notification_handler)));
-
-  TestURLRequestContext context(true);
-  context.set_network_delegate(&network_delegate);
-  context.Init();
-
-  // Use different test URLs to make sure all three requests turn into
-  // HttpNetworkTransacations.  Use different URLRequest::Delegates so that
-  // the requests may be waited on separately.
-  TestDelegate d1;
-  std::unique_ptr<URLRequest> req1(
-      context.CreateRequest(http_test_server()->GetURL("/echoall/l"), THROTTLED,
-                            &d1, TRAFFIC_ANNOTATION_FOR_TESTS));
-  notification_handler.AddURLRequestToBlockList(req1.get());
-
-  TestDelegate d2;
-  std::unique_ptr<URLRequest> req2(
-      context.CreateRequest(http_test_server()->GetURL("/echoall/2"), THROTTLED,
-                            &d2, TRAFFIC_ANNOTATION_FOR_TESTS));
-  notification_handler.AddURLRequestToBlockList(req2.get());
-
-  TestDelegate d3;
-  std::unique_ptr<URLRequest> req3(
-      context.CreateRequest(http_test_server()->GetURL("/echoall/3"), THROTTLED,
-                            &d3, TRAFFIC_ANNOTATION_FOR_TESTS));
-  req1->Start();
-  req2->Start();
-  req3->Start();
-  run_until_request_blocked.Run();
-  notification_handler.SetRunLoop(nullptr);
-
-  // The first two requests should be blocked based on the notification
-  // callback, and their status should have blocked the third request
-  // through throttling.
-  EXPECT_TRUE(req1->status().is_io_pending());
-  EXPECT_TRUE(req2->status().is_io_pending());
-  EXPECT_TRUE(req3->status().is_io_pending());
-
-  std::map<const URLRequest*, CompletionCallback> blocked_callbacks;
-  notification_handler.GetBlockedCallbacks(&blocked_callbacks);
-  ASSERT_EQ(2u, blocked_callbacks.size());
-  ASSERT_TRUE(blocked_callbacks.find(req1.get()) != blocked_callbacks.end());
-  ASSERT_TRUE(blocked_callbacks.find(req2.get()) != blocked_callbacks.end());
-
-  // Unblocking one of the requests blocked on the notification callback
-  // should let it complete, which should then let the third request
-  // complete.  Unblock the second request, then wait for the third
-  // request to complete.
-  // TODO(rdsmith): Find something to wait on other than the third
-  // requests completion; if there's a bug in throttling, that will
-  // result in this test hanging rather than failing quickly.
-  d1.set_quit_on_complete(false);
-  d2.set_quit_on_complete(false);
-  d3.set_quit_on_complete(true);
-  blocked_callbacks[req2.get()].Run(OK);
-  base::RunLoop().Run();
-
-  notification_handler.GetBlockedCallbacks(&blocked_callbacks);
-  EXPECT_EQ(0u, blocked_callbacks.size());
-  EXPECT_TRUE(req1->status().is_io_pending());
-  // req3 is only unblocked after req2 completes, so req2's
-  // success is guaranteed at this point in the function.
-  EXPECT_EQ(URLRequestStatus::SUCCESS, req2->status().status());
-  EXPECT_EQ(URLRequestStatus::SUCCESS, req3->status().status());
-}
-
-// Confirm that failing a request unblocks following requests.
-TEST_F(URLRequestTestHTTP, ThrottledFailure) {
-  ASSERT_TRUE(http_test_server()->Start());
-
-  base::RunLoop run_until_request_blocked;
-
-  NotificationCallbackHandler notification_handler;
-  notification_handler.SetRunLoop(&run_until_request_blocked);
-  BlockingNetworkDelegate network_delegate(
-      BlockingNetworkDelegate::USER_NOTIFY);
-  network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED);
-  network_delegate.set_notification_callback(
-      base::Bind(&NotificationCallbackHandler::ShouldBlockRequest,
-                 // Both objects are owned by this function, and
-                 // |*network_delegate| will be destroyed first, so
-                 // it's safe to pass it an unretained pointer.
-                 base::Unretained(&notification_handler)));
-
-  TestURLRequestContext context(true);
-  context.set_network_delegate(&network_delegate);
-  context.Init();
-
-  // Use different test URLs to make sure all three requests turn into
-  // HttpNetworkTransacations.  Use different URLRequest::Delegates so that
-  // the requests may be waited on separately.
-  TestDelegate d1;
-  std::unique_ptr<URLRequest> req1(
-      context.CreateRequest(http_test_server()->GetURL("/echoall/l"), THROTTLED,
-                            &d1, TRAFFIC_ANNOTATION_FOR_TESTS));
-  notification_handler.AddURLRequestToBlockList(req1.get());
-
-  TestDelegate d2;
-  std::unique_ptr<URLRequest> req2(
-      context.CreateRequest(http_test_server()->GetURL("/echoall/2"), THROTTLED,
-                            &d2, TRAFFIC_ANNOTATION_FOR_TESTS));
-  notification_handler.AddURLRequestToBlockList(req2.get());
-
-  TestDelegate d3;
-  std::unique_ptr<URLRequest> req3(
-      context.CreateRequest(http_test_server()->GetURL("/echoall/3"), THROTTLED,
-                            &d3, TRAFFIC_ANNOTATION_FOR_TESTS));
-  req1->Start();
-  req2->Start();
-  req3->Start();
-  run_until_request_blocked.Run();
-  notification_handler.SetRunLoop(nullptr);
-
-  // The first two requests should be blocked based on the notification
-  // callback, and their status should have blocked the third request
-  // through throttling.
-  EXPECT_TRUE(req1->status().is_io_pending());
-  EXPECT_TRUE(req2->status().is_io_pending());
-  EXPECT_TRUE(req3->status().is_io_pending());
-
-  std::map<const URLRequest*, CompletionCallback> blocked_callbacks;
-  notification_handler.GetBlockedCallbacks(&blocked_callbacks);
-  ASSERT_EQ(2u, blocked_callbacks.size());
-  ASSERT_TRUE(blocked_callbacks.find(req1.get()) != blocked_callbacks.end());
-  ASSERT_TRUE(blocked_callbacks.find(req2.get()) != blocked_callbacks.end());
-
-  // Confirm canceling one of the outstanding requests allows the
-  // blocked request to complete.
-
-  // TODO(rdsmith): Find something to wait on other than the third
-  // requests completion; if there's a bug in throttling, that will
-  // result in this test hanging rather than failing quickly.
-  d1.set_quit_on_complete(false);
-  d2.set_quit_on_complete(false);
-  d3.set_quit_on_complete(true);
-  req2->Cancel();
-  base::RunLoop().Run();
-
-  notification_handler.GetBlockedCallbacks(&blocked_callbacks);
-  EXPECT_EQ(0u, blocked_callbacks.size());
-  EXPECT_TRUE(req1->status().is_io_pending());
-  EXPECT_EQ(URLRequestStatus::CANCELED, req2->status().status());
-  EXPECT_EQ(URLRequestStatus::SUCCESS, req3->status().status());
-}
-
-TEST_F(URLRequestTestHTTP, ThrottledRepriUnblock) {
-  ASSERT_TRUE(http_test_server()->Start());
-
-  base::RunLoop run_until_request_blocked;
-
-  NotificationCallbackHandler notification_handler;
-  notification_handler.SetRunLoop(&run_until_request_blocked);
-  BlockingNetworkDelegate network_delegate(
-      BlockingNetworkDelegate::USER_NOTIFY);
-  network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED);
-  network_delegate.set_notification_callback(
-      base::Bind(&NotificationCallbackHandler::ShouldBlockRequest,
-                 // Both objects are owned by this function, and
-                 // |*network_delegate| will be destroyed first, so
-                 // it's safe to pass it an unretained pointer.
-                 base::Unretained(&notification_handler)));
-
-  TestURLRequestContext context(true);
-  context.set_network_delegate(&network_delegate);
-  context.Init();
-
-  // Use different test URLs to make sure all three requests turn into
-  // HttpNetworkTransacations.  Use different URLRequest::Delegates so that
-  // the requests may be waited on separately.
-  TestDelegate d1;
-  std::unique_ptr<URLRequest> req1(
-      context.CreateRequest(http_test_server()->GetURL("/echoall/l"), THROTTLED,
-                            &d1, TRAFFIC_ANNOTATION_FOR_TESTS));
-  notification_handler.AddURLRequestToBlockList(req1.get());
-
-  TestDelegate d2;
-  std::unique_ptr<URLRequest> req2(
-      context.CreateRequest(http_test_server()->GetURL("/echoall/2"), THROTTLED,
-                            &d2, TRAFFIC_ANNOTATION_FOR_TESTS));
-  notification_handler.AddURLRequestToBlockList(req2.get());
-
-  TestDelegate d3;
-  std::unique_ptr<URLRequest> req3(
-      context.CreateRequest(http_test_server()->GetURL("/echoall/3"), THROTTLED,
-                            &d3, TRAFFIC_ANNOTATION_FOR_TESTS));
-  req1->Start();
-  req2->Start();
-  req3->Start();
-  run_until_request_blocked.Run();
-  notification_handler.SetRunLoop(nullptr);
-
-  // The first two requests should be blocked based on the notification
-  // callback, and their status should have blocked the third request
-  // through throttling.
-  EXPECT_TRUE(req1->status().is_io_pending());
-  EXPECT_TRUE(req2->status().is_io_pending());
-  EXPECT_TRUE(req3->status().is_io_pending());
-
-  std::map<const URLRequest*, CompletionCallback> blocked_callbacks;
-  notification_handler.GetBlockedCallbacks(&blocked_callbacks);
-  ASSERT_EQ(2u, blocked_callbacks.size());
-  ASSERT_TRUE(blocked_callbacks.find(req1.get()) != blocked_callbacks.end());
-  ASSERT_TRUE(blocked_callbacks.find(req2.get()) != blocked_callbacks.end());
-
-  // Confirm raising the priority of the third request allows it to complete.
-
-  // TODO(rdsmith): Find something to wait on other than the third
-  // requests completion; if there's a bug in throttling, that will
-  // result in this test hanging rather than failing quickly.
-  d1.set_quit_on_complete(false);
-  d2.set_quit_on_complete(false);
-  d3.set_quit_on_complete(true);
-  req3->SetPriority(IDLE);
-  base::RunLoop().Run();
-
-  notification_handler.GetBlockedCallbacks(&blocked_callbacks);
-  EXPECT_EQ(0u, blocked_callbacks.size());
-  EXPECT_TRUE(req1->status().is_io_pending());
-  EXPECT_TRUE(req2->status().is_io_pending());
-  EXPECT_EQ(URLRequestStatus::SUCCESS, req3->status().status());
-}
-
 TEST_F(URLRequestTestHTTP, RawBodyBytesNoContentEncoding) {
   ASSERT_TRUE(http_test_server()->Start());
 
diff --git a/ppapi/api/private/pp_content_decryptor.idl b/ppapi/api/private/pp_content_decryptor.idl
deleted file mode 100644
index 96bd254..0000000
--- a/ppapi/api/private/pp_content_decryptor.idl
+++ /dev/null
@@ -1,507 +0,0 @@
-/* Copyright (c) 2012 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.
- */
-
-/**
- * The <code>PP_DecryptTrackingInfo</code> struct contains necessary information
- * that can be used to associate the decrypted block with a decrypt request
- * and/or an input block.
- */
-[assert_size(16)]
-struct PP_DecryptTrackingInfo {
-  /**
-   * Client-specified identifier for the associated decrypt request. By using
-   * this value, the client can associate the decrypted block with a decryption
-   * request.
-   */
-  uint32_t request_id;
-
-  /**
-   * A unique buffer ID to identify a PPB_Buffer_Dev. Unlike a PP_Resource,
-   * this ID is identical at both the renderer side and the plugin side.
-   * In <code>PPB_ContentDecryptor_Private</code> calls, this is the ID of the
-   * buffer associated with the decrypted block/frame/samples.
-   * In <code>PPP_ContentDecryptor_Private</code> calls, this is the ID of a
-   * buffer that is no longer need at the renderer side, which can be released
-   * or recycled by the plugin. This ID can be 0 if there is no buffer to be
-   * released or recycled.
-   */
-  uint32_t buffer_id;
-
-  /**
-   * Timestamp in microseconds of the associated block. By using this value,
-   * the client can associate the decrypted (and decoded) data with an input
-   * block. This is needed because buffers may be delivered out of order and
-   * not in response to the <code>request_id</code> they were provided with.
-   */
-  int64_t timestamp;
-};
-
-/**
- * The <code>PP_DecryptSubsampleDescription</code> struct contains information
- * to support subsample decryption.
- *
- * An input block can be split into several continuous subsamples.
- * A <code>PP_DecryptSubsampleEntry</code> specifies the number of clear and
- * cipher bytes in each subsample. For example, the following block has three
- * subsamples:
- *
- * |<----- subsample1 ----->|<----- subsample2 ----->|<----- subsample3 ----->|
- * |   clear1   |  cipher1  |  clear2  |   cipher2   | clear3 |    cipher3    |
- *
- * For decryption, all of the cipher bytes in a block should be treated as a
- * contiguous (in the subsample order) logical stream. The clear bytes should
- * not be considered as part of decryption.
- *
- * Logical stream to decrypt:   |  cipher1  |   cipher2   |    cipher3    |
- * Decrypted stream:            | decrypted1|  decrypted2 |   decrypted3  |
- *
- * After decryption, the decrypted bytes should be copied over the position
- * of the corresponding cipher bytes in the original block to form the output
- * block. Following the above example, the decrypted block should be:
- *
- * |<----- subsample1 ----->|<----- subsample2 ----->|<----- subsample3 ----->|
- * |   clear1   | decrypted1|  clear2  |  decrypted2 | clear3 |   decrypted3  |
- */
-[assert_size(8)]
-struct PP_DecryptSubsampleDescription {
-  /**
-   * Size in bytes of clear data in a subsample entry.
-   */
-  uint32_t clear_bytes;
-
-  /**
-   * Size in bytes of encrypted data in a subsample entry.
-   */
-  uint32_t cipher_bytes;
-};
-
-/**
- * The <code>PP_EncryptedBlockInfo</code> struct contains all the information
- * needed to decrypt an encrypted block.
- */
-[assert_size(368)]
-struct PP_EncryptedBlockInfo {
-  /**
-   * Information needed by the client to track the block to be decrypted.
-   */
-  PP_DecryptTrackingInfo tracking_info;
-
-  /**
-   * Size in bytes of data to be decrypted (data_offset included).
-   */
-  uint32_t data_size;
-
-  /**
-   * Key ID of the block to be decrypted.
-   *
-   * For WebM the key ID can be as large as 2048 bytes in theory. But it's not
-   * used in current implementations. If we really need to support it, we should
-   * move key ID out as a separate parameter, e.g. as a <code>PP_Var</code>, or
-   * make the whole <code>PP_EncryptedBlockInfo</code> as a
-   * <code>PP_Resource</code>.
-   */
-  uint8_t[64] key_id;
-  uint32_t key_id_size;
-
-  /**
-   * Initialization vector of the block to be decrypted.
-   */
-  uint8_t[16] iv;
-  uint32_t iv_size;
-
-  /**
-   * Subsample information of the block to be decrypted.
-   *
-   * We need to have a fixed size of |subsamples| here. Choose 32 because it is
-   * sufficient for almost all real life scenarios. Note that in theory the
-   * number of subsamples could be larger than 32. If that happens, playback
-   * will fail.
-   */
-  PP_DecryptSubsampleDescription[32] subsamples;
-  uint32_t num_subsamples;
-};
-
-/**
- * <code>PP_DecryptedFrameFormat</code> contains video frame formats.
- */
-[assert_size(4)]
-enum PP_DecryptedFrameFormat {
-  PP_DECRYPTEDFRAMEFORMAT_UNKNOWN = 0,
-  PP_DECRYPTEDFRAMEFORMAT_YV12 = 1,
-  PP_DECRYPTEDFRAMEFORMAT_I420 = 2
-};
-
-/**
- * <code>PP_DecryptedSampleFormat</code> contains audio sample formats.
- */
-[assert_size(4)]
-enum PP_DecryptedSampleFormat {
-  PP_DECRYPTEDSAMPLEFORMAT_UNKNOWN = 0,
-  PP_DECRYPTEDSAMPLEFORMAT_U8 = 1,
-  PP_DECRYPTEDSAMPLEFORMAT_S16 = 2,
-  PP_DECRYPTEDSAMPLEFORMAT_S32 = 3,
-  PP_DECRYPTEDSAMPLEFORMAT_F32 = 4,
-  PP_DECRYPTEDSAMPLEFORMAT_PLANAR_S16 = 5,
-  PP_DECRYPTEDSAMPLEFORMAT_PLANAR_F32 = 6
-};
-
-/**
- * The <code>PP_DecryptResult</code> enum contains decryption and decoding
- * result constants.
- */
-[assert_size(4)]
-enum PP_DecryptResult {
-  /** The decryption (and/or decoding) operation finished successfully. */
-  PP_DECRYPTRESULT_SUCCESS = 0,
-  /** The decryptor did not have the necessary decryption key. */
-  PP_DECRYPTRESULT_DECRYPT_NOKEY = 1,
-  /** The input was accepted by the decoder but no frame(s) can be produced. */
-  PP_DECRYPTRESULT_NEEDMOREDATA = 2,
-  /** An unexpected error happened during decryption. */
-  PP_DECRYPTRESULT_DECRYPT_ERROR = 3,
-  /** An unexpected error happened during decoding. */
-  PP_DECRYPTRESULT_DECODE_ERROR = 4
-};
-
-/**
- * <code>PP_DecryptedBlockInfo</code> struct contains the decryption result and
- * tracking info associated with the decrypted block.
- */
-[assert_size(24)]
-struct PP_DecryptedBlockInfo {
-  /**
-   * Result of the decryption (and/or decoding) operation.
-   */
-  PP_DecryptResult result;
-
-  /**
-   * Size in bytes of decrypted data, which may be less than the size of the
-   * corresponding buffer.
-   */
-  uint32_t data_size;
-
-  /**
-   * Information needed by the client to track the block to be decrypted.
-   */
-  PP_DecryptTrackingInfo tracking_info;
-};
-
-/**
- * <code>PP_DecryptedFramePlanes</code> provides YUV plane index values for
- * accessing plane offsets stored in <code>PP_DecryptedFrameInfo</code>.
- */
-[assert_size(4)]
-enum PP_DecryptedFramePlanes {
-  PP_DECRYPTEDFRAMEPLANES_Y = 0,
-  PP_DECRYPTEDFRAMEPLANES_U = 1,
-  PP_DECRYPTEDFRAMEPLANES_V = 2
-};
-
-/**
- * <code>PP_DecryptedFrameInfo</code> contains the result of the
- * decrypt and decode operation on the associated frame, information required
- * to access the frame data in buffer, and tracking info.
- */
-[assert_size(56)]
-struct PP_DecryptedFrameInfo {
-  /**
-   * Result of the decrypt and decode operation.
-   */
-  PP_DecryptResult result;
-
-  /**
-   * Format of the decrypted frame.
-   */
-  PP_DecryptedFrameFormat format;
-
-  /**
-   * Offsets into the buffer resource for accessing video planes.
-   */
-  int32_t[3] plane_offsets;
-
-  /**
-   * Stride of each plane.
-   */
-  int32_t[3] strides;
-
-  /**
-   * Width of the video frame, in pixels.
-   */
-  int32_t width;
-
-  /**
-   * Height of the video frame, in pixels.
-   */
-  int32_t height;
-
-  /**
-   * Information needed by the client to track the decrypted frame.
-   */
-  PP_DecryptTrackingInfo tracking_info;
-};
-
-/**
- * <code>PP_DecryptedSampleInfo</code> contains the result of the
- * decrypt and decode operation on the associated samples, information required
- * to access the sample data in buffer, and tracking info.
- */
-[assert_size(32)]
-struct PP_DecryptedSampleInfo {
-  /**
-   * Result of the decrypt and decode operation.
-   */
-  PP_DecryptResult result;
-
-  /**
-   * Format of the decrypted samples.
-   */
-  PP_DecryptedSampleFormat format;
-
-  /**
-   * Size in bytes of decrypted samples.
-   */
-  uint32_t data_size;
-
-  /**
-   * 4-byte padding to make the size of <code>PP_DecryptedSampleInfo</code>
-   * a multiple of 8 bytes. The value of this field should not be used.
-   */
-  uint32_t padding;
-
-  /**
-   * Information needed by the client to track the decrypted samples.
-   */
-  PP_DecryptTrackingInfo tracking_info;
-};
-
-/**
- * <code>PP_AudioCodec</code> contains audio codec type constants.
- */
-[assert_size(4)]
-enum PP_AudioCodec {
-  PP_AUDIOCODEC_UNKNOWN = 0,
-  PP_AUDIOCODEC_VORBIS = 1,
-  PP_AUDIOCODEC_AAC = 2
-};
-
-/**
- * <code>PP_AudioDecoderConfig</code> contains audio decoder configuration
- * information required to initialize audio decoders, and a request ID
- * that allows clients to associate a decoder initialization request with a
- * status response. Note: When <code>codec</code> requires extra data for
- * initialization, the data is sent as a <code>PP_Resource</code> carried
- * alongside <code>PP_AudioDecoderConfig</code>.
- */
- [assert_size(20)]
-struct PP_AudioDecoderConfig {
-  /**
-   * The audio codec to initialize.
-   */
-  PP_AudioCodec codec;
-
-  /**
-   * Number of audio channels.
-   */
-  int32_t channel_count;
-
-  /**
-   * Size of each audio channel.
-   */
-  int32_t bits_per_channel;
-
-  /**
-   * Audio sampling rate.
-   */
-  int32_t samples_per_second;
-
-  /**
-   * Client-specified identifier for the associated audio decoder initialization
-   * request. By using this value, the client can associate a decoder
-   * initialization status response with an initialization request.
-   */
-  uint32_t request_id;
-};
-
-/**
- * <code>PP_VideoCodec</code> contains video codec type constants.
- */
-[assert_size(4)]
-enum PP_VideoCodec {
-  PP_VIDEOCODEC_UNKNOWN = 0,
-  PP_VIDEOCODEC_VP8 = 1,
-  PP_VIDEOCODEC_H264 = 2,
-  PP_VIDEOCODEC_VP9 = 3
-};
-
-/**
- * <code>PP_VideoCodecProfile</code> contains video codec profile type
- * constants required for video decoder configuration.
- *.
- */
-[assert_size(4)]
-enum PP_VideoCodecProfile {
-  PP_VIDEOCODECPROFILE_UNKNOWN = 0,
-  PP_VIDEOCODECPROFILE_NOT_NEEDED = 1,
-  PP_VIDEOCODECPROFILE_H264_BASELINE = 2,
-  PP_VIDEOCODECPROFILE_H264_MAIN = 3,
-  PP_VIDEOCODECPROFILE_H264_EXTENDED = 4,
-  PP_VIDEOCODECPROFILE_H264_HIGH = 5,
-  PP_VIDEOCODECPROFILE_H264_HIGH_10 = 6,
-  PP_VIDEOCODECPROFILE_H264_HIGH_422 = 7,
-  PP_VIDEOCODECPROFILE_H264_HIGH_444_PREDICTIVE = 8
-};
-
-/**
- * <code>PP_VideoDecoderConfig</code> contains video decoder configuration
- * information required to initialize video decoders, and a request ID
- * that allows clients to associate a decoder initialization request with a
- * status response. Note: When <code>codec</code> requires extra data for
- * initialization, the data is sent as a <code>PP_Resource</code> carried
- * alongside <code>PP_VideoDecoderConfig</code>.
- */
-[assert_size(24)]
-struct PP_VideoDecoderConfig {
-  /**
-   * The video codec to initialize.
-   */
-  PP_VideoCodec codec;
-
-  /**
-   * Profile to use when initializing the video codec.
-   */
-  PP_VideoCodecProfile profile;
-
-  /**
-   * Output video format.
-   */
-  PP_DecryptedFrameFormat format;
-
-  /**
-   * Width of decoded video frames, in pixels.
-   */
-  int32_t width;
-
-  /**
-   * Height of decoded video frames, in pixels.
-   */
-  int32_t height;
-
-  /**
-   * Client-specified identifier for the associated video decoder initialization
-   * request. By using this value, the client can associate a decoder
-   * initialization status response with an initialization request.
-   */
-  uint32_t request_id;
-};
-
-/**
- * <code>PP_HdcpVersion</code> contains HDCP version constants.
- */
-[assert_size(4)]
-enum PP_HdcpVersion {
-  PP_HDCPVERSION_NONE = 0,
-  PP_HDCPVERSION_1_0 = 1,
-  PP_HDCPVERSION_1_1 = 2,
-  PP_HDCPVERSION_1_2 = 3,
-  PP_HDCPVERSION_1_3 = 4,
-  PP_HDCPVERSION_1_4 = 5,
-  PP_HDCPVERSION_2_0 = 6,
-  PP_HDCPVERSION_2_1 = 7,
-  PP_HDCPVERSION_2_2 = 8,
-  PP_HDCPVERSION_MAX = PP_HDCPVERSION_2_2
-};
-
-/**
- * <code>PP_DecryptorStreamType</code> contains stream type constants.
- */
-[assert_size(4)]
-enum PP_DecryptorStreamType {
-  PP_DECRYPTORSTREAMTYPE_AUDIO = 0,
-  PP_DECRYPTORSTREAMTYPE_VIDEO = 1,
-  PP_DECRYPTORSTREAMTYPE_MAX = PP_DECRYPTORSTREAMTYPE_VIDEO
-};
-
-/**
- * <code>PP_SessionType</code> contains session type constants.
- */
-[assert_size(4)]
-enum PP_SessionType {
-  PP_SESSIONTYPE_TEMPORARY = 0,
-  PP_SESSIONTYPE_PERSISTENT_LICENSE = 1,
-  PP_SESSIONTYPE_PERSISTENT_RELEASE = 2,
-  PP_SESSIONTYPE_MAX = PP_SESSIONTYPE_PERSISTENT_RELEASE
-};
-
-/**
- * <code>PP_InitDataType</code> contains Initialization Data Type constants.
- */
-[assert_size(4)]
-enum PP_InitDataType {
-  PP_INITDATATYPE_CENC = 0,
-  PP_INITDATATYPE_KEYIDS = 1,
-  PP_INITDATATYPE_WEBM = 2,
-  PP_INITDATATYPE_MAX = PP_INITDATATYPE_WEBM
-};
-
-/**
- * <code>PP_CdmExceptionCode</code> contains exception code constants.
- */
-[assert_size(4)]
-enum PP_CdmExceptionCode {
-  PP_CDMEXCEPTIONCODE_NOTSUPPORTEDERROR = 1,
-  PP_CDMEXCEPTIONCODE_INVALIDSTATEERROR = 2,
-  PP_CDMEXCEPTIONCODE_TYPEERROR = 3,
-  PP_CDMEXCEPTIONCODE_QUOTAEXCEEDEDERROR = 4,
-  PP_CDMEXCEPTIONCODE_MAX = PP_CDMEXCEPTIONCODE_QUOTAEXCEEDEDERROR
-};
-
-/**
- * <code>PP_CdmMessageType</code> contains message type constants.
- */
-[assert_size(4)]
-enum PP_CdmMessageType {
-  PP_CDMMESSAGETYPE_LICENSE_REQUEST = 0,
-  PP_CDMMESSAGETYPE_LICENSE_RENEWAL = 1,
-  PP_CDMMESSAGETYPE_LICENSE_RELEASE = 2,
-  PP_CDMMESSAGETYPE_MAX = PP_CDMMESSAGETYPE_LICENSE_RELEASE
-};
-
-/**
- * <code>PP_CdmKeyStatus</code> contains key status constants.
- */
-[assert_size(4)]
-enum PP_CdmKeyStatus {
-  PP_CDMKEYSTATUS_USABLE = 0,
-  PP_CDMKEYSTATUS_INVALID = 1,
-  PP_CDMKEYSTATUS_EXPIRED = 2,
-  PP_CDMKEYSTATUS_OUTPUTRESTRICTED = 3,
-  PP_CDMKEYSTATUS_OUTPUTDOWNSCALED = 4,
-  PP_CDMKEYSTATUS_STATUSPENDING = 5,
-  PP_CDMKEYSTATUS_RELEASED = 6,
-  PP_CDMKEYSTATUS_MAX = PP_CDMKEYSTATUS_RELEASED
-};
-
-/**
- * The <code>PP_KeyInformation</code> struct contains information about a
- * key used for decryption.
- */
-[assert_size(524)]
-struct PP_KeyInformation {
-  /**
-   * Key ID.
-   */
-  uint8_t[512] key_id;
-  uint32_t key_id_size;
-
-  /**
-   * Status of this key.
-   */
-  PP_CdmKeyStatus key_status;
-
-  /**
-   * Optional error code for keys that are not usable.
-   */
-  uint32_t system_code;
-};
diff --git a/ppapi/api/private/ppb_content_decryptor_private.idl b/ppapi/api/private/ppb_content_decryptor_private.idl
deleted file mode 100644
index 2317d46..0000000
--- a/ppapi/api/private/ppb_content_decryptor_private.idl
+++ /dev/null
@@ -1,328 +0,0 @@
-/* Copyright (c) 2012 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/**
- * This file defines the <code>PPB_ContentDecryptor_Private</code>
- * interface. Note: This is a special interface, only to be used for Content
- * Decryption Modules, not normal plugins.
- */
-
-[generate_thunk]
-
-label Chrome {
-  M62 = 0.15
-};
-
-/**
- * <code>PPB_ContentDecryptor_Private</code> structure contains the function
- * pointers the browser must implement to support plugins implementing the
- * <code>PPP_ContentDecryptor_Private</code> interface. This interface provides
- * browser side support for the Content Decryption Module (CDM) for Encrypted
- * Media Extensions: http://www.w3.org/TR/encrypted-media/
- */
-interface PPB_ContentDecryptor_Private {
-  /**
-   * A promise has been resolved by the CDM.
-   *
-   * @param[in] promise_id Identifies the promise that the CDM resolved.
-   */
-  void PromiseResolved(
-      [in] PP_Instance instance,
-      [in] uint32_t promise_id);
-
-  /**
-   * A promise has been resolved by the CDM with a key status.
-   *
-   * @param[in] promise_id Identifies the promise that the CDM resolved.
-   *
-   * @param[in] key_status A <code>PP_KeyStatus</code> containing the key status
-   * the promise is resolved with.
-   */
-  void PromiseResolvedWithKeyStatus(
-      [in] PP_Instance instance,
-      [in] uint32_t promise_id,
-      [in] PP_CdmKeyStatus key_status);
-
-  /**
-   * A promise that resulted in a new session has been resolved by the CDM.
-   *
-   * @param[in] promise_id Identifies the promise that the CDM resolved.
-   *
-   * @param[in] session_id A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_STRING</code> containing the session's ID attribute.
-   */
-  void PromiseResolvedWithSession(
-      [in] PP_Instance instance,
-      [in] uint32_t promise_id,
-      [in] PP_Var session_id);
-
-
-  /**
-   * A promise has been rejected by the CDM due to an error.
-   *
-   * @param[in] promise_id Identifies the promise that the CDM rejected.
-   *
-   * @param[in] exception_code A <code>PP_CdmExceptionCode</code> containing
-   * the exception code.
-   *
-   * @param[in] system_code A system error code.
-   *
-   * @param[in] error_description A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_STRING</code> containing the error description.
-   */
-  void PromiseRejected(
-      [in] PP_Instance instance,
-      [in] uint32_t promise_id,
-      [in] PP_CdmExceptionCode exception_code,
-      [in] uint32_t system_code,
-      [in] PP_Var error_description);
-
-  /**
-   * A message or request has been generated for key_system in the CDM, and
-   * must be sent to the web application.
-   *
-   * For example, when the browser invokes <code>CreateSession()</code>
-   * on the <code>PPP_ContentDecryptor_Private</code> interface, the plugin
-   * must send a message containing the license request.
-   *
-   * Note that <code>SessionMessage()</code> can be used for purposes other than
-   * responses to <code>CreateSession()</code> calls. See also the text
-   * in the comment for <code>SessionReady()</code>, which describes a sequence
-   * of <code>UpdateSession()</code> and <code>SessionMessage()</code> calls
-   * required to prepare for decryption.
-   *
-   * @param[in] session_id A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_STRING</code> containing the ID of a session for
-   * which this message is intended.
-   *
-   * @param[in] message_type A <code>PP_CdmMessageType</code> containing the
-   * message type.
-   *
-   * @param[in] message A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_ARRAY_BUFFER</code> that contains the message.
-   *
-   * @param[in] legacy_destination_url A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_STRING</code> containing the destination URL for the
-   * message.
-   */
-  void SessionMessage(
-      [in] PP_Instance instance,
-      [in] PP_Var session_id,
-      [in] PP_CdmMessageType message_type,
-      [in] PP_Var message,
-      [in] PP_Var legacy_destination_url);
-
-  /**
-   * The keys for a session have changed.
-   *
-   * @param[in] session_id A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_STRING</code> containing the ID of the session that has
-   * a change in keys.
-   *
-   * @param[in] has_additional_usable_key A <code>PP_Bool</code> indicating if
-   * a new usable key has been added.
-   *
-   * @param[in] key_count The number of arguments contained in
-   * <code>key_information</code>
-   *
-   * @param[in] key_information An array of type <code>PP_KeyInformation</code>
-   * that are the session's key IDs and their status.
-   */
-  void SessionKeysChange(
-      [in] PP_Instance instance,
-      [in] PP_Var session_id,
-      [in] PP_Bool has_additional_usable_key,
-      [in] uint32_t key_count,
-      [in, size_as=key_count] PP_KeyInformation[] key_information);
-
-  /**
-   * The expiration time for a session has changed.
-   *
-   * @param[in] session_id A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_STRING</code> containing the ID of the session that has
-   * a new expiration time.
-   *
-   * @param[in] new_expiry_time A <code>PP_Time</code> indicating the new
-   * expiry time of the session. The value is defined as the number of seconds
-   * since the Epoch (00:00:00 UTC, January 1, 1970).
-   */
-  void SessionExpirationChange(
-      [in] PP_Instance instance,
-      [in] PP_Var session_id,
-      [in] PP_Time new_expiry_time);
-
-  /**
-   * The session has been closed as the result of a call to the
-   * <code>ReleaseSession()</code> method on the
-   * <code>PPP_ContentDecryptor_Private</code> interface, or due to other
-   * factors as determined by the CDM.
-   *
-   * @param[in] session_id A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_STRING</code> containing the session's ID attribute of
-   * the session that is now closed.
-   */
-  void SessionClosed(
-      [in] PP_Instance instance,
-      [in] PP_Var session_id);
-
-  /**
-   * An error occurred in a <code>PPP_ContentDecryptor_Private</code> method,
-   * or within the plugin implementing the interface.
-   *
-   * @param[in] session_id A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_STRING</code> containing the session's ID attribute of
-   * the session that caused the error.
-   *
-   * @param[in] exception_code A <code>PP_CdmExceptionCode</code> containing
-   * the exception code.
-   *
-   * @param[in] system_code A system error code.
-   *
-   * @param[in] error_description A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_STRING</code> containing the error description.
-   */
-  void LegacySessionError(
-      [in] PP_Instance instance,
-      [in] PP_Var session_id,
-      [in] PP_CdmExceptionCode exception_code,
-      [in] uint32_t system_code,
-      [in] PP_Var error_description);
-
-  /**
-   * Called after the <code>Decrypt()</code> method on the
-   * <code>PPP_ContentDecryptor_Private</code> interface completes to
-   * deliver decrypted_block to the browser for decoding and rendering.
-   *
-   * The plugin must not hold a reference to the encrypted buffer resource
-   * provided to <code>Decrypt()</code> when it calls this method. The browser
-   * will reuse the buffer in a subsequent <code>Decrypt()</code> call.
-   *
-   * @param[in] decrypted_block A <code>PP_Resource</code> corresponding to a
-   * <code>PPB_Buffer_Dev</code> resource that contains a decrypted data
-   * block.
-   *
-   * @param[in] decrypted_block_info A <code>PP_DecryptedBlockInfo</code> that
-   * contains the result code and tracking info associated with the
-   * <code>decrypted_block</code>.
-   */
-  void DeliverBlock(
-      [in] PP_Instance instance,
-      [in] PP_Resource decrypted_block,
-      [in] PP_DecryptedBlockInfo decrypted_block_info);
-
-  /**
-   * Called after the <code>InitializeAudioDecoder()</code> or
-   * <code>InitializeVideoDecoder()</code> method on the
-   * <code>PPP_ContentDecryptor_Private</code> interface completes to report
-   * decoder initialization status to the browser.
-   *
-   * @param[in] success A <code>PP_Bool</code> that is set to
-   * <code>PP_TRUE</code> when the decoder initialization request associated
-   * with <code>request_id</code> was successful.
-   *
-   * @param[in] decoder_type A <code>PP_DecryptorStreamType</code> identifying
-   * the decoder type for which this initialization status response was sent.
-   *
-   * @param[in] request_id The <code>request_id</code> value passed to
-   * <code>InitializeAudioDecoder</code> or <code>InitializeVideoDecoder</code>
-   * in <code>PP_AudioDecoderConfig</code> or
-   * <code>PP_VideoDecoderConfig</code>.
-   */
-  void DecoderInitializeDone(
-      [in] PP_Instance instance,
-      [in] PP_DecryptorStreamType decoder_type,
-      [in] uint32_t request_id,
-      [in] PP_Bool success);
-
-  /**
-   * Called after the <code>DeinitializeDecoder()</code> method on the
-   * <code>PPP_ContentDecryptor_Private</code> interface completes to report
-   * decoder de-initialization completion to the browser.
-   *
-   * @param[in] decoder_type The <code>PP_DecryptorStreamType</code> passed to
-   * <code>DeinitializeDecoder()</code>.
-   *
-   * @param[in] request_id The <code>request_id</code> value passed to
-   * <code>DeinitializeDecoder()</code>.
-   */
-  void DecoderDeinitializeDone(
-      [in] PP_Instance instance,
-      [in] PP_DecryptorStreamType decoder_type,
-      [in] uint32_t request_id);
-
-  /**
-   * Called after the <code>ResetDecoder()</code> method on the
-   * <code>PPP_ContentDecryptor_Private</code> interface completes to report
-   * decoder reset completion to the browser.
-   *
-   * @param[in] decoder_type The <code>PP_DecryptorStreamType</code> passed to
-   * <code>ResetDecoder()</code>.
-   *
-   * @param[in] request_id The <code>request_id</code> value passed to
-   * <code>ResetDecoder()</code>.
-   */
-  void DecoderResetDone(
-      [in] PP_Instance instance,
-      [in] PP_DecryptorStreamType decoder_type,
-      [in] uint32_t request_id);
-
-  /**
-   * Called after the <code>DecryptAndDecode()</code> method on the
-   * <code>PPP_ContentDecryptor_Private</code> interface completes to deliver
-   * a decrypted and decoded video frame to the browser for rendering.
-   *
-   * The plugin must not hold a reference to the encrypted buffer resource
-   * provided to <code>DecryptAndDecode()</code> when it calls this method. The
-   * browser will reuse the buffer in a subsequent
-   * <code>DecryptAndDecode()</code> call.
-   *
-   * @param[in] decrypted_frame A <code>PP_Resource</code> corresponding to a
-   * <code>PPB_Buffer_Dev</code> resource that contains a video frame.
-   *
-   * @param[in] decrypted_frame_info A <code>PP_DecryptedFrameInfo</code> that
-   * contains the result code, tracking info, and buffer format associated with
-   * <code>decrypted_frame</code>.
-   */
-  void DeliverFrame(
-      [in] PP_Instance instance,
-      [in] PP_Resource decrypted_frame,
-      [in] PP_DecryptedFrameInfo decrypted_frame_info);
-
-  /**
-   * Called after the <code>DecryptAndDecode()</code> method on the
-   * <code>PPP_ContentDecryptor_Private</code> interface completes to deliver
-   * a buffer of decrypted and decoded audio samples to the browser for
-   * rendering.
-   *
-   * The plugin must not hold a reference to the encrypted buffer resource
-   * provided to <code>DecryptAndDecode()</code> when it calls this method. The
-   * browser will reuse the buffer in a subsequent
-   * <code>DecryptAndDecode()</code> call.
-   *
-   * <code>audio_frames</code> can contain multiple audio output buffers. Each
-   * buffer is serialized in this format:
-   *
-   * |<------------------- serialized audio buffer ------------------->|
-   * | int64_t timestamp | int64_t length | length bytes of audio data |
-   *
-   * For example, with three audio output buffers, |audio_frames| will look
-   * like this:
-   *
-   * |<---------------- audio_frames ------------------>|
-   * | audio buffer 0 | audio buffer 1 | audio buffer 2 |
-   *
-   * @param[in] audio_frames A <code>PP_Resource</code> corresponding to a
-   * <code>PPB_Buffer_Dev</code> resource that contains a decrypted buffer
-   * of decoded audio samples.
-   *
-   * @param[in] decrypted_sample_info A <code>PP_DecryptedSampleInfo</code> that
-   * contains the tracking info and result code associated with the decrypted
-   * samples.
-   */
-  void DeliverSamples(
-      [in] PP_Instance instance,
-      [in] PP_Resource audio_frames,
-      [in] PP_DecryptedSampleInfo decrypted_sample_info);
-};
diff --git a/ppapi/api/private/ppp_content_decryptor_private.idl b/ppapi/api/private/ppp_content_decryptor_private.idl
deleted file mode 100644
index 53a2cc5..0000000
--- a/ppapi/api/private/ppp_content_decryptor_private.idl
+++ /dev/null
@@ -1,320 +0,0 @@
-/* Copyright (c) 2012 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/**
- * This file defines the <code>PPP_ContentDecryptor_Private</code>
- * interface. Note: This is a special interface, only to be used for Content
- * Decryption Modules, not normal plugins.
- */
-label Chrome {
-  M62 = 0.17
-};
-
-/**
- * <code>PPP_ContentDecryptor_Private</code> structure contains the function
- * pointers the decryption plugin must implement to provide services needed by
- * the browser. This interface provides the plugin side support for the Content
- * Decryption Module (CDM) for Encrypted Media Extensions:
- * http://www.w3.org/TR/encrypted-media/
- */
-interface PPP_ContentDecryptor_Private {
-  /**
-   * Initialize for the specified key system.
-   *
-   * @param[in] promise_id A reference for the promise that gets resolved or
-   * rejected depending upon the success or failure of initialization.
-   *
-   * @param[in] key_system A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_STRING</code> containing the name of the key system.
-   * @param[in] allow_distinctive_identifier Inform the CDM that it may use a
-   * distinctive identifier.
-   * @param[in] allow_persistent_state Inform the CDM that it may use persistent
-   * state.
-   */
-  void Initialize(
-      [in] PP_Instance instance,
-      [in] uint32_t promise_id,
-      [in] PP_Var key_system,
-      [in] PP_Bool allow_distinctive_identifier,
-      [in] PP_Bool allow_persistent_state);
-
-  /**
-   * Provides a server certificate to be used to encrypt messages to the
-   * license server.
-   *
-   * @param[in] promise_id A reference for the promise that gets resolved or
-   * rejected depending upon the success or failure of setting the certificate.
-   *
-   * @param[in] server_certificate A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_ARRAYBUFFER</code> containing the certificate to be used.
-   */
-  void SetServerCertificate(
-      [in] PP_Instance instance,
-      [in] uint32_t promise_id,
-      [in] PP_Var server_certificate);
-
-  /**
-   * Gets the key status for a policy with minimum HDCP version requirement.
-   * Gets the key status if there's a hypothetical key that requires the
-   * <code>min_hdcp_version</code>
-   *
-   * @param[in] promise_id A reference for the promise that gets resolved or
-   * rejected depending upon the success or failure of getting the key status.
-   *
-   * @param[in] min_hdcp_version A <code>PP_HdcpVersion</code> that indicates
-   * the minimum HDCP version required.
-   */
-  void GetStatusForPolicy(
-      [in] PP_Instance instance,
-      [in] uint32_t promise_id,
-      [in] PP_HdcpVersion min_hdcp_version);
-
-  /**
-   * Creates a session and subsequently generates a request for a license.
-   * <code>init_data_type</code> contains the MIME type of
-   * <code>init_data</code>. <code>init_data</code> is a data buffer
-   * containing data for use in generating the request.
-   *
-   * Note: <code>CreateSessionAndGenerateRequest()</code> must create a
-   * session ID and provide it to the browser via <code>SessionCreated()</code>
-   * on the <code>PPB_ContentDecryptor_Private</code> interface.
-   *
-   * @param[in] promise_id A reference for the promise that gets resolved or
-   * rejected depending upon the success or failure when creating the session.
-   *
-   * @param[in] session_type A <code>PP_SessionType</code> that indicates the
-   * type of session to be created.
-   *
-   * @param[in] init_data_type A <code>PP_InitDataType</code> that indicates
-   * the Initialization Data Type for init_data.
-   *
-   * @param[in] init_data A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_ARRAYBUFFER</code> containing container specific
-   * initialization data.
-   */
-  void CreateSessionAndGenerateRequest(
-      [in] PP_Instance instance,
-      [in] uint32_t promise_id,
-      [in] PP_SessionType session_type,
-      [in] PP_InitDataType init_data_type,
-      [in] PP_Var init_data);
-
-  /**
-   * Loads a session whose session ID is <code>session_id</code>.
-   *
-   * Note: After the session is successfully loaded, the CDM must call
-   * <code>SessionCreated()</code> with <code>session_id</code> on the
-   * <code>PPB_ContentDecryptor_Private</code> interface.
-   *
-   * @param[in] promise_id A reference for the promise that gets resolved or
-   * rejected depending upon the success or failure of loading the session.
-   *
-   * @param[in] session_type A <code>PP_SessionType</code> that indicates the
-   * type of session to be loaded.
-   *
-   * @param[in] session_id A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_STRING</code> containing the session ID of the session
-   * to load.
-   */
-  void LoadSession(
-      [in] PP_Instance instance,
-      [in] uint32_t promise_id,
-      [in] PP_SessionType session_type,
-      [in] PP_Var session_id);
-
-  /**
-   * Provides a license or other message to the decryptor.
-   *
-   * When the CDM needs more information, it must call
-   * <code>SessionMessage()</code> on the
-   * <code>PPB_ContentDecryptor_Private</code> interface, and the browser
-   * must notify the web application. When the CDM has finished processing
-   * <code>response</code> and needs no more information, it must call
-   * <code>SessionReady()</code> on the
-   * <code>PPB_ContentDecryptor_Private</code> interface, and the browser
-   * must notify the web application.
-   *
-   * @param[in] promise_id A reference for the promise that gets resolved or
-   * rejected depending upon the success or failure of updating the session.
-   *
-   * @param[in] session_id A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_STRING</code> containing the session ID of the session
-   * to be updated.
-   *
-   * @param[in] response A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_ARRAYBUFFER</code> containing the license or other
-   * message for the given session ID.
-   */
-  void UpdateSession(
-      [in] PP_Instance instance,
-      [in] uint32_t promise_id,
-      [in] PP_Var session_id,
-      [in] PP_Var response);
-
-  /**
-   * Close the specified session and related resources.
-   *
-   * @param[in] promise_id A reference for the promise that gets resolved or
-   * rejected depending upon the success or failure of closing the session.
-   *
-   * @param[in] session_id A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_STRING</code> containing the session ID of the session
-   * to be closed.
-   *
-   */
-  void CloseSession(
-      [in] PP_Instance instance,
-      [in] uint32_t promise_id,
-      [in] PP_Var session_id);
-
-  /**
-   * Remove stored data associated with this session.
-   *
-   * @param[in] promise_id A reference for the promise that gets resolved or
-   * rejected depending upon the success or failure of removing the session
-   * data.
-   *
-   * @param[in] session_id A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_STRING</code> containing the session ID of the session
-   * to be removed.
-   *
-   */
-  void RemoveSession(
-      [in] PP_Instance instance,
-      [in] uint32_t promise_id,
-      [in] PP_Var session_id);
-
-  /**
-   * Decrypts the block and returns the unencrypted block via
-   * <code>DeliverBlock()</code> on the
-   * <code>PPB_ContentDecryptor_Private</code> interface. The returned block
-   * contains encoded data.
-   *
-   * @param[in] resource A <code>PP_Resource</code> corresponding to a
-   * <code>PPB_Buffer_Dev</code> resource that contains an encrypted data
-   * block.
-   *
-   * @param[in] encrypted_block_info A <code>PP_EncryptedBlockInfo</code> that
-   * contains all auxiliary information needed for decryption of the
-   * <code>encrypted_block</code>.
-   */
-  void Decrypt(
-      [in] PP_Instance instance,
-      [in] PP_Resource encrypted_block,
-      [in] PP_EncryptedBlockInfo encrypted_block_info);
-
- /**
-  * Initializes the audio decoder using codec and settings in
-  * <code>decoder_config</code>, and returns the result of the initialization
-  * request to the browser using the <code>DecoderInitializeDone()</code> method
-  * on the <code>PPB_ContentDecryptor_Private</code> interface.
-  *
-  * @param[in] decoder_config A <code>PP_AudioDecoderConfig</code> that
-  * contains audio decoder settings and a request ID. The request ID is passed
-  * to the <code>DecoderInitializeDone()</code> method on the
-  * <code>PPB_ContentDecryptor_Private</code> interface to allow clients to
-  * associate the result with a audio decoder initialization request.
-  *
-  * @param[in] codec_extra_data A <code>PP_Resource</code> corresponding to a
-  * <code>PPB_Buffer_Dev</code> resource containing codec setup data required
-  * by some codecs. It should be set to 0 when the codec being initialized
-  * does not require it.
-  */
-  void InitializeAudioDecoder(
-      [in] PP_Instance instance,
-      [in] PP_AudioDecoderConfig decoder_config,
-      [in] PP_Resource codec_extra_data);
-
- /**
-  * Initializes the video decoder using codec and settings in
-  * <code>decoder_config</code>, and returns the result of the initialization
-  * request to the browser using the <code>DecoderInitializeDone()</code>
-  * method on the <code>PPB_ContentDecryptor_Private</code> interface.
-  *
-  * @param[in] decoder_config A <code>PP_VideoDecoderConfig</code> that
-  * contains video decoder settings and a request ID. The request ID is passed
-  * to the <code>DecoderInitializeDone()</code> method on the
-  * <code>PPB_ContentDecryptor_Private</code> interface to allow clients to
-  * associate the result with a video decoder initialization request.
-  *
-  * @param[in] codec_extra_data A <code>PP_Resource</code> corresponding to a
-  * <code>PPB_Buffer_Dev</code> resource containing codec setup data required
-  * by some codecs. It should be set to 0 when the codec being initialized
-  * does not require it.
-  */
-  void InitializeVideoDecoder(
-      [in] PP_Instance instance,
-      [in] PP_VideoDecoderConfig decoder_config,
-      [in] PP_Resource codec_extra_data);
-
-  /**
-   * De-initializes the decoder for the <code>PP_DecryptorStreamType</code>
-   * specified by <code>decoder_type</code> and sets it to an uninitialized
-   * state. The decoder can be re-initialized after de-initialization completes
-   * by calling <code>InitializeAudioDecoder</code> or
-   * <code>InitializeVideoDecoder</code>.
-   *
-   * De-initialization completion is reported to the browser using the
-   * <code>DecoderDeinitializeDone()</code> method on the
-   * <code>PPB_ContentDecryptor_Private</code> interface.
-   *
-   * @param[in] decoder_type A <code>PP_DecryptorStreamType</code> that
-   * specifies the decoder to de-initialize.
-   *
-   * @param[in] request_id A request ID that allows the browser to associate a
-   * request to de-initialize a decoder with the corresponding call to the
-   * <code>DecoderDeinitializeDone()</code> method on the
-   * <code>PPB_ContentDecryptor_Private</code> interface.
-   */
-  void DeinitializeDecoder(
-      [in] PP_Instance instance,
-      [in] PP_DecryptorStreamType decoder_type,
-      [in] uint32_t request_id);
-
-  /**
-   * Resets the decoder for the <code>PP_DecryptorStreamType</code> specified
-   * by <code>decoder_type</code> to an initialized clean state. Reset
-   * completion is reported to the browser using the
-   * <code>DecoderResetDone()</code> method on the
-   * <code>PPB_ContentDecryptor_Private</code> interface. This method can be
-   * used to signal a discontinuity in the encoded data stream, and is safe to
-   * call multiple times.
-   *
-   * @param[in] decoder_type A <code>PP_DecryptorStreamType</code> that
-   * specifies the decoder to reset.
-   *
-   * @param[in] request_id A request ID that allows the browser to associate a
-   * request to reset the decoder with a corresponding call to the
-   * <code>DecoderResetDone()</code> method on the
-   * <code>PPB_ContentDecryptor_Private</code> interface.
-   */
-  void ResetDecoder(
-      [in] PP_Instance instance,
-      [in] PP_DecryptorStreamType decoder_type,
-      [in] uint32_t request_id);
-
-  /**
-   * Decrypts encrypted_buffer, decodes it, and returns the unencrypted
-   * uncompressed (decoded) data to the browser via the
-   * <code>DeliverFrame()</code> or <code>DeliverSamples()</code> method on the
-   * <code>PPB_ContentDecryptor_Private</code> interface.
-   *
-   * @param[in] decoder_type A <code>PP_DecryptorStreamType</code> that
-   * specifies the decoder to use after <code>encrypted_buffer</code> is
-   * decrypted.
-   *
-   * @param[in] encrypted_buffer A <code>PP_Resource</code> corresponding to a
-   * <code>PPB_Buffer_Dev</code> resource that contains encrypted media data.
-   *
-   * @param[in] encrypted_block_info A <code>PP_EncryptedBlockInfo</code> that
-   * contains all auxiliary information needed for decryption of the
-   * <code>encrypted_block</code>.
-   */
-  void DecryptAndDecode(
-      [in] PP_Instance instance,
-      [in] PP_DecryptorStreamType decoder_type,
-      [in] PP_Resource encrypted_buffer,
-      [in] PP_EncryptedBlockInfo encrypted_block_info);
-};
diff --git a/ppapi/c/BUILD.gn b/ppapi/c/BUILD.gn
index 5c856c9..923616d 100644
--- a/ppapi/c/BUILD.gn
+++ b/ppapi/c/BUILD.gn
@@ -112,14 +112,12 @@
     "dev/ppp_video_decoder_dev.h",
 
     # Private interfaces.
-    "private/pp_content_decryptor.h",
     "private/pp_file_handle.h",
     "private/pp_private_font_charset.h",
     "private/pp_video_capture_format.h",
     "private/pp_video_frame_private.h",
     "private/ppb_camera_capabilities_private.h",
     "private/ppb_camera_device_private.h",
-    "private/ppb_content_decryptor_private.h",
     "private/ppb_display_color_profile_private.h",
     "private/ppb_ext_crx_file_system_private.h",
     "private/ppb_file_io_private.h",
@@ -151,7 +149,6 @@
     "private/ppb_video_destination_private.h",
     "private/ppb_video_source_private.h",
     "private/ppb_x509_certificate_private.h",
-    "private/ppp_content_decryptor_private.h",
     "private/ppp_find_private.h",
     "private/ppp_flash_browser_operations.h",
     "private/ppp_instance_private.h",
diff --git a/ppapi/c/private/pp_content_decryptor.h b/ppapi/c/private/pp_content_decryptor.h
deleted file mode 100644
index 5359d94d..0000000
--- a/ppapi/c/private/pp_content_decryptor.h
+++ /dev/null
@@ -1,568 +0,0 @@
-/* Copyright (c) 2012 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.
- */
-
-/* From private/pp_content_decryptor.idl modified Wed Jun 14 16:48:35 2017. */
-
-#ifndef PPAPI_C_PRIVATE_PP_CONTENT_DECRYPTOR_H_
-#define PPAPI_C_PRIVATE_PP_CONTENT_DECRYPTOR_H_
-
-#include "ppapi/c/pp_macros.h"
-#include "ppapi/c/pp_stdint.h"
-
-/**
- * @file
- * The <code>PP_DecryptTrackingInfo</code> struct contains necessary information
- * that can be used to associate the decrypted block with a decrypt request
- * and/or an input block.
- */
-
-
-/**
- * @addtogroup Structs
- * @{
- */
-struct PP_DecryptTrackingInfo {
-  /**
-   * Client-specified identifier for the associated decrypt request. By using
-   * this value, the client can associate the decrypted block with a decryption
-   * request.
-   */
-  uint32_t request_id;
-  /**
-   * A unique buffer ID to identify a PPB_Buffer_Dev. Unlike a PP_Resource,
-   * this ID is identical at both the renderer side and the plugin side.
-   * In <code>PPB_ContentDecryptor_Private</code> calls, this is the ID of the
-   * buffer associated with the decrypted block/frame/samples.
-   * In <code>PPP_ContentDecryptor_Private</code> calls, this is the ID of a
-   * buffer that is no longer need at the renderer side, which can be released
-   * or recycled by the plugin. This ID can be 0 if there is no buffer to be
-   * released or recycled.
-   */
-  uint32_t buffer_id;
-  /**
-   * Timestamp in microseconds of the associated block. By using this value,
-   * the client can associate the decrypted (and decoded) data with an input
-   * block. This is needed because buffers may be delivered out of order and
-   * not in response to the <code>request_id</code> they were provided with.
-   */
-  int64_t timestamp;
-};
-PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_DecryptTrackingInfo, 16);
-
-/**
- * The <code>PP_DecryptSubsampleDescription</code> struct contains information
- * to support subsample decryption.
- *
- * An input block can be split into several continuous subsamples.
- * A <code>PP_DecryptSubsampleEntry</code> specifies the number of clear and
- * cipher bytes in each subsample. For example, the following block has three
- * subsamples:
- *
- * |<----- subsample1 ----->|<----- subsample2 ----->|<----- subsample3 ----->|
- * |   clear1   |  cipher1  |  clear2  |   cipher2   | clear3 |    cipher3    |
- *
- * For decryption, all of the cipher bytes in a block should be treated as a
- * contiguous (in the subsample order) logical stream. The clear bytes should
- * not be considered as part of decryption.
- *
- * Logical stream to decrypt:   |  cipher1  |   cipher2   |    cipher3    |
- * Decrypted stream:            | decrypted1|  decrypted2 |   decrypted3  |
- *
- * After decryption, the decrypted bytes should be copied over the position
- * of the corresponding cipher bytes in the original block to form the output
- * block. Following the above example, the decrypted block should be:
- *
- * |<----- subsample1 ----->|<----- subsample2 ----->|<----- subsample3 ----->|
- * |   clear1   | decrypted1|  clear2  |  decrypted2 | clear3 |   decrypted3  |
- */
-struct PP_DecryptSubsampleDescription {
-  /**
-   * Size in bytes of clear data in a subsample entry.
-   */
-  uint32_t clear_bytes;
-  /**
-   * Size in bytes of encrypted data in a subsample entry.
-   */
-  uint32_t cipher_bytes;
-};
-PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_DecryptSubsampleDescription, 8);
-
-/**
- * The <code>PP_EncryptedBlockInfo</code> struct contains all the information
- * needed to decrypt an encrypted block.
- */
-struct PP_EncryptedBlockInfo {
-  /**
-   * Information needed by the client to track the block to be decrypted.
-   */
-  struct PP_DecryptTrackingInfo tracking_info;
-  /**
-   * Size in bytes of data to be decrypted (data_offset included).
-   */
-  uint32_t data_size;
-  /**
-   * Key ID of the block to be decrypted.
-   *
-   * For WebM the key ID can be as large as 2048 bytes in theory. But it's not
-   * used in current implementations. If we really need to support it, we should
-   * move key ID out as a separate parameter, e.g. as a <code>PP_Var</code>, or
-   * make the whole <code>PP_EncryptedBlockInfo</code> as a
-   * <code>PP_Resource</code>.
-   */
-  uint8_t key_id[64];
-  uint32_t key_id_size;
-  /**
-   * Initialization vector of the block to be decrypted.
-   */
-  uint8_t iv[16];
-  uint32_t iv_size;
-  /**
-   * Subsample information of the block to be decrypted.
-   *
-   * We need to have a fixed size of |subsamples| here. Choose 32 because it is
-   * sufficient for almost all real life scenarios. Note that in theory the
-   * number of subsamples could be larger than 32. If that happens, playback
-   * will fail.
-   */
-  struct PP_DecryptSubsampleDescription subsamples[32];
-  uint32_t num_subsamples;
-};
-PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_EncryptedBlockInfo, 368);
-/**
- * @}
- */
-
-/**
- * @addtogroup Enums
- * @{
- */
-/**
- * <code>PP_DecryptedFrameFormat</code> contains video frame formats.
- */
-typedef enum {
-  PP_DECRYPTEDFRAMEFORMAT_UNKNOWN = 0,
-  PP_DECRYPTEDFRAMEFORMAT_YV12 = 1,
-  PP_DECRYPTEDFRAMEFORMAT_I420 = 2
-} PP_DecryptedFrameFormat;
-PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_DecryptedFrameFormat, 4);
-
-/**
- * <code>PP_DecryptedSampleFormat</code> contains audio sample formats.
- */
-typedef enum {
-  PP_DECRYPTEDSAMPLEFORMAT_UNKNOWN = 0,
-  PP_DECRYPTEDSAMPLEFORMAT_U8 = 1,
-  PP_DECRYPTEDSAMPLEFORMAT_S16 = 2,
-  PP_DECRYPTEDSAMPLEFORMAT_S32 = 3,
-  PP_DECRYPTEDSAMPLEFORMAT_F32 = 4,
-  PP_DECRYPTEDSAMPLEFORMAT_PLANAR_S16 = 5,
-  PP_DECRYPTEDSAMPLEFORMAT_PLANAR_F32 = 6
-} PP_DecryptedSampleFormat;
-PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_DecryptedSampleFormat, 4);
-
-/**
- * The <code>PP_DecryptResult</code> enum contains decryption and decoding
- * result constants.
- */
-typedef enum {
-  /** The decryption (and/or decoding) operation finished successfully. */
-  PP_DECRYPTRESULT_SUCCESS = 0,
-  /** The decryptor did not have the necessary decryption key. */
-  PP_DECRYPTRESULT_DECRYPT_NOKEY = 1,
-  /** The input was accepted by the decoder but no frame(s) can be produced. */
-  PP_DECRYPTRESULT_NEEDMOREDATA = 2,
-  /** An unexpected error happened during decryption. */
-  PP_DECRYPTRESULT_DECRYPT_ERROR = 3,
-  /** An unexpected error happened during decoding. */
-  PP_DECRYPTRESULT_DECODE_ERROR = 4
-} PP_DecryptResult;
-PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_DecryptResult, 4);
-/**
- * @}
- */
-
-/**
- * @addtogroup Structs
- * @{
- */
-/**
- * <code>PP_DecryptedBlockInfo</code> struct contains the decryption result and
- * tracking info associated with the decrypted block.
- */
-struct PP_DecryptedBlockInfo {
-  /**
-   * Result of the decryption (and/or decoding) operation.
-   */
-  PP_DecryptResult result;
-  /**
-   * Size in bytes of decrypted data, which may be less than the size of the
-   * corresponding buffer.
-   */
-  uint32_t data_size;
-  /**
-   * Information needed by the client to track the block to be decrypted.
-   */
-  struct PP_DecryptTrackingInfo tracking_info;
-};
-PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_DecryptedBlockInfo, 24);
-/**
- * @}
- */
-
-/**
- * @addtogroup Enums
- * @{
- */
-/**
- * <code>PP_DecryptedFramePlanes</code> provides YUV plane index values for
- * accessing plane offsets stored in <code>PP_DecryptedFrameInfo</code>.
- */
-typedef enum {
-  PP_DECRYPTEDFRAMEPLANES_Y = 0,
-  PP_DECRYPTEDFRAMEPLANES_U = 1,
-  PP_DECRYPTEDFRAMEPLANES_V = 2
-} PP_DecryptedFramePlanes;
-PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_DecryptedFramePlanes, 4);
-/**
- * @}
- */
-
-/**
- * @addtogroup Structs
- * @{
- */
-/**
- * <code>PP_DecryptedFrameInfo</code> contains the result of the
- * decrypt and decode operation on the associated frame, information required
- * to access the frame data in buffer, and tracking info.
- */
-struct PP_DecryptedFrameInfo {
-  /**
-   * Result of the decrypt and decode operation.
-   */
-  PP_DecryptResult result;
-  /**
-   * Format of the decrypted frame.
-   */
-  PP_DecryptedFrameFormat format;
-  /**
-   * Offsets into the buffer resource for accessing video planes.
-   */
-  int32_t plane_offsets[3];
-  /**
-   * Stride of each plane.
-   */
-  int32_t strides[3];
-  /**
-   * Width of the video frame, in pixels.
-   */
-  int32_t width;
-  /**
-   * Height of the video frame, in pixels.
-   */
-  int32_t height;
-  /**
-   * Information needed by the client to track the decrypted frame.
-   */
-  struct PP_DecryptTrackingInfo tracking_info;
-};
-PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_DecryptedFrameInfo, 56);
-
-/**
- * <code>PP_DecryptedSampleInfo</code> contains the result of the
- * decrypt and decode operation on the associated samples, information required
- * to access the sample data in buffer, and tracking info.
- */
-struct PP_DecryptedSampleInfo {
-  /**
-   * Result of the decrypt and decode operation.
-   */
-  PP_DecryptResult result;
-  /**
-   * Format of the decrypted samples.
-   */
-  PP_DecryptedSampleFormat format;
-  /**
-   * Size in bytes of decrypted samples.
-   */
-  uint32_t data_size;
-  /**
-   * 4-byte padding to make the size of <code>PP_DecryptedSampleInfo</code>
-   * a multiple of 8 bytes. The value of this field should not be used.
-   */
-  uint32_t padding;
-  /**
-   * Information needed by the client to track the decrypted samples.
-   */
-  struct PP_DecryptTrackingInfo tracking_info;
-};
-PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_DecryptedSampleInfo, 32);
-/**
- * @}
- */
-
-/**
- * @addtogroup Enums
- * @{
- */
-/**
- * <code>PP_AudioCodec</code> contains audio codec type constants.
- */
-typedef enum {
-  PP_AUDIOCODEC_UNKNOWN = 0,
-  PP_AUDIOCODEC_VORBIS = 1,
-  PP_AUDIOCODEC_AAC = 2
-} PP_AudioCodec;
-PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_AudioCodec, 4);
-/**
- * @}
- */
-
-/**
- * @addtogroup Structs
- * @{
- */
-/**
- * <code>PP_AudioDecoderConfig</code> contains audio decoder configuration
- * information required to initialize audio decoders, and a request ID
- * that allows clients to associate a decoder initialization request with a
- * status response. Note: When <code>codec</code> requires extra data for
- * initialization, the data is sent as a <code>PP_Resource</code> carried
- * alongside <code>PP_AudioDecoderConfig</code>.
- */
-struct PP_AudioDecoderConfig {
-  /**
-   * The audio codec to initialize.
-   */
-  PP_AudioCodec codec;
-  /**
-   * Number of audio channels.
-   */
-  int32_t channel_count;
-  /**
-   * Size of each audio channel.
-   */
-  int32_t bits_per_channel;
-  /**
-   * Audio sampling rate.
-   */
-  int32_t samples_per_second;
-  /**
-   * Client-specified identifier for the associated audio decoder initialization
-   * request. By using this value, the client can associate a decoder
-   * initialization status response with an initialization request.
-   */
-  uint32_t request_id;
-};
-PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_AudioDecoderConfig, 20);
-/**
- * @}
- */
-
-/**
- * @addtogroup Enums
- * @{
- */
-/**
- * <code>PP_VideoCodec</code> contains video codec type constants.
- */
-typedef enum {
-  PP_VIDEOCODEC_UNKNOWN = 0,
-  PP_VIDEOCODEC_VP8 = 1,
-  PP_VIDEOCODEC_H264 = 2,
-  PP_VIDEOCODEC_VP9 = 3
-} PP_VideoCodec;
-PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_VideoCodec, 4);
-
-/**
- * <code>PP_VideoCodecProfile</code> contains video codec profile type
- * constants required for video decoder configuration.
- *.
- */
-typedef enum {
-  PP_VIDEOCODECPROFILE_UNKNOWN = 0,
-  PP_VIDEOCODECPROFILE_NOT_NEEDED = 1,
-  PP_VIDEOCODECPROFILE_H264_BASELINE = 2,
-  PP_VIDEOCODECPROFILE_H264_MAIN = 3,
-  PP_VIDEOCODECPROFILE_H264_EXTENDED = 4,
-  PP_VIDEOCODECPROFILE_H264_HIGH = 5,
-  PP_VIDEOCODECPROFILE_H264_HIGH_10 = 6,
-  PP_VIDEOCODECPROFILE_H264_HIGH_422 = 7,
-  PP_VIDEOCODECPROFILE_H264_HIGH_444_PREDICTIVE = 8
-} PP_VideoCodecProfile;
-PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_VideoCodecProfile, 4);
-/**
- * @}
- */
-
-/**
- * @addtogroup Structs
- * @{
- */
-/**
- * <code>PP_VideoDecoderConfig</code> contains video decoder configuration
- * information required to initialize video decoders, and a request ID
- * that allows clients to associate a decoder initialization request with a
- * status response. Note: When <code>codec</code> requires extra data for
- * initialization, the data is sent as a <code>PP_Resource</code> carried
- * alongside <code>PP_VideoDecoderConfig</code>.
- */
-struct PP_VideoDecoderConfig {
-  /**
-   * The video codec to initialize.
-   */
-  PP_VideoCodec codec;
-  /**
-   * Profile to use when initializing the video codec.
-   */
-  PP_VideoCodecProfile profile;
-  /**
-   * Output video format.
-   */
-  PP_DecryptedFrameFormat format;
-  /**
-   * Width of decoded video frames, in pixels.
-   */
-  int32_t width;
-  /**
-   * Height of decoded video frames, in pixels.
-   */
-  int32_t height;
-  /**
-   * Client-specified identifier for the associated video decoder initialization
-   * request. By using this value, the client can associate a decoder
-   * initialization status response with an initialization request.
-   */
-  uint32_t request_id;
-};
-PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_VideoDecoderConfig, 24);
-/**
- * @}
- */
-
-/**
- * @addtogroup Enums
- * @{
- */
-/**
- * <code>PP_HdcpVersion</code> contains HDCP version constants.
- */
-typedef enum {
-  PP_HDCPVERSION_NONE = 0,
-  PP_HDCPVERSION_1_0 = 1,
-  PP_HDCPVERSION_1_1 = 2,
-  PP_HDCPVERSION_1_2 = 3,
-  PP_HDCPVERSION_1_3 = 4,
-  PP_HDCPVERSION_1_4 = 5,
-  PP_HDCPVERSION_2_0 = 6,
-  PP_HDCPVERSION_2_1 = 7,
-  PP_HDCPVERSION_2_2 = 8,
-  PP_HDCPVERSION_MAX = PP_HDCPVERSION_2_2
-} PP_HdcpVersion;
-PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_HdcpVersion, 4);
-
-/**
- * <code>PP_DecryptorStreamType</code> contains stream type constants.
- */
-typedef enum {
-  PP_DECRYPTORSTREAMTYPE_AUDIO = 0,
-  PP_DECRYPTORSTREAMTYPE_VIDEO = 1,
-  PP_DECRYPTORSTREAMTYPE_MAX = PP_DECRYPTORSTREAMTYPE_VIDEO
-} PP_DecryptorStreamType;
-PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_DecryptorStreamType, 4);
-
-/**
- * <code>PP_SessionType</code> contains session type constants.
- */
-typedef enum {
-  PP_SESSIONTYPE_TEMPORARY = 0,
-  PP_SESSIONTYPE_PERSISTENT_LICENSE = 1,
-  PP_SESSIONTYPE_PERSISTENT_RELEASE = 2,
-  PP_SESSIONTYPE_MAX = PP_SESSIONTYPE_PERSISTENT_RELEASE
-} PP_SessionType;
-PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_SessionType, 4);
-
-/**
- * <code>PP_InitDataType</code> contains Initialization Data Type constants.
- */
-typedef enum {
-  PP_INITDATATYPE_CENC = 0,
-  PP_INITDATATYPE_KEYIDS = 1,
-  PP_INITDATATYPE_WEBM = 2,
-  PP_INITDATATYPE_MAX = PP_INITDATATYPE_WEBM
-} PP_InitDataType;
-PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_InitDataType, 4);
-
-/**
- * <code>PP_CdmExceptionCode</code> contains exception code constants.
- */
-typedef enum {
-  PP_CDMEXCEPTIONCODE_NOTSUPPORTEDERROR = 1,
-  PP_CDMEXCEPTIONCODE_INVALIDSTATEERROR = 2,
-  PP_CDMEXCEPTIONCODE_TYPEERROR = 3,
-  PP_CDMEXCEPTIONCODE_QUOTAEXCEEDEDERROR = 4,
-  PP_CDMEXCEPTIONCODE_MAX = PP_CDMEXCEPTIONCODE_QUOTAEXCEEDEDERROR
-} PP_CdmExceptionCode;
-PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_CdmExceptionCode, 4);
-
-/**
- * <code>PP_CdmMessageType</code> contains message type constants.
- */
-typedef enum {
-  PP_CDMMESSAGETYPE_LICENSE_REQUEST = 0,
-  PP_CDMMESSAGETYPE_LICENSE_RENEWAL = 1,
-  PP_CDMMESSAGETYPE_LICENSE_RELEASE = 2,
-  PP_CDMMESSAGETYPE_MAX = PP_CDMMESSAGETYPE_LICENSE_RELEASE
-} PP_CdmMessageType;
-PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_CdmMessageType, 4);
-
-/**
- * <code>PP_CdmKeyStatus</code> contains key status constants.
- */
-typedef enum {
-  PP_CDMKEYSTATUS_USABLE = 0,
-  PP_CDMKEYSTATUS_INVALID = 1,
-  PP_CDMKEYSTATUS_EXPIRED = 2,
-  PP_CDMKEYSTATUS_OUTPUTRESTRICTED = 3,
-  PP_CDMKEYSTATUS_OUTPUTDOWNSCALED = 4,
-  PP_CDMKEYSTATUS_STATUSPENDING = 5,
-  PP_CDMKEYSTATUS_RELEASED = 6,
-  PP_CDMKEYSTATUS_MAX = PP_CDMKEYSTATUS_RELEASED
-} PP_CdmKeyStatus;
-PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_CdmKeyStatus, 4);
-/**
- * @}
- */
-
-/**
- * @addtogroup Structs
- * @{
- */
-/**
- * The <code>PP_KeyInformation</code> struct contains information about a
- * key used for decryption.
- */
-struct PP_KeyInformation {
-  /**
-   * Key ID.
-   */
-  uint8_t key_id[512];
-  uint32_t key_id_size;
-  /**
-   * Status of this key.
-   */
-  PP_CdmKeyStatus key_status;
-  /**
-   * Optional error code for keys that are not usable.
-   */
-  uint32_t system_code;
-};
-PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_KeyInformation, 524);
-/**
- * @}
- */
-
-#endif  /* PPAPI_C_PRIVATE_PP_CONTENT_DECRYPTOR_H_ */
-
diff --git a/ppapi/c/private/ppb_content_decryptor_private.h b/ppapi/c/private/ppb_content_decryptor_private.h
deleted file mode 100644
index 1877a3d..0000000
--- a/ppapi/c/private/ppb_content_decryptor_private.h
+++ /dev/null
@@ -1,328 +0,0 @@
-/* Copyright (c) 2012 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.
- */
-
-/* From private/ppb_content_decryptor_private.idl,
- *   modified Mon Jul 17 14:47:07 2017.
- */
-
-#ifndef PPAPI_C_PRIVATE_PPB_CONTENT_DECRYPTOR_PRIVATE_H_
-#define PPAPI_C_PRIVATE_PPB_CONTENT_DECRYPTOR_PRIVATE_H_
-
-#include "ppapi/c/pp_bool.h"
-#include "ppapi/c/pp_instance.h"
-#include "ppapi/c/pp_macros.h"
-#include "ppapi/c/pp_resource.h"
-#include "ppapi/c/pp_stdint.h"
-#include "ppapi/c/pp_time.h"
-#include "ppapi/c/pp_var.h"
-#include "ppapi/c/private/pp_content_decryptor.h"
-
-#define PPB_CONTENTDECRYPTOR_PRIVATE_INTERFACE_0_15 \
-    "PPB_ContentDecryptor_Private;0.15"
-#define PPB_CONTENTDECRYPTOR_PRIVATE_INTERFACE \
-    PPB_CONTENTDECRYPTOR_PRIVATE_INTERFACE_0_15
-
-/**
- * @file
- * This file defines the <code>PPB_ContentDecryptor_Private</code>
- * interface. Note: This is a special interface, only to be used for Content
- * Decryption Modules, not normal plugins.
- */
-
-
-/**
- * @addtogroup Interfaces
- * @{
- */
-/**
- * <code>PPB_ContentDecryptor_Private</code> structure contains the function
- * pointers the browser must implement to support plugins implementing the
- * <code>PPP_ContentDecryptor_Private</code> interface. This interface provides
- * browser side support for the Content Decryption Module (CDM) for Encrypted
- * Media Extensions: http://www.w3.org/TR/encrypted-media/
- */
-struct PPB_ContentDecryptor_Private_0_15 {
-  /**
-   * A promise has been resolved by the CDM.
-   *
-   * @param[in] promise_id Identifies the promise that the CDM resolved.
-   */
-  void (*PromiseResolved)(PP_Instance instance, uint32_t promise_id);
-  /**
-   * A promise has been resolved by the CDM with a key status.
-   *
-   * @param[in] promise_id Identifies the promise that the CDM resolved.
-   *
-   * @param[in] key_status A <code>PP_KeyStatus</code> containing the key status
-   * the promise is resolved with.
-   */
-  void (*PromiseResolvedWithKeyStatus)(PP_Instance instance,
-                                       uint32_t promise_id,
-                                       PP_CdmKeyStatus key_status);
-  /**
-   * A promise that resulted in a new session has been resolved by the CDM.
-   *
-   * @param[in] promise_id Identifies the promise that the CDM resolved.
-   *
-   * @param[in] session_id A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_STRING</code> containing the session's ID attribute.
-   */
-  void (*PromiseResolvedWithSession)(PP_Instance instance,
-                                     uint32_t promise_id,
-                                     struct PP_Var session_id);
-  /**
-   * A promise has been rejected by the CDM due to an error.
-   *
-   * @param[in] promise_id Identifies the promise that the CDM rejected.
-   *
-   * @param[in] exception_code A <code>PP_CdmExceptionCode</code> containing
-   * the exception code.
-   *
-   * @param[in] system_code A system error code.
-   *
-   * @param[in] error_description A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_STRING</code> containing the error description.
-   */
-  void (*PromiseRejected)(PP_Instance instance,
-                          uint32_t promise_id,
-                          PP_CdmExceptionCode exception_code,
-                          uint32_t system_code,
-                          struct PP_Var error_description);
-  /**
-   * A message or request has been generated for key_system in the CDM, and
-   * must be sent to the web application.
-   *
-   * For example, when the browser invokes <code>CreateSession()</code>
-   * on the <code>PPP_ContentDecryptor_Private</code> interface, the plugin
-   * must send a message containing the license request.
-   *
-   * Note that <code>SessionMessage()</code> can be used for purposes other than
-   * responses to <code>CreateSession()</code> calls. See also the text
-   * in the comment for <code>SessionReady()</code>, which describes a sequence
-   * of <code>UpdateSession()</code> and <code>SessionMessage()</code> calls
-   * required to prepare for decryption.
-   *
-   * @param[in] session_id A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_STRING</code> containing the ID of a session for
-   * which this message is intended.
-   *
-   * @param[in] message_type A <code>PP_CdmMessageType</code> containing the
-   * message type.
-   *
-   * @param[in] message A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_ARRAY_BUFFER</code> that contains the message.
-   *
-   * @param[in] legacy_destination_url A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_STRING</code> containing the destination URL for the
-   * message.
-   */
-  void (*SessionMessage)(PP_Instance instance,
-                         struct PP_Var session_id,
-                         PP_CdmMessageType message_type,
-                         struct PP_Var message,
-                         struct PP_Var legacy_destination_url);
-  /**
-   * The keys for a session have changed.
-   *
-   * @param[in] session_id A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_STRING</code> containing the ID of the session that has
-   * a change in keys.
-   *
-   * @param[in] has_additional_usable_key A <code>PP_Bool</code> indicating if
-   * a new usable key has been added.
-   *
-   * @param[in] key_count The number of arguments contained in
-   * <code>key_information</code>
-   *
-   * @param[in] key_information An array of type <code>PP_KeyInformation</code>
-   * that are the session's key IDs and their status.
-   */
-  void (*SessionKeysChange)(PP_Instance instance,
-                            struct PP_Var session_id,
-                            PP_Bool has_additional_usable_key,
-                            uint32_t key_count,
-                            const struct PP_KeyInformation key_information[]);
-  /**
-   * The expiration time for a session has changed.
-   *
-   * @param[in] session_id A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_STRING</code> containing the ID of the session that has
-   * a new expiration time.
-   *
-   * @param[in] new_expiry_time A <code>PP_Time</code> indicating the new
-   * expiry time of the session. The value is defined as the number of seconds
-   * since the Epoch (00:00:00 UTC, January 1, 1970).
-   */
-  void (*SessionExpirationChange)(PP_Instance instance,
-                                  struct PP_Var session_id,
-                                  PP_Time new_expiry_time);
-  /**
-   * The session has been closed as the result of a call to the
-   * <code>ReleaseSession()</code> method on the
-   * <code>PPP_ContentDecryptor_Private</code> interface, or due to other
-   * factors as determined by the CDM.
-   *
-   * @param[in] session_id A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_STRING</code> containing the session's ID attribute of
-   * the session that is now closed.
-   */
-  void (*SessionClosed)(PP_Instance instance, struct PP_Var session_id);
-  /**
-   * An error occurred in a <code>PPP_ContentDecryptor_Private</code> method,
-   * or within the plugin implementing the interface.
-   *
-   * @param[in] session_id A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_STRING</code> containing the session's ID attribute of
-   * the session that caused the error.
-   *
-   * @param[in] exception_code A <code>PP_CdmExceptionCode</code> containing
-   * the exception code.
-   *
-   * @param[in] system_code A system error code.
-   *
-   * @param[in] error_description A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_STRING</code> containing the error description.
-   */
-  void (*LegacySessionError)(PP_Instance instance,
-                             struct PP_Var session_id,
-                             PP_CdmExceptionCode exception_code,
-                             uint32_t system_code,
-                             struct PP_Var error_description);
-  /**
-   * Called after the <code>Decrypt()</code> method on the
-   * <code>PPP_ContentDecryptor_Private</code> interface completes to
-   * deliver decrypted_block to the browser for decoding and rendering.
-   *
-   * The plugin must not hold a reference to the encrypted buffer resource
-   * provided to <code>Decrypt()</code> when it calls this method. The browser
-   * will reuse the buffer in a subsequent <code>Decrypt()</code> call.
-   *
-   * @param[in] decrypted_block A <code>PP_Resource</code> corresponding to a
-   * <code>PPB_Buffer_Dev</code> resource that contains a decrypted data
-   * block.
-   *
-   * @param[in] decrypted_block_info A <code>PP_DecryptedBlockInfo</code> that
-   * contains the result code and tracking info associated with the
-   * <code>decrypted_block</code>.
-   */
-  void (*DeliverBlock)(
-      PP_Instance instance,
-      PP_Resource decrypted_block,
-      const struct PP_DecryptedBlockInfo* decrypted_block_info);
-  /**
-   * Called after the <code>InitializeAudioDecoder()</code> or
-   * <code>InitializeVideoDecoder()</code> method on the
-   * <code>PPP_ContentDecryptor_Private</code> interface completes to report
-   * decoder initialization status to the browser.
-   *
-   * @param[in] success A <code>PP_Bool</code> that is set to
-   * <code>PP_TRUE</code> when the decoder initialization request associated
-   * with <code>request_id</code> was successful.
-   *
-   * @param[in] decoder_type A <code>PP_DecryptorStreamType</code> identifying
-   * the decoder type for which this initialization status response was sent.
-   *
-   * @param[in] request_id The <code>request_id</code> value passed to
-   * <code>InitializeAudioDecoder</code> or <code>InitializeVideoDecoder</code>
-   * in <code>PP_AudioDecoderConfig</code> or
-   * <code>PP_VideoDecoderConfig</code>.
-   */
-  void (*DecoderInitializeDone)(PP_Instance instance,
-                                PP_DecryptorStreamType decoder_type,
-                                uint32_t request_id,
-                                PP_Bool success);
-  /**
-   * Called after the <code>DeinitializeDecoder()</code> method on the
-   * <code>PPP_ContentDecryptor_Private</code> interface completes to report
-   * decoder de-initialization completion to the browser.
-   *
-   * @param[in] decoder_type The <code>PP_DecryptorStreamType</code> passed to
-   * <code>DeinitializeDecoder()</code>.
-   *
-   * @param[in] request_id The <code>request_id</code> value passed to
-   * <code>DeinitializeDecoder()</code>.
-   */
-  void (*DecoderDeinitializeDone)(PP_Instance instance,
-                                  PP_DecryptorStreamType decoder_type,
-                                  uint32_t request_id);
-  /**
-   * Called after the <code>ResetDecoder()</code> method on the
-   * <code>PPP_ContentDecryptor_Private</code> interface completes to report
-   * decoder reset completion to the browser.
-   *
-   * @param[in] decoder_type The <code>PP_DecryptorStreamType</code> passed to
-   * <code>ResetDecoder()</code>.
-   *
-   * @param[in] request_id The <code>request_id</code> value passed to
-   * <code>ResetDecoder()</code>.
-   */
-  void (*DecoderResetDone)(PP_Instance instance,
-                           PP_DecryptorStreamType decoder_type,
-                           uint32_t request_id);
-  /**
-   * Called after the <code>DecryptAndDecode()</code> method on the
-   * <code>PPP_ContentDecryptor_Private</code> interface completes to deliver
-   * a decrypted and decoded video frame to the browser for rendering.
-   *
-   * The plugin must not hold a reference to the encrypted buffer resource
-   * provided to <code>DecryptAndDecode()</code> when it calls this method. The
-   * browser will reuse the buffer in a subsequent
-   * <code>DecryptAndDecode()</code> call.
-   *
-   * @param[in] decrypted_frame A <code>PP_Resource</code> corresponding to a
-   * <code>PPB_Buffer_Dev</code> resource that contains a video frame.
-   *
-   * @param[in] decrypted_frame_info A <code>PP_DecryptedFrameInfo</code> that
-   * contains the result code, tracking info, and buffer format associated with
-   * <code>decrypted_frame</code>.
-   */
-  void (*DeliverFrame)(
-      PP_Instance instance,
-      PP_Resource decrypted_frame,
-      const struct PP_DecryptedFrameInfo* decrypted_frame_info);
-  /**
-   * Called after the <code>DecryptAndDecode()</code> method on the
-   * <code>PPP_ContentDecryptor_Private</code> interface completes to deliver
-   * a buffer of decrypted and decoded audio samples to the browser for
-   * rendering.
-   *
-   * The plugin must not hold a reference to the encrypted buffer resource
-   * provided to <code>DecryptAndDecode()</code> when it calls this method. The
-   * browser will reuse the buffer in a subsequent
-   * <code>DecryptAndDecode()</code> call.
-   *
-   * <code>audio_frames</code> can contain multiple audio output buffers. Each
-   * buffer is serialized in this format:
-   *
-   * |<------------------- serialized audio buffer ------------------->|
-   * | int64_t timestamp | int64_t length | length bytes of audio data |
-   *
-   * For example, with three audio output buffers, |audio_frames| will look
-   * like this:
-   *
-   * |<---------------- audio_frames ------------------>|
-   * | audio buffer 0 | audio buffer 1 | audio buffer 2 |
-   *
-   * @param[in] audio_frames A <code>PP_Resource</code> corresponding to a
-   * <code>PPB_Buffer_Dev</code> resource that contains a decrypted buffer
-   * of decoded audio samples.
-   *
-   * @param[in] decrypted_sample_info A <code>PP_DecryptedSampleInfo</code> that
-   * contains the tracking info and result code associated with the decrypted
-   * samples.
-   */
-  void (*DeliverSamples)(
-      PP_Instance instance,
-      PP_Resource audio_frames,
-      const struct PP_DecryptedSampleInfo* decrypted_sample_info);
-};
-
-typedef struct PPB_ContentDecryptor_Private_0_15 PPB_ContentDecryptor_Private;
-/**
- * @}
- */
-
-#endif  /* PPAPI_C_PRIVATE_PPB_CONTENT_DECRYPTOR_PRIVATE_H_ */
-
diff --git a/ppapi/c/private/ppp_content_decryptor_private.h b/ppapi/c/private/ppp_content_decryptor_private.h
deleted file mode 100644
index adef90d..0000000
--- a/ppapi/c/private/ppp_content_decryptor_private.h
+++ /dev/null
@@ -1,328 +0,0 @@
-/* Copyright (c) 2012 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.
- */
-
-/* From private/ppp_content_decryptor_private.idl,
- *   modified Mon Jul 17 14:47:07 2017.
- */
-
-#ifndef PPAPI_C_PRIVATE_PPP_CONTENT_DECRYPTOR_PRIVATE_H_
-#define PPAPI_C_PRIVATE_PPP_CONTENT_DECRYPTOR_PRIVATE_H_
-
-#include "ppapi/c/pp_bool.h"
-#include "ppapi/c/pp_instance.h"
-#include "ppapi/c/pp_macros.h"
-#include "ppapi/c/pp_resource.h"
-#include "ppapi/c/pp_stdint.h"
-#include "ppapi/c/pp_var.h"
-#include "ppapi/c/private/pp_content_decryptor.h"
-
-#define PPP_CONTENTDECRYPTOR_PRIVATE_INTERFACE_0_17 \
-    "PPP_ContentDecryptor_Private;0.17"
-#define PPP_CONTENTDECRYPTOR_PRIVATE_INTERFACE \
-    PPP_CONTENTDECRYPTOR_PRIVATE_INTERFACE_0_17
-
-/**
- * @file
- * This file defines the <code>PPP_ContentDecryptor_Private</code>
- * interface. Note: This is a special interface, only to be used for Content
- * Decryption Modules, not normal plugins.
- */
-
-
-/**
- * @addtogroup Interfaces
- * @{
- */
-/**
- * <code>PPP_ContentDecryptor_Private</code> structure contains the function
- * pointers the decryption plugin must implement to provide services needed by
- * the browser. This interface provides the plugin side support for the Content
- * Decryption Module (CDM) for Encrypted Media Extensions:
- * http://www.w3.org/TR/encrypted-media/
- */
-struct PPP_ContentDecryptor_Private_0_17 {
-  /**
-   * Initialize for the specified key system.
-   *
-   * @param[in] promise_id A reference for the promise that gets resolved or
-   * rejected depending upon the success or failure of initialization.
-   *
-   * @param[in] key_system A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_STRING</code> containing the name of the key system.
-   * @param[in] allow_distinctive_identifier Inform the CDM that it may use a
-   * distinctive identifier.
-   * @param[in] allow_persistent_state Inform the CDM that it may use persistent
-   * state.
-   */
-  void (*Initialize)(PP_Instance instance,
-                     uint32_t promise_id,
-                     struct PP_Var key_system,
-                     PP_Bool allow_distinctive_identifier,
-                     PP_Bool allow_persistent_state);
-  /**
-   * Provides a server certificate to be used to encrypt messages to the
-   * license server.
-   *
-   * @param[in] promise_id A reference for the promise that gets resolved or
-   * rejected depending upon the success or failure of setting the certificate.
-   *
-   * @param[in] server_certificate A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_ARRAYBUFFER</code> containing the certificate to be used.
-   */
-  void (*SetServerCertificate)(PP_Instance instance,
-                               uint32_t promise_id,
-                               struct PP_Var server_certificate);
-  /**
-   * Gets the key status for a policy with minimum HDCP version requirement.
-   * Gets the key status if there's a hypothetical key that requires the
-   * <code>min_hdcp_version</code>
-   *
-   * @param[in] promise_id A reference for the promise that gets resolved or
-   * rejected depending upon the success or failure of getting the key status.
-   *
-   * @param[in] min_hdcp_version A <code>PP_HdcpVersion</code> that indicates
-   * the minimum HDCP version required.
-   */
-  void (*GetStatusForPolicy)(PP_Instance instance,
-                             uint32_t promise_id,
-                             PP_HdcpVersion min_hdcp_version);
-  /**
-   * Creates a session and subsequently generates a request for a license.
-   * <code>init_data_type</code> contains the MIME type of
-   * <code>init_data</code>. <code>init_data</code> is a data buffer
-   * containing data for use in generating the request.
-   *
-   * Note: <code>CreateSessionAndGenerateRequest()</code> must create a
-   * session ID and provide it to the browser via <code>SessionCreated()</code>
-   * on the <code>PPB_ContentDecryptor_Private</code> interface.
-   *
-   * @param[in] promise_id A reference for the promise that gets resolved or
-   * rejected depending upon the success or failure when creating the session.
-   *
-   * @param[in] session_type A <code>PP_SessionType</code> that indicates the
-   * type of session to be created.
-   *
-   * @param[in] init_data_type A <code>PP_InitDataType</code> that indicates
-   * the Initialization Data Type for init_data.
-   *
-   * @param[in] init_data A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_ARRAYBUFFER</code> containing container specific
-   * initialization data.
-   */
-  void (*CreateSessionAndGenerateRequest)(PP_Instance instance,
-                                          uint32_t promise_id,
-                                          PP_SessionType session_type,
-                                          PP_InitDataType init_data_type,
-                                          struct PP_Var init_data);
-  /**
-   * Loads a session whose session ID is <code>session_id</code>.
-   *
-   * Note: After the session is successfully loaded, the CDM must call
-   * <code>SessionCreated()</code> with <code>session_id</code> on the
-   * <code>PPB_ContentDecryptor_Private</code> interface.
-   *
-   * @param[in] promise_id A reference for the promise that gets resolved or
-   * rejected depending upon the success or failure of loading the session.
-   *
-   * @param[in] session_type A <code>PP_SessionType</code> that indicates the
-   * type of session to be loaded.
-   *
-   * @param[in] session_id A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_STRING</code> containing the session ID of the session
-   * to load.
-   */
-  void (*LoadSession)(PP_Instance instance,
-                      uint32_t promise_id,
-                      PP_SessionType session_type,
-                      struct PP_Var session_id);
-  /**
-   * Provides a license or other message to the decryptor.
-   *
-   * When the CDM needs more information, it must call
-   * <code>SessionMessage()</code> on the
-   * <code>PPB_ContentDecryptor_Private</code> interface, and the browser
-   * must notify the web application. When the CDM has finished processing
-   * <code>response</code> and needs no more information, it must call
-   * <code>SessionReady()</code> on the
-   * <code>PPB_ContentDecryptor_Private</code> interface, and the browser
-   * must notify the web application.
-   *
-   * @param[in] promise_id A reference for the promise that gets resolved or
-   * rejected depending upon the success or failure of updating the session.
-   *
-   * @param[in] session_id A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_STRING</code> containing the session ID of the session
-   * to be updated.
-   *
-   * @param[in] response A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_ARRAYBUFFER</code> containing the license or other
-   * message for the given session ID.
-   */
-  void (*UpdateSession)(PP_Instance instance,
-                        uint32_t promise_id,
-                        struct PP_Var session_id,
-                        struct PP_Var response);
-  /**
-   * Close the specified session and related resources.
-   *
-   * @param[in] promise_id A reference for the promise that gets resolved or
-   * rejected depending upon the success or failure of closing the session.
-   *
-   * @param[in] session_id A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_STRING</code> containing the session ID of the session
-   * to be closed.
-   *
-   */
-  void (*CloseSession)(PP_Instance instance,
-                       uint32_t promise_id,
-                       struct PP_Var session_id);
-  /**
-   * Remove stored data associated with this session.
-   *
-   * @param[in] promise_id A reference for the promise that gets resolved or
-   * rejected depending upon the success or failure of removing the session
-   * data.
-   *
-   * @param[in] session_id A <code>PP_Var</code> of type
-   * <code>PP_VARTYPE_STRING</code> containing the session ID of the session
-   * to be removed.
-   *
-   */
-  void (*RemoveSession)(PP_Instance instance,
-                        uint32_t promise_id,
-                        struct PP_Var session_id);
-  /**
-   * Decrypts the block and returns the unencrypted block via
-   * <code>DeliverBlock()</code> on the
-   * <code>PPB_ContentDecryptor_Private</code> interface. The returned block
-   * contains encoded data.
-   *
-   * @param[in] resource A <code>PP_Resource</code> corresponding to a
-   * <code>PPB_Buffer_Dev</code> resource that contains an encrypted data
-   * block.
-   *
-   * @param[in] encrypted_block_info A <code>PP_EncryptedBlockInfo</code> that
-   * contains all auxiliary information needed for decryption of the
-   * <code>encrypted_block</code>.
-   */
-  void (*Decrypt)(PP_Instance instance,
-                  PP_Resource encrypted_block,
-                  const struct PP_EncryptedBlockInfo* encrypted_block_info);
-  /**
-   * Initializes the audio decoder using codec and settings in
-   * <code>decoder_config</code>, and returns the result of the initialization
-   * request to the browser using the <code>DecoderInitializeDone(
-      )</code> method
-   * on the <code>PPB_ContentDecryptor_Private</code> interface.
-   *
-   * @param[in] decoder_config A <code>PP_AudioDecoderConfig</code> that
-   * contains audio decoder settings and a request ID. The request ID is passed
-   * to the <code>DecoderInitializeDone()</code> method on the
-   * <code>PPB_ContentDecryptor_Private</code> interface to allow clients to
-   * associate the result with a audio decoder initialization request.
-   *
-   * @param[in] codec_extra_data A <code>PP_Resource</code> corresponding to a
-   * <code>PPB_Buffer_Dev</code> resource containing codec setup data required
-   * by some codecs. It should be set to 0 when the codec being initialized
-   * does not require it.
-   */
-  void (*InitializeAudioDecoder)(
-      PP_Instance instance,
-      const struct PP_AudioDecoderConfig* decoder_config,
-      PP_Resource codec_extra_data);
-  /**
-   * Initializes the video decoder using codec and settings in
-   * <code>decoder_config</code>, and returns the result of the initialization
-   * request to the browser using the <code>DecoderInitializeDone()</code>
-   * method on the <code>PPB_ContentDecryptor_Private</code> interface.
-   *
-   * @param[in] decoder_config A <code>PP_VideoDecoderConfig</code> that
-   * contains video decoder settings and a request ID. The request ID is passed
-   * to the <code>DecoderInitializeDone()</code> method on the
-   * <code>PPB_ContentDecryptor_Private</code> interface to allow clients to
-   * associate the result with a video decoder initialization request.
-   *
-   * @param[in] codec_extra_data A <code>PP_Resource</code> corresponding to a
-   * <code>PPB_Buffer_Dev</code> resource containing codec setup data required
-   * by some codecs. It should be set to 0 when the codec being initialized
-   * does not require it.
-   */
-  void (*InitializeVideoDecoder)(
-      PP_Instance instance,
-      const struct PP_VideoDecoderConfig* decoder_config,
-      PP_Resource codec_extra_data);
-  /**
-   * De-initializes the decoder for the <code>PP_DecryptorStreamType</code>
-   * specified by <code>decoder_type</code> and sets it to an uninitialized
-   * state. The decoder can be re-initialized after de-initialization completes
-   * by calling <code>InitializeAudioDecoder</code> or
-   * <code>InitializeVideoDecoder</code>.
-   *
-   * De-initialization completion is reported to the browser using the
-   * <code>DecoderDeinitializeDone()</code> method on the
-   * <code>PPB_ContentDecryptor_Private</code> interface.
-   *
-   * @param[in] decoder_type A <code>PP_DecryptorStreamType</code> that
-   * specifies the decoder to de-initialize.
-   *
-   * @param[in] request_id A request ID that allows the browser to associate a
-   * request to de-initialize a decoder with the corresponding call to the
-   * <code>DecoderDeinitializeDone()</code> method on the
-   * <code>PPB_ContentDecryptor_Private</code> interface.
-   */
-  void (*DeinitializeDecoder)(PP_Instance instance,
-                              PP_DecryptorStreamType decoder_type,
-                              uint32_t request_id);
-  /**
-   * Resets the decoder for the <code>PP_DecryptorStreamType</code> specified
-   * by <code>decoder_type</code> to an initialized clean state. Reset
-   * completion is reported to the browser using the
-   * <code>DecoderResetDone()</code> method on the
-   * <code>PPB_ContentDecryptor_Private</code> interface. This method can be
-   * used to signal a discontinuity in the encoded data stream, and is safe to
-   * call multiple times.
-   *
-   * @param[in] decoder_type A <code>PP_DecryptorStreamType</code> that
-   * specifies the decoder to reset.
-   *
-   * @param[in] request_id A request ID that allows the browser to associate a
-   * request to reset the decoder with a corresponding call to the
-   * <code>DecoderResetDone()</code> method on the
-   * <code>PPB_ContentDecryptor_Private</code> interface.
-   */
-  void (*ResetDecoder)(PP_Instance instance,
-                       PP_DecryptorStreamType decoder_type,
-                       uint32_t request_id);
-  /**
-   * Decrypts encrypted_buffer, decodes it, and returns the unencrypted
-   * uncompressed (decoded) data to the browser via the
-   * <code>DeliverFrame()</code> or <code>DeliverSamples()</code> method on the
-   * <code>PPB_ContentDecryptor_Private</code> interface.
-   *
-   * @param[in] decoder_type A <code>PP_DecryptorStreamType</code> that
-   * specifies the decoder to use after <code>encrypted_buffer</code> is
-   * decrypted.
-   *
-   * @param[in] encrypted_buffer A <code>PP_Resource</code> corresponding to a
-   * <code>PPB_Buffer_Dev</code> resource that contains encrypted media data.
-   *
-   * @param[in] encrypted_block_info A <code>PP_EncryptedBlockInfo</code> that
-   * contains all auxiliary information needed for decryption of the
-   * <code>encrypted_block</code>.
-   */
-  void (*DecryptAndDecode)(
-      PP_Instance instance,
-      PP_DecryptorStreamType decoder_type,
-      PP_Resource encrypted_buffer,
-      const struct PP_EncryptedBlockInfo* encrypted_block_info);
-};
-
-typedef struct PPP_ContentDecryptor_Private_0_17 PPP_ContentDecryptor_Private;
-/**
- * @}
- */
-
-#endif  /* PPAPI_C_PRIVATE_PPP_CONTENT_DECRYPTOR_PRIVATE_H_ */
-
diff --git a/ppapi/cpp/BUILD.gn b/ppapi/cpp/BUILD.gn
index 160d274..8b3e929 100644
--- a/ppapi/cpp/BUILD.gn
+++ b/ppapi/cpp/BUILD.gn
@@ -206,8 +206,6 @@
     "private/camera_capabilities_private.h",
     "private/camera_device_private.cc",
     "private/camera_device_private.h",
-    "private/content_decryptor_private.cc",
-    "private/content_decryptor_private.h",
     "private/ext_crx_file_system_private.cc",
     "private/ext_crx_file_system_private.h",
     "private/file_io_private.cc",
diff --git a/ppapi/cpp/private/content_decryptor_private.cc b/ppapi/cpp/private/content_decryptor_private.cc
deleted file mode 100644
index a3fed550..0000000
--- a/ppapi/cpp/private/content_decryptor_private.cc
+++ /dev/null
@@ -1,461 +0,0 @@
-// Copyright (c) 2012 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 "ppapi/cpp/private/content_decryptor_private.h"
-
-#include <cstring>  // memcpy
-
-#include "ppapi/c/ppb_var.h"
-#include "ppapi/c/private/ppb_content_decryptor_private.h"
-#include "ppapi/c/private/ppp_content_decryptor_private.h"
-#include "ppapi/cpp/instance.h"
-#include "ppapi/cpp/instance_handle.h"
-#include "ppapi/cpp/logging.h"
-#include "ppapi/cpp/module.h"
-#include "ppapi/cpp/module_impl.h"
-#include "ppapi/cpp/var.h"
-#include "ppapi/cpp/var_array.h"
-
-namespace pp {
-
-namespace {
-
-static const char kPPPContentDecryptorInterface[] =
-    PPP_CONTENTDECRYPTOR_PRIVATE_INTERFACE;
-
-void Initialize(PP_Instance instance,
-                uint32_t promise_id,
-                PP_Var key_system_arg,
-                PP_Bool allow_distinctive_identifier,
-                PP_Bool allow_persistent_state) {
-  void* object =
-      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
-  if (!object)
-    return;
-
-  pp::Var key_system_var(pp::PASS_REF, key_system_arg);
-  if (!key_system_var.is_string())
-    return;
-
-  static_cast<ContentDecryptor_Private*>(object)
-      ->Initialize(promise_id, key_system_var.AsString(),
-                   PP_ToBool(allow_distinctive_identifier),
-                   PP_ToBool(allow_persistent_state));
-}
-
-void SetServerCertificate(PP_Instance instance,
-                          uint32_t promise_id,
-                          PP_Var server_certificate_arg) {
-  void* object =
-      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
-  if (!object)
-    return;
-
-  pp::Var server_certificate_var(server_certificate_arg);
-  if (!server_certificate_var.is_array_buffer())
-    return;
-  pp::VarArrayBuffer server_certificate(server_certificate_var);
-
-  static_cast<ContentDecryptor_Private*>(object)
-      ->SetServerCertificate(promise_id, server_certificate);
-}
-
-void GetStatusForPolicy(PP_Instance instance,
-                        uint32_t promise_id,
-                        PP_HdcpVersion min_hdcp_version) {
-  void* object =
-      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
-  if (!object)
-    return;
-
-  static_cast<ContentDecryptor_Private*>(object)->GetStatusForPolicy(
-      promise_id, min_hdcp_version);
-}
-
-void CreateSessionAndGenerateRequest(PP_Instance instance,
-                                     uint32_t promise_id,
-                                     PP_SessionType session_type,
-                                     PP_InitDataType init_data_type,
-                                     PP_Var init_data_arg) {
-  void* object =
-      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
-  if (!object)
-    return;
-
-  pp::Var init_data_var(pp::PASS_REF, init_data_arg);
-  if (!init_data_var.is_array_buffer())
-    return;
-  pp::VarArrayBuffer init_data_array_buffer(init_data_var);
-
-  static_cast<ContentDecryptor_Private*>(object)
-      ->CreateSessionAndGenerateRequest(promise_id, session_type,
-                                        init_data_type, init_data_array_buffer);
-}
-
-void LoadSession(PP_Instance instance,
-                 uint32_t promise_id,
-                 PP_SessionType session_type,
-                 PP_Var session_id_arg) {
-  void* object =
-      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
-  if (!object)
-    return;
-
-  pp::Var session_id_var(session_id_arg);
-  if (!session_id_var.is_string())
-    return;
-
-  static_cast<ContentDecryptor_Private*>(object)
-      ->LoadSession(promise_id, session_type, session_id_var.AsString());
-}
-
-void UpdateSession(PP_Instance instance,
-                   uint32_t promise_id,
-                   PP_Var session_id_arg,
-                   PP_Var response_arg) {
-  void* object =
-      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
-  if (!object)
-    return;
-
-  pp::Var session_id_var(session_id_arg);
-  if (!session_id_var.is_string())
-    return;
-
-  pp::Var response_var(response_arg);
-  if (!response_var.is_array_buffer())
-    return;
-  pp::VarArrayBuffer response(response_var);
-
-  static_cast<ContentDecryptor_Private*>(object)
-      ->UpdateSession(promise_id, session_id_var.AsString(), response);
-}
-
-void CloseSession(PP_Instance instance,
-                  uint32_t promise_id,
-                  PP_Var session_id_arg) {
-  void* object =
-      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
-  if (!object)
-    return;
-
-  pp::Var session_id_var(session_id_arg);
-  if (!session_id_var.is_string())
-    return;
-
-  static_cast<ContentDecryptor_Private*>(object)
-      ->CloseSession(promise_id, session_id_var.AsString());
-}
-
-void RemoveSession(PP_Instance instance,
-                   uint32_t promise_id,
-                   PP_Var session_id_arg) {
-  void* object =
-      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
-  if (!object)
-    return;
-
-  pp::Var session_id_var(session_id_arg);
-  if (!session_id_var.is_string())
-    return;
-
-  static_cast<ContentDecryptor_Private*>(object)
-      ->RemoveSession(promise_id, session_id_var.AsString());
-}
-
-void Decrypt(PP_Instance instance,
-             PP_Resource encrypted_resource,
-             const PP_EncryptedBlockInfo* encrypted_block_info) {
-  pp::Buffer_Dev encrypted_block(encrypted_resource);
-
-  void* object =
-      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
-  if (!object)
-    return;
-
-  static_cast<ContentDecryptor_Private*>(object)->Decrypt(
-      encrypted_block,
-      *encrypted_block_info);
-}
-
-void InitializeAudioDecoder(
-    PP_Instance instance,
-    const PP_AudioDecoderConfig* decoder_config,
-    PP_Resource extra_data_resource) {
-  pp::Buffer_Dev extra_data_buffer(extra_data_resource);
-
-  void* object =
-      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
-  if (!object)
-    return;
-
-  static_cast<ContentDecryptor_Private*>(object)->InitializeAudioDecoder(
-      *decoder_config,
-      extra_data_buffer);
-}
-
-void InitializeVideoDecoder(
-    PP_Instance instance,
-    const PP_VideoDecoderConfig* decoder_config,
-    PP_Resource extra_data_resource) {
-  pp::Buffer_Dev extra_data_buffer(extra_data_resource);
-
-  void* object =
-      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
-  if (!object)
-    return;
-
-  static_cast<ContentDecryptor_Private*>(object)->InitializeVideoDecoder(
-      *decoder_config,
-      extra_data_buffer);
-}
-
-void DeinitializeDecoder(PP_Instance instance,
-                         PP_DecryptorStreamType decoder_type,
-                         uint32_t request_id) {
-  void* object =
-      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
-  if (!object)
-    return;
-  static_cast<ContentDecryptor_Private*>(object)->DeinitializeDecoder(
-      decoder_type,
-      request_id);
-}
-
-void ResetDecoder(PP_Instance instance,
-                  PP_DecryptorStreamType decoder_type,
-                  uint32_t request_id) {
-  void* object =
-      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
-  if (!object)
-    return;
-  static_cast<ContentDecryptor_Private*>(object)->ResetDecoder(decoder_type,
-                                                               request_id);
-}
-
-void DecryptAndDecode(PP_Instance instance,
-                      PP_DecryptorStreamType decoder_type,
-                      PP_Resource encrypted_resource,
-                      const PP_EncryptedBlockInfo* encrypted_block_info) {
-  pp::Buffer_Dev encrypted_buffer(encrypted_resource);
-
-  void* object =
-      Instance::GetPerInstanceObject(instance, kPPPContentDecryptorInterface);
-  if (!object)
-    return;
-
-  static_cast<ContentDecryptor_Private*>(object)->DecryptAndDecode(
-      decoder_type,
-      encrypted_buffer,
-      *encrypted_block_info);
-}
-
-const PPP_ContentDecryptor_Private ppp_content_decryptor = {
-    &Initialize,
-    &SetServerCertificate,
-    &GetStatusForPolicy,
-    &CreateSessionAndGenerateRequest,
-    &LoadSession,
-    &UpdateSession,
-    &CloseSession,
-    &RemoveSession,
-    &Decrypt,
-    &InitializeAudioDecoder,
-    &InitializeVideoDecoder,
-    &DeinitializeDecoder,
-    &ResetDecoder,
-    &DecryptAndDecode};
-
-template <> const char* interface_name<PPB_ContentDecryptor_Private>() {
-  return PPB_CONTENTDECRYPTOR_PRIVATE_INTERFACE;
-}
-
-}  // namespace
-
-ContentDecryptor_Private::ContentDecryptor_Private(Instance* instance)
-    : associated_instance_(instance) {
-  Module::Get()->AddPluginInterface(kPPPContentDecryptorInterface,
-                                    &ppp_content_decryptor);
-  instance->AddPerInstanceObject(kPPPContentDecryptorInterface, this);
-}
-
-ContentDecryptor_Private::~ContentDecryptor_Private() {
-  Instance::RemovePerInstanceObject(associated_instance_,
-                                    kPPPContentDecryptorInterface,
-                                    this);
-}
-
-void ContentDecryptor_Private::PromiseResolved(uint32_t promise_id) {
-  if (has_interface<PPB_ContentDecryptor_Private>()) {
-    get_interface<PPB_ContentDecryptor_Private>()->PromiseResolved(
-        associated_instance_.pp_instance(), promise_id);
-  }
-}
-
-void ContentDecryptor_Private::PromiseResolvedWithKeyStatus(
-    uint32_t promise_id,
-    PP_CdmKeyStatus key_status) {
-  if (has_interface<PPB_ContentDecryptor_Private>()) {
-    get_interface<PPB_ContentDecryptor_Private>()->PromiseResolvedWithKeyStatus(
-        associated_instance_.pp_instance(), promise_id, key_status);
-  }
-}
-
-void ContentDecryptor_Private::PromiseResolvedWithSession(
-    uint32_t promise_id,
-    const std::string& session_id) {
-  if (has_interface<PPB_ContentDecryptor_Private>()) {
-    pp::Var session_id_var(session_id);
-    get_interface<PPB_ContentDecryptor_Private>()->PromiseResolvedWithSession(
-        associated_instance_.pp_instance(), promise_id,
-        session_id_var.pp_var());
-  }
-}
-
-void ContentDecryptor_Private::PromiseRejected(
-    uint32_t promise_id,
-    PP_CdmExceptionCode exception_code,
-    uint32_t system_code,
-    const std::string& error_description) {
-  if (has_interface<PPB_ContentDecryptor_Private>()) {
-    pp::Var error_description_var(error_description);
-    get_interface<PPB_ContentDecryptor_Private>()->PromiseRejected(
-        associated_instance_.pp_instance(),
-        promise_id,
-        exception_code,
-        system_code,
-        error_description_var.pp_var());
-  }
-}
-
-void ContentDecryptor_Private::SessionMessage(
-    const std::string& session_id,
-    PP_CdmMessageType message_type,
-    pp::VarArrayBuffer message,
-    const std::string& legacy_destination_url) {
-  if (has_interface<PPB_ContentDecryptor_Private>()) {
-    pp::Var session_id_var(session_id);
-    pp::Var legacy_destination_url_var(legacy_destination_url);
-    get_interface<PPB_ContentDecryptor_Private>()->SessionMessage(
-        associated_instance_.pp_instance(), session_id_var.pp_var(),
-        message_type, message.pp_var(), legacy_destination_url_var.pp_var());
-  }
-}
-
-void ContentDecryptor_Private::SessionKeysChange(
-    const std::string& session_id,
-    bool has_additional_usable_key,
-    const std::vector<PP_KeyInformation>& key_information) {
-  if (has_interface<PPB_ContentDecryptor_Private>()) {
-    pp::Var session_id_var(session_id);
-    get_interface<PPB_ContentDecryptor_Private>()->SessionKeysChange(
-        associated_instance_.pp_instance(), session_id_var.pp_var(),
-        PP_FromBool(has_additional_usable_key),
-        static_cast<uint32_t>(key_information.size()),
-        key_information.empty() ? NULL : &key_information[0]);
-  }
-}
-
-void ContentDecryptor_Private::SessionExpirationChange(
-    const std::string& session_id,
-    PP_Time new_expiry_time) {
-  if (has_interface<PPB_ContentDecryptor_Private>()) {
-    pp::Var session_id_var(session_id);
-    get_interface<PPB_ContentDecryptor_Private>()->SessionExpirationChange(
-        associated_instance_.pp_instance(), session_id_var.pp_var(),
-        new_expiry_time);
-  }
-}
-
-void ContentDecryptor_Private::SessionClosed(const std::string& session_id) {
-  if (has_interface<PPB_ContentDecryptor_Private>()) {
-    pp::Var session_id_var(session_id);
-    get_interface<PPB_ContentDecryptor_Private>()->SessionClosed(
-        associated_instance_.pp_instance(), session_id_var.pp_var());
-  }
-}
-
-void ContentDecryptor_Private::LegacySessionError(
-    const std::string& session_id,
-    PP_CdmExceptionCode exception_code,
-    uint32_t system_code,
-    const std::string& error_description) {
-  if (has_interface<PPB_ContentDecryptor_Private>()) {
-    pp::Var session_id_var(session_id);
-    pp::Var error_description_var(error_description);
-    get_interface<PPB_ContentDecryptor_Private>()->LegacySessionError(
-        associated_instance_.pp_instance(), session_id_var.pp_var(),
-        exception_code, system_code, error_description_var.pp_var());
-  }
-}
-
-void ContentDecryptor_Private::DeliverBlock(
-    pp::Buffer_Dev decrypted_block,
-    const PP_DecryptedBlockInfo& decrypted_block_info) {
-  if (has_interface<PPB_ContentDecryptor_Private>()) {
-    get_interface<PPB_ContentDecryptor_Private>()->DeliverBlock(
-        associated_instance_.pp_instance(),
-        decrypted_block.pp_resource(),
-        &decrypted_block_info);
-  }
-}
-
-void ContentDecryptor_Private::DecoderInitializeDone(
-    PP_DecryptorStreamType decoder_type,
-    uint32_t request_id,
-    bool success) {
-  if (has_interface<PPB_ContentDecryptor_Private>()) {
-    get_interface<PPB_ContentDecryptor_Private>()->DecoderInitializeDone(
-        associated_instance_.pp_instance(),
-        decoder_type,
-        request_id,
-        PP_FromBool(success));
-  }
-}
-
-void ContentDecryptor_Private::DecoderDeinitializeDone(
-    PP_DecryptorStreamType decoder_type,
-    uint32_t request_id) {
-  if (has_interface<PPB_ContentDecryptor_Private>()) {
-    get_interface<PPB_ContentDecryptor_Private>()->DecoderDeinitializeDone(
-        associated_instance_.pp_instance(),
-        decoder_type,
-        request_id);
-  }
-}
-
-void ContentDecryptor_Private::DecoderResetDone(
-    PP_DecryptorStreamType decoder_type,
-    uint32_t request_id) {
-  if (has_interface<PPB_ContentDecryptor_Private>()) {
-    get_interface<PPB_ContentDecryptor_Private>()->DecoderResetDone(
-        associated_instance_.pp_instance(),
-        decoder_type,
-        request_id);
-  }
-}
-
-void ContentDecryptor_Private::DeliverFrame(
-    pp::Buffer_Dev decrypted_frame,
-    const PP_DecryptedFrameInfo& decrypted_frame_info) {
-  if (has_interface<PPB_ContentDecryptor_Private>()) {
-    get_interface<PPB_ContentDecryptor_Private>()->DeliverFrame(
-        associated_instance_.pp_instance(),
-        decrypted_frame.pp_resource(),
-        &decrypted_frame_info);
-  }
-}
-
-void ContentDecryptor_Private::DeliverSamples(
-    pp::Buffer_Dev audio_frames,
-    const PP_DecryptedSampleInfo& decrypted_sample_info) {
-  if (has_interface<PPB_ContentDecryptor_Private>()) {
-    get_interface<PPB_ContentDecryptor_Private>()->DeliverSamples(
-        associated_instance_.pp_instance(),
-        audio_frames.pp_resource(),
-        &decrypted_sample_info);
-  }
-}
-
-}  // namespace pp
diff --git a/ppapi/cpp/private/content_decryptor_private.h b/ppapi/cpp/private/content_decryptor_private.h
deleted file mode 100644
index 49a0452..0000000
--- a/ppapi/cpp/private/content_decryptor_private.h
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright (c) 2012 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 PPAPI_CPP_PRIVATE_CONTENT_DECRYPTOR_PRIVATE_H_
-#define PPAPI_CPP_PRIVATE_CONTENT_DECRYPTOR_PRIVATE_H_
-
-#include <stdint.h>
-
-#include <string>
-#include <vector>
-
-#include "ppapi/c/private/pp_content_decryptor.h"
-#include "ppapi/c/private/ppb_content_decryptor_private.h"
-#include "ppapi/c/private/ppp_content_decryptor_private.h"
-#include "ppapi/cpp/dev/buffer_dev.h"
-#include "ppapi/cpp/instance_handle.h"
-#include "ppapi/cpp/var.h"
-#include "ppapi/cpp/var_array_buffer.h"
-
-namespace pp {
-
-class Instance;
-
-// TODO(tomfinegan): Remove redundant pp:: usage, and pass VarArrayBuffers as
-// const references.
-
-class ContentDecryptor_Private {
- public:
-  explicit ContentDecryptor_Private(Instance* instance);
-  virtual ~ContentDecryptor_Private();
-
-  // PPP_ContentDecryptor_Private functions exposed as virtual functions
-  // for you to override.
-  // TODO(tomfinegan): This could be optimized to pass pp::Var instead of
-  // strings. The change would allow the CDM wrapper to reuse vars when
-  // replying to the browser.
-  virtual void Initialize(uint32_t promise_id,
-                          const std::string& key_system,
-                          bool allow_distinctive_identifier,
-                          bool allow_persistent_state) = 0;
-  virtual void SetServerCertificate(uint32_t promise_id,
-                                    pp::VarArrayBuffer server_certificate) = 0;
-  virtual void GetStatusForPolicy(uint32_t promise_id,
-                                  PP_HdcpVersion min_hdcp_version) = 0;
-  virtual void CreateSessionAndGenerateRequest(
-      uint32_t promise_id,
-      PP_SessionType session_type,
-      PP_InitDataType init_data_type,
-      pp::VarArrayBuffer init_data) = 0;
-  virtual void LoadSession(uint32_t promise_id,
-                           PP_SessionType session_type,
-                           const std::string& session_id) = 0;
-  virtual void UpdateSession(uint32_t promise_id,
-                             const std::string& session_id,
-                             pp::VarArrayBuffer response) = 0;
-  virtual void CloseSession(uint32_t promise_id,
-                            const std::string& session_id) = 0;
-  virtual void RemoveSession(uint32_t promise_id,
-                             const std::string& session_id) = 0;
-  virtual void Decrypt(pp::Buffer_Dev encrypted_buffer,
-                       const PP_EncryptedBlockInfo& encrypted_block_info) = 0;
-  virtual void InitializeAudioDecoder(
-      const PP_AudioDecoderConfig& decoder_config,
-      pp::Buffer_Dev extra_data_resource) = 0;
-  virtual void InitializeVideoDecoder(
-      const PP_VideoDecoderConfig& decoder_config,
-      pp::Buffer_Dev extra_data_resource) = 0;
-  virtual void DeinitializeDecoder(PP_DecryptorStreamType decoder_type,
-                                   uint32_t request_id) = 0;
-  virtual void ResetDecoder(PP_DecryptorStreamType decoder_type,
-                            uint32_t request_id) = 0;
-  // Null |encrypted_frame| means end-of-stream buffer.
-  virtual void DecryptAndDecode(
-      PP_DecryptorStreamType decoder_type,
-      pp::Buffer_Dev encrypted_buffer,
-      const PP_EncryptedBlockInfo& encrypted_block_info) = 0;
-
-  // PPB_ContentDecryptor_Private methods for passing data from the decryptor
-  // to the browser.
-  void PromiseResolved(uint32_t promise_id);
-  void PromiseResolvedWithKeyStatus(uint32_t promise_id,
-                                    PP_CdmKeyStatus key_status);
-  void PromiseResolvedWithSession(uint32_t promise_id,
-                                  const std::string& session_id);
-  void PromiseRejected(uint32_t promise_id,
-                       PP_CdmExceptionCode exception_code,
-                       uint32_t system_code,
-                       const std::string& error_description);
-  void SessionMessage(const std::string& session_id,
-                      PP_CdmMessageType message_type,
-                      pp::VarArrayBuffer message,
-                      const std::string& legacy_destination_url);
-  void SessionKeysChange(const std::string& session_id,
-                         bool has_additional_usable_key,
-                         const std::vector<PP_KeyInformation>& key_information);
-  void SessionExpirationChange(const std::string& session_id,
-                               PP_Time new_expiry_time);
-  void SessionClosed(const std::string& session_id);
-  void LegacySessionError(const std::string& session_id,
-                          PP_CdmExceptionCode exception_code,
-                          uint32_t system_code,
-                          const std::string& error_description);
-
-  // The plugin must not hold a reference to the encrypted buffer resource
-  // provided to Decrypt() when it calls this method. The browser will reuse
-  // the buffer in a subsequent Decrypt() call.
-  void DeliverBlock(pp::Buffer_Dev decrypted_block,
-                    const PP_DecryptedBlockInfo& decrypted_block_info);
-
-  void DecoderInitializeDone(PP_DecryptorStreamType decoder_type,
-                             uint32_t request_id,
-                             bool status);
-  void DecoderDeinitializeDone(PP_DecryptorStreamType decoder_type,
-                               uint32_t request_id);
-  void DecoderResetDone(PP_DecryptorStreamType decoder_type,
-                        uint32_t request_id);
-
-  // The plugin must not hold a reference to the encrypted buffer resource
-  // provided to DecryptAndDecode() when it calls this method. The browser will
-  // reuse the buffer in a subsequent DecryptAndDecode() call.
-  void DeliverFrame(pp::Buffer_Dev decrypted_frame,
-                    const PP_DecryptedFrameInfo& decrypted_frame_info);
-
-  // The plugin must not hold a reference to the encrypted buffer resource
-  // provided to DecryptAndDecode() when it calls this method. The browser will
-  // reuse the buffer in a subsequent DecryptAndDecode() call.
-  void DeliverSamples(pp::Buffer_Dev audio_frames,
-                      const PP_DecryptedSampleInfo& decrypted_sample_info);
-
- private:
-  InstanceHandle associated_instance_;
-};
-
-}  // namespace pp
-
-#endif  // PPAPI_CPP_PRIVATE_CONTENT_DECRYPTOR_PRIVATE_H_
diff --git a/ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c b/ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c
index d8fd1a2..6d92f291 100644
--- a/ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c
+++ b/ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2017 The Chromium Authors. All rights reserved.
+/* Copyright (c) 2018 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.
  */
@@ -54,7 +54,6 @@
 #include "ppapi/c/ppb_websocket.h"
 #include "ppapi/c/ppp_messaging.h"
 #include "ppapi/c/private/ppb_camera_device_private.h"
-#include "ppapi/c/private/ppb_content_decryptor_private.h"
 #include "ppapi/c/private/ppb_display_color_profile_private.h"
 #include "ppapi/c/private/ppb_ext_crx_file_system_private.h"
 #include "ppapi/c/private/ppb_file_io_private.h"
@@ -78,7 +77,6 @@
 #include "ppapi/c/private/ppb_video_destination_private.h"
 #include "ppapi/c/private/ppb_video_source_private.h"
 #include "ppapi/c/private/ppb_x509_certificate_private.h"
-#include "ppapi/c/private/ppp_content_decryptor_private.h"
 #include "ppapi/c/private/ppp_instance_private.h"
 
 /* Use local strcmp to avoid dependency on libc. */
@@ -171,7 +169,6 @@
 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_VideoCapture_Dev_0_3;
 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_VideoDecoder_Dev_0_16;
 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_CameraDevice_Private_0_1;
-static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_ContentDecryptor_Private_0_15;
 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_DisplayColorProfile_Private_0_1;
 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_Ext_CrxFileSystem_Private_0_1;
 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_FileIO_Private_0_1;
@@ -208,7 +205,6 @@
 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_VideoDestination_Private_0_1;
 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_VideoSource_Private_0_1;
 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_X509Certificate_Private_0_1;
-static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPP_ContentDecryptor_Private_0_17;
 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPP_Instance_Private_0_1;
 /* END Declarations for all Wrapper Infos. */
 
@@ -3282,85 +3278,6 @@
 
 /* End wrapper methods for PPB_CameraDevice_Private_0_1 */
 
-/* Begin wrapper methods for PPB_ContentDecryptor_Private_0_15 */
-
-static void Pnacl_M62_PPB_ContentDecryptor_Private_PromiseResolved(PP_Instance instance, uint32_t promise_id) {
-  const struct PPB_ContentDecryptor_Private_0_15 *iface = Pnacl_WrapperInfo_PPB_ContentDecryptor_Private_0_15.real_iface;
-  iface->PromiseResolved(instance, promise_id);
-}
-
-static void Pnacl_M62_PPB_ContentDecryptor_Private_PromiseResolvedWithKeyStatus(PP_Instance instance, uint32_t promise_id, PP_CdmKeyStatus key_status) {
-  const struct PPB_ContentDecryptor_Private_0_15 *iface = Pnacl_WrapperInfo_PPB_ContentDecryptor_Private_0_15.real_iface;
-  iface->PromiseResolvedWithKeyStatus(instance, promise_id, key_status);
-}
-
-static void Pnacl_M62_PPB_ContentDecryptor_Private_PromiseResolvedWithSession(PP_Instance instance, uint32_t promise_id, struct PP_Var* session_id) {
-  const struct PPB_ContentDecryptor_Private_0_15 *iface = Pnacl_WrapperInfo_PPB_ContentDecryptor_Private_0_15.real_iface;
-  iface->PromiseResolvedWithSession(instance, promise_id, *session_id);
-}
-
-static void Pnacl_M62_PPB_ContentDecryptor_Private_PromiseRejected(PP_Instance instance, uint32_t promise_id, PP_CdmExceptionCode exception_code, uint32_t system_code, struct PP_Var* error_description) {
-  const struct PPB_ContentDecryptor_Private_0_15 *iface = Pnacl_WrapperInfo_PPB_ContentDecryptor_Private_0_15.real_iface;
-  iface->PromiseRejected(instance, promise_id, exception_code, system_code, *error_description);
-}
-
-static void Pnacl_M62_PPB_ContentDecryptor_Private_SessionMessage(PP_Instance instance, struct PP_Var* session_id, PP_CdmMessageType message_type, struct PP_Var* message, struct PP_Var* legacy_destination_url) {
-  const struct PPB_ContentDecryptor_Private_0_15 *iface = Pnacl_WrapperInfo_PPB_ContentDecryptor_Private_0_15.real_iface;
-  iface->SessionMessage(instance, *session_id, message_type, *message, *legacy_destination_url);
-}
-
-static void Pnacl_M62_PPB_ContentDecryptor_Private_SessionKeysChange(PP_Instance instance, struct PP_Var* session_id, PP_Bool has_additional_usable_key, uint32_t key_count, const struct PP_KeyInformation key_information[]) {
-  const struct PPB_ContentDecryptor_Private_0_15 *iface = Pnacl_WrapperInfo_PPB_ContentDecryptor_Private_0_15.real_iface;
-  iface->SessionKeysChange(instance, *session_id, has_additional_usable_key, key_count, key_information);
-}
-
-static void Pnacl_M62_PPB_ContentDecryptor_Private_SessionExpirationChange(PP_Instance instance, struct PP_Var* session_id, PP_Time new_expiry_time) {
-  const struct PPB_ContentDecryptor_Private_0_15 *iface = Pnacl_WrapperInfo_PPB_ContentDecryptor_Private_0_15.real_iface;
-  iface->SessionExpirationChange(instance, *session_id, new_expiry_time);
-}
-
-static void Pnacl_M62_PPB_ContentDecryptor_Private_SessionClosed(PP_Instance instance, struct PP_Var* session_id) {
-  const struct PPB_ContentDecryptor_Private_0_15 *iface = Pnacl_WrapperInfo_PPB_ContentDecryptor_Private_0_15.real_iface;
-  iface->SessionClosed(instance, *session_id);
-}
-
-static void Pnacl_M62_PPB_ContentDecryptor_Private_LegacySessionError(PP_Instance instance, struct PP_Var* session_id, PP_CdmExceptionCode exception_code, uint32_t system_code, struct PP_Var* error_description) {
-  const struct PPB_ContentDecryptor_Private_0_15 *iface = Pnacl_WrapperInfo_PPB_ContentDecryptor_Private_0_15.real_iface;
-  iface->LegacySessionError(instance, *session_id, exception_code, system_code, *error_description);
-}
-
-static void Pnacl_M62_PPB_ContentDecryptor_Private_DeliverBlock(PP_Instance instance, PP_Resource decrypted_block, const struct PP_DecryptedBlockInfo* decrypted_block_info) {
-  const struct PPB_ContentDecryptor_Private_0_15 *iface = Pnacl_WrapperInfo_PPB_ContentDecryptor_Private_0_15.real_iface;
-  iface->DeliverBlock(instance, decrypted_block, decrypted_block_info);
-}
-
-static void Pnacl_M62_PPB_ContentDecryptor_Private_DecoderInitializeDone(PP_Instance instance, PP_DecryptorStreamType decoder_type, uint32_t request_id, PP_Bool success) {
-  const struct PPB_ContentDecryptor_Private_0_15 *iface = Pnacl_WrapperInfo_PPB_ContentDecryptor_Private_0_15.real_iface;
-  iface->DecoderInitializeDone(instance, decoder_type, request_id, success);
-}
-
-static void Pnacl_M62_PPB_ContentDecryptor_Private_DecoderDeinitializeDone(PP_Instance instance, PP_DecryptorStreamType decoder_type, uint32_t request_id) {
-  const struct PPB_ContentDecryptor_Private_0_15 *iface = Pnacl_WrapperInfo_PPB_ContentDecryptor_Private_0_15.real_iface;
-  iface->DecoderDeinitializeDone(instance, decoder_type, request_id);
-}
-
-static void Pnacl_M62_PPB_ContentDecryptor_Private_DecoderResetDone(PP_Instance instance, PP_DecryptorStreamType decoder_type, uint32_t request_id) {
-  const struct PPB_ContentDecryptor_Private_0_15 *iface = Pnacl_WrapperInfo_PPB_ContentDecryptor_Private_0_15.real_iface;
-  iface->DecoderResetDone(instance, decoder_type, request_id);
-}
-
-static void Pnacl_M62_PPB_ContentDecryptor_Private_DeliverFrame(PP_Instance instance, PP_Resource decrypted_frame, const struct PP_DecryptedFrameInfo* decrypted_frame_info) {
-  const struct PPB_ContentDecryptor_Private_0_15 *iface = Pnacl_WrapperInfo_PPB_ContentDecryptor_Private_0_15.real_iface;
-  iface->DeliverFrame(instance, decrypted_frame, decrypted_frame_info);
-}
-
-static void Pnacl_M62_PPB_ContentDecryptor_Private_DeliverSamples(PP_Instance instance, PP_Resource audio_frames, const struct PP_DecryptedSampleInfo* decrypted_sample_info) {
-  const struct PPB_ContentDecryptor_Private_0_15 *iface = Pnacl_WrapperInfo_PPB_ContentDecryptor_Private_0_15.real_iface;
-  iface->DeliverSamples(instance, audio_frames, decrypted_sample_info);
-}
-
-/* End wrapper methods for PPB_ContentDecryptor_Private_0_15 */
-
 /* Begin wrapper methods for PPB_DisplayColorProfile_Private_0_1 */
 
 static PP_Resource Pnacl_M33_PPB_DisplayColorProfile_Private_Create(PP_Instance instance) {
@@ -4694,108 +4611,6 @@
 
 /* End wrapper methods for PPB_X509Certificate_Private_0_1 */
 
-/* Begin wrapper methods for PPP_ContentDecryptor_Private_0_17 */
-
-static void Pnacl_M62_PPP_ContentDecryptor_Private_Initialize(PP_Instance instance, uint32_t promise_id, struct PP_Var key_system, PP_Bool allow_distinctive_identifier, PP_Bool allow_persistent_state) {
-  const struct PPP_ContentDecryptor_Private_0_17 *iface = Pnacl_WrapperInfo_PPP_ContentDecryptor_Private_0_17.real_iface;
-  void (*temp_fp)(PP_Instance instance, uint32_t promise_id, struct PP_Var* key_system, PP_Bool allow_distinctive_identifier, PP_Bool allow_persistent_state) =
-    ((void (*)(PP_Instance instance, uint32_t promise_id, struct PP_Var* key_system, PP_Bool allow_distinctive_identifier, PP_Bool allow_persistent_state))iface->Initialize);
-  temp_fp(instance, promise_id, &key_system, allow_distinctive_identifier, allow_persistent_state);
-}
-
-static void Pnacl_M62_PPP_ContentDecryptor_Private_SetServerCertificate(PP_Instance instance, uint32_t promise_id, struct PP_Var server_certificate) {
-  const struct PPP_ContentDecryptor_Private_0_17 *iface = Pnacl_WrapperInfo_PPP_ContentDecryptor_Private_0_17.real_iface;
-  void (*temp_fp)(PP_Instance instance, uint32_t promise_id, struct PP_Var* server_certificate) =
-    ((void (*)(PP_Instance instance, uint32_t promise_id, struct PP_Var* server_certificate))iface->SetServerCertificate);
-  temp_fp(instance, promise_id, &server_certificate);
-}
-
-static void Pnacl_M62_PPP_ContentDecryptor_Private_GetStatusForPolicy(PP_Instance instance, uint32_t promise_id, PP_HdcpVersion min_hdcp_version) {
-  const struct PPP_ContentDecryptor_Private_0_17 *iface = Pnacl_WrapperInfo_PPP_ContentDecryptor_Private_0_17.real_iface;
-  void (*temp_fp)(PP_Instance instance, uint32_t promise_id, PP_HdcpVersion min_hdcp_version) =
-    ((void (*)(PP_Instance instance, uint32_t promise_id, PP_HdcpVersion min_hdcp_version))iface->GetStatusForPolicy);
-  temp_fp(instance, promise_id, min_hdcp_version);
-}
-
-static void Pnacl_M62_PPP_ContentDecryptor_Private_CreateSessionAndGenerateRequest(PP_Instance instance, uint32_t promise_id, PP_SessionType session_type, PP_InitDataType init_data_type, struct PP_Var init_data) {
-  const struct PPP_ContentDecryptor_Private_0_17 *iface = Pnacl_WrapperInfo_PPP_ContentDecryptor_Private_0_17.real_iface;
-  void (*temp_fp)(PP_Instance instance, uint32_t promise_id, PP_SessionType session_type, PP_InitDataType init_data_type, struct PP_Var* init_data) =
-    ((void (*)(PP_Instance instance, uint32_t promise_id, PP_SessionType session_type, PP_InitDataType init_data_type, struct PP_Var* init_data))iface->CreateSessionAndGenerateRequest);
-  temp_fp(instance, promise_id, session_type, init_data_type, &init_data);
-}
-
-static void Pnacl_M62_PPP_ContentDecryptor_Private_LoadSession(PP_Instance instance, uint32_t promise_id, PP_SessionType session_type, struct PP_Var session_id) {
-  const struct PPP_ContentDecryptor_Private_0_17 *iface = Pnacl_WrapperInfo_PPP_ContentDecryptor_Private_0_17.real_iface;
-  void (*temp_fp)(PP_Instance instance, uint32_t promise_id, PP_SessionType session_type, struct PP_Var* session_id) =
-    ((void (*)(PP_Instance instance, uint32_t promise_id, PP_SessionType session_type, struct PP_Var* session_id))iface->LoadSession);
-  temp_fp(instance, promise_id, session_type, &session_id);
-}
-
-static void Pnacl_M62_PPP_ContentDecryptor_Private_UpdateSession(PP_Instance instance, uint32_t promise_id, struct PP_Var session_id, struct PP_Var response) {
-  const struct PPP_ContentDecryptor_Private_0_17 *iface = Pnacl_WrapperInfo_PPP_ContentDecryptor_Private_0_17.real_iface;
-  void (*temp_fp)(PP_Instance instance, uint32_t promise_id, struct PP_Var* session_id, struct PP_Var* response) =
-    ((void (*)(PP_Instance instance, uint32_t promise_id, struct PP_Var* session_id, struct PP_Var* response))iface->UpdateSession);
-  temp_fp(instance, promise_id, &session_id, &response);
-}
-
-static void Pnacl_M62_PPP_ContentDecryptor_Private_CloseSession(PP_Instance instance, uint32_t promise_id, struct PP_Var session_id) {
-  const struct PPP_ContentDecryptor_Private_0_17 *iface = Pnacl_WrapperInfo_PPP_ContentDecryptor_Private_0_17.real_iface;
-  void (*temp_fp)(PP_Instance instance, uint32_t promise_id, struct PP_Var* session_id) =
-    ((void (*)(PP_Instance instance, uint32_t promise_id, struct PP_Var* session_id))iface->CloseSession);
-  temp_fp(instance, promise_id, &session_id);
-}
-
-static void Pnacl_M62_PPP_ContentDecryptor_Private_RemoveSession(PP_Instance instance, uint32_t promise_id, struct PP_Var session_id) {
-  const struct PPP_ContentDecryptor_Private_0_17 *iface = Pnacl_WrapperInfo_PPP_ContentDecryptor_Private_0_17.real_iface;
-  void (*temp_fp)(PP_Instance instance, uint32_t promise_id, struct PP_Var* session_id) =
-    ((void (*)(PP_Instance instance, uint32_t promise_id, struct PP_Var* session_id))iface->RemoveSession);
-  temp_fp(instance, promise_id, &session_id);
-}
-
-static void Pnacl_M62_PPP_ContentDecryptor_Private_Decrypt(PP_Instance instance, PP_Resource encrypted_block, const struct PP_EncryptedBlockInfo* encrypted_block_info) {
-  const struct PPP_ContentDecryptor_Private_0_17 *iface = Pnacl_WrapperInfo_PPP_ContentDecryptor_Private_0_17.real_iface;
-  void (*temp_fp)(PP_Instance instance, PP_Resource encrypted_block, const struct PP_EncryptedBlockInfo* encrypted_block_info) =
-    ((void (*)(PP_Instance instance, PP_Resource encrypted_block, const struct PP_EncryptedBlockInfo* encrypted_block_info))iface->Decrypt);
-  temp_fp(instance, encrypted_block, encrypted_block_info);
-}
-
-static void Pnacl_M62_PPP_ContentDecryptor_Private_InitializeAudioDecoder(PP_Instance instance, const struct PP_AudioDecoderConfig* decoder_config, PP_Resource codec_extra_data) {
-  const struct PPP_ContentDecryptor_Private_0_17 *iface = Pnacl_WrapperInfo_PPP_ContentDecryptor_Private_0_17.real_iface;
-  void (*temp_fp)(PP_Instance instance, const struct PP_AudioDecoderConfig* decoder_config, PP_Resource codec_extra_data) =
-    ((void (*)(PP_Instance instance, const struct PP_AudioDecoderConfig* decoder_config, PP_Resource codec_extra_data))iface->InitializeAudioDecoder);
-  temp_fp(instance, decoder_config, codec_extra_data);
-}
-
-static void Pnacl_M62_PPP_ContentDecryptor_Private_InitializeVideoDecoder(PP_Instance instance, const struct PP_VideoDecoderConfig* decoder_config, PP_Resource codec_extra_data) {
-  const struct PPP_ContentDecryptor_Private_0_17 *iface = Pnacl_WrapperInfo_PPP_ContentDecryptor_Private_0_17.real_iface;
-  void (*temp_fp)(PP_Instance instance, const struct PP_VideoDecoderConfig* decoder_config, PP_Resource codec_extra_data) =
-    ((void (*)(PP_Instance instance, const struct PP_VideoDecoderConfig* decoder_config, PP_Resource codec_extra_data))iface->InitializeVideoDecoder);
-  temp_fp(instance, decoder_config, codec_extra_data);
-}
-
-static void Pnacl_M62_PPP_ContentDecryptor_Private_DeinitializeDecoder(PP_Instance instance, PP_DecryptorStreamType decoder_type, uint32_t request_id) {
-  const struct PPP_ContentDecryptor_Private_0_17 *iface = Pnacl_WrapperInfo_PPP_ContentDecryptor_Private_0_17.real_iface;
-  void (*temp_fp)(PP_Instance instance, PP_DecryptorStreamType decoder_type, uint32_t request_id) =
-    ((void (*)(PP_Instance instance, PP_DecryptorStreamType decoder_type, uint32_t request_id))iface->DeinitializeDecoder);
-  temp_fp(instance, decoder_type, request_id);
-}
-
-static void Pnacl_M62_PPP_ContentDecryptor_Private_ResetDecoder(PP_Instance instance, PP_DecryptorStreamType decoder_type, uint32_t request_id) {
-  const struct PPP_ContentDecryptor_Private_0_17 *iface = Pnacl_WrapperInfo_PPP_ContentDecryptor_Private_0_17.real_iface;
-  void (*temp_fp)(PP_Instance instance, PP_DecryptorStreamType decoder_type, uint32_t request_id) =
-    ((void (*)(PP_Instance instance, PP_DecryptorStreamType decoder_type, uint32_t request_id))iface->ResetDecoder);
-  temp_fp(instance, decoder_type, request_id);
-}
-
-static void Pnacl_M62_PPP_ContentDecryptor_Private_DecryptAndDecode(PP_Instance instance, PP_DecryptorStreamType decoder_type, PP_Resource encrypted_buffer, const struct PP_EncryptedBlockInfo* encrypted_block_info) {
-  const struct PPP_ContentDecryptor_Private_0_17 *iface = Pnacl_WrapperInfo_PPP_ContentDecryptor_Private_0_17.real_iface;
-  void (*temp_fp)(PP_Instance instance, PP_DecryptorStreamType decoder_type, PP_Resource encrypted_buffer, const struct PP_EncryptedBlockInfo* encrypted_block_info) =
-    ((void (*)(PP_Instance instance, PP_DecryptorStreamType decoder_type, PP_Resource encrypted_buffer, const struct PP_EncryptedBlockInfo* encrypted_block_info))iface->DecryptAndDecode);
-  temp_fp(instance, decoder_type, encrypted_buffer, encrypted_block_info);
-}
-
-/* End wrapper methods for PPP_ContentDecryptor_Private_0_17 */
-
 /* Not generating wrapper methods for PPP_Find_Private_0_3 */
 
 /* Not generating wrapper methods for PPP_Flash_BrowserOperations_1_0 */
@@ -5683,24 +5498,6 @@
     .GetCameraCapabilities = (int32_t (*)(PP_Resource camera_device, PP_Resource* capabilities, struct PP_CompletionCallback callback))&Pnacl_M42_PPB_CameraDevice_Private_GetCameraCapabilities
 };
 
-static const struct PPB_ContentDecryptor_Private_0_15 Pnacl_Wrappers_PPB_ContentDecryptor_Private_0_15 = {
-    .PromiseResolved = (void (*)(PP_Instance instance, uint32_t promise_id))&Pnacl_M62_PPB_ContentDecryptor_Private_PromiseResolved,
-    .PromiseResolvedWithKeyStatus = (void (*)(PP_Instance instance, uint32_t promise_id, PP_CdmKeyStatus key_status))&Pnacl_M62_PPB_ContentDecryptor_Private_PromiseResolvedWithKeyStatus,
-    .PromiseResolvedWithSession = (void (*)(PP_Instance instance, uint32_t promise_id, struct PP_Var session_id))&Pnacl_M62_PPB_ContentDecryptor_Private_PromiseResolvedWithSession,
-    .PromiseRejected = (void (*)(PP_Instance instance, uint32_t promise_id, PP_CdmExceptionCode exception_code, uint32_t system_code, struct PP_Var error_description))&Pnacl_M62_PPB_ContentDecryptor_Private_PromiseRejected,
-    .SessionMessage = (void (*)(PP_Instance instance, struct PP_Var session_id, PP_CdmMessageType message_type, struct PP_Var message, struct PP_Var legacy_destination_url))&Pnacl_M62_PPB_ContentDecryptor_Private_SessionMessage,
-    .SessionKeysChange = (void (*)(PP_Instance instance, struct PP_Var session_id, PP_Bool has_additional_usable_key, uint32_t key_count, const struct PP_KeyInformation key_information[]))&Pnacl_M62_PPB_ContentDecryptor_Private_SessionKeysChange,
-    .SessionExpirationChange = (void (*)(PP_Instance instance, struct PP_Var session_id, PP_Time new_expiry_time))&Pnacl_M62_PPB_ContentDecryptor_Private_SessionExpirationChange,
-    .SessionClosed = (void (*)(PP_Instance instance, struct PP_Var session_id))&Pnacl_M62_PPB_ContentDecryptor_Private_SessionClosed,
-    .LegacySessionError = (void (*)(PP_Instance instance, struct PP_Var session_id, PP_CdmExceptionCode exception_code, uint32_t system_code, struct PP_Var error_description))&Pnacl_M62_PPB_ContentDecryptor_Private_LegacySessionError,
-    .DeliverBlock = (void (*)(PP_Instance instance, PP_Resource decrypted_block, const struct PP_DecryptedBlockInfo* decrypted_block_info))&Pnacl_M62_PPB_ContentDecryptor_Private_DeliverBlock,
-    .DecoderInitializeDone = (void (*)(PP_Instance instance, PP_DecryptorStreamType decoder_type, uint32_t request_id, PP_Bool success))&Pnacl_M62_PPB_ContentDecryptor_Private_DecoderInitializeDone,
-    .DecoderDeinitializeDone = (void (*)(PP_Instance instance, PP_DecryptorStreamType decoder_type, uint32_t request_id))&Pnacl_M62_PPB_ContentDecryptor_Private_DecoderDeinitializeDone,
-    .DecoderResetDone = (void (*)(PP_Instance instance, PP_DecryptorStreamType decoder_type, uint32_t request_id))&Pnacl_M62_PPB_ContentDecryptor_Private_DecoderResetDone,
-    .DeliverFrame = (void (*)(PP_Instance instance, PP_Resource decrypted_frame, const struct PP_DecryptedFrameInfo* decrypted_frame_info))&Pnacl_M62_PPB_ContentDecryptor_Private_DeliverFrame,
-    .DeliverSamples = (void (*)(PP_Instance instance, PP_Resource audio_frames, const struct PP_DecryptedSampleInfo* decrypted_sample_info))&Pnacl_M62_PPB_ContentDecryptor_Private_DeliverSamples
-};
-
 static const struct PPB_DisplayColorProfile_Private_0_1 Pnacl_Wrappers_PPB_DisplayColorProfile_Private_0_1 = {
     .Create = (PP_Resource (*)(PP_Instance instance))&Pnacl_M33_PPB_DisplayColorProfile_Private_Create,
     .IsDisplayColorProfile = (PP_Bool (*)(PP_Resource resource))&Pnacl_M33_PPB_DisplayColorProfile_Private_IsDisplayColorProfile,
@@ -6058,23 +5855,6 @@
     .GetField = (struct PP_Var (*)(PP_Resource resource, PP_X509Certificate_Private_Field field))&Pnacl_M19_PPB_X509Certificate_Private_GetField
 };
 
-static const struct PPP_ContentDecryptor_Private_0_17 Pnacl_Wrappers_PPP_ContentDecryptor_Private_0_17 = {
-    .Initialize = &Pnacl_M62_PPP_ContentDecryptor_Private_Initialize,
-    .SetServerCertificate = &Pnacl_M62_PPP_ContentDecryptor_Private_SetServerCertificate,
-    .GetStatusForPolicy = &Pnacl_M62_PPP_ContentDecryptor_Private_GetStatusForPolicy,
-    .CreateSessionAndGenerateRequest = &Pnacl_M62_PPP_ContentDecryptor_Private_CreateSessionAndGenerateRequest,
-    .LoadSession = &Pnacl_M62_PPP_ContentDecryptor_Private_LoadSession,
-    .UpdateSession = &Pnacl_M62_PPP_ContentDecryptor_Private_UpdateSession,
-    .CloseSession = &Pnacl_M62_PPP_ContentDecryptor_Private_CloseSession,
-    .RemoveSession = &Pnacl_M62_PPP_ContentDecryptor_Private_RemoveSession,
-    .Decrypt = &Pnacl_M62_PPP_ContentDecryptor_Private_Decrypt,
-    .InitializeAudioDecoder = &Pnacl_M62_PPP_ContentDecryptor_Private_InitializeAudioDecoder,
-    .InitializeVideoDecoder = &Pnacl_M62_PPP_ContentDecryptor_Private_InitializeVideoDecoder,
-    .DeinitializeDecoder = &Pnacl_M62_PPP_ContentDecryptor_Private_DeinitializeDecoder,
-    .ResetDecoder = &Pnacl_M62_PPP_ContentDecryptor_Private_ResetDecoder,
-    .DecryptAndDecode = &Pnacl_M62_PPP_ContentDecryptor_Private_DecryptAndDecode
-};
-
 /* Not generating wrapper interface for PPP_Find_Private_0_3 */
 
 /* Not generating wrapper interface for PPP_Flash_BrowserOperations_1_0 */
@@ -6545,12 +6325,6 @@
   .real_iface = NULL
 };
 
-static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_ContentDecryptor_Private_0_15 = {
-  .iface_macro = PPB_CONTENTDECRYPTOR_PRIVATE_INTERFACE_0_15,
-  .wrapped_iface = (const void *) &Pnacl_Wrappers_PPB_ContentDecryptor_Private_0_15,
-  .real_iface = NULL
-};
-
 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_DisplayColorProfile_Private_0_1 = {
   .iface_macro = PPB_DISPLAYCOLORPROFILE_PRIVATE_INTERFACE_0_1,
   .wrapped_iface = (const void *) &Pnacl_Wrappers_PPB_DisplayColorProfile_Private_0_1,
@@ -6767,12 +6541,6 @@
   .real_iface = NULL
 };
 
-static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPP_ContentDecryptor_Private_0_17 = {
-  .iface_macro = PPP_CONTENTDECRYPTOR_PRIVATE_INTERFACE_0_17,
-  .wrapped_iface = (const void *) &Pnacl_Wrappers_PPP_ContentDecryptor_Private_0_17,
-  .real_iface = NULL
-};
-
 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPP_Instance_Private_0_1 = {
   .iface_macro = PPP_INSTANCE_PRIVATE_INTERFACE_0_1,
   .wrapped_iface = (const void *) &Pnacl_Wrappers_PPP_Instance_Private_0_1,
@@ -6855,7 +6623,6 @@
   &Pnacl_WrapperInfo_PPB_VideoCapture_Dev_0_3,
   &Pnacl_WrapperInfo_PPB_VideoDecoder_Dev_0_16,
   &Pnacl_WrapperInfo_PPB_CameraDevice_Private_0_1,
-  &Pnacl_WrapperInfo_PPB_ContentDecryptor_Private_0_15,
   &Pnacl_WrapperInfo_PPB_DisplayColorProfile_Private_0_1,
   &Pnacl_WrapperInfo_PPB_Ext_CrxFileSystem_Private_0_1,
   &Pnacl_WrapperInfo_PPB_FileIO_Private_0_1,
@@ -6897,7 +6664,6 @@
 
 static struct __PnaclWrapperInfo *s_ppp_wrappers[] = {
   &Pnacl_WrapperInfo_PPP_Messaging_1_0,
-  &Pnacl_WrapperInfo_PPP_ContentDecryptor_Private_0_17,
   &Pnacl_WrapperInfo_PPP_Instance_Private_0_1,
   NULL
 };
diff --git a/ppapi/proxy/BUILD.gn b/ppapi/proxy/BUILD.gn
index 1c767ed8..40b10c8 100644
--- a/ppapi/proxy/BUILD.gn
+++ b/ppapi/proxy/BUILD.gn
@@ -259,8 +259,6 @@
       "ppb_var_deprecated_proxy.h",
       "ppb_video_decoder_proxy.cc",
       "ppb_video_decoder_proxy.h",
-      "ppp_content_decryptor_private_proxy.cc",
-      "ppp_content_decryptor_private_proxy.h",
       "ppp_instance_private_proxy.cc",
       "ppp_instance_private_proxy.h",
       "ppp_video_decoder_proxy.cc",
diff --git a/ppapi/proxy/content_decryptor_private_serializer.h b/ppapi/proxy/content_decryptor_private_serializer.h
deleted file mode 100644
index 249b01ca..0000000
--- a/ppapi/proxy/content_decryptor_private_serializer.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (c) 2012 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 PPAPI_PROXY_CONTENT_DECRYPTOR_PRIVATE_SERIALIZER_H_
-#define PPAPI_PROXY_CONTENT_DECRYPTOR_PRIVATE_SERIALIZER_H_
-
-#include <cstring>
-#include <string>
-
-#include "ppapi/c/private/pp_content_decryptor.h"
-
-namespace ppapi {
-namespace proxy {
-
-// Serialization/deserialization utility functions for storing/extracting
-// PP_DecryptedBlockInfo, PP_EncryptedBlockInfo, and PP_DecompressedFrameInfo
-// structs within std::string's for passing through IPC. Both functions return
-// true upon success, and false upon failure.
-//
-// Note, these functions check the size of |block_info| against the size of
-// the "serialized" data stored within |serialized_block_info|, and will report
-// failure if expectations are not met. Use of CHECK/DCHECK has been avoided
-// because the functions are intended for use on both sides of the IPC proxy.
-
-template <typename T>
-bool SerializeBlockInfo(const T& block_info,
-                        std::string* serialized_block_info) {
-  if (!serialized_block_info)
-    return false;
-
-  serialized_block_info->assign(reinterpret_cast<const char*>(&block_info),
-                                sizeof(block_info));
-
-  if (serialized_block_info->size() != sizeof(block_info))
-    return false;
-
-  return true;
-}
-
-template <typename T>
-bool DeserializeBlockInfo(const std::string& serialized_block_info,
-                          T* block_info) {
-  if (!block_info)
-    return false;
-
-  if (serialized_block_info.size() != sizeof(*block_info))
-    return false;
-
-  std::memcpy(block_info, serialized_block_info.data(), sizeof(*block_info));
-  return true;
-}
-
-}  // namespace proxy
-}  // namespace ppapi
-
-#endif  // PPAPI_PROXY_CONTENT_DECRYPTOR_PRIVATE_SERIALIZER_H_
diff --git a/ppapi/proxy/interface_list.cc b/ppapi/proxy/interface_list.cc
index c952ade..2d50df93 100644
--- a/ppapi/proxy/interface_list.cc
+++ b/ppapi/proxy/interface_list.cc
@@ -76,7 +76,6 @@
 #include "ppapi/c/ppp_instance.h"
 #include "ppapi/c/private/ppb_camera_capabilities_private.h"
 #include "ppapi/c/private/ppb_camera_device_private.h"
-#include "ppapi/c/private/ppb_content_decryptor_private.h"
 #include "ppapi/c/private/ppb_ext_crx_file_system_private.h"
 #include "ppapi/c/private/ppb_file_io_private.h"
 #include "ppapi/c/private/ppb_file_ref_private.h"
@@ -105,7 +104,6 @@
 #include "ppapi/c/private/ppb_video_destination_private.h"
 #include "ppapi/c/private/ppb_video_source_private.h"
 #include "ppapi/c/private/ppb_x509_certificate_private.h"
-#include "ppapi/c/private/ppp_content_decryptor_private.h"
 #include "ppapi/c/trusted/ppb_broker_trusted.h"
 #include "ppapi/c/trusted/ppb_browser_font_trusted.h"
 #include "ppapi/c/trusted/ppb_char_set_trusted.h"
@@ -128,7 +126,6 @@
 #include "ppapi/proxy/ppb_video_decoder_proxy.h"
 #include "ppapi/proxy/ppb_x509_certificate_private_proxy.h"
 #include "ppapi/proxy/ppp_class_proxy.h"
-#include "ppapi/proxy/ppp_content_decryptor_private_proxy.h"
 #include "ppapi/proxy/ppp_find_proxy.h"
 #include "ppapi/proxy/ppp_graphics_3d_proxy.h"
 #include "ppapi/proxy/ppp_input_event_proxy.h"
@@ -276,13 +273,6 @@
   AddProxy(API_ID_PPB_VAR_DEPRECATED, &ProxyFactory<PPB_Var_Deprecated_Proxy>);
   AddPPB(PPB_VAR_DEPRECATED_INTERFACE,
          PPB_Var_Deprecated_Proxy::GetProxyInterface(), PERMISSION_FLASH);
-
-  // TODO(tomfinegan): Figure out where to put these once we refactor things
-  // to load the PPP interface struct from the PPB interface.
-  AddProxy(API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE,
-           &ProxyFactory<PPP_ContentDecryptor_Private_Proxy>);
-  AddPPP(PPP_CONTENTDECRYPTOR_PRIVATE_INTERFACE,
-         PPP_ContentDecryptor_Private_Proxy::GetProxyInterface());
 #endif
   AddProxy(API_ID_PPB_TESTING, &ProxyFactory<PPB_Testing_Proxy>);
   AddPPB(PPB_TESTING_PRIVATE_INTERFACE,
diff --git a/ppapi/proxy/ppapi_messages.h b/ppapi/proxy/ppapi_messages.h
index 1a2afb53..5382285 100644
--- a/ppapi/proxy/ppapi_messages.h
+++ b/ppapi/proxy/ppapi_messages.h
@@ -48,7 +48,6 @@
 #include "ppapi/c/ppb_text_input_controller.h"
 #include "ppapi/c/ppb_udp_socket.h"
 #include "ppapi/c/ppb_video_encoder.h"
-#include "ppapi/c/private/pp_content_decryptor.h"
 #include "ppapi/c/private/pp_private_font_charset.h"
 #include "ppapi/c/private/pp_video_capture_format.h"
 #include "ppapi/c/private/ppb_flash.h"
@@ -95,11 +94,7 @@
                           ppapi::TCP_SOCKET_VERSION_1_1_OR_ABOVE)
 IPC_ENUM_TRAITS_MAX_VALUE(PP_AudioSampleRate, PP_AUDIOSAMPLERATE_LAST)
 IPC_ENUM_TRAITS_MAX_VALUE(PP_BlendMode, PP_BLENDMODE_LAST)
-IPC_ENUM_TRAITS_MAX_VALUE(PP_CdmExceptionCode, PP_CDMEXCEPTIONCODE_MAX)
-IPC_ENUM_TRAITS_MAX_VALUE(PP_CdmKeyStatus, PP_CDMKEYSTATUS_MAX)
-IPC_ENUM_TRAITS_MAX_VALUE(PP_CdmMessageType, PP_CDMMESSAGETYPE_MAX)
 IPC_ENUM_TRAITS_MAX_VALUE(PP_DeviceType_Dev, PP_DEVICETYPE_DEV_MAX)
-IPC_ENUM_TRAITS_MAX_VALUE(PP_DecryptorStreamType, PP_DECRYPTORSTREAMTYPE_MAX)
 IPC_ENUM_TRAITS_MAX_VALUE(PP_FileSystemType, PP_FILESYSTEMTYPE_ISOLATED)
 IPC_ENUM_TRAITS_MAX_VALUE(PP_FileType, PP_FILETYPE_OTHER)
 IPC_ENUM_TRAITS_MAX_VALUE(PP_Flash_BrowserOperations_Permission,
@@ -109,9 +104,7 @@
 IPC_ENUM_TRAITS_MIN_MAX_VALUE(PP_FlashSetting,
                               PP_FLASHSETTING_FIRST,
                               PP_FLASHSETTING_LAST)
-IPC_ENUM_TRAITS_MAX_VALUE(PP_HdcpVersion, PP_HDCPVERSION_MAX)
 IPC_ENUM_TRAITS_MAX_VALUE(PP_ImageDataFormat, PP_IMAGEDATAFORMAT_LAST)
-IPC_ENUM_TRAITS_MAX_VALUE(PP_InitDataType, PP_INITDATATYPE_MAX)
 IPC_ENUM_TRAITS_MIN_MAX_VALUE(PP_InputEvent_MouseButton,
                               PP_INPUTEVENT_MOUSEBUTTON_FIRST,
                               PP_INPUTEVENT_MOUSEBUTTON_LAST)
@@ -130,7 +123,6 @@
 IPC_ENUM_TRAITS_MAX_VALUE(PP_PrintScalingOption_Dev, PP_PRINTSCALINGOPTION_LAST)
 IPC_ENUM_TRAITS_MAX_VALUE(PP_PrivateDuplexMode_Dev, PP_PRIVATEDUPLEXMODE_LAST)
 IPC_ENUM_TRAITS_MAX_VALUE(PP_PrivateFontCharset, PP_PRIVATEFONTCHARSET_LAST)
-IPC_ENUM_TRAITS_MAX_VALUE(PP_SessionType, PP_SESSIONTYPE_MAX)
 IPC_ENUM_TRAITS_MAX_VALUE(PP_TCPSocket_Option,
                           PP_TCPSOCKET_OPTION_RECV_BUFFER_SIZE)
 IPC_ENUM_TRAITS_MAX_VALUE(PP_TextInput_Type, PP_TEXTINPUT_TYPE_LAST)
@@ -883,74 +875,6 @@
     IPC::PlatformFileForTransit /* handle */,
     int32_t /* result */)
 
-// PPP_ContentDecryptor_Dev
-IPC_MESSAGE_ROUTED5(PpapiMsg_PPPContentDecryptor_Initialize,
-                    PP_Instance /* instance */,
-                    uint32_t /* promise_id */,
-                    ppapi::proxy::SerializedVar /* key_system, String */,
-                    PP_Bool /* allow_distinctive_identifier */,
-                    PP_Bool /* allow_persistent_state */)
-IPC_MESSAGE_ROUTED3(PpapiMsg_PPPContentDecryptor_SetServerCertificate,
-                    PP_Instance /* instance */,
-                    uint32_t /* promise_id */,
-                    std::vector<uint8_t> /* certificate */)
-IPC_MESSAGE_ROUTED3(PpapiMsg_PPPContentDecryptor_GetStatusForPolicy,
-                    PP_Instance /* instance */,
-                    uint32_t /* promise_id */,
-                    PP_HdcpVersion /* min_hdcp_version */)
-IPC_MESSAGE_ROUTED5(
-    PpapiMsg_PPPContentDecryptor_CreateSessionAndGenerateRequest,
-    PP_Instance /* instance */,
-    uint32_t /* promise_id */,
-    PP_SessionType /* session_type */,
-    PP_InitDataType /* init_data_type */,
-    ppapi::proxy::SerializedVar /* init_data, ArrayBuffer */)
-IPC_MESSAGE_ROUTED4(PpapiMsg_PPPContentDecryptor_LoadSession,
-                    PP_Instance /* instance */,
-                    uint32_t /* promise_id */,
-                    PP_SessionType /* session_type */,
-                    ppapi::proxy::SerializedVar /* session_id, String */)
-IPC_MESSAGE_ROUTED4(PpapiMsg_PPPContentDecryptor_UpdateSession,
-                    PP_Instance /* instance */,
-                    uint32_t /* promise_id */,
-                    ppapi::proxy::SerializedVar /* session_id, String */,
-                    ppapi::proxy::SerializedVar /* response, ArrayBuffer */)
-IPC_MESSAGE_ROUTED3(PpapiMsg_PPPContentDecryptor_CloseSession,
-                    PP_Instance /* instance */,
-                    uint32_t /* promise_id */,
-                    std::string /* session_id */)
-IPC_MESSAGE_ROUTED3(PpapiMsg_PPPContentDecryptor_RemoveSession,
-                    PP_Instance /* instance */,
-                    uint32_t /* promise_id */,
-                    std::string /* session_id */)
-IPC_MESSAGE_ROUTED3(PpapiMsg_PPPContentDecryptor_Decrypt,
-                    PP_Instance /* instance */,
-                    ppapi::proxy::PPPDecryptor_Buffer /* buffer */,
-                    std::string /* serialized_block_info */)
-IPC_MESSAGE_ROUTED3(
-    PpapiMsg_PPPContentDecryptor_InitializeAudioDecoder,
-    PP_Instance /* instance */,
-    std::string /* serialized_decoder_config */,
-    ppapi::proxy::PPPDecryptor_Buffer /* extra_data_buffer */)
-IPC_MESSAGE_ROUTED3(
-    PpapiMsg_PPPContentDecryptor_InitializeVideoDecoder,
-    PP_Instance /* instance */,
-    std::string /* serialized_decoder_config */,
-    ppapi::proxy::PPPDecryptor_Buffer /* extra_data_buffer. */)
-IPC_MESSAGE_ROUTED3(PpapiMsg_PPPContentDecryptor_DeinitializeDecoder,
-                    PP_Instance /* instance */,
-                    PP_DecryptorStreamType /* decoder_type */,
-                    uint32_t /* request_id */)
-IPC_MESSAGE_ROUTED3(PpapiMsg_PPPContentDecryptor_ResetDecoder,
-                    PP_Instance /* instance */,
-                    PP_DecryptorStreamType /* decoder_type */,
-                    uint32_t /* request_id */)
-IPC_MESSAGE_ROUTED4(PpapiMsg_PPPContentDecryptor_DecryptAndDecode,
-                    PP_Instance /* instance */,
-                    PP_DecryptorStreamType /* decoder_type */,
-                    ppapi::proxy::PPPDecryptor_Buffer /* buffer */,
-                    std::string /* serialized_block_info */)
-
 // PPP_Instance_Private.
 IPC_SYNC_MESSAGE_ROUTED1_1(PpapiMsg_PPPInstancePrivate_GetInstanceObject,
                            PP_Instance /* instance */,
@@ -1323,73 +1247,6 @@
     ppapi::HostResource /* result_resource */,
     ppapi::proxy::SerializedHandle /* result_shm_handle */)
 
-// PPB_ContentDecryptor_Dev messages handled in PPB_Instance_Proxy.
-IPC_MESSAGE_ROUTED2(PpapiHostMsg_PPBInstance_PromiseResolved,
-                    PP_Instance /* instance */,
-                    uint32_t /* promise_id */)
-IPC_MESSAGE_ROUTED3(PpapiHostMsg_PPBInstance_PromiseResolvedWithKeyStatus,
-                    PP_Instance /* instance */,
-                    uint32_t /* promise_id */,
-                    PP_CdmKeyStatus /* key_status */)
-IPC_MESSAGE_ROUTED3(PpapiHostMsg_PPBInstance_PromiseResolvedWithSession,
-                    PP_Instance /* instance */,
-                    uint32_t /* promise_id */,
-                    ppapi::proxy::SerializedVar /* session_id, String */)
-IPC_MESSAGE_ROUTED5(PpapiHostMsg_PPBInstance_PromiseRejected,
-                    PP_Instance /* instance */,
-                    uint32_t /* promise_id */,
-                    PP_CdmExceptionCode /* exception_code */,
-                    int32_t /* system_code */,
-                    ppapi::proxy::SerializedVar /* error_description, String */)
-IPC_MESSAGE_ROUTED5(PpapiHostMsg_PPBInstance_SessionMessage,
-                    PP_Instance /* instance */,
-                    ppapi::proxy::SerializedVar /* session_id, String */,
-                    PP_CdmMessageType /* message_type */,
-                    ppapi::proxy::SerializedVar /* message, ArrayBuffer */,
-                    ppapi::proxy::SerializedVar /* destination_url, String */)
-IPC_MESSAGE_ROUTED4(PpapiHostMsg_PPBInstance_SessionKeysChange,
-                    PP_Instance /* instance */,
-                    std::string /* session_id */,
-                    PP_Bool /* has_additional_usable_key */,
-                    std::vector<PP_KeyInformation> /* key_information */)
-IPC_MESSAGE_ROUTED3(PpapiHostMsg_PPBInstance_SessionExpirationChange,
-                    PP_Instance /* instance */,
-                    std::string /* session_id */,
-                    PP_Time /* new_expiry_time */)
-IPC_MESSAGE_ROUTED2(PpapiHostMsg_PPBInstance_SessionClosed,
-                    PP_Instance /* instance */,
-                    ppapi::proxy::SerializedVar /* session_id, String */)
-IPC_MESSAGE_ROUTED5(PpapiHostMsg_PPBInstance_LegacySessionError,
-                    PP_Instance /* instance */,
-                    ppapi::proxy::SerializedVar /* session_id, String */,
-                    PP_CdmExceptionCode /* exception_code */,
-                    int32_t /* system_code */,
-                    ppapi::proxy::SerializedVar /* error_description, String */)
-IPC_MESSAGE_ROUTED3(PpapiHostMsg_PPBInstance_DeliverBlock,
-                    PP_Instance /* instance */,
-                    PP_Resource /* decrypted_block, PPB_Buffer_Dev */,
-                    std::string /* serialized_block_info */)
-IPC_MESSAGE_ROUTED4(PpapiHostMsg_PPBInstance_DecoderInitializeDone,
-                    PP_Instance /* instance */,
-                    PP_DecryptorStreamType /* decoder_type */,
-                    uint32_t /* request_id */,
-                    PP_Bool /* success */)
-IPC_MESSAGE_ROUTED3(PpapiHostMsg_PPBInstance_DecoderDeinitializeDone,
-                    PP_Instance /* instance */,
-                    PP_DecryptorStreamType /* decoder_type */,
-                    uint32_t /* request_id */)
-IPC_MESSAGE_ROUTED3(PpapiHostMsg_PPBInstance_DecoderResetDone,
-                    PP_Instance /* instance */,
-                    PP_DecryptorStreamType /* decoder_type */,
-                    uint32_t /* request_id */)
-IPC_MESSAGE_ROUTED3(PpapiHostMsg_PPBInstance_DeliverFrame,
-                    PP_Instance /* instance */,
-                    PP_Resource /* decrypted_frame, PPB_Buffer_Dev */,
-                    std::string /* serialized_block_info */)
-IPC_MESSAGE_ROUTED3(PpapiHostMsg_PPBInstance_DeliverSamples,
-                    PP_Instance /* instance */,
-                    PP_Resource /* audio_frames, PPB_Buffer_Dev */,
-                    std::string /* serialized_block_info */)
 #endif  // !defined(OS_NACL) && !defined(NACL_WIN64)
 
 // PPB_Testing.
diff --git a/ppapi/proxy/ppapi_param_traits.cc b/ppapi/proxy/ppapi_param_traits.cc
index d0f71d0..822c61f 100644
--- a/ppapi/proxy/ppapi_param_traits.cc
+++ b/ppapi/proxy/ppapi_param_traits.cc
@@ -101,53 +101,6 @@
 void ParamTraits<PP_Bool>::Log(const param_type& p, std::string* l) {
 }
 
-// PP_KeyInformation -------------------------------------------------------
-
-// static
-void ParamTraits<PP_KeyInformation>::Write(base::Pickle* m,
-                                           const param_type& p) {
-  WriteParam(m, p.key_id_size);
-  m->WriteBytes(p.key_id, static_cast<int>(p.key_id_size));
-  WriteParam(m, p.key_status);
-  WriteParam(m, p.system_code);
-}
-
-// static
-bool ParamTraits<PP_KeyInformation>::Read(const base::Pickle* m,
-                                          base::PickleIterator* iter,
-                                          param_type* p) {
-  uint32_t size;
-  if (!ReadParam(m, iter, &size))
-    return false;
-  if (size > sizeof(p->key_id))
-    return false;
-  p->key_id_size = size;
-
-  const char* data;
-  if (!iter->ReadBytes(&data, size))
-    return false;
-  memcpy(p->key_id, data, size);
-
-  PP_CdmKeyStatus key_status;
-  if (!ReadParam(m, iter, &key_status))
-    return false;
-  p->key_status = key_status;
-
-  uint32_t system_code;
-  if (!ReadParam(m, iter, &system_code))
-    return false;
-  p->system_code = system_code;
-
-  return true;
-}
-
-// static
-void ParamTraits<PP_KeyInformation>::Log(const param_type& p, std::string* l) {
-  l->append("<PP_KeyInformation (");
-  LogParam(p.key_id_size, l);
-  l->append(" bytes)>");
-}
-
 // PP_NetAddress_Private -------------------------------------------------------
 
 // static
diff --git a/ppapi/proxy/ppapi_param_traits.h b/ppapi/proxy/ppapi_param_traits.h
index 1869c99..6b32e10 100644
--- a/ppapi/proxy/ppapi_param_traits.h
+++ b/ppapi/proxy/ppapi_param_traits.h
@@ -22,7 +22,6 @@
 #include "ppapi/shared_impl/ppapi_permissions.h"
 #include "ppapi/shared_impl/socket_option_data.h"
 
-struct PP_KeyInformation;
 struct PP_NetAddress_Private;
 
 namespace ppapi {
@@ -66,16 +65,6 @@
   static void Log(const param_type& p, std::string* l);
 };
 
-template <>
-struct PPAPI_PROXY_EXPORT ParamTraits<PP_KeyInformation> {
-  typedef PP_KeyInformation param_type;
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* p);
-  static void Log(const param_type& p, std::string* l);
-};
-
 template<>
 struct PPAPI_PROXY_EXPORT ParamTraits<
     ppapi::proxy::PPBFlash_DrawGlyphs_Params> {
diff --git a/ppapi/proxy/ppb_instance_proxy.cc b/ppapi/proxy/ppb_instance_proxy.cc
index 6a9968c..c453c42 100644
--- a/ppapi/proxy/ppb_instance_proxy.cc
+++ b/ppapi/proxy/ppb_instance_proxy.cc
@@ -17,10 +17,8 @@
 #include "ppapi/c/ppb_instance.h"
 #include "ppapi/c/ppb_messaging.h"
 #include "ppapi/c/ppb_mouse_lock.h"
-#include "ppapi/c/private/pp_content_decryptor.h"
 #include "ppapi/proxy/broker_resource.h"
 #include "ppapi/proxy/browser_font_singleton_resource.h"
-#include "ppapi/proxy/content_decryptor_private_serializer.h"
 #include "ppapi/proxy/enter_proxy.h"
 #include "ppapi/proxy/flash_clipboard_resource.h"
 #include "ppapi/proxy/flash_file_resource.h"
@@ -178,36 +176,6 @@
                         OnHostMsgGetPluginInstanceURL)
     IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBInstance_GetPluginReferrerURL,
                         OnHostMsgGetPluginReferrerURL)
-    IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBInstance_PromiseResolved,
-                        OnHostMsgPromiseResolved)
-    IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBInstance_PromiseResolvedWithKeyStatus,
-                        OnHostMsgPromiseResolvedWithKeyStatus)
-    IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBInstance_PromiseResolvedWithSession,
-                        OnHostMsgPromiseResolvedWithSession)
-    IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBInstance_PromiseRejected,
-                        OnHostMsgPromiseRejected)
-    IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBInstance_SessionMessage,
-                        OnHostMsgSessionMessage)
-    IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBInstance_SessionKeysChange,
-                        OnHostMsgSessionKeysChange)
-    IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBInstance_SessionExpirationChange,
-                        OnHostMsgSessionExpirationChange)
-    IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBInstance_SessionClosed,
-                        OnHostMsgSessionClosed)
-    IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBInstance_LegacySessionError,
-                        OnHostMsgLegacySessionError)
-    IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBInstance_DeliverBlock,
-                        OnHostMsgDeliverBlock)
-    IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBInstance_DecoderInitializeDone,
-                        OnHostMsgDecoderInitializeDone)
-    IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBInstance_DecoderDeinitializeDone,
-                        OnHostMsgDecoderDeinitializeDone)
-    IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBInstance_DecoderResetDone,
-                        OnHostMsgDecoderResetDone)
-    IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBInstance_DeliverFrame,
-                        OnHostMsgDeliverFrame)
-    IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBInstance_DeliverSamples,
-                        OnHostMsgDeliverSamples)
 #endif  // !defined(OS_NACL)
 
     // Host -> Plugin messages.
@@ -547,236 +515,6 @@
       result.Return(dispatcher()),
       components);
 }
-
-void PPB_Instance_Proxy::PromiseResolved(PP_Instance instance,
-                                         uint32_t promise_id) {
-  dispatcher()->Send(new PpapiHostMsg_PPBInstance_PromiseResolved(
-      API_ID_PPB_INSTANCE, instance, promise_id));
-}
-
-void PPB_Instance_Proxy::PromiseResolvedWithKeyStatus(
-    PP_Instance instance,
-    uint32_t promise_id,
-    PP_CdmKeyStatus key_status) {
-  dispatcher()->Send(new PpapiHostMsg_PPBInstance_PromiseResolvedWithKeyStatus(
-      API_ID_PPB_INSTANCE, instance, promise_id, key_status));
-}
-
-void PPB_Instance_Proxy::PromiseResolvedWithSession(PP_Instance instance,
-                                                    uint32_t promise_id,
-                                                    PP_Var session_id_var) {
-  dispatcher()->Send(new PpapiHostMsg_PPBInstance_PromiseResolvedWithSession(
-      API_ID_PPB_INSTANCE, instance, promise_id,
-      SerializedVarSendInput(dispatcher(), session_id_var)));
-}
-
-void PPB_Instance_Proxy::PromiseRejected(PP_Instance instance,
-                                         uint32_t promise_id,
-                                         PP_CdmExceptionCode exception_code,
-                                         uint32_t system_code,
-                                         PP_Var error_description_var) {
-  dispatcher()->Send(new PpapiHostMsg_PPBInstance_PromiseRejected(
-      API_ID_PPB_INSTANCE,
-      instance,
-      promise_id,
-      exception_code,
-      system_code,
-      SerializedVarSendInput(dispatcher(), error_description_var)));
-}
-
-void PPB_Instance_Proxy::SessionMessage(PP_Instance instance,
-                                        PP_Var session_id_var,
-                                        PP_CdmMessageType message_type,
-                                        PP_Var message_var,
-                                        PP_Var legacy_destination_url_var) {
-  dispatcher()->Send(new PpapiHostMsg_PPBInstance_SessionMessage(
-      API_ID_PPB_INSTANCE, instance,
-      SerializedVarSendInput(dispatcher(), session_id_var), message_type,
-      SerializedVarSendInput(dispatcher(), message_var),
-      SerializedVarSendInput(dispatcher(), legacy_destination_url_var)));
-}
-
-void PPB_Instance_Proxy::SessionKeysChange(
-    PP_Instance instance,
-    PP_Var session_id_var,
-    PP_Bool has_additional_usable_key,
-    uint32_t key_count,
-    const struct PP_KeyInformation key_information[]) {
-  StringVar* session_id = StringVar::FromPPVar(session_id_var);
-  if (!session_id ||
-      session_id->value().length() > media::limits::kMaxSessionIdLength) {
-    NOTREACHED();
-    return;
-  }
-
-  if (key_count > media::limits::kMaxKeyIds) {
-    NOTREACHED();
-    return;
-  }
-
-  dispatcher()->Send(new PpapiHostMsg_PPBInstance_SessionKeysChange(
-      API_ID_PPB_INSTANCE, instance, session_id->value(),
-      has_additional_usable_key,
-      std::vector<PP_KeyInformation>(key_information,
-                                     key_information + key_count)));
-}
-
-void PPB_Instance_Proxy::SessionExpirationChange(PP_Instance instance,
-                                                 PP_Var session_id_var,
-                                                 PP_Time new_expiry_time) {
-  StringVar* session_id = StringVar::FromPPVar(session_id_var);
-  if (!session_id ||
-      session_id->value().length() > media::limits::kMaxSessionIdLength) {
-    NOTREACHED();
-    return;
-  }
-
-  dispatcher()->Send(new PpapiHostMsg_PPBInstance_SessionExpirationChange(
-      API_ID_PPB_INSTANCE, instance, session_id->value(), new_expiry_time));
-}
-
-void PPB_Instance_Proxy::SessionClosed(PP_Instance instance,
-                                       PP_Var session_id_var) {
-  dispatcher()->Send(new PpapiHostMsg_PPBInstance_SessionClosed(
-      API_ID_PPB_INSTANCE, instance,
-      SerializedVarSendInput(dispatcher(), session_id_var)));
-}
-
-void PPB_Instance_Proxy::LegacySessionError(PP_Instance instance,
-                                            PP_Var session_id_var,
-                                            PP_CdmExceptionCode exception_code,
-                                            uint32_t system_code,
-                                            PP_Var error_description_var) {
-  dispatcher()->Send(new PpapiHostMsg_PPBInstance_LegacySessionError(
-      API_ID_PPB_INSTANCE, instance,
-      SerializedVarSendInput(dispatcher(), session_id_var), exception_code,
-      system_code,
-      SerializedVarSendInput(dispatcher(), error_description_var)));
-}
-
-void PPB_Instance_Proxy::DeliverBlock(PP_Instance instance,
-                                      PP_Resource decrypted_block,
-                                      const PP_DecryptedBlockInfo* block_info) {
-  PP_Resource decrypted_block_host_resource = 0;
-
-  if (decrypted_block) {
-    Resource* object =
-        PpapiGlobals::Get()->GetResourceTracker()->GetResource(decrypted_block);
-    if (!object || object->pp_instance() != instance) {
-      NOTREACHED();
-      return;
-    }
-    decrypted_block_host_resource = object->host_resource().host_resource();
-  }
-
-  std::string serialized_block_info;
-  if (!SerializeBlockInfo(*block_info, &serialized_block_info)) {
-    NOTREACHED();
-    return;
-  }
-
-  dispatcher()->Send(
-      new PpapiHostMsg_PPBInstance_DeliverBlock(API_ID_PPB_INSTANCE,
-          instance,
-          decrypted_block_host_resource,
-          serialized_block_info));
-}
-
-void PPB_Instance_Proxy::DecoderInitializeDone(
-    PP_Instance instance,
-    PP_DecryptorStreamType decoder_type,
-    uint32_t request_id,
-    PP_Bool success) {
-  dispatcher()->Send(
-      new PpapiHostMsg_PPBInstance_DecoderInitializeDone(
-          API_ID_PPB_INSTANCE,
-          instance,
-          decoder_type,
-          request_id,
-          success));
-}
-
-void PPB_Instance_Proxy::DecoderDeinitializeDone(
-    PP_Instance instance,
-    PP_DecryptorStreamType decoder_type,
-    uint32_t request_id) {
-  dispatcher()->Send(
-      new PpapiHostMsg_PPBInstance_DecoderDeinitializeDone(
-          API_ID_PPB_INSTANCE,
-          instance,
-          decoder_type,
-          request_id));
-}
-
-void PPB_Instance_Proxy::DecoderResetDone(PP_Instance instance,
-                                          PP_DecryptorStreamType decoder_type,
-                                          uint32_t request_id) {
-  dispatcher()->Send(
-      new PpapiHostMsg_PPBInstance_DecoderResetDone(
-          API_ID_PPB_INSTANCE,
-          instance,
-          decoder_type,
-          request_id));
-}
-
-void PPB_Instance_Proxy::DeliverFrame(PP_Instance instance,
-                                      PP_Resource decrypted_frame,
-                                      const PP_DecryptedFrameInfo* frame_info) {
-  PP_Resource host_resource = 0;
-  if (decrypted_frame != 0) {
-    ResourceTracker* tracker = PpapiGlobals::Get()->GetResourceTracker();
-    Resource* object = tracker->GetResource(decrypted_frame);
-
-    if (!object || object->pp_instance() != instance) {
-      NOTREACHED();
-      return;
-    }
-
-    host_resource = object->host_resource().host_resource();
-  }
-
-  std::string serialized_frame_info;
-  if (!SerializeBlockInfo(*frame_info, &serialized_frame_info)) {
-    NOTREACHED();
-    return;
-  }
-
-  dispatcher()->Send(
-      new PpapiHostMsg_PPBInstance_DeliverFrame(API_ID_PPB_INSTANCE,
-                                                instance,
-                                                host_resource,
-                                                serialized_frame_info));
-}
-
-void PPB_Instance_Proxy::DeliverSamples(
-    PP_Instance instance,
-    PP_Resource decrypted_samples,
-    const PP_DecryptedSampleInfo* sample_info) {
-  PP_Resource host_resource = 0;
-  if (decrypted_samples != 0) {
-    ResourceTracker* tracker = PpapiGlobals::Get()->GetResourceTracker();
-    Resource* object = tracker->GetResource(decrypted_samples);
-
-    if (!object || object->pp_instance() != instance) {
-      NOTREACHED();
-      return;
-    }
-
-    host_resource = object->host_resource().host_resource();
-  }
-
-  std::string serialized_sample_info;
-  if (!SerializeBlockInfo(*sample_info, &serialized_sample_info)) {
-    NOTREACHED();
-    return;
-  }
-
-  dispatcher()->Send(
-      new PpapiHostMsg_PPBInstance_DeliverSamples(API_ID_PPB_INSTANCE,
-                                                  instance,
-                                                  host_resource,
-                                                  serialized_sample_info));
-}
 #endif  // !defined(OS_NACL)
 
 void PPB_Instance_Proxy::PostMessage(PP_Instance instance,
@@ -1190,227 +928,6 @@
   }
 }
 
-void PPB_Instance_Proxy::OnHostMsgPromiseResolved(PP_Instance instance,
-                                                  uint32_t promise_id) {
-  if (!dispatcher()->permissions().HasPermission(PERMISSION_PRIVATE))
-    return;
-  EnterInstanceNoLock enter(instance);
-  if (enter.succeeded()) {
-    enter.functions()->PromiseResolved(instance, promise_id);
-  }
-}
-
-void PPB_Instance_Proxy::OnHostMsgPromiseResolvedWithKeyStatus(
-    PP_Instance instance,
-    uint32_t promise_id,
-    PP_CdmKeyStatus key_status) {
-  if (!dispatcher()->permissions().HasPermission(PERMISSION_PRIVATE))
-    return;
-  EnterInstanceNoLock enter(instance);
-  if (enter.succeeded()) {
-    enter.functions()->PromiseResolvedWithKeyStatus(instance, promise_id,
-                                                    key_status);
-  }
-}
-
-void PPB_Instance_Proxy::OnHostMsgPromiseResolvedWithSession(
-    PP_Instance instance,
-    uint32_t promise_id,
-    SerializedVarReceiveInput session_id) {
-  if (!dispatcher()->permissions().HasPermission(PERMISSION_PRIVATE))
-    return;
-  EnterInstanceNoLock enter(instance);
-  if (enter.succeeded()) {
-    enter.functions()->PromiseResolvedWithSession(instance, promise_id,
-                                                  session_id.Get(dispatcher()));
-  }
-}
-
-void PPB_Instance_Proxy::OnHostMsgPromiseRejected(
-    PP_Instance instance,
-    uint32_t promise_id,
-    PP_CdmExceptionCode exception_code,
-    uint32_t system_code,
-    SerializedVarReceiveInput error_description) {
-  if (!dispatcher()->permissions().HasPermission(PERMISSION_PRIVATE))
-    return;
-  EnterInstanceNoLock enter(instance);
-  if (enter.succeeded()) {
-    enter.functions()->PromiseRejected(instance,
-                                       promise_id,
-                                       exception_code,
-                                       system_code,
-                                       error_description.Get(dispatcher()));
-  }
-}
-
-void PPB_Instance_Proxy::OnHostMsgSessionMessage(
-    PP_Instance instance,
-    SerializedVarReceiveInput session_id,
-    PP_CdmMessageType message_type,
-    SerializedVarReceiveInput message,
-    SerializedVarReceiveInput legacy_destination_url) {
-  if (!dispatcher()->permissions().HasPermission(PERMISSION_PRIVATE))
-    return;
-  EnterInstanceNoLock enter(instance);
-  if (enter.succeeded()) {
-    enter.functions()->SessionMessage(instance, session_id.Get(dispatcher()),
-                                      message_type, message.Get(dispatcher()),
-                                      legacy_destination_url.Get(dispatcher()));
-  }
-}
-
-void PPB_Instance_Proxy::OnHostMsgSessionKeysChange(
-    PP_Instance instance,
-    const std::string& session_id,
-    PP_Bool has_additional_usable_key,
-    const std::vector<PP_KeyInformation>& key_information) {
-  if (!dispatcher()->permissions().HasPermission(PERMISSION_PRIVATE))
-    return;
-
-  if (key_information.size() > media::limits::kMaxKeyIds) {
-    NOTREACHED();
-    return;
-  }
-
-  EnterInstanceNoLock enter(instance);
-  if (enter.succeeded()) {
-    ScopedPPVar session_id_var(ScopedPPVar::PassRef(),
-                               StringVar::StringToPPVar(session_id));
-    enter.functions()->SessionKeysChange(
-        instance, session_id_var.get(), has_additional_usable_key,
-        base::checked_cast<uint32_t>(key_information.size()),
-        key_information.data());
-  }
-}
-
-void PPB_Instance_Proxy::OnHostMsgSessionExpirationChange(
-    PP_Instance instance,
-    const std::string& session_id,
-    PP_Time new_expiry_time) {
-  if (!dispatcher()->permissions().HasPermission(PERMISSION_PRIVATE))
-    return;
-  EnterInstanceNoLock enter(instance);
-  if (enter.succeeded()) {
-    ScopedPPVar session_id_var(ScopedPPVar::PassRef(),
-                               StringVar::StringToPPVar(session_id));
-    enter.functions()->SessionExpirationChange(instance, session_id_var.get(),
-                                               new_expiry_time);
-  }
-}
-
-void PPB_Instance_Proxy::OnHostMsgSessionClosed(
-    PP_Instance instance,
-    SerializedVarReceiveInput session_id) {
-  if (!dispatcher()->permissions().HasPermission(PERMISSION_PRIVATE))
-    return;
-  EnterInstanceNoLock enter(instance);
-  if (enter.succeeded()) {
-    enter.functions()->SessionClosed(instance, session_id.Get(dispatcher()));
-  }
-}
-
-void PPB_Instance_Proxy::OnHostMsgLegacySessionError(
-    PP_Instance instance,
-    SerializedVarReceiveInput session_id,
-    PP_CdmExceptionCode exception_code,
-    uint32_t system_code,
-    SerializedVarReceiveInput error_description) {
-  if (!dispatcher()->permissions().HasPermission(PERMISSION_PRIVATE))
-    return;
-  EnterInstanceNoLock enter(instance);
-  if (enter.succeeded()) {
-    enter.functions()->LegacySessionError(
-        instance, session_id.Get(dispatcher()), exception_code, system_code,
-        error_description.Get(dispatcher()));
-  }
-}
-
-void PPB_Instance_Proxy::OnHostMsgDeliverBlock(
-    PP_Instance instance,
-    PP_Resource decrypted_block,
-    const std::string& serialized_block_info) {
-  if (!dispatcher()->permissions().HasPermission(PERMISSION_PRIVATE))
-    return;
-  PP_DecryptedBlockInfo block_info;
-  if (!DeserializeBlockInfo(serialized_block_info, &block_info))
-    return;
-
-  EnterInstanceNoLock enter(instance);
-  if (enter.succeeded())
-    enter.functions()->DeliverBlock(instance, decrypted_block, &block_info);
-}
-
-void PPB_Instance_Proxy::OnHostMsgDecoderInitializeDone(
-    PP_Instance instance,
-    PP_DecryptorStreamType decoder_type,
-    uint32_t request_id,
-    PP_Bool success) {
-  if (!dispatcher()->permissions().HasPermission(PERMISSION_PRIVATE))
-    return;
-  EnterInstanceNoLock enter(instance);
-  if (enter.succeeded()) {
-    enter.functions()->DecoderInitializeDone(instance,
-                                             decoder_type,
-                                             request_id,
-                                             success);
-  }
-}
-
-void PPB_Instance_Proxy::OnHostMsgDecoderDeinitializeDone(
-    PP_Instance instance,
-    PP_DecryptorStreamType decoder_type,
-    uint32_t request_id) {
-  if (!dispatcher()->permissions().HasPermission(PERMISSION_PRIVATE))
-    return;
-  EnterInstanceNoLock enter(instance);
-  if (enter.succeeded())
-    enter.functions()->DecoderDeinitializeDone(instance,
-                                               decoder_type,
-                                               request_id);
-}
-
-void PPB_Instance_Proxy::OnHostMsgDecoderResetDone(
-    PP_Instance instance,
-    PP_DecryptorStreamType decoder_type,
-    uint32_t request_id) {
-  if (!dispatcher()->permissions().HasPermission(PERMISSION_PRIVATE))
-    return;
-  EnterInstanceNoLock enter(instance);
-  if (enter.succeeded())
-    enter.functions()->DecoderResetDone(instance, decoder_type, request_id);
-}
-
-void PPB_Instance_Proxy::OnHostMsgDeliverFrame(
-    PP_Instance instance,
-    PP_Resource decrypted_frame,
-    const std::string& serialized_frame_info) {
-  if (!dispatcher()->permissions().HasPermission(PERMISSION_PRIVATE))
-    return;
-  PP_DecryptedFrameInfo frame_info;
-  if (!DeserializeBlockInfo(serialized_frame_info, &frame_info))
-    return;
-
-  EnterInstanceNoLock enter(instance);
-  if (enter.succeeded())
-    enter.functions()->DeliverFrame(instance, decrypted_frame, &frame_info);
-}
-
-void PPB_Instance_Proxy::OnHostMsgDeliverSamples(
-    PP_Instance instance,
-    PP_Resource audio_frames,
-    const std::string& serialized_sample_info) {
-  if (!dispatcher()->permissions().HasPermission(PERMISSION_PRIVATE))
-    return;
-  PP_DecryptedSampleInfo sample_info;
-  if (!DeserializeBlockInfo(serialized_sample_info, &sample_info))
-    return;
-
-  EnterInstanceNoLock enter(instance);
-  if (enter.succeeded())
-    enter.functions()->DeliverSamples(instance, audio_frames, &sample_info);
-}
-
 void PPB_Instance_Proxy::OnHostMsgSetCursor(
     PP_Instance instance,
     int32_t type,
diff --git a/ppapi/proxy/ppb_instance_proxy.h b/ppapi/proxy/ppb_instance_proxy.h
index 85e0f019..7bea4ee 100644
--- a/ppapi/proxy/ppb_instance_proxy.h
+++ b/ppapi/proxy/ppb_instance_proxy.h
@@ -27,9 +27,6 @@
 #undef PostMessage
 #endif
 
-struct PP_DecryptedBlockInfo;
-struct PP_DecryptedFrameInfo;
-
 namespace ppapi {
 namespace proxy {
 
@@ -114,57 +111,6 @@
                               PP_URLComponents_Dev* components) override;
   PP_Var GetPluginReferrerURL(PP_Instance instance,
                               PP_URLComponents_Dev* components) override;
-  void PromiseResolved(PP_Instance instance, uint32_t promise_id) override;
-  void PromiseResolvedWithKeyStatus(PP_Instance instance,
-                                    uint32_t promise_id,
-                                    PP_CdmKeyStatus key_status) override;
-  void PromiseResolvedWithSession(PP_Instance instance,
-                                  uint32_t promise_id,
-                                  PP_Var session_id_var) override;
-  void PromiseRejected(PP_Instance instance,
-                       uint32_t promise_id,
-                       PP_CdmExceptionCode exception_code,
-                       uint32_t system_code,
-                       PP_Var error_description_var) override;
-  void SessionMessage(PP_Instance instance,
-                      PP_Var session_id_var,
-                      PP_CdmMessageType message_type,
-                      PP_Var message_var,
-                      PP_Var legacy_destination_url_var) override;
-  void SessionKeysChange(
-      PP_Instance instance,
-      PP_Var session_id_var,
-      PP_Bool has_additional_usable_key,
-      uint32_t key_count,
-      const struct PP_KeyInformation key_information[]) override;
-  void SessionExpirationChange(PP_Instance instance,
-                               PP_Var session_id_var,
-                               PP_Time new_expiry_time) override;
-  void SessionClosed(PP_Instance instance, PP_Var session_id_var) override;
-  void LegacySessionError(PP_Instance instance,
-                          PP_Var session_id_var,
-                          PP_CdmExceptionCode exception_code,
-                          uint32_t system_code,
-                          PP_Var error_description_var) override;
-  void DeliverBlock(PP_Instance instance,
-                    PP_Resource decrypted_block,
-                    const PP_DecryptedBlockInfo* block_info) override;
-  void DecoderInitializeDone(PP_Instance instance,
-                             PP_DecryptorStreamType decoder_type,
-                             uint32_t request_id,
-                             PP_Bool success) override;
-  void DecoderDeinitializeDone(PP_Instance instance,
-                               PP_DecryptorStreamType decoder_type,
-                               uint32_t request_id) override;
-  void DecoderResetDone(PP_Instance instance,
-                        PP_DecryptorStreamType decoder_type,
-                        uint32_t request_id) override;
-  void DeliverFrame(PP_Instance instance,
-                    PP_Resource decrypted_frame,
-                    const PP_DecryptedFrameInfo* frame_info) override;
-  void DeliverSamples(PP_Instance instance,
-                      PP_Resource audio_frames,
-                      const PP_DecryptedSampleInfo* sample_info) override;
 #endif  // !defined(OS_NACL)
 
   static const ApiID kApiID = API_ID_PPB_INSTANCE;
@@ -243,68 +189,6 @@
                                      SerializedVarReturnValue result);
   void OnHostMsgGetPluginReferrerURL(PP_Instance instance,
                                      SerializedVarReturnValue result);
-
-  virtual void OnHostMsgPromiseResolved(PP_Instance instance,
-                                        uint32_t promise_id);
-  virtual void OnHostMsgPromiseResolvedWithKeyStatus(
-      PP_Instance instance,
-      uint32_t promise_id,
-      PP_CdmKeyStatus key_status);
-  virtual void OnHostMsgPromiseResolvedWithSession(
-      PP_Instance instance,
-      uint32_t promise_id,
-      SerializedVarReceiveInput session_id);
-  virtual void OnHostMsgPromiseRejected(
-      PP_Instance instance,
-      uint32_t promise_id,
-      PP_CdmExceptionCode exception_code,
-      uint32_t system_code,
-      SerializedVarReceiveInput error_description);
-  virtual void OnHostMsgSessionMessage(
-      PP_Instance instance,
-      SerializedVarReceiveInput session_id,
-      PP_CdmMessageType message_type,
-      SerializedVarReceiveInput message,
-      SerializedVarReceiveInput legacy_destination_url);
-  virtual void OnHostMsgSessionKeysChange(
-      PP_Instance instance,
-      const std::string& session_id,
-      PP_Bool has_additional_usable_key,
-      const std::vector<PP_KeyInformation>& key_information);
-  virtual void OnHostMsgSessionExpirationChange(
-      PP_Instance instance,
-      const std::string& session_id,
-      PP_Time new_expiry_time);
-  virtual void OnHostMsgSessionClosed(PP_Instance instance,
-                                      SerializedVarReceiveInput session_id);
-  virtual void OnHostMsgLegacySessionError(
-      PP_Instance instance,
-      SerializedVarReceiveInput session_id,
-      PP_CdmExceptionCode exception_code,
-      uint32_t system_code,
-      SerializedVarReceiveInput error_description);
-  virtual void OnHostMsgDecoderInitializeDone(
-      PP_Instance instance,
-      PP_DecryptorStreamType decoder_type,
-      uint32_t request_id,
-      PP_Bool success);
-  virtual void OnHostMsgDecoderDeinitializeDone(
-      PP_Instance instance,
-      PP_DecryptorStreamType decoder_type,
-      uint32_t request_id);
-  virtual void OnHostMsgDecoderResetDone(PP_Instance instance,
-                                         PP_DecryptorStreamType decoder_type,
-                                         uint32_t request_id);
-  virtual void OnHostMsgDeliverBlock(PP_Instance instance,
-                                     PP_Resource decrypted_block,
-                                     const std::string& serialized_block_info);
-  virtual void OnHostMsgDeliverFrame(PP_Instance instance,
-                                     PP_Resource decrypted_frame,
-                                     const std::string& serialized_block_info);
-  virtual void OnHostMsgDeliverSamples(
-      PP_Instance instance,
-      PP_Resource audio_frames,
-      const std::string& serialized_sample_info);
 #endif  // !defined(OS_NACL)
 
   // Host -> Plugin message handlers.
diff --git a/ppapi/proxy/ppp_content_decryptor_private_proxy.cc b/ppapi/proxy/ppp_content_decryptor_private_proxy.cc
deleted file mode 100644
index 53fad85..0000000
--- a/ppapi/proxy/ppp_content_decryptor_private_proxy.cc
+++ /dev/null
@@ -1,768 +0,0 @@
-// Copyright (c) 2012 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 "ppapi/proxy/ppp_content_decryptor_private_proxy.h"
-
-#include "base/files/file.h"
-#include "media/base/limits.h"
-#include "ppapi/c/pp_bool.h"
-#include "ppapi/c/ppb_core.h"
-#include "ppapi/proxy/content_decryptor_private_serializer.h"
-#include "ppapi/proxy/host_dispatcher.h"
-#include "ppapi/proxy/plugin_globals.h"
-#include "ppapi/proxy/plugin_resource_tracker.h"
-#include "ppapi/proxy/ppapi_messages.h"
-#include "ppapi/proxy/ppb_buffer_proxy.h"
-#include "ppapi/proxy/serialized_var.h"
-#include "ppapi/shared_impl/scoped_pp_resource.h"
-#include "ppapi/shared_impl/scoped_pp_var.h"
-#include "ppapi/shared_impl/var_tracker.h"
-#include "ppapi/thunk/enter.h"
-#include "ppapi/thunk/ppb_buffer_api.h"
-#include "ppapi/thunk/ppb_instance_api.h"
-#include "ppapi/thunk/thunk.h"
-
-using ppapi::thunk::EnterResourceNoLock;
-using ppapi::thunk::PPB_Buffer_API;
-using ppapi::thunk::PPB_Instance_API;
-
-namespace ppapi {
-namespace proxy {
-
-namespace {
-
-PP_Bool DescribeHostBufferResource(PP_Resource resource, uint32_t* size) {
-  EnterResourceNoLock<PPB_Buffer_API> enter(resource, true);
-  if (enter.failed())
-    return PP_FALSE;
-  return enter.object()->Describe(size);
-}
-
-// TODO(dmichael): Refactor so this handle sharing code is in one place.
-PP_Bool ShareHostBufferResourceToPlugin(
-    HostDispatcher* dispatcher,
-    PP_Resource resource,
-    base::SharedMemoryHandle* shared_mem_handle) {
-  if (!dispatcher || resource == 0 || !shared_mem_handle)
-    return PP_FALSE;
-  EnterResourceNoLock<PPB_Buffer_API> enter(resource, true);
-  if (enter.failed())
-    return PP_FALSE;
-  base::SharedMemory* shm;
-  int32_t result = enter.object()->GetSharedMemory(&shm);
-  if (result != PP_OK)
-    return PP_FALSE;
-
-  *shared_mem_handle =
-      dispatcher->ShareSharedMemoryHandleWithRemote(shm->handle());
-  return PP_TRUE;
-}
-
-// SerializedVarReceiveInput will decrement the reference count, but we want
-// to give the recipient a reference. This utility function takes care of that
-// work for the message handlers defined below.
-PP_Var ExtractReceivedVarAndAddRef(Dispatcher* dispatcher,
-                                   SerializedVarReceiveInput* serialized_var) {
-  PP_Var var = serialized_var->Get(dispatcher);
-  PpapiGlobals::Get()->GetVarTracker()->AddRefVar(var);
-  return var;
-}
-
-bool InitializePppDecryptorBuffer(PP_Instance instance,
-                                  HostDispatcher* dispatcher,
-                                  PP_Resource resource,
-                                  PPPDecryptor_Buffer* buffer) {
-  if (!buffer) {
-    NOTREACHED();
-    return false;
-  }
-
-  if (resource == 0) {
-    buffer->resource = HostResource();
-    buffer->handle = base::SharedMemoryHandle();
-    buffer->size = 0;
-    return true;
-  }
-
-  HostResource host_resource;
-  host_resource.SetHostResource(instance, resource);
-
-  uint32_t size = 0;
-  if (DescribeHostBufferResource(resource, &size) == PP_FALSE)
-    return false;
-
-  base::SharedMemoryHandle handle;
-  if (ShareHostBufferResourceToPlugin(dispatcher,
-                                      resource,
-                                      &handle) == PP_FALSE)
-    return false;
-
-  buffer->resource = host_resource;
-  buffer->handle = handle;
-  buffer->size = size;
-  return true;
-}
-
-void Initialize(PP_Instance instance,
-                uint32_t promise_id,
-                PP_Var key_system,
-                PP_Bool allow_distinctive_identifier,
-                PP_Bool allow_persistent_state) {
-  HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
-  if (!dispatcher) {
-    NOTREACHED();
-    return;
-  }
-
-  dispatcher->Send(new PpapiMsg_PPPContentDecryptor_Initialize(
-      API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE, instance, promise_id,
-      SerializedVarSendInput(dispatcher, key_system),
-      allow_distinctive_identifier, allow_persistent_state));
-}
-
-void SetServerCertificate(PP_Instance instance,
-                          uint32_t promise_id,
-                          PP_Var server_certificate) {
-  HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
-  if (!dispatcher) {
-    NOTREACHED();
-    return;
-  }
-
-  ArrayBufferVar* server_certificate_buffer =
-      ArrayBufferVar::FromPPVar(server_certificate);
-  if (!server_certificate_buffer ||
-      server_certificate_buffer->ByteLength() <
-          media::limits::kMinCertificateLength ||
-      server_certificate_buffer->ByteLength() >
-          media::limits::kMaxCertificateLength) {
-    NOTREACHED();
-    return;
-  }
-
-  const uint8_t* server_certificate_ptr =
-      static_cast<const uint8_t*>(server_certificate_buffer->Map());
-  const uint32_t server_certificate_size =
-      server_certificate_buffer->ByteLength();
-  std::vector<uint8_t> server_certificate_vector(
-      server_certificate_ptr, server_certificate_ptr + server_certificate_size);
-
-  dispatcher->Send(new PpapiMsg_PPPContentDecryptor_SetServerCertificate(
-      API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE,
-      instance,
-      promise_id,
-      server_certificate_vector));
-}
-
-void GetStatusForPolicy(PP_Instance instance,
-                        uint32_t promise_id,
-                        PP_HdcpVersion min_hdcp_version) {
-  HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
-  if (!dispatcher) {
-    NOTREACHED();
-    return;
-  }
-
-  dispatcher->Send(new PpapiMsg_PPPContentDecryptor_GetStatusForPolicy(
-      API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE, instance, promise_id,
-      min_hdcp_version));
-}
-
-void CreateSessionAndGenerateRequest(PP_Instance instance,
-                                     uint32_t promise_id,
-                                     PP_SessionType session_type,
-                                     PP_InitDataType init_data_type,
-                                     PP_Var init_data) {
-  HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
-  if (!dispatcher) {
-    NOTREACHED();
-    return;
-  }
-
-  dispatcher->Send(
-      new PpapiMsg_PPPContentDecryptor_CreateSessionAndGenerateRequest(
-          API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE, instance, promise_id,
-          session_type, init_data_type,
-          SerializedVarSendInput(dispatcher, init_data)));
-}
-
-void LoadSession(PP_Instance instance,
-                 uint32_t promise_id,
-                 PP_SessionType session_type,
-                 PP_Var session_id) {
-  HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
-  if (!dispatcher) {
-    NOTREACHED();
-    return;
-  }
-
-  dispatcher->Send(new PpapiMsg_PPPContentDecryptor_LoadSession(
-      API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE, instance, promise_id, session_type,
-      SerializedVarSendInput(dispatcher, session_id)));
-}
-
-void UpdateSession(PP_Instance instance,
-                   uint32_t promise_id,
-                   PP_Var session_id,
-                   PP_Var response) {
-  HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
-  if (!dispatcher) {
-    NOTREACHED();
-    return;
-  }
-
-  dispatcher->Send(new PpapiMsg_PPPContentDecryptor_UpdateSession(
-      API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE, instance, promise_id,
-      SerializedVarSendInput(dispatcher, session_id),
-      SerializedVarSendInput(dispatcher, response)));
-}
-
-void CloseSession(PP_Instance instance,
-                  uint32_t promise_id,
-                  PP_Var session_id) {
-  HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
-  if (!dispatcher) {
-    NOTREACHED();
-    return;
-  }
-
-  StringVar* session_id_string = StringVar::FromPPVar(session_id);
-  if (!session_id_string ||
-      session_id_string->value().length() >
-          media::limits::kMaxSessionIdLength) {
-    NOTREACHED();
-    return;
-  }
-
-  dispatcher->Send(new PpapiMsg_PPPContentDecryptor_CloseSession(
-      API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE, instance, promise_id,
-      session_id_string->value()));
-}
-
-void RemoveSession(PP_Instance instance,
-                   uint32_t promise_id,
-                   PP_Var session_id) {
-  HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
-  if (!dispatcher) {
-    NOTREACHED();
-    return;
-  }
-
-  StringVar* session_id_string = StringVar::FromPPVar(session_id);
-  if (!session_id_string ||
-      session_id_string->value().length() >
-          media::limits::kMaxSessionIdLength) {
-    NOTREACHED();
-    return;
-  }
-
-  dispatcher->Send(new PpapiMsg_PPPContentDecryptor_RemoveSession(
-      API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE, instance, promise_id,
-      session_id_string->value()));
-}
-
-void Decrypt(PP_Instance instance,
-             PP_Resource encrypted_block,
-             const PP_EncryptedBlockInfo* encrypted_block_info) {
-  HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
-  if (!dispatcher) {
-    NOTREACHED();
-    return;
-  }
-
-  PPPDecryptor_Buffer buffer;
-  if (!InitializePppDecryptorBuffer(instance,
-                                    dispatcher,
-                                    encrypted_block,
-                                    &buffer)) {
-    NOTREACHED();
-    return;
-  }
-
-  std::string serialized_block_info;
-  if (!SerializeBlockInfo(*encrypted_block_info, &serialized_block_info)) {
-    NOTREACHED();
-    return;
-  }
-
-  // PluginResourceTracker in the plugin process assumes that resources that it
-  // tracks have been addrefed on behalf of the plugin at the renderer side. So
-  // we explicitly do it for |encryped_block| here.
-  PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(encrypted_block);
-
-  dispatcher->Send(
-      new PpapiMsg_PPPContentDecryptor_Decrypt(
-          API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE,
-          instance,
-          buffer,
-          serialized_block_info));
-}
-
-void InitializeAudioDecoder(
-    PP_Instance instance,
-    const PP_AudioDecoderConfig* decoder_config,
-    PP_Resource extra_data_buffer) {
-  HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
-  if (!dispatcher) {
-    NOTREACHED();
-    return;
-  }
-
-  std::string serialized_decoder_config;
-  if (!SerializeBlockInfo(*decoder_config, &serialized_decoder_config)) {
-    NOTREACHED();
-    return;
-  }
-
-  PPPDecryptor_Buffer buffer;
-  if (!InitializePppDecryptorBuffer(instance,
-                                    dispatcher,
-                                    extra_data_buffer,
-                                    &buffer)) {
-    NOTREACHED();
-    return;
-  }
-
-  // PluginResourceTracker in the plugin process assumes that resources that it
-  // tracks have been addrefed on behalf of the plugin at the renderer side. So
-  // we explicitly do it for |extra_data_buffer| here.
-  PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(extra_data_buffer);
-
-  dispatcher->Send(
-      new PpapiMsg_PPPContentDecryptor_InitializeAudioDecoder(
-          API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE,
-          instance,
-          serialized_decoder_config,
-          buffer));
-}
-
-void InitializeVideoDecoder(
-    PP_Instance instance,
-    const PP_VideoDecoderConfig* decoder_config,
-    PP_Resource extra_data_buffer) {
-  HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
-  if (!dispatcher) {
-    NOTREACHED();
-    return;
-  }
-
-  std::string serialized_decoder_config;
-  if (!SerializeBlockInfo(*decoder_config, &serialized_decoder_config)) {
-    NOTREACHED();
-    return;
-  }
-
-  PPPDecryptor_Buffer buffer;
-  if (!InitializePppDecryptorBuffer(instance,
-                                    dispatcher,
-                                    extra_data_buffer,
-                                    &buffer)) {
-    NOTREACHED();
-    return;
-  }
-
-  // PluginResourceTracker in the plugin process assumes that resources that it
-  // tracks have been addrefed on behalf of the plugin at the renderer side. So
-  // we explicitly do it for |extra_data_buffer| here.
-  PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(extra_data_buffer);
-
-  dispatcher->Send(
-      new PpapiMsg_PPPContentDecryptor_InitializeVideoDecoder(
-          API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE,
-          instance,
-          serialized_decoder_config,
-          buffer));
-}
-
-
-void DeinitializeDecoder(PP_Instance instance,
-                         PP_DecryptorStreamType decoder_type,
-                         uint32_t request_id) {
-  HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
-  if (!dispatcher) {
-    NOTREACHED();
-    return;
-  }
-
-  dispatcher->Send(
-      new PpapiMsg_PPPContentDecryptor_DeinitializeDecoder(
-          API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE,
-          instance,
-          decoder_type,
-          request_id));
-}
-
-void ResetDecoder(PP_Instance instance,
-                  PP_DecryptorStreamType decoder_type,
-                  uint32_t request_id) {
-  HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
-  if (!dispatcher) {
-    NOTREACHED();
-    return;
-  }
-
-  dispatcher->Send(
-      new PpapiMsg_PPPContentDecryptor_ResetDecoder(
-          API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE,
-          instance,
-          decoder_type,
-          request_id));
-}
-
-void DecryptAndDecode(PP_Instance instance,
-                      PP_DecryptorStreamType decoder_type,
-                      PP_Resource encrypted_buffer,
-                      const PP_EncryptedBlockInfo* encrypted_block_info) {
-  HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
-  if (!dispatcher) {
-    NOTREACHED();
-    return;
-  }
-
-  PPPDecryptor_Buffer buffer;
-  if (!InitializePppDecryptorBuffer(instance,
-                                    dispatcher,
-                                    encrypted_buffer,
-                                    &buffer)) {
-    NOTREACHED();
-    return;
-  }
-
-  std::string serialized_block_info;
-  if (!SerializeBlockInfo(*encrypted_block_info, &serialized_block_info)) {
-    NOTREACHED();
-    return;
-  }
-
-  // PluginResourceTracker in the plugin process assumes that resources that it
-  // tracks have been addrefed on behalf of the plugin at the renderer side. So
-  // we explicitly do it for |encrypted_buffer| here.
-  PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(encrypted_buffer);
-
-  dispatcher->Send(
-      new PpapiMsg_PPPContentDecryptor_DecryptAndDecode(
-          API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE,
-          instance,
-          decoder_type,
-          buffer,
-          serialized_block_info));
-}
-
-static const PPP_ContentDecryptor_Private content_decryptor_interface = {
-    &Initialize,
-    &SetServerCertificate,
-    &GetStatusForPolicy,
-    &CreateSessionAndGenerateRequest,
-    &LoadSession,
-    &UpdateSession,
-    &CloseSession,
-    &RemoveSession,
-    &Decrypt,
-    &InitializeAudioDecoder,
-    &InitializeVideoDecoder,
-    &DeinitializeDecoder,
-    &ResetDecoder,
-    &DecryptAndDecode};
-
-}  // namespace
-
-PPP_ContentDecryptor_Private_Proxy::PPP_ContentDecryptor_Private_Proxy(
-    Dispatcher* dispatcher)
-    : InterfaceProxy(dispatcher),
-      ppp_decryptor_impl_(NULL) {
-  if (dispatcher->IsPlugin()) {
-    ppp_decryptor_impl_ = static_cast<const PPP_ContentDecryptor_Private*>(
-        dispatcher->local_get_interface()(
-            PPP_CONTENTDECRYPTOR_PRIVATE_INTERFACE));
-  }
-}
-
-PPP_ContentDecryptor_Private_Proxy::~PPP_ContentDecryptor_Private_Proxy() {
-}
-
-// static
-const PPP_ContentDecryptor_Private*
-    PPP_ContentDecryptor_Private_Proxy::GetProxyInterface() {
-  return &content_decryptor_interface;
-}
-
-bool PPP_ContentDecryptor_Private_Proxy::OnMessageReceived(
-    const IPC::Message& msg) {
-  if (!dispatcher()->IsPlugin())
-    return false;  // These are only valid from host->plugin.
-                   // Don't allow the plugin to send these to the host.
-
-  bool handled = true;
-  IPC_BEGIN_MESSAGE_MAP(PPP_ContentDecryptor_Private_Proxy, msg)
-    IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_Initialize,
-                        OnMsgInitialize)
-    IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_SetServerCertificate,
-                        OnMsgSetServerCertificate)
-    IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_GetStatusForPolicy,
-                        OnMsgGetStatusForPolicy)
-    IPC_MESSAGE_HANDLER(
-        PpapiMsg_PPPContentDecryptor_CreateSessionAndGenerateRequest,
-        OnMsgCreateSessionAndGenerateRequest)
-    IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_LoadSession,
-                        OnMsgLoadSession)
-    IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_UpdateSession,
-                        OnMsgUpdateSession)
-    IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_CloseSession,
-                        OnMsgCloseSession)
-    IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_RemoveSession,
-                        OnMsgRemoveSession)
-    IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_Decrypt,
-                        OnMsgDecrypt)
-    IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_InitializeAudioDecoder,
-                        OnMsgInitializeAudioDecoder)
-    IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_InitializeVideoDecoder,
-                        OnMsgInitializeVideoDecoder)
-    IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_DeinitializeDecoder,
-                        OnMsgDeinitializeDecoder)
-    IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_ResetDecoder,
-                        OnMsgResetDecoder)
-    IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_DecryptAndDecode,
-                        OnMsgDecryptAndDecode)
-    IPC_MESSAGE_UNHANDLED(handled = false)
-  IPC_END_MESSAGE_MAP()
-  DCHECK(handled);
-  return handled;
-}
-
-void PPP_ContentDecryptor_Private_Proxy::OnMsgInitialize(
-    PP_Instance instance,
-    uint32_t promise_id,
-    SerializedVarReceiveInput key_system,
-    PP_Bool allow_distinctive_identifier,
-    PP_Bool allow_persistent_state) {
-  if (ppp_decryptor_impl_) {
-    CallWhileUnlocked(ppp_decryptor_impl_->Initialize, instance, promise_id,
-                      ExtractReceivedVarAndAddRef(dispatcher(), &key_system),
-                      allow_distinctive_identifier, allow_persistent_state);
-  }
-}
-
-void PPP_ContentDecryptor_Private_Proxy::OnMsgSetServerCertificate(
-    PP_Instance instance,
-    uint32_t promise_id,
-    std::vector<uint8_t> server_certificate) {
-  if (server_certificate.size() < media::limits::kMinCertificateLength ||
-      server_certificate.size() > media::limits::kMaxCertificateLength) {
-    NOTREACHED();
-    return;
-  }
-
-  if (ppp_decryptor_impl_) {
-    ScopedPPVar server_certificate_var(
-        ScopedPPVar::PassRef(),
-        PpapiGlobals::Get()
-            ->GetVarTracker()
-            ->MakeArrayBufferPPVar(
-                static_cast<uint32_t>(server_certificate.size()),
-                &server_certificate[0]));
-    CallWhileUnlocked(ppp_decryptor_impl_->SetServerCertificate,
-                      instance,
-                      promise_id,
-                      server_certificate_var.get());
-  }
-}
-
-void PPP_ContentDecryptor_Private_Proxy::OnMsgGetStatusForPolicy(
-    PP_Instance instance,
-    uint32_t promise_id,
-    PP_HdcpVersion min_hdcp_version) {
-  if (ppp_decryptor_impl_) {
-    CallWhileUnlocked(ppp_decryptor_impl_->GetStatusForPolicy, instance,
-                      promise_id, min_hdcp_version);
-  }
-}
-
-void PPP_ContentDecryptor_Private_Proxy::OnMsgCreateSessionAndGenerateRequest(
-    PP_Instance instance,
-    uint32_t promise_id,
-    PP_SessionType session_type,
-    PP_InitDataType init_data_type,
-    SerializedVarReceiveInput init_data) {
-  if (ppp_decryptor_impl_) {
-    CallWhileUnlocked(ppp_decryptor_impl_->CreateSessionAndGenerateRequest,
-                      instance, promise_id, session_type, init_data_type,
-                      ExtractReceivedVarAndAddRef(dispatcher(), &init_data));
-  }
-}
-
-void PPP_ContentDecryptor_Private_Proxy::OnMsgLoadSession(
-    PP_Instance instance,
-    uint32_t promise_id,
-    PP_SessionType session_type,
-    SerializedVarReceiveInput session_id) {
-  if (ppp_decryptor_impl_) {
-    CallWhileUnlocked(ppp_decryptor_impl_->LoadSession, instance, promise_id,
-                      session_type,
-                      ExtractReceivedVarAndAddRef(dispatcher(), &session_id));
-  }
-}
-
-void PPP_ContentDecryptor_Private_Proxy::OnMsgUpdateSession(
-    PP_Instance instance,
-    uint32_t promise_id,
-    SerializedVarReceiveInput session_id,
-    SerializedVarReceiveInput response) {
-  if (ppp_decryptor_impl_) {
-    CallWhileUnlocked(ppp_decryptor_impl_->UpdateSession, instance, promise_id,
-                      ExtractReceivedVarAndAddRef(dispatcher(), &session_id),
-                      ExtractReceivedVarAndAddRef(dispatcher(), &response));
-  }
-}
-
-void PPP_ContentDecryptor_Private_Proxy::OnMsgCloseSession(
-    PP_Instance instance,
-    uint32_t promise_id,
-    const std::string& session_id) {
-  if (ppp_decryptor_impl_) {
-    ScopedPPVar session_id_var(ScopedPPVar::PassRef(),
-                               StringVar::StringToPPVar(session_id));
-    CallWhileUnlocked(ppp_decryptor_impl_->CloseSession, instance, promise_id,
-                      session_id_var.get());
-  }
-}
-
-void PPP_ContentDecryptor_Private_Proxy::OnMsgRemoveSession(
-    PP_Instance instance,
-    uint32_t promise_id,
-    const std::string& session_id) {
-  if (ppp_decryptor_impl_) {
-    ScopedPPVar session_id_var(ScopedPPVar::PassRef(),
-                               StringVar::StringToPPVar(session_id));
-    CallWhileUnlocked(ppp_decryptor_impl_->RemoveSession, instance, promise_id,
-                      session_id_var.get());
-  }
-}
-
-void PPP_ContentDecryptor_Private_Proxy::OnMsgDecrypt(
-    PP_Instance instance,
-    const PPPDecryptor_Buffer& encrypted_buffer,
-    const std::string& serialized_block_info) {
-  ScopedPPResource plugin_resource(
-      ScopedPPResource::PassRef(),
-      PPB_Buffer_Proxy::AddProxyResource(encrypted_buffer.resource,
-                                         encrypted_buffer.handle,
-                                         encrypted_buffer.size));
-  if (ppp_decryptor_impl_) {
-    PP_EncryptedBlockInfo block_info;
-    if (!DeserializeBlockInfo(serialized_block_info, &block_info))
-      return;
-    CallWhileUnlocked(ppp_decryptor_impl_->Decrypt,
-                      instance,
-                      plugin_resource.get(),
-                      &block_info);
-  }
-}
-
-void PPP_ContentDecryptor_Private_Proxy::OnMsgInitializeAudioDecoder(
-    PP_Instance instance,
-    const std::string& serialized_decoder_config,
-    const PPPDecryptor_Buffer& extra_data_buffer) {
-  ScopedPPResource plugin_resource;
-  if (extra_data_buffer.size > 0) {
-    plugin_resource = ScopedPPResource(
-        ScopedPPResource::PassRef(),
-        PPB_Buffer_Proxy::AddProxyResource(extra_data_buffer.resource,
-                                           extra_data_buffer.handle,
-                                           extra_data_buffer.size));
-  }
-
-  PP_AudioDecoderConfig decoder_config;
-  if (!DeserializeBlockInfo(serialized_decoder_config, &decoder_config))
-      return;
-
-  if (ppp_decryptor_impl_) {
-    CallWhileUnlocked(
-        ppp_decryptor_impl_->InitializeAudioDecoder,
-        instance,
-        &decoder_config,
-        plugin_resource.get());
-  }
-}
-
-void PPP_ContentDecryptor_Private_Proxy::OnMsgInitializeVideoDecoder(
-    PP_Instance instance,
-    const std::string& serialized_decoder_config,
-    const PPPDecryptor_Buffer& extra_data_buffer) {
-  ScopedPPResource plugin_resource;
-  if (extra_data_buffer.resource.host_resource() != 0) {
-    plugin_resource = ScopedPPResource(
-        ScopedPPResource::PassRef(),
-        PPB_Buffer_Proxy::AddProxyResource(extra_data_buffer.resource,
-                                           extra_data_buffer.handle,
-                                           extra_data_buffer.size));
-  }
-
-  PP_VideoDecoderConfig decoder_config;
-  if (!DeserializeBlockInfo(serialized_decoder_config, &decoder_config))
-      return;
-
-  if (ppp_decryptor_impl_) {
-    CallWhileUnlocked(
-        ppp_decryptor_impl_->InitializeVideoDecoder,
-        instance,
-        &decoder_config,
-        plugin_resource.get());
-  }
-}
-
-void PPP_ContentDecryptor_Private_Proxy::OnMsgDeinitializeDecoder(
-    PP_Instance instance,
-    PP_DecryptorStreamType decoder_type,
-    uint32_t request_id) {
-  if (ppp_decryptor_impl_) {
-    CallWhileUnlocked(
-        ppp_decryptor_impl_->DeinitializeDecoder,
-        instance,
-        decoder_type,
-        request_id);
-  }
-}
-
-void PPP_ContentDecryptor_Private_Proxy::OnMsgResetDecoder(
-    PP_Instance instance,
-    PP_DecryptorStreamType decoder_type,
-    uint32_t request_id) {
-  if (ppp_decryptor_impl_) {
-    CallWhileUnlocked(
-        ppp_decryptor_impl_->ResetDecoder,
-        instance,
-        decoder_type,
-        request_id);
-  }
-}
-
-void PPP_ContentDecryptor_Private_Proxy::OnMsgDecryptAndDecode(
-    PP_Instance instance,
-    PP_DecryptorStreamType decoder_type,
-    const PPPDecryptor_Buffer& encrypted_buffer,
-    const std::string& serialized_block_info) {
-  ScopedPPResource plugin_resource;
-  if (encrypted_buffer.resource.host_resource() != 0) {
-    plugin_resource = ScopedPPResource(
-        ScopedPPResource::PassRef(),
-        PPB_Buffer_Proxy::AddProxyResource(encrypted_buffer.resource,
-                                           encrypted_buffer.handle,
-                                           encrypted_buffer.size));
-  }
-
-  if (ppp_decryptor_impl_) {
-    PP_EncryptedBlockInfo block_info;
-    if (!DeserializeBlockInfo(serialized_block_info, &block_info))
-      return;
-    CallWhileUnlocked(
-        ppp_decryptor_impl_->DecryptAndDecode,
-        instance,
-        decoder_type,
-        plugin_resource.get(),
-        &block_info);
-  }
-}
-
-}  // namespace proxy
-}  // namespace ppapi
diff --git a/ppapi/proxy/ppp_content_decryptor_private_proxy.h b/ppapi/proxy/ppp_content_decryptor_private_proxy.h
deleted file mode 100644
index 7a35292..0000000
--- a/ppapi/proxy/ppp_content_decryptor_private_proxy.h
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright (c) 2012 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 PPAPI_PROXY_PPP_CONTENT_DECRYPTOR_PRIVATE_PROXY_H_
-#define PPAPI_PROXY_PPP_CONTENT_DECRYPTOR_PRIVATE_PROXY_H_
-
-#include <stdint.h>
-
-#include <string>
-#include <vector>
-
-#include "base/macros.h"
-#include "ppapi/c/pp_instance.h"
-#include "ppapi/c/private/ppp_content_decryptor_private.h"
-#include "ppapi/proxy/interface_proxy.h"
-#include "ppapi/proxy/serialized_structs.h"
-#include "ppapi/shared_impl/host_resource.h"
-
-namespace ppapi {
-namespace proxy {
-
-class SerializedVarReceiveInput;
-
-class PPP_ContentDecryptor_Private_Proxy : public InterfaceProxy {
- public:
-  explicit PPP_ContentDecryptor_Private_Proxy(Dispatcher* dispatcher);
-  ~PPP_ContentDecryptor_Private_Proxy() override;
-
-  static const PPP_ContentDecryptor_Private* GetProxyInterface();
-
- private:
-  // InterfaceProxy implementation.
-  bool OnMessageReceived(const IPC::Message& msg) override;
-
-  // Message handlers.
-  void OnMsgInitialize(PP_Instance instance,
-                       uint32_t promise_id,
-                       SerializedVarReceiveInput key_system,
-                       PP_Bool allow_distinctive_identifier,
-                       PP_Bool allow_persistent_state);
-  void OnMsgSetServerCertificate(PP_Instance instance,
-                                 uint32_t promise_id,
-                                 std::vector<uint8_t> server_certificate);
-  void OnMsgGetStatusForPolicy(PP_Instance instance,
-                               uint32_t promise_id,
-                               PP_HdcpVersion min_hdcp_version);
-  void OnMsgCreateSessionAndGenerateRequest(
-      PP_Instance instance,
-      uint32_t promise_id,
-      PP_SessionType session_type,
-      PP_InitDataType init_data_type,
-      SerializedVarReceiveInput init_data);
-  void OnMsgLoadSession(PP_Instance instance,
-                        uint32_t promise_id,
-                        PP_SessionType session_type,
-                        SerializedVarReceiveInput session_id);
-  void OnMsgUpdateSession(PP_Instance instance,
-                          uint32_t promise_id,
-                          SerializedVarReceiveInput session_id,
-                          SerializedVarReceiveInput response);
-  void OnMsgCloseSession(PP_Instance instance,
-                         uint32_t promise_id,
-                         const std::string& session_id);
-  void OnMsgRemoveSession(PP_Instance instance,
-                          uint32_t promise_id,
-                          const std::string& session_id);
-  void OnMsgDecrypt(PP_Instance instance,
-                    const PPPDecryptor_Buffer& encrypted_buffer,
-                    const std::string& serialized_encrypted_block_info);
-  void OnMsgInitializeAudioDecoder(
-      PP_Instance instance,
-      const std::string& decoder_config,
-      const PPPDecryptor_Buffer& extra_data_buffer);
-  void OnMsgInitializeVideoDecoder(
-      PP_Instance instance,
-      const std::string& decoder_config,
-      const PPPDecryptor_Buffer& extra_data_buffer);
-  void OnMsgDeinitializeDecoder(PP_Instance instance,
-                                PP_DecryptorStreamType decoder_type,
-                                uint32_t request_id);
-  void OnMsgResetDecoder(PP_Instance instance,
-                         PP_DecryptorStreamType decoder_type,
-                         uint32_t request_id);
-  void OnMsgDecryptAndDecode(
-      PP_Instance instance,
-      PP_DecryptorStreamType decoder_type,
-      const PPPDecryptor_Buffer& encrypted_buffer,
-      const std::string& serialized_encrypted_block_info);
-
-  const PPP_ContentDecryptor_Private* ppp_decryptor_impl_;
-
-  DISALLOW_COPY_AND_ASSIGN(PPP_ContentDecryptor_Private_Proxy);
-};
-
-}  // namespace proxy
-}  // namespace ppapi
-
-#endif  // PPAPI_PROXY_PPP_CONTENT_DECRYPTOR_PRIVATE_PROXY_H_
diff --git a/ppapi/shared_impl/api_id.h b/ppapi/shared_impl/api_id.h
index ff8511d..9e8176d 100644
--- a/ppapi/shared_impl/api_id.h
+++ b/ppapi/shared_impl/api_id.h
@@ -48,9 +48,6 @@
   API_ID_PPB_VIDEO_DECODER_DEV,
   API_ID_PPB_X509_CERTIFICATE_PRIVATE,
   API_ID_PPP_CLASS,
-  // TODO(tomfinegan): Remove this after we refactor things to load the PPP
-  // interface struct from the PPB interface.
-  API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE,
   API_ID_PPP_FIND_PRIVATE,
   API_ID_PPP_GRAPHICS_3D,
   API_ID_PPP_INPUT_EVENT,
diff --git a/ppapi/tests/all_c_includes.h b/ppapi/tests/all_c_includes.h
index 6fcbed5..d0868b0 100644
--- a/ppapi/tests/all_c_includes.h
+++ b/ppapi/tests/all_c_includes.h
@@ -99,7 +99,6 @@
 #include "ppapi/c/private/pp_video_frame_private.h"
 #include "ppapi/c/private/ppb_camera_capabilities_private.h"
 #include "ppapi/c/private/ppb_camera_device_private.h"
-#include "ppapi/c/private/ppb_content_decryptor_private.h"
 #include "ppapi/c/private/ppb_display_color_profile_private.h"
 #include "ppapi/c/private/ppb_ext_crx_file_system_private.h"
 #include "ppapi/c/private/ppb_file_io_private.h"
@@ -123,7 +122,6 @@
 #include "ppapi/c/private/ppb_video_destination_private.h"
 #include "ppapi/c/private/ppb_video_source_private.h"
 #include "ppapi/c/private/ppb_x509_certificate_private.h"
-#include "ppapi/c/private/ppp_content_decryptor_private.h"
 #include "ppapi/c/private/ppp_find_private.h"
 #include "ppapi/c/private/ppp_instance_private.h"
 #include "ppapi/c/trusted/ppb_url_loader_trusted.h"
diff --git a/ppapi/tests/all_cpp_includes.h b/ppapi/tests/all_cpp_includes.h
index 1cb2775..3387a0f 100644
--- a/ppapi/tests/all_cpp_includes.h
+++ b/ppapi/tests/all_cpp_includes.h
@@ -48,7 +48,6 @@
 #include "ppapi/cpp/point.h"
 #include "ppapi/cpp/private/camera_capabilities_private.h"
 #include "ppapi/cpp/private/camera_device_private.h"
-#include "ppapi/cpp/private/content_decryptor_private.h"
 #include "ppapi/cpp/private/find_private.h"
 #include "ppapi/cpp/private/flash_font_file.h"
 #include "ppapi/cpp/private/flash_fullscreen.h"
diff --git a/ppapi/thunk/BUILD.gn b/ppapi/thunk/BUILD.gn
index 73c7af4c..f1d0998 100644
--- a/ppapi/thunk/BUILD.gn
+++ b/ppapi/thunk/BUILD.gn
@@ -169,7 +169,6 @@
       "ppb_browser_font_trusted_thunk.cc",
       "ppb_buffer_thunk.cc",
       "ppb_char_set_thunk.cc",
-      "ppb_content_decryptor_private_thunk.cc",
       "ppb_flash_clipboard_thunk.cc",
       "ppb_flash_device_id_thunk.cc",
       "ppb_flash_drm_thunk.cc",
diff --git a/ppapi/thunk/interfaces_ppb_private.h b/ppapi/thunk/interfaces_ppb_private.h
index d8288bd..ffe0608 100644
--- a/ppapi/thunk/interfaces_ppb_private.h
+++ b/ppapi/thunk/interfaces_ppb_private.h
@@ -25,8 +25,6 @@
               PPB_BrokerTrusted_0_3)
 PROXIED_IFACE(PPB_BROWSERFONT_TRUSTED_INTERFACE_1_0,
               PPB_BrowserFont_Trusted_1_0)
-PROXIED_IFACE(PPB_CONTENTDECRYPTOR_PRIVATE_INTERFACE_0_15,
-              PPB_ContentDecryptor_Private_0_15)
 PROXIED_IFACE(PPB_CHARSET_TRUSTED_INTERFACE_1_0,
               PPB_CharSet_Trusted_1_0)
 PROXIED_IFACE(PPB_FILECHOOSER_TRUSTED_INTERFACE_0_5,
diff --git a/ppapi/thunk/ppb_content_decryptor_private_thunk.cc b/ppapi/thunk/ppb_content_decryptor_private_thunk.cc
deleted file mode 100644
index b8d19f4..0000000
--- a/ppapi/thunk/ppb_content_decryptor_private_thunk.cc
+++ /dev/null
@@ -1,215 +0,0 @@
-// Copyright (c) 2012 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.
-
-// From private/ppb_content_decryptor_private.idl modified Mon Mar 30 22:35:33
-// 2015.
-
-#include <stdint.h>
-
-#include "ppapi/c/pp_errors.h"
-#include "ppapi/c/private/ppb_content_decryptor_private.h"
-#include "ppapi/shared_impl/tracked_callback.h"
-#include "ppapi/thunk/enter.h"
-#include "ppapi/thunk/ppapi_thunk_export.h"
-
-namespace ppapi {
-namespace thunk {
-
-namespace {
-
-void PromiseResolved(PP_Instance instance, uint32_t promise_id) {
-  VLOG(4) << "PPB_ContentDecryptor_Private::PromiseResolved()";
-  EnterInstance enter(instance);
-  if (enter.failed())
-    return;
-  enter.functions()->PromiseResolved(instance, promise_id);
-}
-
-void PromiseResolvedWithKeyStatus(PP_Instance instance,
-                                  uint32_t promise_id,
-                                  PP_CdmKeyStatus key_status) {
-  VLOG(4) << "PPB_ContentDecryptor_Private::PromiseResolvedWithKeyStatus()";
-  EnterInstance enter(instance);
-  if (enter.failed())
-    return;
-  enter.functions()->PromiseResolvedWithKeyStatus(instance, promise_id,
-                                                  key_status);
-}
-
-void PromiseResolvedWithSession(PP_Instance instance,
-                                uint32_t promise_id,
-                                struct PP_Var session_id) {
-  VLOG(4) << "PPB_ContentDecryptor_Private::PromiseResolvedWithSession()";
-  EnterInstance enter(instance);
-  if (enter.failed())
-    return;
-  enter.functions()->PromiseResolvedWithSession(instance, promise_id,
-                                                session_id);
-}
-
-void PromiseRejected(PP_Instance instance,
-                     uint32_t promise_id,
-                     PP_CdmExceptionCode exception_code,
-                     uint32_t system_code,
-                     struct PP_Var error_description) {
-  VLOG(4) << "PPB_ContentDecryptor_Private::PromiseRejected()";
-  EnterInstance enter(instance);
-  if (enter.failed())
-    return;
-  enter.functions()->PromiseRejected(instance, promise_id, exception_code,
-                                     system_code, error_description);
-}
-
-void SessionMessage(PP_Instance instance,
-                    struct PP_Var session_id,
-                    PP_CdmMessageType message_type,
-                    struct PP_Var message,
-                    struct PP_Var legacy_destination_url) {
-  VLOG(4) << "PPB_ContentDecryptor_Private::SessionMessage()";
-  EnterInstance enter(instance);
-  if (enter.failed())
-    return;
-  enter.functions()->SessionMessage(instance, session_id, message_type, message,
-                                    legacy_destination_url);
-}
-
-void SessionKeysChange(PP_Instance instance,
-                       struct PP_Var session_id,
-                       PP_Bool has_additional_usable_key,
-                       uint32_t key_count,
-                       const struct PP_KeyInformation key_information[]) {
-  VLOG(4) << "PPB_ContentDecryptor_Private::SessionKeysChange()";
-  EnterInstance enter(instance);
-  if (enter.failed())
-    return;
-  enter.functions()->SessionKeysChange(instance, session_id,
-                                       has_additional_usable_key, key_count,
-                                       key_information);
-}
-
-void SessionExpirationChange(PP_Instance instance,
-                             struct PP_Var session_id,
-                             PP_Time new_expiry_time) {
-  VLOG(4) << "PPB_ContentDecryptor_Private::SessionExpirationChange()";
-  EnterInstance enter(instance);
-  if (enter.failed())
-    return;
-  enter.functions()->SessionExpirationChange(instance, session_id,
-                                             new_expiry_time);
-}
-
-void SessionClosed(PP_Instance instance, struct PP_Var session_id) {
-  VLOG(4) << "PPB_ContentDecryptor_Private::SessionClosed()";
-  EnterInstance enter(instance);
-  if (enter.failed())
-    return;
-  enter.functions()->SessionClosed(instance, session_id);
-}
-
-void LegacySessionError(PP_Instance instance,
-                        struct PP_Var session_id,
-                        PP_CdmExceptionCode exception_code,
-                        uint32_t system_code,
-                        struct PP_Var error_description) {
-  VLOG(4) << "PPB_ContentDecryptor_Private::LegacySessionError()";
-  EnterInstance enter(instance);
-  if (enter.failed())
-    return;
-  enter.functions()->LegacySessionError(instance, session_id, exception_code,
-                                        system_code, error_description);
-}
-
-void DeliverBlock(PP_Instance instance,
-                  PP_Resource decrypted_block,
-                  const struct PP_DecryptedBlockInfo* decrypted_block_info) {
-  VLOG(4) << "PPB_ContentDecryptor_Private::DeliverBlock()";
-  EnterInstance enter(instance);
-  if (enter.failed())
-    return;
-  enter.functions()->DeliverBlock(instance, decrypted_block,
-                                  decrypted_block_info);
-}
-
-void DecoderInitializeDone(PP_Instance instance,
-                           PP_DecryptorStreamType decoder_type,
-                           uint32_t request_id,
-                           PP_Bool success) {
-  VLOG(4) << "PPB_ContentDecryptor_Private::DecoderInitializeDone()";
-  EnterInstance enter(instance);
-  if (enter.failed())
-    return;
-  enter.functions()->DecoderInitializeDone(instance, decoder_type, request_id,
-                                           success);
-}
-
-void DecoderDeinitializeDone(PP_Instance instance,
-                             PP_DecryptorStreamType decoder_type,
-                             uint32_t request_id) {
-  VLOG(4) << "PPB_ContentDecryptor_Private::DecoderDeinitializeDone()";
-  EnterInstance enter(instance);
-  if (enter.failed())
-    return;
-  enter.functions()->DecoderDeinitializeDone(instance, decoder_type,
-                                             request_id);
-}
-
-void DecoderResetDone(PP_Instance instance,
-                      PP_DecryptorStreamType decoder_type,
-                      uint32_t request_id) {
-  VLOG(4) << "PPB_ContentDecryptor_Private::DecoderResetDone()";
-  EnterInstance enter(instance);
-  if (enter.failed())
-    return;
-  enter.functions()->DecoderResetDone(instance, decoder_type, request_id);
-}
-
-void DeliverFrame(PP_Instance instance,
-                  PP_Resource decrypted_frame,
-                  const struct PP_DecryptedFrameInfo* decrypted_frame_info) {
-  VLOG(4) << "PPB_ContentDecryptor_Private::DeliverFrame()";
-  EnterInstance enter(instance);
-  if (enter.failed())
-    return;
-  enter.functions()->DeliverFrame(instance, decrypted_frame,
-                                  decrypted_frame_info);
-}
-
-void DeliverSamples(
-    PP_Instance instance,
-    PP_Resource audio_frames,
-    const struct PP_DecryptedSampleInfo* decrypted_sample_info) {
-  VLOG(4) << "PPB_ContentDecryptor_Private::DeliverSamples()";
-  EnterInstance enter(instance);
-  if (enter.failed())
-    return;
-  enter.functions()->DeliverSamples(instance, audio_frames,
-                                    decrypted_sample_info);
-}
-
-const PPB_ContentDecryptor_Private_0_15
-    g_ppb_contentdecryptor_private_thunk_0_15 = {&PromiseResolved,
-                                                 &PromiseResolvedWithKeyStatus,
-                                                 &PromiseResolvedWithSession,
-                                                 &PromiseRejected,
-                                                 &SessionMessage,
-                                                 &SessionKeysChange,
-                                                 &SessionExpirationChange,
-                                                 &SessionClosed,
-                                                 &LegacySessionError,
-                                                 &DeliverBlock,
-                                                 &DecoderInitializeDone,
-                                                 &DecoderDeinitializeDone,
-                                                 &DecoderResetDone,
-                                                 &DeliverFrame,
-                                                 &DeliverSamples};
-
-}  // namespace
-
-PPAPI_THUNK_EXPORT const PPB_ContentDecryptor_Private_0_15*
-GetPPB_ContentDecryptor_Private_0_15_Thunk() {
-  return &g_ppb_contentdecryptor_private_thunk_0_15;
-}
-
-}  // namespace thunk
-}  // namespace ppapi
diff --git a/ppapi/thunk/ppb_instance_api.h b/ppapi/thunk/ppb_instance_api.h
index af89f53..390e2ce7 100644
--- a/ppapi/thunk/ppb_instance_api.h
+++ b/ppapi/thunk/ppb_instance_api.h
@@ -20,7 +20,6 @@
 #include "ppapi/c/ppb_instance.h"
 #include "ppapi/c/ppb_mouse_cursor.h"
 #include "ppapi/c/ppb_text_input_controller.h"
-#include "ppapi/c/private/pp_content_decryptor.h"
 #include "ppapi/c/private/ppb_instance_private.h"
 #include "ppapi/shared_impl/api_id.h"
 #include "ppapi/shared_impl/resource.h"
@@ -31,8 +30,6 @@
 #undef PostMessage
 #endif
 
-struct PP_DecryptedBlockInfo;
-struct PP_DecryptedFrameInfo;
 struct PPP_MessageHandler_0_2;
 
 namespace ppapi {
@@ -147,59 +144,6 @@
   virtual PP_Var GetDocumentURL(PP_Instance instance,
                                 PP_URLComponents_Dev* components) = 0;
 #if !defined(OS_NACL)
-  // Content Decryptor.
-  virtual void PromiseResolved(PP_Instance instance, uint32_t promise_id) = 0;
-  virtual void PromiseResolvedWithKeyStatus(PP_Instance instance,
-                                            uint32_t promise_id,
-                                            PP_CdmKeyStatus key_status) = 0;
-  virtual void PromiseResolvedWithSession(PP_Instance instance,
-                                          uint32_t promise_id,
-                                          PP_Var session_id_var) = 0;
-  virtual void PromiseRejected(PP_Instance instance,
-                               uint32_t promise_id,
-                               PP_CdmExceptionCode exception_code,
-                               uint32_t system_code,
-                               PP_Var error_description_var) = 0;
-  virtual void SessionMessage(PP_Instance instance,
-                              PP_Var session_id_var,
-                              PP_CdmMessageType message_type,
-                              PP_Var message_var,
-                              PP_Var legacy_destination_url_var) = 0;
-  virtual void SessionKeysChange(
-      PP_Instance instance,
-      PP_Var session_id_var,
-      PP_Bool has_additional_usable_key,
-      uint32_t key_count,
-      const struct PP_KeyInformation key_information[]) = 0;
-  virtual void SessionExpirationChange(PP_Instance instance,
-                                       PP_Var session_id_var,
-                                       PP_Time new_expiry_time) = 0;
-  virtual void SessionClosed(PP_Instance instance, PP_Var session_id_var) = 0;
-  virtual void LegacySessionError(PP_Instance instance,
-                                  PP_Var session_id_var,
-                                  PP_CdmExceptionCode exception_code,
-                                  uint32_t system_code,
-                                  PP_Var error_description_var) = 0;
-  virtual void DeliverBlock(PP_Instance instance,
-                            PP_Resource decrypted_block,
-                            const PP_DecryptedBlockInfo* block_info) = 0;
-  virtual void DecoderInitializeDone(PP_Instance instance,
-                                     PP_DecryptorStreamType decoder_type,
-                                     uint32_t request_id,
-                                     PP_Bool success) = 0;
-  virtual void DecoderDeinitializeDone(PP_Instance instance,
-                                       PP_DecryptorStreamType decoder_type,
-                                       uint32_t request_id) = 0;
-  virtual void DecoderResetDone(PP_Instance instance,
-                                PP_DecryptorStreamType decoder_type,
-                                uint32_t request_id) = 0;
-  virtual void DeliverFrame(PP_Instance instance,
-                            PP_Resource decrypted_frame,
-                            const PP_DecryptedFrameInfo* frame_info) = 0;
-  virtual void DeliverSamples(PP_Instance instance,
-                              PP_Resource audio_frames,
-                              const PP_DecryptedSampleInfo* sample_info) = 0;
-
   // URLUtil.
   virtual PP_Var ResolveRelativeToDocument(
       PP_Instance instance,
diff --git a/services/identity/identity_manager_impl_unittest.cc b/services/identity/identity_manager_impl_unittest.cc
index 4ac9add..db6a79fc2 100644
--- a/services/identity/identity_manager_impl_unittest.cc
+++ b/services/identity/identity_manager_impl_unittest.cc
@@ -557,7 +557,7 @@
   FakeOAuth2TokenServiceDelegate* delegate =
       static_cast<FakeOAuth2TokenServiceDelegate*>(
           token_service()->GetDelegate());
-  delegate->SetLastErrorForAccount(
+  delegate->UpdateAuthError(
       signin_manager()->GetAuthenticatedAccountId(),
       GoogleServiceAuthError(
           GoogleServiceAuthError::State::INVALID_GAIA_CREDENTIALS));
@@ -576,8 +576,8 @@
 
   // Clear the auth error, update credentials, and check that the callback
   // fires.
-  delegate->SetLastErrorForAccount(
-      signin_manager()->GetAuthenticatedAccountId(), GoogleServiceAuthError());
+  delegate->UpdateAuthError(signin_manager()->GetAuthenticatedAccountId(),
+                            GoogleServiceAuthError());
   token_service()->UpdateCredentials(
       signin_manager()->GetAuthenticatedAccountId(), kTestRefreshToken);
   run_loop.Run();
diff --git a/services/network/cross_origin_read_blocking.cc b/services/network/cross_origin_read_blocking.cc
index 8b79998..7ec93f4 100644
--- a/services/network/cross_origin_read_blocking.cc
+++ b/services/network/cross_origin_read_blocking.cc
@@ -53,7 +53,7 @@
 // |signatures|, and kNo otherwise.
 //
 // When kYes is returned, the matching prefix is erased from |data|.
-CrossOriginReadBlocking::Result MatchesSignature(
+CrossOriginReadBlocking::SniffingResult MatchesSignature(
     StringPiece* data,
     const StringPiece signatures[],
     size_t arr_size,
@@ -177,7 +177,7 @@
 }
 
 // This function is a slight modification of |net::SniffForHTML|.
-CrossOriginReadBlocking::Result CrossOriginReadBlocking::SniffForHTML(
+CrossOriginReadBlocking::SniffingResult CrossOriginReadBlocking::SniffForHTML(
     StringPiece data) {
   // The content sniffers used by Chrome and Firefox are using "<!--" as one of
   // the HTML signatures, but it also appears in valid JavaScript, considered as
@@ -213,7 +213,7 @@
   while (data.length() > 0) {
     AdvancePastWhitespace(&data);
 
-    Result signature_match =
+    SniffingResult signature_match =
         MatchesSignature(&data, kHtmlSignatures, arraysize(kHtmlSignatures),
                          base::CompareCase::INSENSITIVE_ASCII);
     if (signature_match != kNo)
@@ -222,9 +222,9 @@
     // "<!--" (the HTML comment syntax) is a special case, since it's valid JS
     // as well. Skip over them.
     static const StringPiece kBeginCommentSignature[] = {"<!--"};
-    Result comment_match = MatchesSignature(&data, kBeginCommentSignature,
-                                            arraysize(kBeginCommentSignature),
-                                            base::CompareCase::SENSITIVE);
+    SniffingResult comment_match = MatchesSignature(
+        &data, kBeginCommentSignature, arraysize(kBeginCommentSignature),
+        base::CompareCase::SENSITIVE);
     if (comment_match != kYes)
       return comment_match;
 
@@ -240,7 +240,7 @@
   return kMaybe;
 }
 
-CrossOriginReadBlocking::Result CrossOriginReadBlocking::SniffForXML(
+CrossOriginReadBlocking::SniffingResult CrossOriginReadBlocking::SniffForXML(
     base::StringPiece data) {
   // TODO(dsjang): Once CrossOriginReadBlocking is moved into the browser
   // process, we should do single-thread checking here for the static
@@ -251,7 +251,7 @@
                           base::CompareCase::SENSITIVE);
 }
 
-CrossOriginReadBlocking::Result CrossOriginReadBlocking::SniffForJSON(
+CrossOriginReadBlocking::SniffingResult CrossOriginReadBlocking::SniffForJSON(
     base::StringPiece data) {
   // Currently this function looks for an opening brace ('{'), followed by a
   // double-quoted string literal, followed by a colon. Importantly, such a
@@ -316,7 +316,7 @@
   return kMaybe;
 }
 
-CrossOriginReadBlocking::Result
+CrossOriginReadBlocking::SniffingResult
 CrossOriginReadBlocking::SniffForFetchOnlyResource(base::StringPiece data) {
   // kScriptBreakingPrefixes contains prefixes that are conventionally used to
   // prevent a JSON response from becoming a valid Javascript program (an attack
@@ -352,7 +352,7 @@
       StringPiece("while(1);"), StringPiece("for (;;);"),
       StringPiece("while (1);"),
   };
-  Result has_parser_breaker = MatchesSignature(
+  SniffingResult has_parser_breaker = MatchesSignature(
       &data, kScriptBreakingPrefixes, arraysize(kScriptBreakingPrefixes),
       base::CompareCase::SENSITIVE);
   if (has_parser_breaker != kNo)
diff --git a/services/network/cross_origin_read_blocking.h b/services/network/cross_origin_read_blocking.h
index 48e3b9f..081b796 100644
--- a/services/network/cross_origin_read_blocking.h
+++ b/services/network/cross_origin_read_blocking.h
@@ -42,7 +42,7 @@
   //    possible to get a Yes result. For example, if we are sniffing for a tag
   //    like "<html", a kMaybe result would occur if the data contains just
   //    "<ht".
-  enum Result {
+  enum SniffingResult {
     kNo,
     kMaybe,
     kYes,
@@ -68,15 +68,15 @@
   static bool IsValidCorsHeaderSet(const url::Origin& frame_origin,
                                    const std::string& access_control_origin);
 
-  static Result SniffForHTML(base::StringPiece data);
-  static Result SniffForXML(base::StringPiece data);
-  static Result SniffForJSON(base::StringPiece data);
+  static SniffingResult SniffForHTML(base::StringPiece data);
+  static SniffingResult SniffForXML(base::StringPiece data);
+  static SniffingResult SniffForJSON(base::StringPiece data);
 
   // Sniff for patterns that indicate |data| only ought to be consumed by XHR()
   // or fetch(). This detects Javascript parser-breaker and particular JS
   // infinite-loop patterns, which are used conventionally as a defense against
   // JSON data exfiltration by means of a <script> tag.
-  static Result SniffForFetchOnlyResource(base::StringPiece data);
+  static SniffingResult SniffForFetchOnlyResource(base::StringPiece data);
 
  private:
   CrossOriginReadBlocking();  // Not instantiable.
diff --git a/services/network/cross_origin_read_blocking_unittest.cc b/services/network/cross_origin_read_blocking_unittest.cc
index a9bba17..03c8ac5 100644
--- a/services/network/cross_origin_read_blocking_unittest.cc
+++ b/services/network/cross_origin_read_blocking_unittest.cc
@@ -11,7 +11,7 @@
 
 using base::StringPiece;
 using MimeType = network::CrossOriginReadBlocking::MimeType;
-using Result = network::CrossOriginReadBlocking::Result;
+using SniffingResult = network::CrossOriginReadBlocking::SniffingResult;
 
 namespace network {
 
@@ -62,24 +62,26 @@
       " <!-- this is comment\n document.write(1);\n// -->window.open()");
   StringPiece empty_data("");
 
-  EXPECT_EQ(Result::kYes, CrossOriginReadBlocking::SniffForHTML(html_data));
-  EXPECT_EQ(Result::kYes,
+  EXPECT_EQ(SniffingResult::kYes,
+            CrossOriginReadBlocking::SniffForHTML(html_data));
+  EXPECT_EQ(SniffingResult::kYes,
             CrossOriginReadBlocking::SniffForHTML(comment_html_data));
-  EXPECT_EQ(Result::kYes,
+  EXPECT_EQ(SniffingResult::kYes,
             CrossOriginReadBlocking::SniffForHTML(two_comments_html_data));
-  EXPECT_EQ(Result::kYes,
+  EXPECT_EQ(SniffingResult::kYes,
             CrossOriginReadBlocking::SniffForHTML(commented_out_html_tag_data));
-  EXPECT_EQ(Result::kYes,
+  EXPECT_EQ(SniffingResult::kYes,
             CrossOriginReadBlocking::SniffForHTML(mixed_comments_html_data));
-  EXPECT_EQ(Result::kNo, CrossOriginReadBlocking::SniffForHTML(non_html_data));
-  EXPECT_EQ(Result::kNo,
+  EXPECT_EQ(SniffingResult::kNo,
+            CrossOriginReadBlocking::SniffForHTML(non_html_data));
+  EXPECT_EQ(SniffingResult::kNo,
             CrossOriginReadBlocking::SniffForHTML(comment_js_data));
 
   // Prefixes of |commented_out_html_tag_data| should be indeterminate.
   StringPiece almost_html = commented_out_html_tag_data;
   while (!almost_html.empty()) {
     almost_html.remove_suffix(1);
-    EXPECT_EQ(Result::kMaybe,
+    EXPECT_EQ(SniffingResult::kMaybe,
               CrossOriginReadBlocking::SniffForHTML(almost_html))
         << almost_html;
   }
@@ -90,11 +92,14 @@
   StringPiece non_xml_data("        var name=window.location;\nadfadf");
   StringPiece empty_data("");
 
-  EXPECT_EQ(Result::kYes, CrossOriginReadBlocking::SniffForXML(xml_data));
-  EXPECT_EQ(Result::kNo, CrossOriginReadBlocking::SniffForXML(non_xml_data));
+  EXPECT_EQ(SniffingResult::kYes,
+            CrossOriginReadBlocking::SniffForXML(xml_data));
+  EXPECT_EQ(SniffingResult::kNo,
+            CrossOriginReadBlocking::SniffForXML(non_xml_data));
 
   // Empty string should be indeterminate.
-  EXPECT_EQ(Result::kMaybe, CrossOriginReadBlocking::SniffForXML(empty_data));
+  EXPECT_EQ(SniffingResult::kMaybe,
+            CrossOriginReadBlocking::SniffForXML(empty_data));
 }
 
 TEST(CrossOriginReadBlockingTest, SniffForJSON) {
@@ -106,50 +111,59 @@
   StringPiece non_json_data1("\t\t\r\n   foo({ \"name\" : \"chrome\", ");
   StringPiece empty_data("");
 
-  EXPECT_EQ(Result::kYes, CrossOriginReadBlocking::SniffForJSON(json_data));
-  EXPECT_EQ(Result::kYes, CrossOriginReadBlocking::SniffForJSON(
-                              json_corrupt_after_first_key));
+  EXPECT_EQ(SniffingResult::kYes,
+            CrossOriginReadBlocking::SniffForJSON(json_data));
+  EXPECT_EQ(SniffingResult::kYes, CrossOriginReadBlocking::SniffForJSON(
+                                      json_corrupt_after_first_key));
 
-  EXPECT_EQ(Result::kYes, CrossOriginReadBlocking::SniffForJSON(json_data2));
+  EXPECT_EQ(SniffingResult::kYes,
+            CrossOriginReadBlocking::SniffForJSON(json_data2));
 
   // All prefixes prefixes of |json_data2| ought to be indeterminate.
   StringPiece almost_json = json_data2;
   while (!almost_json.empty()) {
     almost_json.remove_suffix(1);
-    EXPECT_EQ(Result::kMaybe,
+    EXPECT_EQ(SniffingResult::kMaybe,
               CrossOriginReadBlocking::SniffForJSON(almost_json))
         << almost_json;
   }
 
-  EXPECT_EQ(Result::kNo, CrossOriginReadBlocking::SniffForJSON(non_json_data0));
-  EXPECT_EQ(Result::kNo, CrossOriginReadBlocking::SniffForJSON(non_json_data1));
+  EXPECT_EQ(SniffingResult::kNo,
+            CrossOriginReadBlocking::SniffForJSON(non_json_data0));
+  EXPECT_EQ(SniffingResult::kNo,
+            CrossOriginReadBlocking::SniffForJSON(non_json_data1));
 
-  EXPECT_EQ(Result::kYes, CrossOriginReadBlocking::SniffForJSON(R"({"" : 1})"))
+  EXPECT_EQ(SniffingResult::kYes,
+            CrossOriginReadBlocking::SniffForJSON(R"({"" : 1})"))
       << "Empty strings are accepted";
-  EXPECT_EQ(Result::kNo, CrossOriginReadBlocking::SniffForJSON(R"({'' : 1})"))
+  EXPECT_EQ(SniffingResult::kNo,
+            CrossOriginReadBlocking::SniffForJSON(R"({'' : 1})"))
       << "Single quotes are not accepted";
-  EXPECT_EQ(Result::kYes,
+  EXPECT_EQ(SniffingResult::kYes,
             CrossOriginReadBlocking::SniffForJSON("{\"\\\"\" : 1}"))
       << "Escaped quotes are recognized";
-  EXPECT_EQ(Result::kYes,
+  EXPECT_EQ(SniffingResult::kYes,
             CrossOriginReadBlocking::SniffForJSON(R"({"\\\u000a" : 1})"))
       << "Escaped control characters are recognized";
-  EXPECT_EQ(Result::kMaybe,
+  EXPECT_EQ(SniffingResult::kMaybe,
             CrossOriginReadBlocking::SniffForJSON(R"({"\\\u00)"))
       << "Incomplete escape results in maybe";
-  EXPECT_EQ(Result::kMaybe, CrossOriginReadBlocking::SniffForJSON("{\"\\"))
+  EXPECT_EQ(SniffingResult::kMaybe,
+            CrossOriginReadBlocking::SniffForJSON("{\"\\"))
       << "Incomplete escape results in maybe";
-  EXPECT_EQ(Result::kMaybe, CrossOriginReadBlocking::SniffForJSON("{\"\\\""))
+  EXPECT_EQ(SniffingResult::kMaybe,
+            CrossOriginReadBlocking::SniffForJSON("{\"\\\""))
       << "Incomplete escape results in maybe";
-  EXPECT_EQ(Result::kNo,
+  EXPECT_EQ(SniffingResult::kNo,
             CrossOriginReadBlocking::SniffForJSON("{\"\n\" : true}"))
       << "Unescaped control characters are rejected";
-  EXPECT_EQ(Result::kNo, CrossOriginReadBlocking::SniffForJSON("{}"))
+  EXPECT_EQ(SniffingResult::kNo, CrossOriginReadBlocking::SniffForJSON("{}"))
       << "Empty dictionary is not recognized (since it's valid JS too)";
-  EXPECT_EQ(Result::kNo,
+  EXPECT_EQ(SniffingResult::kNo,
             CrossOriginReadBlocking::SniffForJSON("[true, false, 1, 2]"))
       << "Lists dictionary are not recognized (since they're valid JS too)";
-  EXPECT_EQ(Result::kNo, CrossOriginReadBlocking::SniffForJSON(R"({":"})"))
+  EXPECT_EQ(SniffingResult::kNo,
+            CrossOriginReadBlocking::SniffForJSON(R"({":"})"))
       << "A colon character inside a string does not trigger a match";
 }
 
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json
index 74d0f4f8..a04fced 100644
--- a/testing/buildbot/chromium.clang.json
+++ b/testing/buildbot/chromium.clang.json
@@ -935,12 +935,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "mini_installer_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "native_theme_unittests"
       },
       {
@@ -1237,12 +1231,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "mini_installer_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "native_theme_unittests"
       },
       {
@@ -1532,12 +1520,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "mini_installer_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "native_theme_unittests"
       },
       {
@@ -1840,12 +1822,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "mini_installer_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "native_theme_unittests"
       },
       {
@@ -2178,12 +2154,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "mini_installer_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "native_theme_unittests"
       },
       {
@@ -2516,12 +2486,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "mini_installer_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "native_theme_unittests"
       },
       {
@@ -2854,12 +2818,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "mini_installer_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "native_theme_unittests"
       },
       {
@@ -3192,12 +3150,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "mini_installer_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "native_theme_unittests"
       },
       {
@@ -3530,12 +3482,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "mini_installer_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "native_theme_unittests"
       },
       {
@@ -3868,12 +3814,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "mini_installer_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "native_theme_unittests"
       },
       {
@@ -4206,12 +4146,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "mini_installer_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "native_theme_unittests"
       },
       {
@@ -4544,12 +4478,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "mini_installer_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "native_theme_unittests"
       },
       {
@@ -4882,12 +4810,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "mini_installer_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "native_theme_unittests"
       },
       {
@@ -10573,12 +10495,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "mini_installer_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "native_theme_unittests"
       },
       {
@@ -10911,12 +10827,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "mini_installer_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "native_theme_unittests"
       },
       {
@@ -11249,12 +11159,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "mini_installer_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "native_theme_unittests"
       },
       {
@@ -11587,12 +11491,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "mini_installer_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "native_theme_unittests"
       },
       {
@@ -11925,12 +11823,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "mini_installer_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "native_theme_unittests"
       },
       {
@@ -12263,12 +12155,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "mini_installer_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "native_theme_unittests"
       },
       {
@@ -12601,12 +12487,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "mini_installer_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "native_theme_unittests"
       },
       {
@@ -12939,12 +12819,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "mini_installer_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "native_theme_unittests"
       },
       {
@@ -13277,12 +13151,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "mini_installer_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "native_theme_unittests"
       },
       {
@@ -13615,12 +13483,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "mini_installer_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "native_theme_unittests"
       },
       {
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index 331933f..e62c910 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -2876,12 +2876,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "mini_installer_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "native_theme_unittests"
       },
       {
@@ -3178,12 +3172,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "mini_installer_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "native_theme_unittests"
       },
       {
@@ -3473,12 +3461,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "mini_installer_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "native_theme_unittests"
       },
       {
@@ -7589,12 +7571,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "mini_installer_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "native_theme_unittests"
       },
       {
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index 02f7c0c..f548f44e 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -2249,7 +2249,6 @@
     'aura_gtests',
     'chromium_gtests',
     'chromium_gtests_for_devices_with_graphical_output',
-    'mini_installer_tests_isolated_tests',
     'non_android_chromium_gtests',
     'non_android_and_cast_chromium_gtests',
     'non_android_and_cast_and_chromeos_chromium_gtests',
diff --git a/testing/test.gni b/testing/test.gni
index 251b003fa..0f92985 100644
--- a/testing/test.gni
+++ b/testing/test.gni
@@ -110,6 +110,9 @@
         unwind_table_asset(_unwind_table_asset_name) {
           testonly = true
           library_target = _library_target
+          deps = [
+            ":$_library_target",
+          ]
         }
       }
 
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
index 1149935..3a9a3548 100644
--- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
+++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
@@ -57,7 +57,7 @@
 crbug.com/714962 accessibility/bounds-calc.html [ Failure ]
 crbug.com/591099 accessibility/canvas-fallback-content-2.html [ Timeout ]
 crbug.com/591099 accessibility/computed-name.html [ Timeout ]
-crbug.com/591099 accessibility/computed-role.html [ Pass Timeout ]
+crbug.com/591099 accessibility/computed-role.html [ Timeout ]
 crbug.com/714962 accessibility/css-first-letter-children.html [ Failure ]
 crbug.com/591099 accessibility/css-generated-content.html [ Failure ]
 crbug.com/591099 accessibility/css-styles.html [ Failure ]
@@ -93,7 +93,7 @@
 crbug.com/591099 animations/animation-ready-reject-script-forbidden.html [ Timeout ]
 crbug.com/591099 animations/cross-fade-list-style-image.html [ Failure ]
 crbug.com/591099 animations/interpolation/backdrop-filter-interpolation.html [ Timeout ]
-crbug.com/591099 animations/interpolation/line-height-interpolation.html [ Timeout ]
+crbug.com/591099 animations/interpolation/line-height-interpolation.html [ Pass Timeout ]
 crbug.com/591099 animations/interpolation/svg-stroke-dasharray-interpolation.html [ Timeout ]
 crbug.com/591099 animations/interpolation/webkit-clip-path-interpolation.html [ Pass Timeout ]
 crbug.com/591099 animations/rotate-transform-equivalent.html [ Failure ]
@@ -188,7 +188,7 @@
 crbug.com/591099 editing/execCommand/findString.html [ Failure ]
 crbug.com/591099 editing/execCommand/format-block-multiple-paragraphs-in-pre.html [ Failure ]
 crbug.com/591099 editing/execCommand/format-block-multiple-paragraphs.html [ Failure ]
-crbug.com/591099 editing/execCommand/query-format-block.html [ Timeout ]
+crbug.com/591099 editing/execCommand/query-format-block.html [ Pass Timeout ]
 crbug.com/591099 editing/execCommand/remove-list-from-range-selection.html [ Failure ]
 crbug.com/591099 editing/inserting/4875189-1.html [ Failure ]
 crbug.com/591099 editing/inserting/4959067.html [ Failure ]
@@ -227,7 +227,7 @@
 crbug.com/591099 editing/selection/home-end.html [ Timeout ]
 crbug.com/591099 editing/selection/line-wrap-2.html [ Failure ]
 crbug.com/591099 editing/selection/linux_selection_color.html [ Failure ]
-crbug.com/591099 editing/selection/mixed-editability-1.html [ Failure ]
+crbug.com/591099 editing/selection/mixed-editability-1.html [ Failure Pass ]
 crbug.com/591099 editing/selection/mixed-editability-10.html [ Failure ]
 crbug.com/591099 editing/selection/modify_extend/extend_by_character.html [ Failure ]
 crbug.com/714962 editing/selection/modify_extend/extend_forward_line_crash.html [ Failure ]
@@ -655,23 +655,6 @@
 crbug.com/591099 external/wpt/css/css-writing-modes/text-combine-upright-decorations-001.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/text-combine-upright-layout-rules-001.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/text-orientation-016.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes/text-orientation-script-001a.html [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes/text-orientation-script-001b.html [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes/text-orientation-script-001c.html [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes/text-orientation-script-001d.html [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes/text-orientation-script-001e.html [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes/text-orientation-script-001f.html [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes/text-orientation-script-001g.html [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes/text-orientation-script-001h.html [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes/text-orientation-script-001i.html [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes/text-orientation-script-001j.html [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes/text-orientation-script-001k.html [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes/text-orientation-script-001l.html [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes/text-orientation-script-001m.html [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes/text-orientation-script-001n.html [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes/text-orientation-script-001o.html [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes/text-orientation-script-001p.html [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes/text-orientation-script-001q.html [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/vertical-alignment-005.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/vertical-alignment-007.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/vertical-alignment-vlr-023.xht [ Failure ]
@@ -684,7 +667,7 @@
 crbug.com/591099 external/wpt/css/cssom-view/cssom-getClientRects-002.html [ Failure ]
 crbug.com/591099 external/wpt/css/cssom-view/elementFromPoint-002.html [ Failure ]
 crbug.com/591099 external/wpt/css/cssom-view/elementFromPoint-003.html [ Failure ]
-crbug.com/591099 external/wpt/css/geometry/interfaces.html [ Timeout ]
+crbug.com/591099 external/wpt/css/geometry/interfaces.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/css/geometry/interfaces.worker.html [ Timeout ]
 crbug.com/591099 external/wpt/css/selectors/focus-within-004.html [ Failure ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-vert-001a.xhtml [ Failure ]
@@ -713,7 +696,7 @@
 crbug.com/591099 external/wpt/dom/ranges/Range-set.html [ Timeout ]
 crbug.com/591099 external/wpt/dom/ranges/Range-surroundContents.html [ Timeout ]
 crbug.com/591099 external/wpt/domxpath/xml_xpath_runner.html [ Timeout ]
-crbug.com/591099 external/wpt/editing/run/backcolor.html [ Timeout ]
+crbug.com/591099 external/wpt/editing/run/backcolor.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/editing/run/bold.html [ Timeout ]
 crbug.com/591099 external/wpt/editing/run/fontname.html [ Timeout ]
 crbug.com/591099 external/wpt/editing/run/fontsize.html [ Timeout ]
@@ -840,7 +823,7 @@
 crbug.com/591099 external/wpt/html-media-capture/capture_video_cancel-manual.html [ Failure ]
 crbug.com/591099 external/wpt/html/browsers/windows/noreferrer-window-name.html [ Timeout ]
 crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/Document.currentScript.html [ Pass ]
-crbug.com/591099 external/wpt/html/dom/interfaces.html [ Timeout ]
+crbug.com/591099 external/wpt/html/dom/interfaces.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/utf-16be.html [ Timeout ]
 crbug.com/591099 external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/utf-16le.html [ Timeout ]
 crbug.com/591099 external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/utf-8.html [ Timeout ]
@@ -885,7 +868,7 @@
 crbug.com/591099 external/wpt/selection/addRange-00.html [ Timeout ]
 crbug.com/591099 external/wpt/selection/addRange-04.html [ Timeout ]
 crbug.com/591099 external/wpt/selection/addRange-12.html [ Pass Timeout ]
-crbug.com/591099 external/wpt/selection/addRange-16.html [ Pass Timeout ]
+crbug.com/591099 external/wpt/selection/addRange-16.html [ Timeout ]
 crbug.com/591099 external/wpt/selection/addRange-24.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/selection/addRange-28.html [ Timeout ]
 crbug.com/591099 external/wpt/selection/addRange-32.html [ Timeout ]
@@ -900,11 +883,10 @@
 crbug.com/591099 external/wpt/shadow-dom/DocumentOrShadowRoot-prototype-elementFromPoint.html [ Failure ]
 crbug.com/591099 external/wpt/svg/interfaces.html [ Timeout ]
 crbug.com/591099 external/wpt/svg/linking/reftests/href-filter-element.html [ Failure ]
-crbug.com/591099 external/wpt/url/url-setters.html [ Pass Timeout ]
+crbug.com/591099 external/wpt/url/url-setters.html [ Timeout ]
 crbug.com/591099 external/wpt/wasm/wasm_local_iframe_test.html [ Failure ]
-crbug.com/591099 external/wpt/webaudio/idlharness.https.html [ Timeout ]
+crbug.com/591099 external/wpt/webaudio/idlharness.https.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/webmessaging/broadcastchannel/sandbox.html [ Failure ]
-crbug.com/591099 external/wpt/webrtc/RTCPeerConnection-setLocalDescription-answer.html [ Pass ]
 crbug.com/591099 external/wpt/webrtc/interfaces.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/webstorage/storage_setitem.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/2_cues_overlapping_completely_move_up.html [ Failure ]
@@ -1001,7 +983,7 @@
 crbug.com/591099 fast/box-shadow/box-shadow.html [ Failure ]
 crbug.com/591099 fast/box-shadow/inset-subpixel.html [ Failure ]
 crbug.com/591099 fast/box-shadow/inset.html [ Failure ]
-crbug.com/591099 fast/box-sizing/replaced.html [ Failure Pass ]
+crbug.com/591099 fast/box-sizing/replaced.html [ Failure ]
 crbug.com/591099 fast/clip/overflow-border-radius-combinations.html [ Failure ]
 crbug.com/591099 fast/clip/overflow-border-radius-composited-parent.html [ Failure ]
 crbug.com/591099 fast/clip/overflow-border-radius-composited.html [ Failure ]
@@ -1725,7 +1707,6 @@
 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/devtools/console/console-prompt-keyboard.js [ Failure Pass ]
 crbug.com/591099 http/tests/devtools/console/console-search.js [ Timeout ]
 crbug.com/591099 http/tests/devtools/console/console-uncaught-promise.js [ Failure ]
 crbug.com/591099 http/tests/devtools/console/console-viewport-control.js [ Failure ]
@@ -1733,14 +1714,13 @@
 crbug.com/591099 http/tests/devtools/editor/text-editor-ctrl-d-1.js [ Timeout ]
 crbug.com/591099 http/tests/devtools/editor/text-editor-ctrl-d-2.js [ Timeout ]
 crbug.com/714962 http/tests/devtools/editor/text-editor-formatter.js [ Pass Timeout ]
-crbug.com/591099 http/tests/devtools/editor/text-editor-word-jumps.js [ Pass Timeout ]
+crbug.com/591099 http/tests/devtools/editor/text-editor-word-jumps.js [ Pass ]
 crbug.com/714962 http/tests/devtools/elements/edit/edit-dom-actions-4.js [ Crash ]
 crbug.com/591099 http/tests/devtools/elements/elements-panel-rewrite-href.js [ Failure Pass ]
 crbug.com/591099 http/tests/devtools/elements/highlight/highlight-css-shapes-outside-scroll.js [ Failure ]
 crbug.com/591099 http/tests/devtools/elements/highlight/highlight-css-shapes-outside.js [ Failure ]
 crbug.com/714962 http/tests/devtools/elements/inspect-pseudo-element.js [ Timeout ]
 crbug.com/591099 http/tests/devtools/elements/styles-3/styles-disable-inherited.js [ Failure ]
-crbug.com/714962 http/tests/devtools/jump-to-previous-editing-location.js [ Failure Pass ]
 crbug.com/591099 http/tests/devtools/network/network-datareceived.js [ Failure ]
 crbug.com/714962 http/tests/devtools/service-workers/service-workers-view.js [ Failure Pass ]
 crbug.com/591099 http/tests/devtools/text-autosizing-override.js [ Failure ]
@@ -2186,7 +2166,7 @@
 crbug.com/591099 svg/parser/whitespace-length-invalid-1.html [ Pass Timeout ]
 crbug.com/591099 svg/parser/whitespace-length-invalid-2.html [ Pass Timeout ]
 crbug.com/591099 svg/parser/whitespace-length-invalid-3.html [ Pass Timeout ]
-crbug.com/591099 svg/parser/whitespace-length-invalid-4.html [ Pass Timeout ]
+crbug.com/591099 svg/parser/whitespace-length-invalid-4.html [ Timeout ]
 crbug.com/591099 svg/parser/whitespace-number.html [ Timeout ]
 crbug.com/591099 svg/text/foreignObject-text-clipping-bug.xml [ Failure ]
 crbug.com/714962 svg/text/tspan-multiple-outline.svg [ Failure ]
@@ -2246,8 +2226,6 @@
 crbug.com/591099 tables/mozilla_expected_failures/marvin/table_overflow_caption_left.html [ Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/marvin/table_overflow_caption_right.html [ Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/marvin/table_overflow_caption_top.html [ Failure ]
-crbug.com/714962 touchadjustment/context-menu-select-text.html [ Failure Pass ]
-crbug.com/714962 touchadjustment/context-menu-text-subtargets.html [ Failure Pass ]
 crbug.com/591099 transforms/2d/compound-transforms-vs-containers.html [ Failure ]
 crbug.com/591099 transforms/2d/hindi-rotated.html [ Failure ]
 crbug.com/591099 transforms/2d/transform-2d.html [ Timeout ]
@@ -2257,6 +2235,8 @@
 crbug.com/714962 transforms/selection-bounds-in-transformed-view.html [ Failure ]
 crbug.com/591099 transforms/shadows.html [ Failure ]
 crbug.com/591099 virtual/android/ [ Skip ]
+crbug.com/591099 virtual/disable-rls/compositing/squashing/add-remove-squashed-layers.html [ Failure ]
+crbug.com/591099 virtual/disable-rls/compositing/squashing/selection-repaint-with-gaps.html [ Failure ]
 crbug.com/591099 virtual/disable-spv175/ [ Skip ]
 crbug.com/591099 virtual/exotic-color-space/ [ Skip ]
 crbug.com/591099 virtual/feature-policy-vibrate/ [ Skip ]
@@ -2271,7 +2251,6 @@
 crbug.com/591099 virtual/gpu-rasterization/images/rendering-broken-block-flow-images.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/rendering-broken-images.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/OffscreenCanvas-2d-pattern-in-worker.html [ Pass ]
-crbug.com/714962 virtual/gpu/fast/canvas/canvas-css-clip-path.html [ Failure Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-drawImage-video-imageSmoothingEnabled.html [ Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-imageSmoothingQuality.html [ Pass ]
 crbug.com/591099 virtual/incremental-shadow-dom/external/wpt/shadow-dom/DocumentOrShadowRoot-prototype-elementFromPoint.html [ Failure ]
@@ -2286,7 +2265,6 @@
 crbug.com/714962 virtual/mouseevent_fractional/fast/events/drag-in-frames.html [ Failure ]
 crbug.com/714962 virtual/mouseevent_fractional/fast/events/event-on-culled_inline.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/keyboardevent-getModifierState.html [ Timeout ]
-crbug.com/591099 virtual/mouseevent_fractional/fast/events/menu-key-context-menu-document-pinch-zoom.html [ Failure Pass ]
 crbug.com/714962 virtual/mouseevent_fractional/fast/events/middleClickAutoscroll-latching.html [ Pass Timeout ]
 crbug.com/714962 virtual/mouseevent_fractional/fast/events/mouse-down-on-pseudo-element-remove-crash.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/mouse-event-buttons-attribute.html [ Timeout ]
@@ -2326,4 +2304,4 @@
 crbug.com/591099 webexposed/global-interface-listing-dedicated-worker.html [ Timeout ]
 crbug.com/591099 webexposed/global-interface-listing-shared-worker.html [ Timeout ]
 crbug.com/591099 webexposed/global-interface-listing.html [ Timeout ]
-crbug.com/591099 xr/webGLCanvasContext_set_device_lost_context.html [ Crash ]
+crbug.com/591099 xr/webGLCanvasContext_set_device_lost_context.html [ Crash Pass ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index 37cd02a..0cc6d6a 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -3383,3 +3383,10 @@
 crbug.com/827088 bluetooth/requestDevice/chooser/new-scan-device-added.html [ Pass Crash ]
 crbug.com/827209 fast/events/middleClickAutoscroll-latching.html [ Pass Failure ]
 crbug.com/827209 virtual/mouseevent_fractional/fast/events/middleClickAutoscroll-latching.html [ Pass Failure ]
+
+# Utility for manual testing, not intended to be run as part of layout tests.
+crbug.com/785955 http/tests/credentialmanager/tools/virtual-authenticator-environment-manual.html [ Skip ]
+crbug.com/785955 virtual/enable-webauthn/http/tests/credentialmanager/tools/virtual-authenticator-environment-manual.html [ Skip ]
+
+# Only run virtual/enable-webauthn tests where the Credential Management/WebAuthn API are enabled.
+crbug.com/785955 http/tests/credentialmanager [ Skip ]
diff --git a/third_party/WebKit/LayoutTests/editing/selection/mixed-editability-1.html b/third_party/WebKit/LayoutTests/editing/selection/mixed-editability-1.html
index f76a9f2..217cf308 100644
--- a/third_party/WebKit/LayoutTests/editing/selection/mixed-editability-1.html
+++ b/third_party/WebKit/LayoutTests/editing/selection/mixed-editability-1.html
@@ -1,25 +1,39 @@
+<!doctype html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../assert_selection.js"></script>
 <script>
-if (window.testRunner)
-     testRunner.dumpEditingCallbacks();
-</script>
-
-<body contenteditable="true"><span id="start" contenteditable="false">On</span>ly the first two letters of the first word in this sentence should be selected.  To run this test manually, double click between the first two letters of the first word of the first sentence.</body>
-
-<script>
-if (window.testRunner) {
-    var s = window.getSelection();
-    
-    var start = document.getElementById("start");
-    
-    var x, y;
-    
-    x = start.offsetLeft + start.offsetWidth / 2;
-    y = start.offsetTop + start.offsetHeight / 2;
-    
-    eventSender.mouseMoveTo(x, y);
-    eventSender.mouseDown();
-    eventSender.mouseUp();
-    eventSender.mouseDown();
-    eventSender.mouseUp();
+function doubleClick(selection) {
+  resetMouse();
+  const target = selection.document.getElementById('target');
+  eventSender.mouseMoveTo(
+      selection.computeLeft(target) + target.offsetWidth / 2,
+      selection.computeTop(target) + target.offsetHeight / 2);
+  eventSender.mouseDown();
+  eventSender.mouseUp();
+  eventSender.mouseDown();
+  eventSender.mouseUp();
 }
+
+function resetMouse() {
+  if (!window.eventSender)
+    throw 'This test requires eventSender';
+  eventSender.mouseMoveTo(0, 0);
+  eventSender.mouseDown();
+  eventSender.mouseUp();
+}
+
+selection_test(
+  [
+    '<div contenteditable>',
+      '<span contenteditable="false" id="target">AB</span>bd',
+    '</div>',
+  ],
+  selection => doubleClick(selection),
+  [
+    '<div contenteditable>',
+      '<span contenteditable="false" id="target">^AB|</span>bd',
+    '</div>',
+  ],
+  'Select word should not cross editing boundaries.');
 </script>
diff --git a/third_party/WebKit/LayoutTests/editing/selection/mixed-editability-2.html b/third_party/WebKit/LayoutTests/editing/selection/mixed-editability-2.html
index a10d7263..eb5e3a8f 100644
--- a/third_party/WebKit/LayoutTests/editing/selection/mixed-editability-2.html
+++ b/third_party/WebKit/LayoutTests/editing/selection/mixed-editability-2.html
@@ -1,15 +1,26 @@
+<!doctype html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../assert_selection.js"></script>
 <script>
-if (window.testRunner)
-     testRunner.dumpEditingCallbacks();
+selection_test(
+  [
+    '<div contenteditable>',
+      'abc',
+      '<b contenteditable="false" id="base">DEF</b>',
+      'ghi<span id="extent">JKL</span>mno',
+    '</div>',
+  ],
+  selection => selection.setBaseAndExtent(
+        selection.document.getElementById('base'), 0,
+        selection.document.getElementById('extent'), 0),
+  [
+    '<div contenteditable>',
+      'abc',
+      // Note: WebKit yields "^DEF|".
+      '<b contenteditable="false" id="base">^DEF</b>',
+      'ghi<span id="extent">|JKL</span>mno',
+    '</div>',
+  ],
+  'Select non-editable to editable');
 </script>
-<body>
-<div contenteditable="true">
-OnlyThe<span id="base" style="font-weight:bold;" contenteditable="false">Bold</span>TextShould<span id="extent">Be</span>Selected
-</div>
-<script>
-var s = window.getSelection();
-var base = document.getElementById("base");
-var extent = document.getElementById("extent");
-s.setBaseAndExtent(base, 0, extent, 0);
-</script>
-</body>
diff --git a/third_party/WebKit/LayoutTests/editing/selection/mixed-editability-4.html b/third_party/WebKit/LayoutTests/editing/selection/mixed-editability-4.html
index b5c24f1..d7d0cb63 100644
--- a/third_party/WebKit/LayoutTests/editing/selection/mixed-editability-4.html
+++ b/third_party/WebKit/LayoutTests/editing/selection/mixed-editability-4.html
@@ -1,20 +1,51 @@
+<!doctype html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../assert_selection.js"></script>
 <script>
-if (window.testRunner)
-     testRunner.dumpEditingCallbacks();
-</script>
-<p>This tests moving the caret forward through content of mixed editability.  The caret should move down one line from the editable piece to the editable piece that's embedded in a non-editable piece.</p>
+// Tests moving the caret forward/backward through content of mixed editability.
+// The caret should move to same editability in highet editable root.
+selection_test(
+  [
+    '<div contenteditable>',
+      'ab',
+      '<table contenteditable="false"><tbody><tr>',
+        '<td contenteditable>|CD</td>',
+      '</tr></tbody></table>',
+      'ef',
+    '</div>',
+  ],
+  selection => selection.modify('move', 'backward', 'line'),
+  [
+    '<div contenteditable>',
+      '|ab',
+      '<table contenteditable="false"><tbody><tr>',
+        '<td contenteditable>CD</td>',
+      '</tr></tbody></table>',
+      'ef',
+    '</div>',
+  ],
+  '1 move backward line');
 
-<div contenteditable="true">
-editable
-<table border="1" contenteditable="false"><tr><td contenteditable="true" id="test">editable</td></tr></table>
-editable
-</div>
-
-<script>
-var e = document.getElementById("test");
-var s = window.getSelection();
-
-s.collapse(e, 0);
-
-s.modify("move", "backward", "line");
+selection_test(
+  [
+    '<div contenteditable>',
+      'ab',
+      '<table contenteditable="false"><tbody><tr>',
+        '<td contenteditable>|CD</td>',
+      '</tr></tbody></table>',
+      'ef',
+    '</div>',
+  ],
+  selection => selection.modify('move', 'forward', 'documentBoundary'),
+  [
+    '<div contenteditable>',
+      'ab',
+      '<table contenteditable="false"><tbody><tr>',
+        '<td contenteditable>CD</td>',
+      '</tr></tbody></table>',
+      'ef|',
+    '</div>',
+  ],
+  '2 move forward documentBoundary');
 </script>
diff --git a/third_party/WebKit/LayoutTests/editing/selection/mixed-editability-5.html b/third_party/WebKit/LayoutTests/editing/selection/mixed-editability-5.html
deleted file mode 100644
index bc0a2b7..0000000
--- a/third_party/WebKit/LayoutTests/editing/selection/mixed-editability-5.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<script>
-if (window.testRunner)
-     testRunner.dumpEditingCallbacks();
-</script>
-<p>This tests moving the caret forward through content of mixed editability.  The caret should move down one line from the editable piece to the editable piece that's embedded in a non-editable piece.</p>
-
-<div contenteditable="true">
-editable
-<table border="1" contenteditable="false"><tr><td contenteditable="true" id="test">editable</td></tr></table>
-editable
-</div>
-
-<script>
-var e = document.getElementById("test");
-var s = window.getSelection();
-
-s.collapse(e, 0);
-
-s.modify("move", "forward", "documentBoundary");
-</script>
diff --git a/third_party/WebKit/LayoutTests/editing/selection/mixed-editability-6.html b/third_party/WebKit/LayoutTests/editing/selection/mixed-editability-6.html
index fcc93465..678ab04 100644
--- a/third_party/WebKit/LayoutTests/editing/selection/mixed-editability-6.html
+++ b/third_party/WebKit/LayoutTests/editing/selection/mixed-editability-6.html
@@ -1,14 +1,51 @@
-<p>This tests Select All when the caret is inside an editable region that is inside a non editable region.  Whenever the selection is in an editable region, Select All should select the contents of the highest editable root.</p>
-<div contenteditable="true">
-<div>One</div>
-<div contenteditable="false"><span>Two</span> <span id="start" contenteditable="true">Three</span></div>
-<div>Four</div>
-</div>
-
+<!doctype html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../assert_selection.js"></script>
 <script>
-var span = document.getElementById("start");
-var sel = window.getSelection();
-sel.collapse(span, 0);
+selection_test(
+  [
+    '<div contenteditable>',
+      '<div>ab</div>',
+      '<div contenteditable="false">',
+        '<span>CD</span> <span contenteditable>|ef</span>',
+      '</div>',
+      '<div>gh</div>',
+    '</div>',
+  ],
+  'selectAll',
+  [
+    '<div contenteditable>',
+      '<div>^ab</div>',
+      '<div contenteditable="false">',
+        '<span>CD</span> <span contenteditable>ef</span>',
+      '</div>',
+      '<div>gh|</div>',
+    '</div>',
+  ],
+  '1 SelectAll should select the contents of highest editable root.');
 
-document.execCommand("SelectAll");
+selection_test(
+  [
+    '<div contenteditable>',
+      '<div id="extent">ab</div>',
+      '<div contenteditable="false">',
+        '<span>CD</span> <span contenteditable id="base">ef</span>',
+      '</div>',
+      '<div>gh</div>',
+    '</div>',
+  ],
+  selection =>
+    selection.setBaseAndExtent(selection.document.getElementById('base'), 1,
+                               selection.document.getElementById('extent'), 0),
+  [
+    '<div contenteditable>',
+      '<div id="extent">|ab</div>',
+      '<div contenteditable="false">',
+        '<span>CD</span> <span contenteditable id="base">ef^</span>',
+      '</div>',
+      '<div>gh</div>',
+    '</div>',
+  ],
+  '2 Selection#setBaseAndExtent()');
 </script>
diff --git a/third_party/WebKit/LayoutTests/editing/selection/mixed-editability-7.html b/third_party/WebKit/LayoutTests/editing/selection/mixed-editability-7.html
deleted file mode 100644
index 019ef284..0000000
--- a/third_party/WebKit/LayoutTests/editing/selection/mixed-editability-7.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<p>This tests creating a selection based inside a nested editable region that extends out to editable content that is inside the same highest editable root.  'One' through 'Three' should be selected.</p>
-<div contenteditable="true">
-<div id="extent">One</div>
-<div contenteditable="false"><span>Two</span> <span id="base" contenteditable="true">Three</span></div>
-<div>Four</div>
-</div>
-
-<script>
-var base = document.getElementById("base");
-var extent = document.getElementById("extent");
-
-var sel = window.getSelection();
-sel.setBaseAndExtent(base, 1, extent, 0);
-</script>
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
index 2a82142..9428890 100644
--- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
+++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
@@ -28091,6 +28091,30 @@
      {}
     ]
    ],
+   "css/css-align/gaps/gap-normal-used-001.html": [
+    [
+     "/css/css-align/gaps/gap-normal-used-001.html",
+     [
+      [
+       "/css/reference/ref-filled-green-100px-square.xht",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/css-align/gaps/gap-normal-used-002.html": [
+    [
+     "/css/css-align/gaps/gap-normal-used-002.html",
+     [
+      [
+       "/css/reference/ref-filled-green-100px-square.xht",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/css-animations/animation-delay-008.html": [
     [
      "/css/css-animations/animation-delay-008.html",
@@ -97521,6 +97545,11 @@
      {}
     ]
    ],
+   "IndexedDB/interfaces.any.worker-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "IndexedDB/interleaved-cursors-common.js": [
     [
      {}
@@ -100396,6 +100425,11 @@
      {}
     ]
    ],
+   "content-security-policy/securitypolicyviolation/idl-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "content-security-policy/securitypolicyviolation/img-src-redirect-upgrade-reporting.https.html.headers": [
     [
      {}
@@ -145221,11 +145255,6 @@
      {}
     ]
    ],
-   "html/infrastructure/safe-passing-of-structured-data/structured_clone_bigint-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "html/infrastructure/safe-passing-of-structured-data/transfer-errors.window-expected.txt": [
     [
      {}
@@ -151391,6 +151420,11 @@
      {}
     ]
    ],
+   "interfaces/web-audio-api.idl": [
+    [
+     {}
+    ]
+   ],
    "interfaces/web-nfc.idl": [
     [
      {}
@@ -151401,11 +151435,6 @@
      {}
     ]
    ],
-   "interfaces/webaudio.idl": [
-    [
-     {}
-    ]
-   ],
    "interfaces/webauthn.idl": [
     [
      {}
@@ -161816,6 +161845,11 @@
      {}
     ]
    ],
+   "webaudio/the-audio-api/the-gainnode-interface/idl-test-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/.gitkeep": [
     [
      {}
@@ -162751,6 +162785,11 @@
      {}
     ]
    ],
+   "webstorage/idlharness-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "webstorage/resources/event_body_handler.html": [
     [
      {}
@@ -162836,6 +162875,11 @@
      {}
     ]
    ],
+   "webusb/idlharness.https-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "webusb/resources/fake-devices.js": [
     [
      {}
@@ -179307,6 +179351,12 @@
      {}
     ]
    ],
+   "css/css-align/gaps/gap-normal-computed-001.html": [
+    [
+     "/css/css-align/gaps/gap-normal-computed-001.html",
+     {}
+    ]
+   ],
    "css/css-align/gaps/gap-parsing-001.html": [
     [
      "/css/css-align/gaps/gap-parsing-001.html",
@@ -250244,6 +250294,10 @@
    "ae562d6b568c1005c5eef5a230b8869729719dff",
    "testharness"
   ],
+  "IndexedDB/interfaces.any.worker-expected.txt": [
+   "036ceb7629fed15ded127cb893d50e357dd75787",
+   "support"
+  ],
   "IndexedDB/interleaved-cursors-common.js": [
    "6744105fe1a15a91058e3e5993f8a1f88548e3a3",
    "support"
@@ -252029,7 +252083,7 @@
    "testharness"
   ],
   "background-fetch/interfaces-expected.txt": [
-   "b6cf948689a9c2aab5d953b2976febda0e8b3344",
+   "a3b0e865d7695e07f05cddb0e288a08ad27c77c3",
    "support"
   ],
   "background-fetch/interfaces-worker.https-expected.txt": [
@@ -255336,6 +255390,10 @@
    "8e7326101e28ec65c6c834f7711b261917f93218",
    "testharness"
   ],
+  "content-security-policy/securitypolicyviolation/idl-expected.txt": [
+   "f69d95abfb6978d44e7b997e83da569a8be8f899",
+   "support"
+  ],
   "content-security-policy/securitypolicyviolation/idl.html": [
    "fb8f2938d76a29cc68c46fb49a12feebc0031e54",
    "testharness"
@@ -270780,6 +270838,18 @@
    "e2c2dc0ed64e3c8e70959c64108cbb798ea49827",
    "testharness"
   ],
+  "css/css-align/gaps/gap-normal-computed-001.html": [
+   "e7412b730249b49deca715deef9547a24d49b6b9",
+   "testharness"
+  ],
+  "css/css-align/gaps/gap-normal-used-001.html": [
+   "d4e03d7cdb2962dc5adb70772d3dcb4edcd6b648",
+   "reftest"
+  ],
+  "css/css-align/gaps/gap-normal-used-002.html": [
+   "7348776ecf5dbf5236c9118b6d086e5160c89fbc",
+   "reftest"
+  ],
   "css/css-align/gaps/gap-parsing-001.html": [
    "7eb55e0a8b04384aebfbb5a47922c5b33f93270c",
    "testharness"
@@ -328817,7 +328887,7 @@
    "support"
   ],
   "fullscreen/interfaces-expected.txt": [
-   "5e87fd505382cc0bc54cf94bc0d7853a000764f6",
+   "036ceb7629fed15ded127cb893d50e357dd75787",
    "support"
   ],
   "fullscreen/interfaces.html": [
@@ -333805,7 +333875,7 @@
    "support"
   ],
   "html/dom/interfaces-expected.txt": [
-   "5199c193d81b05bcccb06b31f023389650484b1f",
+   "036ceb7629fed15ded127cb893d50e357dd75787",
    "support"
   ],
   "html/dom/interfaces.html": [
@@ -338012,10 +338082,6 @@
    "7c0b8b2e411236aeeed3a8b7962dc70d8a94969f",
    "testharness"
   ],
-  "html/infrastructure/safe-passing-of-structured-data/structured_clone_bigint-expected.txt": [
-   "bdaf63ead9c5b024b7870191c8419e630dd795e4",
-   "support"
-  ],
   "html/infrastructure/safe-passing-of-structured-data/structured_clone_bigint.html": [
    "5ca99a8e8550e55246e16980bdf5f5b65ceafd09",
    "testharness"
@@ -349184,6 +349250,10 @@
    "8d00ee62fafedfd3e24925f48eed6ba26b5aafc7",
    "support"
   ],
+  "interfaces/web-audio-api.idl": [
+   "95feed20bd7d63ce1f3daea677e96340576eada9",
+   "support"
+  ],
   "interfaces/web-nfc.idl": [
    "105e771bdd9587f029091a5ed590187ed6e86e2a",
    "support"
@@ -349192,10 +349262,6 @@
    "21b54128664c5962c29fd708ebba3d8d90987f26",
    "support"
   ],
-  "interfaces/webaudio.idl": [
-   "43a244276b9795b137c2e46c194d56dbb957635d",
-   "support"
-  ],
   "interfaces/webauthn.idl": [
    "1ae8b428644479b352fd5b1996677fd4dcdbb84b",
    "support"
@@ -349533,7 +349599,7 @@
    "testharness"
   ],
   "media-capabilities/idlharness-expected.txt": [
-   "edc3a5baf961ee61a33d957f0c889c38254c8d77",
+   "aa2588cbd1a549b2c0dad708a43df49d5fda8bcd",
    "support"
   ],
   "media-capabilities/idlharness.html": [
@@ -350217,7 +350283,7 @@
    "testharness"
   ],
   "mediacapture-streams/MediaDevices-IDL-all-expected.txt": [
-   "1e4453398efb9372ae072f3a5b87758133e47292",
+   "228e316afe64e29787b10f7a1d9a167bea4a0529",
    "support"
   ],
   "mediacapture-streams/MediaDevices-IDL-all.html": [
@@ -350329,7 +350395,7 @@
    "testharness"
   ],
   "mediacapture-streams/MediaStreamTrack-idl.https-expected.txt": [
-   "9a587b8e86799e95dfd3c90f38340bc2105c3391",
+   "036ceb7629fed15ded127cb893d50e357dd75787",
    "support"
   ],
   "mediacapture-streams/MediaStreamTrack-idl.https.html": [
@@ -358585,7 +358651,7 @@
    "testharness"
   ],
   "payment-handler/interfaces.https.any-expected.txt": [
-   "9cdc2a2ce98bf6b06ff7c4816f30d00c2add7b0f",
+   "cdee73bacd9e8d519238b6825d4d626690dfc183",
    "support"
   ],
   "payment-handler/interfaces.https.any.js": [
@@ -375713,7 +375779,7 @@
    "support"
   ],
   "webaudio/idlharness.https.html": [
-   "f42681173fdf4cb8dad2049351f55f3a7ff0fcac",
+   "2951a126a8b168e6fe4699890d5a3c4772c7f960",
    "testharness"
   ],
   "webaudio/js/buffer-loader.js": [
@@ -376108,6 +376174,10 @@
    "5f50c22eaa77f09d0fa8c6f6f5249fdbf7db4b24",
    "testharness"
   ],
+  "webaudio/the-audio-api/the-gainnode-interface/idl-test-expected.txt": [
+   "e0c4999efb3892e8a68316552cf2d137c6b7fce3",
+   "support"
+  ],
   "webaudio/the-audio-api/the-gainnode-interface/idl-test.html": [
    "30843d3b74e8ec33bedd849f3f2b1bbd4bcc9f5e",
    "testharness"
@@ -378652,6 +378722,10 @@
    "6ba7d14a894e782495d818e43f4b0901607c207e",
    "support"
   ],
+  "webstorage/idlharness-expected.txt": [
+   "27534b931d8d18ddd03fb6bd8f8dd205d8d83106",
+   "support"
+  ],
   "webstorage/idlharness.html": [
    "e57413a1868e8d84ba7c500ff13b7e68675cbe66",
    "testharness"
@@ -378816,6 +378890,10 @@
    "34eaa588ed78672070782cb556939ea711a18caf",
    "support"
   ],
+  "webusb/idlharness.https-expected.txt": [
+   "e1dd0a89df22529cc9cf4d47831a96dd05361461",
+   "support"
+  ],
   "webusb/idlharness.https.html": [
    "135ae431cdac90d34b85fe1ea355abaf9a9fb732",
    "testharness"
@@ -381817,7 +381895,7 @@
    "support"
   ],
   "webxr/interfaces.https-expected.txt": [
-   "6d7b736abed474d52ff0104d74207c97b6ffff73",
+   "4f1a30c70d25086ecb781f51a3cfd7a71a602e06",
    "support"
   ],
   "webxr/interfaces.https.html": [
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/IndexedDB/interfaces.any.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/IndexedDB/interfaces.any.worker-expected.txt
similarity index 100%
rename from third_party/WebKit/LayoutTests/platform/win/external/wpt/IndexedDB/interfaces.any.worker-expected.txt
rename to third_party/WebKit/LayoutTests/external/wpt/IndexedDB/interfaces.any.worker-expected.txt
diff --git a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-expected.txt
index dbd51c5..27a8fa6 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-expected.txt
@@ -1,74 +1,4 @@
 This is a testharness.js-based test.
-Found 70 tests; 52 PASS, 18 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS Exposed interfaces in a Document.
-PASS ServiceWorkerRegistration interface: attribute backgroundFetch
-PASS Unscopable handled correctly for backgroundFetch property on ServiceWorkerRegistration
-PASS ServiceWorkerGlobalScope interface: existence and properties of interface object
-PASS BackgroundFetchManager interface: existence and properties of interface object
-PASS BackgroundFetchManager interface object length
-PASS BackgroundFetchManager interface object name
-PASS BackgroundFetchManager interface: existence and properties of interface prototype object
-PASS BackgroundFetchManager interface: existence and properties of interface prototype object's "constructor" property
-PASS BackgroundFetchManager interface: existence and properties of interface prototype object's @@unscopables property
-PASS BackgroundFetchManager interface: operation fetch(DOMString, [object Object],[object Object], BackgroundFetchOptions)
-PASS Unscopable handled correctly for fetch(DOMString, [object Object],[object Object], BackgroundFetchOptions) on BackgroundFetchManager
-PASS BackgroundFetchManager interface: operation get(DOMString)
-PASS Unscopable handled correctly for get(DOMString) on BackgroundFetchManager
-PASS BackgroundFetchManager interface: operation getIds()
-PASS Unscopable handled correctly for getIds() on BackgroundFetchManager
-FAIL BackgroundFetchRegistration interface: existence and properties of interface object Cannot read property 'has_extended_attribute' of undefined
-PASS BackgroundFetchRegistration interface object length
-PASS BackgroundFetchRegistration interface object name
-FAIL BackgroundFetchRegistration interface: existence and properties of interface prototype object Cannot read property 'has_extended_attribute' of undefined
-PASS BackgroundFetchRegistration interface: existence and properties of interface prototype object's "constructor" property
-PASS BackgroundFetchRegistration interface: existence and properties of interface prototype object's @@unscopables property
-PASS BackgroundFetchRegistration interface: attribute id
-PASS Unscopable handled correctly for id property on BackgroundFetchRegistration
-PASS BackgroundFetchRegistration interface: attribute uploadTotal
-PASS Unscopable handled correctly for uploadTotal property on BackgroundFetchRegistration
-PASS BackgroundFetchRegistration interface: attribute uploaded
-PASS Unscopable handled correctly for uploaded property on BackgroundFetchRegistration
-PASS BackgroundFetchRegistration interface: attribute downloadTotal
-PASS Unscopable handled correctly for downloadTotal property on BackgroundFetchRegistration
-PASS BackgroundFetchRegistration interface: attribute downloaded
-PASS Unscopable handled correctly for downloaded property on BackgroundFetchRegistration
-FAIL BackgroundFetchRegistration interface: attribute activeFetches assert_true: The prototype object must have a property "activeFetches" expected true got false
-PASS Unscopable handled correctly for activeFetches property on BackgroundFetchRegistration
-PASS BackgroundFetchRegistration interface: attribute onprogress
-PASS Unscopable handled correctly for onprogress property on BackgroundFetchRegistration
-PASS BackgroundFetchRegistration interface: operation abort()
-PASS Unscopable handled correctly for abort() on BackgroundFetchRegistration
-PASS BackgroundFetchFetch interface: existence and properties of interface object
-PASS BackgroundFetchFetch interface object length
-PASS BackgroundFetchFetch interface object name
-PASS BackgroundFetchFetch interface: existence and properties of interface prototype object
-PASS BackgroundFetchFetch interface: existence and properties of interface prototype object's "constructor" property
-PASS BackgroundFetchFetch interface: existence and properties of interface prototype object's @@unscopables property
-PASS BackgroundFetchFetch interface: attribute request
-PASS Unscopable handled correctly for request property on BackgroundFetchFetch
-FAIL BackgroundFetchActiveFetches interface: existence and properties of interface object assert_own_property: self does not have own property "BackgroundFetchActiveFetches" expected property "BackgroundFetchActiveFetches" missing
-FAIL BackgroundFetchActiveFetches interface object length assert_own_property: self does not have own property "BackgroundFetchActiveFetches" expected property "BackgroundFetchActiveFetches" missing
-FAIL BackgroundFetchActiveFetches interface object name assert_own_property: self does not have own property "BackgroundFetchActiveFetches" expected property "BackgroundFetchActiveFetches" missing
-FAIL BackgroundFetchActiveFetches interface: existence and properties of interface prototype object assert_own_property: self does not have own property "BackgroundFetchActiveFetches" expected property "BackgroundFetchActiveFetches" missing
-FAIL BackgroundFetchActiveFetches interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "BackgroundFetchActiveFetches" expected property "BackgroundFetchActiveFetches" missing
-FAIL BackgroundFetchActiveFetches interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "BackgroundFetchActiveFetches" expected property "BackgroundFetchActiveFetches" missing
-FAIL BackgroundFetchActiveFetches interface: operation match(RequestInfo) assert_own_property: self does not have own property "BackgroundFetchActiveFetches" expected property "BackgroundFetchActiveFetches" missing
-PASS Unscopable handled correctly for match(RequestInfo) on BackgroundFetchActiveFetches
-FAIL BackgroundFetchActiveFetches interface: operation values() assert_own_property: self does not have own property "BackgroundFetchActiveFetches" expected property "BackgroundFetchActiveFetches" missing
-PASS Unscopable handled correctly for values() on BackgroundFetchActiveFetches
-FAIL BackgroundFetchActiveFetch interface: existence and properties of interface object assert_own_property: self does not have own property "BackgroundFetchActiveFetch" expected property "BackgroundFetchActiveFetch" missing
-FAIL BackgroundFetchActiveFetch interface object length assert_own_property: self does not have own property "BackgroundFetchActiveFetch" expected property "BackgroundFetchActiveFetch" missing
-FAIL BackgroundFetchActiveFetch interface object name assert_own_property: self does not have own property "BackgroundFetchActiveFetch" expected property "BackgroundFetchActiveFetch" missing
-FAIL BackgroundFetchActiveFetch interface: existence and properties of interface prototype object assert_own_property: self does not have own property "BackgroundFetchActiveFetch" expected property "BackgroundFetchActiveFetch" missing
-FAIL BackgroundFetchActiveFetch interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "BackgroundFetchActiveFetch" expected property "BackgroundFetchActiveFetch" missing
-FAIL BackgroundFetchActiveFetch interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "BackgroundFetchActiveFetch" expected property "BackgroundFetchActiveFetch" missing
-FAIL BackgroundFetchActiveFetch interface: attribute responseReady assert_own_property: self does not have own property "BackgroundFetchActiveFetch" expected property "BackgroundFetchActiveFetch" missing
-PASS Unscopable handled correctly for responseReady property on BackgroundFetchActiveFetch
-PASS BackgroundFetchEvent interface: existence and properties of interface object
-PASS BackgroundFetchSettledEvent interface: existence and properties of interface object
-PASS BackgroundFetchSettledFetches interface: existence and properties of interface object
-PASS BackgroundFetchSettledFetch interface: existence and properties of interface object
-PASS BackgroundFetchUpdateEvent interface: existence and properties of interface object
-PASS BackgroundFetchClickEvent interface: existence and properties of interface object
+FAIL Exposed interfaces in a Document. promise_test: Unhandled rejection with value: object "BackgroundFetchRegistration inherits EventTarget, but EventTarget is undefined."
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/content-security-policy/securitypolicyviolation/idl-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/securitypolicyviolation/idl-expected.txt
similarity index 100%
rename from third_party/WebKit/LayoutTests/platform/win/external/wpt/content-security-policy/securitypolicyviolation/idl-expected.txt
rename to third_party/WebKit/LayoutTests/external/wpt/content-security-policy/securitypolicyviolation/idl-expected.txt
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-align/gaps/gap-normal-computed-001.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-align/gaps/gap-normal-computed-001.html
new file mode 100644
index 0000000..45b82ac
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-align/gaps/gap-normal-computed-001.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Box Alignment Test: computed value of normal on *-gap properties</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<link rel="help" href="https://www.w3.org/TR/css-align-3/#column-row-gap">
+<meta assert="The computed value of [row-|column-]?gap is normal for all elements it applies to. Checking explicitely because earlier version of the spec called for 0px in some cases.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+#col,
+#grid,
+#flex {
+  /* Not using the shorthand because that's not what we're interested in,
+     and there are implementations that support column-gap without supporting the shorthand */
+  colum-gap: normal;
+  row-gap: normal;
+  float: right; /* for shrinkwrap*/
+}
+#col {
+  column-count: 2;
+  column-width: 50px;
+}
+#grid {
+  display: grid;
+  grid-template-columns: 50px 50px;
+  grid-template-rows: 50px 50px;
+}
+#flex {
+  display: flex;
+}
+#flex * { width: 50px; height: 50px;}
+</style>
+<body>
+  <div id="log"></div>
+
+  <div id=col></div>
+  <div id=grid></div>
+  <div id=flex><span></span><span></span></div>
+
+  <script>
+    test(
+      function(){
+        var target = document.getElementById("col");
+        assert_equals(getComputedStyle(target).columnGap, "normal");
+      }, "colum-gap:normal computes to normal on multicol elements");
+    test(
+      function(){
+        var target = document.getElementById("col");
+        assert_equals(getComputedStyle(target).rowGap, "normal");
+      }, "row-gap:normal computes to normal on multicol elements");
+    test(
+      function(){
+        var target = document.getElementById("grid");
+        assert_equals(getComputedStyle(target).columnGap, "normal");
+      }, "colum-gap:normal computes to normal on grid");
+    test(
+      function(){
+        var target = document.getElementById("grid");
+        assert_equals(getComputedStyle(target).rowGap, "normal");
+      }, "row-gap:normal computes to normal on grid");
+    test(
+      function(){
+        var target = document.getElementById("flex");
+        assert_equals(getComputedStyle(target).columnGap, "normal");
+      }, "colum-gap:normal (main axis) computes to normal on flexbox");
+    test(
+      function(){
+        var target = document.getElementById("flex");
+        assert_equals(getComputedStyle(target).rowGap, "normal");
+      }, "row-gap:normal (cross axis) computes to normal on flexbox");
+  </script>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-align/gaps/gap-normal-used-001.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-align/gaps/gap-normal-used-001.html
new file mode 100644
index 0000000..3d7ab10b
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-align/gaps/gap-normal-used-001.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Box Alignment Test: used value of *-gap:normal on grid</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<link rel="help" href="https://www.w3.org/TR/css-align-3/#column-row-gap">
+<meta assert="The used value of row-gap and column-gap normal for grids is 0">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
+<style>
+#grid {
+  colum-gap: normal;
+  row-gap: normal;
+  display: grid;
+  grid-template-columns: 50px 50px;
+  grid-template-rows: 50px 50px;
+
+  position: absolute;
+}
+#grid * { background: green; }
+#red {
+  width: 100px;
+  height: 100px;
+  background: red;
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+
+<div id=grid><span></span><span></span><span></span><span></span></div>
+<div id=red></div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-align/gaps/gap-normal-used-002.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-align/gaps/gap-normal-used-002.html
new file mode 100644
index 0000000..0b40646
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-align/gaps/gap-normal-used-002.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Box Alignment Test: used value of *-gap:normal on flexbox</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<link rel="help" href="https://www.w3.org/TR/css-align-3/#column-row-gap">
+<meta assert="The used value row-gap:normal and column:normal normal is 0px in flexbox">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
+<style>
+#flex {
+  colum-gap: normal;
+  row-gap: normal;
+  display: flex;
+  flex-flow: wrap;
+  max-width: 145px; /* more than 100, less than 150, to force wrapping and get 2 items per line*/
+
+  position: absolute;
+}
+#flex * {
+  width: 50px;
+  height: 50px;
+  background: green
+}
+#red {
+  width: 100px;
+  height: 100px;
+  background: red;
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+
+<div id=flex><span></span><span></span><span></span><span></span></div>
+<div id=red></div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fullscreen/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/fullscreen/interfaces-expected.txt
index ed3cce9..bc6c479 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/fullscreen/interfaces-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/fullscreen/interfaces-expected.txt
@@ -1,33 +1,4 @@
 This is a testharness.js-based test.
-PASS Test driver
-FAIL Document interface: attribute fullscreenEnabled assert_equals: setter must be function for PutForwards, Replaceable, or non-readonly attributes expected "function" but got "undefined"
-PASS Unscopable handled correctly for fullscreenEnabled property on Document
-FAIL Document interface: attribute fullscreen assert_true: The prototype object must have a property "fullscreen" expected true got false
-FAIL Unscopable handled correctly for fullscreen property on Document assert_equals: Document.prototype[Symbol.unscopables].fullscreen must exist expected "object" but got "undefined"
-FAIL Document interface: operation exitFullscreen() assert_unreached: Throws "TypeError: Illegal invocation" instead of rejecting promise Reached unreachable code
-PASS Unscopable handled correctly for exitFullscreen() on Document
-PASS Document interface: attribute onfullscreenchange
-PASS Unscopable handled correctly for onfullscreenchange property on Document
-PASS Document interface: attribute onfullscreenerror
-PASS Unscopable handled correctly for onfullscreenerror property on Document
-FAIL Document interface: attribute fullscreenElement assert_equals: setter must be function for PutForwards, Replaceable, or non-readonly attributes expected "function" but got "undefined"
-PASS Unscopable handled correctly for fullscreenElement property on Document
-PASS Document interface: new Document must inherit property "fullscreenEnabled" with the proper type
-FAIL Document interface: new Document must inherit property "fullscreen" with the proper type assert_inherits: property "fullscreen" not found in prototype chain
-PASS Document interface: new Document must inherit property "exitFullscreen()" with the proper type
-PASS Document interface: new Document must inherit property "onfullscreenchange" with the proper type
-PASS Document interface: new Document must inherit property "onfullscreenerror" with the proper type
-PASS Document interface: new Document must inherit property "fullscreenElement" with the proper type
-FAIL ShadowRoot interface: attribute fullscreenElement assert_equals: setter must be function for PutForwards, Replaceable, or non-readonly attributes expected "function" but got "undefined"
-PASS Unscopable handled correctly for fullscreenElement property on ShadowRoot
-FAIL Element interface: operation requestFullscreen() assert_unreached: Throws "TypeError: Illegal invocation" instead of rejecting promise Reached unreachable code
-PASS Unscopable handled correctly for requestFullscreen() on Element
-PASS Element interface: attribute onfullscreenchange
-PASS Unscopable handled correctly for onfullscreenchange property on Element
-PASS Element interface: attribute onfullscreenerror
-PASS Unscopable handled correctly for onfullscreenerror property on Element
-PASS Element interface: document.createElementNS(null, "test") must inherit property "requestFullscreen()" with the proper type
-PASS Element interface: document.createElementNS(null, "test") must inherit property "onfullscreenchange" with the proper type
-PASS Element interface: document.createElementNS(null, "test") must inherit property "onfullscreenerror" with the proper type
+FAIL Test driver promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces-expected.txt
index 55836211..bc6c479 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces-expected.txt
@@ -1,6706 +1,4 @@
 This is a testharness.js-based test.
-Found 6700 tests; 6601 PASS, 99 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS Test driver
-PASS Document interface: attribute domain
-PASS Unscopable handled correctly for domain property on Document
-PASS Document interface: attribute referrer
-PASS Unscopable handled correctly for referrer property on Document
-PASS Document interface: attribute cookie
-PASS Unscopable handled correctly for cookie property on Document
-PASS Document interface: attribute lastModified
-PASS Unscopable handled correctly for lastModified property on Document
-PASS Document interface: attribute readyState
-PASS Unscopable handled correctly for readyState property on Document
-PASS Document interface: attribute title
-PASS Unscopable handled correctly for title property on Document
-PASS Document interface: attribute dir
-PASS Unscopable handled correctly for dir property on Document
-PASS Document interface: attribute body
-PASS Unscopable handled correctly for body property on Document
-PASS Document interface: attribute head
-PASS Unscopable handled correctly for head property on Document
-PASS Document interface: attribute images
-PASS Unscopable handled correctly for images property on Document
-PASS Document interface: attribute embeds
-PASS Unscopable handled correctly for embeds property on Document
-PASS Document interface: attribute plugins
-PASS Unscopable handled correctly for plugins property on Document
-PASS Document interface: attribute links
-PASS Unscopable handled correctly for links property on Document
-PASS Document interface: attribute forms
-PASS Unscopable handled correctly for forms property on Document
-PASS Document interface: attribute scripts
-PASS Unscopable handled correctly for scripts property on Document
-PASS Document interface: operation getElementsByName(DOMString)
-PASS Unscopable handled correctly for getElementsByName(DOMString) on Document
-PASS Document interface: attribute currentScript
-PASS Unscopable handled correctly for currentScript property on Document
-PASS Document interface: operation open(DOMString, DOMString)
-PASS Unscopable handled correctly for open(DOMString, DOMString) on Document
-PASS Document interface: operation open(USVString, DOMString, DOMString)
-PASS Unscopable handled correctly for open(USVString, DOMString, DOMString) on Document
-PASS Document interface: operation close()
-PASS Unscopable handled correctly for close() on Document
-PASS Document interface: operation write(DOMString)
-PASS Unscopable handled correctly for write(DOMString) on Document
-PASS Document interface: operation writeln(DOMString)
-PASS Unscopable handled correctly for writeln(DOMString) on Document
-PASS Document interface: attribute defaultView
-PASS Unscopable handled correctly for defaultView property on Document
-PASS Document interface: attribute activeElement
-PASS Unscopable handled correctly for activeElement property on Document
-PASS Document interface: operation hasFocus()
-PASS Unscopable handled correctly for hasFocus() on Document
-PASS Document interface: attribute designMode
-PASS Unscopable handled correctly for designMode property on Document
-PASS Document interface: operation execCommand(DOMString, boolean, DOMString)
-PASS Unscopable handled correctly for execCommand(DOMString, boolean, DOMString) on Document
-PASS Document interface: operation queryCommandEnabled(DOMString)
-PASS Unscopable handled correctly for queryCommandEnabled(DOMString) on Document
-PASS Document interface: operation queryCommandIndeterm(DOMString)
-PASS Unscopable handled correctly for queryCommandIndeterm(DOMString) on Document
-PASS Document interface: operation queryCommandState(DOMString)
-PASS Unscopable handled correctly for queryCommandState(DOMString) on Document
-PASS Document interface: operation queryCommandSupported(DOMString)
-PASS Unscopable handled correctly for queryCommandSupported(DOMString) on Document
-PASS Document interface: operation queryCommandValue(DOMString)
-PASS Unscopable handled correctly for queryCommandValue(DOMString) on Document
-PASS Document interface: attribute onreadystatechange
-PASS Unscopable handled correctly for onreadystatechange property on Document
-PASS Document interface: attribute fgColor
-PASS Unscopable handled correctly for fgColor property on Document
-PASS Document interface: attribute linkColor
-PASS Unscopable handled correctly for linkColor property on Document
-PASS Document interface: attribute vlinkColor
-PASS Unscopable handled correctly for vlinkColor property on Document
-PASS Document interface: attribute alinkColor
-PASS Unscopable handled correctly for alinkColor property on Document
-PASS Document interface: attribute bgColor
-PASS Unscopable handled correctly for bgColor property on Document
-PASS Document interface: attribute anchors
-PASS Unscopable handled correctly for anchors property on Document
-PASS Document interface: attribute applets
-PASS Unscopable handled correctly for applets property on Document
-PASS Document interface: operation clear()
-PASS Unscopable handled correctly for clear() on Document
-PASS Document interface: operation captureEvents()
-PASS Unscopable handled correctly for captureEvents() on Document
-PASS Document interface: operation releaseEvents()
-PASS Unscopable handled correctly for releaseEvents() on Document
-PASS Document interface: attribute all
-PASS Unscopable handled correctly for all property on Document
-PASS Document interface: attribute onabort
-PASS Unscopable handled correctly for onabort property on Document
-PASS Document interface: attribute onauxclick
-PASS Unscopable handled correctly for onauxclick property on Document
-PASS Document interface: attribute onblur
-PASS Unscopable handled correctly for onblur property on Document
-PASS Document interface: attribute oncancel
-PASS Unscopable handled correctly for oncancel property on Document
-PASS Document interface: attribute oncanplay
-PASS Unscopable handled correctly for oncanplay property on Document
-PASS Document interface: attribute oncanplaythrough
-PASS Unscopable handled correctly for oncanplaythrough property on Document
-PASS Document interface: attribute onchange
-PASS Unscopable handled correctly for onchange property on Document
-PASS Document interface: attribute onclick
-PASS Unscopable handled correctly for onclick property on Document
-PASS Document interface: attribute onclose
-PASS Unscopable handled correctly for onclose property on Document
-PASS Document interface: attribute oncontextmenu
-PASS Unscopable handled correctly for oncontextmenu property on Document
-PASS Document interface: attribute oncuechange
-PASS Unscopable handled correctly for oncuechange property on Document
-PASS Document interface: attribute ondblclick
-PASS Unscopable handled correctly for ondblclick property on Document
-PASS Document interface: attribute ondrag
-PASS Unscopable handled correctly for ondrag property on Document
-PASS Document interface: attribute ondragend
-PASS Unscopable handled correctly for ondragend property on Document
-PASS Document interface: attribute ondragenter
-PASS Unscopable handled correctly for ondragenter property on Document
-FAIL Document interface: attribute ondragexit assert_true: The prototype object must have a property "ondragexit" expected true got false
-PASS Unscopable handled correctly for ondragexit property on Document
-PASS Document interface: attribute ondragleave
-PASS Unscopable handled correctly for ondragleave property on Document
-PASS Document interface: attribute ondragover
-PASS Unscopable handled correctly for ondragover property on Document
-PASS Document interface: attribute ondragstart
-PASS Unscopable handled correctly for ondragstart property on Document
-PASS Document interface: attribute ondrop
-PASS Unscopable handled correctly for ondrop property on Document
-PASS Document interface: attribute ondurationchange
-PASS Unscopable handled correctly for ondurationchange property on Document
-PASS Document interface: attribute onemptied
-PASS Unscopable handled correctly for onemptied property on Document
-PASS Document interface: attribute onended
-PASS Unscopable handled correctly for onended property on Document
-PASS Document interface: attribute onerror
-PASS Unscopable handled correctly for onerror property on Document
-PASS Document interface: attribute onfocus
-PASS Unscopable handled correctly for onfocus property on Document
-PASS Document interface: attribute oninput
-PASS Unscopable handled correctly for oninput property on Document
-PASS Document interface: attribute oninvalid
-PASS Unscopable handled correctly for oninvalid property on Document
-PASS Document interface: attribute onkeydown
-PASS Unscopable handled correctly for onkeydown property on Document
-PASS Document interface: attribute onkeypress
-PASS Unscopable handled correctly for onkeypress property on Document
-PASS Document interface: attribute onkeyup
-PASS Unscopable handled correctly for onkeyup property on Document
-PASS Document interface: attribute onload
-PASS Unscopable handled correctly for onload property on Document
-PASS Document interface: attribute onloadeddata
-PASS Unscopable handled correctly for onloadeddata property on Document
-PASS Document interface: attribute onloadedmetadata
-PASS Unscopable handled correctly for onloadedmetadata property on Document
-FAIL Document interface: attribute onloadend assert_true: The prototype object must have a property "onloadend" expected true got false
-PASS Unscopable handled correctly for onloadend property on Document
-PASS Document interface: attribute onloadstart
-PASS Unscopable handled correctly for onloadstart property on Document
-PASS Document interface: attribute onmousedown
-PASS Unscopable handled correctly for onmousedown property on Document
-PASS Document interface: attribute onmouseenter
-PASS Unscopable handled correctly for onmouseenter property on Document
-PASS Document interface: attribute onmouseleave
-PASS Unscopable handled correctly for onmouseleave property on Document
-PASS Document interface: attribute onmousemove
-PASS Unscopable handled correctly for onmousemove property on Document
-PASS Document interface: attribute onmouseout
-PASS Unscopable handled correctly for onmouseout property on Document
-PASS Document interface: attribute onmouseover
-PASS Unscopable handled correctly for onmouseover property on Document
-PASS Document interface: attribute onmouseup
-PASS Unscopable handled correctly for onmouseup property on Document
-PASS Document interface: attribute onwheel
-PASS Unscopable handled correctly for onwheel property on Document
-PASS Document interface: attribute onpause
-PASS Unscopable handled correctly for onpause property on Document
-PASS Document interface: attribute onplay
-PASS Unscopable handled correctly for onplay property on Document
-PASS Document interface: attribute onplaying
-PASS Unscopable handled correctly for onplaying property on Document
-PASS Document interface: attribute onprogress
-PASS Unscopable handled correctly for onprogress property on Document
-PASS Document interface: attribute onratechange
-PASS Unscopable handled correctly for onratechange property on Document
-PASS Document interface: attribute onreset
-PASS Unscopable handled correctly for onreset property on Document
-PASS Document interface: attribute onresize
-PASS Unscopable handled correctly for onresize property on Document
-PASS Document interface: attribute onscroll
-PASS Unscopable handled correctly for onscroll property on Document
-PASS Document interface: attribute onsecuritypolicyviolation
-PASS Unscopable handled correctly for onsecuritypolicyviolation property on Document
-PASS Document interface: attribute onseeked
-PASS Unscopable handled correctly for onseeked property on Document
-PASS Document interface: attribute onseeking
-PASS Unscopable handled correctly for onseeking property on Document
-PASS Document interface: attribute onselect
-PASS Unscopable handled correctly for onselect property on Document
-PASS Document interface: attribute onstalled
-PASS Unscopable handled correctly for onstalled property on Document
-PASS Document interface: attribute onsubmit
-PASS Unscopable handled correctly for onsubmit property on Document
-PASS Document interface: attribute onsuspend
-PASS Unscopable handled correctly for onsuspend property on Document
-PASS Document interface: attribute ontimeupdate
-PASS Unscopable handled correctly for ontimeupdate property on Document
-PASS Document interface: attribute ontoggle
-PASS Unscopable handled correctly for ontoggle property on Document
-PASS Document interface: attribute onvolumechange
-PASS Unscopable handled correctly for onvolumechange property on Document
-PASS Document interface: attribute onwaiting
-PASS Unscopable handled correctly for onwaiting property on Document
-PASS Document interface: attribute oncopy
-PASS Unscopable handled correctly for oncopy property on Document
-PASS Document interface: attribute oncut
-PASS Unscopable handled correctly for oncut property on Document
-PASS Document interface: attribute onpaste
-PASS Unscopable handled correctly for onpaste property on Document
-PASS Document interface: iframe.contentDocument must have own property "location"
-PASS Document interface: iframe.contentDocument must inherit property "domain" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "referrer" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "cookie" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "lastModified" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "readyState" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "title" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "dir" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "body" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "head" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "images" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "embeds" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "plugins" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "links" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "forms" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "scripts" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "getElementsByName(DOMString)" with the proper type
-PASS Document interface: calling getElementsByName(DOMString) on iframe.contentDocument with too few arguments must throw TypeError
-PASS Document interface: iframe.contentDocument must inherit property "currentScript" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "open(DOMString, DOMString)" with the proper type
-PASS Document interface: calling open(DOMString, DOMString) on iframe.contentDocument with too few arguments must throw TypeError
-PASS Document interface: iframe.contentDocument must inherit property "open(USVString, DOMString, DOMString)" with the proper type
-PASS Document interface: calling open(USVString, DOMString, DOMString) on iframe.contentDocument with too few arguments must throw TypeError
-PASS Document interface: iframe.contentDocument must inherit property "close()" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "write(DOMString)" with the proper type
-PASS Document interface: calling write(DOMString) on iframe.contentDocument with too few arguments must throw TypeError
-PASS Document interface: iframe.contentDocument must inherit property "writeln(DOMString)" with the proper type
-PASS Document interface: calling writeln(DOMString) on iframe.contentDocument with too few arguments must throw TypeError
-FAIL Document interface: iframe.contentDocument must inherit property "defaultView" with the proper type Unrecognized type WindowProxy
-PASS Document interface: iframe.contentDocument must inherit property "activeElement" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "hasFocus()" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "designMode" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "execCommand(DOMString, boolean, DOMString)" with the proper type
-PASS Document interface: calling execCommand(DOMString, boolean, DOMString) on iframe.contentDocument with too few arguments must throw TypeError
-PASS Document interface: iframe.contentDocument must inherit property "queryCommandEnabled(DOMString)" with the proper type
-PASS Document interface: calling queryCommandEnabled(DOMString) on iframe.contentDocument with too few arguments must throw TypeError
-PASS Document interface: iframe.contentDocument must inherit property "queryCommandIndeterm(DOMString)" with the proper type
-PASS Document interface: calling queryCommandIndeterm(DOMString) on iframe.contentDocument with too few arguments must throw TypeError
-PASS Document interface: iframe.contentDocument must inherit property "queryCommandState(DOMString)" with the proper type
-PASS Document interface: calling queryCommandState(DOMString) on iframe.contentDocument with too few arguments must throw TypeError
-PASS Document interface: iframe.contentDocument must inherit property "queryCommandSupported(DOMString)" with the proper type
-PASS Document interface: calling queryCommandSupported(DOMString) on iframe.contentDocument with too few arguments must throw TypeError
-PASS Document interface: iframe.contentDocument must inherit property "queryCommandValue(DOMString)" with the proper type
-PASS Document interface: calling queryCommandValue(DOMString) on iframe.contentDocument with too few arguments must throw TypeError
-PASS Document interface: iframe.contentDocument must inherit property "onreadystatechange" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "fgColor" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "linkColor" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "vlinkColor" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "alinkColor" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "bgColor" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "anchors" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "applets" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "clear()" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "captureEvents()" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "releaseEvents()" with the proper type
-FAIL Document interface: iframe.contentDocument must inherit property "all" with the proper type assert_in_array: wrong type: not object or function value "undefined" not in array ["object", "function"]
-PASS Document interface: iframe.contentDocument must inherit property "onabort" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onauxclick" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onblur" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "oncancel" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "oncanplay" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "oncanplaythrough" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onchange" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onclick" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onclose" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "oncontextmenu" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "oncuechange" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "ondblclick" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "ondrag" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "ondragend" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "ondragenter" with the proper type
-FAIL Document interface: iframe.contentDocument must inherit property "ondragexit" with the proper type assert_inherits: property "ondragexit" not found in prototype chain
-PASS Document interface: iframe.contentDocument must inherit property "ondragleave" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "ondragover" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "ondragstart" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "ondrop" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "ondurationchange" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onemptied" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onended" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onerror" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onfocus" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "oninput" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "oninvalid" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onkeydown" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onkeypress" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onkeyup" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onload" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onloadeddata" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onloadedmetadata" with the proper type
-FAIL Document interface: iframe.contentDocument must inherit property "onloadend" with the proper type assert_inherits: property "onloadend" not found in prototype chain
-PASS Document interface: iframe.contentDocument must inherit property "onloadstart" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onmousedown" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onmouseenter" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onmouseleave" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onmousemove" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onmouseout" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onmouseover" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onmouseup" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onwheel" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onpause" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onplay" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onplaying" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onprogress" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onratechange" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onreset" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onresize" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onscroll" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onsecuritypolicyviolation" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onseeked" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onseeking" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onselect" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onstalled" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onsubmit" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onsuspend" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "ontimeupdate" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "ontoggle" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onvolumechange" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onwaiting" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "oncopy" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "oncut" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onpaste" with the proper type
-PASS Document interface: new Document() must have own property "location"
-PASS Document interface: new Document() must inherit property "domain" with the proper type
-PASS Document interface: new Document() must inherit property "referrer" with the proper type
-PASS Document interface: new Document() must inherit property "cookie" with the proper type
-PASS Document interface: new Document() must inherit property "lastModified" with the proper type
-PASS Document interface: new Document() must inherit property "readyState" with the proper type
-PASS Document interface: new Document() must inherit property "title" with the proper type
-PASS Document interface: new Document() must inherit property "dir" with the proper type
-PASS Document interface: new Document() must inherit property "body" with the proper type
-PASS Document interface: new Document() must inherit property "head" with the proper type
-PASS Document interface: new Document() must inherit property "images" with the proper type
-PASS Document interface: new Document() must inherit property "embeds" with the proper type
-PASS Document interface: new Document() must inherit property "plugins" with the proper type
-PASS Document interface: new Document() must inherit property "links" with the proper type
-PASS Document interface: new Document() must inherit property "forms" with the proper type
-PASS Document interface: new Document() must inherit property "scripts" with the proper type
-PASS Document interface: new Document() must inherit property "getElementsByName(DOMString)" with the proper type
-PASS Document interface: calling getElementsByName(DOMString) on new Document() with too few arguments must throw TypeError
-PASS Document interface: new Document() must inherit property "currentScript" with the proper type
-PASS Document interface: new Document() must inherit property "open(DOMString, DOMString)" with the proper type
-PASS Document interface: calling open(DOMString, DOMString) on new Document() with too few arguments must throw TypeError
-PASS Document interface: new Document() must inherit property "open(USVString, DOMString, DOMString)" with the proper type
-PASS Document interface: calling open(USVString, DOMString, DOMString) on new Document() with too few arguments must throw TypeError
-PASS Document interface: new Document() must inherit property "close()" with the proper type
-PASS Document interface: new Document() must inherit property "write(DOMString)" with the proper type
-PASS Document interface: calling write(DOMString) on new Document() with too few arguments must throw TypeError
-PASS Document interface: new Document() must inherit property "writeln(DOMString)" with the proper type
-PASS Document interface: calling writeln(DOMString) on new Document() with too few arguments must throw TypeError
-PASS Document interface: new Document() must inherit property "defaultView" with the proper type
-PASS Document interface: new Document() must inherit property "activeElement" with the proper type
-PASS Document interface: new Document() must inherit property "hasFocus()" with the proper type
-PASS Document interface: new Document() must inherit property "designMode" with the proper type
-PASS Document interface: new Document() must inherit property "execCommand(DOMString, boolean, DOMString)" with the proper type
-PASS Document interface: calling execCommand(DOMString, boolean, DOMString) on new Document() with too few arguments must throw TypeError
-PASS Document interface: new Document() must inherit property "queryCommandEnabled(DOMString)" with the proper type
-PASS Document interface: calling queryCommandEnabled(DOMString) on new Document() with too few arguments must throw TypeError
-PASS Document interface: new Document() must inherit property "queryCommandIndeterm(DOMString)" with the proper type
-PASS Document interface: calling queryCommandIndeterm(DOMString) on new Document() with too few arguments must throw TypeError
-PASS Document interface: new Document() must inherit property "queryCommandState(DOMString)" with the proper type
-PASS Document interface: calling queryCommandState(DOMString) on new Document() with too few arguments must throw TypeError
-PASS Document interface: new Document() must inherit property "queryCommandSupported(DOMString)" with the proper type
-PASS Document interface: calling queryCommandSupported(DOMString) on new Document() with too few arguments must throw TypeError
-PASS Document interface: new Document() must inherit property "queryCommandValue(DOMString)" with the proper type
-PASS Document interface: calling queryCommandValue(DOMString) on new Document() with too few arguments must throw TypeError
-PASS Document interface: new Document() must inherit property "onreadystatechange" with the proper type
-PASS Document interface: new Document() must inherit property "fgColor" with the proper type
-PASS Document interface: new Document() must inherit property "linkColor" with the proper type
-PASS Document interface: new Document() must inherit property "vlinkColor" with the proper type
-PASS Document interface: new Document() must inherit property "alinkColor" with the proper type
-PASS Document interface: new Document() must inherit property "bgColor" with the proper type
-PASS Document interface: new Document() must inherit property "anchors" with the proper type
-PASS Document interface: new Document() must inherit property "applets" with the proper type
-PASS Document interface: new Document() must inherit property "clear()" with the proper type
-PASS Document interface: new Document() must inherit property "captureEvents()" with the proper type
-PASS Document interface: new Document() must inherit property "releaseEvents()" with the proper type
-FAIL Document interface: new Document() must inherit property "all" with the proper type assert_in_array: wrong type: not object or function value "undefined" not in array ["object", "function"]
-PASS Document interface: new Document() must inherit property "onabort" with the proper type
-PASS Document interface: new Document() must inherit property "onauxclick" with the proper type
-PASS Document interface: new Document() must inherit property "onblur" with the proper type
-PASS Document interface: new Document() must inherit property "oncancel" with the proper type
-PASS Document interface: new Document() must inherit property "oncanplay" with the proper type
-PASS Document interface: new Document() must inherit property "oncanplaythrough" with the proper type
-PASS Document interface: new Document() must inherit property "onchange" with the proper type
-PASS Document interface: new Document() must inherit property "onclick" with the proper type
-PASS Document interface: new Document() must inherit property "onclose" with the proper type
-PASS Document interface: new Document() must inherit property "oncontextmenu" with the proper type
-PASS Document interface: new Document() must inherit property "oncuechange" with the proper type
-PASS Document interface: new Document() must inherit property "ondblclick" with the proper type
-PASS Document interface: new Document() must inherit property "ondrag" with the proper type
-PASS Document interface: new Document() must inherit property "ondragend" with the proper type
-PASS Document interface: new Document() must inherit property "ondragenter" with the proper type
-FAIL Document interface: new Document() must inherit property "ondragexit" with the proper type assert_inherits: property "ondragexit" not found in prototype chain
-PASS Document interface: new Document() must inherit property "ondragleave" with the proper type
-PASS Document interface: new Document() must inherit property "ondragover" with the proper type
-PASS Document interface: new Document() must inherit property "ondragstart" with the proper type
-PASS Document interface: new Document() must inherit property "ondrop" with the proper type
-PASS Document interface: new Document() must inherit property "ondurationchange" with the proper type
-PASS Document interface: new Document() must inherit property "onemptied" with the proper type
-PASS Document interface: new Document() must inherit property "onended" with the proper type
-PASS Document interface: new Document() must inherit property "onerror" with the proper type
-PASS Document interface: new Document() must inherit property "onfocus" with the proper type
-PASS Document interface: new Document() must inherit property "oninput" with the proper type
-PASS Document interface: new Document() must inherit property "oninvalid" with the proper type
-PASS Document interface: new Document() must inherit property "onkeydown" with the proper type
-PASS Document interface: new Document() must inherit property "onkeypress" with the proper type
-PASS Document interface: new Document() must inherit property "onkeyup" with the proper type
-PASS Document interface: new Document() must inherit property "onload" with the proper type
-PASS Document interface: new Document() must inherit property "onloadeddata" with the proper type
-PASS Document interface: new Document() must inherit property "onloadedmetadata" with the proper type
-FAIL Document interface: new Document() must inherit property "onloadend" with the proper type assert_inherits: property "onloadend" not found in prototype chain
-PASS Document interface: new Document() must inherit property "onloadstart" with the proper type
-PASS Document interface: new Document() must inherit property "onmousedown" with the proper type
-PASS Document interface: new Document() must inherit property "onmouseenter" with the proper type
-PASS Document interface: new Document() must inherit property "onmouseleave" with the proper type
-PASS Document interface: new Document() must inherit property "onmousemove" with the proper type
-PASS Document interface: new Document() must inherit property "onmouseout" with the proper type
-PASS Document interface: new Document() must inherit property "onmouseover" with the proper type
-PASS Document interface: new Document() must inherit property "onmouseup" with the proper type
-PASS Document interface: new Document() must inherit property "onwheel" with the proper type
-PASS Document interface: new Document() must inherit property "onpause" with the proper type
-PASS Document interface: new Document() must inherit property "onplay" with the proper type
-PASS Document interface: new Document() must inherit property "onplaying" with the proper type
-PASS Document interface: new Document() must inherit property "onprogress" with the proper type
-PASS Document interface: new Document() must inherit property "onratechange" with the proper type
-PASS Document interface: new Document() must inherit property "onreset" with the proper type
-PASS Document interface: new Document() must inherit property "onresize" with the proper type
-PASS Document interface: new Document() must inherit property "onscroll" with the proper type
-PASS Document interface: new Document() must inherit property "onsecuritypolicyviolation" with the proper type
-PASS Document interface: new Document() must inherit property "onseeked" with the proper type
-PASS Document interface: new Document() must inherit property "onseeking" with the proper type
-PASS Document interface: new Document() must inherit property "onselect" with the proper type
-PASS Document interface: new Document() must inherit property "onstalled" with the proper type
-PASS Document interface: new Document() must inherit property "onsubmit" with the proper type
-PASS Document interface: new Document() must inherit property "onsuspend" with the proper type
-PASS Document interface: new Document() must inherit property "ontimeupdate" with the proper type
-PASS Document interface: new Document() must inherit property "ontoggle" with the proper type
-PASS Document interface: new Document() must inherit property "onvolumechange" with the proper type
-PASS Document interface: new Document() must inherit property "onwaiting" with the proper type
-PASS Document interface: new Document() must inherit property "oncopy" with the proper type
-PASS Document interface: new Document() must inherit property "oncut" with the proper type
-PASS Document interface: new Document() must inherit property "onpaste" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must have own property "location"
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "domain" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "referrer" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "cookie" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "lastModified" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "readyState" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "title" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "dir" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "body" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "head" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "images" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "embeds" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "plugins" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "links" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "forms" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "scripts" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "getElementsByName(DOMString)" with the proper type
-PASS Document interface: calling getElementsByName(DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "currentScript" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "open(DOMString, DOMString)" with the proper type
-PASS Document interface: calling open(DOMString, DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "open(USVString, DOMString, DOMString)" with the proper type
-PASS Document interface: calling open(USVString, DOMString, DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "close()" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "write(DOMString)" with the proper type
-PASS Document interface: calling write(DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "writeln(DOMString)" with the proper type
-PASS Document interface: calling writeln(DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "defaultView" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "activeElement" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "hasFocus()" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "designMode" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "execCommand(DOMString, boolean, DOMString)" with the proper type
-PASS Document interface: calling execCommand(DOMString, boolean, DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandEnabled(DOMString)" with the proper type
-PASS Document interface: calling queryCommandEnabled(DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandIndeterm(DOMString)" with the proper type
-PASS Document interface: calling queryCommandIndeterm(DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandState(DOMString)" with the proper type
-PASS Document interface: calling queryCommandState(DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandSupported(DOMString)" with the proper type
-PASS Document interface: calling queryCommandSupported(DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandValue(DOMString)" with the proper type
-PASS Document interface: calling queryCommandValue(DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onreadystatechange" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "fgColor" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "linkColor" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "vlinkColor" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "alinkColor" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "bgColor" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "anchors" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "applets" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "clear()" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "captureEvents()" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "releaseEvents()" with the proper type
-FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "all" with the proper type assert_in_array: wrong type: not object or function value "undefined" not in array ["object", "function"]
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onabort" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onauxclick" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onblur" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncancel" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncanplay" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncanplaythrough" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onchange" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onclick" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onclose" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncontextmenu" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncuechange" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondblclick" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondrag" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragend" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragenter" with the proper type
-FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragexit" with the proper type assert_inherits: property "ondragexit" not found in prototype chain
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragleave" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragover" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragstart" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondrop" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondurationchange" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onemptied" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onended" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onerror" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onfocus" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oninput" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oninvalid" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onkeydown" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onkeypress" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onkeyup" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onload" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onloadeddata" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onloadedmetadata" with the proper type
-FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "onloadend" with the proper type assert_inherits: property "onloadend" not found in prototype chain
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onloadstart" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmousedown" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmouseenter" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmouseleave" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmousemove" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmouseout" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmouseover" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmouseup" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onwheel" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onpause" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onplay" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onplaying" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onprogress" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onratechange" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onreset" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onresize" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onscroll" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onsecuritypolicyviolation" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onseeked" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onseeking" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onselect" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onstalled" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onsubmit" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onsuspend" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ontimeupdate" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ontoggle" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onvolumechange" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onwaiting" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncopy" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncut" with the proper type
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onpaste" with the proper type
-PASS SVGElement interface: attribute dataset
-PASS Unscopable handled correctly for dataset property on SVGElement
-PASS SVGElement interface: attribute nonce
-PASS Unscopable handled correctly for nonce property on SVGElement
-PASS SVGElement interface: attribute tabIndex
-PASS Unscopable handled correctly for tabIndex property on SVGElement
-PASS SVGElement interface: operation focus(FocusOptions)
-PASS Unscopable handled correctly for focus(FocusOptions) on SVGElement
-PASS SVGElement interface: operation blur()
-PASS Unscopable handled correctly for blur() on SVGElement
-PASS HTMLAllCollection interface: existence and properties of interface object
-PASS HTMLAllCollection interface object length
-PASS HTMLAllCollection interface object name
-PASS HTMLAllCollection interface: existence and properties of interface prototype object
-PASS HTMLAllCollection interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLAllCollection interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLAllCollection interface: attribute length
-PASS Unscopable handled correctly for length property on HTMLAllCollection
-PASS HTMLAllCollection interface: operation namedItem(DOMString)
-PASS Unscopable handled correctly for namedItem(DOMString) on HTMLAllCollection
-PASS HTMLAllCollection interface: operation item(DOMString)
-PASS Unscopable handled correctly for item(DOMString) on HTMLAllCollection
-FAIL HTMLAllCollection must be primary interface of document.all assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL Stringification of document.all assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL HTMLAllCollection interface: document.all must inherit property "length" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL HTMLAllCollection interface: document.all must inherit property "namedItem(DOMString)" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL HTMLAllCollection interface: calling namedItem(DOMString) on document.all with too few arguments must throw TypeError assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL HTMLAllCollection interface: document.all must inherit property "item(DOMString)" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL HTMLAllCollection interface: calling item(DOMString) on document.all with too few arguments must throw TypeError assert_equals: wrong typeof object expected "object" but got "undefined"
-PASS HTMLFormControlsCollection interface: existence and properties of interface object
-PASS HTMLFormControlsCollection interface object length
-PASS HTMLFormControlsCollection interface object name
-PASS HTMLFormControlsCollection interface: existence and properties of interface prototype object
-PASS HTMLFormControlsCollection interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLFormControlsCollection interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLFormControlsCollection interface: operation namedItem(DOMString)
-PASS Unscopable handled correctly for namedItem(DOMString) on HTMLFormControlsCollection
-PASS HTMLFormControlsCollection must be primary interface of document.createElement("form").elements
-PASS Stringification of document.createElement("form").elements
-PASS HTMLFormControlsCollection interface: document.createElement("form").elements must inherit property "namedItem(DOMString)" with the proper type
-PASS HTMLFormControlsCollection interface: calling namedItem(DOMString) on document.createElement("form").elements with too few arguments must throw TypeError
-PASS RadioNodeList interface: existence and properties of interface object
-PASS RadioNodeList interface object length
-PASS RadioNodeList interface object name
-PASS RadioNodeList interface: existence and properties of interface prototype object
-PASS RadioNodeList interface: existence and properties of interface prototype object's "constructor" property
-PASS RadioNodeList interface: existence and properties of interface prototype object's @@unscopables property
-PASS RadioNodeList interface: attribute value
-PASS Unscopable handled correctly for value property on RadioNodeList
-PASS HTMLOptionsCollection interface: existence and properties of interface object
-PASS HTMLOptionsCollection interface object length
-PASS HTMLOptionsCollection interface object name
-PASS HTMLOptionsCollection interface: existence and properties of interface prototype object
-PASS HTMLOptionsCollection interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLOptionsCollection interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLOptionsCollection interface: attribute length
-PASS Unscopable handled correctly for length property on HTMLOptionsCollection
-PASS HTMLOptionsCollection interface: operation add([object Object],[object Object], [object Object],[object Object])
-PASS Unscopable handled correctly for add([object Object],[object Object], [object Object],[object Object]) on HTMLOptionsCollection
-PASS HTMLOptionsCollection interface: operation remove(long)
-PASS Unscopable handled correctly for remove(long) on HTMLOptionsCollection
-PASS HTMLOptionsCollection interface: attribute selectedIndex
-PASS Unscopable handled correctly for selectedIndex property on HTMLOptionsCollection
-PASS HTMLOptionsCollection must be primary interface of document.createElement("select").options
-PASS Stringification of document.createElement("select").options
-PASS HTMLOptionsCollection interface: document.createElement("select").options must inherit property "length" with the proper type
-PASS HTMLOptionsCollection interface: document.createElement("select").options must inherit property "add([object Object],[object Object], [object Object],[object Object])" with the proper type
-PASS HTMLOptionsCollection interface: calling add([object Object],[object Object], [object Object],[object Object]) on document.createElement("select").options with too few arguments must throw TypeError
-PASS HTMLOptionsCollection interface: document.createElement("select").options must inherit property "remove(long)" with the proper type
-PASS HTMLOptionsCollection interface: calling remove(long) on document.createElement("select").options with too few arguments must throw TypeError
-PASS HTMLOptionsCollection interface: document.createElement("select").options must inherit property "selectedIndex" with the proper type
-PASS DOMStringList interface: existence and properties of interface object
-PASS DOMStringList interface object length
-PASS DOMStringList interface object name
-PASS DOMStringList interface: existence and properties of interface prototype object
-PASS DOMStringList interface: existence and properties of interface prototype object's "constructor" property
-PASS DOMStringList interface: existence and properties of interface prototype object's @@unscopables property
-PASS DOMStringList interface: attribute length
-PASS Unscopable handled correctly for length property on DOMStringList
-PASS DOMStringList interface: operation item(unsigned long)
-PASS Unscopable handled correctly for item(unsigned long) on DOMStringList
-PASS DOMStringList interface: operation contains(DOMString)
-PASS Unscopable handled correctly for contains(DOMString) on DOMStringList
-PASS HTMLElement interface: existence and properties of interface object
-PASS HTMLElement interface object length
-PASS HTMLElement interface object name
-PASS HTMLElement interface: existence and properties of interface prototype object
-PASS HTMLElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLElement interface: attribute title
-PASS Unscopable handled correctly for title property on HTMLElement
-PASS HTMLElement interface: attribute lang
-PASS Unscopable handled correctly for lang property on HTMLElement
-PASS HTMLElement interface: attribute translate
-PASS Unscopable handled correctly for translate property on HTMLElement
-PASS HTMLElement interface: attribute dir
-PASS Unscopable handled correctly for dir property on HTMLElement
-PASS HTMLElement interface: attribute hidden
-PASS Unscopable handled correctly for hidden property on HTMLElement
-PASS HTMLElement interface: operation click()
-PASS Unscopable handled correctly for click() on HTMLElement
-PASS HTMLElement interface: attribute accessKey
-PASS Unscopable handled correctly for accessKey property on HTMLElement
-FAIL HTMLElement interface: attribute accessKeyLabel assert_true: The prototype object must have a property "accessKeyLabel" expected true got false
-PASS Unscopable handled correctly for accessKeyLabel property on HTMLElement
-PASS HTMLElement interface: attribute draggable
-PASS Unscopable handled correctly for draggable property on HTMLElement
-PASS HTMLElement interface: attribute spellcheck
-PASS Unscopable handled correctly for spellcheck property on HTMLElement
-PASS HTMLElement interface: attribute innerText
-PASS Unscopable handled correctly for innerText property on HTMLElement
-PASS HTMLElement interface: attribute onabort
-PASS Unscopable handled correctly for onabort property on HTMLElement
-PASS HTMLElement interface: attribute onauxclick
-PASS Unscopable handled correctly for onauxclick property on HTMLElement
-PASS HTMLElement interface: attribute onblur
-PASS Unscopable handled correctly for onblur property on HTMLElement
-PASS HTMLElement interface: attribute oncancel
-PASS Unscopable handled correctly for oncancel property on HTMLElement
-PASS HTMLElement interface: attribute oncanplay
-PASS Unscopable handled correctly for oncanplay property on HTMLElement
-PASS HTMLElement interface: attribute oncanplaythrough
-PASS Unscopable handled correctly for oncanplaythrough property on HTMLElement
-PASS HTMLElement interface: attribute onchange
-PASS Unscopable handled correctly for onchange property on HTMLElement
-PASS HTMLElement interface: attribute onclick
-PASS Unscopable handled correctly for onclick property on HTMLElement
-PASS HTMLElement interface: attribute onclose
-PASS Unscopable handled correctly for onclose property on HTMLElement
-PASS HTMLElement interface: attribute oncontextmenu
-PASS Unscopable handled correctly for oncontextmenu property on HTMLElement
-PASS HTMLElement interface: attribute oncuechange
-PASS Unscopable handled correctly for oncuechange property on HTMLElement
-PASS HTMLElement interface: attribute ondblclick
-PASS Unscopable handled correctly for ondblclick property on HTMLElement
-PASS HTMLElement interface: attribute ondrag
-PASS Unscopable handled correctly for ondrag property on HTMLElement
-PASS HTMLElement interface: attribute ondragend
-PASS Unscopable handled correctly for ondragend property on HTMLElement
-PASS HTMLElement interface: attribute ondragenter
-PASS Unscopable handled correctly for ondragenter property on HTMLElement
-FAIL HTMLElement interface: attribute ondragexit assert_true: The prototype object must have a property "ondragexit" expected true got false
-PASS Unscopable handled correctly for ondragexit property on HTMLElement
-PASS HTMLElement interface: attribute ondragleave
-PASS Unscopable handled correctly for ondragleave property on HTMLElement
-PASS HTMLElement interface: attribute ondragover
-PASS Unscopable handled correctly for ondragover property on HTMLElement
-PASS HTMLElement interface: attribute ondragstart
-PASS Unscopable handled correctly for ondragstart property on HTMLElement
-PASS HTMLElement interface: attribute ondrop
-PASS Unscopable handled correctly for ondrop property on HTMLElement
-PASS HTMLElement interface: attribute ondurationchange
-PASS Unscopable handled correctly for ondurationchange property on HTMLElement
-PASS HTMLElement interface: attribute onemptied
-PASS Unscopable handled correctly for onemptied property on HTMLElement
-PASS HTMLElement interface: attribute onended
-PASS Unscopable handled correctly for onended property on HTMLElement
-PASS HTMLElement interface: attribute onerror
-PASS Unscopable handled correctly for onerror property on HTMLElement
-PASS HTMLElement interface: attribute onfocus
-PASS Unscopable handled correctly for onfocus property on HTMLElement
-PASS HTMLElement interface: attribute oninput
-PASS Unscopable handled correctly for oninput property on HTMLElement
-PASS HTMLElement interface: attribute oninvalid
-PASS Unscopable handled correctly for oninvalid property on HTMLElement
-PASS HTMLElement interface: attribute onkeydown
-PASS Unscopable handled correctly for onkeydown property on HTMLElement
-PASS HTMLElement interface: attribute onkeypress
-PASS Unscopable handled correctly for onkeypress property on HTMLElement
-PASS HTMLElement interface: attribute onkeyup
-PASS Unscopable handled correctly for onkeyup property on HTMLElement
-PASS HTMLElement interface: attribute onload
-PASS Unscopable handled correctly for onload property on HTMLElement
-PASS HTMLElement interface: attribute onloadeddata
-PASS Unscopable handled correctly for onloadeddata property on HTMLElement
-PASS HTMLElement interface: attribute onloadedmetadata
-PASS Unscopable handled correctly for onloadedmetadata property on HTMLElement
-FAIL HTMLElement interface: attribute onloadend assert_true: The prototype object must have a property "onloadend" expected true got false
-PASS Unscopable handled correctly for onloadend property on HTMLElement
-PASS HTMLElement interface: attribute onloadstart
-PASS Unscopable handled correctly for onloadstart property on HTMLElement
-PASS HTMLElement interface: attribute onmousedown
-PASS Unscopable handled correctly for onmousedown property on HTMLElement
-PASS HTMLElement interface: attribute onmouseenter
-PASS Unscopable handled correctly for onmouseenter property on HTMLElement
-PASS HTMLElement interface: attribute onmouseleave
-PASS Unscopable handled correctly for onmouseleave property on HTMLElement
-PASS HTMLElement interface: attribute onmousemove
-PASS Unscopable handled correctly for onmousemove property on HTMLElement
-PASS HTMLElement interface: attribute onmouseout
-PASS Unscopable handled correctly for onmouseout property on HTMLElement
-PASS HTMLElement interface: attribute onmouseover
-PASS Unscopable handled correctly for onmouseover property on HTMLElement
-PASS HTMLElement interface: attribute onmouseup
-PASS Unscopable handled correctly for onmouseup property on HTMLElement
-PASS HTMLElement interface: attribute onwheel
-PASS Unscopable handled correctly for onwheel property on HTMLElement
-PASS HTMLElement interface: attribute onpause
-PASS Unscopable handled correctly for onpause property on HTMLElement
-PASS HTMLElement interface: attribute onplay
-PASS Unscopable handled correctly for onplay property on HTMLElement
-PASS HTMLElement interface: attribute onplaying
-PASS Unscopable handled correctly for onplaying property on HTMLElement
-PASS HTMLElement interface: attribute onprogress
-PASS Unscopable handled correctly for onprogress property on HTMLElement
-PASS HTMLElement interface: attribute onratechange
-PASS Unscopable handled correctly for onratechange property on HTMLElement
-PASS HTMLElement interface: attribute onreset
-PASS Unscopable handled correctly for onreset property on HTMLElement
-PASS HTMLElement interface: attribute onresize
-PASS Unscopable handled correctly for onresize property on HTMLElement
-PASS HTMLElement interface: attribute onscroll
-PASS Unscopable handled correctly for onscroll property on HTMLElement
-FAIL HTMLElement interface: attribute onsecuritypolicyviolation assert_true: The prototype object must have a property "onsecuritypolicyviolation" expected true got false
-PASS Unscopable handled correctly for onsecuritypolicyviolation property on HTMLElement
-PASS HTMLElement interface: attribute onseeked
-PASS Unscopable handled correctly for onseeked property on HTMLElement
-PASS HTMLElement interface: attribute onseeking
-PASS Unscopable handled correctly for onseeking property on HTMLElement
-PASS HTMLElement interface: attribute onselect
-PASS Unscopable handled correctly for onselect property on HTMLElement
-PASS HTMLElement interface: attribute onstalled
-PASS Unscopable handled correctly for onstalled property on HTMLElement
-PASS HTMLElement interface: attribute onsubmit
-PASS Unscopable handled correctly for onsubmit property on HTMLElement
-PASS HTMLElement interface: attribute onsuspend
-PASS Unscopable handled correctly for onsuspend property on HTMLElement
-PASS HTMLElement interface: attribute ontimeupdate
-PASS Unscopable handled correctly for ontimeupdate property on HTMLElement
-PASS HTMLElement interface: attribute ontoggle
-PASS Unscopable handled correctly for ontoggle property on HTMLElement
-PASS HTMLElement interface: attribute onvolumechange
-PASS Unscopable handled correctly for onvolumechange property on HTMLElement
-PASS HTMLElement interface: attribute onwaiting
-PASS Unscopable handled correctly for onwaiting property on HTMLElement
-FAIL HTMLElement interface: attribute oncopy assert_own_property: expected property "oncopy" missing
-PASS Unscopable handled correctly for oncopy property on HTMLElement
-FAIL HTMLElement interface: attribute oncut assert_own_property: expected property "oncut" missing
-PASS Unscopable handled correctly for oncut property on HTMLElement
-FAIL HTMLElement interface: attribute onpaste assert_own_property: expected property "onpaste" missing
-PASS Unscopable handled correctly for onpaste property on HTMLElement
-PASS HTMLElement interface: attribute contentEditable
-PASS Unscopable handled correctly for contentEditable property on HTMLElement
-PASS HTMLElement interface: attribute isContentEditable
-PASS Unscopable handled correctly for isContentEditable property on HTMLElement
-PASS HTMLElement interface: attribute inputMode
-PASS Unscopable handled correctly for inputMode property on HTMLElement
-PASS HTMLElement interface: attribute dataset
-PASS Unscopable handled correctly for dataset property on HTMLElement
-PASS HTMLElement interface: attribute nonce
-PASS Unscopable handled correctly for nonce property on HTMLElement
-PASS HTMLElement interface: attribute tabIndex
-PASS Unscopable handled correctly for tabIndex property on HTMLElement
-PASS HTMLElement interface: operation focus(FocusOptions)
-PASS Unscopable handled correctly for focus(FocusOptions) on HTMLElement
-PASS HTMLElement interface: operation blur()
-PASS Unscopable handled correctly for blur() on HTMLElement
-PASS HTMLElement must be primary interface of document.createElement("noscript")
-PASS Stringification of document.createElement("noscript")
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "title" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "lang" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "translate" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "dir" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "hidden" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "click()" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "accessKey" with the proper type
-FAIL HTMLElement interface: document.createElement("noscript") must inherit property "accessKeyLabel" with the proper type assert_inherits: property "accessKeyLabel" not found in prototype chain
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "draggable" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "spellcheck" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "innerText" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onabort" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onauxclick" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onblur" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncancel" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncanplay" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncanplaythrough" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onchange" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onclick" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onclose" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncontextmenu" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncuechange" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondblclick" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondrag" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragend" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragenter" with the proper type
-FAIL HTMLElement interface: document.createElement("noscript") must inherit property "ondragexit" with the proper type assert_inherits: property "ondragexit" not found in prototype chain
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragleave" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragover" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragstart" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondrop" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondurationchange" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onemptied" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onended" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onerror" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onfocus" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "oninput" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "oninvalid" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onkeydown" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onkeypress" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onkeyup" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onload" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onloadeddata" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onloadedmetadata" with the proper type
-FAIL HTMLElement interface: document.createElement("noscript") must inherit property "onloadend" with the proper type assert_inherits: property "onloadend" not found in prototype chain
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onloadstart" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmousedown" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseenter" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseleave" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmousemove" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseout" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseover" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseup" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onwheel" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onpause" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onplay" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onplaying" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onprogress" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onratechange" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onreset" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onresize" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onscroll" with the proper type
-FAIL HTMLElement interface: document.createElement("noscript") must inherit property "onsecuritypolicyviolation" with the proper type assert_inherits: property "onsecuritypolicyviolation" not found in prototype chain
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onseeked" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onseeking" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onselect" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onstalled" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onsubmit" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onsuspend" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ontimeupdate" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ontoggle" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onvolumechange" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onwaiting" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncopy" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncut" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onpaste" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "contentEditable" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "isContentEditable" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "inputMode" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "dataset" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "nonce" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "tabIndex" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "focus(FocusOptions)" with the proper type
-PASS HTMLElement interface: calling focus(FocusOptions) on document.createElement("noscript") with too few arguments must throw TypeError
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "blur()" with the proper type
-PASS HTMLUnknownElement interface: existence and properties of interface object
-PASS HTMLUnknownElement interface object length
-PASS HTMLUnknownElement interface object name
-PASS HTMLUnknownElement interface: existence and properties of interface prototype object
-PASS HTMLUnknownElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLUnknownElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLUnknownElement must be primary interface of document.createElement("bgsound")
-PASS Stringification of document.createElement("bgsound")
-PASS DOMStringMap interface: existence and properties of interface object
-PASS DOMStringMap interface object length
-PASS DOMStringMap interface object name
-PASS DOMStringMap interface: existence and properties of interface prototype object
-PASS DOMStringMap interface: existence and properties of interface prototype object's "constructor" property
-PASS DOMStringMap interface: existence and properties of interface prototype object's @@unscopables property
-PASS DOMStringMap must be primary interface of document.head.dataset
-PASS Stringification of document.head.dataset
-PASS HTMLHtmlElement interface: existence and properties of interface object
-PASS HTMLHtmlElement interface object length
-PASS HTMLHtmlElement interface object name
-PASS HTMLHtmlElement interface: existence and properties of interface prototype object
-PASS HTMLHtmlElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLHtmlElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLHtmlElement interface: attribute version
-PASS Unscopable handled correctly for version property on HTMLHtmlElement
-PASS HTMLHtmlElement must be primary interface of document.createElement("html")
-PASS Stringification of document.createElement("html")
-PASS HTMLHtmlElement interface: document.createElement("html") must inherit property "version" with the proper type
-PASS HTMLHeadElement interface: existence and properties of interface object
-PASS HTMLHeadElement interface object length
-PASS HTMLHeadElement interface object name
-PASS HTMLHeadElement interface: existence and properties of interface prototype object
-PASS HTMLHeadElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLHeadElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLHeadElement must be primary interface of document.createElement("head")
-PASS Stringification of document.createElement("head")
-PASS HTMLTitleElement interface: existence and properties of interface object
-PASS HTMLTitleElement interface object length
-PASS HTMLTitleElement interface object name
-PASS HTMLTitleElement interface: existence and properties of interface prototype object
-PASS HTMLTitleElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLTitleElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLTitleElement interface: attribute text
-PASS Unscopable handled correctly for text property on HTMLTitleElement
-PASS HTMLTitleElement must be primary interface of document.createElement("title")
-PASS Stringification of document.createElement("title")
-PASS HTMLTitleElement interface: document.createElement("title") must inherit property "text" with the proper type
-PASS HTMLBaseElement interface: existence and properties of interface object
-PASS HTMLBaseElement interface object length
-PASS HTMLBaseElement interface object name
-PASS HTMLBaseElement interface: existence and properties of interface prototype object
-PASS HTMLBaseElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLBaseElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLBaseElement interface: attribute href
-PASS Unscopable handled correctly for href property on HTMLBaseElement
-PASS HTMLBaseElement interface: attribute target
-PASS Unscopable handled correctly for target property on HTMLBaseElement
-PASS HTMLBaseElement must be primary interface of document.createElement("base")
-PASS Stringification of document.createElement("base")
-PASS HTMLBaseElement interface: document.createElement("base") must inherit property "href" with the proper type
-PASS HTMLBaseElement interface: document.createElement("base") must inherit property "target" with the proper type
-PASS HTMLLinkElement interface: existence and properties of interface object
-PASS HTMLLinkElement interface object length
-PASS HTMLLinkElement interface object name
-PASS HTMLLinkElement interface: existence and properties of interface prototype object
-PASS HTMLLinkElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLLinkElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLLinkElement interface: attribute href
-PASS Unscopable handled correctly for href property on HTMLLinkElement
-PASS HTMLLinkElement interface: attribute crossOrigin
-PASS Unscopable handled correctly for crossOrigin property on HTMLLinkElement
-PASS HTMLLinkElement interface: attribute rel
-PASS Unscopable handled correctly for rel property on HTMLLinkElement
-PASS HTMLLinkElement interface: attribute as
-PASS Unscopable handled correctly for as property on HTMLLinkElement
-PASS HTMLLinkElement interface: attribute relList
-PASS Unscopable handled correctly for relList property on HTMLLinkElement
-PASS HTMLLinkElement interface: attribute media
-PASS Unscopable handled correctly for media property on HTMLLinkElement
-PASS HTMLLinkElement interface: attribute integrity
-PASS Unscopable handled correctly for integrity property on HTMLLinkElement
-PASS HTMLLinkElement interface: attribute hreflang
-PASS Unscopable handled correctly for hreflang property on HTMLLinkElement
-PASS HTMLLinkElement interface: attribute type
-PASS Unscopable handled correctly for type property on HTMLLinkElement
-PASS HTMLLinkElement interface: attribute sizes
-PASS Unscopable handled correctly for sizes property on HTMLLinkElement
-PASS HTMLLinkElement interface: attribute referrerPolicy
-PASS Unscopable handled correctly for referrerPolicy property on HTMLLinkElement
-PASS HTMLLinkElement interface: attribute charset
-PASS Unscopable handled correctly for charset property on HTMLLinkElement
-PASS HTMLLinkElement interface: attribute rev
-PASS Unscopable handled correctly for rev property on HTMLLinkElement
-PASS HTMLLinkElement interface: attribute target
-PASS Unscopable handled correctly for target property on HTMLLinkElement
-PASS HTMLLinkElement must be primary interface of document.createElement("link")
-PASS Stringification of document.createElement("link")
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "href" with the proper type
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "crossOrigin" with the proper type
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "rel" with the proper type
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "as" with the proper type
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "relList" with the proper type
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "media" with the proper type
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "integrity" with the proper type
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "hreflang" with the proper type
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "type" with the proper type
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "sizes" with the proper type
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "referrerPolicy" with the proper type
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "charset" with the proper type
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "rev" with the proper type
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "target" with the proper type
-PASS HTMLMetaElement interface: existence and properties of interface object
-PASS HTMLMetaElement interface object length
-PASS HTMLMetaElement interface object name
-PASS HTMLMetaElement interface: existence and properties of interface prototype object
-PASS HTMLMetaElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLMetaElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLMetaElement interface: attribute name
-PASS Unscopable handled correctly for name property on HTMLMetaElement
-PASS HTMLMetaElement interface: attribute httpEquiv
-PASS Unscopable handled correctly for httpEquiv property on HTMLMetaElement
-PASS HTMLMetaElement interface: attribute content
-PASS Unscopable handled correctly for content property on HTMLMetaElement
-PASS HTMLMetaElement interface: attribute scheme
-PASS Unscopable handled correctly for scheme property on HTMLMetaElement
-PASS HTMLMetaElement must be primary interface of document.createElement("meta")
-PASS Stringification of document.createElement("meta")
-PASS HTMLMetaElement interface: document.createElement("meta") must inherit property "name" with the proper type
-PASS HTMLMetaElement interface: document.createElement("meta") must inherit property "httpEquiv" with the proper type
-PASS HTMLMetaElement interface: document.createElement("meta") must inherit property "content" with the proper type
-PASS HTMLMetaElement interface: document.createElement("meta") must inherit property "scheme" with the proper type
-PASS HTMLStyleElement interface: existence and properties of interface object
-PASS HTMLStyleElement interface object length
-PASS HTMLStyleElement interface object name
-PASS HTMLStyleElement interface: existence and properties of interface prototype object
-PASS HTMLStyleElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLStyleElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLStyleElement interface: attribute media
-PASS Unscopable handled correctly for media property on HTMLStyleElement
-PASS HTMLStyleElement interface: attribute type
-PASS Unscopable handled correctly for type property on HTMLStyleElement
-PASS HTMLStyleElement must be primary interface of document.createElement("style")
-PASS Stringification of document.createElement("style")
-PASS HTMLStyleElement interface: document.createElement("style") must inherit property "media" with the proper type
-PASS HTMLStyleElement interface: document.createElement("style") must inherit property "type" with the proper type
-PASS HTMLBodyElement interface: existence and properties of interface object
-PASS HTMLBodyElement interface object length
-PASS HTMLBodyElement interface object name
-PASS HTMLBodyElement interface: existence and properties of interface prototype object
-PASS HTMLBodyElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLBodyElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLBodyElement interface: attribute text
-PASS Unscopable handled correctly for text property on HTMLBodyElement
-PASS HTMLBodyElement interface: attribute link
-PASS Unscopable handled correctly for link property on HTMLBodyElement
-PASS HTMLBodyElement interface: attribute vLink
-PASS Unscopable handled correctly for vLink property on HTMLBodyElement
-PASS HTMLBodyElement interface: attribute aLink
-PASS Unscopable handled correctly for aLink property on HTMLBodyElement
-PASS HTMLBodyElement interface: attribute bgColor
-PASS Unscopable handled correctly for bgColor property on HTMLBodyElement
-PASS HTMLBodyElement interface: attribute background
-PASS Unscopable handled correctly for background property on HTMLBodyElement
-PASS HTMLBodyElement interface: attribute onafterprint
-PASS Unscopable handled correctly for onafterprint property on HTMLBodyElement
-PASS HTMLBodyElement interface: attribute onbeforeprint
-PASS Unscopable handled correctly for onbeforeprint property on HTMLBodyElement
-PASS HTMLBodyElement interface: attribute onbeforeunload
-PASS Unscopable handled correctly for onbeforeunload property on HTMLBodyElement
-PASS HTMLBodyElement interface: attribute onhashchange
-PASS Unscopable handled correctly for onhashchange property on HTMLBodyElement
-PASS HTMLBodyElement interface: attribute onlanguagechange
-PASS Unscopable handled correctly for onlanguagechange property on HTMLBodyElement
-PASS HTMLBodyElement interface: attribute onmessage
-PASS Unscopable handled correctly for onmessage property on HTMLBodyElement
-PASS HTMLBodyElement interface: attribute onmessageerror
-PASS Unscopable handled correctly for onmessageerror property on HTMLBodyElement
-PASS HTMLBodyElement interface: attribute onoffline
-PASS Unscopable handled correctly for onoffline property on HTMLBodyElement
-PASS HTMLBodyElement interface: attribute ononline
-PASS Unscopable handled correctly for ononline property on HTMLBodyElement
-PASS HTMLBodyElement interface: attribute onpagehide
-PASS Unscopable handled correctly for onpagehide property on HTMLBodyElement
-PASS HTMLBodyElement interface: attribute onpageshow
-PASS Unscopable handled correctly for onpageshow property on HTMLBodyElement
-PASS HTMLBodyElement interface: attribute onpopstate
-PASS Unscopable handled correctly for onpopstate property on HTMLBodyElement
-PASS HTMLBodyElement interface: attribute onrejectionhandled
-PASS Unscopable handled correctly for onrejectionhandled property on HTMLBodyElement
-PASS HTMLBodyElement interface: attribute onstorage
-PASS Unscopable handled correctly for onstorage property on HTMLBodyElement
-PASS HTMLBodyElement interface: attribute onunhandledrejection
-PASS Unscopable handled correctly for onunhandledrejection property on HTMLBodyElement
-PASS HTMLBodyElement interface: attribute onunload
-PASS Unscopable handled correctly for onunload property on HTMLBodyElement
-PASS HTMLBodyElement must be primary interface of document.createElement("body")
-PASS Stringification of document.createElement("body")
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "text" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "link" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "vLink" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "aLink" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "bgColor" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "background" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onafterprint" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onbeforeprint" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onbeforeunload" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onhashchange" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onlanguagechange" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onmessage" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onmessageerror" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onoffline" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "ononline" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onpagehide" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onpageshow" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onpopstate" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onrejectionhandled" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onstorage" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onunhandledrejection" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onunload" with the proper type
-PASS HTMLHeadingElement interface: existence and properties of interface object
-PASS HTMLHeadingElement interface object length
-PASS HTMLHeadingElement interface object name
-PASS HTMLHeadingElement interface: existence and properties of interface prototype object
-PASS HTMLHeadingElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLHeadingElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLHeadingElement interface: attribute align
-PASS Unscopable handled correctly for align property on HTMLHeadingElement
-PASS HTMLHeadingElement must be primary interface of document.createElement("h1")
-PASS Stringification of document.createElement("h1")
-PASS HTMLHeadingElement interface: document.createElement("h1") must inherit property "align" with the proper type
-PASS HTMLParagraphElement interface: existence and properties of interface object
-PASS HTMLParagraphElement interface object length
-PASS HTMLParagraphElement interface object name
-PASS HTMLParagraphElement interface: existence and properties of interface prototype object
-PASS HTMLParagraphElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLParagraphElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLParagraphElement interface: attribute align
-PASS Unscopable handled correctly for align property on HTMLParagraphElement
-PASS HTMLParagraphElement must be primary interface of document.createElement("p")
-PASS Stringification of document.createElement("p")
-PASS HTMLParagraphElement interface: document.createElement("p") must inherit property "align" with the proper type
-PASS HTMLHRElement interface: existence and properties of interface object
-PASS HTMLHRElement interface object length
-PASS HTMLHRElement interface object name
-PASS HTMLHRElement interface: existence and properties of interface prototype object
-PASS HTMLHRElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLHRElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLHRElement interface: attribute align
-PASS Unscopable handled correctly for align property on HTMLHRElement
-PASS HTMLHRElement interface: attribute color
-PASS Unscopable handled correctly for color property on HTMLHRElement
-PASS HTMLHRElement interface: attribute noShade
-PASS Unscopable handled correctly for noShade property on HTMLHRElement
-PASS HTMLHRElement interface: attribute size
-PASS Unscopable handled correctly for size property on HTMLHRElement
-PASS HTMLHRElement interface: attribute width
-PASS Unscopable handled correctly for width property on HTMLHRElement
-PASS HTMLHRElement must be primary interface of document.createElement("hr")
-PASS Stringification of document.createElement("hr")
-PASS HTMLHRElement interface: document.createElement("hr") must inherit property "align" with the proper type
-PASS HTMLHRElement interface: document.createElement("hr") must inherit property "color" with the proper type
-PASS HTMLHRElement interface: document.createElement("hr") must inherit property "noShade" with the proper type
-PASS HTMLHRElement interface: document.createElement("hr") must inherit property "size" with the proper type
-PASS HTMLHRElement interface: document.createElement("hr") must inherit property "width" with the proper type
-PASS HTMLPreElement interface: existence and properties of interface object
-PASS HTMLPreElement interface object length
-PASS HTMLPreElement interface object name
-PASS HTMLPreElement interface: existence and properties of interface prototype object
-PASS HTMLPreElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLPreElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLPreElement interface: attribute width
-PASS Unscopable handled correctly for width property on HTMLPreElement
-PASS HTMLPreElement must be primary interface of document.createElement("pre")
-PASS Stringification of document.createElement("pre")
-PASS HTMLPreElement interface: document.createElement("pre") must inherit property "width" with the proper type
-PASS HTMLPreElement must be primary interface of document.createElement("listing")
-PASS Stringification of document.createElement("listing")
-PASS HTMLPreElement interface: document.createElement("listing") must inherit property "width" with the proper type
-PASS HTMLPreElement must be primary interface of document.createElement("xmp")
-PASS Stringification of document.createElement("xmp")
-PASS HTMLPreElement interface: document.createElement("xmp") must inherit property "width" with the proper type
-PASS HTMLQuoteElement interface: existence and properties of interface object
-PASS HTMLQuoteElement interface object length
-PASS HTMLQuoteElement interface object name
-PASS HTMLQuoteElement interface: existence and properties of interface prototype object
-PASS HTMLQuoteElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLQuoteElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLQuoteElement interface: attribute cite
-PASS Unscopable handled correctly for cite property on HTMLQuoteElement
-PASS HTMLQuoteElement must be primary interface of document.createElement("blockquote")
-PASS Stringification of document.createElement("blockquote")
-PASS HTMLQuoteElement interface: document.createElement("blockquote") must inherit property "cite" with the proper type
-PASS HTMLQuoteElement must be primary interface of document.createElement("q")
-PASS Stringification of document.createElement("q")
-PASS HTMLQuoteElement interface: document.createElement("q") must inherit property "cite" with the proper type
-PASS HTMLOListElement interface: existence and properties of interface object
-PASS HTMLOListElement interface object length
-PASS HTMLOListElement interface object name
-PASS HTMLOListElement interface: existence and properties of interface prototype object
-PASS HTMLOListElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLOListElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLOListElement interface: attribute reversed
-PASS Unscopable handled correctly for reversed property on HTMLOListElement
-PASS HTMLOListElement interface: attribute start
-PASS Unscopable handled correctly for start property on HTMLOListElement
-PASS HTMLOListElement interface: attribute type
-PASS Unscopable handled correctly for type property on HTMLOListElement
-PASS HTMLOListElement interface: attribute compact
-PASS Unscopable handled correctly for compact property on HTMLOListElement
-PASS HTMLUListElement interface: existence and properties of interface object
-PASS HTMLUListElement interface object length
-PASS HTMLUListElement interface object name
-PASS HTMLUListElement interface: existence and properties of interface prototype object
-PASS HTMLUListElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLUListElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLUListElement interface: attribute compact
-PASS Unscopable handled correctly for compact property on HTMLUListElement
-PASS HTMLUListElement interface: attribute type
-PASS Unscopable handled correctly for type property on HTMLUListElement
-PASS HTMLMenuElement interface: existence and properties of interface object
-PASS HTMLMenuElement interface object length
-PASS HTMLMenuElement interface object name
-PASS HTMLMenuElement interface: existence and properties of interface prototype object
-PASS HTMLMenuElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLMenuElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLMenuElement interface: attribute compact
-PASS Unscopable handled correctly for compact property on HTMLMenuElement
-PASS HTMLMenuElement must be primary interface of document.createElement("menu")
-PASS Stringification of document.createElement("menu")
-PASS HTMLMenuElement interface: document.createElement("menu") must inherit property "compact" with the proper type
-PASS HTMLLIElement interface: existence and properties of interface object
-PASS HTMLLIElement interface object length
-PASS HTMLLIElement interface object name
-PASS HTMLLIElement interface: existence and properties of interface prototype object
-PASS HTMLLIElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLLIElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLLIElement interface: attribute value
-PASS Unscopable handled correctly for value property on HTMLLIElement
-PASS HTMLLIElement interface: attribute type
-PASS Unscopable handled correctly for type property on HTMLLIElement
-PASS HTMLLIElement must be primary interface of document.createElement("li")
-PASS Stringification of document.createElement("li")
-PASS HTMLLIElement interface: document.createElement("li") must inherit property "value" with the proper type
-PASS HTMLLIElement interface: document.createElement("li") must inherit property "type" with the proper type
-PASS HTMLDListElement interface: existence and properties of interface object
-PASS HTMLDListElement interface object length
-PASS HTMLDListElement interface object name
-PASS HTMLDListElement interface: existence and properties of interface prototype object
-PASS HTMLDListElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLDListElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLDListElement interface: attribute compact
-PASS Unscopable handled correctly for compact property on HTMLDListElement
-PASS HTMLDivElement interface: existence and properties of interface object
-PASS HTMLDivElement interface object length
-PASS HTMLDivElement interface object name
-PASS HTMLDivElement interface: existence and properties of interface prototype object
-PASS HTMLDivElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLDivElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLDivElement interface: attribute align
-PASS Unscopable handled correctly for align property on HTMLDivElement
-PASS HTMLDivElement must be primary interface of document.createElement("div")
-PASS Stringification of document.createElement("div")
-PASS HTMLDivElement interface: document.createElement("div") must inherit property "align" with the proper type
-PASS HTMLAnchorElement interface: existence and properties of interface object
-PASS HTMLAnchorElement interface object length
-PASS HTMLAnchorElement interface object name
-PASS HTMLAnchorElement interface: existence and properties of interface prototype object
-PASS HTMLAnchorElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLAnchorElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLAnchorElement interface: attribute target
-PASS Unscopable handled correctly for target property on HTMLAnchorElement
-PASS HTMLAnchorElement interface: attribute download
-PASS Unscopable handled correctly for download property on HTMLAnchorElement
-PASS HTMLAnchorElement interface: attribute ping
-PASS Unscopable handled correctly for ping property on HTMLAnchorElement
-PASS HTMLAnchorElement interface: attribute rel
-PASS Unscopable handled correctly for rel property on HTMLAnchorElement
-PASS HTMLAnchorElement interface: attribute relList
-PASS Unscopable handled correctly for relList property on HTMLAnchorElement
-PASS HTMLAnchorElement interface: attribute hreflang
-PASS Unscopable handled correctly for hreflang property on HTMLAnchorElement
-PASS HTMLAnchorElement interface: attribute type
-PASS Unscopable handled correctly for type property on HTMLAnchorElement
-PASS HTMLAnchorElement interface: attribute text
-PASS Unscopable handled correctly for text property on HTMLAnchorElement
-PASS HTMLAnchorElement interface: attribute referrerPolicy
-PASS Unscopable handled correctly for referrerPolicy property on HTMLAnchorElement
-PASS HTMLAnchorElement interface: attribute coords
-PASS Unscopable handled correctly for coords property on HTMLAnchorElement
-PASS HTMLAnchorElement interface: attribute charset
-PASS Unscopable handled correctly for charset property on HTMLAnchorElement
-PASS HTMLAnchorElement interface: attribute name
-PASS Unscopable handled correctly for name property on HTMLAnchorElement
-PASS HTMLAnchorElement interface: attribute rev
-PASS Unscopable handled correctly for rev property on HTMLAnchorElement
-PASS HTMLAnchorElement interface: attribute shape
-PASS Unscopable handled correctly for shape property on HTMLAnchorElement
-PASS HTMLAnchorElement interface: attribute href
-PASS Unscopable handled correctly for href property on HTMLAnchorElement
-PASS HTMLAnchorElement interface: stringifier
-PASS HTMLAnchorElement interface: attribute origin
-PASS Unscopable handled correctly for origin property on HTMLAnchorElement
-PASS HTMLAnchorElement interface: attribute protocol
-PASS Unscopable handled correctly for protocol property on HTMLAnchorElement
-PASS HTMLAnchorElement interface: attribute username
-PASS Unscopable handled correctly for username property on HTMLAnchorElement
-PASS HTMLAnchorElement interface: attribute password
-PASS Unscopable handled correctly for password property on HTMLAnchorElement
-PASS HTMLAnchorElement interface: attribute host
-PASS Unscopable handled correctly for host property on HTMLAnchorElement
-PASS HTMLAnchorElement interface: attribute hostname
-PASS Unscopable handled correctly for hostname property on HTMLAnchorElement
-PASS HTMLAnchorElement interface: attribute port
-PASS Unscopable handled correctly for port property on HTMLAnchorElement
-PASS HTMLAnchorElement interface: attribute pathname
-PASS Unscopable handled correctly for pathname property on HTMLAnchorElement
-PASS HTMLAnchorElement interface: attribute search
-PASS Unscopable handled correctly for search property on HTMLAnchorElement
-PASS HTMLAnchorElement interface: attribute hash
-PASS Unscopable handled correctly for hash property on HTMLAnchorElement
-PASS HTMLAnchorElement must be primary interface of document.createElement("a")
-PASS Stringification of document.createElement("a")
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "target" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "download" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "ping" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "rel" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "relList" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "hreflang" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "type" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "text" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "referrerPolicy" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "coords" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "charset" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "name" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "rev" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "shape" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "href" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "origin" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "protocol" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "username" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "password" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "host" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "hostname" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "port" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "pathname" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "search" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "hash" with the proper type
-PASS HTMLDataElement interface: existence and properties of interface object
-PASS HTMLDataElement interface object length
-PASS HTMLDataElement interface object name
-PASS HTMLDataElement interface: existence and properties of interface prototype object
-PASS HTMLDataElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLDataElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLDataElement interface: attribute value
-PASS Unscopable handled correctly for value property on HTMLDataElement
-PASS HTMLDataElement must be primary interface of document.createElement("data")
-PASS Stringification of document.createElement("data")
-PASS HTMLDataElement interface: document.createElement("data") must inherit property "value" with the proper type
-PASS HTMLTimeElement interface: existence and properties of interface object
-PASS HTMLTimeElement interface object length
-PASS HTMLTimeElement interface object name
-PASS HTMLTimeElement interface: existence and properties of interface prototype object
-PASS HTMLTimeElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLTimeElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLTimeElement interface: attribute dateTime
-PASS Unscopable handled correctly for dateTime property on HTMLTimeElement
-PASS HTMLTimeElement must be primary interface of document.createElement("time")
-PASS Stringification of document.createElement("time")
-PASS HTMLTimeElement interface: document.createElement("time") must inherit property "dateTime" with the proper type
-PASS HTMLSpanElement interface: existence and properties of interface object
-PASS HTMLSpanElement interface object length
-PASS HTMLSpanElement interface object name
-PASS HTMLSpanElement interface: existence and properties of interface prototype object
-PASS HTMLSpanElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLSpanElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLSpanElement must be primary interface of document.createElement("span")
-PASS Stringification of document.createElement("span")
-PASS HTMLBRElement interface: existence and properties of interface object
-PASS HTMLBRElement interface object length
-PASS HTMLBRElement interface object name
-PASS HTMLBRElement interface: existence and properties of interface prototype object
-PASS HTMLBRElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLBRElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLBRElement interface: attribute clear
-PASS Unscopable handled correctly for clear property on HTMLBRElement
-PASS HTMLBRElement must be primary interface of document.createElement("br")
-PASS Stringification of document.createElement("br")
-PASS HTMLBRElement interface: document.createElement("br") must inherit property "clear" with the proper type
-PASS HTMLModElement interface: existence and properties of interface object
-PASS HTMLModElement interface object length
-PASS HTMLModElement interface object name
-PASS HTMLModElement interface: existence and properties of interface prototype object
-PASS HTMLModElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLModElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLModElement interface: attribute cite
-PASS Unscopable handled correctly for cite property on HTMLModElement
-PASS HTMLModElement interface: attribute dateTime
-PASS Unscopable handled correctly for dateTime property on HTMLModElement
-PASS HTMLModElement must be primary interface of document.createElement("ins")
-PASS Stringification of document.createElement("ins")
-PASS HTMLModElement interface: document.createElement("ins") must inherit property "cite" with the proper type
-PASS HTMLModElement interface: document.createElement("ins") must inherit property "dateTime" with the proper type
-PASS HTMLModElement must be primary interface of document.createElement("del")
-PASS Stringification of document.createElement("del")
-PASS HTMLModElement interface: document.createElement("del") must inherit property "cite" with the proper type
-PASS HTMLModElement interface: document.createElement("del") must inherit property "dateTime" with the proper type
-PASS HTMLPictureElement interface: existence and properties of interface object
-PASS HTMLPictureElement interface object length
-PASS HTMLPictureElement interface object name
-PASS HTMLPictureElement interface: existence and properties of interface prototype object
-PASS HTMLPictureElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLPictureElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLPictureElement must be primary interface of document.createElement("picture")
-PASS Stringification of document.createElement("picture")
-PASS HTMLSourceElement interface: existence and properties of interface object
-PASS HTMLSourceElement interface object length
-PASS HTMLSourceElement interface object name
-PASS HTMLSourceElement interface: existence and properties of interface prototype object
-PASS HTMLSourceElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLSourceElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLSourceElement interface: attribute src
-PASS Unscopable handled correctly for src property on HTMLSourceElement
-PASS HTMLSourceElement interface: attribute type
-PASS Unscopable handled correctly for type property on HTMLSourceElement
-PASS HTMLSourceElement interface: attribute srcset
-PASS Unscopable handled correctly for srcset property on HTMLSourceElement
-PASS HTMLSourceElement interface: attribute sizes
-PASS Unscopable handled correctly for sizes property on HTMLSourceElement
-PASS HTMLSourceElement interface: attribute media
-PASS Unscopable handled correctly for media property on HTMLSourceElement
-PASS HTMLSourceElement must be primary interface of document.createElement("source")
-PASS Stringification of document.createElement("source")
-PASS HTMLSourceElement interface: document.createElement("source") must inherit property "src" with the proper type
-PASS HTMLSourceElement interface: document.createElement("source") must inherit property "type" with the proper type
-PASS HTMLSourceElement interface: document.createElement("source") must inherit property "srcset" with the proper type
-PASS HTMLSourceElement interface: document.createElement("source") must inherit property "sizes" with the proper type
-PASS HTMLSourceElement interface: document.createElement("source") must inherit property "media" with the proper type
-PASS HTMLImageElement interface: existence and properties of interface object
-PASS HTMLImageElement interface object length
-PASS HTMLImageElement interface object name
-PASS HTMLImageElement interface: existence and properties of interface prototype object
-PASS HTMLImageElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLImageElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLImageElement interface: attribute alt
-PASS Unscopable handled correctly for alt property on HTMLImageElement
-PASS HTMLImageElement interface: attribute src
-PASS Unscopable handled correctly for src property on HTMLImageElement
-PASS HTMLImageElement interface: attribute srcset
-PASS Unscopable handled correctly for srcset property on HTMLImageElement
-PASS HTMLImageElement interface: attribute sizes
-PASS Unscopable handled correctly for sizes property on HTMLImageElement
-PASS HTMLImageElement interface: attribute crossOrigin
-PASS Unscopable handled correctly for crossOrigin property on HTMLImageElement
-PASS HTMLImageElement interface: attribute useMap
-PASS Unscopable handled correctly for useMap property on HTMLImageElement
-PASS HTMLImageElement interface: attribute isMap
-PASS Unscopable handled correctly for isMap property on HTMLImageElement
-PASS HTMLImageElement interface: attribute width
-PASS Unscopable handled correctly for width property on HTMLImageElement
-PASS HTMLImageElement interface: attribute height
-PASS Unscopable handled correctly for height property on HTMLImageElement
-PASS HTMLImageElement interface: attribute naturalWidth
-PASS Unscopable handled correctly for naturalWidth property on HTMLImageElement
-PASS HTMLImageElement interface: attribute naturalHeight
-PASS Unscopable handled correctly for naturalHeight property on HTMLImageElement
-PASS HTMLImageElement interface: attribute complete
-PASS Unscopable handled correctly for complete property on HTMLImageElement
-PASS HTMLImageElement interface: attribute currentSrc
-PASS Unscopable handled correctly for currentSrc property on HTMLImageElement
-PASS HTMLImageElement interface: attribute referrerPolicy
-PASS Unscopable handled correctly for referrerPolicy property on HTMLImageElement
-PASS HTMLImageElement interface: operation decode()
-PASS Unscopable handled correctly for decode() on HTMLImageElement
-PASS HTMLImageElement interface: attribute name
-PASS Unscopable handled correctly for name property on HTMLImageElement
-PASS HTMLImageElement interface: attribute lowsrc
-PASS Unscopable handled correctly for lowsrc property on HTMLImageElement
-PASS HTMLImageElement interface: attribute align
-PASS Unscopable handled correctly for align property on HTMLImageElement
-PASS HTMLImageElement interface: attribute hspace
-PASS Unscopable handled correctly for hspace property on HTMLImageElement
-PASS HTMLImageElement interface: attribute vspace
-PASS Unscopable handled correctly for vspace property on HTMLImageElement
-PASS HTMLImageElement interface: attribute longDesc
-PASS Unscopable handled correctly for longDesc property on HTMLImageElement
-PASS HTMLImageElement interface: attribute border
-PASS Unscopable handled correctly for border property on HTMLImageElement
-PASS HTMLImageElement must be primary interface of document.createElement("img")
-PASS Stringification of document.createElement("img")
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "alt" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "src" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "srcset" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "sizes" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "crossOrigin" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "useMap" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "isMap" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "width" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "height" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "naturalWidth" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "naturalHeight" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "complete" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "currentSrc" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "referrerPolicy" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "decode()" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "name" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "lowsrc" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "align" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "hspace" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "vspace" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "longDesc" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "border" with the proper type
-PASS HTMLImageElement must be primary interface of new Image()
-PASS Stringification of new Image()
-PASS HTMLImageElement interface: new Image() must inherit property "alt" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "src" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "srcset" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "sizes" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "crossOrigin" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "useMap" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "isMap" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "width" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "height" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "naturalWidth" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "naturalHeight" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "complete" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "currentSrc" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "referrerPolicy" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "decode()" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "name" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "lowsrc" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "align" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "hspace" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "vspace" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "longDesc" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "border" with the proper type
-PASS HTMLIFrameElement interface: existence and properties of interface object
-PASS HTMLIFrameElement interface object length
-PASS HTMLIFrameElement interface object name
-PASS HTMLIFrameElement interface: existence and properties of interface prototype object
-PASS HTMLIFrameElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLIFrameElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLIFrameElement interface: attribute src
-PASS Unscopable handled correctly for src property on HTMLIFrameElement
-PASS HTMLIFrameElement interface: attribute srcdoc
-PASS Unscopable handled correctly for srcdoc property on HTMLIFrameElement
-PASS HTMLIFrameElement interface: attribute name
-PASS Unscopable handled correctly for name property on HTMLIFrameElement
-PASS HTMLIFrameElement interface: attribute sandbox
-PASS Unscopable handled correctly for sandbox property on HTMLIFrameElement
-PASS HTMLIFrameElement interface: attribute allowFullscreen
-PASS Unscopable handled correctly for allowFullscreen property on HTMLIFrameElement
-PASS HTMLIFrameElement interface: attribute allowPaymentRequest
-PASS Unscopable handled correctly for allowPaymentRequest property on HTMLIFrameElement
-FAIL HTMLIFrameElement interface: attribute allowUserMedia assert_true: The prototype object must have a property "allowUserMedia" expected true got false
-PASS Unscopable handled correctly for allowUserMedia property on HTMLIFrameElement
-PASS HTMLIFrameElement interface: attribute width
-PASS Unscopable handled correctly for width property on HTMLIFrameElement
-PASS HTMLIFrameElement interface: attribute height
-PASS Unscopable handled correctly for height property on HTMLIFrameElement
-PASS HTMLIFrameElement interface: attribute referrerPolicy
-PASS Unscopable handled correctly for referrerPolicy property on HTMLIFrameElement
-PASS HTMLIFrameElement interface: attribute contentDocument
-PASS Unscopable handled correctly for contentDocument property on HTMLIFrameElement
-PASS HTMLIFrameElement interface: attribute contentWindow
-PASS Unscopable handled correctly for contentWindow property on HTMLIFrameElement
-PASS HTMLIFrameElement interface: operation getSVGDocument()
-PASS Unscopable handled correctly for getSVGDocument() on HTMLIFrameElement
-FAIL HTMLIFrameElement interface: attribute delegateStickyUserActivation assert_true: The prototype object must have a property "delegateStickyUserActivation" expected true got false
-PASS Unscopable handled correctly for delegateStickyUserActivation property on HTMLIFrameElement
-PASS HTMLIFrameElement interface: attribute align
-PASS Unscopable handled correctly for align property on HTMLIFrameElement
-PASS HTMLIFrameElement interface: attribute scrolling
-PASS Unscopable handled correctly for scrolling property on HTMLIFrameElement
-PASS HTMLIFrameElement interface: attribute frameBorder
-PASS Unscopable handled correctly for frameBorder property on HTMLIFrameElement
-PASS HTMLIFrameElement interface: attribute longDesc
-PASS Unscopable handled correctly for longDesc property on HTMLIFrameElement
-PASS HTMLIFrameElement interface: attribute marginHeight
-PASS Unscopable handled correctly for marginHeight property on HTMLIFrameElement
-PASS HTMLIFrameElement interface: attribute marginWidth
-PASS Unscopable handled correctly for marginWidth property on HTMLIFrameElement
-PASS HTMLEmbedElement interface: existence and properties of interface object
-PASS HTMLEmbedElement interface object length
-PASS HTMLEmbedElement interface object name
-PASS HTMLEmbedElement interface: existence and properties of interface prototype object
-PASS HTMLEmbedElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLEmbedElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLEmbedElement interface: attribute src
-PASS Unscopable handled correctly for src property on HTMLEmbedElement
-PASS HTMLEmbedElement interface: attribute type
-PASS Unscopable handled correctly for type property on HTMLEmbedElement
-PASS HTMLEmbedElement interface: attribute width
-PASS Unscopable handled correctly for width property on HTMLEmbedElement
-PASS HTMLEmbedElement interface: attribute height
-PASS Unscopable handled correctly for height property on HTMLEmbedElement
-PASS HTMLEmbedElement interface: operation getSVGDocument()
-PASS Unscopable handled correctly for getSVGDocument() on HTMLEmbedElement
-PASS HTMLEmbedElement interface: attribute align
-PASS Unscopable handled correctly for align property on HTMLEmbedElement
-PASS HTMLEmbedElement interface: attribute name
-PASS Unscopable handled correctly for name property on HTMLEmbedElement
-PASS HTMLEmbedElement must be primary interface of document.createElement("embed")
-PASS Stringification of document.createElement("embed")
-PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "src" with the proper type
-PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "type" with the proper type
-PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "width" with the proper type
-PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "height" with the proper type
-PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "getSVGDocument()" with the proper type
-PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "align" with the proper type
-PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "name" with the proper type
-PASS HTMLObjectElement interface: existence and properties of interface object
-PASS HTMLObjectElement interface object length
-PASS HTMLObjectElement interface object name
-PASS HTMLObjectElement interface: existence and properties of interface prototype object
-PASS HTMLObjectElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLObjectElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLObjectElement interface: attribute data
-PASS Unscopable handled correctly for data property on HTMLObjectElement
-PASS HTMLObjectElement interface: attribute type
-PASS Unscopable handled correctly for type property on HTMLObjectElement
-FAIL HTMLObjectElement interface: attribute typeMustMatch assert_true: The prototype object must have a property "typeMustMatch" expected true got false
-PASS Unscopable handled correctly for typeMustMatch property on HTMLObjectElement
-PASS HTMLObjectElement interface: attribute name
-PASS Unscopable handled correctly for name property on HTMLObjectElement
-PASS HTMLObjectElement interface: attribute useMap
-PASS Unscopable handled correctly for useMap property on HTMLObjectElement
-PASS HTMLObjectElement interface: attribute form
-PASS Unscopable handled correctly for form property on HTMLObjectElement
-PASS HTMLObjectElement interface: attribute width
-PASS Unscopable handled correctly for width property on HTMLObjectElement
-PASS HTMLObjectElement interface: attribute height
-PASS Unscopable handled correctly for height property on HTMLObjectElement
-PASS HTMLObjectElement interface: attribute contentDocument
-PASS Unscopable handled correctly for contentDocument property on HTMLObjectElement
-PASS HTMLObjectElement interface: attribute contentWindow
-PASS Unscopable handled correctly for contentWindow property on HTMLObjectElement
-PASS HTMLObjectElement interface: operation getSVGDocument()
-PASS Unscopable handled correctly for getSVGDocument() on HTMLObjectElement
-PASS HTMLObjectElement interface: attribute willValidate
-PASS Unscopable handled correctly for willValidate property on HTMLObjectElement
-PASS HTMLObjectElement interface: attribute validity
-PASS Unscopable handled correctly for validity property on HTMLObjectElement
-PASS HTMLObjectElement interface: attribute validationMessage
-PASS Unscopable handled correctly for validationMessage property on HTMLObjectElement
-PASS HTMLObjectElement interface: operation checkValidity()
-PASS Unscopable handled correctly for checkValidity() on HTMLObjectElement
-PASS HTMLObjectElement interface: operation reportValidity()
-PASS Unscopable handled correctly for reportValidity() on HTMLObjectElement
-PASS HTMLObjectElement interface: operation setCustomValidity(DOMString)
-PASS Unscopable handled correctly for setCustomValidity(DOMString) on HTMLObjectElement
-PASS HTMLObjectElement interface: attribute align
-PASS Unscopable handled correctly for align property on HTMLObjectElement
-PASS HTMLObjectElement interface: attribute archive
-PASS Unscopable handled correctly for archive property on HTMLObjectElement
-PASS HTMLObjectElement interface: attribute code
-PASS Unscopable handled correctly for code property on HTMLObjectElement
-PASS HTMLObjectElement interface: attribute declare
-PASS Unscopable handled correctly for declare property on HTMLObjectElement
-PASS HTMLObjectElement interface: attribute hspace
-PASS Unscopable handled correctly for hspace property on HTMLObjectElement
-PASS HTMLObjectElement interface: attribute standby
-PASS Unscopable handled correctly for standby property on HTMLObjectElement
-PASS HTMLObjectElement interface: attribute vspace
-PASS Unscopable handled correctly for vspace property on HTMLObjectElement
-PASS HTMLObjectElement interface: attribute codeBase
-PASS Unscopable handled correctly for codeBase property on HTMLObjectElement
-PASS HTMLObjectElement interface: attribute codeType
-PASS Unscopable handled correctly for codeType property on HTMLObjectElement
-PASS HTMLObjectElement interface: attribute border
-PASS Unscopable handled correctly for border property on HTMLObjectElement
-PASS HTMLObjectElement must be primary interface of document.createElement("object")
-PASS Stringification of document.createElement("object")
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "data" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "type" with the proper type
-FAIL HTMLObjectElement interface: document.createElement("object") must inherit property "typeMustMatch" with the proper type assert_inherits: property "typeMustMatch" not found in prototype chain
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "name" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "useMap" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "form" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "width" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "height" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "contentDocument" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "contentWindow" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "getSVGDocument()" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "willValidate" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "validity" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "validationMessage" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "checkValidity()" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "reportValidity()" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLObjectElement interface: calling setCustomValidity(DOMString) on document.createElement("object") with too few arguments must throw TypeError
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "align" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "archive" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "code" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "declare" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "hspace" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "standby" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "vspace" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "codeBase" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "codeType" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "border" with the proper type
-PASS HTMLParamElement interface: existence and properties of interface object
-PASS HTMLParamElement interface object length
-PASS HTMLParamElement interface object name
-PASS HTMLParamElement interface: existence and properties of interface prototype object
-PASS HTMLParamElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLParamElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLParamElement interface: attribute name
-PASS Unscopable handled correctly for name property on HTMLParamElement
-PASS HTMLParamElement interface: attribute value
-PASS Unscopable handled correctly for value property on HTMLParamElement
-PASS HTMLParamElement interface: attribute type
-PASS Unscopable handled correctly for type property on HTMLParamElement
-PASS HTMLParamElement interface: attribute valueType
-PASS Unscopable handled correctly for valueType property on HTMLParamElement
-PASS HTMLParamElement must be primary interface of document.createElement("param")
-PASS Stringification of document.createElement("param")
-PASS HTMLParamElement interface: document.createElement("param") must inherit property "name" with the proper type
-PASS HTMLParamElement interface: document.createElement("param") must inherit property "value" with the proper type
-PASS HTMLParamElement interface: document.createElement("param") must inherit property "type" with the proper type
-PASS HTMLParamElement interface: document.createElement("param") must inherit property "valueType" with the proper type
-PASS HTMLVideoElement interface: existence and properties of interface object
-PASS HTMLVideoElement interface object length
-PASS HTMLVideoElement interface object name
-PASS HTMLVideoElement interface: existence and properties of interface prototype object
-PASS HTMLVideoElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLVideoElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLVideoElement interface: attribute width
-PASS Unscopable handled correctly for width property on HTMLVideoElement
-PASS HTMLVideoElement interface: attribute height
-PASS Unscopable handled correctly for height property on HTMLVideoElement
-PASS HTMLVideoElement interface: attribute videoWidth
-PASS Unscopable handled correctly for videoWidth property on HTMLVideoElement
-PASS HTMLVideoElement interface: attribute videoHeight
-PASS Unscopable handled correctly for videoHeight property on HTMLVideoElement
-PASS HTMLVideoElement interface: attribute poster
-PASS Unscopable handled correctly for poster property on HTMLVideoElement
-FAIL HTMLVideoElement interface: attribute playsInline assert_true: The prototype object must have a property "playsInline" expected true got false
-PASS Unscopable handled correctly for playsInline property on HTMLVideoElement
-PASS HTMLVideoElement must be primary interface of document.createElement("video")
-PASS Stringification of document.createElement("video")
-PASS HTMLVideoElement interface: document.createElement("video") must inherit property "width" with the proper type
-PASS HTMLVideoElement interface: document.createElement("video") must inherit property "height" with the proper type
-PASS HTMLVideoElement interface: document.createElement("video") must inherit property "videoWidth" with the proper type
-PASS HTMLVideoElement interface: document.createElement("video") must inherit property "videoHeight" with the proper type
-PASS HTMLVideoElement interface: document.createElement("video") must inherit property "poster" with the proper type
-FAIL HTMLVideoElement interface: document.createElement("video") must inherit property "playsInline" with the proper type assert_inherits: property "playsInline" not found in prototype chain
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "error" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "src" with the proper type
-FAIL HTMLMediaElement interface: document.createElement("video") must inherit property "srcObject" with the proper type Unrecognized type MediaStream
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "currentSrc" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "crossOrigin" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_EMPTY" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_IDLE" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_LOADING" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_NO_SOURCE" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "networkState" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "preload" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "buffered" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "load()" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "canPlayType(DOMString)" with the proper type
-PASS HTMLMediaElement interface: calling canPlayType(DOMString) on document.createElement("video") with too few arguments must throw TypeError
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_NOTHING" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_METADATA" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_CURRENT_DATA" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_FUTURE_DATA" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_ENOUGH_DATA" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "readyState" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "seeking" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "currentTime" with the proper type
-FAIL HTMLMediaElement interface: document.createElement("video") must inherit property "fastSeek(double)" with the proper type assert_inherits: property "fastSeek" not found in prototype chain
-FAIL HTMLMediaElement interface: calling fastSeek(double) on document.createElement("video") with too few arguments must throw TypeError assert_inherits: property "fastSeek" not found in prototype chain
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "duration" with the proper type
-FAIL HTMLMediaElement interface: document.createElement("video") must inherit property "getStartDate()" with the proper type assert_inherits: property "getStartDate" not found in prototype chain
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "paused" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "defaultPlaybackRate" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "playbackRate" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "played" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "seekable" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "ended" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "autoplay" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "loop" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "play()" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "pause()" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "controls" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "volume" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "muted" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "defaultMuted" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "audioTracks" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "videoTracks" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "textTracks" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "addTextTrack(TextTrackKind, DOMString, DOMString)" with the proper type
-PASS HTMLMediaElement interface: calling addTextTrack(TextTrackKind, DOMString, DOMString) on document.createElement("video") with too few arguments must throw TypeError
-PASS HTMLAudioElement interface: existence and properties of interface object
-PASS HTMLAudioElement interface object length
-PASS HTMLAudioElement interface object name
-PASS HTMLAudioElement interface: existence and properties of interface prototype object
-PASS HTMLAudioElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLAudioElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLAudioElement must be primary interface of document.createElement("audio")
-PASS Stringification of document.createElement("audio")
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "error" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "src" with the proper type
-FAIL HTMLMediaElement interface: document.createElement("audio") must inherit property "srcObject" with the proper type Unrecognized type MediaStream
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "currentSrc" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "crossOrigin" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_EMPTY" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_IDLE" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_LOADING" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_NO_SOURCE" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "networkState" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "preload" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "buffered" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "load()" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "canPlayType(DOMString)" with the proper type
-PASS HTMLMediaElement interface: calling canPlayType(DOMString) on document.createElement("audio") with too few arguments must throw TypeError
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_NOTHING" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_METADATA" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_CURRENT_DATA" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_FUTURE_DATA" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_ENOUGH_DATA" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "readyState" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "seeking" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "currentTime" with the proper type
-FAIL HTMLMediaElement interface: document.createElement("audio") must inherit property "fastSeek(double)" with the proper type assert_inherits: property "fastSeek" not found in prototype chain
-FAIL HTMLMediaElement interface: calling fastSeek(double) on document.createElement("audio") with too few arguments must throw TypeError assert_inherits: property "fastSeek" not found in prototype chain
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "duration" with the proper type
-FAIL HTMLMediaElement interface: document.createElement("audio") must inherit property "getStartDate()" with the proper type assert_inherits: property "getStartDate" not found in prototype chain
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "paused" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "defaultPlaybackRate" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "playbackRate" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "played" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "seekable" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "ended" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "autoplay" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "loop" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "play()" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "pause()" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "controls" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "volume" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "muted" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "defaultMuted" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "audioTracks" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "videoTracks" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "textTracks" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "addTextTrack(TextTrackKind, DOMString, DOMString)" with the proper type
-PASS HTMLMediaElement interface: calling addTextTrack(TextTrackKind, DOMString, DOMString) on document.createElement("audio") with too few arguments must throw TypeError
-PASS HTMLAudioElement must be primary interface of new Audio()
-PASS Stringification of new Audio()
-PASS HTMLMediaElement interface: new Audio() must inherit property "error" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "src" with the proper type
-FAIL HTMLMediaElement interface: new Audio() must inherit property "srcObject" with the proper type Unrecognized type MediaStream
-PASS HTMLMediaElement interface: new Audio() must inherit property "currentSrc" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "crossOrigin" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_EMPTY" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_IDLE" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_LOADING" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_NO_SOURCE" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "networkState" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "preload" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "buffered" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "load()" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "canPlayType(DOMString)" with the proper type
-PASS HTMLMediaElement interface: calling canPlayType(DOMString) on new Audio() with too few arguments must throw TypeError
-PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_NOTHING" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_METADATA" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_CURRENT_DATA" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_FUTURE_DATA" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_ENOUGH_DATA" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "readyState" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "seeking" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "currentTime" with the proper type
-FAIL HTMLMediaElement interface: new Audio() must inherit property "fastSeek(double)" with the proper type assert_inherits: property "fastSeek" not found in prototype chain
-FAIL HTMLMediaElement interface: calling fastSeek(double) on new Audio() with too few arguments must throw TypeError assert_inherits: property "fastSeek" not found in prototype chain
-PASS HTMLMediaElement interface: new Audio() must inherit property "duration" with the proper type
-FAIL HTMLMediaElement interface: new Audio() must inherit property "getStartDate()" with the proper type assert_inherits: property "getStartDate" not found in prototype chain
-PASS HTMLMediaElement interface: new Audio() must inherit property "paused" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "defaultPlaybackRate" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "playbackRate" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "played" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "seekable" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "ended" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "autoplay" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "loop" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "play()" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "pause()" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "controls" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "volume" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "muted" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "defaultMuted" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "audioTracks" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "videoTracks" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "textTracks" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "addTextTrack(TextTrackKind, DOMString, DOMString)" with the proper type
-PASS HTMLMediaElement interface: calling addTextTrack(TextTrackKind, DOMString, DOMString) on new Audio() with too few arguments must throw TypeError
-PASS HTMLTrackElement interface: existence and properties of interface object
-PASS HTMLTrackElement interface object length
-PASS HTMLTrackElement interface object name
-PASS HTMLTrackElement interface: existence and properties of interface prototype object
-PASS HTMLTrackElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLTrackElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLTrackElement interface: attribute kind
-PASS Unscopable handled correctly for kind property on HTMLTrackElement
-PASS HTMLTrackElement interface: attribute src
-PASS Unscopable handled correctly for src property on HTMLTrackElement
-PASS HTMLTrackElement interface: attribute srclang
-PASS Unscopable handled correctly for srclang property on HTMLTrackElement
-PASS HTMLTrackElement interface: attribute label
-PASS Unscopable handled correctly for label property on HTMLTrackElement
-PASS HTMLTrackElement interface: attribute default
-PASS Unscopable handled correctly for default property on HTMLTrackElement
-PASS HTMLTrackElement interface: constant NONE on interface object
-PASS HTMLTrackElement interface: constant NONE on interface prototype object
-PASS HTMLTrackElement interface: constant LOADING on interface object
-PASS HTMLTrackElement interface: constant LOADING on interface prototype object
-PASS HTMLTrackElement interface: constant LOADED on interface object
-PASS HTMLTrackElement interface: constant LOADED on interface prototype object
-PASS HTMLTrackElement interface: constant ERROR on interface object
-PASS HTMLTrackElement interface: constant ERROR on interface prototype object
-PASS HTMLTrackElement interface: attribute readyState
-PASS Unscopable handled correctly for readyState property on HTMLTrackElement
-PASS HTMLTrackElement interface: attribute track
-PASS Unscopable handled correctly for track property on HTMLTrackElement
-PASS HTMLTrackElement must be primary interface of document.createElement("track")
-PASS Stringification of document.createElement("track")
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "kind" with the proper type
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "src" with the proper type
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "srclang" with the proper type
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "label" with the proper type
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "default" with the proper type
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "NONE" with the proper type
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "LOADING" with the proper type
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "LOADED" with the proper type
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "ERROR" with the proper type
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "readyState" with the proper type
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "track" with the proper type
-PASS HTMLMediaElement interface: existence and properties of interface object
-PASS HTMLMediaElement interface object length
-PASS HTMLMediaElement interface object name
-PASS HTMLMediaElement interface: existence and properties of interface prototype object
-PASS HTMLMediaElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLMediaElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLMediaElement interface: attribute error
-PASS Unscopable handled correctly for error property on HTMLMediaElement
-PASS HTMLMediaElement interface: attribute src
-PASS Unscopable handled correctly for src property on HTMLMediaElement
-PASS HTMLMediaElement interface: attribute srcObject
-PASS Unscopable handled correctly for srcObject property on HTMLMediaElement
-PASS HTMLMediaElement interface: attribute currentSrc
-PASS Unscopable handled correctly for currentSrc property on HTMLMediaElement
-PASS HTMLMediaElement interface: attribute crossOrigin
-PASS Unscopable handled correctly for crossOrigin property on HTMLMediaElement
-PASS HTMLMediaElement interface: constant NETWORK_EMPTY on interface object
-PASS HTMLMediaElement interface: constant NETWORK_EMPTY on interface prototype object
-PASS HTMLMediaElement interface: constant NETWORK_IDLE on interface object
-PASS HTMLMediaElement interface: constant NETWORK_IDLE on interface prototype object
-PASS HTMLMediaElement interface: constant NETWORK_LOADING on interface object
-PASS HTMLMediaElement interface: constant NETWORK_LOADING on interface prototype object
-PASS HTMLMediaElement interface: constant NETWORK_NO_SOURCE on interface object
-PASS HTMLMediaElement interface: constant NETWORK_NO_SOURCE on interface prototype object
-PASS HTMLMediaElement interface: attribute networkState
-PASS Unscopable handled correctly for networkState property on HTMLMediaElement
-PASS HTMLMediaElement interface: attribute preload
-PASS Unscopable handled correctly for preload property on HTMLMediaElement
-PASS HTMLMediaElement interface: attribute buffered
-PASS Unscopable handled correctly for buffered property on HTMLMediaElement
-PASS HTMLMediaElement interface: operation load()
-PASS Unscopable handled correctly for load() on HTMLMediaElement
-PASS HTMLMediaElement interface: operation canPlayType(DOMString)
-PASS Unscopable handled correctly for canPlayType(DOMString) on HTMLMediaElement
-PASS HTMLMediaElement interface: constant HAVE_NOTHING on interface object
-PASS HTMLMediaElement interface: constant HAVE_NOTHING on interface prototype object
-PASS HTMLMediaElement interface: constant HAVE_METADATA on interface object
-PASS HTMLMediaElement interface: constant HAVE_METADATA on interface prototype object
-PASS HTMLMediaElement interface: constant HAVE_CURRENT_DATA on interface object
-PASS HTMLMediaElement interface: constant HAVE_CURRENT_DATA on interface prototype object
-PASS HTMLMediaElement interface: constant HAVE_FUTURE_DATA on interface object
-PASS HTMLMediaElement interface: constant HAVE_FUTURE_DATA on interface prototype object
-PASS HTMLMediaElement interface: constant HAVE_ENOUGH_DATA on interface object
-PASS HTMLMediaElement interface: constant HAVE_ENOUGH_DATA on interface prototype object
-PASS HTMLMediaElement interface: attribute readyState
-PASS Unscopable handled correctly for readyState property on HTMLMediaElement
-PASS HTMLMediaElement interface: attribute seeking
-PASS Unscopable handled correctly for seeking property on HTMLMediaElement
-PASS HTMLMediaElement interface: attribute currentTime
-PASS Unscopable handled correctly for currentTime property on HTMLMediaElement
-FAIL HTMLMediaElement interface: operation fastSeek(double) assert_own_property: interface prototype object missing non-static operation expected property "fastSeek" missing
-PASS Unscopable handled correctly for fastSeek(double) on HTMLMediaElement
-PASS HTMLMediaElement interface: attribute duration
-PASS Unscopable handled correctly for duration property on HTMLMediaElement
-FAIL HTMLMediaElement interface: operation getStartDate() assert_own_property: interface prototype object missing non-static operation expected property "getStartDate" missing
-PASS Unscopable handled correctly for getStartDate() on HTMLMediaElement
-PASS HTMLMediaElement interface: attribute paused
-PASS Unscopable handled correctly for paused property on HTMLMediaElement
-PASS HTMLMediaElement interface: attribute defaultPlaybackRate
-PASS Unscopable handled correctly for defaultPlaybackRate property on HTMLMediaElement
-PASS HTMLMediaElement interface: attribute playbackRate
-PASS Unscopable handled correctly for playbackRate property on HTMLMediaElement
-PASS HTMLMediaElement interface: attribute played
-PASS Unscopable handled correctly for played property on HTMLMediaElement
-PASS HTMLMediaElement interface: attribute seekable
-PASS Unscopable handled correctly for seekable property on HTMLMediaElement
-PASS HTMLMediaElement interface: attribute ended
-PASS Unscopable handled correctly for ended property on HTMLMediaElement
-PASS HTMLMediaElement interface: attribute autoplay
-PASS Unscopable handled correctly for autoplay property on HTMLMediaElement
-PASS HTMLMediaElement interface: attribute loop
-PASS Unscopable handled correctly for loop property on HTMLMediaElement
-PASS HTMLMediaElement interface: operation play()
-PASS Unscopable handled correctly for play() on HTMLMediaElement
-PASS HTMLMediaElement interface: operation pause()
-PASS Unscopable handled correctly for pause() on HTMLMediaElement
-PASS HTMLMediaElement interface: attribute controls
-PASS Unscopable handled correctly for controls property on HTMLMediaElement
-PASS HTMLMediaElement interface: attribute volume
-PASS Unscopable handled correctly for volume property on HTMLMediaElement
-PASS HTMLMediaElement interface: attribute muted
-PASS Unscopable handled correctly for muted property on HTMLMediaElement
-PASS HTMLMediaElement interface: attribute defaultMuted
-PASS Unscopable handled correctly for defaultMuted property on HTMLMediaElement
-PASS HTMLMediaElement interface: attribute audioTracks
-PASS Unscopable handled correctly for audioTracks property on HTMLMediaElement
-PASS HTMLMediaElement interface: attribute videoTracks
-PASS Unscopable handled correctly for videoTracks property on HTMLMediaElement
-PASS HTMLMediaElement interface: attribute textTracks
-PASS Unscopable handled correctly for textTracks property on HTMLMediaElement
-PASS HTMLMediaElement interface: operation addTextTrack(TextTrackKind, DOMString, DOMString)
-PASS Unscopable handled correctly for addTextTrack(TextTrackKind, DOMString, DOMString) on HTMLMediaElement
-PASS MediaError interface: existence and properties of interface object
-PASS MediaError interface object length
-PASS MediaError interface object name
-PASS MediaError interface: existence and properties of interface prototype object
-PASS MediaError interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaError interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaError interface: constant MEDIA_ERR_ABORTED on interface object
-PASS MediaError interface: constant MEDIA_ERR_ABORTED on interface prototype object
-PASS MediaError interface: constant MEDIA_ERR_NETWORK on interface object
-PASS MediaError interface: constant MEDIA_ERR_NETWORK on interface prototype object
-PASS MediaError interface: constant MEDIA_ERR_DECODE on interface object
-PASS MediaError interface: constant MEDIA_ERR_DECODE on interface prototype object
-PASS MediaError interface: constant MEDIA_ERR_SRC_NOT_SUPPORTED on interface object
-PASS MediaError interface: constant MEDIA_ERR_SRC_NOT_SUPPORTED on interface prototype object
-PASS MediaError interface: attribute code
-PASS Unscopable handled correctly for code property on MediaError
-PASS MediaError interface: attribute message
-PASS Unscopable handled correctly for message property on MediaError
-PASS MediaError must be primary interface of errorVideo.error
-PASS Stringification of errorVideo.error
-PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_ABORTED" with the proper type
-PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_NETWORK" with the proper type
-PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_DECODE" with the proper type
-PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_SRC_NOT_SUPPORTED" with the proper type
-PASS MediaError interface: errorVideo.error must inherit property "code" with the proper type
-PASS MediaError interface: errorVideo.error must inherit property "message" with the proper type
-PASS AudioTrackList interface: existence and properties of interface object
-PASS AudioTrackList interface object length
-PASS AudioTrackList interface object name
-PASS AudioTrackList interface: existence and properties of interface prototype object
-PASS AudioTrackList interface: existence and properties of interface prototype object's "constructor" property
-PASS AudioTrackList interface: existence and properties of interface prototype object's @@unscopables property
-PASS AudioTrackList interface: attribute length
-PASS Unscopable handled correctly for length property on AudioTrackList
-PASS AudioTrackList interface: operation getTrackById(DOMString)
-PASS Unscopable handled correctly for getTrackById(DOMString) on AudioTrackList
-PASS AudioTrackList interface: attribute onchange
-PASS Unscopable handled correctly for onchange property on AudioTrackList
-PASS AudioTrackList interface: attribute onaddtrack
-PASS Unscopable handled correctly for onaddtrack property on AudioTrackList
-PASS AudioTrackList interface: attribute onremovetrack
-PASS Unscopable handled correctly for onremovetrack property on AudioTrackList
-PASS AudioTrack interface: existence and properties of interface object
-PASS AudioTrack interface object length
-PASS AudioTrack interface object name
-PASS AudioTrack interface: existence and properties of interface prototype object
-PASS AudioTrack interface: existence and properties of interface prototype object's "constructor" property
-PASS AudioTrack interface: existence and properties of interface prototype object's @@unscopables property
-PASS AudioTrack interface: attribute id
-PASS Unscopable handled correctly for id property on AudioTrack
-PASS AudioTrack interface: attribute kind
-PASS Unscopable handled correctly for kind property on AudioTrack
-PASS AudioTrack interface: attribute label
-PASS Unscopable handled correctly for label property on AudioTrack
-PASS AudioTrack interface: attribute language
-PASS Unscopable handled correctly for language property on AudioTrack
-PASS AudioTrack interface: attribute enabled
-PASS Unscopable handled correctly for enabled property on AudioTrack
-PASS VideoTrackList interface: existence and properties of interface object
-PASS VideoTrackList interface object length
-PASS VideoTrackList interface object name
-PASS VideoTrackList interface: existence and properties of interface prototype object
-PASS VideoTrackList interface: existence and properties of interface prototype object's "constructor" property
-PASS VideoTrackList interface: existence and properties of interface prototype object's @@unscopables property
-PASS VideoTrackList interface: attribute length
-PASS Unscopable handled correctly for length property on VideoTrackList
-PASS VideoTrackList interface: operation getTrackById(DOMString)
-PASS Unscopable handled correctly for getTrackById(DOMString) on VideoTrackList
-PASS VideoTrackList interface: attribute selectedIndex
-PASS Unscopable handled correctly for selectedIndex property on VideoTrackList
-PASS VideoTrackList interface: attribute onchange
-PASS Unscopable handled correctly for onchange property on VideoTrackList
-PASS VideoTrackList interface: attribute onaddtrack
-PASS Unscopable handled correctly for onaddtrack property on VideoTrackList
-PASS VideoTrackList interface: attribute onremovetrack
-PASS Unscopable handled correctly for onremovetrack property on VideoTrackList
-PASS VideoTrack interface: existence and properties of interface object
-PASS VideoTrack interface object length
-PASS VideoTrack interface object name
-PASS VideoTrack interface: existence and properties of interface prototype object
-PASS VideoTrack interface: existence and properties of interface prototype object's "constructor" property
-PASS VideoTrack interface: existence and properties of interface prototype object's @@unscopables property
-PASS VideoTrack interface: attribute id
-PASS Unscopable handled correctly for id property on VideoTrack
-PASS VideoTrack interface: attribute kind
-PASS Unscopable handled correctly for kind property on VideoTrack
-PASS VideoTrack interface: attribute label
-PASS Unscopable handled correctly for label property on VideoTrack
-PASS VideoTrack interface: attribute language
-PASS Unscopable handled correctly for language property on VideoTrack
-PASS VideoTrack interface: attribute selected
-PASS Unscopable handled correctly for selected property on VideoTrack
-PASS TextTrackList interface: existence and properties of interface object
-PASS TextTrackList interface object length
-PASS TextTrackList interface object name
-PASS TextTrackList interface: existence and properties of interface prototype object
-PASS TextTrackList interface: existence and properties of interface prototype object's "constructor" property
-PASS TextTrackList interface: existence and properties of interface prototype object's @@unscopables property
-PASS TextTrackList interface: attribute length
-PASS Unscopable handled correctly for length property on TextTrackList
-PASS TextTrackList interface: operation getTrackById(DOMString)
-PASS Unscopable handled correctly for getTrackById(DOMString) on TextTrackList
-PASS TextTrackList interface: attribute onchange
-PASS Unscopable handled correctly for onchange property on TextTrackList
-PASS TextTrackList interface: attribute onaddtrack
-PASS Unscopable handled correctly for onaddtrack property on TextTrackList
-PASS TextTrackList interface: attribute onremovetrack
-PASS Unscopable handled correctly for onremovetrack property on TextTrackList
-PASS TextTrackList must be primary interface of document.createElement("video").textTracks
-PASS Stringification of document.createElement("video").textTracks
-PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "length" with the proper type
-PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "getTrackById(DOMString)" with the proper type
-PASS TextTrackList interface: calling getTrackById(DOMString) on document.createElement("video").textTracks with too few arguments must throw TypeError
-PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onchange" with the proper type
-PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onaddtrack" with the proper type
-PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onremovetrack" with the proper type
-PASS TextTrack interface: existence and properties of interface object
-PASS TextTrack interface object length
-PASS TextTrack interface object name
-PASS TextTrack interface: existence and properties of interface prototype object
-PASS TextTrack interface: existence and properties of interface prototype object's "constructor" property
-PASS TextTrack interface: existence and properties of interface prototype object's @@unscopables property
-PASS TextTrack interface: attribute kind
-PASS Unscopable handled correctly for kind property on TextTrack
-PASS TextTrack interface: attribute label
-PASS Unscopable handled correctly for label property on TextTrack
-PASS TextTrack interface: attribute language
-PASS Unscopable handled correctly for language property on TextTrack
-PASS TextTrack interface: attribute id
-PASS Unscopable handled correctly for id property on TextTrack
-FAIL TextTrack interface: attribute inBandMetadataTrackDispatchType assert_true: The prototype object must have a property "inBandMetadataTrackDispatchType" expected true got false
-PASS Unscopable handled correctly for inBandMetadataTrackDispatchType property on TextTrack
-PASS TextTrack interface: attribute mode
-PASS Unscopable handled correctly for mode property on TextTrack
-PASS TextTrack interface: attribute cues
-PASS Unscopable handled correctly for cues property on TextTrack
-PASS TextTrack interface: attribute activeCues
-PASS Unscopable handled correctly for activeCues property on TextTrack
-PASS TextTrack interface: operation addCue(TextTrackCue)
-PASS Unscopable handled correctly for addCue(TextTrackCue) on TextTrack
-PASS TextTrack interface: operation removeCue(TextTrackCue)
-PASS Unscopable handled correctly for removeCue(TextTrackCue) on TextTrack
-PASS TextTrack interface: attribute oncuechange
-PASS Unscopable handled correctly for oncuechange property on TextTrack
-PASS TextTrack must be primary interface of document.createElement("track").track
-PASS Stringification of document.createElement("track").track
-PASS TextTrack interface: document.createElement("track").track must inherit property "kind" with the proper type
-PASS TextTrack interface: document.createElement("track").track must inherit property "label" with the proper type
-PASS TextTrack interface: document.createElement("track").track must inherit property "language" with the proper type
-PASS TextTrack interface: document.createElement("track").track must inherit property "id" with the proper type
-FAIL TextTrack interface: document.createElement("track").track must inherit property "inBandMetadataTrackDispatchType" with the proper type assert_inherits: property "inBandMetadataTrackDispatchType" not found in prototype chain
-PASS TextTrack interface: document.createElement("track").track must inherit property "mode" with the proper type
-PASS TextTrack interface: document.createElement("track").track must inherit property "cues" with the proper type
-PASS TextTrack interface: document.createElement("track").track must inherit property "activeCues" with the proper type
-PASS TextTrack interface: document.createElement("track").track must inherit property "addCue(TextTrackCue)" with the proper type
-PASS TextTrack interface: calling addCue(TextTrackCue) on document.createElement("track").track with too few arguments must throw TypeError
-PASS TextTrack interface: document.createElement("track").track must inherit property "removeCue(TextTrackCue)" with the proper type
-PASS TextTrack interface: calling removeCue(TextTrackCue) on document.createElement("track").track with too few arguments must throw TypeError
-PASS TextTrack interface: document.createElement("track").track must inherit property "oncuechange" with the proper type
-PASS TextTrackCueList interface: existence and properties of interface object
-PASS TextTrackCueList interface object length
-PASS TextTrackCueList interface object name
-PASS TextTrackCueList interface: existence and properties of interface prototype object
-PASS TextTrackCueList interface: existence and properties of interface prototype object's "constructor" property
-PASS TextTrackCueList interface: existence and properties of interface prototype object's @@unscopables property
-PASS TextTrackCueList interface: attribute length
-PASS Unscopable handled correctly for length property on TextTrackCueList
-PASS TextTrackCueList interface: operation getCueById(DOMString)
-PASS Unscopable handled correctly for getCueById(DOMString) on TextTrackCueList
-PASS TextTrackCueList must be primary interface of document.createElement("video").addTextTrack("subtitles").cues
-PASS Stringification of document.createElement("video").addTextTrack("subtitles").cues
-PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "length" with the proper type
-PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "getCueById(DOMString)" with the proper type
-PASS TextTrackCueList interface: calling getCueById(DOMString) on document.createElement("video").addTextTrack("subtitles").cues with too few arguments must throw TypeError
-PASS TextTrackCue interface: existence and properties of interface object
-PASS TextTrackCue interface object length
-PASS TextTrackCue interface object name
-PASS TextTrackCue interface: existence and properties of interface prototype object
-PASS TextTrackCue interface: existence and properties of interface prototype object's "constructor" property
-PASS TextTrackCue interface: existence and properties of interface prototype object's @@unscopables property
-PASS TextTrackCue interface: attribute track
-PASS Unscopable handled correctly for track property on TextTrackCue
-PASS TextTrackCue interface: attribute id
-PASS Unscopable handled correctly for id property on TextTrackCue
-PASS TextTrackCue interface: attribute startTime
-PASS Unscopable handled correctly for startTime property on TextTrackCue
-PASS TextTrackCue interface: attribute endTime
-PASS Unscopable handled correctly for endTime property on TextTrackCue
-PASS TextTrackCue interface: attribute pauseOnExit
-PASS Unscopable handled correctly for pauseOnExit property on TextTrackCue
-PASS TextTrackCue interface: attribute onenter
-PASS Unscopable handled correctly for onenter property on TextTrackCue
-PASS TextTrackCue interface: attribute onexit
-PASS Unscopable handled correctly for onexit property on TextTrackCue
-PASS TimeRanges interface: existence and properties of interface object
-PASS TimeRanges interface object length
-PASS TimeRanges interface object name
-PASS TimeRanges interface: existence and properties of interface prototype object
-PASS TimeRanges interface: existence and properties of interface prototype object's "constructor" property
-PASS TimeRanges interface: existence and properties of interface prototype object's @@unscopables property
-PASS TimeRanges interface: attribute length
-PASS Unscopable handled correctly for length property on TimeRanges
-PASS TimeRanges interface: operation start(unsigned long)
-PASS Unscopable handled correctly for start(unsigned long) on TimeRanges
-PASS TimeRanges interface: operation end(unsigned long)
-PASS Unscopable handled correctly for end(unsigned long) on TimeRanges
-PASS TimeRanges must be primary interface of document.createElement("video").buffered
-PASS Stringification of document.createElement("video").buffered
-PASS TimeRanges interface: document.createElement("video").buffered must inherit property "length" with the proper type
-PASS TimeRanges interface: document.createElement("video").buffered must inherit property "start(unsigned long)" with the proper type
-PASS TimeRanges interface: calling start(unsigned long) on document.createElement("video").buffered with too few arguments must throw TypeError
-PASS TimeRanges interface: document.createElement("video").buffered must inherit property "end(unsigned long)" with the proper type
-PASS TimeRanges interface: calling end(unsigned long) on document.createElement("video").buffered with too few arguments must throw TypeError
-PASS TrackEvent interface: existence and properties of interface object
-PASS TrackEvent interface object length
-PASS TrackEvent interface object name
-PASS TrackEvent interface: existence and properties of interface prototype object
-PASS TrackEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS TrackEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS TrackEvent interface: attribute track
-PASS Unscopable handled correctly for track property on TrackEvent
-PASS TrackEvent must be primary interface of new TrackEvent("addtrack", {track:document.createElement("track").track})
-PASS Stringification of new TrackEvent("addtrack", {track:document.createElement("track").track})
-PASS TrackEvent interface: new TrackEvent("addtrack", {track:document.createElement("track").track}) must inherit property "track" with the proper type
-PASS HTMLMapElement interface: existence and properties of interface object
-PASS HTMLMapElement interface object length
-PASS HTMLMapElement interface object name
-PASS HTMLMapElement interface: existence and properties of interface prototype object
-PASS HTMLMapElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLMapElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLMapElement interface: attribute name
-PASS Unscopable handled correctly for name property on HTMLMapElement
-PASS HTMLMapElement interface: attribute areas
-PASS Unscopable handled correctly for areas property on HTMLMapElement
-PASS HTMLMapElement must be primary interface of document.createElement("map")
-PASS Stringification of document.createElement("map")
-PASS HTMLMapElement interface: document.createElement("map") must inherit property "name" with the proper type
-PASS HTMLMapElement interface: document.createElement("map") must inherit property "areas" with the proper type
-PASS HTMLAreaElement interface: existence and properties of interface object
-PASS HTMLAreaElement interface object length
-PASS HTMLAreaElement interface object name
-PASS HTMLAreaElement interface: existence and properties of interface prototype object
-PASS HTMLAreaElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLAreaElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLAreaElement interface: attribute alt
-PASS Unscopable handled correctly for alt property on HTMLAreaElement
-PASS HTMLAreaElement interface: attribute coords
-PASS Unscopable handled correctly for coords property on HTMLAreaElement
-PASS HTMLAreaElement interface: attribute shape
-PASS Unscopable handled correctly for shape property on HTMLAreaElement
-PASS HTMLAreaElement interface: attribute target
-PASS Unscopable handled correctly for target property on HTMLAreaElement
-PASS HTMLAreaElement interface: attribute download
-PASS Unscopable handled correctly for download property on HTMLAreaElement
-PASS HTMLAreaElement interface: attribute ping
-PASS Unscopable handled correctly for ping property on HTMLAreaElement
-PASS HTMLAreaElement interface: attribute rel
-PASS Unscopable handled correctly for rel property on HTMLAreaElement
-PASS HTMLAreaElement interface: attribute relList
-PASS Unscopable handled correctly for relList property on HTMLAreaElement
-PASS HTMLAreaElement interface: attribute referrerPolicy
-PASS Unscopable handled correctly for referrerPolicy property on HTMLAreaElement
-PASS HTMLAreaElement interface: attribute noHref
-PASS Unscopable handled correctly for noHref property on HTMLAreaElement
-PASS HTMLAreaElement interface: attribute href
-PASS Unscopable handled correctly for href property on HTMLAreaElement
-PASS HTMLAreaElement interface: stringifier
-PASS HTMLAreaElement interface: attribute origin
-PASS Unscopable handled correctly for origin property on HTMLAreaElement
-PASS HTMLAreaElement interface: attribute protocol
-PASS Unscopable handled correctly for protocol property on HTMLAreaElement
-PASS HTMLAreaElement interface: attribute username
-PASS Unscopable handled correctly for username property on HTMLAreaElement
-PASS HTMLAreaElement interface: attribute password
-PASS Unscopable handled correctly for password property on HTMLAreaElement
-PASS HTMLAreaElement interface: attribute host
-PASS Unscopable handled correctly for host property on HTMLAreaElement
-PASS HTMLAreaElement interface: attribute hostname
-PASS Unscopable handled correctly for hostname property on HTMLAreaElement
-PASS HTMLAreaElement interface: attribute port
-PASS Unscopable handled correctly for port property on HTMLAreaElement
-PASS HTMLAreaElement interface: attribute pathname
-PASS Unscopable handled correctly for pathname property on HTMLAreaElement
-PASS HTMLAreaElement interface: attribute search
-PASS Unscopable handled correctly for search property on HTMLAreaElement
-PASS HTMLAreaElement interface: attribute hash
-PASS Unscopable handled correctly for hash property on HTMLAreaElement
-PASS HTMLAreaElement must be primary interface of document.createElement("area")
-PASS Stringification of document.createElement("area")
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "alt" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "coords" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "shape" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "target" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "download" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "ping" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "rel" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "relList" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "referrerPolicy" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "noHref" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "href" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "origin" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "protocol" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "username" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "password" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "host" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "hostname" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "port" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "pathname" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "search" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "hash" with the proper type
-PASS HTMLTableElement interface: existence and properties of interface object
-PASS HTMLTableElement interface object length
-PASS HTMLTableElement interface object name
-PASS HTMLTableElement interface: existence and properties of interface prototype object
-PASS HTMLTableElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLTableElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLTableElement interface: attribute caption
-PASS Unscopable handled correctly for caption property on HTMLTableElement
-PASS HTMLTableElement interface: operation createCaption()
-PASS Unscopable handled correctly for createCaption() on HTMLTableElement
-PASS HTMLTableElement interface: operation deleteCaption()
-PASS Unscopable handled correctly for deleteCaption() on HTMLTableElement
-PASS HTMLTableElement interface: attribute tHead
-PASS Unscopable handled correctly for tHead property on HTMLTableElement
-PASS HTMLTableElement interface: operation createTHead()
-PASS Unscopable handled correctly for createTHead() on HTMLTableElement
-PASS HTMLTableElement interface: operation deleteTHead()
-PASS Unscopable handled correctly for deleteTHead() on HTMLTableElement
-PASS HTMLTableElement interface: attribute tFoot
-PASS Unscopable handled correctly for tFoot property on HTMLTableElement
-PASS HTMLTableElement interface: operation createTFoot()
-PASS Unscopable handled correctly for createTFoot() on HTMLTableElement
-PASS HTMLTableElement interface: operation deleteTFoot()
-PASS Unscopable handled correctly for deleteTFoot() on HTMLTableElement
-PASS HTMLTableElement interface: attribute tBodies
-PASS Unscopable handled correctly for tBodies property on HTMLTableElement
-PASS HTMLTableElement interface: operation createTBody()
-PASS Unscopable handled correctly for createTBody() on HTMLTableElement
-PASS HTMLTableElement interface: attribute rows
-PASS Unscopable handled correctly for rows property on HTMLTableElement
-PASS HTMLTableElement interface: operation insertRow(long)
-PASS Unscopable handled correctly for insertRow(long) on HTMLTableElement
-PASS HTMLTableElement interface: operation deleteRow(long)
-PASS Unscopable handled correctly for deleteRow(long) on HTMLTableElement
-PASS HTMLTableElement interface: attribute align
-PASS Unscopable handled correctly for align property on HTMLTableElement
-PASS HTMLTableElement interface: attribute border
-PASS Unscopable handled correctly for border property on HTMLTableElement
-PASS HTMLTableElement interface: attribute frame
-PASS Unscopable handled correctly for frame property on HTMLTableElement
-PASS HTMLTableElement interface: attribute rules
-PASS Unscopable handled correctly for rules property on HTMLTableElement
-PASS HTMLTableElement interface: attribute summary
-PASS Unscopable handled correctly for summary property on HTMLTableElement
-PASS HTMLTableElement interface: attribute width
-PASS Unscopable handled correctly for width property on HTMLTableElement
-PASS HTMLTableElement interface: attribute bgColor
-PASS Unscopable handled correctly for bgColor property on HTMLTableElement
-PASS HTMLTableElement interface: attribute cellPadding
-PASS Unscopable handled correctly for cellPadding property on HTMLTableElement
-PASS HTMLTableElement interface: attribute cellSpacing
-PASS Unscopable handled correctly for cellSpacing property on HTMLTableElement
-PASS HTMLTableElement must be primary interface of document.createElement("table")
-PASS Stringification of document.createElement("table")
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "caption" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "createCaption()" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "deleteCaption()" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "tHead" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "createTHead()" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "deleteTHead()" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "tFoot" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "createTFoot()" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "deleteTFoot()" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "tBodies" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "createTBody()" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "rows" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "insertRow(long)" with the proper type
-PASS HTMLTableElement interface: calling insertRow(long) on document.createElement("table") with too few arguments must throw TypeError
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "deleteRow(long)" with the proper type
-PASS HTMLTableElement interface: calling deleteRow(long) on document.createElement("table") with too few arguments must throw TypeError
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "align" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "border" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "frame" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "rules" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "summary" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "width" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "bgColor" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "cellPadding" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "cellSpacing" with the proper type
-PASS HTMLTableCaptionElement interface: existence and properties of interface object
-PASS HTMLTableCaptionElement interface object length
-PASS HTMLTableCaptionElement interface object name
-PASS HTMLTableCaptionElement interface: existence and properties of interface prototype object
-PASS HTMLTableCaptionElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLTableCaptionElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLTableCaptionElement interface: attribute align
-PASS Unscopable handled correctly for align property on HTMLTableCaptionElement
-PASS HTMLTableCaptionElement must be primary interface of document.createElement("caption")
-PASS Stringification of document.createElement("caption")
-PASS HTMLTableCaptionElement interface: document.createElement("caption") must inherit property "align" with the proper type
-PASS HTMLTableColElement interface: existence and properties of interface object
-PASS HTMLTableColElement interface object length
-PASS HTMLTableColElement interface object name
-PASS HTMLTableColElement interface: existence and properties of interface prototype object
-PASS HTMLTableColElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLTableColElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLTableColElement interface: attribute span
-PASS Unscopable handled correctly for span property on HTMLTableColElement
-PASS HTMLTableColElement interface: attribute align
-PASS Unscopable handled correctly for align property on HTMLTableColElement
-PASS HTMLTableColElement interface: attribute ch
-PASS Unscopable handled correctly for ch property on HTMLTableColElement
-PASS HTMLTableColElement interface: attribute chOff
-PASS Unscopable handled correctly for chOff property on HTMLTableColElement
-PASS HTMLTableColElement interface: attribute vAlign
-PASS Unscopable handled correctly for vAlign property on HTMLTableColElement
-PASS HTMLTableColElement interface: attribute width
-PASS Unscopable handled correctly for width property on HTMLTableColElement
-PASS HTMLTableColElement must be primary interface of document.createElement("colgroup")
-PASS Stringification of document.createElement("colgroup")
-PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "span" with the proper type
-PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "align" with the proper type
-PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "ch" with the proper type
-PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "chOff" with the proper type
-PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "vAlign" with the proper type
-PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "width" with the proper type
-PASS HTMLTableColElement must be primary interface of document.createElement("col")
-PASS Stringification of document.createElement("col")
-PASS HTMLTableColElement interface: document.createElement("col") must inherit property "span" with the proper type
-PASS HTMLTableColElement interface: document.createElement("col") must inherit property "align" with the proper type
-PASS HTMLTableColElement interface: document.createElement("col") must inherit property "ch" with the proper type
-PASS HTMLTableColElement interface: document.createElement("col") must inherit property "chOff" with the proper type
-PASS HTMLTableColElement interface: document.createElement("col") must inherit property "vAlign" with the proper type
-PASS HTMLTableColElement interface: document.createElement("col") must inherit property "width" with the proper type
-PASS HTMLTableSectionElement interface: existence and properties of interface object
-PASS HTMLTableSectionElement interface object length
-PASS HTMLTableSectionElement interface object name
-PASS HTMLTableSectionElement interface: existence and properties of interface prototype object
-PASS HTMLTableSectionElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLTableSectionElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLTableSectionElement interface: attribute rows
-PASS Unscopable handled correctly for rows property on HTMLTableSectionElement
-PASS HTMLTableSectionElement interface: operation insertRow(long)
-PASS Unscopable handled correctly for insertRow(long) on HTMLTableSectionElement
-PASS HTMLTableSectionElement interface: operation deleteRow(long)
-PASS Unscopable handled correctly for deleteRow(long) on HTMLTableSectionElement
-PASS HTMLTableSectionElement interface: attribute align
-PASS Unscopable handled correctly for align property on HTMLTableSectionElement
-PASS HTMLTableSectionElement interface: attribute ch
-PASS Unscopable handled correctly for ch property on HTMLTableSectionElement
-PASS HTMLTableSectionElement interface: attribute chOff
-PASS Unscopable handled correctly for chOff property on HTMLTableSectionElement
-PASS HTMLTableSectionElement interface: attribute vAlign
-PASS Unscopable handled correctly for vAlign property on HTMLTableSectionElement
-PASS HTMLTableSectionElement must be primary interface of document.createElement("tbody")
-PASS Stringification of document.createElement("tbody")
-PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "rows" with the proper type
-PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "insertRow(long)" with the proper type
-PASS HTMLTableSectionElement interface: calling insertRow(long) on document.createElement("tbody") with too few arguments must throw TypeError
-PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "deleteRow(long)" with the proper type
-PASS HTMLTableSectionElement interface: calling deleteRow(long) on document.createElement("tbody") with too few arguments must throw TypeError
-PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "align" with the proper type
-PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "ch" with the proper type
-PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "chOff" with the proper type
-PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "vAlign" with the proper type
-PASS HTMLTableSectionElement must be primary interface of document.createElement("thead")
-PASS Stringification of document.createElement("thead")
-PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "rows" with the proper type
-PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "insertRow(long)" with the proper type
-PASS HTMLTableSectionElement interface: calling insertRow(long) on document.createElement("thead") with too few arguments must throw TypeError
-PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "deleteRow(long)" with the proper type
-PASS HTMLTableSectionElement interface: calling deleteRow(long) on document.createElement("thead") with too few arguments must throw TypeError
-PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "align" with the proper type
-PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "ch" with the proper type
-PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "chOff" with the proper type
-PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "vAlign" with the proper type
-PASS HTMLTableSectionElement must be primary interface of document.createElement("tfoot")
-PASS Stringification of document.createElement("tfoot")
-PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "rows" with the proper type
-PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "insertRow(long)" with the proper type
-PASS HTMLTableSectionElement interface: calling insertRow(long) on document.createElement("tfoot") with too few arguments must throw TypeError
-PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "deleteRow(long)" with the proper type
-PASS HTMLTableSectionElement interface: calling deleteRow(long) on document.createElement("tfoot") with too few arguments must throw TypeError
-PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "align" with the proper type
-PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "ch" with the proper type
-PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "chOff" with the proper type
-PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "vAlign" with the proper type
-PASS HTMLTableRowElement interface: existence and properties of interface object
-PASS HTMLTableRowElement interface object length
-PASS HTMLTableRowElement interface object name
-PASS HTMLTableRowElement interface: existence and properties of interface prototype object
-PASS HTMLTableRowElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLTableRowElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLTableRowElement interface: attribute rowIndex
-PASS Unscopable handled correctly for rowIndex property on HTMLTableRowElement
-PASS HTMLTableRowElement interface: attribute sectionRowIndex
-PASS Unscopable handled correctly for sectionRowIndex property on HTMLTableRowElement
-PASS HTMLTableRowElement interface: attribute cells
-PASS Unscopable handled correctly for cells property on HTMLTableRowElement
-PASS HTMLTableRowElement interface: operation insertCell(long)
-PASS Unscopable handled correctly for insertCell(long) on HTMLTableRowElement
-PASS HTMLTableRowElement interface: operation deleteCell(long)
-PASS Unscopable handled correctly for deleteCell(long) on HTMLTableRowElement
-PASS HTMLTableRowElement interface: attribute align
-PASS Unscopable handled correctly for align property on HTMLTableRowElement
-PASS HTMLTableRowElement interface: attribute ch
-PASS Unscopable handled correctly for ch property on HTMLTableRowElement
-PASS HTMLTableRowElement interface: attribute chOff
-PASS Unscopable handled correctly for chOff property on HTMLTableRowElement
-PASS HTMLTableRowElement interface: attribute vAlign
-PASS Unscopable handled correctly for vAlign property on HTMLTableRowElement
-PASS HTMLTableRowElement interface: attribute bgColor
-PASS Unscopable handled correctly for bgColor property on HTMLTableRowElement
-PASS HTMLTableRowElement must be primary interface of document.createElement("tr")
-PASS Stringification of document.createElement("tr")
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "rowIndex" with the proper type
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "sectionRowIndex" with the proper type
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "cells" with the proper type
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "insertCell(long)" with the proper type
-PASS HTMLTableRowElement interface: calling insertCell(long) on document.createElement("tr") with too few arguments must throw TypeError
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "deleteCell(long)" with the proper type
-PASS HTMLTableRowElement interface: calling deleteCell(long) on document.createElement("tr") with too few arguments must throw TypeError
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "align" with the proper type
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "ch" with the proper type
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "chOff" with the proper type
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "vAlign" with the proper type
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "bgColor" with the proper type
-PASS HTMLTableCellElement interface: existence and properties of interface object
-PASS HTMLTableCellElement interface object length
-PASS HTMLTableCellElement interface object name
-PASS HTMLTableCellElement interface: existence and properties of interface prototype object
-PASS HTMLTableCellElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLTableCellElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLTableCellElement interface: attribute colSpan
-PASS Unscopable handled correctly for colSpan property on HTMLTableCellElement
-PASS HTMLTableCellElement interface: attribute rowSpan
-PASS Unscopable handled correctly for rowSpan property on HTMLTableCellElement
-PASS HTMLTableCellElement interface: attribute headers
-PASS Unscopable handled correctly for headers property on HTMLTableCellElement
-PASS HTMLTableCellElement interface: attribute cellIndex
-PASS Unscopable handled correctly for cellIndex property on HTMLTableCellElement
-PASS HTMLTableCellElement interface: attribute scope
-PASS Unscopable handled correctly for scope property on HTMLTableCellElement
-PASS HTMLTableCellElement interface: attribute abbr
-PASS Unscopable handled correctly for abbr property on HTMLTableCellElement
-PASS HTMLTableCellElement interface: attribute align
-PASS Unscopable handled correctly for align property on HTMLTableCellElement
-PASS HTMLTableCellElement interface: attribute axis
-PASS Unscopable handled correctly for axis property on HTMLTableCellElement
-PASS HTMLTableCellElement interface: attribute height
-PASS Unscopable handled correctly for height property on HTMLTableCellElement
-PASS HTMLTableCellElement interface: attribute width
-PASS Unscopable handled correctly for width property on HTMLTableCellElement
-PASS HTMLTableCellElement interface: attribute ch
-PASS Unscopable handled correctly for ch property on HTMLTableCellElement
-PASS HTMLTableCellElement interface: attribute chOff
-PASS Unscopable handled correctly for chOff property on HTMLTableCellElement
-PASS HTMLTableCellElement interface: attribute noWrap
-PASS Unscopable handled correctly for noWrap property on HTMLTableCellElement
-PASS HTMLTableCellElement interface: attribute vAlign
-PASS Unscopable handled correctly for vAlign property on HTMLTableCellElement
-PASS HTMLTableCellElement interface: attribute bgColor
-PASS Unscopable handled correctly for bgColor property on HTMLTableCellElement
-PASS HTMLTableCellElement must be primary interface of document.createElement("td")
-PASS Stringification of document.createElement("td")
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "colSpan" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "rowSpan" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "headers" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "cellIndex" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "scope" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "abbr" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "align" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "axis" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "height" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "width" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "ch" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "chOff" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "noWrap" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "vAlign" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "bgColor" with the proper type
-PASS HTMLTableCellElement must be primary interface of document.createElement("th")
-PASS Stringification of document.createElement("th")
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "colSpan" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "rowSpan" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "headers" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "cellIndex" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "scope" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "abbr" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "align" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "axis" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "height" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "width" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "ch" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "chOff" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "noWrap" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "vAlign" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "bgColor" with the proper type
-PASS HTMLFormElement interface: existence and properties of interface object
-PASS HTMLFormElement interface object length
-PASS HTMLFormElement interface object name
-PASS HTMLFormElement interface: existence and properties of interface prototype object
-PASS HTMLFormElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLFormElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLFormElement interface: attribute acceptCharset
-PASS Unscopable handled correctly for acceptCharset property on HTMLFormElement
-PASS HTMLFormElement interface: attribute action
-PASS Unscopable handled correctly for action property on HTMLFormElement
-PASS HTMLFormElement interface: attribute autocomplete
-PASS Unscopable handled correctly for autocomplete property on HTMLFormElement
-PASS HTMLFormElement interface: attribute enctype
-PASS Unscopable handled correctly for enctype property on HTMLFormElement
-PASS HTMLFormElement interface: attribute encoding
-PASS Unscopable handled correctly for encoding property on HTMLFormElement
-PASS HTMLFormElement interface: attribute method
-PASS Unscopable handled correctly for method property on HTMLFormElement
-PASS HTMLFormElement interface: attribute name
-PASS Unscopable handled correctly for name property on HTMLFormElement
-PASS HTMLFormElement interface: attribute noValidate
-PASS Unscopable handled correctly for noValidate property on HTMLFormElement
-PASS HTMLFormElement interface: attribute target
-PASS Unscopable handled correctly for target property on HTMLFormElement
-PASS HTMLFormElement interface: attribute elements
-PASS Unscopable handled correctly for elements property on HTMLFormElement
-PASS HTMLFormElement interface: attribute length
-PASS Unscopable handled correctly for length property on HTMLFormElement
-PASS HTMLFormElement interface: operation submit()
-PASS Unscopable handled correctly for submit() on HTMLFormElement
-PASS HTMLFormElement interface: operation reset()
-PASS Unscopable handled correctly for reset() on HTMLFormElement
-PASS HTMLFormElement interface: operation checkValidity()
-PASS Unscopable handled correctly for checkValidity() on HTMLFormElement
-PASS HTMLFormElement interface: operation reportValidity()
-PASS Unscopable handled correctly for reportValidity() on HTMLFormElement
-PASS HTMLFormElement must be primary interface of document.createElement("form")
-PASS Stringification of document.createElement("form")
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "acceptCharset" with the proper type
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "action" with the proper type
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "autocomplete" with the proper type
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "enctype" with the proper type
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "encoding" with the proper type
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "method" with the proper type
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "name" with the proper type
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "noValidate" with the proper type
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "target" with the proper type
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "elements" with the proper type
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "length" with the proper type
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "submit()" with the proper type
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "reset()" with the proper type
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "checkValidity()" with the proper type
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "reportValidity()" with the proper type
-PASS HTMLLabelElement interface: existence and properties of interface object
-PASS HTMLLabelElement interface object length
-PASS HTMLLabelElement interface object name
-PASS HTMLLabelElement interface: existence and properties of interface prototype object
-PASS HTMLLabelElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLLabelElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLLabelElement interface: attribute form
-PASS Unscopable handled correctly for form property on HTMLLabelElement
-PASS HTMLLabelElement interface: attribute htmlFor
-PASS Unscopable handled correctly for htmlFor property on HTMLLabelElement
-PASS HTMLLabelElement interface: attribute control
-PASS Unscopable handled correctly for control property on HTMLLabelElement
-PASS HTMLLabelElement must be primary interface of document.createElement("label")
-PASS Stringification of document.createElement("label")
-PASS HTMLLabelElement interface: document.createElement("label") must inherit property "form" with the proper type
-PASS HTMLLabelElement interface: document.createElement("label") must inherit property "htmlFor" with the proper type
-PASS HTMLLabelElement interface: document.createElement("label") must inherit property "control" with the proper type
-PASS HTMLInputElement interface: existence and properties of interface object
-PASS HTMLInputElement interface object length
-PASS HTMLInputElement interface object name
-PASS HTMLInputElement interface: existence and properties of interface prototype object
-PASS HTMLInputElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLInputElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLInputElement interface: attribute accept
-PASS Unscopable handled correctly for accept property on HTMLInputElement
-PASS HTMLInputElement interface: attribute alt
-PASS Unscopable handled correctly for alt property on HTMLInputElement
-PASS HTMLInputElement interface: attribute autocomplete
-PASS Unscopable handled correctly for autocomplete property on HTMLInputElement
-PASS HTMLInputElement interface: attribute autofocus
-PASS Unscopable handled correctly for autofocus property on HTMLInputElement
-PASS HTMLInputElement interface: attribute defaultChecked
-PASS Unscopable handled correctly for defaultChecked property on HTMLInputElement
-PASS HTMLInputElement interface: attribute checked
-PASS Unscopable handled correctly for checked property on HTMLInputElement
-PASS HTMLInputElement interface: attribute dirName
-PASS Unscopable handled correctly for dirName property on HTMLInputElement
-PASS HTMLInputElement interface: attribute disabled
-PASS Unscopable handled correctly for disabled property on HTMLInputElement
-PASS HTMLInputElement interface: attribute form
-PASS Unscopable handled correctly for form property on HTMLInputElement
-PASS HTMLInputElement interface: attribute files
-PASS Unscopable handled correctly for files property on HTMLInputElement
-PASS HTMLInputElement interface: attribute formAction
-PASS Unscopable handled correctly for formAction property on HTMLInputElement
-PASS HTMLInputElement interface: attribute formEnctype
-PASS Unscopable handled correctly for formEnctype property on HTMLInputElement
-PASS HTMLInputElement interface: attribute formMethod
-PASS Unscopable handled correctly for formMethod property on HTMLInputElement
-PASS HTMLInputElement interface: attribute formNoValidate
-PASS Unscopable handled correctly for formNoValidate property on HTMLInputElement
-PASS HTMLInputElement interface: attribute formTarget
-PASS Unscopable handled correctly for formTarget property on HTMLInputElement
-PASS HTMLInputElement interface: attribute height
-PASS Unscopable handled correctly for height property on HTMLInputElement
-PASS HTMLInputElement interface: attribute indeterminate
-PASS Unscopable handled correctly for indeterminate property on HTMLInputElement
-PASS HTMLInputElement interface: attribute list
-PASS Unscopable handled correctly for list property on HTMLInputElement
-PASS HTMLInputElement interface: attribute max
-PASS Unscopable handled correctly for max property on HTMLInputElement
-PASS HTMLInputElement interface: attribute maxLength
-PASS Unscopable handled correctly for maxLength property on HTMLInputElement
-PASS HTMLInputElement interface: attribute min
-PASS Unscopable handled correctly for min property on HTMLInputElement
-PASS HTMLInputElement interface: attribute minLength
-PASS Unscopable handled correctly for minLength property on HTMLInputElement
-PASS HTMLInputElement interface: attribute multiple
-PASS Unscopable handled correctly for multiple property on HTMLInputElement
-PASS HTMLInputElement interface: attribute name
-PASS Unscopable handled correctly for name property on HTMLInputElement
-PASS HTMLInputElement interface: attribute pattern
-PASS Unscopable handled correctly for pattern property on HTMLInputElement
-PASS HTMLInputElement interface: attribute placeholder
-PASS Unscopable handled correctly for placeholder property on HTMLInputElement
-PASS HTMLInputElement interface: attribute readOnly
-PASS Unscopable handled correctly for readOnly property on HTMLInputElement
-PASS HTMLInputElement interface: attribute required
-PASS Unscopable handled correctly for required property on HTMLInputElement
-PASS HTMLInputElement interface: attribute size
-PASS Unscopable handled correctly for size property on HTMLInputElement
-PASS HTMLInputElement interface: attribute src
-PASS Unscopable handled correctly for src property on HTMLInputElement
-PASS HTMLInputElement interface: attribute step
-PASS Unscopable handled correctly for step property on HTMLInputElement
-PASS HTMLInputElement interface: attribute type
-PASS Unscopable handled correctly for type property on HTMLInputElement
-PASS HTMLInputElement interface: attribute defaultValue
-PASS Unscopable handled correctly for defaultValue property on HTMLInputElement
-PASS HTMLInputElement interface: attribute value
-PASS Unscopable handled correctly for value property on HTMLInputElement
-PASS HTMLInputElement interface: attribute valueAsDate
-PASS Unscopable handled correctly for valueAsDate property on HTMLInputElement
-PASS HTMLInputElement interface: attribute valueAsNumber
-PASS Unscopable handled correctly for valueAsNumber property on HTMLInputElement
-PASS HTMLInputElement interface: attribute width
-PASS Unscopable handled correctly for width property on HTMLInputElement
-PASS HTMLInputElement interface: operation stepUp(long)
-PASS Unscopable handled correctly for stepUp(long) on HTMLInputElement
-PASS HTMLInputElement interface: operation stepDown(long)
-PASS Unscopable handled correctly for stepDown(long) on HTMLInputElement
-PASS HTMLInputElement interface: attribute willValidate
-PASS Unscopable handled correctly for willValidate property on HTMLInputElement
-PASS HTMLInputElement interface: attribute validity
-PASS Unscopable handled correctly for validity property on HTMLInputElement
-PASS HTMLInputElement interface: attribute validationMessage
-PASS Unscopable handled correctly for validationMessage property on HTMLInputElement
-PASS HTMLInputElement interface: operation checkValidity()
-PASS Unscopable handled correctly for checkValidity() on HTMLInputElement
-PASS HTMLInputElement interface: operation reportValidity()
-PASS Unscopable handled correctly for reportValidity() on HTMLInputElement
-PASS HTMLInputElement interface: operation setCustomValidity(DOMString)
-PASS Unscopable handled correctly for setCustomValidity(DOMString) on HTMLInputElement
-PASS HTMLInputElement interface: attribute labels
-PASS Unscopable handled correctly for labels property on HTMLInputElement
-PASS HTMLInputElement interface: operation select()
-PASS Unscopable handled correctly for select() on HTMLInputElement
-PASS HTMLInputElement interface: attribute selectionStart
-PASS Unscopable handled correctly for selectionStart property on HTMLInputElement
-PASS HTMLInputElement interface: attribute selectionEnd
-PASS Unscopable handled correctly for selectionEnd property on HTMLInputElement
-PASS HTMLInputElement interface: attribute selectionDirection
-PASS Unscopable handled correctly for selectionDirection property on HTMLInputElement
-PASS HTMLInputElement interface: operation setRangeText(DOMString)
-PASS Unscopable handled correctly for setRangeText(DOMString) on HTMLInputElement
-PASS HTMLInputElement interface: operation setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)
-PASS Unscopable handled correctly for setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on HTMLInputElement
-PASS HTMLInputElement interface: operation setSelectionRange(unsigned long, unsigned long, DOMString)
-PASS Unscopable handled correctly for setSelectionRange(unsigned long, unsigned long, DOMString) on HTMLInputElement
-PASS HTMLInputElement interface: attribute align
-PASS Unscopable handled correctly for align property on HTMLInputElement
-PASS HTMLInputElement interface: attribute useMap
-PASS Unscopable handled correctly for useMap property on HTMLInputElement
-PASS HTMLInputElement must be primary interface of document.createElement("input")
-PASS Stringification of document.createElement("input")
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on document.createElement("input") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on document.createElement("input") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on document.createElement("input") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on document.createElement("input") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on document.createElement("input") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on document.createElement("input") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("text")
-PASS Stringification of createInput("text")
-PASS HTMLInputElement interface: createInput("text") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("text") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("text") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("text") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("text") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("text") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("text") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("text") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("text") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("text") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("text") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("text") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("text") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("hidden")
-PASS Stringification of createInput("hidden")
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("hidden") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("hidden") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("hidden") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("hidden") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("hidden") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("hidden") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("search")
-PASS Stringification of createInput("search")
-PASS HTMLInputElement interface: createInput("search") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("search") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("search") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("search") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("search") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("search") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("search") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("search") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("search") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("search") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("search") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("search") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("search") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("tel")
-PASS Stringification of createInput("tel")
-PASS HTMLInputElement interface: createInput("tel") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("tel") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("tel") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("tel") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("tel") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("tel") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("tel") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("tel") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("tel") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("tel") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("tel") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("tel") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("tel") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("url")
-PASS Stringification of createInput("url")
-PASS HTMLInputElement interface: createInput("url") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("url") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("url") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("url") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("url") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("url") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("url") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("url") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("url") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("url") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("url") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("url") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("url") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("email")
-PASS Stringification of createInput("email")
-PASS HTMLInputElement interface: createInput("email") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("email") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("email") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("email") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("email") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("email") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("email") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("email") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("email") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("email") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("email") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("email") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("email") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("password")
-PASS Stringification of createInput("password")
-PASS HTMLInputElement interface: createInput("password") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("password") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("password") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("password") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("password") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("password") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("password") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("password") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("password") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("password") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("password") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("password") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("password") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("date")
-PASS Stringification of createInput("date")
-PASS HTMLInputElement interface: createInput("date") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("date") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("date") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("date") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("date") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("date") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("date") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("date") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("date") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("date") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("date") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("date") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("date") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("month")
-PASS Stringification of createInput("month")
-PASS HTMLInputElement interface: createInput("month") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("month") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("month") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("month") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("month") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("month") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("month") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("month") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("month") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("month") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("month") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("month") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("month") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("week")
-PASS Stringification of createInput("week")
-PASS HTMLInputElement interface: createInput("week") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("week") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("week") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("week") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("week") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("week") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("week") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("week") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("week") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("week") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("week") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("week") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("week") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("time")
-PASS Stringification of createInput("time")
-PASS HTMLInputElement interface: createInput("time") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("time") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("time") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("time") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("time") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("time") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("time") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("time") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("time") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("time") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("time") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("time") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("time") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("datetime-local")
-PASS Stringification of createInput("datetime-local")
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("datetime-local") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("datetime-local") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("datetime-local") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("datetime-local") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("datetime-local") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("datetime-local") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("number")
-PASS Stringification of createInput("number")
-PASS HTMLInputElement interface: createInput("number") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("number") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("number") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("number") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("number") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("number") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("number") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("number") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("number") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("number") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("number") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("number") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("number") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("range")
-PASS Stringification of createInput("range")
-PASS HTMLInputElement interface: createInput("range") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("range") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("range") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("range") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("range") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("range") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("range") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("range") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("range") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("range") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("range") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("range") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("range") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("color")
-PASS Stringification of createInput("color")
-PASS HTMLInputElement interface: createInput("color") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("color") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("color") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("color") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("color") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("color") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("color") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("color") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("color") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("color") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("color") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("color") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("color") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("checkbox")
-PASS Stringification of createInput("checkbox")
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("checkbox") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("checkbox") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("checkbox") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("checkbox") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("checkbox") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("checkbox") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("radio")
-PASS Stringification of createInput("radio")
-PASS HTMLInputElement interface: createInput("radio") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("radio") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("radio") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("radio") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("radio") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("radio") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("radio") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("radio") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("radio") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("radio") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("radio") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("radio") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("radio") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("file")
-PASS Stringification of createInput("file")
-PASS HTMLInputElement interface: createInput("file") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "form" with the proper type
-FAIL HTMLInputElement interface: createInput("file") must inherit property "files" with the proper type Unrecognized type FileList
-PASS HTMLInputElement interface: createInput("file") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("file") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("file") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("file") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("file") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("file") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("file") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("file") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("file") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("file") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("file") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("file") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("file") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("submit")
-PASS Stringification of createInput("submit")
-PASS HTMLInputElement interface: createInput("submit") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("submit") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("submit") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("submit") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("submit") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("submit") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("submit") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("submit") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("submit") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("submit") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("submit") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("submit") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("submit") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("image")
-PASS Stringification of createInput("image")
-PASS HTMLInputElement interface: createInput("image") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("image") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("image") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("image") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("image") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("image") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("image") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("image") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("image") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("image") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("image") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("image") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("image") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("reset")
-PASS Stringification of createInput("reset")
-PASS HTMLInputElement interface: createInput("reset") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("reset") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("reset") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("reset") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("reset") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("reset") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("reset") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("reset") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("reset") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("reset") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("reset") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("reset") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("reset") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("button")
-PASS Stringification of createInput("button")
-PASS HTMLInputElement interface: createInput("button") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("button") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("button") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("button") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("button") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("button") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("button") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("button") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("button") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("button") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("button") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("button") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("button") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "useMap" with the proper type
-PASS HTMLButtonElement interface: existence and properties of interface object
-PASS HTMLButtonElement interface object length
-PASS HTMLButtonElement interface object name
-PASS HTMLButtonElement interface: existence and properties of interface prototype object
-PASS HTMLButtonElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLButtonElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLButtonElement interface: attribute autofocus
-PASS Unscopable handled correctly for autofocus property on HTMLButtonElement
-PASS HTMLButtonElement interface: attribute disabled
-PASS Unscopable handled correctly for disabled property on HTMLButtonElement
-PASS HTMLButtonElement interface: attribute form
-PASS Unscopable handled correctly for form property on HTMLButtonElement
-PASS HTMLButtonElement interface: attribute formAction
-PASS Unscopable handled correctly for formAction property on HTMLButtonElement
-PASS HTMLButtonElement interface: attribute formEnctype
-PASS Unscopable handled correctly for formEnctype property on HTMLButtonElement
-PASS HTMLButtonElement interface: attribute formMethod
-PASS Unscopable handled correctly for formMethod property on HTMLButtonElement
-PASS HTMLButtonElement interface: attribute formNoValidate
-PASS Unscopable handled correctly for formNoValidate property on HTMLButtonElement
-PASS HTMLButtonElement interface: attribute formTarget
-PASS Unscopable handled correctly for formTarget property on HTMLButtonElement
-PASS HTMLButtonElement interface: attribute name
-PASS Unscopable handled correctly for name property on HTMLButtonElement
-PASS HTMLButtonElement interface: attribute type
-PASS Unscopable handled correctly for type property on HTMLButtonElement
-PASS HTMLButtonElement interface: attribute value
-PASS Unscopable handled correctly for value property on HTMLButtonElement
-PASS HTMLButtonElement interface: attribute willValidate
-PASS Unscopable handled correctly for willValidate property on HTMLButtonElement
-PASS HTMLButtonElement interface: attribute validity
-PASS Unscopable handled correctly for validity property on HTMLButtonElement
-PASS HTMLButtonElement interface: attribute validationMessage
-PASS Unscopable handled correctly for validationMessage property on HTMLButtonElement
-PASS HTMLButtonElement interface: operation checkValidity()
-PASS Unscopable handled correctly for checkValidity() on HTMLButtonElement
-PASS HTMLButtonElement interface: operation reportValidity()
-PASS Unscopable handled correctly for reportValidity() on HTMLButtonElement
-PASS HTMLButtonElement interface: operation setCustomValidity(DOMString)
-PASS Unscopable handled correctly for setCustomValidity(DOMString) on HTMLButtonElement
-PASS HTMLButtonElement interface: attribute labels
-PASS Unscopable handled correctly for labels property on HTMLButtonElement
-PASS HTMLButtonElement must be primary interface of document.createElement("button")
-PASS Stringification of document.createElement("button")
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "autofocus" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "disabled" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "form" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formAction" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formEnctype" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formMethod" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formNoValidate" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formTarget" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "name" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "type" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "value" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "willValidate" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "validity" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "validationMessage" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "checkValidity()" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "reportValidity()" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLButtonElement interface: calling setCustomValidity(DOMString) on document.createElement("button") with too few arguments must throw TypeError
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "labels" with the proper type
-PASS HTMLSelectElement interface: existence and properties of interface object
-PASS HTMLSelectElement interface object length
-PASS HTMLSelectElement interface object name
-PASS HTMLSelectElement interface: existence and properties of interface prototype object
-PASS HTMLSelectElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLSelectElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLSelectElement interface: attribute autocomplete
-PASS Unscopable handled correctly for autocomplete property on HTMLSelectElement
-PASS HTMLSelectElement interface: attribute autofocus
-PASS Unscopable handled correctly for autofocus property on HTMLSelectElement
-PASS HTMLSelectElement interface: attribute disabled
-PASS Unscopable handled correctly for disabled property on HTMLSelectElement
-PASS HTMLSelectElement interface: attribute form
-PASS Unscopable handled correctly for form property on HTMLSelectElement
-PASS HTMLSelectElement interface: attribute multiple
-PASS Unscopable handled correctly for multiple property on HTMLSelectElement
-PASS HTMLSelectElement interface: attribute name
-PASS Unscopable handled correctly for name property on HTMLSelectElement
-PASS HTMLSelectElement interface: attribute required
-PASS Unscopable handled correctly for required property on HTMLSelectElement
-PASS HTMLSelectElement interface: attribute size
-PASS Unscopable handled correctly for size property on HTMLSelectElement
-PASS HTMLSelectElement interface: attribute type
-PASS Unscopable handled correctly for type property on HTMLSelectElement
-PASS HTMLSelectElement interface: attribute options
-PASS Unscopable handled correctly for options property on HTMLSelectElement
-PASS HTMLSelectElement interface: attribute length
-PASS Unscopable handled correctly for length property on HTMLSelectElement
-PASS HTMLSelectElement interface: operation item(unsigned long)
-PASS Unscopable handled correctly for item(unsigned long) on HTMLSelectElement
-PASS HTMLSelectElement interface: operation namedItem(DOMString)
-PASS Unscopable handled correctly for namedItem(DOMString) on HTMLSelectElement
-PASS HTMLSelectElement interface: operation add([object Object],[object Object], [object Object],[object Object])
-PASS Unscopable handled correctly for add([object Object],[object Object], [object Object],[object Object]) on HTMLSelectElement
-PASS HTMLSelectElement interface: operation remove()
-PASS Unscopable handled correctly for remove() on HTMLSelectElement
-PASS HTMLSelectElement interface: operation remove(long)
-PASS Unscopable handled correctly for remove(long) on HTMLSelectElement
-PASS HTMLSelectElement interface: attribute selectedOptions
-PASS Unscopable handled correctly for selectedOptions property on HTMLSelectElement
-PASS HTMLSelectElement interface: attribute selectedIndex
-PASS Unscopable handled correctly for selectedIndex property on HTMLSelectElement
-PASS HTMLSelectElement interface: attribute value
-PASS Unscopable handled correctly for value property on HTMLSelectElement
-PASS HTMLSelectElement interface: attribute willValidate
-PASS Unscopable handled correctly for willValidate property on HTMLSelectElement
-PASS HTMLSelectElement interface: attribute validity
-PASS Unscopable handled correctly for validity property on HTMLSelectElement
-PASS HTMLSelectElement interface: attribute validationMessage
-PASS Unscopable handled correctly for validationMessage property on HTMLSelectElement
-PASS HTMLSelectElement interface: operation checkValidity()
-PASS Unscopable handled correctly for checkValidity() on HTMLSelectElement
-PASS HTMLSelectElement interface: operation reportValidity()
-PASS Unscopable handled correctly for reportValidity() on HTMLSelectElement
-PASS HTMLSelectElement interface: operation setCustomValidity(DOMString)
-PASS Unscopable handled correctly for setCustomValidity(DOMString) on HTMLSelectElement
-PASS HTMLSelectElement interface: attribute labels
-PASS Unscopable handled correctly for labels property on HTMLSelectElement
-PASS HTMLSelectElement must be primary interface of document.createElement("select")
-PASS Stringification of document.createElement("select")
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "autocomplete" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "autofocus" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "disabled" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "form" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "multiple" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "name" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "required" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "size" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "type" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "options" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "length" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "item(unsigned long)" with the proper type
-PASS HTMLSelectElement interface: calling item(unsigned long) on document.createElement("select") with too few arguments must throw TypeError
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "namedItem(DOMString)" with the proper type
-PASS HTMLSelectElement interface: calling namedItem(DOMString) on document.createElement("select") with too few arguments must throw TypeError
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "add([object Object],[object Object], [object Object],[object Object])" with the proper type
-PASS HTMLSelectElement interface: calling add([object Object],[object Object], [object Object],[object Object]) on document.createElement("select") with too few arguments must throw TypeError
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "remove()" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "remove(long)" with the proper type
-PASS HTMLSelectElement interface: calling remove(long) on document.createElement("select") with too few arguments must throw TypeError
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "selectedOptions" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "selectedIndex" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "value" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "willValidate" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "validity" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "validationMessage" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "checkValidity()" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "reportValidity()" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLSelectElement interface: calling setCustomValidity(DOMString) on document.createElement("select") with too few arguments must throw TypeError
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "labels" with the proper type
-PASS HTMLDataListElement interface: existence and properties of interface object
-PASS HTMLDataListElement interface object length
-PASS HTMLDataListElement interface object name
-PASS HTMLDataListElement interface: existence and properties of interface prototype object
-PASS HTMLDataListElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLDataListElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLDataListElement interface: attribute options
-PASS Unscopable handled correctly for options property on HTMLDataListElement
-PASS HTMLDataListElement must be primary interface of document.createElement("datalist")
-PASS Stringification of document.createElement("datalist")
-PASS HTMLDataListElement interface: document.createElement("datalist") must inherit property "options" with the proper type
-PASS HTMLOptGroupElement interface: existence and properties of interface object
-PASS HTMLOptGroupElement interface object length
-PASS HTMLOptGroupElement interface object name
-PASS HTMLOptGroupElement interface: existence and properties of interface prototype object
-PASS HTMLOptGroupElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLOptGroupElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLOptGroupElement interface: attribute disabled
-PASS Unscopable handled correctly for disabled property on HTMLOptGroupElement
-PASS HTMLOptGroupElement interface: attribute label
-PASS Unscopable handled correctly for label property on HTMLOptGroupElement
-PASS HTMLOptGroupElement must be primary interface of document.createElement("optgroup")
-PASS Stringification of document.createElement("optgroup")
-PASS HTMLOptGroupElement interface: document.createElement("optgroup") must inherit property "disabled" with the proper type
-PASS HTMLOptGroupElement interface: document.createElement("optgroup") must inherit property "label" with the proper type
-PASS HTMLOptionElement interface: existence and properties of interface object
-PASS HTMLOptionElement interface object length
-PASS HTMLOptionElement interface object name
-PASS HTMLOptionElement interface: existence and properties of interface prototype object
-PASS HTMLOptionElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLOptionElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLOptionElement interface: attribute disabled
-PASS Unscopable handled correctly for disabled property on HTMLOptionElement
-PASS HTMLOptionElement interface: attribute form
-PASS Unscopable handled correctly for form property on HTMLOptionElement
-PASS HTMLOptionElement interface: attribute label
-PASS Unscopable handled correctly for label property on HTMLOptionElement
-PASS HTMLOptionElement interface: attribute defaultSelected
-PASS Unscopable handled correctly for defaultSelected property on HTMLOptionElement
-PASS HTMLOptionElement interface: attribute selected
-PASS Unscopable handled correctly for selected property on HTMLOptionElement
-PASS HTMLOptionElement interface: attribute value
-PASS Unscopable handled correctly for value property on HTMLOptionElement
-PASS HTMLOptionElement interface: attribute text
-PASS Unscopable handled correctly for text property on HTMLOptionElement
-PASS HTMLOptionElement interface: attribute index
-PASS Unscopable handled correctly for index property on HTMLOptionElement
-PASS HTMLOptionElement must be primary interface of document.createElement("option")
-PASS Stringification of document.createElement("option")
-PASS HTMLOptionElement interface: document.createElement("option") must inherit property "disabled" with the proper type
-PASS HTMLOptionElement interface: document.createElement("option") must inherit property "form" with the proper type
-PASS HTMLOptionElement interface: document.createElement("option") must inherit property "label" with the proper type
-PASS HTMLOptionElement interface: document.createElement("option") must inherit property "defaultSelected" with the proper type
-PASS HTMLOptionElement interface: document.createElement("option") must inherit property "selected" with the proper type
-PASS HTMLOptionElement interface: document.createElement("option") must inherit property "value" with the proper type
-PASS HTMLOptionElement interface: document.createElement("option") must inherit property "text" with the proper type
-PASS HTMLOptionElement interface: document.createElement("option") must inherit property "index" with the proper type
-PASS HTMLOptionElement must be primary interface of new Option()
-PASS Stringification of new Option()
-PASS HTMLOptionElement interface: new Option() must inherit property "disabled" with the proper type
-PASS HTMLOptionElement interface: new Option() must inherit property "form" with the proper type
-PASS HTMLOptionElement interface: new Option() must inherit property "label" with the proper type
-PASS HTMLOptionElement interface: new Option() must inherit property "defaultSelected" with the proper type
-PASS HTMLOptionElement interface: new Option() must inherit property "selected" with the proper type
-PASS HTMLOptionElement interface: new Option() must inherit property "value" with the proper type
-PASS HTMLOptionElement interface: new Option() must inherit property "text" with the proper type
-PASS HTMLOptionElement interface: new Option() must inherit property "index" with the proper type
-PASS HTMLTextAreaElement interface: existence and properties of interface object
-PASS HTMLTextAreaElement interface object length
-PASS HTMLTextAreaElement interface object name
-PASS HTMLTextAreaElement interface: existence and properties of interface prototype object
-PASS HTMLTextAreaElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLTextAreaElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLTextAreaElement interface: attribute autocomplete
-PASS Unscopable handled correctly for autocomplete property on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: attribute autofocus
-PASS Unscopable handled correctly for autofocus property on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: attribute cols
-PASS Unscopable handled correctly for cols property on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: attribute dirName
-PASS Unscopable handled correctly for dirName property on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: attribute disabled
-PASS Unscopable handled correctly for disabled property on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: attribute form
-PASS Unscopable handled correctly for form property on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: attribute maxLength
-PASS Unscopable handled correctly for maxLength property on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: attribute minLength
-PASS Unscopable handled correctly for minLength property on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: attribute name
-PASS Unscopable handled correctly for name property on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: attribute placeholder
-PASS Unscopable handled correctly for placeholder property on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: attribute readOnly
-PASS Unscopable handled correctly for readOnly property on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: attribute required
-PASS Unscopable handled correctly for required property on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: attribute rows
-PASS Unscopable handled correctly for rows property on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: attribute wrap
-PASS Unscopable handled correctly for wrap property on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: attribute type
-PASS Unscopable handled correctly for type property on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: attribute defaultValue
-PASS Unscopable handled correctly for defaultValue property on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: attribute value
-PASS Unscopable handled correctly for value property on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: attribute textLength
-PASS Unscopable handled correctly for textLength property on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: attribute willValidate
-PASS Unscopable handled correctly for willValidate property on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: attribute validity
-PASS Unscopable handled correctly for validity property on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: attribute validationMessage
-PASS Unscopable handled correctly for validationMessage property on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: operation checkValidity()
-PASS Unscopable handled correctly for checkValidity() on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: operation reportValidity()
-PASS Unscopable handled correctly for reportValidity() on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: operation setCustomValidity(DOMString)
-PASS Unscopable handled correctly for setCustomValidity(DOMString) on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: attribute labels
-PASS Unscopable handled correctly for labels property on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: operation select()
-PASS Unscopable handled correctly for select() on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: attribute selectionStart
-PASS Unscopable handled correctly for selectionStart property on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: attribute selectionEnd
-PASS Unscopable handled correctly for selectionEnd property on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: attribute selectionDirection
-PASS Unscopable handled correctly for selectionDirection property on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: operation setRangeText(DOMString)
-PASS Unscopable handled correctly for setRangeText(DOMString) on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: operation setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)
-PASS Unscopable handled correctly for setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on HTMLTextAreaElement
-PASS HTMLTextAreaElement interface: operation setSelectionRange(unsigned long, unsigned long, DOMString)
-PASS Unscopable handled correctly for setSelectionRange(unsigned long, unsigned long, DOMString) on HTMLTextAreaElement
-PASS HTMLTextAreaElement must be primary interface of document.createElement("textarea")
-PASS Stringification of document.createElement("textarea")
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "autocomplete" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "autofocus" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "cols" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "dirName" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "disabled" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "form" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "maxLength" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "minLength" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "name" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "placeholder" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "readOnly" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "required" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "rows" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "wrap" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "type" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "defaultValue" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "value" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "textLength" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "willValidate" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "validity" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "validationMessage" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "checkValidity()" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "reportValidity()" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLTextAreaElement interface: calling setCustomValidity(DOMString) on document.createElement("textarea") with too few arguments must throw TypeError
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "labels" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "select()" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "selectionStart" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "selectionEnd" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "selectionDirection" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLTextAreaElement interface: calling setRangeText(DOMString) on document.createElement("textarea") with too few arguments must throw TypeError
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLTextAreaElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on document.createElement("textarea") with too few arguments must throw TypeError
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLTextAreaElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on document.createElement("textarea") with too few arguments must throw TypeError
-PASS HTMLOutputElement interface: existence and properties of interface object
-PASS HTMLOutputElement interface object length
-PASS HTMLOutputElement interface object name
-PASS HTMLOutputElement interface: existence and properties of interface prototype object
-PASS HTMLOutputElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLOutputElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLOutputElement interface: attribute htmlFor
-PASS Unscopable handled correctly for htmlFor property on HTMLOutputElement
-PASS HTMLOutputElement interface: attribute form
-PASS Unscopable handled correctly for form property on HTMLOutputElement
-PASS HTMLOutputElement interface: attribute name
-PASS Unscopable handled correctly for name property on HTMLOutputElement
-PASS HTMLOutputElement interface: attribute type
-PASS Unscopable handled correctly for type property on HTMLOutputElement
-PASS HTMLOutputElement interface: attribute defaultValue
-PASS Unscopable handled correctly for defaultValue property on HTMLOutputElement
-PASS HTMLOutputElement interface: attribute value
-PASS Unscopable handled correctly for value property on HTMLOutputElement
-PASS HTMLOutputElement interface: attribute willValidate
-PASS Unscopable handled correctly for willValidate property on HTMLOutputElement
-PASS HTMLOutputElement interface: attribute validity
-PASS Unscopable handled correctly for validity property on HTMLOutputElement
-PASS HTMLOutputElement interface: attribute validationMessage
-PASS Unscopable handled correctly for validationMessage property on HTMLOutputElement
-PASS HTMLOutputElement interface: operation checkValidity()
-PASS Unscopable handled correctly for checkValidity() on HTMLOutputElement
-PASS HTMLOutputElement interface: operation reportValidity()
-PASS Unscopable handled correctly for reportValidity() on HTMLOutputElement
-PASS HTMLOutputElement interface: operation setCustomValidity(DOMString)
-PASS Unscopable handled correctly for setCustomValidity(DOMString) on HTMLOutputElement
-PASS HTMLOutputElement interface: attribute labels
-PASS Unscopable handled correctly for labels property on HTMLOutputElement
-PASS HTMLOutputElement must be primary interface of document.createElement("output")
-PASS Stringification of document.createElement("output")
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "htmlFor" with the proper type
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "form" with the proper type
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "name" with the proper type
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "type" with the proper type
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "defaultValue" with the proper type
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "value" with the proper type
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "willValidate" with the proper type
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "validity" with the proper type
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "validationMessage" with the proper type
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "checkValidity()" with the proper type
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "reportValidity()" with the proper type
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLOutputElement interface: calling setCustomValidity(DOMString) on document.createElement("output") with too few arguments must throw TypeError
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "labels" with the proper type
-PASS HTMLProgressElement interface: existence and properties of interface object
-PASS HTMLProgressElement interface object length
-PASS HTMLProgressElement interface object name
-PASS HTMLProgressElement interface: existence and properties of interface prototype object
-PASS HTMLProgressElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLProgressElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLProgressElement interface: attribute value
-PASS Unscopable handled correctly for value property on HTMLProgressElement
-PASS HTMLProgressElement interface: attribute max
-PASS Unscopable handled correctly for max property on HTMLProgressElement
-PASS HTMLProgressElement interface: attribute position
-PASS Unscopable handled correctly for position property on HTMLProgressElement
-PASS HTMLProgressElement interface: attribute labels
-PASS Unscopable handled correctly for labels property on HTMLProgressElement
-PASS HTMLProgressElement must be primary interface of document.createElement("progress")
-PASS Stringification of document.createElement("progress")
-PASS HTMLProgressElement interface: document.createElement("progress") must inherit property "value" with the proper type
-PASS HTMLProgressElement interface: document.createElement("progress") must inherit property "max" with the proper type
-PASS HTMLProgressElement interface: document.createElement("progress") must inherit property "position" with the proper type
-PASS HTMLProgressElement interface: document.createElement("progress") must inherit property "labels" with the proper type
-PASS HTMLMeterElement interface: existence and properties of interface object
-PASS HTMLMeterElement interface object length
-PASS HTMLMeterElement interface object name
-PASS HTMLMeterElement interface: existence and properties of interface prototype object
-PASS HTMLMeterElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLMeterElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLMeterElement interface: attribute value
-PASS Unscopable handled correctly for value property on HTMLMeterElement
-PASS HTMLMeterElement interface: attribute min
-PASS Unscopable handled correctly for min property on HTMLMeterElement
-PASS HTMLMeterElement interface: attribute max
-PASS Unscopable handled correctly for max property on HTMLMeterElement
-PASS HTMLMeterElement interface: attribute low
-PASS Unscopable handled correctly for low property on HTMLMeterElement
-PASS HTMLMeterElement interface: attribute high
-PASS Unscopable handled correctly for high property on HTMLMeterElement
-PASS HTMLMeterElement interface: attribute optimum
-PASS Unscopable handled correctly for optimum property on HTMLMeterElement
-PASS HTMLMeterElement interface: attribute labels
-PASS Unscopable handled correctly for labels property on HTMLMeterElement
-PASS HTMLMeterElement must be primary interface of document.createElement("meter")
-PASS Stringification of document.createElement("meter")
-PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "value" with the proper type
-PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "min" with the proper type
-PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "max" with the proper type
-PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "low" with the proper type
-PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "high" with the proper type
-PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "optimum" with the proper type
-PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "labels" with the proper type
-PASS HTMLFieldSetElement interface: existence and properties of interface object
-PASS HTMLFieldSetElement interface object length
-PASS HTMLFieldSetElement interface object name
-PASS HTMLFieldSetElement interface: existence and properties of interface prototype object
-PASS HTMLFieldSetElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLFieldSetElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLFieldSetElement interface: attribute disabled
-PASS Unscopable handled correctly for disabled property on HTMLFieldSetElement
-PASS HTMLFieldSetElement interface: attribute form
-PASS Unscopable handled correctly for form property on HTMLFieldSetElement
-PASS HTMLFieldSetElement interface: attribute name
-PASS Unscopable handled correctly for name property on HTMLFieldSetElement
-PASS HTMLFieldSetElement interface: attribute type
-PASS Unscopable handled correctly for type property on HTMLFieldSetElement
-PASS HTMLFieldSetElement interface: attribute elements
-PASS Unscopable handled correctly for elements property on HTMLFieldSetElement
-PASS HTMLFieldSetElement interface: attribute willValidate
-PASS Unscopable handled correctly for willValidate property on HTMLFieldSetElement
-PASS HTMLFieldSetElement interface: attribute validity
-PASS Unscopable handled correctly for validity property on HTMLFieldSetElement
-PASS HTMLFieldSetElement interface: attribute validationMessage
-PASS Unscopable handled correctly for validationMessage property on HTMLFieldSetElement
-PASS HTMLFieldSetElement interface: operation checkValidity()
-PASS Unscopable handled correctly for checkValidity() on HTMLFieldSetElement
-PASS HTMLFieldSetElement interface: operation reportValidity()
-PASS Unscopable handled correctly for reportValidity() on HTMLFieldSetElement
-PASS HTMLFieldSetElement interface: operation setCustomValidity(DOMString)
-PASS Unscopable handled correctly for setCustomValidity(DOMString) on HTMLFieldSetElement
-PASS HTMLLegendElement interface: existence and properties of interface object
-PASS HTMLLegendElement interface object length
-PASS HTMLLegendElement interface object name
-PASS HTMLLegendElement interface: existence and properties of interface prototype object
-PASS HTMLLegendElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLLegendElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLLegendElement interface: attribute form
-PASS Unscopable handled correctly for form property on HTMLLegendElement
-PASS HTMLLegendElement interface: attribute align
-PASS Unscopable handled correctly for align property on HTMLLegendElement
-PASS HTMLLegendElement must be primary interface of document.createElement("legend")
-PASS Stringification of document.createElement("legend")
-PASS HTMLLegendElement interface: document.createElement("legend") must inherit property "form" with the proper type
-PASS HTMLLegendElement interface: document.createElement("legend") must inherit property "align" with the proper type
-PASS ValidityState interface: existence and properties of interface object
-PASS ValidityState interface object length
-PASS ValidityState interface object name
-PASS ValidityState interface: existence and properties of interface prototype object
-PASS ValidityState interface: existence and properties of interface prototype object's "constructor" property
-PASS ValidityState interface: existence and properties of interface prototype object's @@unscopables property
-PASS ValidityState interface: attribute valueMissing
-PASS Unscopable handled correctly for valueMissing property on ValidityState
-PASS ValidityState interface: attribute typeMismatch
-PASS Unscopable handled correctly for typeMismatch property on ValidityState
-PASS ValidityState interface: attribute patternMismatch
-PASS Unscopable handled correctly for patternMismatch property on ValidityState
-PASS ValidityState interface: attribute tooLong
-PASS Unscopable handled correctly for tooLong property on ValidityState
-PASS ValidityState interface: attribute tooShort
-PASS Unscopable handled correctly for tooShort property on ValidityState
-PASS ValidityState interface: attribute rangeUnderflow
-PASS Unscopable handled correctly for rangeUnderflow property on ValidityState
-PASS ValidityState interface: attribute rangeOverflow
-PASS Unscopable handled correctly for rangeOverflow property on ValidityState
-PASS ValidityState interface: attribute stepMismatch
-PASS Unscopable handled correctly for stepMismatch property on ValidityState
-PASS ValidityState interface: attribute badInput
-PASS Unscopable handled correctly for badInput property on ValidityState
-PASS ValidityState interface: attribute customError
-PASS Unscopable handled correctly for customError property on ValidityState
-PASS ValidityState interface: attribute valid
-PASS Unscopable handled correctly for valid property on ValidityState
-PASS ValidityState must be primary interface of document.createElement("input").validity
-PASS Stringification of document.createElement("input").validity
-PASS ValidityState interface: document.createElement("input").validity must inherit property "valueMissing" with the proper type
-PASS ValidityState interface: document.createElement("input").validity must inherit property "typeMismatch" with the proper type
-PASS ValidityState interface: document.createElement("input").validity must inherit property "patternMismatch" with the proper type
-PASS ValidityState interface: document.createElement("input").validity must inherit property "tooLong" with the proper type
-PASS ValidityState interface: document.createElement("input").validity must inherit property "tooShort" with the proper type
-PASS ValidityState interface: document.createElement("input").validity must inherit property "rangeUnderflow" with the proper type
-PASS ValidityState interface: document.createElement("input").validity must inherit property "rangeOverflow" with the proper type
-PASS ValidityState interface: document.createElement("input").validity must inherit property "stepMismatch" with the proper type
-PASS ValidityState interface: document.createElement("input").validity must inherit property "badInput" with the proper type
-PASS ValidityState interface: document.createElement("input").validity must inherit property "customError" with the proper type
-PASS ValidityState interface: document.createElement("input").validity must inherit property "valid" with the proper type
-PASS HTMLDetailsElement interface: existence and properties of interface object
-PASS HTMLDetailsElement interface object length
-PASS HTMLDetailsElement interface object name
-PASS HTMLDetailsElement interface: existence and properties of interface prototype object
-PASS HTMLDetailsElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLDetailsElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLDetailsElement interface: attribute open
-PASS Unscopable handled correctly for open property on HTMLDetailsElement
-PASS HTMLDetailsElement must be primary interface of document.createElement("details")
-PASS Stringification of document.createElement("details")
-PASS HTMLDetailsElement interface: document.createElement("details") must inherit property "open" with the proper type
-PASS HTMLDialogElement interface: existence and properties of interface object
-PASS HTMLDialogElement interface object length
-PASS HTMLDialogElement interface object name
-PASS HTMLDialogElement interface: existence and properties of interface prototype object
-PASS HTMLDialogElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLDialogElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLDialogElement interface: attribute open
-PASS Unscopable handled correctly for open property on HTMLDialogElement
-PASS HTMLDialogElement interface: attribute returnValue
-PASS Unscopable handled correctly for returnValue property on HTMLDialogElement
-PASS HTMLDialogElement interface: operation show()
-PASS Unscopable handled correctly for show() on HTMLDialogElement
-PASS HTMLDialogElement interface: operation showModal()
-PASS Unscopable handled correctly for showModal() on HTMLDialogElement
-PASS HTMLDialogElement interface: operation close(DOMString)
-PASS Unscopable handled correctly for close(DOMString) on HTMLDialogElement
-PASS HTMLScriptElement interface: existence and properties of interface object
-PASS HTMLScriptElement interface object length
-PASS HTMLScriptElement interface object name
-PASS HTMLScriptElement interface: existence and properties of interface prototype object
-PASS HTMLScriptElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLScriptElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLScriptElement interface: attribute src
-PASS Unscopable handled correctly for src property on HTMLScriptElement
-PASS HTMLScriptElement interface: attribute type
-PASS Unscopable handled correctly for type property on HTMLScriptElement
-PASS HTMLScriptElement interface: attribute noModule
-PASS Unscopable handled correctly for noModule property on HTMLScriptElement
-PASS HTMLScriptElement interface: attribute async
-PASS Unscopable handled correctly for async property on HTMLScriptElement
-PASS HTMLScriptElement interface: attribute defer
-PASS Unscopable handled correctly for defer property on HTMLScriptElement
-PASS HTMLScriptElement interface: attribute crossOrigin
-PASS Unscopable handled correctly for crossOrigin property on HTMLScriptElement
-PASS HTMLScriptElement interface: attribute text
-PASS Unscopable handled correctly for text property on HTMLScriptElement
-PASS HTMLScriptElement interface: attribute integrity
-PASS Unscopable handled correctly for integrity property on HTMLScriptElement
-PASS HTMLScriptElement interface: attribute charset
-PASS Unscopable handled correctly for charset property on HTMLScriptElement
-PASS HTMLScriptElement interface: attribute event
-PASS Unscopable handled correctly for event property on HTMLScriptElement
-PASS HTMLScriptElement interface: attribute htmlFor
-PASS Unscopable handled correctly for htmlFor property on HTMLScriptElement
-PASS HTMLScriptElement must be primary interface of document.createElement("script")
-PASS Stringification of document.createElement("script")
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "src" with the proper type
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "type" with the proper type
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "noModule" with the proper type
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "async" with the proper type
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "defer" with the proper type
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "crossOrigin" with the proper type
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "text" with the proper type
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "integrity" with the proper type
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "charset" with the proper type
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "event" with the proper type
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "htmlFor" with the proper type
-PASS HTMLTemplateElement interface: existence and properties of interface object
-PASS HTMLTemplateElement interface object length
-PASS HTMLTemplateElement interface object name
-PASS HTMLTemplateElement interface: existence and properties of interface prototype object
-PASS HTMLTemplateElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLTemplateElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLTemplateElement interface: attribute content
-PASS Unscopable handled correctly for content property on HTMLTemplateElement
-PASS HTMLTemplateElement must be primary interface of document.createElement("template")
-PASS Stringification of document.createElement("template")
-PASS HTMLTemplateElement interface: document.createElement("template") must inherit property "content" with the proper type
-PASS HTMLSlotElement interface: existence and properties of interface object
-PASS HTMLSlotElement interface object length
-PASS HTMLSlotElement interface object name
-PASS HTMLSlotElement interface: existence and properties of interface prototype object
-PASS HTMLSlotElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLSlotElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLSlotElement interface: attribute name
-PASS Unscopable handled correctly for name property on HTMLSlotElement
-PASS HTMLSlotElement interface: operation assignedNodes(AssignedNodesOptions)
-PASS Unscopable handled correctly for assignedNodes(AssignedNodesOptions) on HTMLSlotElement
-PASS HTMLSlotElement interface: operation assignedElements(AssignedNodesOptions)
-PASS Unscopable handled correctly for assignedElements(AssignedNodesOptions) on HTMLSlotElement
-PASS HTMLSlotElement must be primary interface of document.createElement("slot")
-PASS Stringification of document.createElement("slot")
-PASS HTMLSlotElement interface: document.createElement("slot") must inherit property "name" with the proper type
-PASS HTMLSlotElement interface: document.createElement("slot") must inherit property "assignedNodes(AssignedNodesOptions)" with the proper type
-PASS HTMLSlotElement interface: calling assignedNodes(AssignedNodesOptions) on document.createElement("slot") with too few arguments must throw TypeError
-PASS HTMLSlotElement interface: document.createElement("slot") must inherit property "assignedElements(AssignedNodesOptions)" with the proper type
-PASS HTMLSlotElement interface: calling assignedElements(AssignedNodesOptions) on document.createElement("slot") with too few arguments must throw TypeError
-PASS HTMLCanvasElement interface: existence and properties of interface object
-PASS HTMLCanvasElement interface object length
-PASS HTMLCanvasElement interface object name
-PASS HTMLCanvasElement interface: existence and properties of interface prototype object
-PASS HTMLCanvasElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLCanvasElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLCanvasElement interface: attribute width
-PASS Unscopable handled correctly for width property on HTMLCanvasElement
-PASS HTMLCanvasElement interface: attribute height
-PASS Unscopable handled correctly for height property on HTMLCanvasElement
-PASS HTMLCanvasElement interface: operation getContext(DOMString, any)
-PASS Unscopable handled correctly for getContext(DOMString, any) on HTMLCanvasElement
-PASS HTMLCanvasElement interface: operation toDataURL(DOMString, any)
-PASS Unscopable handled correctly for toDataURL(DOMString, any) on HTMLCanvasElement
-PASS HTMLCanvasElement interface: operation toBlob(BlobCallback, DOMString, any)
-PASS Unscopable handled correctly for toBlob(BlobCallback, DOMString, any) on HTMLCanvasElement
-PASS HTMLCanvasElement interface: operation transferControlToOffscreen()
-PASS Unscopable handled correctly for transferControlToOffscreen() on HTMLCanvasElement
-PASS HTMLCanvasElement must be primary interface of document.createElement("canvas")
-PASS Stringification of document.createElement("canvas")
-PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "width" with the proper type
-PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "height" with the proper type
-PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "getContext(DOMString, any)" with the proper type
-PASS HTMLCanvasElement interface: calling getContext(DOMString, any) on document.createElement("canvas") with too few arguments must throw TypeError
-PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "toDataURL(DOMString, any)" with the proper type
-PASS HTMLCanvasElement interface: calling toDataURL(DOMString, any) on document.createElement("canvas") with too few arguments must throw TypeError
-PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "toBlob(BlobCallback, DOMString, any)" with the proper type
-PASS HTMLCanvasElement interface: calling toBlob(BlobCallback, DOMString, any) on document.createElement("canvas") with too few arguments must throw TypeError
-PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "transferControlToOffscreen()" with the proper type
-PASS CanvasRenderingContext2D interface: existence and properties of interface object
-PASS CanvasRenderingContext2D interface object length
-PASS CanvasRenderingContext2D interface object name
-PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object
-PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object's "constructor" property
-PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object's @@unscopables property
-PASS CanvasRenderingContext2D interface: attribute canvas
-PASS Unscopable handled correctly for canvas property on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation save()
-PASS Unscopable handled correctly for save() on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation restore()
-PASS Unscopable handled correctly for restore() on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation scale(unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for scale(unrestricted double, unrestricted double) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation rotate(unrestricted double)
-PASS Unscopable handled correctly for rotate(unrestricted double) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation translate(unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for translate(unrestricted double, unrestricted double) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on CanvasRenderingContext2D
-FAIL CanvasRenderingContext2D interface: operation getTransform() assert_own_property: interface prototype object missing non-static operation expected property "getTransform" missing
-PASS Unscopable handled correctly for getTransform() on CanvasRenderingContext2D
-FAIL CanvasRenderingContext2D interface: operation setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) assert_equals: property has wrong .length expected 0 but got 6
-PASS Unscopable handled correctly for setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on CanvasRenderingContext2D
-FAIL CanvasRenderingContext2D interface: operation setTransform(DOMMatrix2DInit) assert_equals: property has wrong .length expected 0 but got 6
-PASS Unscopable handled correctly for setTransform(DOMMatrix2DInit) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation resetTransform()
-PASS Unscopable handled correctly for resetTransform() on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: attribute globalAlpha
-PASS Unscopable handled correctly for globalAlpha property on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: attribute globalCompositeOperation
-PASS Unscopable handled correctly for globalCompositeOperation property on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: attribute imageSmoothingEnabled
-PASS Unscopable handled correctly for imageSmoothingEnabled property on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: attribute imageSmoothingQuality
-PASS Unscopable handled correctly for imageSmoothingQuality property on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: attribute strokeStyle
-PASS Unscopable handled correctly for strokeStyle property on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: attribute fillStyle
-PASS Unscopable handled correctly for fillStyle property on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation createLinearGradient(double, double, double, double)
-PASS Unscopable handled correctly for createLinearGradient(double, double, double, double) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation createRadialGradient(double, double, double, double, double, double)
-PASS Unscopable handled correctly for createRadialGradient(double, double, double, double, double, double) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation createPattern(CanvasImageSource, DOMString)
-PASS Unscopable handled correctly for createPattern(CanvasImageSource, DOMString) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: attribute shadowOffsetX
-PASS Unscopable handled correctly for shadowOffsetX property on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: attribute shadowOffsetY
-PASS Unscopable handled correctly for shadowOffsetY property on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: attribute shadowBlur
-PASS Unscopable handled correctly for shadowBlur property on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: attribute shadowColor
-PASS Unscopable handled correctly for shadowColor property on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: attribute filter
-PASS Unscopable handled correctly for filter property on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation beginPath()
-PASS Unscopable handled correctly for beginPath() on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation fill(CanvasFillRule)
-PASS Unscopable handled correctly for fill(CanvasFillRule) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation fill(Path2D, CanvasFillRule)
-PASS Unscopable handled correctly for fill(Path2D, CanvasFillRule) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation stroke()
-PASS Unscopable handled correctly for stroke() on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation stroke(Path2D)
-PASS Unscopable handled correctly for stroke(Path2D) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation clip(CanvasFillRule)
-PASS Unscopable handled correctly for clip(CanvasFillRule) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation clip(Path2D, CanvasFillRule)
-PASS Unscopable handled correctly for clip(Path2D, CanvasFillRule) on CanvasRenderingContext2D
-FAIL CanvasRenderingContext2D interface: operation resetClip() assert_own_property: interface prototype object missing non-static operation expected property "resetClip" missing
-PASS Unscopable handled correctly for resetClip() on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)
-PASS Unscopable handled correctly for isPointInPath(unrestricted double, unrestricted double, CanvasFillRule) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)
-PASS Unscopable handled correctly for isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for isPointInStroke(unrestricted double, unrestricted double) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for isPointInStroke(Path2D, unrestricted double, unrestricted double) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Element)
-PASS Unscopable handled correctly for drawFocusIfNeeded(Element) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Path2D, Element)
-PASS Unscopable handled correctly for drawFocusIfNeeded(Path2D, Element) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation scrollPathIntoView()
-PASS Unscopable handled correctly for scrollPathIntoView() on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation scrollPathIntoView(Path2D)
-PASS Unscopable handled correctly for scrollPathIntoView(Path2D) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for fillText(DOMString, unrestricted double, unrestricted double, unrestricted double) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation measureText(DOMString)
-PASS Unscopable handled correctly for measureText(DOMString) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for drawImage(CanvasImageSource, unrestricted double, unrestricted double) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation createImageData(long, long)
-PASS Unscopable handled correctly for createImageData(long, long) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation createImageData(ImageData)
-PASS Unscopable handled correctly for createImageData(ImageData) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation getImageData(long, long, long, long)
-PASS Unscopable handled correctly for getImageData(long, long, long, long) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation putImageData(ImageData, long, long)
-PASS Unscopable handled correctly for putImageData(ImageData, long, long) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation putImageData(ImageData, long, long, long, long, long, long)
-PASS Unscopable handled correctly for putImageData(ImageData, long, long, long, long, long, long) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: attribute lineWidth
-PASS Unscopable handled correctly for lineWidth property on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: attribute lineCap
-PASS Unscopable handled correctly for lineCap property on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: attribute lineJoin
-PASS Unscopable handled correctly for lineJoin property on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: attribute miterLimit
-PASS Unscopable handled correctly for miterLimit property on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation setLineDash([object Object])
-PASS Unscopable handled correctly for setLineDash([object Object]) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation getLineDash()
-PASS Unscopable handled correctly for getLineDash() on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: attribute lineDashOffset
-PASS Unscopable handled correctly for lineDashOffset property on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: attribute font
-PASS Unscopable handled correctly for font property on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: attribute textAlign
-PASS Unscopable handled correctly for textAlign property on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: attribute textBaseline
-PASS Unscopable handled correctly for textBaseline property on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: attribute direction
-PASS Unscopable handled correctly for direction property on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation closePath()
-PASS Unscopable handled correctly for closePath() on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation moveTo(unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for moveTo(unrestricted double, unrestricted double) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation lineTo(unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for lineTo(unrestricted double, unrestricted double) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
-PASS Unscopable handled correctly for arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
-PASS Unscopable handled correctly for ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on CanvasRenderingContext2D
-PASS CanvasRenderingContext2D must be primary interface of document.createElement("canvas").getContext("2d")
-PASS Stringification of document.createElement("canvas").getContext("2d")
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "canvas" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "save()" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "restore()" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scale(unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling scale(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "rotate(unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling rotate(unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "translate(unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling translate(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-FAIL CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getTransform()" with the proper type assert_inherits: property "getTransform" not found in prototype chain
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setTransform(DOMMatrix2DInit)" with the proper type
-PASS CanvasRenderingContext2D interface: calling setTransform(DOMMatrix2DInit) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "resetTransform()" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "globalAlpha" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "globalCompositeOperation" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingEnabled" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingQuality" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeStyle" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillStyle" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createLinearGradient(double, double, double, double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling createLinearGradient(double, double, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createRadialGradient(double, double, double, double, double, double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling createRadialGradient(double, double, double, double, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createPattern(CanvasImageSource, DOMString)" with the proper type
-PASS CanvasRenderingContext2D interface: calling createPattern(CanvasImageSource, DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetX" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetY" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowBlur" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowColor" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "filter" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "beginPath()" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fill(CanvasFillRule)" with the proper type
-PASS CanvasRenderingContext2D interface: calling fill(CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fill(Path2D, CanvasFillRule)" with the proper type
-PASS CanvasRenderingContext2D interface: calling fill(Path2D, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "stroke()" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "stroke(Path2D)" with the proper type
-PASS CanvasRenderingContext2D interface: calling stroke(Path2D) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip(CanvasFillRule)" with the proper type
-PASS CanvasRenderingContext2D interface: calling clip(CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip(Path2D, CanvasFillRule)" with the proper type
-PASS CanvasRenderingContext2D interface: calling clip(Path2D, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-FAIL CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "resetClip()" with the proper type assert_inherits: property "resetClip" not found in prototype chain
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)" with the proper type
-PASS CanvasRenderingContext2D interface: calling isPointInPath(unrestricted double, unrestricted double, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)" with the proper type
-PASS CanvasRenderingContext2D interface: calling isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling isPointInStroke(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(Path2D, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling isPointInStroke(Path2D, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Element)" with the proper type
-PASS CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Path2D, Element)" with the proper type
-PASS CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Path2D, Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView()" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView(Path2D)" with the proper type
-PASS CanvasRenderingContext2D interface: calling scrollPathIntoView(Path2D) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling fillText(DOMString, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "measureText(DOMString)" with the proper type
-PASS CanvasRenderingContext2D interface: calling measureText(DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createImageData(long, long)" with the proper type
-PASS CanvasRenderingContext2D interface: calling createImageData(long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createImageData(ImageData)" with the proper type
-PASS CanvasRenderingContext2D interface: calling createImageData(ImageData) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getImageData(long, long, long, long)" with the proper type
-PASS CanvasRenderingContext2D interface: calling getImageData(long, long, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "putImageData(ImageData, long, long)" with the proper type
-PASS CanvasRenderingContext2D interface: calling putImageData(ImageData, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "putImageData(ImageData, long, long, long, long, long, long)" with the proper type
-PASS CanvasRenderingContext2D interface: calling putImageData(ImageData, long, long, long, long, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineWidth" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineCap" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineJoin" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "miterLimit" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setLineDash([object Object])" with the proper type
-PASS CanvasRenderingContext2D interface: calling setLineDash([object Object]) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getLineDash()" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineDashOffset" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "font" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textAlign" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textBaseline" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "direction" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "closePath()" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "moveTo(unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling moveTo(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineTo(unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling lineTo(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)" with the proper type
-PASS CanvasRenderingContext2D interface: calling arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)" with the proper type
-PASS CanvasRenderingContext2D interface: calling ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasGradient interface: existence and properties of interface object
-PASS CanvasGradient interface object length
-PASS CanvasGradient interface object name
-PASS CanvasGradient interface: existence and properties of interface prototype object
-PASS CanvasGradient interface: existence and properties of interface prototype object's "constructor" property
-PASS CanvasGradient interface: existence and properties of interface prototype object's @@unscopables property
-PASS CanvasGradient interface: operation addColorStop(double, DOMString)
-PASS Unscopable handled correctly for addColorStop(double, DOMString) on CanvasGradient
-PASS CanvasPattern interface: existence and properties of interface object
-PASS CanvasPattern interface object length
-PASS CanvasPattern interface object name
-PASS CanvasPattern interface: existence and properties of interface prototype object
-PASS CanvasPattern interface: existence and properties of interface prototype object's "constructor" property
-PASS CanvasPattern interface: existence and properties of interface prototype object's @@unscopables property
-FAIL CanvasPattern interface: operation setTransform(DOMMatrix2DInit) assert_equals: property has wrong .length expected 0 but got 1
-PASS Unscopable handled correctly for setTransform(DOMMatrix2DInit) on CanvasPattern
-PASS TextMetrics interface: existence and properties of interface object
-PASS TextMetrics interface object length
-PASS TextMetrics interface object name
-PASS TextMetrics interface: existence and properties of interface prototype object
-PASS TextMetrics interface: existence and properties of interface prototype object's "constructor" property
-PASS TextMetrics interface: existence and properties of interface prototype object's @@unscopables property
-PASS TextMetrics interface: attribute width
-PASS Unscopable handled correctly for width property on TextMetrics
-PASS TextMetrics interface: attribute actualBoundingBoxLeft
-PASS Unscopable handled correctly for actualBoundingBoxLeft property on TextMetrics
-PASS TextMetrics interface: attribute actualBoundingBoxRight
-PASS Unscopable handled correctly for actualBoundingBoxRight property on TextMetrics
-PASS TextMetrics interface: attribute fontBoundingBoxAscent
-PASS Unscopable handled correctly for fontBoundingBoxAscent property on TextMetrics
-PASS TextMetrics interface: attribute fontBoundingBoxDescent
-PASS Unscopable handled correctly for fontBoundingBoxDescent property on TextMetrics
-PASS TextMetrics interface: attribute actualBoundingBoxAscent
-PASS Unscopable handled correctly for actualBoundingBoxAscent property on TextMetrics
-PASS TextMetrics interface: attribute actualBoundingBoxDescent
-PASS Unscopable handled correctly for actualBoundingBoxDescent property on TextMetrics
-PASS TextMetrics interface: attribute emHeightAscent
-PASS Unscopable handled correctly for emHeightAscent property on TextMetrics
-PASS TextMetrics interface: attribute emHeightDescent
-PASS Unscopable handled correctly for emHeightDescent property on TextMetrics
-PASS TextMetrics interface: attribute hangingBaseline
-PASS Unscopable handled correctly for hangingBaseline property on TextMetrics
-PASS TextMetrics interface: attribute alphabeticBaseline
-PASS Unscopable handled correctly for alphabeticBaseline property on TextMetrics
-PASS TextMetrics interface: attribute ideographicBaseline
-PASS Unscopable handled correctly for ideographicBaseline property on TextMetrics
-PASS ImageData interface: existence and properties of interface object
-PASS ImageData interface object length
-PASS ImageData interface object name
-PASS ImageData interface: existence and properties of interface prototype object
-PASS ImageData interface: existence and properties of interface prototype object's "constructor" property
-PASS ImageData interface: existence and properties of interface prototype object's @@unscopables property
-PASS ImageData interface: attribute width
-PASS Unscopable handled correctly for width property on ImageData
-PASS ImageData interface: attribute height
-PASS Unscopable handled correctly for height property on ImageData
-PASS ImageData interface: attribute data
-PASS Unscopable handled correctly for data property on ImageData
-PASS Path2D interface: existence and properties of interface object
-PASS Path2D interface object length
-PASS Path2D interface object name
-PASS Path2D interface: existence and properties of interface prototype object
-PASS Path2D interface: existence and properties of interface prototype object's "constructor" property
-PASS Path2D interface: existence and properties of interface prototype object's @@unscopables property
-PASS Path2D interface: operation addPath(Path2D, DOMMatrix2DInit)
-PASS Unscopable handled correctly for addPath(Path2D, DOMMatrix2DInit) on Path2D
-PASS Path2D interface: operation closePath()
-PASS Unscopable handled correctly for closePath() on Path2D
-PASS Path2D interface: operation moveTo(unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for moveTo(unrestricted double, unrestricted double) on Path2D
-PASS Path2D interface: operation lineTo(unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for lineTo(unrestricted double, unrestricted double) on Path2D
-PASS Path2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on Path2D
-PASS Path2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on Path2D
-PASS Path2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on Path2D
-PASS Path2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on Path2D
-PASS Path2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
-PASS Unscopable handled correctly for arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on Path2D
-PASS Path2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
-PASS Unscopable handled correctly for ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on Path2D
-PASS ImageBitmapRenderingContext interface: existence and properties of interface object
-PASS ImageBitmapRenderingContext interface object length
-PASS ImageBitmapRenderingContext interface object name
-PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object
-PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object's "constructor" property
-PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object's @@unscopables property
-PASS ImageBitmapRenderingContext interface: attribute canvas
-PASS Unscopable handled correctly for canvas property on ImageBitmapRenderingContext
-PASS ImageBitmapRenderingContext interface: operation transferFromImageBitmap(ImageBitmap)
-PASS Unscopable handled correctly for transferFromImageBitmap(ImageBitmap) on ImageBitmapRenderingContext
-PASS OffscreenCanvas interface: existence and properties of interface object
-PASS OffscreenCanvas interface object length
-PASS OffscreenCanvas interface object name
-PASS OffscreenCanvas interface: existence and properties of interface prototype object
-PASS OffscreenCanvas interface: existence and properties of interface prototype object's "constructor" property
-PASS OffscreenCanvas interface: existence and properties of interface prototype object's @@unscopables property
-PASS OffscreenCanvas interface: attribute width
-PASS Unscopable handled correctly for width property on OffscreenCanvas
-PASS OffscreenCanvas interface: attribute height
-PASS Unscopable handled correctly for height property on OffscreenCanvas
-PASS OffscreenCanvas interface: operation getContext(OffscreenRenderingContextId, any)
-PASS Unscopable handled correctly for getContext(OffscreenRenderingContextId, any) on OffscreenCanvas
-PASS OffscreenCanvas interface: operation transferToImageBitmap()
-PASS Unscopable handled correctly for transferToImageBitmap() on OffscreenCanvas
-PASS OffscreenCanvas interface: operation convertToBlob(ImageEncodeOptions)
-PASS Unscopable handled correctly for convertToBlob(ImageEncodeOptions) on OffscreenCanvas
-PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface object
-PASS OffscreenCanvasRenderingContext2D interface object length
-PASS OffscreenCanvasRenderingContext2D interface object name
-PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object
-PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object's "constructor" property
-PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object's @@unscopables property
-FAIL OffscreenCanvasRenderingContext2D interface: operation commit() assert_throws: calling operation with this = null didn't throw TypeError function "function() {
-            fn.apply(obj, args);
-        }" did not throw
-PASS Unscopable handled correctly for commit() on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: attribute canvas
-PASS Unscopable handled correctly for canvas property on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation save()
-PASS Unscopable handled correctly for save() on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation restore()
-PASS Unscopable handled correctly for restore() on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation scale(unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for scale(unrestricted double, unrestricted double) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation rotate(unrestricted double)
-PASS Unscopable handled correctly for rotate(unrestricted double) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation translate(unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for translate(unrestricted double, unrestricted double) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on OffscreenCanvasRenderingContext2D
-FAIL OffscreenCanvasRenderingContext2D interface: operation getTransform() assert_own_property: interface prototype object missing non-static operation expected property "getTransform" missing
-PASS Unscopable handled correctly for getTransform() on OffscreenCanvasRenderingContext2D
-FAIL OffscreenCanvasRenderingContext2D interface: operation setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) assert_equals: property has wrong .length expected 0 but got 6
-PASS Unscopable handled correctly for setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on OffscreenCanvasRenderingContext2D
-FAIL OffscreenCanvasRenderingContext2D interface: operation setTransform(DOMMatrix2DInit) assert_equals: property has wrong .length expected 0 but got 6
-PASS Unscopable handled correctly for setTransform(DOMMatrix2DInit) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation resetTransform()
-PASS Unscopable handled correctly for resetTransform() on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: attribute globalAlpha
-PASS Unscopable handled correctly for globalAlpha property on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: attribute globalCompositeOperation
-PASS Unscopable handled correctly for globalCompositeOperation property on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingEnabled
-PASS Unscopable handled correctly for imageSmoothingEnabled property on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingQuality
-PASS Unscopable handled correctly for imageSmoothingQuality property on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: attribute strokeStyle
-PASS Unscopable handled correctly for strokeStyle property on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: attribute fillStyle
-PASS Unscopable handled correctly for fillStyle property on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation createLinearGradient(double, double, double, double)
-PASS Unscopable handled correctly for createLinearGradient(double, double, double, double) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation createRadialGradient(double, double, double, double, double, double)
-PASS Unscopable handled correctly for createRadialGradient(double, double, double, double, double, double) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation createPattern(CanvasImageSource, DOMString)
-PASS Unscopable handled correctly for createPattern(CanvasImageSource, DOMString) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: attribute shadowOffsetX
-PASS Unscopable handled correctly for shadowOffsetX property on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: attribute shadowOffsetY
-PASS Unscopable handled correctly for shadowOffsetY property on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: attribute shadowBlur
-PASS Unscopable handled correctly for shadowBlur property on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: attribute shadowColor
-PASS Unscopable handled correctly for shadowColor property on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: attribute filter
-PASS Unscopable handled correctly for filter property on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation beginPath()
-PASS Unscopable handled correctly for beginPath() on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation fill(CanvasFillRule)
-PASS Unscopable handled correctly for fill(CanvasFillRule) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation fill(Path2D, CanvasFillRule)
-PASS Unscopable handled correctly for fill(Path2D, CanvasFillRule) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation stroke()
-PASS Unscopable handled correctly for stroke() on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation stroke(Path2D)
-PASS Unscopable handled correctly for stroke(Path2D) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation clip(CanvasFillRule)
-PASS Unscopable handled correctly for clip(CanvasFillRule) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation clip(Path2D, CanvasFillRule)
-PASS Unscopable handled correctly for clip(Path2D, CanvasFillRule) on OffscreenCanvasRenderingContext2D
-FAIL OffscreenCanvasRenderingContext2D interface: operation resetClip() assert_own_property: interface prototype object missing non-static operation expected property "resetClip" missing
-PASS Unscopable handled correctly for resetClip() on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)
-PASS Unscopable handled correctly for isPointInPath(unrestricted double, unrestricted double, CanvasFillRule) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)
-PASS Unscopable handled correctly for isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for isPointInStroke(unrestricted double, unrestricted double) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for isPointInStroke(Path2D, unrestricted double, unrestricted double) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for drawImage(CanvasImageSource, unrestricted double, unrestricted double) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation createImageData(long, long)
-PASS Unscopable handled correctly for createImageData(long, long) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation createImageData(ImageData)
-PASS Unscopable handled correctly for createImageData(ImageData) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation getImageData(long, long, long, long)
-PASS Unscopable handled correctly for getImageData(long, long, long, long) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation putImageData(ImageData, long, long)
-PASS Unscopable handled correctly for putImageData(ImageData, long, long) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation putImageData(ImageData, long, long, long, long, long, long)
-PASS Unscopable handled correctly for putImageData(ImageData, long, long, long, long, long, long) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: attribute lineWidth
-PASS Unscopable handled correctly for lineWidth property on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: attribute lineCap
-PASS Unscopable handled correctly for lineCap property on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: attribute lineJoin
-PASS Unscopable handled correctly for lineJoin property on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: attribute miterLimit
-PASS Unscopable handled correctly for miterLimit property on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation setLineDash([object Object])
-PASS Unscopable handled correctly for setLineDash([object Object]) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation getLineDash()
-PASS Unscopable handled correctly for getLineDash() on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: attribute lineDashOffset
-PASS Unscopable handled correctly for lineDashOffset property on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation closePath()
-PASS Unscopable handled correctly for closePath() on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation moveTo(unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for moveTo(unrestricted double, unrestricted double) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation lineTo(unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for lineTo(unrestricted double, unrestricted double) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Unscopable handled correctly for rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
-PASS Unscopable handled correctly for arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on OffscreenCanvasRenderingContext2D
-PASS OffscreenCanvasRenderingContext2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
-PASS Unscopable handled correctly for ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on OffscreenCanvasRenderingContext2D
-PASS CustomElementRegistry interface: existence and properties of interface object
-PASS CustomElementRegistry interface object length
-PASS CustomElementRegistry interface object name
-PASS CustomElementRegistry interface: existence and properties of interface prototype object
-PASS CustomElementRegistry interface: existence and properties of interface prototype object's "constructor" property
-PASS CustomElementRegistry interface: existence and properties of interface prototype object's @@unscopables property
-PASS CustomElementRegistry interface: operation define(DOMString, Function, ElementDefinitionOptions)
-PASS Unscopable handled correctly for define(DOMString, Function, ElementDefinitionOptions) on CustomElementRegistry
-PASS CustomElementRegistry interface: operation get(DOMString)
-PASS Unscopable handled correctly for get(DOMString) on CustomElementRegistry
-PASS CustomElementRegistry interface: operation whenDefined(DOMString)
-PASS Unscopable handled correctly for whenDefined(DOMString) on CustomElementRegistry
-PASS DataTransfer interface: existence and properties of interface object
-PASS DataTransfer interface object length
-PASS DataTransfer interface object name
-PASS DataTransfer interface: existence and properties of interface prototype object
-PASS DataTransfer interface: existence and properties of interface prototype object's "constructor" property
-PASS DataTransfer interface: existence and properties of interface prototype object's @@unscopables property
-PASS DataTransfer interface: attribute dropEffect
-PASS Unscopable handled correctly for dropEffect property on DataTransfer
-PASS DataTransfer interface: attribute effectAllowed
-PASS Unscopable handled correctly for effectAllowed property on DataTransfer
-PASS DataTransfer interface: attribute items
-PASS Unscopable handled correctly for items property on DataTransfer
-PASS DataTransfer interface: operation setDragImage(Element, long, long)
-PASS Unscopable handled correctly for setDragImage(Element, long, long) on DataTransfer
-PASS DataTransfer interface: attribute types
-PASS Unscopable handled correctly for types property on DataTransfer
-PASS DataTransfer interface: operation getData(DOMString)
-PASS Unscopable handled correctly for getData(DOMString) on DataTransfer
-PASS DataTransfer interface: operation setData(DOMString, DOMString)
-PASS Unscopable handled correctly for setData(DOMString, DOMString) on DataTransfer
-PASS DataTransfer interface: operation clearData(DOMString)
-PASS Unscopable handled correctly for clearData(DOMString) on DataTransfer
-PASS DataTransfer interface: attribute files
-PASS Unscopable handled correctly for files property on DataTransfer
-PASS DataTransferItemList interface: existence and properties of interface object
-PASS DataTransferItemList interface object length
-PASS DataTransferItemList interface object name
-PASS DataTransferItemList interface: existence and properties of interface prototype object
-PASS DataTransferItemList interface: existence and properties of interface prototype object's "constructor" property
-PASS DataTransferItemList interface: existence and properties of interface prototype object's @@unscopables property
-PASS DataTransferItemList interface: attribute length
-PASS Unscopable handled correctly for length property on DataTransferItemList
-PASS DataTransferItemList interface: operation add(DOMString, DOMString)
-PASS Unscopable handled correctly for add(DOMString, DOMString) on DataTransferItemList
-PASS DataTransferItemList interface: operation add(File)
-PASS Unscopable handled correctly for add(File) on DataTransferItemList
-PASS DataTransferItemList interface: operation remove(unsigned long)
-PASS Unscopable handled correctly for remove(unsigned long) on DataTransferItemList
-PASS DataTransferItemList interface: operation clear()
-PASS Unscopable handled correctly for clear() on DataTransferItemList
-PASS DataTransferItem interface: existence and properties of interface object
-PASS DataTransferItem interface object length
-PASS DataTransferItem interface object name
-PASS DataTransferItem interface: existence and properties of interface prototype object
-PASS DataTransferItem interface: existence and properties of interface prototype object's "constructor" property
-PASS DataTransferItem interface: existence and properties of interface prototype object's @@unscopables property
-PASS DataTransferItem interface: attribute kind
-PASS Unscopable handled correctly for kind property on DataTransferItem
-PASS DataTransferItem interface: attribute type
-PASS Unscopable handled correctly for type property on DataTransferItem
-PASS DataTransferItem interface: operation getAsString(FunctionStringCallback)
-PASS Unscopable handled correctly for getAsString(FunctionStringCallback) on DataTransferItem
-PASS DataTransferItem interface: operation getAsFile()
-PASS Unscopable handled correctly for getAsFile() on DataTransferItem
-PASS DragEvent interface: existence and properties of interface object
-PASS DragEvent interface object length
-PASS DragEvent interface object name
-PASS DragEvent interface: existence and properties of interface prototype object
-PASS DragEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS DragEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS DragEvent interface: attribute dataTransfer
-PASS Unscopable handled correctly for dataTransfer property on DragEvent
-PASS Window interface: existence and properties of interface object
-PASS Window interface object length
-PASS Window interface object name
-PASS Window interface: existence and properties of interface prototype object
-PASS Window interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Object.setPrototypeOf should throw a TypeError
-PASS Window interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via __proto__ should throw a TypeError
-PASS Window interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Reflect.setPrototypeOf should return false
-PASS Window interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Object.setPrototypeOf should not throw
-PASS Window interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via __proto__ should not throw
-PASS Window interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Reflect.setPrototypeOf should return true
-PASS Window interface: existence and properties of interface prototype object's "constructor" property
-PASS Window interface: existence and properties of interface prototype object's @@unscopables property
-FAIL Window interface: attribute self assert_equals: "self" must have a getter expected "function" but got "undefined"
-PASS Unscopable handled correctly for self property on Window
-PASS Window interface: attribute name
-PASS Unscopable handled correctly for name property on Window
-PASS Window interface: attribute history
-PASS Unscopable handled correctly for history property on Window
-PASS Window interface: attribute customElements
-PASS Unscopable handled correctly for customElements property on Window
-PASS Window interface: attribute locationbar
-PASS Unscopable handled correctly for locationbar property on Window
-PASS Window interface: attribute menubar
-PASS Unscopable handled correctly for menubar property on Window
-PASS Window interface: attribute personalbar
-PASS Unscopable handled correctly for personalbar property on Window
-PASS Window interface: attribute scrollbars
-PASS Unscopable handled correctly for scrollbars property on Window
-PASS Window interface: attribute statusbar
-PASS Unscopable handled correctly for statusbar property on Window
-PASS Window interface: attribute toolbar
-PASS Unscopable handled correctly for toolbar property on Window
-PASS Window interface: attribute status
-PASS Unscopable handled correctly for status property on Window
-PASS Window interface: operation close()
-PASS Unscopable handled correctly for close() on Window
-FAIL Window interface: attribute closed assert_equals: "closed" must have a getter expected "function" but got "undefined"
-PASS Unscopable handled correctly for closed property on Window
-PASS Window interface: operation stop()
-PASS Unscopable handled correctly for stop() on Window
-PASS Window interface: operation focus()
-PASS Unscopable handled correctly for focus() on Window
-PASS Window interface: operation blur()
-PASS Unscopable handled correctly for blur() on Window
-FAIL Window interface: attribute frames assert_equals: "frames" must have a getter expected "function" but got "undefined"
-PASS Unscopable handled correctly for frames property on Window
-FAIL Window interface: attribute length assert_equals: "length" must have a getter expected "function" but got "undefined"
-PASS Unscopable handled correctly for length property on Window
-FAIL Window interface: attribute opener assert_equals: "opener" must have a getter expected "function" but got "undefined"
-PASS Unscopable handled correctly for opener property on Window
-FAIL Window interface: attribute parent assert_equals: "parent" must have a getter expected "function" but got "undefined"
-PASS Unscopable handled correctly for parent property on Window
-PASS Window interface: attribute frameElement
-PASS Unscopable handled correctly for frameElement property on Window
-PASS Window interface: operation open(USVString, DOMString, DOMString)
-PASS Unscopable handled correctly for open(USVString, DOMString, DOMString) on Window
-PASS Window interface: attribute navigator
-PASS Unscopable handled correctly for navigator property on Window
-PASS Window interface: attribute applicationCache
-PASS Unscopable handled correctly for applicationCache property on Window
-PASS Window interface: operation alert()
-PASS Unscopable handled correctly for alert() on Window
-PASS Window interface: operation alert(DOMString)
-PASS Unscopable handled correctly for alert(DOMString) on Window
-PASS Window interface: operation confirm(DOMString)
-PASS Unscopable handled correctly for confirm(DOMString) on Window
-PASS Window interface: operation prompt(DOMString, DOMString)
-PASS Unscopable handled correctly for prompt(DOMString, DOMString) on Window
-PASS Window interface: operation print()
-PASS Unscopable handled correctly for print() on Window
-PASS Window interface: operation requestAnimationFrame(FrameRequestCallback)
-PASS Unscopable handled correctly for requestAnimationFrame(FrameRequestCallback) on Window
-PASS Window interface: operation cancelAnimationFrame(unsigned long)
-PASS Unscopable handled correctly for cancelAnimationFrame(unsigned long) on Window
-PASS Window interface: operation postMessage(any, USVString, [object Object])
-PASS Unscopable handled correctly for postMessage(any, USVString, [object Object]) on Window
-PASS Window interface: operation captureEvents()
-PASS Unscopable handled correctly for captureEvents() on Window
-PASS Window interface: operation releaseEvents()
-PASS Unscopable handled correctly for releaseEvents() on Window
-PASS Window interface: attribute external
-PASS Unscopable handled correctly for external property on Window
-PASS Window interface: attribute onabort
-PASS Unscopable handled correctly for onabort property on Window
-PASS Window interface: attribute onauxclick
-PASS Unscopable handled correctly for onauxclick property on Window
-PASS Window interface: attribute onblur
-PASS Unscopable handled correctly for onblur property on Window
-PASS Window interface: attribute oncancel
-PASS Unscopable handled correctly for oncancel property on Window
-PASS Window interface: attribute oncanplay
-PASS Unscopable handled correctly for oncanplay property on Window
-PASS Window interface: attribute oncanplaythrough
-PASS Unscopable handled correctly for oncanplaythrough property on Window
-PASS Window interface: attribute onchange
-PASS Unscopable handled correctly for onchange property on Window
-PASS Window interface: attribute onclick
-PASS Unscopable handled correctly for onclick property on Window
-PASS Window interface: attribute onclose
-PASS Unscopable handled correctly for onclose property on Window
-PASS Window interface: attribute oncontextmenu
-PASS Unscopable handled correctly for oncontextmenu property on Window
-PASS Window interface: attribute oncuechange
-PASS Unscopable handled correctly for oncuechange property on Window
-PASS Window interface: attribute ondblclick
-PASS Unscopable handled correctly for ondblclick property on Window
-PASS Window interface: attribute ondrag
-PASS Unscopable handled correctly for ondrag property on Window
-PASS Window interface: attribute ondragend
-PASS Unscopable handled correctly for ondragend property on Window
-PASS Window interface: attribute ondragenter
-PASS Unscopable handled correctly for ondragenter property on Window
-FAIL Window interface: attribute ondragexit assert_own_property: The global object must have a property "ondragexit" expected property "ondragexit" missing
-PASS Unscopable handled correctly for ondragexit property on Window
-PASS Window interface: attribute ondragleave
-PASS Unscopable handled correctly for ondragleave property on Window
-PASS Window interface: attribute ondragover
-PASS Unscopable handled correctly for ondragover property on Window
-PASS Window interface: attribute ondragstart
-PASS Unscopable handled correctly for ondragstart property on Window
-PASS Window interface: attribute ondrop
-PASS Unscopable handled correctly for ondrop property on Window
-PASS Window interface: attribute ondurationchange
-PASS Unscopable handled correctly for ondurationchange property on Window
-PASS Window interface: attribute onemptied
-PASS Unscopable handled correctly for onemptied property on Window
-PASS Window interface: attribute onended
-PASS Unscopable handled correctly for onended property on Window
-PASS Window interface: attribute onerror
-PASS Unscopable handled correctly for onerror property on Window
-PASS Window interface: attribute onfocus
-PASS Unscopable handled correctly for onfocus property on Window
-PASS Window interface: attribute oninput
-PASS Unscopable handled correctly for oninput property on Window
-PASS Window interface: attribute oninvalid
-PASS Unscopable handled correctly for oninvalid property on Window
-PASS Window interface: attribute onkeydown
-PASS Unscopable handled correctly for onkeydown property on Window
-PASS Window interface: attribute onkeypress
-PASS Unscopable handled correctly for onkeypress property on Window
-PASS Window interface: attribute onkeyup
-PASS Unscopable handled correctly for onkeyup property on Window
-PASS Window interface: attribute onload
-PASS Unscopable handled correctly for onload property on Window
-PASS Window interface: attribute onloadeddata
-PASS Unscopable handled correctly for onloadeddata property on Window
-PASS Window interface: attribute onloadedmetadata
-PASS Unscopable handled correctly for onloadedmetadata property on Window
-FAIL Window interface: attribute onloadend assert_own_property: The global object must have a property "onloadend" expected property "onloadend" missing
-PASS Unscopable handled correctly for onloadend property on Window
-PASS Window interface: attribute onloadstart
-PASS Unscopable handled correctly for onloadstart property on Window
-PASS Window interface: attribute onmousedown
-PASS Unscopable handled correctly for onmousedown property on Window
-PASS Window interface: attribute onmouseenter
-PASS Unscopable handled correctly for onmouseenter property on Window
-PASS Window interface: attribute onmouseleave
-PASS Unscopable handled correctly for onmouseleave property on Window
-PASS Window interface: attribute onmousemove
-PASS Unscopable handled correctly for onmousemove property on Window
-PASS Window interface: attribute onmouseout
-PASS Unscopable handled correctly for onmouseout property on Window
-PASS Window interface: attribute onmouseover
-PASS Unscopable handled correctly for onmouseover property on Window
-PASS Window interface: attribute onmouseup
-PASS Unscopable handled correctly for onmouseup property on Window
-PASS Window interface: attribute onwheel
-PASS Unscopable handled correctly for onwheel property on Window
-PASS Window interface: attribute onpause
-PASS Unscopable handled correctly for onpause property on Window
-PASS Window interface: attribute onplay
-PASS Unscopable handled correctly for onplay property on Window
-PASS Window interface: attribute onplaying
-PASS Unscopable handled correctly for onplaying property on Window
-PASS Window interface: attribute onprogress
-PASS Unscopable handled correctly for onprogress property on Window
-PASS Window interface: attribute onratechange
-PASS Unscopable handled correctly for onratechange property on Window
-PASS Window interface: attribute onreset
-PASS Unscopable handled correctly for onreset property on Window
-PASS Window interface: attribute onresize
-PASS Unscopable handled correctly for onresize property on Window
-PASS Window interface: attribute onscroll
-PASS Unscopable handled correctly for onscroll property on Window
-FAIL Window interface: attribute onsecuritypolicyviolation assert_own_property: The global object must have a property "onsecuritypolicyviolation" expected property "onsecuritypolicyviolation" missing
-PASS Unscopable handled correctly for onsecuritypolicyviolation property on Window
-PASS Window interface: attribute onseeked
-PASS Unscopable handled correctly for onseeked property on Window
-PASS Window interface: attribute onseeking
-PASS Unscopable handled correctly for onseeking property on Window
-PASS Window interface: attribute onselect
-PASS Unscopable handled correctly for onselect property on Window
-PASS Window interface: attribute onstalled
-PASS Unscopable handled correctly for onstalled property on Window
-PASS Window interface: attribute onsubmit
-PASS Unscopable handled correctly for onsubmit property on Window
-PASS Window interface: attribute onsuspend
-PASS Unscopable handled correctly for onsuspend property on Window
-PASS Window interface: attribute ontimeupdate
-PASS Unscopable handled correctly for ontimeupdate property on Window
-PASS Window interface: attribute ontoggle
-PASS Unscopable handled correctly for ontoggle property on Window
-PASS Window interface: attribute onvolumechange
-PASS Unscopable handled correctly for onvolumechange property on Window
-PASS Window interface: attribute onwaiting
-PASS Unscopable handled correctly for onwaiting property on Window
-PASS Window interface: attribute onafterprint
-PASS Unscopable handled correctly for onafterprint property on Window
-PASS Window interface: attribute onbeforeprint
-PASS Unscopable handled correctly for onbeforeprint property on Window
-PASS Window interface: attribute onbeforeunload
-PASS Unscopable handled correctly for onbeforeunload property on Window
-PASS Window interface: attribute onhashchange
-PASS Unscopable handled correctly for onhashchange property on Window
-PASS Window interface: attribute onlanguagechange
-PASS Unscopable handled correctly for onlanguagechange property on Window
-PASS Window interface: attribute onmessage
-PASS Unscopable handled correctly for onmessage property on Window
-PASS Window interface: attribute onmessageerror
-PASS Unscopable handled correctly for onmessageerror property on Window
-PASS Window interface: attribute onoffline
-PASS Unscopable handled correctly for onoffline property on Window
-PASS Window interface: attribute ononline
-PASS Unscopable handled correctly for ononline property on Window
-PASS Window interface: attribute onpagehide
-PASS Unscopable handled correctly for onpagehide property on Window
-PASS Window interface: attribute onpageshow
-PASS Unscopable handled correctly for onpageshow property on Window
-PASS Window interface: attribute onpopstate
-PASS Unscopable handled correctly for onpopstate property on Window
-PASS Window interface: attribute onrejectionhandled
-PASS Unscopable handled correctly for onrejectionhandled property on Window
-PASS Window interface: attribute onstorage
-PASS Unscopable handled correctly for onstorage property on Window
-PASS Window interface: attribute onunhandledrejection
-PASS Unscopable handled correctly for onunhandledrejection property on Window
-PASS Window interface: attribute onunload
-PASS Unscopable handled correctly for onunload property on Window
-PASS Window interface: attribute origin
-PASS Unscopable handled correctly for origin property on Window
-PASS Window interface: operation btoa(DOMString)
-PASS Unscopable handled correctly for btoa(DOMString) on Window
-PASS Window interface: operation atob(DOMString)
-PASS Unscopable handled correctly for atob(DOMString) on Window
-PASS Window interface: operation setTimeout(TimerHandler, long, any)
-PASS Unscopable handled correctly for setTimeout(TimerHandler, long, any) on Window
-PASS Window interface: operation clearTimeout(long)
-PASS Unscopable handled correctly for clearTimeout(long) on Window
-PASS Window interface: operation setInterval(TimerHandler, long, any)
-PASS Unscopable handled correctly for setInterval(TimerHandler, long, any) on Window
-PASS Window interface: operation clearInterval(long)
-PASS Unscopable handled correctly for clearInterval(long) on Window
-PASS Window interface: operation createImageBitmap(ImageBitmapSource, ImageBitmapOptions)
-PASS Unscopable handled correctly for createImageBitmap(ImageBitmapSource, ImageBitmapOptions) on Window
-PASS Window interface: operation createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions)
-PASS Unscopable handled correctly for createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions) on Window
-PASS Window interface: attribute sessionStorage
-PASS Unscopable handled correctly for sessionStorage property on Window
-PASS Window interface: attribute localStorage
-PASS Unscopable handled correctly for localStorage property on Window
-PASS Window interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Object.setPrototypeOf should throw a TypeError
-PASS Window interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via __proto__ should throw a TypeError
-PASS Window interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Reflect.setPrototypeOf should return false
-PASS Window interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Object.setPrototypeOf should not throw
-PASS Window interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via __proto__ should not throw
-PASS Window interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Reflect.setPrototypeOf should return true
-PASS Window must be primary interface of window
-PASS Stringification of window
-FAIL Window interface: window must have own property "window" assert_false: property descriptor should not have a "value" field expected false got true
-FAIL Window interface: window must inherit property "self" with the proper type Unrecognized type WindowProxy
-PASS Window interface: window must have own property "document"
-PASS Window interface: window must inherit property "name" with the proper type
-FAIL Window interface: window must have own property "location" assert_false: property descriptor should not have a "value" field expected false got true
-PASS Window interface: window must inherit property "history" with the proper type
-PASS Window interface: window must inherit property "customElements" with the proper type
-PASS Window interface: window must inherit property "locationbar" with the proper type
-PASS Window interface: window must inherit property "menubar" with the proper type
-PASS Window interface: window must inherit property "personalbar" with the proper type
-PASS Window interface: window must inherit property "scrollbars" with the proper type
-PASS Window interface: window must inherit property "statusbar" with the proper type
-PASS Window interface: window must inherit property "toolbar" with the proper type
-PASS Window interface: window must inherit property "status" with the proper type
-PASS Window interface: window must inherit property "close()" with the proper type
-PASS Window interface: window must inherit property "closed" with the proper type
-PASS Window interface: window must inherit property "stop()" with the proper type
-PASS Window interface: window must inherit property "focus()" with the proper type
-PASS Window interface: window must inherit property "blur()" with the proper type
-FAIL Window interface: window must inherit property "frames" with the proper type Unrecognized type WindowProxy
-PASS Window interface: window must inherit property "length" with the proper type
-FAIL Window interface: window must have own property "top" assert_false: property descriptor should not have a "value" field expected false got true
-PASS Window interface: window must inherit property "opener" with the proper type
-FAIL Window interface: window must inherit property "parent" with the proper type Unrecognized type WindowProxy
-PASS Window interface: window must inherit property "frameElement" with the proper type
-PASS Window interface: window must inherit property "open(USVString, DOMString, DOMString)" with the proper type
-PASS Window interface: calling open(USVString, DOMString, DOMString) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "navigator" with the proper type
-PASS Window interface: window must inherit property "applicationCache" with the proper type
-PASS Window interface: window must inherit property "alert()" with the proper type
-PASS Window interface: window must inherit property "alert(DOMString)" with the proper type
-PASS Window interface: calling alert(DOMString) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "confirm(DOMString)" with the proper type
-PASS Window interface: calling confirm(DOMString) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "prompt(DOMString, DOMString)" with the proper type
-PASS Window interface: calling prompt(DOMString, DOMString) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "print()" with the proper type
-PASS Window interface: window must inherit property "requestAnimationFrame(FrameRequestCallback)" with the proper type
-PASS Window interface: calling requestAnimationFrame(FrameRequestCallback) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "cancelAnimationFrame(unsigned long)" with the proper type
-PASS Window interface: calling cancelAnimationFrame(unsigned long) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "postMessage(any, USVString, [object Object])" with the proper type
-PASS Window interface: calling postMessage(any, USVString, [object Object]) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "captureEvents()" with the proper type
-PASS Window interface: window must inherit property "releaseEvents()" with the proper type
-PASS Window interface: window must inherit property "external" with the proper type
-PASS Window interface: window must inherit property "onabort" with the proper type
-PASS Window interface: window must inherit property "onauxclick" with the proper type
-PASS Window interface: window must inherit property "onblur" with the proper type
-PASS Window interface: window must inherit property "oncancel" with the proper type
-PASS Window interface: window must inherit property "oncanplay" with the proper type
-PASS Window interface: window must inherit property "oncanplaythrough" with the proper type
-PASS Window interface: window must inherit property "onchange" with the proper type
-PASS Window interface: window must inherit property "onclick" with the proper type
-PASS Window interface: window must inherit property "onclose" with the proper type
-PASS Window interface: window must inherit property "oncontextmenu" with the proper type
-PASS Window interface: window must inherit property "oncuechange" with the proper type
-PASS Window interface: window must inherit property "ondblclick" with the proper type
-PASS Window interface: window must inherit property "ondrag" with the proper type
-PASS Window interface: window must inherit property "ondragend" with the proper type
-PASS Window interface: window must inherit property "ondragenter" with the proper type
-FAIL Window interface: window must inherit property "ondragexit" with the proper type assert_own_property: expected property "ondragexit" missing
-PASS Window interface: window must inherit property "ondragleave" with the proper type
-PASS Window interface: window must inherit property "ondragover" with the proper type
-PASS Window interface: window must inherit property "ondragstart" with the proper type
-PASS Window interface: window must inherit property "ondrop" with the proper type
-PASS Window interface: window must inherit property "ondurationchange" with the proper type
-PASS Window interface: window must inherit property "onemptied" with the proper type
-PASS Window interface: window must inherit property "onended" with the proper type
-PASS Window interface: window must inherit property "onerror" with the proper type
-PASS Window interface: window must inherit property "onfocus" with the proper type
-PASS Window interface: window must inherit property "oninput" with the proper type
-PASS Window interface: window must inherit property "oninvalid" with the proper type
-PASS Window interface: window must inherit property "onkeydown" with the proper type
-PASS Window interface: window must inherit property "onkeypress" with the proper type
-PASS Window interface: window must inherit property "onkeyup" with the proper type
-PASS Window interface: window must inherit property "onload" with the proper type
-PASS Window interface: window must inherit property "onloadeddata" with the proper type
-PASS Window interface: window must inherit property "onloadedmetadata" with the proper type
-FAIL Window interface: window must inherit property "onloadend" with the proper type assert_own_property: expected property "onloadend" missing
-PASS Window interface: window must inherit property "onloadstart" with the proper type
-PASS Window interface: window must inherit property "onmousedown" with the proper type
-PASS Window interface: window must inherit property "onmouseenter" with the proper type
-PASS Window interface: window must inherit property "onmouseleave" with the proper type
-PASS Window interface: window must inherit property "onmousemove" with the proper type
-PASS Window interface: window must inherit property "onmouseout" with the proper type
-PASS Window interface: window must inherit property "onmouseover" with the proper type
-PASS Window interface: window must inherit property "onmouseup" with the proper type
-PASS Window interface: window must inherit property "onwheel" with the proper type
-PASS Window interface: window must inherit property "onpause" with the proper type
-PASS Window interface: window must inherit property "onplay" with the proper type
-PASS Window interface: window must inherit property "onplaying" with the proper type
-PASS Window interface: window must inherit property "onprogress" with the proper type
-PASS Window interface: window must inherit property "onratechange" with the proper type
-PASS Window interface: window must inherit property "onreset" with the proper type
-PASS Window interface: window must inherit property "onresize" with the proper type
-PASS Window interface: window must inherit property "onscroll" with the proper type
-FAIL Window interface: window must inherit property "onsecuritypolicyviolation" with the proper type assert_own_property: expected property "onsecuritypolicyviolation" missing
-PASS Window interface: window must inherit property "onseeked" with the proper type
-PASS Window interface: window must inherit property "onseeking" with the proper type
-PASS Window interface: window must inherit property "onselect" with the proper type
-PASS Window interface: window must inherit property "onstalled" with the proper type
-PASS Window interface: window must inherit property "onsubmit" with the proper type
-PASS Window interface: window must inherit property "onsuspend" with the proper type
-PASS Window interface: window must inherit property "ontimeupdate" with the proper type
-PASS Window interface: window must inherit property "ontoggle" with the proper type
-PASS Window interface: window must inherit property "onvolumechange" with the proper type
-PASS Window interface: window must inherit property "onwaiting" with the proper type
-PASS Window interface: window must inherit property "onafterprint" with the proper type
-PASS Window interface: window must inherit property "onbeforeprint" with the proper type
-PASS Window interface: window must inherit property "onbeforeunload" with the proper type
-PASS Window interface: window must inherit property "onhashchange" with the proper type
-PASS Window interface: window must inherit property "onlanguagechange" with the proper type
-PASS Window interface: window must inherit property "onmessage" with the proper type
-PASS Window interface: window must inherit property "onmessageerror" with the proper type
-PASS Window interface: window must inherit property "onoffline" with the proper type
-PASS Window interface: window must inherit property "ononline" with the proper type
-PASS Window interface: window must inherit property "onpagehide" with the proper type
-PASS Window interface: window must inherit property "onpageshow" with the proper type
-PASS Window interface: window must inherit property "onpopstate" with the proper type
-PASS Window interface: window must inherit property "onrejectionhandled" with the proper type
-PASS Window interface: window must inherit property "onstorage" with the proper type
-PASS Window interface: window must inherit property "onunhandledrejection" with the proper type
-PASS Window interface: window must inherit property "onunload" with the proper type
-PASS Window interface: window must inherit property "origin" with the proper type
-PASS Window interface: window must inherit property "btoa(DOMString)" with the proper type
-PASS Window interface: calling btoa(DOMString) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "atob(DOMString)" with the proper type
-PASS Window interface: calling atob(DOMString) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "setTimeout(TimerHandler, long, any)" with the proper type
-PASS Window interface: calling setTimeout(TimerHandler, long, any) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "clearTimeout(long)" with the proper type
-PASS Window interface: calling clearTimeout(long) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "setInterval(TimerHandler, long, any)" with the proper type
-PASS Window interface: calling setInterval(TimerHandler, long, any) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "clearInterval(long)" with the proper type
-PASS Window interface: calling clearInterval(long) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "createImageBitmap(ImageBitmapSource, ImageBitmapOptions)" with the proper type
-PASS Window interface: calling createImageBitmap(ImageBitmapSource, ImageBitmapOptions) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions)" with the proper type
-PASS Window interface: calling createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "sessionStorage" with the proper type
-PASS Window interface: window must inherit property "localStorage" with the proper type
-PASS BarProp interface: existence and properties of interface object
-PASS BarProp interface object length
-PASS BarProp interface object name
-PASS BarProp interface: existence and properties of interface prototype object
-PASS BarProp interface: existence and properties of interface prototype object's "constructor" property
-PASS BarProp interface: existence and properties of interface prototype object's @@unscopables property
-PASS BarProp interface: attribute visible
-PASS Unscopable handled correctly for visible property on BarProp
-PASS History interface: existence and properties of interface object
-PASS History interface object length
-PASS History interface object name
-PASS History interface: existence and properties of interface prototype object
-PASS History interface: existence and properties of interface prototype object's "constructor" property
-PASS History interface: existence and properties of interface prototype object's @@unscopables property
-FAIL History interface: attribute index assert_true: The prototype object must have a property "index" expected true got false
-PASS Unscopable handled correctly for index property on History
-PASS History interface: attribute length
-PASS Unscopable handled correctly for length property on History
-PASS History interface: attribute scrollRestoration
-PASS Unscopable handled correctly for scrollRestoration property on History
-PASS History interface: attribute state
-PASS Unscopable handled correctly for state property on History
-PASS History interface: operation go(long)
-PASS Unscopable handled correctly for go(long) on History
-PASS History interface: operation back()
-PASS Unscopable handled correctly for back() on History
-PASS History interface: operation forward()
-PASS Unscopable handled correctly for forward() on History
-PASS History interface: operation pushState(any, DOMString, USVString)
-PASS Unscopable handled correctly for pushState(any, DOMString, USVString) on History
-PASS History interface: operation replaceState(any, DOMString, USVString)
-PASS Unscopable handled correctly for replaceState(any, DOMString, USVString) on History
-PASS History must be primary interface of window.history
-PASS Stringification of window.history
-FAIL History interface: window.history must inherit property "index" with the proper type assert_inherits: property "index" not found in prototype chain
-PASS History interface: window.history must inherit property "length" with the proper type
-PASS History interface: window.history must inherit property "scrollRestoration" with the proper type
-PASS History interface: window.history must inherit property "state" with the proper type
-PASS History interface: window.history must inherit property "go(long)" with the proper type
-PASS History interface: calling go(long) on window.history with too few arguments must throw TypeError
-PASS History interface: window.history must inherit property "back()" with the proper type
-PASS History interface: window.history must inherit property "forward()" with the proper type
-PASS History interface: window.history must inherit property "pushState(any, DOMString, USVString)" with the proper type
-PASS History interface: calling pushState(any, DOMString, USVString) on window.history with too few arguments must throw TypeError
-PASS History interface: window.history must inherit property "replaceState(any, DOMString, USVString)" with the proper type
-PASS History interface: calling replaceState(any, DOMString, USVString) on window.history with too few arguments must throw TypeError
-PASS Location interface: existence and properties of interface object
-PASS Location interface object length
-PASS Location interface object name
-PASS Location interface: existence and properties of interface prototype object
-PASS Location interface: existence and properties of interface prototype object's "constructor" property
-PASS Location interface: existence and properties of interface prototype object's @@unscopables property
-FAIL Location interface: stringifier assert_own_property: interface prototype object missing non-static operation expected property "toString" missing
-PASS Location must be primary interface of window.location
-PASS Stringification of window.location
-FAIL Location interface: window.location must have own property "href" assert_false: property descriptor should not have a "value" field expected false got true
-PASS Location interface: window.location must have own property "origin"
-PASS Location interface: window.location must have own property "protocol"
-PASS Location interface: window.location must have own property "host"
-PASS Location interface: window.location must have own property "hostname"
-PASS Location interface: window.location must have own property "port"
-PASS Location interface: window.location must have own property "pathname"
-PASS Location interface: window.location must have own property "search"
-PASS Location interface: window.location must have own property "hash"
-PASS Location interface: window.location must have own property "assign"
-PASS Location interface: calling assign(USVString) on window.location with too few arguments must throw TypeError
-PASS Location interface: window.location must have own property "replace"
-PASS Location interface: calling replace(USVString) on window.location with too few arguments must throw TypeError
-PASS Location interface: window.location must have own property "reload"
-PASS Location interface: window.location must have own property "ancestorOrigins"
-PASS PopStateEvent interface: existence and properties of interface object
-PASS PopStateEvent interface object length
-PASS PopStateEvent interface object name
-PASS PopStateEvent interface: existence and properties of interface prototype object
-PASS PopStateEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS PopStateEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS PopStateEvent interface: attribute state
-PASS Unscopable handled correctly for state property on PopStateEvent
-PASS PopStateEvent must be primary interface of new PopStateEvent("popstate", { data: {} })
-PASS Stringification of new PopStateEvent("popstate", { data: {} })
-PASS PopStateEvent interface: new PopStateEvent("popstate", { data: {} }) must inherit property "state" with the proper type
-PASS HashChangeEvent interface: existence and properties of interface object
-PASS HashChangeEvent interface object length
-PASS HashChangeEvent interface object name
-PASS HashChangeEvent interface: existence and properties of interface prototype object
-PASS HashChangeEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS HashChangeEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS HashChangeEvent interface: attribute oldURL
-PASS Unscopable handled correctly for oldURL property on HashChangeEvent
-PASS HashChangeEvent interface: attribute newURL
-PASS Unscopable handled correctly for newURL property on HashChangeEvent
-PASS PageTransitionEvent interface: existence and properties of interface object
-PASS PageTransitionEvent interface object length
-PASS PageTransitionEvent interface object name
-PASS PageTransitionEvent interface: existence and properties of interface prototype object
-PASS PageTransitionEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS PageTransitionEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS PageTransitionEvent interface: attribute persisted
-PASS Unscopable handled correctly for persisted property on PageTransitionEvent
-PASS BeforeUnloadEvent interface: existence and properties of interface object
-PASS BeforeUnloadEvent interface object length
-PASS BeforeUnloadEvent interface object name
-PASS BeforeUnloadEvent interface: existence and properties of interface prototype object
-PASS BeforeUnloadEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS BeforeUnloadEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS BeforeUnloadEvent interface: attribute returnValue
-PASS Unscopable handled correctly for returnValue property on BeforeUnloadEvent
-PASS ApplicationCache interface: existence and properties of interface object
-PASS ApplicationCache interface object length
-PASS ApplicationCache interface object name
-PASS ApplicationCache interface: existence and properties of interface prototype object
-PASS ApplicationCache interface: existence and properties of interface prototype object's "constructor" property
-PASS ApplicationCache interface: existence and properties of interface prototype object's @@unscopables property
-PASS ApplicationCache interface: constant UNCACHED on interface object
-PASS ApplicationCache interface: constant UNCACHED on interface prototype object
-PASS ApplicationCache interface: constant IDLE on interface object
-PASS ApplicationCache interface: constant IDLE on interface prototype object
-PASS ApplicationCache interface: constant CHECKING on interface object
-PASS ApplicationCache interface: constant CHECKING on interface prototype object
-PASS ApplicationCache interface: constant DOWNLOADING on interface object
-PASS ApplicationCache interface: constant DOWNLOADING on interface prototype object
-PASS ApplicationCache interface: constant UPDATEREADY on interface object
-PASS ApplicationCache interface: constant UPDATEREADY on interface prototype object
-PASS ApplicationCache interface: constant OBSOLETE on interface object
-PASS ApplicationCache interface: constant OBSOLETE on interface prototype object
-PASS ApplicationCache interface: attribute status
-PASS Unscopable handled correctly for status property on ApplicationCache
-PASS ApplicationCache interface: operation update()
-PASS Unscopable handled correctly for update() on ApplicationCache
-PASS ApplicationCache interface: operation abort()
-PASS Unscopable handled correctly for abort() on ApplicationCache
-PASS ApplicationCache interface: operation swapCache()
-PASS Unscopable handled correctly for swapCache() on ApplicationCache
-PASS ApplicationCache interface: attribute onchecking
-PASS Unscopable handled correctly for onchecking property on ApplicationCache
-PASS ApplicationCache interface: attribute onerror
-PASS Unscopable handled correctly for onerror property on ApplicationCache
-PASS ApplicationCache interface: attribute onnoupdate
-PASS Unscopable handled correctly for onnoupdate property on ApplicationCache
-PASS ApplicationCache interface: attribute ondownloading
-PASS Unscopable handled correctly for ondownloading property on ApplicationCache
-PASS ApplicationCache interface: attribute onprogress
-PASS Unscopable handled correctly for onprogress property on ApplicationCache
-PASS ApplicationCache interface: attribute onupdateready
-PASS Unscopable handled correctly for onupdateready property on ApplicationCache
-PASS ApplicationCache interface: attribute oncached
-PASS Unscopable handled correctly for oncached property on ApplicationCache
-PASS ApplicationCache interface: attribute onobsolete
-PASS Unscopable handled correctly for onobsolete property on ApplicationCache
-PASS ApplicationCache must be primary interface of window.applicationCache
-PASS Stringification of window.applicationCache
-PASS ApplicationCache interface: window.applicationCache must inherit property "UNCACHED" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "IDLE" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "CHECKING" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "DOWNLOADING" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "UPDATEREADY" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "OBSOLETE" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "status" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "update()" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "abort()" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "swapCache()" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "onchecking" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "onerror" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "onnoupdate" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "ondownloading" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "onprogress" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "onupdateready" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "oncached" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "onobsolete" with the proper type
-PASS ErrorEvent interface: existence and properties of interface object
-PASS ErrorEvent interface object length
-PASS ErrorEvent interface object name
-PASS ErrorEvent interface: existence and properties of interface prototype object
-PASS ErrorEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS ErrorEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS ErrorEvent interface: attribute message
-PASS Unscopable handled correctly for message property on ErrorEvent
-PASS ErrorEvent interface: attribute filename
-PASS Unscopable handled correctly for filename property on ErrorEvent
-PASS ErrorEvent interface: attribute lineno
-PASS Unscopable handled correctly for lineno property on ErrorEvent
-PASS ErrorEvent interface: attribute colno
-PASS Unscopable handled correctly for colno property on ErrorEvent
-PASS ErrorEvent interface: attribute error
-PASS Unscopable handled correctly for error property on ErrorEvent
-PASS PromiseRejectionEvent interface: existence and properties of interface object
-PASS PromiseRejectionEvent interface object length
-PASS PromiseRejectionEvent interface object name
-PASS PromiseRejectionEvent interface: existence and properties of interface prototype object
-PASS PromiseRejectionEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS PromiseRejectionEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS PromiseRejectionEvent interface: attribute promise
-PASS Unscopable handled correctly for promise property on PromiseRejectionEvent
-PASS PromiseRejectionEvent interface: attribute reason
-PASS Unscopable handled correctly for reason property on PromiseRejectionEvent
-PASS Navigator interface: existence and properties of interface object
-PASS Navigator interface object length
-PASS Navigator interface object name
-PASS Navigator interface: existence and properties of interface prototype object
-PASS Navigator interface: existence and properties of interface prototype object's "constructor" property
-PASS Navigator interface: existence and properties of interface prototype object's @@unscopables property
-PASS Navigator interface: attribute appCodeName
-PASS Unscopable handled correctly for appCodeName property on Navigator
-PASS Navigator interface: attribute appName
-PASS Unscopable handled correctly for appName property on Navigator
-PASS Navigator interface: attribute appVersion
-PASS Unscopable handled correctly for appVersion property on Navigator
-PASS Navigator interface: attribute platform
-PASS Unscopable handled correctly for platform property on Navigator
-PASS Navigator interface: attribute product
-PASS Unscopable handled correctly for product property on Navigator
-PASS Navigator interface: attribute productSub
-PASS Unscopable handled correctly for productSub property on Navigator
-PASS Navigator interface: attribute userAgent
-PASS Unscopable handled correctly for userAgent property on Navigator
-PASS Navigator interface: attribute vendor
-PASS Unscopable handled correctly for vendor property on Navigator
-PASS Navigator interface: attribute vendorSub
-PASS Unscopable handled correctly for vendorSub property on Navigator
-FAIL Navigator interface: operation taintEnabled() assert_own_property: interface prototype object missing non-static operation expected property "taintEnabled" missing
-PASS Unscopable handled correctly for taintEnabled() on Navigator
-FAIL Navigator interface: attribute oscpu assert_true: The prototype object must have a property "oscpu" expected true got false
-PASS Unscopable handled correctly for oscpu property on Navigator
-PASS Navigator interface: attribute language
-PASS Unscopable handled correctly for language property on Navigator
-PASS Navigator interface: attribute languages
-PASS Unscopable handled correctly for languages property on Navigator
-PASS Navigator interface: attribute onLine
-PASS Unscopable handled correctly for onLine property on Navigator
-PASS Navigator interface: operation registerProtocolHandler(DOMString, USVString, DOMString)
-PASS Unscopable handled correctly for registerProtocolHandler(DOMString, USVString, DOMString) on Navigator
-PASS Navigator interface: operation unregisterProtocolHandler(DOMString, USVString)
-PASS Unscopable handled correctly for unregisterProtocolHandler(DOMString, USVString) on Navigator
-PASS Navigator interface: attribute cookieEnabled
-PASS Unscopable handled correctly for cookieEnabled property on Navigator
-PASS Navigator interface: attribute plugins
-PASS Unscopable handled correctly for plugins property on Navigator
-PASS Navigator interface: attribute mimeTypes
-PASS Unscopable handled correctly for mimeTypes property on Navigator
-PASS Navigator interface: operation javaEnabled()
-PASS Unscopable handled correctly for javaEnabled() on Navigator
-PASS Navigator interface: attribute hardwareConcurrency
-PASS Unscopable handled correctly for hardwareConcurrency property on Navigator
-PASS Navigator must be primary interface of window.navigator
-PASS Stringification of window.navigator
-PASS Navigator interface: window.navigator must inherit property "appCodeName" with the proper type
-PASS Navigator interface: window.navigator must inherit property "appName" with the proper type
-PASS Navigator interface: window.navigator must inherit property "appVersion" with the proper type
-PASS Navigator interface: window.navigator must inherit property "platform" with the proper type
-PASS Navigator interface: window.navigator must inherit property "product" with the proper type
-PASS Navigator interface: window.navigator must inherit property "productSub" with the proper type
-PASS Navigator interface: window.navigator must inherit property "userAgent" with the proper type
-PASS Navigator interface: window.navigator must inherit property "vendor" with the proper type
-PASS Navigator interface: window.navigator must inherit property "vendorSub" with the proper type
-FAIL Navigator interface: window.navigator must inherit property "taintEnabled()" with the proper type assert_inherits: property "taintEnabled" not found in prototype chain
-FAIL Navigator interface: window.navigator must inherit property "oscpu" with the proper type assert_inherits: property "oscpu" not found in prototype chain
-PASS Navigator interface: window.navigator must inherit property "language" with the proper type
-PASS Navigator interface: window.navigator must inherit property "languages" with the proper type
-PASS Navigator interface: window.navigator must inherit property "onLine" with the proper type
-PASS Navigator interface: window.navigator must inherit property "registerProtocolHandler(DOMString, USVString, DOMString)" with the proper type
-PASS Navigator interface: calling registerProtocolHandler(DOMString, USVString, DOMString) on window.navigator with too few arguments must throw TypeError
-PASS Navigator interface: window.navigator must inherit property "unregisterProtocolHandler(DOMString, USVString)" with the proper type
-PASS Navigator interface: calling unregisterProtocolHandler(DOMString, USVString) on window.navigator with too few arguments must throw TypeError
-PASS Navigator interface: window.navigator must inherit property "cookieEnabled" with the proper type
-PASS Navigator interface: window.navigator must inherit property "plugins" with the proper type
-PASS Navigator interface: window.navigator must inherit property "mimeTypes" with the proper type
-PASS Navigator interface: window.navigator must inherit property "javaEnabled()" with the proper type
-PASS Navigator interface: window.navigator must inherit property "hardwareConcurrency" with the proper type
-PASS PluginArray interface: existence and properties of interface object
-PASS PluginArray interface object length
-PASS PluginArray interface object name
-PASS PluginArray interface: existence and properties of interface prototype object
-PASS PluginArray interface: existence and properties of interface prototype object's "constructor" property
-PASS PluginArray interface: existence and properties of interface prototype object's @@unscopables property
-PASS PluginArray interface: operation refresh(boolean)
-PASS Unscopable handled correctly for refresh(boolean) on PluginArray
-PASS PluginArray interface: attribute length
-PASS Unscopable handled correctly for length property on PluginArray
-PASS PluginArray interface: operation item(unsigned long)
-PASS Unscopable handled correctly for item(unsigned long) on PluginArray
-PASS PluginArray interface: operation namedItem(DOMString)
-PASS Unscopable handled correctly for namedItem(DOMString) on PluginArray
-PASS MimeTypeArray interface: existence and properties of interface object
-PASS MimeTypeArray interface object length
-PASS MimeTypeArray interface object name
-PASS MimeTypeArray interface: existence and properties of interface prototype object
-PASS MimeTypeArray interface: existence and properties of interface prototype object's "constructor" property
-PASS MimeTypeArray interface: existence and properties of interface prototype object's @@unscopables property
-PASS MimeTypeArray interface: attribute length
-PASS Unscopable handled correctly for length property on MimeTypeArray
-PASS MimeTypeArray interface: operation item(unsigned long)
-PASS Unscopable handled correctly for item(unsigned long) on MimeTypeArray
-PASS MimeTypeArray interface: operation namedItem(DOMString)
-PASS Unscopable handled correctly for namedItem(DOMString) on MimeTypeArray
-PASS Plugin interface: existence and properties of interface object
-PASS Plugin interface object length
-PASS Plugin interface object name
-PASS Plugin interface: existence and properties of interface prototype object
-PASS Plugin interface: existence and properties of interface prototype object's "constructor" property
-PASS Plugin interface: existence and properties of interface prototype object's @@unscopables property
-PASS Plugin interface: attribute name
-PASS Unscopable handled correctly for name property on Plugin
-PASS Plugin interface: attribute description
-PASS Unscopable handled correctly for description property on Plugin
-PASS Plugin interface: attribute filename
-PASS Unscopable handled correctly for filename property on Plugin
-PASS Plugin interface: attribute length
-PASS Unscopable handled correctly for length property on Plugin
-PASS Plugin interface: operation item(unsigned long)
-PASS Unscopable handled correctly for item(unsigned long) on Plugin
-PASS Plugin interface: operation namedItem(DOMString)
-PASS Unscopable handled correctly for namedItem(DOMString) on Plugin
-PASS MimeType interface: existence and properties of interface object
-PASS MimeType interface object length
-PASS MimeType interface object name
-PASS MimeType interface: existence and properties of interface prototype object
-PASS MimeType interface: existence and properties of interface prototype object's "constructor" property
-PASS MimeType interface: existence and properties of interface prototype object's @@unscopables property
-PASS MimeType interface: attribute type
-PASS Unscopable handled correctly for type property on MimeType
-PASS MimeType interface: attribute description
-PASS Unscopable handled correctly for description property on MimeType
-PASS MimeType interface: attribute suffixes
-PASS Unscopable handled correctly for suffixes property on MimeType
-PASS MimeType interface: attribute enabledPlugin
-PASS Unscopable handled correctly for enabledPlugin property on MimeType
-PASS ImageBitmap interface: existence and properties of interface object
-PASS ImageBitmap interface object length
-PASS ImageBitmap interface object name
-PASS ImageBitmap interface: existence and properties of interface prototype object
-PASS ImageBitmap interface: existence and properties of interface prototype object's "constructor" property
-PASS ImageBitmap interface: existence and properties of interface prototype object's @@unscopables property
-PASS ImageBitmap interface: attribute width
-PASS Unscopable handled correctly for width property on ImageBitmap
-PASS ImageBitmap interface: attribute height
-PASS Unscopable handled correctly for height property on ImageBitmap
-PASS ImageBitmap interface: operation close()
-PASS Unscopable handled correctly for close() on ImageBitmap
-PASS MessageEvent interface: existence and properties of interface object
-PASS MessageEvent interface object length
-PASS MessageEvent interface object name
-PASS MessageEvent interface: existence and properties of interface prototype object
-PASS MessageEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS MessageEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS MessageEvent interface: attribute data
-PASS Unscopable handled correctly for data property on MessageEvent
-PASS MessageEvent interface: attribute origin
-PASS Unscopable handled correctly for origin property on MessageEvent
-PASS MessageEvent interface: attribute lastEventId
-PASS Unscopable handled correctly for lastEventId property on MessageEvent
-PASS MessageEvent interface: attribute source
-PASS Unscopable handled correctly for source property on MessageEvent
-PASS MessageEvent interface: attribute ports
-PASS Unscopable handled correctly for ports property on MessageEvent
-PASS MessageEvent interface: operation initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object])
-PASS Unscopable handled correctly for initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object]) on MessageEvent
-PASS MessageEvent must be primary interface of new MessageEvent("message", { data: 5 })
-PASS Stringification of new MessageEvent("message", { data: 5 })
-PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "data" with the proper type
-PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "origin" with the proper type
-PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "lastEventId" with the proper type
-FAIL MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type Unrecognized type WindowProxy
-PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "ports" with the proper type
-PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object])" with the proper type
-PASS MessageEvent interface: calling initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object]) on new MessageEvent("message", { data: 5 }) with too few arguments must throw TypeError
-PASS EventSource interface: existence and properties of interface object
-PASS EventSource interface object length
-PASS EventSource interface object name
-PASS EventSource interface: existence and properties of interface prototype object
-PASS EventSource interface: existence and properties of interface prototype object's "constructor" property
-PASS EventSource interface: existence and properties of interface prototype object's @@unscopables property
-PASS EventSource interface: attribute url
-PASS Unscopable handled correctly for url property on EventSource
-PASS EventSource interface: attribute withCredentials
-PASS Unscopable handled correctly for withCredentials property on EventSource
-PASS EventSource interface: constant CONNECTING on interface object
-PASS EventSource interface: constant CONNECTING on interface prototype object
-PASS EventSource interface: constant OPEN on interface object
-PASS EventSource interface: constant OPEN on interface prototype object
-PASS EventSource interface: constant CLOSED on interface object
-PASS EventSource interface: constant CLOSED on interface prototype object
-PASS EventSource interface: attribute readyState
-PASS Unscopable handled correctly for readyState property on EventSource
-PASS EventSource interface: attribute onopen
-PASS Unscopable handled correctly for onopen property on EventSource
-PASS EventSource interface: attribute onmessage
-PASS Unscopable handled correctly for onmessage property on EventSource
-PASS EventSource interface: attribute onerror
-PASS Unscopable handled correctly for onerror property on EventSource
-PASS EventSource interface: operation close()
-PASS Unscopable handled correctly for close() on EventSource
-PASS WebSocket interface: existence and properties of interface object
-PASS WebSocket interface object length
-PASS WebSocket interface object name
-PASS WebSocket interface: existence and properties of interface prototype object
-PASS WebSocket interface: existence and properties of interface prototype object's "constructor" property
-PASS WebSocket interface: existence and properties of interface prototype object's @@unscopables property
-PASS WebSocket interface: attribute url
-PASS Unscopable handled correctly for url property on WebSocket
-PASS WebSocket interface: constant CONNECTING on interface object
-PASS WebSocket interface: constant CONNECTING on interface prototype object
-PASS WebSocket interface: constant OPEN on interface object
-PASS WebSocket interface: constant OPEN on interface prototype object
-PASS WebSocket interface: constant CLOSING on interface object
-PASS WebSocket interface: constant CLOSING on interface prototype object
-PASS WebSocket interface: constant CLOSED on interface object
-PASS WebSocket interface: constant CLOSED on interface prototype object
-PASS WebSocket interface: attribute readyState
-PASS Unscopable handled correctly for readyState property on WebSocket
-PASS WebSocket interface: attribute bufferedAmount
-PASS Unscopable handled correctly for bufferedAmount property on WebSocket
-PASS WebSocket interface: attribute onopen
-PASS Unscopable handled correctly for onopen property on WebSocket
-PASS WebSocket interface: attribute onerror
-PASS Unscopable handled correctly for onerror property on WebSocket
-PASS WebSocket interface: attribute onclose
-PASS Unscopable handled correctly for onclose property on WebSocket
-PASS WebSocket interface: attribute extensions
-PASS Unscopable handled correctly for extensions property on WebSocket
-PASS WebSocket interface: attribute protocol
-PASS Unscopable handled correctly for protocol property on WebSocket
-PASS WebSocket interface: operation close(unsigned short, USVString)
-PASS Unscopable handled correctly for close(unsigned short, USVString) on WebSocket
-PASS WebSocket interface: attribute onmessage
-PASS Unscopable handled correctly for onmessage property on WebSocket
-PASS WebSocket interface: attribute binaryType
-PASS Unscopable handled correctly for binaryType property on WebSocket
-PASS WebSocket interface: operation send(USVString)
-PASS Unscopable handled correctly for send(USVString) on WebSocket
-PASS WebSocket interface: operation send(Blob)
-PASS Unscopable handled correctly for send(Blob) on WebSocket
-PASS WebSocket interface: operation send(ArrayBuffer)
-PASS Unscopable handled correctly for send(ArrayBuffer) on WebSocket
-PASS WebSocket interface: operation send(ArrayBufferView)
-PASS Unscopable handled correctly for send(ArrayBufferView) on WebSocket
-PASS WebSocket must be primary interface of new WebSocket("ws://foo")
-PASS Stringification of new WebSocket("ws://foo")
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "url" with the proper type
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "CONNECTING" with the proper type
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "OPEN" with the proper type
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "CLOSING" with the proper type
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "CLOSED" with the proper type
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "readyState" with the proper type
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "bufferedAmount" with the proper type
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onopen" with the proper type
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onerror" with the proper type
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onclose" with the proper type
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "extensions" with the proper type
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "protocol" with the proper type
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "close(unsigned short, USVString)" with the proper type
-PASS WebSocket interface: calling close(unsigned short, USVString) on new WebSocket("ws://foo") with too few arguments must throw TypeError
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onmessage" with the proper type
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "binaryType" with the proper type
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send(USVString)" with the proper type
-PASS WebSocket interface: calling send(USVString) on new WebSocket("ws://foo") with too few arguments must throw TypeError
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send(Blob)" with the proper type
-PASS WebSocket interface: calling send(Blob) on new WebSocket("ws://foo") with too few arguments must throw TypeError
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send(ArrayBuffer)" with the proper type
-PASS WebSocket interface: calling send(ArrayBuffer) on new WebSocket("ws://foo") with too few arguments must throw TypeError
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send(ArrayBufferView)" with the proper type
-PASS WebSocket interface: calling send(ArrayBufferView) on new WebSocket("ws://foo") with too few arguments must throw TypeError
-PASS CloseEvent interface: existence and properties of interface object
-PASS CloseEvent interface object length
-PASS CloseEvent interface object name
-PASS CloseEvent interface: existence and properties of interface prototype object
-PASS CloseEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS CloseEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS CloseEvent interface: attribute wasClean
-PASS Unscopable handled correctly for wasClean property on CloseEvent
-PASS CloseEvent interface: attribute code
-PASS Unscopable handled correctly for code property on CloseEvent
-PASS CloseEvent interface: attribute reason
-PASS Unscopable handled correctly for reason property on CloseEvent
-PASS CloseEvent must be primary interface of new CloseEvent("close")
-PASS Stringification of new CloseEvent("close")
-PASS CloseEvent interface: new CloseEvent("close") must inherit property "wasClean" with the proper type
-PASS CloseEvent interface: new CloseEvent("close") must inherit property "code" with the proper type
-PASS CloseEvent interface: new CloseEvent("close") must inherit property "reason" with the proper type
-PASS MessageChannel interface: existence and properties of interface object
-PASS MessageChannel interface object length
-PASS MessageChannel interface object name
-PASS MessageChannel interface: existence and properties of interface prototype object
-PASS MessageChannel interface: existence and properties of interface prototype object's "constructor" property
-PASS MessageChannel interface: existence and properties of interface prototype object's @@unscopables property
-PASS MessageChannel interface: attribute port1
-PASS Unscopable handled correctly for port1 property on MessageChannel
-PASS MessageChannel interface: attribute port2
-PASS Unscopable handled correctly for port2 property on MessageChannel
-PASS MessagePort interface: existence and properties of interface object
-PASS MessagePort interface object length
-PASS MessagePort interface object name
-PASS MessagePort interface: existence and properties of interface prototype object
-PASS MessagePort interface: existence and properties of interface prototype object's "constructor" property
-PASS MessagePort interface: existence and properties of interface prototype object's @@unscopables property
-PASS MessagePort interface: operation postMessage(any, [object Object])
-PASS Unscopable handled correctly for postMessage(any, [object Object]) on MessagePort
-PASS MessagePort interface: operation start()
-PASS Unscopable handled correctly for start() on MessagePort
-PASS MessagePort interface: operation close()
-PASS Unscopable handled correctly for close() on MessagePort
-PASS MessagePort interface: attribute onmessage
-PASS Unscopable handled correctly for onmessage property on MessagePort
-PASS MessagePort interface: attribute onmessageerror
-PASS Unscopable handled correctly for onmessageerror property on MessagePort
-PASS BroadcastChannel interface: existence and properties of interface object
-PASS BroadcastChannel interface object length
-PASS BroadcastChannel interface object name
-PASS BroadcastChannel interface: existence and properties of interface prototype object
-PASS BroadcastChannel interface: existence and properties of interface prototype object's "constructor" property
-PASS BroadcastChannel interface: existence and properties of interface prototype object's @@unscopables property
-PASS BroadcastChannel interface: attribute name
-PASS Unscopable handled correctly for name property on BroadcastChannel
-PASS BroadcastChannel interface: operation postMessage(any)
-PASS Unscopable handled correctly for postMessage(any) on BroadcastChannel
-PASS BroadcastChannel interface: operation close()
-PASS Unscopable handled correctly for close() on BroadcastChannel
-PASS BroadcastChannel interface: attribute onmessage
-PASS Unscopable handled correctly for onmessage property on BroadcastChannel
-PASS BroadcastChannel interface: attribute onmessageerror
-PASS Unscopable handled correctly for onmessageerror property on BroadcastChannel
-PASS WorkerGlobalScope interface: existence and properties of interface object
-PASS DedicatedWorkerGlobalScope interface: existence and properties of interface object
-PASS SharedWorkerGlobalScope interface: existence and properties of interface object
-PASS Worker interface: existence and properties of interface object
-PASS Worker interface object length
-PASS Worker interface object name
-PASS Worker interface: existence and properties of interface prototype object
-PASS Worker interface: existence and properties of interface prototype object's "constructor" property
-PASS Worker interface: existence and properties of interface prototype object's @@unscopables property
-PASS Worker interface: operation terminate()
-PASS Unscopable handled correctly for terminate() on Worker
-PASS Worker interface: operation postMessage(any, [object Object])
-PASS Unscopable handled correctly for postMessage(any, [object Object]) on Worker
-PASS Worker interface: attribute onmessage
-PASS Unscopable handled correctly for onmessage property on Worker
-FAIL Worker interface: attribute onmessageerror assert_true: The prototype object must have a property "onmessageerror" expected true got false
-PASS Unscopable handled correctly for onmessageerror property on Worker
-PASS Worker interface: attribute onerror
-PASS Unscopable handled correctly for onerror property on Worker
-PASS SharedWorker interface: existence and properties of interface object
-PASS SharedWorker interface object length
-PASS SharedWorker interface object name
-PASS SharedWorker interface: existence and properties of interface prototype object
-PASS SharedWorker interface: existence and properties of interface prototype object's "constructor" property
-PASS SharedWorker interface: existence and properties of interface prototype object's @@unscopables property
-PASS SharedWorker interface: attribute port
-PASS Unscopable handled correctly for port property on SharedWorker
-PASS SharedWorker interface: attribute onerror
-PASS Unscopable handled correctly for onerror property on SharedWorker
-PASS WorkerNavigator interface: existence and properties of interface object
-PASS WorkerLocation interface: existence and properties of interface object
-PASS Storage interface: existence and properties of interface object
-PASS Storage interface object length
-PASS Storage interface object name
-PASS Storage interface: existence and properties of interface prototype object
-PASS Storage interface: existence and properties of interface prototype object's "constructor" property
-PASS Storage interface: existence and properties of interface prototype object's @@unscopables property
-PASS Storage interface: attribute length
-PASS Unscopable handled correctly for length property on Storage
-PASS Storage interface: operation key(unsigned long)
-PASS Unscopable handled correctly for key(unsigned long) on Storage
-PASS Storage interface: operation getItem(DOMString)
-PASS Unscopable handled correctly for getItem(DOMString) on Storage
-PASS Storage interface: operation setItem(DOMString, DOMString)
-PASS Unscopable handled correctly for setItem(DOMString, DOMString) on Storage
-PASS Storage interface: operation removeItem(DOMString)
-PASS Unscopable handled correctly for removeItem(DOMString) on Storage
-PASS Storage interface: operation clear()
-PASS Unscopable handled correctly for clear() on Storage
-PASS StorageEvent interface: existence and properties of interface object
-PASS StorageEvent interface object length
-PASS StorageEvent interface object name
-PASS StorageEvent interface: existence and properties of interface prototype object
-PASS StorageEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS StorageEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS StorageEvent interface: attribute key
-PASS Unscopable handled correctly for key property on StorageEvent
-PASS StorageEvent interface: attribute oldValue
-PASS Unscopable handled correctly for oldValue property on StorageEvent
-PASS StorageEvent interface: attribute newValue
-PASS Unscopable handled correctly for newValue property on StorageEvent
-PASS StorageEvent interface: attribute url
-PASS Unscopable handled correctly for url property on StorageEvent
-PASS StorageEvent interface: attribute storageArea
-PASS Unscopable handled correctly for storageArea property on StorageEvent
-PASS HTMLMarqueeElement interface: existence and properties of interface object
-PASS HTMLMarqueeElement interface object length
-PASS HTMLMarqueeElement interface object name
-PASS HTMLMarqueeElement interface: existence and properties of interface prototype object
-PASS HTMLMarqueeElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLMarqueeElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLMarqueeElement interface: attribute behavior
-PASS Unscopable handled correctly for behavior property on HTMLMarqueeElement
-PASS HTMLMarqueeElement interface: attribute bgColor
-PASS Unscopable handled correctly for bgColor property on HTMLMarqueeElement
-PASS HTMLMarqueeElement interface: attribute direction
-PASS Unscopable handled correctly for direction property on HTMLMarqueeElement
-PASS HTMLMarqueeElement interface: attribute height
-PASS Unscopable handled correctly for height property on HTMLMarqueeElement
-PASS HTMLMarqueeElement interface: attribute hspace
-PASS Unscopable handled correctly for hspace property on HTMLMarqueeElement
-PASS HTMLMarqueeElement interface: attribute loop
-PASS Unscopable handled correctly for loop property on HTMLMarqueeElement
-PASS HTMLMarqueeElement interface: attribute scrollAmount
-PASS Unscopable handled correctly for scrollAmount property on HTMLMarqueeElement
-PASS HTMLMarqueeElement interface: attribute scrollDelay
-PASS Unscopable handled correctly for scrollDelay property on HTMLMarqueeElement
-PASS HTMLMarqueeElement interface: attribute trueSpeed
-PASS Unscopable handled correctly for trueSpeed property on HTMLMarqueeElement
-PASS HTMLMarqueeElement interface: attribute vspace
-PASS Unscopable handled correctly for vspace property on HTMLMarqueeElement
-PASS HTMLMarqueeElement interface: attribute width
-PASS Unscopable handled correctly for width property on HTMLMarqueeElement
-FAIL HTMLMarqueeElement interface: attribute onbounce assert_true: The prototype object must have a property "onbounce" expected true got false
-PASS Unscopable handled correctly for onbounce property on HTMLMarqueeElement
-FAIL HTMLMarqueeElement interface: attribute onfinish assert_true: The prototype object must have a property "onfinish" expected true got false
-PASS Unscopable handled correctly for onfinish property on HTMLMarqueeElement
-FAIL HTMLMarqueeElement interface: attribute onstart assert_true: The prototype object must have a property "onstart" expected true got false
-PASS Unscopable handled correctly for onstart property on HTMLMarqueeElement
-PASS HTMLMarqueeElement interface: operation start()
-PASS Unscopable handled correctly for start() on HTMLMarqueeElement
-PASS HTMLMarqueeElement interface: operation stop()
-PASS Unscopable handled correctly for stop() on HTMLMarqueeElement
-PASS HTMLMarqueeElement must be primary interface of document.createElement("marquee")
-PASS Stringification of document.createElement("marquee")
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "behavior" with the proper type
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "bgColor" with the proper type
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "direction" with the proper type
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "height" with the proper type
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "hspace" with the proper type
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "loop" with the proper type
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "scrollAmount" with the proper type
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "scrollDelay" with the proper type
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "trueSpeed" with the proper type
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "vspace" with the proper type
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "width" with the proper type
-FAIL HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onbounce" with the proper type assert_inherits: property "onbounce" not found in prototype chain
-FAIL HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onfinish" with the proper type assert_inherits: property "onfinish" not found in prototype chain
-FAIL HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onstart" with the proper type assert_inherits: property "onstart" not found in prototype chain
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "start()" with the proper type
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "stop()" with the proper type
-PASS HTMLFrameSetElement interface: existence and properties of interface object
-PASS HTMLFrameSetElement interface object length
-PASS HTMLFrameSetElement interface object name
-PASS HTMLFrameSetElement interface: existence and properties of interface prototype object
-PASS HTMLFrameSetElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLFrameSetElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLFrameSetElement interface: attribute cols
-PASS Unscopable handled correctly for cols property on HTMLFrameSetElement
-PASS HTMLFrameSetElement interface: attribute rows
-PASS Unscopable handled correctly for rows property on HTMLFrameSetElement
-PASS HTMLFrameSetElement interface: attribute onafterprint
-PASS Unscopable handled correctly for onafterprint property on HTMLFrameSetElement
-PASS HTMLFrameSetElement interface: attribute onbeforeprint
-PASS Unscopable handled correctly for onbeforeprint property on HTMLFrameSetElement
-PASS HTMLFrameSetElement interface: attribute onbeforeunload
-PASS Unscopable handled correctly for onbeforeunload property on HTMLFrameSetElement
-PASS HTMLFrameSetElement interface: attribute onhashchange
-PASS Unscopable handled correctly for onhashchange property on HTMLFrameSetElement
-PASS HTMLFrameSetElement interface: attribute onlanguagechange
-PASS Unscopable handled correctly for onlanguagechange property on HTMLFrameSetElement
-PASS HTMLFrameSetElement interface: attribute onmessage
-PASS Unscopable handled correctly for onmessage property on HTMLFrameSetElement
-PASS HTMLFrameSetElement interface: attribute onmessageerror
-PASS Unscopable handled correctly for onmessageerror property on HTMLFrameSetElement
-PASS HTMLFrameSetElement interface: attribute onoffline
-PASS Unscopable handled correctly for onoffline property on HTMLFrameSetElement
-PASS HTMLFrameSetElement interface: attribute ononline
-PASS Unscopable handled correctly for ononline property on HTMLFrameSetElement
-PASS HTMLFrameSetElement interface: attribute onpagehide
-PASS Unscopable handled correctly for onpagehide property on HTMLFrameSetElement
-PASS HTMLFrameSetElement interface: attribute onpageshow
-PASS Unscopable handled correctly for onpageshow property on HTMLFrameSetElement
-PASS HTMLFrameSetElement interface: attribute onpopstate
-PASS Unscopable handled correctly for onpopstate property on HTMLFrameSetElement
-PASS HTMLFrameSetElement interface: attribute onrejectionhandled
-PASS Unscopable handled correctly for onrejectionhandled property on HTMLFrameSetElement
-PASS HTMLFrameSetElement interface: attribute onstorage
-PASS Unscopable handled correctly for onstorage property on HTMLFrameSetElement
-PASS HTMLFrameSetElement interface: attribute onunhandledrejection
-PASS Unscopable handled correctly for onunhandledrejection property on HTMLFrameSetElement
-PASS HTMLFrameSetElement interface: attribute onunload
-PASS Unscopable handled correctly for onunload property on HTMLFrameSetElement
-PASS HTMLFrameSetElement must be primary interface of document.createElement("frameset")
-PASS Stringification of document.createElement("frameset")
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "cols" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "rows" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onafterprint" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onbeforeprint" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onbeforeunload" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onhashchange" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onlanguagechange" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onmessage" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onmessageerror" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onoffline" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "ononline" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpagehide" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpageshow" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpopstate" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onrejectionhandled" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onstorage" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onunhandledrejection" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onunload" with the proper type
-PASS HTMLFrameElement interface: existence and properties of interface object
-PASS HTMLFrameElement interface object length
-PASS HTMLFrameElement interface object name
-PASS HTMLFrameElement interface: existence and properties of interface prototype object
-PASS HTMLFrameElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLFrameElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLFrameElement interface: attribute name
-PASS Unscopable handled correctly for name property on HTMLFrameElement
-PASS HTMLFrameElement interface: attribute scrolling
-PASS Unscopable handled correctly for scrolling property on HTMLFrameElement
-PASS HTMLFrameElement interface: attribute src
-PASS Unscopable handled correctly for src property on HTMLFrameElement
-PASS HTMLFrameElement interface: attribute frameBorder
-PASS Unscopable handled correctly for frameBorder property on HTMLFrameElement
-PASS HTMLFrameElement interface: attribute longDesc
-PASS Unscopable handled correctly for longDesc property on HTMLFrameElement
-PASS HTMLFrameElement interface: attribute noResize
-PASS Unscopable handled correctly for noResize property on HTMLFrameElement
-PASS HTMLFrameElement interface: attribute contentDocument
-PASS Unscopable handled correctly for contentDocument property on HTMLFrameElement
-PASS HTMLFrameElement interface: attribute contentWindow
-PASS Unscopable handled correctly for contentWindow property on HTMLFrameElement
-PASS HTMLFrameElement interface: attribute marginHeight
-PASS Unscopable handled correctly for marginHeight property on HTMLFrameElement
-PASS HTMLFrameElement interface: attribute marginWidth
-PASS Unscopable handled correctly for marginWidth property on HTMLFrameElement
-PASS HTMLFrameElement must be primary interface of document.createElement("frame")
-PASS Stringification of document.createElement("frame")
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "name" with the proper type
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "scrolling" with the proper type
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "src" with the proper type
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "frameBorder" with the proper type
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "longDesc" with the proper type
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "noResize" with the proper type
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "contentDocument" with the proper type
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "contentWindow" with the proper type
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "marginHeight" with the proper type
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "marginWidth" with the proper type
-PASS HTMLDirectoryElement interface: existence and properties of interface object
-PASS HTMLDirectoryElement interface object length
-PASS HTMLDirectoryElement interface object name
-PASS HTMLDirectoryElement interface: existence and properties of interface prototype object
-PASS HTMLDirectoryElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLDirectoryElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLDirectoryElement interface: attribute compact
-PASS Unscopable handled correctly for compact property on HTMLDirectoryElement
-PASS HTMLDirectoryElement must be primary interface of document.createElement("dir")
-PASS Stringification of document.createElement("dir")
-PASS HTMLDirectoryElement interface: document.createElement("dir") must inherit property "compact" with the proper type
-PASS HTMLFontElement interface: existence and properties of interface object
-PASS HTMLFontElement interface object length
-PASS HTMLFontElement interface object name
-PASS HTMLFontElement interface: existence and properties of interface prototype object
-PASS HTMLFontElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLFontElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLFontElement interface: attribute color
-PASS Unscopable handled correctly for color property on HTMLFontElement
-PASS HTMLFontElement interface: attribute face
-PASS Unscopable handled correctly for face property on HTMLFontElement
-PASS HTMLFontElement interface: attribute size
-PASS Unscopable handled correctly for size property on HTMLFontElement
-PASS HTMLFontElement must be primary interface of document.createElement("font")
-PASS Stringification of document.createElement("font")
-PASS HTMLFontElement interface: document.createElement("font") must inherit property "color" with the proper type
-PASS HTMLFontElement interface: document.createElement("font") must inherit property "face" with the proper type
-PASS HTMLFontElement interface: document.createElement("font") must inherit property "size" with the proper type
-PASS Stringification of window.external
-PASS External interface: window.external must inherit property "AddSearchProvider()" with the proper type
-PASS External interface: window.external must inherit property "IsSearchProviderInstalled()" with the proper type
+FAIL Test driver promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/webaudio.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/web-audio-api.idl
similarity index 98%
rename from third_party/WebKit/LayoutTests/external/wpt/interfaces/webaudio.idl
rename to third_party/WebKit/LayoutTests/external/wpt/interfaces/web-audio-api.idl
index d20bc7f..2514dad 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/interfaces/webaudio.idl
+++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/web-audio-api.idl
@@ -1,3 +1,7 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content of this file was automatically extracted from the Web Audio API spec.
+// See https://webaudio.github.io/web-audio-api/
+
 enum AudioContextState {
   "suspended",
   "running",
diff --git a/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness-expected.txt
index e99c181..2dcd3d0 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness-expected.txt
@@ -1,33 +1,4 @@
 This is a testharness.js-based test.
-PASS Navigator interface: attribute mediaCapabilities
-PASS Unscopable handled correctly for mediaCapabilities property on Navigator
-PASS Navigator interface: navigator must inherit property "mediaCapabilities" with the proper type
-PASS WorkerNavigator interface: existence and properties of interface object
-PASS MediaCapabilitiesInfo interface: existence and properties of interface object
-PASS MediaCapabilitiesInfo interface object length
-PASS MediaCapabilitiesInfo interface object name
-PASS MediaCapabilitiesInfo interface: existence and properties of interface prototype object
-PASS MediaCapabilitiesInfo interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaCapabilitiesInfo interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaCapabilitiesInfo interface: attribute supported
-PASS Unscopable handled correctly for supported property on MediaCapabilitiesInfo
-PASS MediaCapabilitiesInfo interface: attribute smooth
-PASS Unscopable handled correctly for smooth property on MediaCapabilitiesInfo
-PASS MediaCapabilitiesInfo interface: attribute powerEfficient
-PASS Unscopable handled correctly for powerEfficient property on MediaCapabilitiesInfo
-PASS MediaCapabilities interface: existence and properties of interface object
-PASS MediaCapabilities interface object length
-PASS MediaCapabilities interface object name
-PASS MediaCapabilities interface: existence and properties of interface prototype object
-PASS MediaCapabilities interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaCapabilities interface: existence and properties of interface prototype object's @@unscopables property
-FAIL MediaCapabilities interface: operation decodingInfo(MediaDecodingConfiguration) assert_throws: calling operation with this = null didn't throw TypeError function "function() {
-            fn.apply(obj, args);
-        }" did not throw
-PASS Unscopable handled correctly for decodingInfo(MediaDecodingConfiguration) on MediaCapabilities
-FAIL MediaCapabilities interface: operation encodingInfo(MediaEncodingConfiguration) assert_throws: calling operation with this = null didn't throw TypeError function "function() {
-            fn.apply(obj, args);
-        }" did not throw
-PASS Unscopable handled correctly for encodingInfo(MediaEncodingConfiguration) on MediaCapabilities
+FAIL Media Capabilities IDL tests Uncaught MediaDecodingConfiguration inherits MediaConfiguration, but MediaDecodingConfiguration is not an interface.
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaDevices-IDL-all-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaDevices-IDL-all-expected.txt
index 8ec1f47..ff43cb4 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaDevices-IDL-all-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaDevices-IDL-all-expected.txt
@@ -1,139 +1,4 @@
 This is a testharness.js-based test.
-Found 135 tests; 125 PASS, 10 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS Test driver
-PASS Navigator interface: attribute mediaDevices
-PASS Unscopable handled correctly for mediaDevices property on Navigator
-PASS Navigator interface: operation getUserMedia(MediaStreamConstraints, NavigatorUserMediaSuccessCallback, NavigatorUserMediaErrorCallback)
-PASS Unscopable handled correctly for getUserMedia(MediaStreamConstraints, NavigatorUserMediaSuccessCallback, NavigatorUserMediaErrorCallback) on Navigator
-PASS Navigator interface: navigator must inherit property "mediaDevices" with the proper type
-PASS Navigator interface: navigator must inherit property "getUserMedia(MediaStreamConstraints, NavigatorUserMediaSuccessCallback, NavigatorUserMediaErrorCallback)" with the proper type
-PASS Navigator interface: calling getUserMedia(MediaStreamConstraints, NavigatorUserMediaSuccessCallback, NavigatorUserMediaErrorCallback) on navigator with too few arguments must throw TypeError
-PASS MediaStream interface: existence and properties of interface object
-PASS MediaStream interface object length
-PASS MediaStream interface object name
-PASS MediaStream interface: existence and properties of interface prototype object
-PASS MediaStream interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaStream interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaStream interface: attribute id
-PASS Unscopable handled correctly for id property on MediaStream
-PASS MediaStream interface: operation getAudioTracks()
-PASS Unscopable handled correctly for getAudioTracks() on MediaStream
-PASS MediaStream interface: operation getVideoTracks()
-PASS Unscopable handled correctly for getVideoTracks() on MediaStream
-PASS MediaStream interface: operation getTracks()
-PASS Unscopable handled correctly for getTracks() on MediaStream
-PASS MediaStream interface: operation getTrackById(DOMString)
-PASS Unscopable handled correctly for getTrackById(DOMString) on MediaStream
-PASS MediaStream interface: operation addTrack(MediaStreamTrack)
-PASS Unscopable handled correctly for addTrack(MediaStreamTrack) on MediaStream
-PASS MediaStream interface: operation removeTrack(MediaStreamTrack)
-PASS Unscopable handled correctly for removeTrack(MediaStreamTrack) on MediaStream
-PASS MediaStream interface: operation clone()
-PASS Unscopable handled correctly for clone() on MediaStream
-PASS MediaStream interface: attribute active
-PASS Unscopable handled correctly for active property on MediaStream
-PASS MediaStream interface: attribute onaddtrack
-PASS Unscopable handled correctly for onaddtrack property on MediaStream
-PASS MediaStream interface: attribute onremovetrack
-PASS Unscopable handled correctly for onremovetrack property on MediaStream
-PASS MediaStreamTrack interface: existence and properties of interface object
-PASS MediaStreamTrack interface object length
-PASS MediaStreamTrack interface object name
-PASS MediaStreamTrack interface: existence and properties of interface prototype object
-PASS MediaStreamTrack interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaStreamTrack interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaStreamTrack interface: attribute kind
-PASS Unscopable handled correctly for kind property on MediaStreamTrack
-PASS MediaStreamTrack interface: attribute id
-PASS Unscopable handled correctly for id property on MediaStreamTrack
-PASS MediaStreamTrack interface: attribute label
-PASS Unscopable handled correctly for label property on MediaStreamTrack
-PASS MediaStreamTrack interface: attribute enabled
-PASS Unscopable handled correctly for enabled property on MediaStreamTrack
-PASS MediaStreamTrack interface: attribute muted
-PASS Unscopable handled correctly for muted property on MediaStreamTrack
-PASS MediaStreamTrack interface: attribute onmute
-PASS Unscopable handled correctly for onmute property on MediaStreamTrack
-PASS MediaStreamTrack interface: attribute onunmute
-PASS Unscopable handled correctly for onunmute property on MediaStreamTrack
-PASS MediaStreamTrack interface: attribute readyState
-PASS Unscopable handled correctly for readyState property on MediaStreamTrack
-PASS MediaStreamTrack interface: attribute onended
-PASS Unscopable handled correctly for onended property on MediaStreamTrack
-PASS MediaStreamTrack interface: operation clone()
-PASS Unscopable handled correctly for clone() on MediaStreamTrack
-PASS MediaStreamTrack interface: operation stop()
-PASS Unscopable handled correctly for stop() on MediaStreamTrack
-PASS MediaStreamTrack interface: operation getCapabilities()
-PASS Unscopable handled correctly for getCapabilities() on MediaStreamTrack
-PASS MediaStreamTrack interface: operation getConstraints()
-PASS Unscopable handled correctly for getConstraints() on MediaStreamTrack
-PASS MediaStreamTrack interface: operation getSettings()
-PASS Unscopable handled correctly for getSettings() on MediaStreamTrack
-PASS MediaStreamTrack interface: operation applyConstraints(MediaTrackConstraints)
-PASS Unscopable handled correctly for applyConstraints(MediaTrackConstraints) on MediaStreamTrack
-FAIL MediaStreamTrack interface: attribute onoverconstrained assert_true: The prototype object must have a property "onoverconstrained" expected true got false
-PASS Unscopable handled correctly for onoverconstrained property on MediaStreamTrack
-FAIL MediaStreamTrackEvent interface: existence and properties of interface object Cannot read property 'has_extended_attribute' of undefined
-PASS MediaStreamTrackEvent interface object length
-PASS MediaStreamTrackEvent interface object name
-FAIL MediaStreamTrackEvent interface: existence and properties of interface prototype object Cannot read property 'has_extended_attribute' of undefined
-PASS MediaStreamTrackEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaStreamTrackEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaStreamTrackEvent interface: attribute track
-PASS Unscopable handled correctly for track property on MediaStreamTrackEvent
-FAIL OverconstrainedErrorEvent interface: existence and properties of interface object assert_own_property: self does not have own property "OverconstrainedErrorEvent" expected property "OverconstrainedErrorEvent" missing
-FAIL OverconstrainedErrorEvent interface object length assert_own_property: self does not have own property "OverconstrainedErrorEvent" expected property "OverconstrainedErrorEvent" missing
-FAIL OverconstrainedErrorEvent interface object name assert_own_property: self does not have own property "OverconstrainedErrorEvent" expected property "OverconstrainedErrorEvent" missing
-FAIL OverconstrainedErrorEvent interface: existence and properties of interface prototype object assert_own_property: self does not have own property "OverconstrainedErrorEvent" expected property "OverconstrainedErrorEvent" missing
-FAIL OverconstrainedErrorEvent interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "OverconstrainedErrorEvent" expected property "OverconstrainedErrorEvent" missing
-FAIL OverconstrainedErrorEvent interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "OverconstrainedErrorEvent" expected property "OverconstrainedErrorEvent" missing
-FAIL OverconstrainedErrorEvent interface: attribute error assert_own_property: self does not have own property "OverconstrainedErrorEvent" expected property "OverconstrainedErrorEvent" missing
-PASS Unscopable handled correctly for error property on OverconstrainedErrorEvent
-PASS MediaDevices interface: existence and properties of interface object
-PASS MediaDevices interface object length
-PASS MediaDevices interface object name
-PASS MediaDevices interface: existence and properties of interface prototype object
-PASS MediaDevices interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaDevices interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaDevices interface: attribute ondevicechange
-PASS Unscopable handled correctly for ondevicechange property on MediaDevices
-PASS MediaDevices interface: operation enumerateDevices()
-PASS Unscopable handled correctly for enumerateDevices() on MediaDevices
-PASS MediaDevices interface: operation getSupportedConstraints()
-PASS Unscopable handled correctly for getSupportedConstraints() on MediaDevices
-PASS MediaDevices interface: operation getUserMedia(MediaStreamConstraints)
-PASS Unscopable handled correctly for getUserMedia(MediaStreamConstraints) on MediaDevices
-PASS MediaDevices must be primary interface of navigator.mediaDevices
-PASS Stringification of navigator.mediaDevices
-PASS MediaDevices interface: navigator.mediaDevices must inherit property "ondevicechange" with the proper type
-PASS MediaDevices interface: navigator.mediaDevices must inherit property "enumerateDevices()" with the proper type
-PASS MediaDevices interface: navigator.mediaDevices must inherit property "getSupportedConstraints()" with the proper type
-PASS MediaDevices interface: navigator.mediaDevices must inherit property "getUserMedia(MediaStreamConstraints)" with the proper type
-PASS MediaDevices interface: calling getUserMedia(MediaStreamConstraints) on navigator.mediaDevices with too few arguments must throw TypeError
-PASS MediaDeviceInfo interface: existence and properties of interface object
-PASS MediaDeviceInfo interface object length
-PASS MediaDeviceInfo interface object name
-PASS MediaDeviceInfo interface: existence and properties of interface prototype object
-PASS MediaDeviceInfo interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaDeviceInfo interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaDeviceInfo interface: attribute deviceId
-PASS Unscopable handled correctly for deviceId property on MediaDeviceInfo
-PASS MediaDeviceInfo interface: attribute kind
-PASS Unscopable handled correctly for kind property on MediaDeviceInfo
-PASS MediaDeviceInfo interface: attribute label
-PASS Unscopable handled correctly for label property on MediaDeviceInfo
-PASS MediaDeviceInfo interface: attribute groupId
-PASS Unscopable handled correctly for groupId property on MediaDeviceInfo
-PASS MediaDeviceInfo interface: operation toJSON()
-PASS Unscopable handled correctly for toJSON() on MediaDeviceInfo
-PASS InputDeviceInfo interface: existence and properties of interface object
-PASS InputDeviceInfo interface object length
-PASS InputDeviceInfo interface object name
-PASS InputDeviceInfo interface: existence and properties of interface prototype object
-PASS InputDeviceInfo interface: existence and properties of interface prototype object's "constructor" property
-PASS InputDeviceInfo interface: existence and properties of interface prototype object's @@unscopables property
-PASS InputDeviceInfo interface: operation getCapabilities()
-PASS Unscopable handled correctly for getCapabilities() on InputDeviceInfo
+FAIL Test driver promise_test: Unhandled rejection with value: object "MediaTrackConstraints inherits MediaTrackConstraintSet, but MediaTrackConstraints is not an interface."
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaStreamTrack-idl.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaStreamTrack-idl.https-expected.txt
index 124aa42..bc6c479 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaStreamTrack-idl.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaStreamTrack-idl.https-expected.txt
@@ -1,61 +1,4 @@
 This is a testharness.js-based test.
-PASS Test driver
-PASS MediaStreamTrack interface: existence and properties of interface object
-PASS MediaStreamTrack interface object length
-PASS MediaStreamTrack interface object name
-PASS MediaStreamTrack interface: existence and properties of interface prototype object
-PASS MediaStreamTrack interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaStreamTrack interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaStreamTrack interface: attribute kind
-PASS Unscopable handled correctly for kind property on MediaStreamTrack
-PASS MediaStreamTrack interface: attribute id
-PASS Unscopable handled correctly for id property on MediaStreamTrack
-PASS MediaStreamTrack interface: attribute label
-PASS Unscopable handled correctly for label property on MediaStreamTrack
-PASS MediaStreamTrack interface: attribute enabled
-PASS Unscopable handled correctly for enabled property on MediaStreamTrack
-PASS MediaStreamTrack interface: attribute muted
-PASS Unscopable handled correctly for muted property on MediaStreamTrack
-PASS MediaStreamTrack interface: attribute onmute
-PASS Unscopable handled correctly for onmute property on MediaStreamTrack
-PASS MediaStreamTrack interface: attribute onunmute
-PASS Unscopable handled correctly for onunmute property on MediaStreamTrack
-PASS MediaStreamTrack interface: attribute readyState
-PASS Unscopable handled correctly for readyState property on MediaStreamTrack
-PASS MediaStreamTrack interface: attribute onended
-PASS Unscopable handled correctly for onended property on MediaStreamTrack
-FAIL MediaStreamTrack interface: attribute onoverconstrained assert_true: The prototype object must have a property "onoverconstrained" expected true got false
-PASS Unscopable handled correctly for onoverconstrained property on MediaStreamTrack
-PASS MediaStreamTrack interface: operation clone()
-PASS Unscopable handled correctly for clone() on MediaStreamTrack
-PASS MediaStreamTrack interface: operation stop()
-PASS Unscopable handled correctly for stop() on MediaStreamTrack
-PASS MediaStreamTrack interface: operation getCapabilities()
-PASS Unscopable handled correctly for getCapabilities() on MediaStreamTrack
-PASS MediaStreamTrack interface: operation getConstraints()
-PASS Unscopable handled correctly for getConstraints() on MediaStreamTrack
-PASS MediaStreamTrack interface: operation getSettings()
-PASS Unscopable handled correctly for getSettings() on MediaStreamTrack
-PASS MediaStreamTrack interface: operation applyConstraints(MediaTrackConstraints)
-PASS Unscopable handled correctly for applyConstraints(MediaTrackConstraints) on MediaStreamTrack
-PASS MediaStreamTrack must be primary interface of track
-PASS Stringification of track
-PASS MediaStreamTrack interface: track must inherit property "kind" with the proper type
-PASS MediaStreamTrack interface: track must inherit property "id" with the proper type
-PASS MediaStreamTrack interface: track must inherit property "label" with the proper type
-PASS MediaStreamTrack interface: track must inherit property "enabled" with the proper type
-PASS MediaStreamTrack interface: track must inherit property "muted" with the proper type
-PASS MediaStreamTrack interface: track must inherit property "onmute" with the proper type
-PASS MediaStreamTrack interface: track must inherit property "onunmute" with the proper type
-PASS MediaStreamTrack interface: track must inherit property "readyState" with the proper type
-PASS MediaStreamTrack interface: track must inherit property "onended" with the proper type
-FAIL MediaStreamTrack interface: track must inherit property "onoverconstrained" with the proper type assert_inherits: property "onoverconstrained" not found in prototype chain
-PASS MediaStreamTrack interface: track must inherit property "clone()" with the proper type
-PASS MediaStreamTrack interface: track must inherit property "stop()" with the proper type
-PASS MediaStreamTrack interface: track must inherit property "getCapabilities()" with the proper type
-PASS MediaStreamTrack interface: track must inherit property "getConstraints()" with the proper type
-PASS MediaStreamTrack interface: track must inherit property "getSettings()" with the proper type
-PASS MediaStreamTrack interface: track must inherit property "applyConstraints(MediaTrackConstraints)" with the proper type
-PASS MediaStreamTrack interface: calling applyConstraints(MediaTrackConstraints) on track with too few arguments must throw TypeError
+FAIL Test driver promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/payment-handler/interfaces.https.any-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/payment-handler/interfaces.https.any-expected.txt
index face3c1..81630dd 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/payment-handler/interfaces.https.any-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/payment-handler/interfaces.https.any-expected.txt
@@ -1,34 +1,4 @@
 This is a testharness.js-based test.
-PASS Payment handler interfaces.
-PASS PaymentManager interface: existence and properties of interface object
-PASS PaymentManager interface object length
-PASS PaymentManager interface object name
-PASS PaymentManager interface: existence and properties of interface prototype object
-PASS PaymentManager interface: existence and properties of interface prototype object's "constructor" property
-PASS PaymentManager interface: existence and properties of interface prototype object's @@unscopables property
-PASS PaymentManager interface: attribute instruments
-PASS Unscopable handled correctly for instruments property on PaymentManager
-FAIL PaymentManager interface: operation requestPermission() assert_own_property: interface object missing static operation expected property "requestPermission" missing
-PASS Unscopable handled correctly for requestPermission() on PaymentManager
-PASS PaymentInstruments interface: existence and properties of interface object
-PASS PaymentInstruments interface object length
-PASS PaymentInstruments interface object name
-PASS PaymentInstruments interface: existence and properties of interface prototype object
-PASS PaymentInstruments interface: existence and properties of interface prototype object's "constructor" property
-PASS PaymentInstruments interface: existence and properties of interface prototype object's @@unscopables property
-PASS PaymentInstruments interface: operation delete(DOMString)
-PASS Unscopable handled correctly for delete(DOMString) on PaymentInstruments
-PASS PaymentInstruments interface: operation get(DOMString)
-PASS Unscopable handled correctly for get(DOMString) on PaymentInstruments
-PASS PaymentInstruments interface: operation keys()
-PASS Unscopable handled correctly for keys() on PaymentInstruments
-PASS PaymentInstruments interface: operation has(DOMString)
-PASS Unscopable handled correctly for has(DOMString) on PaymentInstruments
-PASS PaymentInstruments interface: operation set(DOMString, PaymentInstrument)
-PASS Unscopable handled correctly for set(DOMString, PaymentInstrument) on PaymentInstruments
-PASS PaymentInstruments interface: operation clear()
-PASS Unscopable handled correctly for clear() on PaymentInstruments
-PASS CanMakePaymentEvent interface: existence and properties of interface object
-PASS PaymentRequestEvent interface: existence and properties of interface object
+FAIL Payment handler interfaces. promise_test: Unhandled rejection with value: object "CanMakePaymentEvent inherits ExtendableEvent, but ExtendableEvent is undefined."
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webaudio/idlharness.https.html b/third_party/WebKit/LayoutTests/external/wpt/webaudio/idlharness.https.html
index 9e15e47..aed9170 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/webaudio/idlharness.https.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/webaudio/idlharness.https.html
@@ -20,7 +20,7 @@
     // Needed for MediaStream, MediaStreamTrack
     '/interfaces/mediacapture-main.idl',
 
-    '/interfaces/webaudio.idl'
+    '/interfaces/web-audio-api.idl'
   ].map(url => fetch(url).then(response => response.text())));
 
   const idl_array = new IdlArray();
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/webaudio/the-audio-api/the-gainnode-interface/idl-test-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webaudio/the-audio-api/the-gainnode-interface/idl-test-expected.txt
similarity index 100%
rename from third_party/WebKit/LayoutTests/platform/win/external/wpt/webaudio/the-audio-api/the-gainnode-interface/idl-test-expected.txt
rename to third_party/WebKit/LayoutTests/external/wpt/webaudio/the-audio-api/the-gainnode-interface/idl-test-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/webstorage/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webstorage/idlharness-expected.txt
similarity index 100%
rename from third_party/WebKit/LayoutTests/platform/win/external/wpt/webstorage/idlharness-expected.txt
rename to third_party/WebKit/LayoutTests/external/wpt/webstorage/idlharness-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/webusb/idlharness.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webusb/idlharness.https-expected.txt
similarity index 100%
rename from third_party/WebKit/LayoutTests/platform/win/external/wpt/webusb/idlharness.https-expected.txt
rename to third_party/WebKit/LayoutTests/external/wpt/webusb/idlharness.https-expected.txt
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webxr/interfaces.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webxr/interfaces.https-expected.txt
index 6edbaec..e76f2824 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/webxr/interfaces.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/webxr/interfaces.https-expected.txt
@@ -1,201 +1,4 @@
 This is a testharness.js-based test.
-PASS Test IDL implementation of WebXR API
-PASS Navigator interface: attribute xr
-PASS Unscopable handled correctly for xr property on Navigator
-PASS Navigator interface: navigator must inherit property "xr" with the proper type
-PASS XR interface: existence and properties of interface object
-PASS XR interface object length
-PASS XR interface object name
-PASS XR interface: existence and properties of interface prototype object
-PASS XR interface: existence and properties of interface prototype object's "constructor" property
-PASS XR interface: existence and properties of interface prototype object's @@unscopables property
-PASS XR interface: operation requestDevice()
-PASS Unscopable handled correctly for requestDevice() on XR
-PASS XR interface: attribute ondevicechange
-PASS Unscopable handled correctly for ondevicechange property on XR
-PASS XRDevice interface: existence and properties of interface object
-PASS XRDevice interface object length
-PASS XRDevice interface object name
-PASS XRDevice interface: existence and properties of interface prototype object
-PASS XRDevice interface: existence and properties of interface prototype object's "constructor" property
-PASS XRDevice interface: existence and properties of interface prototype object's @@unscopables property
-PASS XRDevice interface: operation supportsSession(XRSessionCreationOptions)
-PASS Unscopable handled correctly for supportsSession(XRSessionCreationOptions) on XRDevice
-PASS XRDevice interface: operation requestSession(XRSessionCreationOptions)
-PASS Unscopable handled correctly for requestSession(XRSessionCreationOptions) on XRDevice
-PASS XRSession interface: existence and properties of interface object
-PASS XRSession interface object length
-PASS XRSession interface object name
-PASS XRSession interface: existence and properties of interface prototype object
-PASS XRSession interface: existence and properties of interface prototype object's "constructor" property
-PASS XRSession interface: existence and properties of interface prototype object's @@unscopables property
-PASS XRSession interface: attribute device
-PASS Unscopable handled correctly for device property on XRSession
-PASS XRSession interface: attribute exclusive
-PASS Unscopable handled correctly for exclusive property on XRSession
-PASS XRSession interface: attribute outputContext
-PASS Unscopable handled correctly for outputContext property on XRSession
-PASS XRSession interface: attribute depthNear
-PASS Unscopable handled correctly for depthNear property on XRSession
-PASS XRSession interface: attribute depthFar
-PASS Unscopable handled correctly for depthFar property on XRSession
-PASS XRSession interface: attribute baseLayer
-PASS Unscopable handled correctly for baseLayer property on XRSession
-PASS XRSession interface: operation requestFrameOfReference(XRFrameOfReferenceType, XRFrameOfReferenceOptions)
-PASS Unscopable handled correctly for requestFrameOfReference(XRFrameOfReferenceType, XRFrameOfReferenceOptions) on XRSession
-PASS XRSession interface: operation requestAnimationFrame(XRFrameRequestCallback)
-PASS Unscopable handled correctly for requestAnimationFrame(XRFrameRequestCallback) on XRSession
-PASS XRSession interface: operation cancelAnimationFrame(long)
-PASS Unscopable handled correctly for cancelAnimationFrame(long) on XRSession
-PASS XRSession interface: operation end()
-PASS Unscopable handled correctly for end() on XRSession
-PASS XRSession interface: attribute onblur
-PASS Unscopable handled correctly for onblur property on XRSession
-PASS XRSession interface: attribute onfocus
-PASS Unscopable handled correctly for onfocus property on XRSession
-PASS XRSession interface: attribute onresetpose
-PASS Unscopable handled correctly for onresetpose property on XRSession
-PASS XRSession interface: attribute onend
-PASS Unscopable handled correctly for onend property on XRSession
-PASS XRPresentationFrame interface: existence and properties of interface object
-PASS XRPresentationFrame interface object length
-PASS XRPresentationFrame interface object name
-PASS XRPresentationFrame interface: existence and properties of interface prototype object
-PASS XRPresentationFrame interface: existence and properties of interface prototype object's "constructor" property
-PASS XRPresentationFrame interface: existence and properties of interface prototype object's @@unscopables property
-PASS XRPresentationFrame interface: attribute views
-PASS Unscopable handled correctly for views property on XRPresentationFrame
-PASS XRPresentationFrame interface: operation getDevicePose(XRCoordinateSystem)
-PASS Unscopable handled correctly for getDevicePose(XRCoordinateSystem) on XRPresentationFrame
-FAIL XRCoordinateSystem interface: existence and properties of interface object assert_equals: prototype of XRCoordinateSystem is not EventTarget expected function "function EventTarget() { [native code] }" but got function "function () { [native code] }"
-PASS XRCoordinateSystem interface object length
-PASS XRCoordinateSystem interface object name
-FAIL XRCoordinateSystem interface: existence and properties of interface prototype object assert_equals: prototype of XRCoordinateSystem.prototype is not EventTarget.prototype expected object "[object EventTarget]" but got object "[object Object]"
-PASS XRCoordinateSystem interface: existence and properties of interface prototype object's "constructor" property
-PASS XRCoordinateSystem interface: existence and properties of interface prototype object's @@unscopables property
-PASS XRCoordinateSystem interface: operation getTransformTo(XRCoordinateSystem)
-PASS Unscopable handled correctly for getTransformTo(XRCoordinateSystem) on XRCoordinateSystem
-PASS XRFrameOfReference interface: existence and properties of interface object
-PASS XRFrameOfReference interface object length
-PASS XRFrameOfReference interface object name
-PASS XRFrameOfReference interface: existence and properties of interface prototype object
-PASS XRFrameOfReference interface: existence and properties of interface prototype object's "constructor" property
-PASS XRFrameOfReference interface: existence and properties of interface prototype object's @@unscopables property
-PASS XRFrameOfReference interface: attribute bounds
-PASS Unscopable handled correctly for bounds property on XRFrameOfReference
-PASS XRFrameOfReference interface: attribute emulatedHeight
-PASS Unscopable handled correctly for emulatedHeight property on XRFrameOfReference
-FAIL XRFrameOfReference interface: attribute onboundschange assert_true: The prototype object must have a property "onboundschange" expected true got false
-PASS Unscopable handled correctly for onboundschange property on XRFrameOfReference
-PASS XRStageBounds interface: existence and properties of interface object
-PASS XRStageBounds interface object length
-PASS XRStageBounds interface object name
-PASS XRStageBounds interface: existence and properties of interface prototype object
-PASS XRStageBounds interface: existence and properties of interface prototype object's "constructor" property
-PASS XRStageBounds interface: existence and properties of interface prototype object's @@unscopables property
-PASS XRStageBounds interface: attribute geometry
-PASS Unscopable handled correctly for geometry property on XRStageBounds
-PASS XRStageBoundsPoint interface: existence and properties of interface object
-PASS XRStageBoundsPoint interface object length
-PASS XRStageBoundsPoint interface object name
-PASS XRStageBoundsPoint interface: existence and properties of interface prototype object
-PASS XRStageBoundsPoint interface: existence and properties of interface prototype object's "constructor" property
-PASS XRStageBoundsPoint interface: existence and properties of interface prototype object's @@unscopables property
-PASS XRStageBoundsPoint interface: attribute x
-PASS Unscopable handled correctly for x property on XRStageBoundsPoint
-PASS XRStageBoundsPoint interface: attribute z
-PASS Unscopable handled correctly for z property on XRStageBoundsPoint
-PASS XRView interface: existence and properties of interface object
-PASS XRView interface object length
-PASS XRView interface object name
-PASS XRView interface: existence and properties of interface prototype object
-PASS XRView interface: existence and properties of interface prototype object's "constructor" property
-PASS XRView interface: existence and properties of interface prototype object's @@unscopables property
-PASS XRView interface: attribute eye
-PASS Unscopable handled correctly for eye property on XRView
-PASS XRView interface: attribute projectionMatrix
-PASS Unscopable handled correctly for projectionMatrix property on XRView
-PASS XRViewport interface: existence and properties of interface object
-PASS XRViewport interface object length
-PASS XRViewport interface object name
-PASS XRViewport interface: existence and properties of interface prototype object
-PASS XRViewport interface: existence and properties of interface prototype object's "constructor" property
-PASS XRViewport interface: existence and properties of interface prototype object's @@unscopables property
-PASS XRViewport interface: attribute x
-PASS Unscopable handled correctly for x property on XRViewport
-PASS XRViewport interface: attribute y
-PASS Unscopable handled correctly for y property on XRViewport
-PASS XRViewport interface: attribute width
-PASS Unscopable handled correctly for width property on XRViewport
-PASS XRViewport interface: attribute height
-PASS Unscopable handled correctly for height property on XRViewport
-PASS XRDevicePose interface: existence and properties of interface object
-PASS XRDevicePose interface object length
-PASS XRDevicePose interface object name
-PASS XRDevicePose interface: existence and properties of interface prototype object
-PASS XRDevicePose interface: existence and properties of interface prototype object's "constructor" property
-PASS XRDevicePose interface: existence and properties of interface prototype object's @@unscopables property
-PASS XRDevicePose interface: attribute poseModelMatrix
-PASS Unscopable handled correctly for poseModelMatrix property on XRDevicePose
-PASS XRDevicePose interface: operation getViewMatrix(XRView)
-PASS Unscopable handled correctly for getViewMatrix(XRView) on XRDevicePose
-PASS XRLayer interface: existence and properties of interface object
-PASS XRLayer interface object length
-PASS XRLayer interface object name
-PASS XRLayer interface: existence and properties of interface prototype object
-PASS XRLayer interface: existence and properties of interface prototype object's "constructor" property
-PASS XRLayer interface: existence and properties of interface prototype object's @@unscopables property
-PASS XRWebGLLayer interface: existence and properties of interface object
-PASS XRWebGLLayer interface object length
-PASS XRWebGLLayer interface object name
-PASS XRWebGLLayer interface: existence and properties of interface prototype object
-PASS XRWebGLLayer interface: existence and properties of interface prototype object's "constructor" property
-PASS XRWebGLLayer interface: existence and properties of interface prototype object's @@unscopables property
-PASS XRWebGLLayer interface: attribute context
-PASS Unscopable handled correctly for context property on XRWebGLLayer
-PASS XRWebGLLayer interface: attribute antialias
-PASS Unscopable handled correctly for antialias property on XRWebGLLayer
-PASS XRWebGLLayer interface: attribute depth
-PASS Unscopable handled correctly for depth property on XRWebGLLayer
-PASS XRWebGLLayer interface: attribute stencil
-PASS Unscopable handled correctly for stencil property on XRWebGLLayer
-PASS XRWebGLLayer interface: attribute alpha
-PASS Unscopable handled correctly for alpha property on XRWebGLLayer
-PASS XRWebGLLayer interface: attribute multiview
-PASS Unscopable handled correctly for multiview property on XRWebGLLayer
-PASS XRWebGLLayer interface: attribute framebuffer
-PASS Unscopable handled correctly for framebuffer property on XRWebGLLayer
-PASS XRWebGLLayer interface: attribute framebufferWidth
-PASS Unscopable handled correctly for framebufferWidth property on XRWebGLLayer
-PASS XRWebGLLayer interface: attribute framebufferHeight
-PASS Unscopable handled correctly for framebufferHeight property on XRWebGLLayer
-PASS XRWebGLLayer interface: operation getViewport(XRView)
-PASS Unscopable handled correctly for getViewport(XRView) on XRWebGLLayer
-PASS XRWebGLLayer interface: operation requestViewportScaling(double)
-PASS Unscopable handled correctly for requestViewportScaling(double) on XRWebGLLayer
-PASS XRPresentationContext interface: existence and properties of interface object
-PASS XRPresentationContext interface object length
-PASS XRPresentationContext interface object name
-PASS XRPresentationContext interface: existence and properties of interface prototype object
-PASS XRPresentationContext interface: existence and properties of interface prototype object's "constructor" property
-PASS XRPresentationContext interface: existence and properties of interface prototype object's @@unscopables property
-PASS XRPresentationContext interface: attribute canvas
-PASS Unscopable handled correctly for canvas property on XRPresentationContext
-PASS XRSessionEvent interface: existence and properties of interface object
-PASS XRSessionEvent interface object length
-PASS XRSessionEvent interface object name
-PASS XRSessionEvent interface: existence and properties of interface prototype object
-PASS XRSessionEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS XRSessionEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS XRSessionEvent interface: attribute session
-PASS Unscopable handled correctly for session property on XRSessionEvent
-FAIL XRCoordinateSystemEvent interface: existence and properties of interface object assert_own_property: self does not have own property "XRCoordinateSystemEvent" expected property "XRCoordinateSystemEvent" missing
-FAIL XRCoordinateSystemEvent interface object length assert_own_property: self does not have own property "XRCoordinateSystemEvent" expected property "XRCoordinateSystemEvent" missing
-FAIL XRCoordinateSystemEvent interface object name assert_own_property: self does not have own property "XRCoordinateSystemEvent" expected property "XRCoordinateSystemEvent" missing
-FAIL XRCoordinateSystemEvent interface: existence and properties of interface prototype object assert_own_property: self does not have own property "XRCoordinateSystemEvent" expected property "XRCoordinateSystemEvent" missing
-FAIL XRCoordinateSystemEvent interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "XRCoordinateSystemEvent" expected property "XRCoordinateSystemEvent" missing
-FAIL XRCoordinateSystemEvent interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "XRCoordinateSystemEvent" expected property "XRCoordinateSystemEvent" missing
-FAIL XRCoordinateSystemEvent interface: attribute coordinateSystem assert_own_property: self does not have own property "XRCoordinateSystemEvent" expected property "XRCoordinateSystemEvent" missing
-PASS Unscopable handled correctly for coordinateSystem property on XRCoordinateSystemEvent
+FAIL Test IDL implementation of WebXR API promise_test: Unhandled rejection with value: object "Partial dictionary WebGLContextAttributes with no original dictionary"
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/mixed-editability-4-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/mixed-editability-4-expected.txt
deleted file mode 100644
index 23bf081..0000000
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/mixed-editability-4-expected.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutNGBlockFlow {HTML} at (0,0) size 800x600
-    LayoutNGBlockFlow {BODY} at (8,8) size 784x584
-      LayoutNGBlockFlow {P} at (0,0) size 784x40
-        LayoutText {#text} at (0,0) size 752x39
-          text run at (0,0) width 752: "This tests moving the caret forward through content of mixed editability. The caret should move down one line from the"
-          text run at (0,20) width 470: "editable piece to the editable piece that's embedded in a non-editable piece."
-      LayoutBlockFlow {DIV} at (0,56) size 784x70
-        LayoutNGBlockFlow (anonymous) at (0,0) size 769x20
-          LayoutText {#text} at (0,0) size 49x19
-            text run at (0,0) width 49: "editable"
-        LayoutTable {TABLE} at (0,20) size 59x30 [border: (1px outset #808080)]
-          LayoutTableSection {TBODY} at (1,1) size 57x28
-            LayoutTableRow {TR} at (0,2) size 57x24
-              LayoutTableCell {TD} at (2,2) size 53x24 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1]
-                LayoutText {#text} at (2,2) size 49x19
-                  text run at (2,2) width 49: "editable"
-        LayoutNGBlockFlow (anonymous) at (0,50) size 769x20
-          LayoutText {#text} at (0,0) size 49x19
-            text run at (0,0) width 49: "editable"
-caret: position 2 of child 0 {#text} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/mixed-editability-6-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/mixed-editability-6-expected.txt
deleted file mode 100644
index f0ab5811..0000000
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/mixed-editability-6-expected.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutNGBlockFlow {HTML} at (0,0) size 800x600
-    LayoutNGBlockFlow {BODY} at (8,8) size 784x584
-      LayoutNGBlockFlow {P} at (0,0) size 784x40
-        LayoutText {#text} at (0,0) size 779x39
-          text run at (0,0) width 779: "This tests Select All when the caret is inside an editable region that is inside a non editable region. Whenever the selection is"
-          text run at (0,20) width 537: "in an editable region, Select All should select the contents of the highest editable root."
-      LayoutBlockFlow {DIV} at (0,56) size 784x60
-        LayoutBlockFlow {DIV} at (0,0) size 784x20
-          LayoutText {#text} at (0,0) size 27x19
-            text run at (0,0) width 27: "One"
-        LayoutBlockFlow {DIV} at (0,20) size 784x20
-          LayoutInline {SPAN} at (0,0) size 28x19
-            LayoutText {#text} at (0,0) size 28x19
-              text run at (0,0) width 28: "Two"
-          LayoutText {#text} at (28,0) size 4x19
-            text run at (28,0) width 4: " "
-          LayoutInline {SPAN} at (0,0) size 37x19
-            LayoutText {#text} at (32,0) size 37x19
-              text run at (32,0) width 37: "Three"
-        LayoutBlockFlow {DIV} at (0,40) size 784x20
-          LayoutText {#text} at (0,0) size 30x19
-            text run at (0,0) width 30: "Four"
-selection start: position 0 of child 0 {#text} of child 1 {DIV} of child 2 {DIV} of body
-selection end:   position 4 of child 0 {#text} of child 5 {DIV} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/mixed-editability-7-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/mixed-editability-7-expected.txt
deleted file mode 100644
index db76ff93..0000000
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/mixed-editability-7-expected.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutNGBlockFlow {HTML} at (0,0) size 800x600
-    LayoutNGBlockFlow {BODY} at (8,8) size 784x584
-      LayoutNGBlockFlow {P} at (0,0) size 784x40
-        LayoutText {#text} at (0,0) size 779x39
-          text run at (0,0) width 779: "This tests creating a selection based inside a nested editable region that extends out to editable content that is inside the same"
-          text run at (0,20) width 391: "highest editable root. 'One' through 'Three' should be selected."
-      LayoutBlockFlow {DIV} at (0,56) size 784x60
-        LayoutBlockFlow {DIV} at (0,0) size 784x20
-          LayoutText {#text} at (0,0) size 27x19
-            text run at (0,0) width 27: "One"
-        LayoutBlockFlow {DIV} at (0,20) size 784x20
-          LayoutInline {SPAN} at (0,0) size 28x19
-            LayoutText {#text} at (0,0) size 28x19
-              text run at (0,0) width 28: "Two"
-          LayoutText {#text} at (28,0) size 4x19
-            text run at (28,0) width 4: " "
-          LayoutInline {SPAN} at (0,0) size 37x19
-            LayoutText {#text} at (32,0) size 37x19
-              text run at (32,0) width 37: "Three"
-        LayoutBlockFlow {DIV} at (0,40) size 784x20
-          LayoutText {#text} at (0,0) size 30x19
-            text run at (0,0) width 30: "Four"
-selection start: position 0 of child 0 {#text} of child 1 {DIV} of child 2 {DIV} of body
-selection end:   position 5 of child 0 {#text} of child 2 {SPAN} of child 3 {DIV} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-features=NetworkService/virtual/navigation-mojo-response/external/wpt/service-workers/service-worker/fetch-event.https-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-features=NetworkService/virtual/navigation-mojo-response/external/wpt/service-workers/service-worker/fetch-event.https-expected.txt
index 8a9c737..aacfaa7 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-features=NetworkService/virtual/navigation-mojo-response/external/wpt/service-workers/service-worker/fetch-event.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-features=NetworkService/virtual/navigation-mojo-response/external/wpt/service-workers/service-worker/fetch-event.https-expected.txt
@@ -1,6 +1,7 @@
 This is a testharness.js-based test.
 PASS Service Worker headers in the request of a fetch event
 PASS Service Worker responds to fetch event with string
+PASS Service Worker responds to fetch event using request fragment with string
 PASS Service Worker responds to fetch event with blob body
 PASS Service Worker responds to fetch event with the referrer URL
 PASS Service Worker responds to fetch event with an existing client id
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-create-from-nested-frame-expected.txt b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-create-from-nested-frame-expected.txt
deleted file mode 100644
index 1303d62..0000000
--- a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-create-from-nested-frame-expected.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: mojo/public/mojom/base/string16.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: mojo/public/mojom/base/big_buffer.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: url/mojom/origin.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: url/mojom/url.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: mojo/public/mojom/base/time.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: mojo/public/mojom/base/string16.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: mojo/public/mojom/base/big_buffer.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: url/mojom/origin.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: url/mojom/url.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: mojo/public/mojom/base/time.mojom
-This is a testharness.js-based test.
-PASS navigator.credentials should be undefined in documents generated from `data:` URLs.
-PASS navigator.credentials.create({publicKey}) in a javascript url should should succeed.
-PASS navigator.credentials.create({publicKey}) in srcdoc should succeed.
-PASS navigator.credentials.create({publicKey}) in about:blank embedded in a secure context should succeed.
-FAIL navigator.credentials.create({publicKey}) in an about:blank page embedded in a secure context should pass rpID checks. assert_equals: expected "NotAllowedError" but got "NotSupportedError"
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-create-from-nested-frame.html b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-create-from-nested-frame.html
index b4b53e0..0d987a67 100644
--- a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-create-from-nested-frame.html
+++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-create-from-nested-frame.html
@@ -5,8 +5,9 @@
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
 <script src="/gen/third_party/WebKit/public/platform/modules/credentialmanager/credential_manager.mojom.js"></script>
 <script src="/gen/third_party/WebKit/public/platform/modules/webauth/authenticator.mojom.js"></script>
+<script src="/gen/third_party/WebKit/public/platform/modules/webauth/virtual_authenticator.mojom.js"></script>
 <script src="resources/test-inputs.js"></script>
-<script src="resources/mock-navigator-credentials.js"></script>
+<script src="resources/virtual-navigator-credentials.js"></script>
 <body>
 <script>
 
@@ -16,10 +17,14 @@
 }
 
 promise_test(t => {
+  return navigator.credentials.test.createAuthenticator();
+}, "Set up one virtual authenticator for testing.");
+
+promise_test(t => {
   let PROBE_CREDENTIALS = "window.parent.postMessage(String(navigator.credentials), '*');";
 
   let frame = document.createElement("iframe");
-  frame.src = "data:text/html," + EncloseInScriptTag(PROBE_CREDENTIALS);
+  frame.src = "data:text/html," + encloseInScriptTag(PROBE_CREDENTIALS);
   window.setTimeout(_ => document.body.append(frame));
 
   let eventWatcher = new EventWatcher(t, window, "message");
@@ -30,7 +35,7 @@
 
 promise_test(t => {
   let frame = document.createElement("iframe");
-  frame.src = "resources/nested-mock-authenticator-client.html";
+  frame.src = "resources/nested-document-with-test-inputs.html";
   window.setTimeout(_ => document.body.append(frame));
 
   let loadWatcher = new EventWatcher(t, frame, "load");
@@ -39,68 +44,62 @@
 
   let messageWatcher = new EventWatcher(t, window, "message");
   return messageWatcher.wait_for("message").then(message => {
-    assert_equals(message.data, TEST_NESTED_CREDENTIAL_ID);
+    assert_equals(message.data, "[object PublicKeyCredential]");
   });
 }, "navigator.credentials.create({publicKey}) in a javascript url should should succeed.");
 
-// Load the content we want to inject into the nested frames below into
-// |templateFrame| so that we don't have to use string literals here.
-var templateFrame = document.createElement("iframe");
-templateFrame.src = "resources/nested-mock-authenticator-client.html";
-templateFrame.addEventListener("load", _ => {
 
-  // Uses mockAuthenticator.
-  promise_test(t => {
-    let frame = document.createElement("iframe");
-    frame.srcdoc = templateFrame.contentDocument.documentElement.outerHTML;
-    window.setTimeout(_ => document.body.append(frame));
+promise_test(t => {
+  let frame = document.createElement("iframe");
+  frame.srcdoc = HTML_WITH_TEST_INPUTS;
+  window.setTimeout(_ => document.body.append(frame));
 
-    let loadWatcher = new EventWatcher(t, frame, "load");
-    loadWatcher.wait_for("load").then(_ => {
-      frame.contentWindow.eval(CREATE_CREDENTIALS);
-    });
+  let loadWatcher = new EventWatcher(t, frame, "load");
+  loadWatcher.wait_for("load").then(_ => {
+    frame.contentWindow.eval(CREATE_CREDENTIALS);
+  });
 
-    let eventWatcher = new EventWatcher(t, window, "message");
-    return eventWatcher.wait_for("message").then(message => {
-      assert_equals(message.data, TEST_NESTED_CREDENTIAL_ID);
-    });
-  }, "navigator.credentials.create({publicKey}) in srcdoc should succeed.");
+  let eventWatcher = new EventWatcher(t, window, "message");
+  return eventWatcher.wait_for("message").then(message => {
+    assert_equals(message.data, "[object PublicKeyCredential]");
+  });
+}, "navigator.credentials.create({publicKey}) in srcdoc should succeed.");
 
-  // Uses mockAuthenticator.
-  promise_test(t => {
-    let frame = document.createElement("iframe");
-    frame.src = "about:blank";
-    window.setTimeout(_ => document.body.append(frame));
+promise_test(t => {
+  let frame = document.createElement("iframe");
+  frame.src = "about:blank";
+  window.setTimeout(_ => document.body.append(frame));
 
-    let loadWatcher = new EventWatcher(t, frame, "load");
-    loadWatcher.wait_for("load").then(_ => {
-      frame.contentDocument.write(templateFrame.contentDocument.documentElement.outerHTML);
-      frame.contentDocument.write(EncloseInScriptTag(CREATE_CUSTOM_CREDENTIALS));
-    });
+  let loadWatcher = new EventWatcher(t, frame, "load");
+  loadWatcher.wait_for("load").then(_ => {
+    frame.contentDocument.write(HTML_WITH_TEST_INPUTS);
+    frame.contentDocument.write(encloseInScriptTag(CREATE_CREDENTIALS));
+  });
 
-    let eventWatcher = new EventWatcher(t, window, "message");
-    return eventWatcher.wait_for("message").then(message => {
-      assert_equals(message.data, TEST_NESTED_CREDENTIAL_ID);
-    });
-  }, "navigator.credentials.create({publicKey}) in about:blank embedded in a secure context should succeed.");
+  let eventWatcher = new EventWatcher(t, window, "message");
+  return eventWatcher.wait_for("message").then(message => {
+    assert_equals(message.data, "[object PublicKeyCredential]");
+  });
+}, "navigator.credentials.create({publicKey}) in about:blank embedded in a secure context should succeed.");
 
-  // Does not use mockAuthenticator, but times out instead.
-  promise_test(t => {
-    let frame = document.createElement("iframe");
-    frame.src = "about:blank";
-    window.setTimeout(_ => document.body.append(frame));
+promise_test(t => {
+  let frame = document.createElement("iframe");
+  frame.src = "about:blank";
+  window.setTimeout(_ => document.body.append(frame));
 
-    let loadWatcher = new EventWatcher(t, frame, "load");
-    loadWatcher.wait_for("load").then(_ => {
-      frame.contentWindow.eval(CREATE_CUSTOM_CREDENTIALS);
-    });
+  let loadWatcher = new EventWatcher(t, frame, "load");
+  loadWatcher.wait_for("load").then(_ => {
+    frame.contentWindow.eval(getScriptThatLoadsTestInputsAndRuns(CREATE_CREDENTIALS));
+  });
 
-    let eventWatcher = new EventWatcher(t, window, "message");
-    return eventWatcher.wait_for("message").then(message => {
-      assert_equals(message.data, "NotAllowedError");
-    });
-  }, "navigator.credentials.create({publicKey}) in an about:blank page embedded in a secure context should pass rpID checks.");
-});
-document.body.append(templateFrame);
+  let eventWatcher = new EventWatcher(t, window, "message");
+  return eventWatcher.wait_for("message").then(message => {
+    assert_equals(message.data, "[object PublicKeyCredential]");
+  });
+}, "navigator.credentials.create({publicKey}) in an about:blank page embedded in a secure context should pass rpID checks.");
+
+promise_test(t => {
+  return navigator.credentials.test.clearAuthenticators();
+}, "Clean up testing environment.");
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-from-nested-frame-expected.txt b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-from-nested-frame-expected.txt
deleted file mode 100644
index a41df896..0000000
--- a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-from-nested-frame-expected.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: mojo/public/mojom/base/string16.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: mojo/public/mojom/base/big_buffer.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: url/mojom/origin.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: url/mojom/url.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: mojo/public/mojom/base/time.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: mojo/public/mojom/base/string16.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: mojo/public/mojom/base/big_buffer.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: url/mojom/origin.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: url/mojom/url.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: mojo/public/mojom/base/time.mojom
-This is a testharness.js-based test.
-PASS navigator.credentials should be undefined in documents generated from `data:` URLs.
-PASS navigator.credentials.get({publicKey}) in a javascript url should should succeed.
-PASS navigator.credentials.get({publicKey}) in srcdoc should succeed.
-PASS navigator.credentials.get({publicKey}) in about:blank embedded in a secure context should succeed.
-FAIL navigator.credentials.get({publicKey}) in an about:blank page embedded in a secure context should pass rpID checks. assert_equals: expected "NotAllowedError" but got "NotSupportedError"
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-from-nested-frame.html b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-from-nested-frame.html
index 35eefc59..33f462b 100644
--- a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-from-nested-frame.html
+++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-from-nested-frame.html
@@ -5,8 +5,9 @@
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
 <script src="/gen/third_party/WebKit/public/platform/modules/credentialmanager/credential_manager.mojom.js"></script>
 <script src="/gen/third_party/WebKit/public/platform/modules/webauth/authenticator.mojom.js"></script>
+<script src="/gen/third_party/WebKit/public/platform/modules/webauth/virtual_authenticator.mojom.js"></script>
 <script src="resources/test-inputs.js"></script>
-<script src="resources/mock-navigator-credentials.js"></script>
+<script src="resources/virtual-navigator-credentials.js"></script>
 <body>
 <script>
 
@@ -15,11 +16,18 @@
   promise_test(_ => new Promise(_ => {}), "Stall tests on the wrong host.");
 }
 
+promise_test(async _ => {
+  let authenticators = await navigator.credentials.test.authenticators();
+  assert_equals(authenticators.length, 0);
+  let testAuthenticator = await navigator.credentials.test.createAuthenticator();
+  assert_true(await testAuthenticator.generateAndRegisterKey(ACCEPTABLE_CREDENTIAL_ID, "subdomain.example.test"));
+}, "Set up the testing environment.");
+
 promise_test(t => {
   let PROBE_CREDENTIALS = "window.parent.postMessage(String(navigator.credentials), '*');";
 
   let frame = document.createElement("iframe");
-  frame.src = "data:text/html," + EncloseInScriptTag(PROBE_CREDENTIALS);
+  frame.src = "data:text/html," + encloseInScriptTag(PROBE_CREDENTIALS);
   window.setTimeout(_ => document.body.append(frame));
 
   let eventWatcher = new EventWatcher(t, window, "message");
@@ -30,7 +38,7 @@
 
 promise_test(t => {
   let frame = document.createElement("iframe");
-  frame.src = "resources/nested-mock-authenticator-client.html";
+  frame.src = "resources/nested-document-with-test-inputs.html";
   window.setTimeout(_ => document.body.append(frame));
 
   let loadWatcher = new EventWatcher(t, frame, "load");
@@ -39,68 +47,61 @@
 
   let messageWatcher = new EventWatcher(t, window, "message");
   return messageWatcher.wait_for("message").then(message => {
-    assert_equals(message.data, TEST_NESTED_CREDENTIAL_ID);
+    assert_equals(message.data, "[object PublicKeyCredential]");
   });
 }, "navigator.credentials.get({publicKey}) in a javascript url should should succeed.");
 
-// Load the content we want to inject into the nested frames below into
-// |templateFrame| so that we don't have to use string literals here.
-var templateFrame = document.createElement("iframe");
-templateFrame.src = "resources/nested-mock-authenticator-client.html";
-templateFrame.addEventListener("load", _ => {
+promise_test(t => {
+  let frame = document.createElement("iframe");
+  frame.srcdoc = HTML_WITH_TEST_INPUTS;
+  window.setTimeout(_ => document.body.append(frame));
 
-  // Uses mockAuthenticator.
-  promise_test(t => {
-    let frame = document.createElement("iframe");
-    frame.srcdoc = templateFrame.contentDocument.documentElement.outerHTML;
-    window.setTimeout(_ => document.body.append(frame));
+  let loadWatcher = new EventWatcher(t, frame, "load");
+  loadWatcher.wait_for("load").then(_ => {
+    frame.contentWindow.eval(GET_CREDENTIAL);
+  });
 
-    let loadWatcher = new EventWatcher(t, frame, "load");
-    loadWatcher.wait_for("load").then(_ => {
-      frame.contentWindow.eval(GET_CREDENTIAL);
-    });
+  let eventWatcher = new EventWatcher(t, window, "message");
+  return eventWatcher.wait_for("message").then(message => {
+    assert_equals(message.data, "[object PublicKeyCredential]");
+  });
+}, "navigator.credentials.get({publicKey}) in srcdoc should succeed.");
 
-    let eventWatcher = new EventWatcher(t, window, "message");
-    return eventWatcher.wait_for("message").then(message => {
-      assert_equals(message.data, TEST_NESTED_CREDENTIAL_ID);
-    });
-  }, "navigator.credentials.get({publicKey}) in srcdoc should succeed.");
+promise_test(t => {
+  let frame = document.createElement("iframe");
+  frame.src = "about:blank";
+  window.setTimeout(_ => document.body.append(frame));
 
-  // Uses mockAuthenticator.
-  promise_test(t => {
-    let frame = document.createElement("iframe");
-    frame.src = "about:blank";
-    window.setTimeout(_ => document.body.append(frame));
+  let loadWatcher = new EventWatcher(t, frame, "load");
+  loadWatcher.wait_for("load").then(_ => {
+    frame.contentDocument.write(HTML_WITH_TEST_INPUTS);
+    frame.contentDocument.write(encloseInScriptTag(GET_CREDENTIAL));
+  });
 
-    let loadWatcher = new EventWatcher(t, frame, "load");
-    loadWatcher.wait_for("load").then(_ => {
-      frame.contentDocument.write(templateFrame.contentDocument.documentElement.outerHTML);
-      frame.contentDocument.write(EncloseInScriptTag(GET_CUSTOM_CREDENTIALS));
-    });
+  let eventWatcher = new EventWatcher(t, window, "message");
+  return eventWatcher.wait_for("message").then(message => {
+    assert_equals(message.data, "[object PublicKeyCredential]");
+  });
+}, "navigator.credentials.get({publicKey}) in about:blank embedded in a secure context should succeed.");
 
-    let eventWatcher = new EventWatcher(t, window, "message");
-    return eventWatcher.wait_for("message").then(message => {
-      assert_equals(message.data, TEST_NESTED_CREDENTIAL_ID);
-    });
-  }, "navigator.credentials.get({publicKey}) in about:blank embedded in a secure context should succeed.");
+promise_test(t => {
+  let frame = document.createElement("iframe");
+  frame.src = "about:blank";
+  window.setTimeout(_ => document.body.append(frame));
 
-  // Does not use mockAuthenticator, but times out instead.
-  promise_test(t => {
-    let frame = document.createElement("iframe");
-    frame.src = "about:blank";
-    window.setTimeout(_ => document.body.append(frame));
+  let loadWatcher = new EventWatcher(t, frame, "load");
+  loadWatcher.wait_for("load").then(_ => {
+    frame.contentWindow.eval(getScriptThatLoadsTestInputsAndRuns(GET_CREDENTIAL));
+  });
 
-    let loadWatcher = new EventWatcher(t, frame, "load");
-    loadWatcher.wait_for("load").then(_ => {
-      frame.contentWindow.eval(GET_CUSTOM_CREDENTIALS);
-    });
+  let eventWatcher = new EventWatcher(t, window, "message");
+  return eventWatcher.wait_for("message").then(message => {
+    assert_equals(message.data, "[object PublicKeyCredential]");
+  });
+}, "navigator.credentials.get({publicKey}) in an about:blank page embedded in a secure context should pass rpID checks.");
 
-    let eventWatcher = new EventWatcher(t, window, "message");
-    return eventWatcher.wait_for("message").then(message => {
-      assert_equals(message.data, "NotAllowedError");
-    });
-  }, "navigator.credentials.get({publicKey}) in an about:blank page embedded in a secure context should pass rpID checks.");
-});
-document.body.append(templateFrame);
+promise_test(t => {
+  return navigator.credentials.test.clearAuthenticators();
+}, "Clean up testing environment.");
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/register-then-sign.html b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/register-then-sign.html
new file mode 100644
index 0000000..a1863e2
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/register-then-sign.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<title>Credential Manager: end-to-end test that registers/gets an assertion for a credential.</title>
+<script src="../resources/testharness.js"></script>
+<script src="../resources/testharnessreport.js"></script>
+<script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
+<script src="/gen/third_party/WebKit/public/platform/modules/webauth/virtual_authenticator.mojom.js"></script>
+<script src="resources/test-inputs.js"></script>
+<script src="resources/virtual-navigator-credentials.js"></script>
+<script>
+
+if (document.location.hostname != "subdomain.example.test") {
+  document.location = "https://subdomain.example.test:8443/credentialmanager/register-then-sign.html";
+  promise_test(_ => new Promise(_ => {}), "Stall tests on the wrong host.");
+}
+
+promise_test(async _ => {
+  // Expect a clean environment.
+  let authenticators = await navigator.credentials.test.authenticators();
+  assert_equals(authenticators.length, 0);
+}, "Set up the testing environment.");
+
+promise_test(async _ => {
+  let testAuthenticator = await navigator.credentials.test.createAuthenticator();
+  let credential = await navigator.credentials.create({publicKey: MAKE_CREDENTIAL_OPTIONS});
+  let getCredentialsOptions = deepCopy(GET_CREDENTIAL_OPTIONS);
+  getCredentialsOptions.allowCredentials[0].id = credential.rawId;
+  return navigator.credentials.get({publicKey: getCredentialsOptions});
+});
+
+promise_test(_ => navigator.credentials.test.clearAuthenticators(), "Clean up testing environment.");
+
+</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/nested-document-with-test-inputs.html b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/nested-document-with-test-inputs.html
new file mode 100644
index 0000000..08137be
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/nested-document-with-test-inputs.html
@@ -0,0 +1,3 @@
+<!DOCTYPE HTML>
+<title>Nested page that merely includes the test inputs.</title>
+<script src="/credentialmanager/resources/test-inputs.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/nested-mock-authenticator-client.html b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/nested-mock-authenticator-client.html
deleted file mode 100644
index 2a45a89..0000000
--- a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/nested-mock-authenticator-client.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE HTML>
-<title>Credential Manager: Nested page that sets up a mock authenticator response.</title>
-<script src="/credentialmanager/resources/testharness.js"></script>
-<script src="/credentialmanager/resources/testharnessreport.js"></script>
-<script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
-<script src="/gen/third_party/WebKit/public/platform/modules/credentialmanager/credential_manager.mojom.js"></script>
-<script src="/gen/third_party/WebKit/public/platform/modules/webauth/authenticator.mojom.js"></script>
-<script src="/credentialmanager/resources/test-inputs.js"></script>
-<script src="/credentialmanager/resources/mock-navigator-credentials.js"></script>
-<script>
-mockAuthenticator.setRawId(RAW_ID);
-mockAuthenticator.setId(TEST_NESTED_CREDENTIAL_ID);
-mockAuthenticator.setClientDataJson(CLIENT_DATA_JSON);
-mockAuthenticator.setAttestationObject(ATTESTATION_OBJECT);
-mockAuthenticator.setAuthenticatorData(AUTHENTICATOR_DATA);
-mockAuthenticator.setSignature(SIGNATURE);
-mockAuthenticator.setAuthenticatorStatus(
-    webauth.mojom.AuthenticatorStatus.SUCCESS);
-</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/test-inputs.js b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/test-inputs.js
index b5c90980..83421ed 100644
--- a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/test-inputs.js
+++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/test-inputs.js
@@ -1,5 +1,19 @@
 'use strict';
 
+// A minimal HTML document that loads this very file. This can be
+// document.write()'en to nested documents to include test input/outputs.
+const HTML_WITH_TEST_INPUTS = "<script src='/credentialmanager/resources/test-inputs.js'></script>";
+
+// Constructs a script that loads this very script file, and runs |code| once
+// loaded. This can be window.eval()'ed in nested documents to include test
+// input/outputs (and then run the |code| under test).
+function getScriptThatLoadsTestInputsAndRuns(code) {
+  return "var script = document.createElement('script');"
+       + "script.src = '/credentialmanager/resources/test-inputs.js';"
+       + "script.onload = _ => {" + code + "};"
+       + "document.head.appendChild(script);"
+}
+
 // Common mock values for the mockAuthenticator.
 var CHALLENGE = new TextEncoder().encode("climb a mountain");
 
@@ -34,9 +48,11 @@
     excludeCredentials: [],
 };
 
+var ACCEPTABLE_CREDENTIAL_ID = new TextEncoder().encode("acceptableCredential");
+
 var ACCEPTABLE_CREDENTIAL = {
     type: "public-key",
-    id: new TextEncoder().encode("acceptableCredential"),
+    id: ACCEPTABLE_CREDENTIAL_ID,
     transports: ["usb", "nfc", "ble"]
 };
 
@@ -54,42 +70,16 @@
 var AUTHENTICATOR_DATA = new TextEncoder("utf-8").encode("authenticatorData");
 var SIGNATURE = new TextEncoder("utf-8").encode("signature");
 
-var TEST_NESTED_CREDENTIAL_ID = "nestedCredentialId";
-
-// Use a 3-second timeout in the parameters for "success" cases
-// so that each test will exercise the rpID checks in both the renderer
-// and browser but will time out instead of wait for a device response.
-var CUSTOM_MAKE_CREDENTIAL_OPTIONS = 'var customPublicKey = '
-    + '{challenge: new TextEncoder().encode("challenge"), '
-    + 'rp: {id: "subdomain.example.test", name: "Acme"}, '
-    + 'user: {id: new TextEncoder().encode("1098237235409872"), '
-    + 'name: "acme@example.com", displayName: "Acme", icon:"iconUrl"}, '
-    + 'timeout: 2000, '
-    + 'pubKeyCredParams: [{type: "public-key", alg: -7,},], excludeCredentials:[],};';
-
-var CREATE_CUSTOM_CREDENTIALS = CUSTOM_MAKE_CREDENTIAL_OPTIONS
-    + "navigator.credentials.create({publicKey : customPublicKey})"
-    + ".then(c => window.parent.postMessage(c.id, '*'))"
-    + ".catch(e => window.parent.postMessage(e.name, '*'));";
-
-var CREATE_CREDENTIALS = "navigator.credentials.create({publicKey : MAKE_CREDENTIAL_OPTIONS})"
-    + ".then(c => window.parent.postMessage(c.id, '*'));";
-
-var CUSTOM_GET_CREDENTIAL_OPTIONS = 'var customPublicKey = '
-    + '{challenge: new TextEncoder().encode("challenge"), '
-    + 'rpId: "subdomain.example.test", '
-    + 'timeout: 2000, '
-    + 'allowCredentials: [{type: "public-key", id: new TextEncoder().encode("allowedCredential"), transports: ["usb", "nfc", "ble"]},],};';
-
-var GET_CUSTOM_CREDENTIALS = CUSTOM_GET_CREDENTIAL_OPTIONS
-    + "navigator.credentials.get({publicKey : customPublicKey})"
-    + ".then(c => window.parent.postMessage(c.id, '*'))"
-    + ".catch(e => window.parent.postMessage(e.name, '*'));";
+var CREATE_CREDENTIALS =
+    "navigator.credentials.create({publicKey : MAKE_CREDENTIAL_OPTIONS})"
+    + ".then(c => window.parent.postMessage(String(c), '*'))";
+    + ".catch(e => window.parent.postMessage(String(e), '*'));";
 
 var GET_CREDENTIAL = "navigator.credentials.get({publicKey : GET_CREDENTIAL_OPTIONS})"
-    + ".then(c => window.parent.postMessage(c.id, '*'));";
+    + ".then(c => window.parent.postMessage(String(c), '*'))";
+    + ".catch(e => window.parent.postMessage(String(e), '*'));";
 
-function EncloseInScriptTag(code) {
+function encloseInScriptTag(code) {
   return "<script>" + code + "</scr" + "ipt>";
 }
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/virtual-navigator-credentials.js b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/virtual-navigator-credentials.js
new file mode 100644
index 0000000..24158ec
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/virtual-navigator-credentials.js
@@ -0,0 +1,91 @@
+'use strict';
+
+class VirtualAuthenticator {
+  constructor(virtualAuthenticator) {
+    this.virtualAuthenticator_ = virtualAuthenticator;
+  }
+
+  async uniqueId() {
+    let getUniqueIdResponse = await this.virtualAuthenticator_.getUniqueId();
+    return getUniqueIdResponse.id;
+  }
+
+  // Alias for uniqueId().
+  async id() {
+    return this.uniqueId();
+  }
+
+  async registeredKeys() {
+    let getRegistrationsResponse = await this.virtualAuthenticator_.getRegistrations();
+    return getRegistrationsResponse.keys;
+  }
+
+  async generateAndRegisterKey(keyHandle, rpId) {
+    let ecKey = await window.crypto.subtle.generateKey(
+        { name: "ECDSA", namedCurve: "P-256" }, true /* extractable */, ["sign", "verify"]);
+    let privateKeyPkcs8 = await window.crypto.subtle.exportKey("pkcs8", ecKey.privateKey);
+    let applicationParameter = await window.crypto.subtle.digest(
+        { name: "SHA-256" }, new TextEncoder("utf-8").encode(rpId));
+    let registration = {
+      privateKey: new Uint8Array(privateKeyPkcs8),
+      keyHandle: keyHandle,
+      applicationParameter: new Uint8Array(applicationParameter),
+      counter: 1,
+    };
+    let addRegistrationResponse = await this.virtualAuthenticator_.addRegistration(registration);
+    return addRegistrationResponse.added;
+  }
+
+  async clearRegisteredKeys() {
+    let clearRegistrationsResponse = await this.virtualAuthenticator_.clearRegistrations();
+    return clearRegistrationsResponse.keys;
+  }
+
+  async setUserPresence(present) {
+    return this.virtualAuthenticator_.setUserPresence(present);
+  }
+
+  async userPresence() {
+    let getUserPresenceResponse = await this.virtualAuthenticator_.getUserPresence();
+    return getUserPresenceResponse.present;
+  }
+};
+
+class VirtualAuthenticatorManager {
+  constructor() {
+    this.virtualAuthenticatorManager_ = new webauth.test.mojom.VirtualAuthenticatorManagerPtr();
+    Mojo.bindInterface(webauth.test.mojom.VirtualAuthenticatorManager.name,
+      mojo.makeRequest(this.virtualAuthenticatorManager_).handle, "context");
+  }
+
+  async createAuthenticator() {
+    let createAuthenticatorResponse = await this.virtualAuthenticatorManager_.createAuthenticator({
+      protocol: webauth.test.mojom.ClientToAuthenticatorProtocol.U2F,
+      transport: webauth.mojom.AuthenticatorTransport.USB,
+      attachment: webauth.mojom.AuthenticatorAttachment.CROSS_PLATFORM,
+      hasResidentKey: false,
+      hasUserVerification: false,
+    });
+    return new VirtualAuthenticator(createAuthenticatorResponse.authenticator);
+  }
+
+  async authenticators() {
+    let getAuthenticatorsResponse = await this.virtualAuthenticatorManager_.getAuthenticators();
+    let authenticators = [];
+    for (let mojo_authenticator of getAuthenticatorsResponse.authenticators) {
+      authenticators.push(new VirtualAuthenticator(mojo_authenticator));
+    }
+    return authenticators;
+  }
+
+  async removeAuthenticator(id) {
+    let removeAuthenticatorResponse = await this.virtualAuthenticatorManager_.removeAuthenticator(id);
+    return removeAuthenticatorResponse.removed;
+  }
+
+  async clearAuthenticators(id) {
+    return this.virtualAuthenticatorManager_.clearAuthenticators();
+  }
+};
+
+navigator.credentials.test = new VirtualAuthenticatorManager();
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/tools/virtual-authenticator-environment-manual.html b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/tools/virtual-authenticator-environment-manual.html
new file mode 100644
index 0000000..099e7bb
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/tools/virtual-authenticator-environment-manual.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<title>Credential Manager: helper page for manual testing using the Testing API.</title>
+<script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
+<script src="/gen/third_party/WebKit/public/platform/modules/webauth/virtual_authenticator.mojom.js"></script>
+<script src="../resources/virtual-navigator-credentials.js"></script>
+<script>
+
+async function probe() {
+  try {
+    await navigator.credentials.test.authenticators();
+    console.info("The Web Authentication Testing API is available under the alias `nct`.");
+  } catch (e) {
+    console.error(e);
+    throw Error("It is likely that the Web Authentication API or the Testing API is not enabled. See instructions below.");
+  }
+}
+
+var nct = navigator.credentials.test;
+probe();
+
+</script>
+<body>
+  <h2>Usage</h2>
+  <p>
+    Make sure Chromium is run with the following command line flags: --enable-features=WebAuthentication --enable-web-authentication-testing-api --enable-blink-features=MojoJS --enable-experimental-web-platform-features. See the console for debug outputs on whether the API connection was established.
+  </p>
+  <p>
+    Then use the Testing API under the `nct` alias to set up and configure virtual authenticator devices. The testing state is shared by the entire browser (all tabs, frames, profiles).
+  </p>
+</body>
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/virtual-navigator-credentials.html b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/virtual-navigator-credentials.html
new file mode 100644
index 0000000..2ad844d1
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/virtual-navigator-credentials.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<title>Credential Manager: unit test for the Web Authentication Testing API.</title>
+<script src="../resources/testharness.js"></script>
+<script src="../resources/testharnessreport.js"></script>
+<script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
+<script src="/gen/third_party/WebKit/public/platform/modules/webauth/virtual_authenticator.mojom.js"></script>
+<script src="resources/virtual-navigator-credentials.js"></script>
+<script>
+
+promise_test(async _ => {
+  assert_true(!!navigator.credentials.test);
+  assert_false(!!window.mockAuthenticator);
+}, "The WebAuthn Testing API should be active, and the mocked out API should not.");
+
+promise_test(async _ => {
+  let authenticators = await navigator.credentials.test.authenticators();
+  assert_equals(authenticators.length, 0);
+
+  let testAuthenticator1 = await navigator.credentials.test.createAuthenticator();
+  let testAuthenticator2 = await navigator.credentials.test.createAuthenticator();
+  let id1 = await testAuthenticator1.id();
+  let id2 = await testAuthenticator2.id();
+
+  authenticators = await navigator.credentials.test.authenticators();
+  assert_equals(authenticators.length, 2);
+
+  assert_true(await navigator.credentials.test.removeAuthenticator(id1));
+  assert_false(await navigator.credentials.test.removeAuthenticator(id1));
+
+  authenticators = await navigator.credentials.test.authenticators();
+  assert_equals(authenticators.length, 1);
+  assert_equals(await authenticators[0].id(), id2);
+
+  await navigator.credentials.test.clearAuthenticators();
+
+  authenticators = await navigator.credentials.test.authenticators();
+  assert_equals(authenticators.length, 0);
+}, "Methods of VirtualAuthenticatorManager work.");
+
+promise_test(async _ => {
+  let testAuthenticator = await navigator.credentials.test.createAuthenticator();
+  let id = await testAuthenticator.id();
+  assert_equals(await testAuthenticator.uniqueId(), id);
+
+  let keys = await testAuthenticator.registeredKeys();
+  assert_equals(keys.length, 0);
+
+  let keyHandle1 = new TextEncoder("utf-8").encode("foo");
+  assert_true(await testAuthenticator.generateAndRegisterKey(keyHandle1, "test.domain"));
+
+  // Re-registrations (with the same key handle) should not be allowed.
+  assert_false(await testAuthenticator.generateAndRegisterKey(keyHandle1, "test.domain"));
+
+  // SHA-256 digest of UTF-8 string "test.domain".
+  let expectedApplicationParameter = new Uint8Array([
+      0xf8, 0x9c, 0x97, 0x3e, 0x36, 0xf6, 0xf6, 0x26, 0x09, 0x6e, 0xab, 0xf2, 0xe2, 0xd2, 0xcb, 0xf2,
+      0x23, 0x39, 0xf9, 0x41, 0x36, 0x9a, 0x0a, 0x20, 0x33, 0x6c, 0x56, 0x95, 0x5d, 0x59, 0xbc, 0x54]);
+
+  keys = await testAuthenticator.registeredKeys();
+  assert_equals(keys.length, 1);
+
+  assert_equals(keys[0].applicationParameter.toString(), expectedApplicationParameter.toString());
+  assert_equals(keys[0].keyHandle.toString(), keyHandle1.toString());
+  assert_equals(keys[0].counter, 1);
+
+  let keyHandle2 = new TextEncoder("utf-8").encode("bar");
+  assert_true(await testAuthenticator.generateAndRegisterKey(keyHandle2, "test.domain"));
+
+  keys = await testAuthenticator.registeredKeys();
+  assert_equals(keys.length, 2);
+
+  keys = await testAuthenticator.clearRegisteredKeys();
+
+  keys = await testAuthenticator.registeredKeys();
+  assert_equals(keys.length, 0);
+}, "Methods of VirtualAuthenticator work.");
+
+promise_test(_ => navigator.credentials.test.clearAuthenticators(), "Clean up testing environment.");
+
+</script>
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-1-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-1-expected.png
deleted file mode 100644
index 14170f4..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-1-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-1-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-1-expected.txt
deleted file mode 100644
index 36a4b7c..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-1-expected.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutInline {SPAN} at (0,0) size 20x19
-        LayoutText {#text} at (0,0) size 20x19
-          text run at (0,0) width 20: "On"
-      LayoutText {#text} at (20,0) size 782x39
-        text run at (20,0) width 464: "ly the first two letters of the first word in this sentence should be selected. "
-        text run at (484,0) width 294: "To run this test manually, double click between"
-        text run at (778,0) width 4: " "
-        text run at (0,20) width 351: "the first two letters of the first word of the first sentence."
-selection start: position 0 of child 0 {#text} of child 0 {SPAN} of body
-selection end:   position 2 of child 0 {#text} of child 0 {SPAN} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-2-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-2-expected.png
deleted file mode 100644
index 5bd0b196..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-2-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-2-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-2-expected.txt
deleted file mode 100644
index 8d8d13a..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-2-expected.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x20
-        LayoutText {#text} at (0,0) size 57x19
-          text run at (0,0) width 57: "OnlyThe"
-        LayoutInline {SPAN} at (0,0) size 32x19
-          LayoutText {#text} at (57,0) size 32x19
-            text run at (57,0) width 32: "Bold"
-        LayoutText {#text} at (89,0) size 72x19
-          text run at (89,0) width 72: "TextShould"
-        LayoutInline {SPAN} at (0,0) size 18x19
-          LayoutText {#text} at (161,0) size 18x19
-            text run at (161,0) width 18: "Be"
-        LayoutText {#text} at (179,0) size 53x19
-          text run at (179,0) width 53: "Selected"
-selection start: position 0 of child 0 {#text} of child 1 {SPAN} of child 1 {DIV} of body
-selection end:   position 4 of child 0 {#text} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-4-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-4-expected.png
deleted file mode 100644
index bdbfd1cc..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-4-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-4-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-4-expected.txt
deleted file mode 100644
index f9d2ece..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-4-expected.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x40
-        LayoutText {#text} at (0,0) size 752x39
-          text run at (0,0) width 457: "This tests moving the caret forward through content of mixed editability. "
-          text run at (457,0) width 295: "The caret should move down one line from the"
-          text run at (0,20) width 470: "editable piece to the editable piece that's embedded in a non-editable piece."
-      LayoutBlockFlow {DIV} at (0,56) size 784x70
-        LayoutBlockFlow (anonymous) at (0,0) size 784x20
-          LayoutText {#text} at (0,0) size 49x19
-            text run at (0,0) width 49: "editable"
-        LayoutTable {TABLE} at (0,20) size 59x30 [border: (1px outset #808080)]
-          LayoutTableSection {TBODY} at (1,1) size 57x28
-            LayoutTableRow {TR} at (0,2) size 57x24
-              LayoutTableCell {TD} at (2,2) size 53x24 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1]
-                LayoutText {#text} at (2,2) size 49x19
-                  text run at (2,2) width 49: "editable"
-        LayoutBlockFlow (anonymous) at (0,50) size 784x20
-          LayoutText {#text} at (0,0) size 49x19
-            text run at (0,0) width 49: "editable"
-caret: position 2 of child 0 {#text} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-5-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-5-expected.png
deleted file mode 100644
index 09e3b005..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-5-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-5-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-5-expected.txt
deleted file mode 100644
index 9ae13fb..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-5-expected.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x40
-        LayoutText {#text} at (0,0) size 752x39
-          text run at (0,0) width 457: "This tests moving the caret forward through content of mixed editability. "
-          text run at (457,0) width 295: "The caret should move down one line from the"
-          text run at (0,20) width 470: "editable piece to the editable piece that's embedded in a non-editable piece."
-      LayoutBlockFlow {DIV} at (0,56) size 784x70
-        LayoutBlockFlow (anonymous) at (0,0) size 784x20
-          LayoutText {#text} at (0,0) size 49x19
-            text run at (0,0) width 49: "editable"
-        LayoutTable {TABLE} at (0,20) size 59x30 [border: (1px outset #808080)]
-          LayoutTableSection {TBODY} at (1,1) size 57x28
-            LayoutTableRow {TR} at (0,2) size 57x24
-              LayoutTableCell {TD} at (2,2) size 53x24 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1]
-                LayoutText {#text} at (2,2) size 49x19
-                  text run at (2,2) width 49: "editable"
-        LayoutBlockFlow (anonymous) at (0,50) size 784x20
-          LayoutText {#text} at (0,0) size 49x19
-            text run at (0,0) width 49: "editable"
-caret: position 9 of child 2 {#text} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-6-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-6-expected.png
deleted file mode 100644
index 8e0b254..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-6-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-6-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-6-expected.txt
deleted file mode 100644
index d5b9fb5..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-6-expected.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x40
-        LayoutText {#text} at (0,0) size 779x39
-          text run at (0,0) width 618: "This tests Select All when the caret is inside an editable region that is inside a non editable region. "
-          text run at (618,0) width 161: "Whenever the selection is"
-          text run at (0,20) width 537: "in an editable region, Select All should select the contents of the highest editable root."
-      LayoutBlockFlow {DIV} at (0,56) size 784x60
-        LayoutBlockFlow {DIV} at (0,0) size 784x20
-          LayoutText {#text} at (0,0) size 27x19
-            text run at (0,0) width 27: "One"
-        LayoutBlockFlow {DIV} at (0,20) size 784x20
-          LayoutInline {SPAN} at (0,0) size 28x19
-            LayoutText {#text} at (0,0) size 28x19
-              text run at (0,0) width 28: "Two"
-          LayoutText {#text} at (28,0) size 4x19
-            text run at (28,0) width 4: " "
-          LayoutInline {SPAN} at (0,0) size 37x19
-            LayoutText {#text} at (32,0) size 37x19
-              text run at (32,0) width 37: "Three"
-        LayoutBlockFlow {DIV} at (0,40) size 784x20
-          LayoutText {#text} at (0,0) size 30x19
-            text run at (0,0) width 30: "Four"
-selection start: position 0 of child 0 {#text} of child 1 {DIV} of child 2 {DIV} of body
-selection end:   position 4 of child 0 {#text} of child 5 {DIV} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-7-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-7-expected.png
deleted file mode 100644
index 5870525f..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-7-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-7-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-7-expected.txt
deleted file mode 100644
index c8ce689..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/mixed-editability-7-expected.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x40
-        LayoutText {#text} at (0,0) size 779x39
-          text run at (0,0) width 779: "This tests creating a selection based inside a nested editable region that extends out to editable content that is inside the same"
-          text run at (0,20) width 135: "highest editable root. "
-          text run at (135,20) width 256: "'One' through 'Three' should be selected."
-      LayoutBlockFlow {DIV} at (0,56) size 784x60
-        LayoutBlockFlow {DIV} at (0,0) size 784x20
-          LayoutText {#text} at (0,0) size 27x19
-            text run at (0,0) width 27: "One"
-        LayoutBlockFlow {DIV} at (0,20) size 784x20
-          LayoutInline {SPAN} at (0,0) size 28x19
-            LayoutText {#text} at (0,0) size 28x19
-              text run at (0,0) width 28: "Two"
-          LayoutText {#text} at (28,0) size 4x19
-            text run at (28,0) width 4: " "
-          LayoutInline {SPAN} at (0,0) size 37x19
-            LayoutText {#text} at (32,0) size 37x19
-              text run at (32,0) width 37: "Three"
-        LayoutBlockFlow {DIV} at (0,40) size 784x20
-          LayoutText {#text} at (0,0) size 30x19
-            text run at (0,0) width 30: "Four"
-selection start: position 0 of child 0 {#text} of child 1 {DIV} of child 2 {DIV} of body
-selection end:   position 5 of child 0 {#text} of child 2 {SPAN} of child 3 {DIV} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/IndexedDB/interfaces.any.worker-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/IndexedDB/interfaces.any.worker-expected.txt
deleted file mode 100644
index bc6c479..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/IndexedDB/interfaces.any.worker-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Test driver promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/background-fetch/interfaces-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/background-fetch/interfaces-expected.txt
deleted file mode 100644
index 27a8fa6..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/background-fetch/interfaces-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Exposed interfaces in a Document. promise_test: Unhandled rejection with value: object "BackgroundFetchRegistration inherits EventTarget, but EventTarget is undefined."
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/content-security-policy/securitypolicyviolation/idl-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/content-security-policy/securitypolicyviolation/idl-expected.txt
deleted file mode 100644
index 35e0749..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/content-security-policy/securitypolicyviolation/idl-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Untitled Uncaught SecurityPolicyViolationEventInit inherits EventInit, but SecurityPolicyViolationEventInit is not an interface.
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/fullscreen/interfaces-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/fullscreen/interfaces-expected.txt
deleted file mode 100644
index bc6c479..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/fullscreen/interfaces-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Test driver promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/html/dom/interfaces-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/html/dom/interfaces-expected.txt
deleted file mode 100644
index bc6c479..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/html/dom/interfaces-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Test driver promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/media-capabilities/idlharness-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/media-capabilities/idlharness-expected.txt
deleted file mode 100644
index 2dcd3d0..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/media-capabilities/idlharness-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Media Capabilities IDL tests Uncaught MediaDecodingConfiguration inherits MediaConfiguration, but MediaDecodingConfiguration is not an interface.
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/mediacapture-streams/MediaDevices-IDL-all-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/mediacapture-streams/MediaDevices-IDL-all-expected.txt
deleted file mode 100644
index ff43cb4..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/mediacapture-streams/MediaDevices-IDL-all-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Test driver promise_test: Unhandled rejection with value: object "MediaTrackConstraints inherits MediaTrackConstraintSet, but MediaTrackConstraints is not an interface."
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/mediacapture-streams/MediaStreamTrack-idl.https-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/mediacapture-streams/MediaStreamTrack-idl.https-expected.txt
deleted file mode 100644
index bc6c479..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/mediacapture-streams/MediaStreamTrack-idl.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Test driver promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/payment-handler/interfaces.https.any-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/payment-handler/interfaces.https.any-expected.txt
deleted file mode 100644
index 81630dd..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/payment-handler/interfaces.https.any-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Payment handler interfaces. promise_test: Unhandled rejection with value: object "CanMakePaymentEvent inherits ExtendableEvent, but ExtendableEvent is undefined."
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/webaudio/the-audio-api/the-gainnode-interface/idl-test-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/webaudio/the-audio-api/the-gainnode-interface/idl-test-expected.txt
deleted file mode 100644
index 851df2b794..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/webaudio/the-audio-api/the-gainnode-interface/idl-test-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL GainNode IDL Test Uncaught GainOptions inherits AudioNodeOptions, but GainOptions is not an interface.
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/webstorage/idlharness-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/webstorage/idlharness-expected.txt
deleted file mode 100644
index 5991f94fa..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/webstorage/idlharness-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Web Storage IDL tests Uncaught StorageEventInit inherits EventInit, but StorageEventInit is not an interface.
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/webusb/idlharness.https-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/webusb/idlharness.https-expected.txt
deleted file mode 100644
index 2a8db22..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/webusb/idlharness.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL WebUSB IDL test promise_test: Unhandled rejection with value: object "USBConnectionEventInit inherits EventInit, but USBConnectionEventInit is not an interface."
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/webxr/interfaces.https-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/webxr/interfaces.https-expected.txt
deleted file mode 100644
index e76f2824..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.12/external/wpt/webxr/interfaces.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Test IDL implementation of WebXR API promise_test: Unhandled rejection with value: object "Partial dictionary WebGLContextAttributes with no original dictionary"
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-1-expected.png
deleted file mode 100644
index 34e9cae..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-1-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-1-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-1-expected.txt
deleted file mode 100644
index 1109d25..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-1-expected.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutInline {SPAN} at (0,0) size 20x18
-        LayoutText {#text} at (0,0) size 20x18
-          text run at (0,0) width 20: "On"
-      LayoutText {#text} at (19,0) size 743x36
-        text run at (19,0) width 476: "ly the first two letters of the first word in this sentence should be selected. "
-        text run at (494,0) width 245: "To run this test manually, double click"
-        text run at (738,0) width 5: " "
-        text run at (0,18) width 417: "between the first two letters of the first word of the first sentence."
-selection start: position 0 of child 0 {#text} of child 0 {SPAN} of body
-selection end:   position 2 of child 0 {#text} of child 0 {SPAN} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-2-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-2-expected.png
deleted file mode 100644
index cdcb0a7c..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-2-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-2-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-2-expected.txt
deleted file mode 100644
index 9ae8273..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-2-expected.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x18
-        LayoutText {#text} at (0,0) size 57x18
-          text run at (0,0) width 57: "OnlyThe"
-        LayoutInline {SPAN} at (0,0) size 33x18
-          LayoutText {#text} at (56,0) size 33x18
-            text run at (56,0) width 33: "Bold"
-        LayoutText {#text} at (88,0) size 75x18
-          text run at (88,0) width 75: "TextShould"
-        LayoutInline {SPAN} at (0,0) size 19x18
-          LayoutText {#text} at (162,0) size 19x18
-            text run at (162,0) width 19: "Be"
-        LayoutText {#text} at (180,0) size 55x18
-          text run at (180,0) width 55: "Selected"
-selection start: position 0 of child 0 {#text} of child 1 {SPAN} of child 1 {DIV} of body
-selection end:   position 4 of child 0 {#text} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-4-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-4-expected.png
deleted file mode 100644
index 9f1b918..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-4-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-4-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-4-expected.txt
deleted file mode 100644
index 46df0fe..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-4-expected.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x36
-        LayoutText {#text} at (0,0) size 769x36
-          text run at (0,0) width 470: "This tests moving the caret forward through content of mixed editability. "
-          text run at (469,0) width 300: "The caret should move down one line from the"
-          text run at (0,18) width 481: "editable piece to the editable piece that's embedded in a non-editable piece."
-      LayoutBlockFlow {DIV} at (0,52) size 784x64
-        LayoutBlockFlow (anonymous) at (0,0) size 784x18
-          LayoutText {#text} at (0,0) size 51x18
-            text run at (0,0) width 51: "editable"
-        LayoutTable {TABLE} at (0,18) size 61x28 [border: (1px outset #808080)]
-          LayoutTableSection {TBODY} at (1,1) size 59x26
-            LayoutTableRow {TR} at (0,2) size 59x22
-              LayoutTableCell {TD} at (2,2) size 55x22 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1]
-                LayoutText {#text} at (2,2) size 51x18
-                  text run at (2,2) width 51: "editable"
-        LayoutBlockFlow (anonymous) at (0,46) size 784x18
-          LayoutText {#text} at (0,0) size 51x18
-            text run at (0,0) width 51: "editable"
-caret: position 2 of child 0 {#text} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-5-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-5-expected.png
deleted file mode 100644
index 3fd5a83..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-5-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-5-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-5-expected.txt
deleted file mode 100644
index c41b199..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-5-expected.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x36
-        LayoutText {#text} at (0,0) size 769x36
-          text run at (0,0) width 470: "This tests moving the caret forward through content of mixed editability. "
-          text run at (469,0) width 300: "The caret should move down one line from the"
-          text run at (0,18) width 481: "editable piece to the editable piece that's embedded in a non-editable piece."
-      LayoutBlockFlow {DIV} at (0,52) size 784x64
-        LayoutBlockFlow (anonymous) at (0,0) size 784x18
-          LayoutText {#text} at (0,0) size 51x18
-            text run at (0,0) width 51: "editable"
-        LayoutTable {TABLE} at (0,18) size 61x28 [border: (1px outset #808080)]
-          LayoutTableSection {TBODY} at (1,1) size 59x26
-            LayoutTableRow {TR} at (0,2) size 59x22
-              LayoutTableCell {TD} at (2,2) size 55x22 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1]
-                LayoutText {#text} at (2,2) size 51x18
-                  text run at (2,2) width 51: "editable"
-        LayoutBlockFlow (anonymous) at (0,46) size 784x18
-          LayoutText {#text} at (0,0) size 51x18
-            text run at (0,0) width 51: "editable"
-caret: position 9 of child 2 {#text} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-6-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-6-expected.png
deleted file mode 100644
index 7de279a..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-6-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-6-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-6-expected.txt
deleted file mode 100644
index d2ad0012..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-6-expected.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x36
-        LayoutText {#text} at (0,0) size 783x36
-          text run at (0,0) width 633: "This tests Select All when the caret is inside an editable region that is inside a non editable region. "
-          text run at (632,0) width 151: "Whenever the selection"
-          text run at (0,18) width 565: "is in an editable region, Select All should select the contents of the highest editable root."
-      LayoutBlockFlow {DIV} at (0,52) size 784x54
-        LayoutBlockFlow {DIV} at (0,0) size 784x18
-          LayoutText {#text} at (0,0) size 27x18
-            text run at (0,0) width 27: "One"
-        LayoutBlockFlow {DIV} at (0,18) size 784x18
-          LayoutInline {SPAN} at (0,0) size 29x18
-            LayoutText {#text} at (0,0) size 29x18
-              text run at (0,0) width 29: "Two"
-          LayoutText {#text} at (28,0) size 5x18
-            text run at (28,0) width 5: " "
-          LayoutInline {SPAN} at (0,0) size 38x18
-            LayoutText {#text} at (32,0) size 38x18
-              text run at (32,0) width 38: "Three"
-        LayoutBlockFlow {DIV} at (0,36) size 784x18
-          LayoutText {#text} at (0,0) size 31x18
-            text run at (0,0) width 31: "Four"
-selection start: position 0 of child 0 {#text} of child 1 {DIV} of child 2 {DIV} of body
-selection end:   position 4 of child 0 {#text} of child 5 {DIV} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-7-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-7-expected.png
deleted file mode 100644
index a03cfd0..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-7-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-7-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-7-expected.txt
deleted file mode 100644
index 669b2cbc..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/mixed-editability-7-expected.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x36
-        LayoutText {#text} at (0,0) size 763x36
-          text run at (0,0) width 763: "This tests creating a selection based inside a nested editable region that extends out to editable content that is inside the"
-          text run at (0,18) width 176: "same highest editable root. "
-          text run at (175,18) width 260: "'One' through 'Three' should be selected."
-      LayoutBlockFlow {DIV} at (0,52) size 784x54
-        LayoutBlockFlow {DIV} at (0,0) size 784x18
-          LayoutText {#text} at (0,0) size 27x18
-            text run at (0,0) width 27: "One"
-        LayoutBlockFlow {DIV} at (0,18) size 784x18
-          LayoutInline {SPAN} at (0,0) size 29x18
-            LayoutText {#text} at (0,0) size 29x18
-              text run at (0,0) width 29: "Two"
-          LayoutText {#text} at (28,0) size 5x18
-            text run at (28,0) width 5: " "
-          LayoutInline {SPAN} at (0,0) size 38x18
-            LayoutText {#text} at (32,0) size 38x18
-              text run at (32,0) width 38: "Three"
-        LayoutBlockFlow {DIV} at (0,36) size 784x18
-          LayoutText {#text} at (0,0) size 31x18
-            text run at (0,0) width 31: "Four"
-selection start: position 0 of child 0 {#text} of child 1 {DIV} of child 2 {DIV} of body
-selection end:   position 5 of child 0 {#text} of child 2 {SPAN} of child 3 {DIV} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-1-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-1-expected.png
deleted file mode 100644
index 745c683..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-1-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-1-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-1-expected.txt
deleted file mode 100644
index ed842cb..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-1-expected.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutInline {SPAN} at (0,0) size 19x19
-        LayoutText {#text} at (0,0) size 19x19
-          text run at (0,0) width 19: "On"
-      LayoutText {#text} at (19,0) size 766x39
-        text run at (19,0) width 442: "ly the first two letters of the first word in this sentence should be selected. "
-        text run at (461,0) width 301: "To run this test manually, double click between the"
-        text run at (762,0) width 4: " "
-        text run at (0,20) width 313: "first two letters of the first word of the first sentence."
-selection start: position 0 of child 0 {#text} of child 0 {SPAN} of body
-selection end:   position 2 of child 0 {#text} of child 0 {SPAN} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-2-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-2-expected.png
deleted file mode 100644
index 5771c04..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-2-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-2-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-2-expected.txt
deleted file mode 100644
index 2eb7ecf..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-2-expected.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x20
-        LayoutText {#text} at (0,0) size 52x19
-          text run at (0,0) width 52: "OnlyThe"
-        LayoutInline {SPAN} at (0,0) size 31x19
-          LayoutText {#text} at (52,0) size 31x19
-            text run at (52,0) width 31: "Bold"
-        LayoutText {#text} at (83,0) size 68x19
-          text run at (83,0) width 68: "TextShould"
-        LayoutInline {SPAN} at (0,0) size 17x19
-          LayoutText {#text} at (151,0) size 17x19
-            text run at (151,0) width 17: "Be"
-        LayoutText {#text} at (168,0) size 52x19
-          text run at (168,0) width 52: "Selected"
-selection start: position 0 of child 0 {#text} of child 1 {SPAN} of child 1 {DIV} of body
-selection end:   position 4 of child 0 {#text} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-4-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-4-expected.png
deleted file mode 100644
index a04b593..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-4-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-4-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-4-expected.txt
deleted file mode 100644
index fc61915..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-4-expected.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x40
-        LayoutText {#text} at (0,0) size 762x39
-          text run at (0,0) width 432: "This tests moving the caret forward through content of mixed editability. "
-          text run at (432,0) width 330: "The caret should move down one line from the editable"
-          text run at (0,20) width 404: "piece to the editable piece that's embedded in a non-editable piece."
-      LayoutBlockFlow {DIV} at (0,56) size 784x70
-        LayoutBlockFlow (anonymous) at (0,0) size 784x20
-          LayoutText {#text} at (0,0) size 47x19
-            text run at (0,0) width 47: "editable"
-        LayoutTable {TABLE} at (0,20) size 57x30 [border: (1px outset #808080)]
-          LayoutTableSection {TBODY} at (1,1) size 55x28
-            LayoutTableRow {TR} at (0,2) size 55x24
-              LayoutTableCell {TD} at (2,2) size 51x24 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1]
-                LayoutText {#text} at (2,2) size 47x19
-                  text run at (2,2) width 47: "editable"
-        LayoutBlockFlow (anonymous) at (0,50) size 784x20
-          LayoutText {#text} at (0,0) size 47x19
-            text run at (0,0) width 47: "editable"
-caret: position 2 of child 0 {#text} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-5-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-5-expected.png
deleted file mode 100644
index e672a208..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-5-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-5-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-5-expected.txt
deleted file mode 100644
index 604bb95..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-5-expected.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x40
-        LayoutText {#text} at (0,0) size 762x39
-          text run at (0,0) width 432: "This tests moving the caret forward through content of mixed editability. "
-          text run at (432,0) width 330: "The caret should move down one line from the editable"
-          text run at (0,20) width 404: "piece to the editable piece that's embedded in a non-editable piece."
-      LayoutBlockFlow {DIV} at (0,56) size 784x70
-        LayoutBlockFlow (anonymous) at (0,0) size 784x20
-          LayoutText {#text} at (0,0) size 47x19
-            text run at (0,0) width 47: "editable"
-        LayoutTable {TABLE} at (0,20) size 57x30 [border: (1px outset #808080)]
-          LayoutTableSection {TBODY} at (1,1) size 55x28
-            LayoutTableRow {TR} at (0,2) size 55x24
-              LayoutTableCell {TD} at (2,2) size 51x24 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1]
-                LayoutText {#text} at (2,2) size 47x19
-                  text run at (2,2) width 47: "editable"
-        LayoutBlockFlow (anonymous) at (0,50) size 784x20
-          LayoutText {#text} at (0,0) size 47x19
-            text run at (0,0) width 47: "editable"
-caret: position 9 of child 2 {#text} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-6-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-6-expected.png
deleted file mode 100644
index 6886030529..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-6-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-6-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-6-expected.txt
deleted file mode 100644
index 8aba8fc..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-6-expected.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x40
-        LayoutText {#text} at (0,0) size 770x39
-          text run at (0,0) width 585: "This tests Select All when the caret is inside an editable region that is inside a non editable region. "
-          text run at (585,0) width 185: "Whenever the selection is in an"
-          text run at (0,20) width 478: "editable region, Select All should select the contents of the highest editable root."
-      LayoutBlockFlow {DIV} at (0,56) size 784x60
-        LayoutBlockFlow {DIV} at (0,0) size 784x20
-          LayoutText {#text} at (0,0) size 26x19
-            text run at (0,0) width 26: "One"
-        LayoutBlockFlow {DIV} at (0,20) size 784x20
-          LayoutInline {SPAN} at (0,0) size 27x19
-            LayoutText {#text} at (0,0) size 27x19
-              text run at (0,0) width 27: "Two"
-          LayoutText {#text} at (27,0) size 4x19
-            text run at (27,0) width 4: " "
-          LayoutInline {SPAN} at (0,0) size 35x19
-            LayoutText {#text} at (31,0) size 35x19
-              text run at (31,0) width 35: "Three"
-        LayoutBlockFlow {DIV} at (0,40) size 784x20
-          LayoutText {#text} at (0,0) size 29x19
-            text run at (0,0) width 29: "Four"
-selection start: position 0 of child 0 {#text} of child 1 {DIV} of child 2 {DIV} of body
-selection end:   position 4 of child 0 {#text} of child 5 {DIV} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-7-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-7-expected.png
deleted file mode 100644
index d50722fa..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-7-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-7-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-7-expected.txt
deleted file mode 100644
index 02e3451b..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/selection/mixed-editability-7-expected.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x40
-        LayoutText {#text} at (0,0) size 746x39
-          text run at (0,0) width 746: "This tests creating a selection based inside a nested editable region that extends out to editable content that is inside the same"
-          text run at (0,20) width 129: "highest editable root. "
-          text run at (129,20) width 245: "'One' through 'Three' should be selected."
-      LayoutBlockFlow {DIV} at (0,56) size 784x60
-        LayoutBlockFlow {DIV} at (0,0) size 784x20
-          LayoutText {#text} at (0,0) size 26x19
-            text run at (0,0) width 26: "One"
-        LayoutBlockFlow {DIV} at (0,20) size 784x20
-          LayoutInline {SPAN} at (0,0) size 27x19
-            LayoutText {#text} at (0,0) size 27x19
-              text run at (0,0) width 27: "Two"
-          LayoutText {#text} at (27,0) size 4x19
-            text run at (27,0) width 4: " "
-          LayoutInline {SPAN} at (0,0) size 35x19
-            LayoutText {#text} at (31,0) size 35x19
-              text run at (31,0) width 35: "Three"
-        LayoutBlockFlow {DIV} at (0,40) size 784x20
-          LayoutText {#text} at (0,0) size 29x19
-            text run at (0,0) width 29: "Four"
-selection start: position 0 of child 0 {#text} of child 1 {DIV} of child 2 {DIV} of body
-selection end:   position 5 of child 0 {#text} of child 2 {SPAN} of child 3 {DIV} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/background-fetch/interfaces-expected.txt b/third_party/WebKit/LayoutTests/platform/win/external/wpt/background-fetch/interfaces-expected.txt
deleted file mode 100644
index 27a8fa6..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/external/wpt/background-fetch/interfaces-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Exposed interfaces in a Document. promise_test: Unhandled rejection with value: object "BackgroundFetchRegistration inherits EventTarget, but EventTarget is undefined."
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/fullscreen/interfaces-expected.txt b/third_party/WebKit/LayoutTests/platform/win/external/wpt/fullscreen/interfaces-expected.txt
deleted file mode 100644
index bc6c479..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/external/wpt/fullscreen/interfaces-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Test driver promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/html/dom/interfaces-expected.txt b/third_party/WebKit/LayoutTests/platform/win/external/wpt/html/dom/interfaces-expected.txt
deleted file mode 100644
index bc6c479..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/external/wpt/html/dom/interfaces-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Test driver promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/media-capabilities/idlharness-expected.txt b/third_party/WebKit/LayoutTests/platform/win/external/wpt/media-capabilities/idlharness-expected.txt
deleted file mode 100644
index 2dcd3d0..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/external/wpt/media-capabilities/idlharness-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Media Capabilities IDL tests Uncaught MediaDecodingConfiguration inherits MediaConfiguration, but MediaDecodingConfiguration is not an interface.
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/mediacapture-streams/MediaDevices-IDL-all-expected.txt b/third_party/WebKit/LayoutTests/platform/win/external/wpt/mediacapture-streams/MediaDevices-IDL-all-expected.txt
deleted file mode 100644
index ff43cb4..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/external/wpt/mediacapture-streams/MediaDevices-IDL-all-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Test driver promise_test: Unhandled rejection with value: object "MediaTrackConstraints inherits MediaTrackConstraintSet, but MediaTrackConstraints is not an interface."
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/mediacapture-streams/MediaStreamTrack-idl.https-expected.txt b/third_party/WebKit/LayoutTests/platform/win/external/wpt/mediacapture-streams/MediaStreamTrack-idl.https-expected.txt
deleted file mode 100644
index bc6c479..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/external/wpt/mediacapture-streams/MediaStreamTrack-idl.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Test driver promise_test: Unhandled rejection with value: object "CustomEventInit inherits EventInit, but CustomEventInit is not an interface."
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/payment-handler/interfaces.https.any-expected.txt b/third_party/WebKit/LayoutTests/platform/win/external/wpt/payment-handler/interfaces.https.any-expected.txt
deleted file mode 100644
index 81630dd..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/external/wpt/payment-handler/interfaces.https.any-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Payment handler interfaces. promise_test: Unhandled rejection with value: object "CanMakePaymentEvent inherits ExtendableEvent, but ExtendableEvent is undefined."
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/webxr/interfaces.https-expected.txt b/third_party/WebKit/LayoutTests/platform/win/external/wpt/webxr/interfaces.https-expected.txt
deleted file mode 100644
index e76f2824..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/external/wpt/webxr/interfaces.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Test IDL implementation of WebXR API promise_test: Unhandled rejection with value: object "Partial dictionary WebGLContextAttributes with no original dictionary"
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/virtual/enable-webauthn/http/tests/credentialmanager/credentialscontainer-create-from-nested-frame-expected.txt b/third_party/WebKit/LayoutTests/virtual/enable-webauthn/http/tests/credentialmanager/credentialscontainer-create-from-nested-frame-expected.txt
deleted file mode 100644
index f7059535..0000000
--- a/third_party/WebKit/LayoutTests/virtual/enable-webauthn/http/tests/credentialmanager/credentialscontainer-create-from-nested-frame-expected.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: mojo/public/mojom/base/string16.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: mojo/public/mojom/base/big_buffer.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: url/mojom/origin.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: url/mojom/url.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: mojo/public/mojom/base/time.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: mojo/public/mojom/base/string16.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: mojo/public/mojom/base/big_buffer.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: url/mojom/origin.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: url/mojom/url.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: mojo/public/mojom/base/time.mojom
-This is a testharness.js-based test.
-PASS navigator.credentials should be undefined in documents generated from `data:` URLs.
-PASS navigator.credentials.create({publicKey}) in a javascript url should should succeed.
-PASS navigator.credentials.create({publicKey}) in srcdoc should succeed.
-PASS navigator.credentials.create({publicKey}) in about:blank embedded in a secure context should succeed.
-PASS navigator.credentials.create({publicKey}) in an about:blank page embedded in a secure context should pass rpID checks.
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/virtual/enable-webauthn/http/tests/credentialmanager/credentialscontainer-get-from-nested-frame-expected.txt b/third_party/WebKit/LayoutTests/virtual/enable-webauthn/http/tests/credentialmanager/credentialscontainer-get-from-nested-frame-expected.txt
deleted file mode 100644
index aa809c9..0000000
--- a/third_party/WebKit/LayoutTests/virtual/enable-webauthn/http/tests/credentialmanager/credentialscontainer-get-from-nested-frame-expected.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: mojo/public/mojom/base/string16.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: mojo/public/mojom/base/big_buffer.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: url/mojom/origin.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: url/mojom/url.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: mojo/public/mojom/base/time.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: mojo/public/mojom/base/string16.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: mojo/public/mojom/base/big_buffer.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: url/mojom/origin.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: url/mojom/url.mojom
-CONSOLE WARNING: line 10: The following mojom is loaded multiple times: mojo/public/mojom/base/time.mojom
-This is a testharness.js-based test.
-PASS navigator.credentials should be undefined in documents generated from `data:` URLs.
-PASS navigator.credentials.get({publicKey}) in a javascript url should should succeed.
-PASS navigator.credentials.get({publicKey}) in srcdoc should succeed.
-PASS navigator.credentials.get({publicKey}) in about:blank embedded in a secure context should succeed.
-PASS navigator.credentials.get({publicKey}) in an about:blank page embedded in a secure context should pass rpID checks.
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/Source/core/dom/BUILD.gn b/third_party/WebKit/Source/core/dom/BUILD.gn
index 18c2e2c2..71a2f32a 100644
--- a/third_party/WebKit/Source/core/dom/BUILD.gn
+++ b/third_party/WebKit/Source/core/dom/BUILD.gn
@@ -199,8 +199,6 @@
     "RawDataDocumentParser.h",
     "RemoteSecurityContext.cpp",
     "RemoteSecurityContext.h",
-    "SandboxFlags.cpp",
-    "SandboxFlags.h",
     "ScopedWindowFocusAllowedIndicator.h",
     "ScriptableDocumentParser.cpp",
     "ScriptableDocumentParser.h",
diff --git a/third_party/WebKit/Source/core/dom/DocumentInit.h b/third_party/WebKit/Source/core/dom/DocumentInit.h
index fb91ac5..1f1cdc4 100644
--- a/third_party/WebKit/Source/core/dom/DocumentInit.h
+++ b/third_party/WebKit/Source/core/dom/DocumentInit.h
@@ -31,8 +31,8 @@
 #define DocumentInit_h
 
 #include "core/CoreExport.h"
-#include "core/dom/SandboxFlags.h"
 #include "core/dom/SecurityContext.h"
+#include "core/frame/SandboxFlags.h"
 #include "core/html/custom/V0CustomElementRegistrationContext.h"
 #include "platform/heap/Handle.h"
 #include "platform/weborigin/KURL.h"
diff --git a/third_party/WebKit/Source/core/dom/SecurityContext.h b/third_party/WebKit/Source/core/dom/SecurityContext.h
index 3d8c316..fc4c31b 100644
--- a/third_party/WebKit/Source/core/dom/SecurityContext.h
+++ b/third_party/WebKit/Source/core/dom/SecurityContext.h
@@ -30,7 +30,7 @@
 #include "base/macros.h"
 #include "base/memory/scoped_refptr.h"
 #include "core/CoreExport.h"
-#include "core/dom/SandboxFlags.h"
+#include "core/frame/SandboxFlags.h"
 #include "platform/heap/Handle.h"
 #include "platform/wtf/HashSet.h"
 #include "platform/wtf/text/StringHash.h"
diff --git a/third_party/WebKit/Source/core/editing/EditingStyle.cpp b/third_party/WebKit/Source/core/editing/EditingStyle.cpp
index c63faf65..8a1a2ab 100644
--- a/third_party/WebKit/Source/core/editing/EditingStyle.cpp
+++ b/third_party/WebKit/Source/core/editing/EditingStyle.cpp
@@ -54,6 +54,7 @@
 #include "core/editing/FrameSelection.h"
 #include "core/editing/Position.h"
 #include "core/editing/VisibleSelection.h"
+#include "core/editing/WritingDirection.h"
 #include "core/editing/commands/ApplyStyleCommand.h"
 #include "core/editing/serializers/HTMLInterchange.h"
 #include "core/frame/LocalFrame.h"
@@ -637,14 +638,14 @@
 
     writing_direction =
         ToCSSIdentifierValue(direction)->GetValueID() == CSSValueLtr
-            ? LeftToRightWritingDirection
-            : RightToLeftWritingDirection;
+            ? WritingDirection::kLeftToRight
+            : WritingDirection::kRightToLeft;
 
     return true;
   }
 
   if (unicode_bidi_value == CSSValueNormal) {
-    writing_direction = NaturalWritingDirection;
+    writing_direction = WritingDirection::kNatural;
     return true;
   }
 
diff --git a/third_party/WebKit/Source/core/editing/EditingStyle.h b/third_party/WebKit/Source/core/editing/EditingStyle.h
index 231e5ba1..486dc8bb2 100644
--- a/third_party/WebKit/Source/core/editing/EditingStyle.h
+++ b/third_party/WebKit/Source/core/editing/EditingStyle.h
@@ -36,7 +36,6 @@
 #include "core/css_property_names.h"
 #include "core/css_value_keywords.h"
 #include "core/editing/Forward.h"
-#include "core/editing/WritingDirection.h"
 #include "platform/heap/Handle.h"
 #include "platform/wtf/Forward.h"
 #include "platform/wtf/Vector.h"
@@ -58,6 +57,7 @@
 class CSSPropertyValueSet;
 enum class EditingTriState;
 enum class SecureContextMode;
+enum class WritingDirection;
 
 class CORE_EXPORT EditingStyle final : public GarbageCollected<EditingStyle> {
  public:
diff --git a/third_party/WebKit/Source/core/editing/Editor.cpp b/third_party/WebKit/Source/core/editing/Editor.cpp
index adb4cfc3..1b31f0c 100644
--- a/third_party/WebKit/Source/core/editing/Editor.cpp
+++ b/third_party/WebKit/Source/core/editing/Editor.cpp
@@ -50,6 +50,7 @@
 #include "core/editing/SetSelectionOptions.h"
 #include "core/editing/VisiblePosition.h"
 #include "core/editing/VisibleUnits.h"
+#include "core/editing/WritingDirection.h"
 #include "core/editing/commands/ApplyStyleCommand.h"
 #include "core/editing/commands/DeleteSelectionCommand.h"
 #include "core/editing/commands/IndentOutdentCommand.h"
@@ -648,10 +649,10 @@
 void Editor::SetBaseWritingDirection(WritingDirection direction) {
   Element* focused_element = GetFrame().GetDocument()->FocusedElement();
   if (IsTextControlElement(focused_element)) {
-    if (direction == NaturalWritingDirection)
+    if (direction == WritingDirection::kNatural)
       return;
     focused_element->setAttribute(
-        dirAttr, direction == LeftToRightWritingDirection ? "ltr" : "rtl");
+        dirAttr, direction == WritingDirection::kLeftToRight ? "ltr" : "rtl");
     focused_element->DispatchInputEvent();
     return;
   }
@@ -660,9 +661,9 @@
       MutableCSSPropertyValueSet::Create(kHTMLQuirksMode);
   style->SetProperty(
       CSSPropertyDirection,
-      direction == LeftToRightWritingDirection
+      direction == WritingDirection::kLeftToRight
           ? "ltr"
-          : direction == RightToLeftWritingDirection ? "rtl" : "inherit",
+          : direction == WritingDirection::kRightToLeft ? "rtl" : "inherit",
       /* important */ false, GetFrame().GetDocument()->GetSecureContextMode());
   ApplyParagraphStyleToSelection(
       style, InputEvent::InputType::kFormatSetBlockTextDirection);
@@ -746,24 +747,27 @@
   }
 }
 
-bool Editor::FindString(const String& target, FindOptions options) {
+bool Editor::FindString(LocalFrame& frame,
+                        const String& target,
+                        FindOptions options) {
   VisibleSelection selection =
-      GetFrameSelection().ComputeVisibleSelectionInDOMTreeDeprecated();
+      frame.Selection().ComputeVisibleSelectionInDOMTreeDeprecated();
 
   // TODO(yosin) We should make |findRangeOfString()| to return
   // |EphemeralRange| rather than|Range| object.
-  Range* result_range = FindRangeOfString(
-      target, EphemeralRange(selection.Start(), selection.End()),
-      static_cast<FindOptions>(options | kFindAPICall));
+  Range* const result_range =
+      FindRangeOfString(*frame.GetDocument(), target,
+                        EphemeralRange(selection.Start(), selection.End()),
+                        static_cast<FindOptions>(options | kFindAPICall));
 
   if (!result_range)
     return false;
 
-  GetFrameSelection().SetSelectionAndEndTyping(
+  frame.Selection().SetSelectionAndEndTyping(
       SelectionInDOMTree::Builder()
           .SetBaseAndExtent(EphemeralRange(result_range))
           .Build());
-  GetFrameSelection().RevealSelection();
+  frame.Selection().RevealSelection();
   return true;
 }
 
@@ -874,18 +878,20 @@
   return result_range;
 }
 
-Range* Editor::FindRangeOfString(const String& target,
+Range* Editor::FindRangeOfString(Document& document,
+                                 const String& target,
                                  const EphemeralRange& reference,
                                  FindOptions options) {
-  return FindRangeOfStringAlgorithm<EditingStrategy>(
-      *GetFrame().GetDocument(), target, reference, options);
+  return FindRangeOfStringAlgorithm<EditingStrategy>(document, target,
+                                                     reference, options);
 }
 
-Range* Editor::FindRangeOfString(const String& target,
+Range* Editor::FindRangeOfString(Document& document,
+                                 const String& target,
                                  const EphemeralRangeInFlatTree& reference,
                                  FindOptions options) {
   return FindRangeOfStringAlgorithm<EditingInFlatTreeStrategy>(
-      *GetFrame().GetDocument(), target, reference, options);
+      document, target, reference, options);
 }
 
 void Editor::SetMarkedTextMatchesAreHighlighted(bool flag) {
diff --git a/third_party/WebKit/Source/core/editing/Editor.h b/third_party/WebKit/Source/core/editing/Editor.h
index 2eedb8f..5bea303 100644
--- a/third_party/WebKit/Source/core/editing/Editor.h
+++ b/third_party/WebKit/Source/core/editing/Editor.h
@@ -34,7 +34,6 @@
 #include "core/editing/EditingStyle.h"
 #include "core/editing/Forward.h"
 #include "core/editing/VisibleSelection.h"
-#include "core/editing/WritingDirection.h"
 #include "core/editing/finder/FindOptions.h"
 #include "core/events/InputEvent.h"
 #include "platform/heap/Handle.h"
@@ -60,6 +59,7 @@
 enum class DragSourceType { kHTMLSource, kPlainTextSource };
 enum class EditorParagraphSeparator { kIsDiv, kIsP };
 enum class EditorCommandSource { kMenuOrKeyBinding, kDOM };
+enum class WritingDirection;
 
 class CORE_EXPORT Editor final : public GarbageCollectedFinalized<Editor> {
  public:
@@ -158,14 +158,17 @@
 
   void AddToKillRing(const EphemeralRange&);
 
-  bool FindString(const String&, FindOptions);
+  static bool FindString(LocalFrame&, const String&, FindOptions);
 
-  Range* FindRangeOfString(const String& target,
-                           const EphemeralRange& reference_range,
-                           FindOptions);
-  Range* FindRangeOfString(const String& target,
-                           const EphemeralRangeInFlatTree& reference_range,
-                           FindOptions);
+  static Range* FindRangeOfString(Document&,
+                                  const String& target,
+                                  const EphemeralRange& reference_range,
+                                  FindOptions);
+  static Range* FindRangeOfString(
+      Document&,
+      const String& target,
+      const EphemeralRangeInFlatTree& reference_range,
+      FindOptions);
 
   const VisibleSelection& Mark() const;  // Mark, to be used as emacs uses it.
   bool MarkIsDirectional() const;
diff --git a/third_party/WebKit/Source/core/editing/LocalCaretRectTest.cpp b/third_party/WebKit/Source/core/editing/LocalCaretRectTest.cpp
index a767b2b..989e7fe 100644
--- a/third_party/WebKit/Source/core/editing/LocalCaretRectTest.cpp
+++ b/third_party/WebKit/Source/core/editing/LocalCaretRectTest.cpp
@@ -854,4 +854,71 @@
   EXPECT_FALSE(rect.IsEmpty());
 }
 
+static std::pair<LayoutRect, LayoutRect> GetLayoutRects(const Position& caret) {
+  const PositionWithAffinity position(caret);
+  const LayoutRect& position_rect = LocalCaretRectOfPosition(position).rect;
+  const PositionWithAffinity visible_position(
+      CreateVisiblePosition(position).DeepEquivalent());
+  const LayoutRect& visible_position_rect =
+      LocalCaretRectOfPosition(visible_position).rect;
+  return {position_rect, visible_position_rect};
+}
+
+TEST_P(ParameterizedLocalCaretRectTest, AfterLineBreakInPreBlockLTRLineLTR) {
+  LoadAhem();
+  InsertStyleElement("pre{ font: 10px/10px Ahem; width: 300px }");
+  const Position& caret =
+      SetCaretTextToBody("<pre dir='ltr'>foo\n|<bdo dir='ltr'>abc</bdo></pre>");
+  LayoutRect position_rect, visible_position_rect;
+  std::tie(position_rect, visible_position_rect) = GetLayoutRects(caret);
+  EXPECT_EQ(
+      LayoutNGEnabled() ? LayoutRect(30, 0, 1, 10) : LayoutRect(0, 0, 0, 0),
+      position_rect);
+  EXPECT_EQ(LayoutRect(0, 10, 1, 10), visible_position_rect);
+};
+
+TEST_P(ParameterizedLocalCaretRectTest, AfterLineBreakInPreBlockLTRLineRTL) {
+  LoadAhem();
+  InsertStyleElement("pre{ font: 10px/10px Ahem; width: 300px }");
+  const Position& caret =
+      SetCaretTextToBody("<pre dir='ltr'>foo\n|<bdo dir='rtl'>abc</bdo></pre>");
+  LayoutRect position_rect, visible_position_rect;
+  std::tie(position_rect, visible_position_rect) = GetLayoutRects(caret);
+  // TODO(xiaochengh): Should return the same result for legacy and LayoutNG.
+  EXPECT_EQ(
+      LayoutNGEnabled() ? LayoutRect(30, 0, 1, 10) : LayoutRect(0, 0, 0, 0),
+      position_rect);
+  EXPECT_EQ(
+      LayoutNGEnabled() ? LayoutRect(30, 10, 1, 10) : LayoutRect(0, 10, 1, 10),
+      visible_position_rect);
+};
+
+TEST_P(ParameterizedLocalCaretRectTest, AfterLineBreakInPreBlockRTLLineLTR) {
+  LoadAhem();
+  InsertStyleElement("pre{ font: 10px/10px Ahem; width: 300px }");
+  const Position& caret =
+      SetCaretTextToBody("<pre dir='rtl'>foo\n|<bdo dir='ltr'>abc</bdo></pre>");
+  LayoutRect position_rect, visible_position_rect;
+  std::tie(position_rect, visible_position_rect) = GetLayoutRects(caret);
+  EXPECT_EQ(
+      LayoutNGEnabled() ? LayoutRect(270, 0, 1, 10) : LayoutRect(0, 0, 0, 0),
+      position_rect);
+  // TODO(xiaochengh): Should return the same result for legacy and LayoutNG.
+  EXPECT_EQ(LayoutNGEnabled() ? LayoutRect(270, 10, 1, 10)
+                              : LayoutRect(299, 10, 1, 10),
+            visible_position_rect);
+};
+
+TEST_P(ParameterizedLocalCaretRectTest, AfterLineBreakInPreBlockRTLLineRTL) {
+  LoadAhem();
+  InsertStyleElement("pre{ font: 10px/10px Ahem; width: 300px }");
+  const Position& caret =
+      SetCaretTextToBody("<pre dir='rtl'>foo\n|<bdo dir='rtl'>abc</bdo></pre>");
+  LayoutRect position_rect, visible_position_rect;
+  std::tie(position_rect, visible_position_rect) = GetLayoutRects(caret);
+  EXPECT_EQ(
+      LayoutNGEnabled() ? LayoutRect(270, 0, 1, 10) : LayoutRect(0, 0, 0, 0),
+      position_rect);
+  EXPECT_EQ(LayoutRect(299, 10, 1, 10), visible_position_rect);
+};
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/editing/WritingDirection.h b/third_party/WebKit/Source/core/editing/WritingDirection.h
index 612b8bd..a5c7be3 100644
--- a/third_party/WebKit/Source/core/editing/WritingDirection.h
+++ b/third_party/WebKit/Source/core/editing/WritingDirection.h
@@ -26,10 +26,10 @@
 #ifndef WritingDirection_h
 #define WritingDirection_h
 
-enum WritingDirection {
-  NaturalWritingDirection,
-  LeftToRightWritingDirection,
-  RightToLeftWritingDirection
-};
+namespace blink {
+
+enum class WritingDirection { kNatural, kLeftToRight, kRightToLeft };
+
+}  // namespace blink
 
 #endif
diff --git a/third_party/WebKit/Source/core/editing/commands/ApplyStyleCommand.cpp b/third_party/WebKit/Source/core/editing/commands/ApplyStyleCommand.cpp
index a8881d98..f9327bb 100644
--- a/third_party/WebKit/Source/core/editing/commands/ApplyStyleCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/ApplyStyleCommand.cpp
@@ -44,6 +44,7 @@
 #include "core/editing/VisiblePosition.h"
 #include "core/editing/VisibleSelection.h"
 #include "core/editing/VisibleUnits.h"
+#include "core/editing/WritingDirection.h"
 #include "core/editing/commands/EditingCommandsUtilities.h"
 #include "core/editing/iterators/TextIterator.h"
 #include "core/editing/serializers/HTMLInterchange.h"
@@ -594,7 +595,7 @@
   HTMLElement* unsplit_ancestor = nullptr;
 
   WritingDirection highest_ancestor_direction;
-  if (allowed_direction != NaturalWritingDirection &&
+  if (allowed_direction != WritingDirection::kNatural &&
       highest_ancestor_unicode_bidi != CSSValueBidiOverride &&
       highest_ancestor_with_unicode_bidi->IsHTMLElement() &&
       EditingStyle::Create(highest_ancestor_with_unicode_bidi,
@@ -740,7 +741,7 @@
   // selection and prevent us from adding redundant ones, as described in:
   // <rdar://problem/3724344> Bolding and unbolding creates extraneous tags
   Position remove_start = MostBackwardCaretPosition(start);
-  WritingDirection text_direction = NaturalWritingDirection;
+  WritingDirection text_direction = WritingDirection::kNatural;
   bool has_text_direction = style->GetTextDirection(text_direction);
   EditingStyle* style_without_embedding = nullptr;
   EditingStyle* embedding_style = nullptr;
diff --git a/third_party/WebKit/Source/core/editing/commands/ApplyStyleCommand.h b/third_party/WebKit/Source/core/editing/commands/ApplyStyleCommand.h
index fa6296f..9100a65 100644
--- a/third_party/WebKit/Source/core/editing/commands/ApplyStyleCommand.h
+++ b/third_party/WebKit/Source/core/editing/commands/ApplyStyleCommand.h
@@ -26,7 +26,6 @@
 #ifndef ApplyStyleCommand_h
 #define ApplyStyleCommand_h
 
-#include "core/editing/WritingDirection.h"
 #include "core/editing/commands/CompositeEditCommand.h"
 #include "core/html/HTMLElement.h"
 
@@ -38,6 +37,8 @@
 
 enum ShouldIncludeTypingStyle { kIncludeTypingStyle, kIgnoreTypingStyle };
 
+enum class WritingDirection;
+
 class CORE_EXPORT ApplyStyleCommand final : public CompositeEditCommand {
  public:
   enum EPropertyLevel { kPropertyDefault, kForceBlockProperties };
diff --git a/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp b/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp
index 2ac748f..6ab44ac 100644
--- a/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp
@@ -46,6 +46,7 @@
 #include "core/editing/SelectionTemplate.h"
 #include "core/editing/SetSelectionOptions.h"
 #include "core/editing/VisiblePosition.h"
+#include "core/editing/WritingDirection.h"
 #include "core/editing/commands/ApplyStyleCommand.h"
 #include "core/editing/commands/ClipboardCommands.h"
 #include "core/editing/commands/CreateLinkCommand.h"
@@ -533,13 +534,13 @@
   has_nested_or_multiple_embeddings = true;
 
   if (selection.IsNone())
-    return NaturalWritingDirection;
+    return WritingDirection::kNatural;
 
   Position position = MostForwardCaretPosition(selection.Start());
 
   Node* node = position.AnchorNode();
   if (!node)
-    return NaturalWritingDirection;
+    return WritingDirection::kNatural;
 
   Position end;
   if (selection.IsRange()) {
@@ -562,7 +563,7 @@
       CSSValueID unicode_bidi_value =
           ToCSSIdentifierValue(unicode_bidi)->GetValueID();
       if (IsUnicodeBidiNestedOrMultipleEmbeddings(unicode_bidi_value))
-        return NaturalWritingDirection;
+        return WritingDirection::kNatural;
     }
   }
 
@@ -579,7 +580,7 @@
   // The selection is either a caret with no typing attributes or a range in
   // which no embedding is added, so just use the start position to decide.
   Node* block = EnclosingBlock(node);
-  WritingDirection found_direction = NaturalWritingDirection;
+  WritingDirection found_direction = WritingDirection::kNatural;
 
   for (Node& runner : NodeTraversal::InclusiveAncestorsOf(*node)) {
     if (runner == block)
@@ -601,7 +602,7 @@
       continue;
 
     if (unicode_bidi_value == CSSValueBidiOverride)
-      return NaturalWritingDirection;
+      return WritingDirection::kNatural;
 
     DCHECK(EditingStyleUtilities::IsEmbedOrIsolate(unicode_bidi_value))
         << unicode_bidi_value;
@@ -614,17 +615,17 @@
     if (direction_value != CSSValueLtr && direction_value != CSSValueRtl)
       continue;
 
-    if (found_direction != NaturalWritingDirection)
-      return NaturalWritingDirection;
+    if (found_direction != WritingDirection::kNatural)
+      return WritingDirection::kNatural;
 
     // In the range case, make sure that the embedding element persists until
     // the end of the range.
     if (selection.IsRange() && !end.AnchorNode()->IsDescendantOf(element))
-      return NaturalWritingDirection;
+      return WritingDirection::kNatural;
 
     found_direction = direction_value == CSSValueLtr
-                          ? LeftToRightWritingDirection
-                          : RightToLeftWritingDirection;
+                          ? WritingDirection::kLeftToRight
+                          : WritingDirection::kRightToLeft;
   }
   has_nested_or_multiple_embeddings = false;
   return found_direction;
@@ -926,7 +927,7 @@
                               Event*,
                               EditorCommandSource,
                               const String& value) {
-  return frame.GetEditor().FindString(value, kCaseInsensitive | kWrapAround);
+  return Editor::FindString(frame, value, kCaseInsensitive | kWrapAround);
 }
 
 bool StyleCommands::ExecuteFontName(LocalFrame& frame,
@@ -1715,19 +1716,19 @@
 EditingTriState StyleCommands::StateTextWritingDirectionLeftToRight(
     LocalFrame& frame,
     Event*) {
-  return StateTextWritingDirection(frame, LeftToRightWritingDirection);
+  return StateTextWritingDirection(frame, WritingDirection::kLeftToRight);
 }
 
 EditingTriState StyleCommands::StateTextWritingDirectionNatural(
     LocalFrame& frame,
     Event*) {
-  return StateTextWritingDirection(frame, NaturalWritingDirection);
+  return StateTextWritingDirection(frame, WritingDirection::kNatural);
 }
 
 EditingTriState StyleCommands::StateTextWritingDirectionRightToLeft(
     LocalFrame& frame,
     Event*) {
-  return StateTextWritingDirection(frame, RightToLeftWritingDirection);
+  return StateTextWritingDirection(frame, WritingDirection::kRightToLeft);
 }
 
 EditingTriState StyleCommands::StateUnderline(LocalFrame& frame, Event*) {
diff --git a/third_party/WebKit/Source/core/editing/commands/StyleCommands.h b/third_party/WebKit/Source/core/editing/commands/StyleCommands.h
index 07a6838f..97dcafd2 100644
--- a/third_party/WebKit/Source/core/editing/commands/StyleCommands.h
+++ b/third_party/WebKit/Source/core/editing/commands/StyleCommands.h
@@ -32,7 +32,6 @@
 #ifndef StyleCommands_h
 #define StyleCommands_h
 
-#include "core/editing/WritingDirection.h"
 #include "core/events/InputEvent.h"
 #include "platform/wtf/Allocator.h"
 #include "platform/wtf/Forward.h"
@@ -47,6 +46,7 @@
 
 enum class EditingTriState;
 enum class EditorCommandSource;
+enum class WritingDirection;
 
 // This class provides static functions about commands related to style.
 class StyleCommands {
diff --git a/third_party/WebKit/Source/core/editing/finder/TextFinder.cpp b/third_party/WebKit/Source/core/editing/finder/TextFinder.cpp
index a2e23708..47b42a3 100644
--- a/third_party/WebKit/Source/core/editing/finder/TextFinder.cpp
+++ b/third_party/WebKit/Source/core/editing/finder/TextFinder.cpp
@@ -159,8 +159,9 @@
       (options.medial_capital_as_word_start ? kTreatMedialCapitalAsWordStart
                                             : 0) |
       (options.find_next ? 0 : kStartInSelection);
-  active_match_ = OwnerFrame().GetFrame()->GetEditor().FindRangeOfString(
-      search_text, EphemeralRangeInFlatTree(active_match_.Get()), find_options);
+  active_match_ = Editor::FindRangeOfString(
+      *OwnerFrame().GetFrame()->GetDocument(), search_text,
+      EphemeralRangeInFlatTree(active_match_.Get()), find_options);
 
   if (!active_match_) {
     // If we're finding next the next active match might not be in the current
diff --git a/third_party/WebKit/Source/core/exported/WebRemoteFrameImpl.cpp b/third_party/WebKit/Source/core/exported/WebRemoteFrameImpl.cpp
index 8bd852f..61aa930 100644
--- a/third_party/WebKit/Source/core/exported/WebRemoteFrameImpl.cpp
+++ b/third_party/WebKit/Source/core/exported/WebRemoteFrameImpl.cpp
@@ -293,11 +293,6 @@
 
 void WebRemoteFrameImpl::DidStopLoading() {
   GetFrame()->SetIsLoading(false);
-  if (Parent() && Parent()->IsWebLocalFrame()) {
-    WebLocalFrameImpl* parent_frame =
-        ToWebLocalFrameImpl(Parent()->ToWebLocalFrame());
-    parent_frame->GetFrame()->GetDocument()->CheckCompleted();
-  }
 }
 
 bool WebRemoteFrameImpl::IsIgnoredForHitTest() const {
diff --git a/third_party/WebKit/Source/core/frame/BUILD.gn b/third_party/WebKit/Source/core/frame/BUILD.gn
index a5f1b66..07aa6c10 100644
--- a/third_party/WebKit/Source/core/frame/BUILD.gn
+++ b/third_party/WebKit/Source/core/frame/BUILD.gn
@@ -128,6 +128,8 @@
     "RootFrameViewport.h",
     "RotationViewportAnchor.cpp",
     "RotationViewportAnchor.h",
+    "SandboxFlags.cpp",
+    "SandboxFlags.h",
     "Screen.cpp",
     "Screen.h",
     "ScreenOrientationController.cpp",
diff --git a/third_party/WebKit/Source/core/frame/Frame.h b/third_party/WebKit/Source/core/frame/Frame.h
index b0bfe04fc5..7a8fc7b 100644
--- a/third_party/WebKit/Source/core/frame/Frame.h
+++ b/third_party/WebKit/Source/core/frame/Frame.h
@@ -133,6 +133,10 @@
   void SetIsLoading(bool is_loading) { is_loading_ = is_loading; }
   bool IsLoading() const { return is_loading_; }
 
+  // Tells the frame to check whether its load has completed, based on the state
+  // of its subframes, etc.
+  virtual void CheckCompleted() = 0;
+
   WindowProxyManager* GetWindowProxyManager() const {
     return window_proxy_manager_;
   }
diff --git a/third_party/WebKit/Source/core/frame/FrameOwner.h b/third_party/WebKit/Source/core/frame/FrameOwner.h
index 88a798d3..cfabaae 100644
--- a/third_party/WebKit/Source/core/frame/FrameOwner.h
+++ b/third_party/WebKit/Source/core/frame/FrameOwner.h
@@ -6,7 +6,7 @@
 #define FrameOwner_h
 
 #include "core/CoreExport.h"
-#include "core/dom/SandboxFlags.h"
+#include "core/frame/SandboxFlags.h"
 #include "platform/heap/Handle.h"
 #include "platform/scroll/ScrollTypes.h"
 #include "third_party/WebKit/public/common/feature_policy/feature_policy.h"
diff --git a/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp b/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
index dc09847..6db3e1a 100644
--- a/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
+++ b/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
@@ -44,7 +44,6 @@
 #include "core/dom/ComputedAccessibleNode.h"
 #include "core/dom/DOMImplementation.h"
 #include "core/dom/FrameRequestCallbackCollection.h"
-#include "core/dom/SandboxFlags.h"
 #include "core/dom/ScriptedIdleTaskController.h"
 #include "core/dom/SinkDocument.h"
 #include "core/dom/UserGestureIndicator.h"
@@ -67,6 +66,7 @@
 #include "core/frame/LocalFrameView.h"
 #include "core/frame/Navigator.h"
 #include "core/frame/PausableTimer.h"
+#include "core/frame/SandboxFlags.h"
 #include "core/frame/Screen.h"
 #include "core/frame/ScrollToOptions.h"
 #include "core/frame/Settings.h"
@@ -902,7 +902,7 @@
   FindOptions options =
       (backwards ? kBackwards : 0) | (case_sensitive ? 0 : kCaseInsensitive) |
       (wrap ? kWrapAround : 0) | (whole_word ? kWholeWord | kAtWordStarts : 0);
-  return GetFrame()->GetEditor().FindString(string, options);
+  return Editor::FindString(*GetFrame(), string, options);
 }
 
 bool LocalDOMWindow::offscreenBuffering() const {
diff --git a/third_party/WebKit/Source/core/frame/LocalFrame.cpp b/third_party/WebKit/Source/core/frame/LocalFrame.cpp
index 6550410..af0e28f 100644
--- a/third_party/WebKit/Source/core/frame/LocalFrame.cpp
+++ b/third_party/WebKit/Source/core/frame/LocalFrame.cpp
@@ -407,6 +407,10 @@
   return Loader().PrepareForCommit();
 }
 
+void LocalFrame::CheckCompleted() {
+  GetDocument()->CheckCompleted();
+}
+
 SecurityContext* LocalFrame::GetSecurityContext() const {
   return GetDocument();
 }
diff --git a/third_party/WebKit/Source/core/frame/LocalFrame.h b/third_party/WebKit/Source/core/frame/LocalFrame.h
index b20045b..644c0ac9 100644
--- a/third_party/WebKit/Source/core/frame/LocalFrame.h
+++ b/third_party/WebKit/Source/core/frame/LocalFrame.h
@@ -123,6 +123,7 @@
   void PrintNavigationErrorMessage(const Frame&, const char* reason);
   void PrintNavigationWarning(const String&);
   bool PrepareForCommit() override;
+  void CheckCompleted() override;
   void DidChangeVisibilityState() override;
   void DidFreeze() override;
   void DidResume() override;
diff --git a/third_party/WebKit/Source/core/frame/RemoteFrame.cpp b/third_party/WebKit/Source/core/frame/RemoteFrame.cpp
index 49e59f4..bc288b7 100644
--- a/third_party/WebKit/Source/core/frame/RemoteFrame.cpp
+++ b/third_party/WebKit/Source/core/frame/RemoteFrame.cpp
@@ -113,6 +113,11 @@
   return !!GetPage();
 }
 
+void RemoteFrame::CheckCompleted() {
+  // Notify the client so that the corresponding LocalFrame can do the check.
+  Client()->CheckCompleted();
+}
+
 RemoteSecurityContext* RemoteFrame::GetSecurityContext() const {
   return security_context_.Get();
 }
diff --git a/third_party/WebKit/Source/core/frame/RemoteFrame.h b/third_party/WebKit/Source/core/frame/RemoteFrame.h
index f9de372..ea60964 100644
--- a/third_party/WebKit/Source/core/frame/RemoteFrame.h
+++ b/third_party/WebKit/Source/core/frame/RemoteFrame.h
@@ -35,6 +35,7 @@
   void Detach(FrameDetachType) override;
   RemoteSecurityContext* GetSecurityContext() const override;
   bool PrepareForCommit() override;
+  void CheckCompleted() override;
   bool ShouldClose() override;
   void DidFreeze() override;
   void DidResume() override;
diff --git a/third_party/WebKit/Source/core/frame/RemoteFrameClient.h b/third_party/WebKit/Source/core/frame/RemoteFrameClient.h
index b614311..d94e30a 100644
--- a/third_party/WebKit/Source/core/frame/RemoteFrameClient.h
+++ b/third_party/WebKit/Source/core/frame/RemoteFrameClient.h
@@ -28,6 +28,10 @@
   virtual void Reload(FrameLoadType, ClientRedirectPolicy) = 0;
   virtual unsigned BackForwardLength() = 0;
 
+  // Notifies the remote frame to check whether it is done loading, after one
+  // of its children finishes loading.
+  virtual void CheckCompleted() = 0;
+
   // Forwards a postMessage for a remote frame.
   virtual void ForwardPostMessage(MessageEvent*,
                                   scoped_refptr<const SecurityOrigin> target,
diff --git a/third_party/WebKit/Source/core/frame/RemoteFrameClientImpl.cpp b/third_party/WebKit/Source/core/frame/RemoteFrameClientImpl.cpp
index cc7d363..d224b40 100644
--- a/third_party/WebKit/Source/core/frame/RemoteFrameClientImpl.cpp
+++ b/third_party/WebKit/Source/core/frame/RemoteFrameClientImpl.cpp
@@ -134,6 +134,10 @@
   return 2;
 }
 
+void RemoteFrameClientImpl::CheckCompleted() {
+  web_frame_->Client()->CheckCompleted();
+}
+
 void RemoteFrameClientImpl::ForwardPostMessage(
     MessageEvent* event,
     scoped_refptr<const SecurityOrigin> target,
diff --git a/third_party/WebKit/Source/core/frame/RemoteFrameClientImpl.h b/third_party/WebKit/Source/core/frame/RemoteFrameClientImpl.h
index b1581b4..703627b 100644
--- a/third_party/WebKit/Source/core/frame/RemoteFrameClientImpl.h
+++ b/third_party/WebKit/Source/core/frame/RemoteFrameClientImpl.h
@@ -33,6 +33,7 @@
                 bool should_replace_current_entry) override;
   void Reload(FrameLoadType, ClientRedirectPolicy) override;
   unsigned BackForwardLength() override;
+  void CheckCompleted() override;
   void ForwardPostMessage(MessageEvent*,
                           scoped_refptr<const SecurityOrigin> target,
                           LocalFrame* source) const override;
diff --git a/third_party/WebKit/Source/core/dom/SandboxFlags.cpp b/third_party/WebKit/Source/core/frame/SandboxFlags.cpp
similarity index 99%
rename from third_party/WebKit/Source/core/dom/SandboxFlags.cpp
rename to third_party/WebKit/Source/core/frame/SandboxFlags.cpp
index bef8141..0119779c 100644
--- a/third_party/WebKit/Source/core/dom/SandboxFlags.cpp
+++ b/third_party/WebKit/Source/core/frame/SandboxFlags.cpp
@@ -24,7 +24,7 @@
  *
  */
 
-#include "core/dom/SandboxFlags.h"
+#include "core/frame/SandboxFlags.h"
 
 #include "core/html/HTMLIFrameElement.h"
 #include "core/html/parser/HTMLParserIdioms.h"
diff --git a/third_party/WebKit/Source/core/dom/SandboxFlags.h b/third_party/WebKit/Source/core/frame/SandboxFlags.h
similarity index 100%
rename from third_party/WebKit/Source/core/dom/SandboxFlags.h
rename to third_party/WebKit/Source/core/frame/SandboxFlags.h
diff --git a/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.cpp b/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.cpp
index 759f8a9..d550e49 100644
--- a/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.cpp
+++ b/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.cpp
@@ -117,6 +117,7 @@
 #include "core/editing/SetSelectionOptions.h"
 #include "core/editing/TextAffinity.h"
 #include "core/editing/VisiblePosition.h"
+#include "core/editing/WritingDirection.h"
 #include "core/editing/finder/FindInPageCoordinates.h"
 #include "core/editing/finder/TextFinder.h"
 #include "core/editing/ime/ImeTextSpanVectorBuilder.h"
@@ -938,6 +939,10 @@
        base::UnguessableToken::Create());
 }
 
+void WebLocalFrameImpl::CheckCompleted() {
+  GetFrame()->GetDocument()->CheckCompleted();
+}
+
 void WebLocalFrameImpl::LoadHTMLString(const WebData& data,
                                        const WebURL& base_url,
                                        const WebURL& unreachable_url,
@@ -1156,15 +1161,15 @@
 
   switch (direction) {
     case kWebTextDirectionDefault:
-      editor.SetBaseWritingDirection(NaturalWritingDirection);
+      editor.SetBaseWritingDirection(WritingDirection::kNatural);
       break;
 
     case kWebTextDirectionLeftToRight:
-      editor.SetBaseWritingDirection(LeftToRightWritingDirection);
+      editor.SetBaseWritingDirection(WritingDirection::kLeftToRight);
       break;
 
     case kWebTextDirectionRightToLeft:
-      editor.SetBaseWritingDirection(RightToLeftWritingDirection);
+      editor.SetBaseWritingDirection(WritingDirection::kRightToLeft);
       break;
 
     default:
diff --git a/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.h b/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.h
index cc5718a..ac48d337 100644
--- a/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.h
+++ b/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.h
@@ -152,6 +152,7 @@
   void ReloadImage(const WebNode&) override;
   void ReloadLoFiImages() override;
   void LoadRequest(const WebURLRequest&) override;
+  void CheckCompleted() override;
   void LoadHTMLString(const WebData& html,
                       const WebURL& base_url,
                       const WebURL& unreachable_url,
diff --git a/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.cpp b/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.cpp
index 399146c..32125f2 100644
--- a/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.cpp
+++ b/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.cpp
@@ -31,7 +31,6 @@
 #include "core/dom/DOMStringList.h"
 #include "core/dom/Document.h"
 #include "core/dom/Element.h"
-#include "core/dom/SandboxFlags.h"
 #include "core/dom/events/EventQueue.h"
 #include "core/events/SecurityPolicyViolationEvent.h"
 #include "core/frame/FrameClient.h"
@@ -39,6 +38,7 @@
 #include "core/frame/LocalFrame.h"
 #include "core/frame/LocalFrameClient.h"
 #include "core/frame/Location.h"
+#include "core/frame/SandboxFlags.h"
 #include "core/frame/UseCounter.h"
 #include "core/frame/csp/CSPDirectiveList.h"
 #include "core/frame/csp/CSPSource.h"
diff --git a/third_party/WebKit/Source/core/html/HTMLSlotElement.cpp b/third_party/WebKit/Source/core/html/HTMLSlotElement.cpp
index e1337d0..cca6437 100644
--- a/third_party/WebKit/Source/core/html/HTMLSlotElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLSlotElement.cpp
@@ -248,13 +248,7 @@
     flat_tree_children_ = assigned_nodes_;
   }
 
-  // Tentative naive version.
-  // TODO(hayato): Optimize this, as we do in
-  // |LazyReattachDistributedNodesIfNeeded|.
-  for (auto& node : old_flat_tree_children)
-    node->LazyReattachIfAttached();
-  for (auto& node : flat_tree_children_)
-    node->LazyReattachIfAttached();
+  LazyReattachNodesIfNeeded(old_flat_tree_children, flat_tree_children_);
 }
 
 void HTMLSlotElement::ClearDistribution() {
@@ -502,7 +496,7 @@
   }
 }
 
-void HTMLSlotElement::LazyReattachDistributedNodesByDynamicProgramming(
+void HTMLSlotElement::LazyReattachNodesByDynamicProgramming(
     const HeapVector<Member<Node>>& nodes1,
     const HeapVector<Member<Node>>& nodes2) {
   // Use dynamic programming to minimize the number of nodes being reattached.
@@ -542,20 +536,27 @@
 }
 
 void HTMLSlotElement::LazyReattachDistributedNodesIfNeeded() {
-  if (old_distributed_nodes_ == distributed_nodes_)
-    return;
+  // TODO(hayato): Move this probe to a better place.
   probe::didPerformSlotDistribution(this);
 
-  if (old_distributed_nodes_.size() + 1 > kLCSTableSizeLimit ||
-      distributed_nodes_.size() + 1 > kLCSTableSizeLimit) {
+  LazyReattachNodesIfNeeded(old_distributed_nodes_, distributed_nodes_);
+  old_distributed_nodes_.clear();
+}
+
+void HTMLSlotElement::LazyReattachNodesIfNeeded(
+    const HeapVector<Member<Node>>& nodes1,
+    const HeapVector<Member<Node>>& nodes2) {
+  if (nodes1 == nodes2)
+    return;
+
+  if (nodes1.size() + 1 > kLCSTableSizeLimit ||
+      nodes2.size() + 1 > kLCSTableSizeLimit) {
     // Since DP takes O(N^2), we don't use DP if the size is larger than the
     // pre-defined limit.
-    LazyReattachDistributedNodesNaive();
+    LazyReattachNodesNaive(nodes1, nodes2);
   } else {
-    LazyReattachDistributedNodesByDynamicProgramming(old_distributed_nodes_,
-                                                     distributed_nodes_);
+    LazyReattachNodesByDynamicProgramming(nodes1, nodes2);
   }
-  old_distributed_nodes_.clear();
 }
 
 void HTMLSlotElement::DidSlotChangeAfterRemovedFromShadowTree() {
@@ -571,11 +572,13 @@
   CheckSlotChange(SlotChangeType::kSuppressSlotChangeEvent);
 }
 
-void HTMLSlotElement::LazyReattachDistributedNodesNaive() {
+void HTMLSlotElement::LazyReattachNodesNaive(
+    const HeapVector<Member<Node>>& nodes1,
+    const HeapVector<Member<Node>>& nodes2) {
   // TODO(hayato): Use some heuristic to avoid reattaching all nodes
-  for (auto& node : old_distributed_nodes_)
+  for (auto& node : nodes1)
     node->LazyReattachIfAttached();
-  for (auto& node : distributed_nodes_)
+  for (auto& node : nodes2)
     node->LazyReattachIfAttached();
 }
 
diff --git a/third_party/WebKit/Source/core/html/HTMLSlotElement.h b/third_party/WebKit/Source/core/html/HTMLSlotElement.h
index e2c3b73..b8b62fd 100644
--- a/third_party/WebKit/Source/core/html/HTMLSlotElement.h
+++ b/third_party/WebKit/Source/core/html/HTMLSlotElement.h
@@ -148,11 +148,13 @@
 
   const HeapVector<Member<Node>>& ChildrenInFlatTreeIfAssignmentIsSupported();
 
-  void LazyReattachDistributedNodesNaive();
-
-  static void LazyReattachDistributedNodesByDynamicProgramming(
-      const HeapVector<Member<Node>>&,
-      const HeapVector<Member<Node>>&);
+  static void LazyReattachNodesIfNeeded(const HeapVector<Member<Node>>& nodes1,
+                                        const HeapVector<Member<Node>>& nodes2);
+  static void LazyReattachNodesNaive(const HeapVector<Member<Node>>& nodes1,
+                                     const HeapVector<Member<Node>>& nodes2);
+  static void LazyReattachNodesByDynamicProgramming(
+      const HeapVector<Member<Node>>& nodes1,
+      const HeapVector<Member<Node>>& nodes2);
 
   void SetNeedsDistributionRecalcWillBeSetNeedsAssignmentRecalc();
 
diff --git a/third_party/WebKit/Source/core/loader/EmptyClients.h b/third_party/WebKit/Source/core/loader/EmptyClients.h
index b2e26a7..37e2da7 100644
--- a/third_party/WebKit/Source/core/loader/EmptyClients.h
+++ b/third_party/WebKit/Source/core/loader/EmptyClients.h
@@ -410,6 +410,7 @@
                 bool should_replace_current_entry) override {}
   void Reload(FrameLoadType, ClientRedirectPolicy) override {}
   unsigned BackForwardLength() override { return 0; }
+  void CheckCompleted() override {}
   void ForwardPostMessage(MessageEvent*,
                           scoped_refptr<const SecurityOrigin> target,
                           LocalFrame* source_frame) const override {}
diff --git a/third_party/WebKit/Source/core/loader/FrameLoader.cpp b/third_party/WebKit/Source/core/loader/FrameLoader.cpp
index 5e936b8..3f556b9 100644
--- a/third_party/WebKit/Source/core/loader/FrameLoader.cpp
+++ b/third_party/WebKit/Source/core/loader/FrameLoader.cpp
@@ -513,8 +513,8 @@
   }
 
   Frame* parent = frame_->Tree().Parent();
-  if (parent && parent->IsLocalFrame())
-    ToLocalFrame(parent)->GetDocument()->CheckCompleted();
+  if (parent)
+    parent->CheckCompleted();
 }
 
 Frame* FrameLoader::Opener() {
diff --git a/third_party/WebKit/Source/core/loader/FrameLoader.h b/third_party/WebKit/Source/core/loader/FrameLoader.h
index c1cade1..607e193 100644
--- a/third_party/WebKit/Source/core/loader/FrameLoader.h
+++ b/third_party/WebKit/Source/core/loader/FrameLoader.h
@@ -36,9 +36,9 @@
 #include "base/macros.h"
 #include "core/CoreExport.h"
 #include "core/dom/IconURL.h"
-#include "core/dom/SandboxFlags.h"
 #include "core/dom/SecurityContext.h"
 #include "core/frame/FrameTypes.h"
+#include "core/frame/SandboxFlags.h"
 #include "core/loader/FrameLoaderStateMachine.h"
 #include "core/loader/FrameLoaderTypes.h"
 #include "core/loader/HistoryItem.h"
diff --git a/third_party/WebKit/Source/core/page/ChromeClient.h b/third_party/WebKit/Source/core/page/ChromeClient.h
index 6d072df..1b59c3d 100644
--- a/third_party/WebKit/Source/core/page/ChromeClient.h
+++ b/third_party/WebKit/Source/core/page/ChromeClient.h
@@ -28,7 +28,7 @@
 #include "core/CoreExport.h"
 #include "core/dom/AXObjectCache.h"
 #include "core/dom/AnimationWorkletProxyClient.h"
-#include "core/dom/SandboxFlags.h"
+#include "core/frame/SandboxFlags.h"
 #include "core/html/forms/PopupMenu.h"
 #include "core/inspector/ConsoleTypes.h"
 #include "core/loader/FrameLoader.h"
diff --git a/third_party/WebKit/Source/core/script/ClassicPendingScript.cpp b/third_party/WebKit/Source/core/script/ClassicPendingScript.cpp
index 2d03f6d..292d3b3 100644
--- a/third_party/WebKit/Source/core/script/ClassicPendingScript.cpp
+++ b/third_party/WebKit/Source/core/script/ClassicPendingScript.cpp
@@ -42,7 +42,7 @@
   pending_script->intervened_ =
       MaybeDisallowFetchForDocWrittenScript(params, element_document);
 
-  // https://html.spec.whatwg.org/#fetch-a-classic-script
+  // https://html.spec.whatwg.org/multipage/webappapis.html#fetch-a-classic-script
   // Step 2. Set request's client to settings object. [spec text]
   //
   // Note: |element_document| corresponds to the settings object.
diff --git a/third_party/WebKit/Source/core/script/ClassicPendingScript.h b/third_party/WebKit/Source/core/script/ClassicPendingScript.h
index ec8c46f..3566e10 100644
--- a/third_party/WebKit/Source/core/script/ClassicPendingScript.h
+++ b/third_party/WebKit/Source/core/script/ClassicPendingScript.h
@@ -16,7 +16,7 @@
 namespace blink {
 
 // PendingScript for a classic script
-// https://html.spec.whatwg.org/#classic-script.
+// https://html.spec.whatwg.org/multipage/webappapis.html#classic-script.
 //
 // TODO(kochi): The comment below is from pre-oilpan age and may not be correct
 // now.
@@ -115,7 +115,7 @@
   const ScriptFetchOptions options_;
 
   // "base url" snapshot taken at #prepare-a-script timing.
-  // https://html.spec.whatwg.org/#prepare-a-script
+  // https://html.spec.whatwg.org/multipage/scripting.html#prepare-a-script
   // which will eventually be used as #concept-script-base-url.
   // https://html.spec.whatwg.org/multipage/webappapis.html#concept-script-base-url
   const KURL base_url_for_inline_script_;
diff --git a/third_party/WebKit/Source/core/script/HTMLParserScriptRunner.cpp b/third_party/WebKit/Source/core/script/HTMLParserScriptRunner.cpp
index cde66e3..bd7c4a7 100644
--- a/third_party/WebKit/Source/core/script/HTMLParserScriptRunner.cpp
+++ b/third_party/WebKit/Source/core/script/HTMLParserScriptRunner.cpp
@@ -190,9 +190,9 @@
 // This has two callers and corresponds to different concepts in the spec:
 // - When called from executeParsingBlockingScripts(), this corresponds to some
 //   steps of the "Otherwise" Clause of 'An end tag whose tag name is "script"'
-//   https://html.spec.whatwg.org/#scriptEndTag
+//   https://html.spec.whatwg.org/multipage/parsing.html#scriptEndTag
 // - When called from executeScriptsWaitingForParsing(), this corresponds
-//   https://html.spec.whatwg.org/#execute-the-script-block
+//   https://html.spec.whatwg.org/multipage/scripting.html#execute-the-script-block
 //   and thus currently this function does more than specced.
 // TODO(hiroshige): Make the spec and implementation consistent.
 void HTMLParserScriptRunner::ExecutePendingScriptAndDispatchEvent(
@@ -277,7 +277,7 @@
 }
 
 // 'An end tag whose tag name is "script"'
-// https://html.spec.whatwg.org/#scriptEndTag
+// https://html.spec.whatwg.org/multipage/parsing.html#scriptEndTag
 //
 // Script handling lives outside the tree builder to keep each class simple.
 void HTMLParserScriptRunner::ProcessScriptElement(
@@ -328,7 +328,7 @@
 }
 
 // The "Otherwise" Clause of 'An end tag whose tag name is "script"'
-// https://html.spec.whatwg.org/#scriptEndTag
+// https://html.spec.whatwg.org/multipage/parsing.html#scriptEndTag
 void HTMLParserScriptRunner::ExecuteParsingBlockingScripts() {
   // 3. "If (1) the parser's Document has a style sheet that is blocking scripts
   //     or (2) the script's "ready to be parser-executed" flag is not set:
@@ -380,7 +380,7 @@
   ExecuteParsingBlockingScripts();
 }
 
-// Step 3 of https://html.spec.whatwg.org/#the-end:
+// Step 3 of https://html.spec.whatwg.org/multipage/parsing.html#the-end:
 // "If the list of scripts that will execute when the document has
 //  finished parsing is not empty, run these substeps:"
 bool HTMLParserScriptRunner::ExecuteScriptsWaitingForParsing() {
@@ -426,7 +426,8 @@
   return true;
 }
 
-// 2nd Clause, Step 23 of https://html.spec.whatwg.org/#prepare-a-script
+// 2nd Clause, Step 23 of
+// https://html.spec.whatwg.org/multipage/scripting.html#prepare-a-script
 void HTMLParserScriptRunner::RequestParsingBlockingScript(
     ScriptLoader* script_loader) {
   // "The element is the pending parsing-blocking script of the Document of
@@ -449,7 +450,8 @@
   }
 }
 
-// 1st Clause, Step 23 of https://html.spec.whatwg.org/#prepare-a-script
+// 1st Clause, Step 23 of
+// https://html.spec.whatwg.org/multipage/scripting.html#prepare-a-script
 void HTMLParserScriptRunner::RequestDeferredScript(
     ScriptLoader* script_loader) {
   PendingScript* pending_script = script_loader->TakePendingScript();
@@ -470,7 +472,7 @@
 }
 
 // The initial steps for 'An end tag whose tag name is "script"'
-// https://html.spec.whatwg.org/#scriptEndTag
+// https://html.spec.whatwg.org/multipage/parsing.html#scriptEndTag
 void HTMLParserScriptRunner::ProcessScriptElementInternal(
     Element* script,
     const TextPosition& script_start_position) {
@@ -508,7 +510,8 @@
     //  reentrant invocation of the parser."
     script_loader->PrepareScript(script_start_position);
 
-    // A part of Step 23 of https://html.spec.whatwg.org/#prepare-a-script:
+    // A part of Step 23 of
+    // https://html.spec.whatwg.org/multipage/scripting.html#prepare-a-script:
     if (!script_loader->WillBeParserExecuted())
       return;
 
diff --git a/third_party/WebKit/Source/core/script/HTMLParserScriptRunner.h b/third_party/WebKit/Source/core/script/HTMLParserScriptRunner.h
index a47f4ed..faea9ae 100644
--- a/third_party/WebKit/Source/core/script/HTMLParserScriptRunner.h
+++ b/third_party/WebKit/Source/core/script/HTMLParserScriptRunner.h
@@ -48,7 +48,7 @@
 // HTMLParserScriptRunner is responsible for for arranging the execution of
 // script elements inserted by the parser, according to the rules for
 // 'An end tag whose tag name is "script"':
-// https://html.spec.whatwg.org/multipage/syntax.html#scriptEndTag
+// https://html.spec.whatwg.org/multipage/parsing.html#scriptEndTag
 //
 // If a script blocks parsing, this class is responsible for holding it, and
 // executing it when required.
@@ -135,10 +135,10 @@
   Member<Document> document_;
   Member<HTMLParserScriptRunnerHost> host_;
 
-  // https://html.spec.whatwg.org/#pending-parsing-blocking-script
+  // https://html.spec.whatwg.org/multipage/scripting.html#pending-parsing-blocking-script
   TraceWrapperMember<PendingScript> parser_blocking_script_;
 
-  // https://html.spec.whatwg.org/#list-of-scripts-that-will-execute-when-the-document-has-finished-parsing
+  // https://html.spec.whatwg.org/multipage/scripting.html#list-of-scripts-that-will-execute-when-the-document-has-finished-parsing
   HeapDeque<TraceWrapperMember<PendingScript>>
       scripts_to_execute_after_parsing_;
 
diff --git a/third_party/WebKit/Source/core/script/Modulator.h b/third_party/WebKit/Source/core/script/Modulator.h
index b17ac2a..6cc16bcc 100644
--- a/third_party/WebKit/Source/core/script/Modulator.h
+++ b/third_party/WebKit/Source/core/script/Modulator.h
@@ -70,7 +70,7 @@
 
 // A Modulator is an interface for "environment settings object" concept for
 // module scripts.
-// https://html.spec.whatwg.org/#environment-settings-object
+// https://html.spec.whatwg.org/multipage/webappapis.html#environment-settings-object
 //
 // A Modulator also serves as an entry point for various module spec algorithms.
 class CORE_EXPORT Modulator : public GarbageCollectedFinalized<Modulator>,
@@ -106,7 +106,7 @@
 
   // Asynchronously retrieve a module script from the module map, or fetch it
   // and put it in the map if it's not there already.
-  // https://html.spec.whatwg.org/#fetch-a-single-module-script
+  // https://html.spec.whatwg.org/multipage/webappapis.html#fetch-a-single-module-script
   virtual void FetchSingle(const ModuleScriptFetchRequest&,
                            ModuleGraphLevel,
                            SingleModuleClient*) = 0;
@@ -120,7 +120,7 @@
   // is still "fetching".
   virtual ModuleScript* GetFetchedModuleScript(const KURL&) = 0;
 
-  // https://html.spec.whatwg.org/#resolve-a-module-specifier
+  // https://html.spec.whatwg.org/multipage/webappapis.html#resolve-a-module-specifier
   static KURL ResolveModuleSpecifier(const String& module_request,
                                      const KURL& base_url,
                                      String* failure_reason = nullptr);
@@ -131,7 +131,7 @@
                                   const ReferrerScriptInfo&,
                                   ScriptPromiseResolver*) = 0;
 
-  // https://html.spec.whatwg.org/#hostgetimportmetaproperties
+  // https://html.spec.whatwg.org/multipage/webappapis.html#hostgetimportmetaproperties
   virtual ModuleImportMeta HostGetImportMetaProperties(ScriptModule) const = 0;
 
   virtual bool HasValidContext() = 0;
diff --git a/third_party/WebKit/Source/core/script/ModulatorImplBase.cpp b/third_party/WebKit/Source/core/script/ModulatorImplBase.cpp
index 14a00ec9..118691de 100644
--- a/third_party/WebKit/Source/core/script/ModulatorImplBase.cpp
+++ b/third_party/WebKit/Source/core/script/ModulatorImplBase.cpp
@@ -110,7 +110,7 @@
                                                referrer_info, resolver);
 }
 
-// https://html.spec.whatwg.org/#hostgetimportmetaproperties
+// https://html.spec.whatwg.org/multipage/webappapis.html#hostgetimportmetaproperties
 ModuleImportMeta ModulatorImplBase::HostGetImportMetaProperties(
     ScriptModule record) const {
   // 1. Let module script be moduleRecord.[[HostDefined]]. [spec text]
@@ -175,7 +175,7 @@
 ScriptValue ModulatorImplBase::ExecuteModule(
     const ModuleScript* module_script,
     CaptureEvalErrorFlag capture_error) {
-  // https://html.spec.whatwg.org/#run-a-module-script
+  // https://html.spec.whatwg.org/multipage/webappapis.html#run-a-module-script
 
   // Step 1. "If rethrow errors is not given, let it be false." [spec text]
 
diff --git a/third_party/WebKit/Source/core/script/ModulatorTest.cpp b/third_party/WebKit/Source/core/script/ModulatorTest.cpp
index a70f82e..80ed6058 100644
--- a/third_party/WebKit/Source/core/script/ModulatorTest.cpp
+++ b/third_party/WebKit/Source/core/script/ModulatorTest.cpp
@@ -12,7 +12,7 @@
 
 TEST(ModulatorTest, resolveModuleSpecifier) {
   // Taken from examples listed in
-  // https://html.spec.whatwg.org/#resolve-a-module-specifier
+  // https://html.spec.whatwg.org/multipage/webappapis.html#resolve-a-module-specifier
 
   // "The following are valid module specifiers according to the above
   // algorithm:"
diff --git a/third_party/WebKit/Source/core/script/ModuleImportMeta.h b/third_party/WebKit/Source/core/script/ModuleImportMeta.h
index 9b34b91..56961d8 100644
--- a/third_party/WebKit/Source/core/script/ModuleImportMeta.h
+++ b/third_party/WebKit/Source/core/script/ModuleImportMeta.h
@@ -11,7 +11,7 @@
 namespace blink {
 
 // Represents import.meta data structure, which is the return value of
-// https://html.spec.whatwg.org/#hostgetimportmetaproperties
+// https://html.spec.whatwg.org/multipage/webappapis.html#hostgetimportmetaproperties
 class CORE_EXPORT ModuleImportMeta final {
  public:
   explicit ModuleImportMeta(const String& url) : url_(url) {}
diff --git a/third_party/WebKit/Source/core/script/ModuleMap.cpp b/third_party/WebKit/Source/core/script/ModuleMap.cpp
index 973e77c..eeb9d93 100644
--- a/third_party/WebKit/Source/core/script/ModuleMap.cpp
+++ b/third_party/WebKit/Source/core/script/ModuleMap.cpp
@@ -116,7 +116,7 @@
 void ModuleMap::FetchSingleModuleScript(const ModuleScriptFetchRequest& request,
                                         ModuleGraphLevel level,
                                         SingleModuleClient* client) {
-  // https://html.spec.whatwg.org/#fetch-a-single-module-script
+  // https://html.spec.whatwg.org/multipage/webappapis.html#fetch-a-single-module-script
 
   // Step 1. "Let moduleMap be module map settings object's module map."
   // [spec text]
diff --git a/third_party/WebKit/Source/core/script/ModuleMap.h b/third_party/WebKit/Source/core/script/ModuleMap.h
index 00b2c17..5d5ae16 100644
--- a/third_party/WebKit/Source/core/script/ModuleMap.h
+++ b/third_party/WebKit/Source/core/script/ModuleMap.h
@@ -23,7 +23,7 @@
 enum class ModuleGraphLevel;
 
 // A ModuleMap implements "module map" spec.
-// https://html.spec.whatwg.org/#module-map
+// https://html.spec.whatwg.org/multipage/webappapis.html#module-map
 class CORE_EXPORT ModuleMap final : public GarbageCollected<ModuleMap>,
                                     public TraceWrapperBase {
   class Entry;
diff --git a/third_party/WebKit/Source/core/script/ModulePendingScript.h b/third_party/WebKit/Source/core/script/ModulePendingScript.h
index 55d11b3..91d9d86 100644
--- a/third_party/WebKit/Source/core/script/ModulePendingScript.h
+++ b/third_party/WebKit/Source/core/script/ModulePendingScript.h
@@ -47,7 +47,7 @@
 };
 
 // PendingScript for a module script
-// https://html.spec.whatwg.org/#module-script.
+// https://html.spec.whatwg.org/multipage/webappapis.html#module-script.
 class CORE_EXPORT ModulePendingScript : public PendingScript {
  public:
   static ModulePendingScript* Create(ScriptElementBase* element,
diff --git a/third_party/WebKit/Source/core/script/ModuleScript.cpp b/third_party/WebKit/Source/core/script/ModuleScript.cpp
index b363ac9..19f829c 100644
--- a/third_party/WebKit/Source/core/script/ModuleScript.cpp
+++ b/third_party/WebKit/Source/core/script/ModuleScript.cpp
@@ -18,7 +18,7 @@
                                    const ScriptFetchOptions& options,
                                    AccessControlStatus access_control_status,
                                    const TextPosition& start_position) {
-  // https://html.spec.whatwg.org/#creating-a-module-script
+  // https://html.spec.whatwg.org/multipage/webappapis.html#creating-a-module-script
 
   // Step 1. "If scripting is disabled for settings's responsible browsing
   // context, then set source to the empty string." [spec text]
@@ -114,7 +114,7 @@
                                            const KURL& base_url,
                                            const ScriptFetchOptions& options,
                                            const TextPosition& start_position) {
-  // https://html.spec.whatwg.org/#creating-a-module-script
+  // https://html.spec.whatwg.org/multipage/webappapis.html#creating-a-module-script
   // Step 4. Set script's parse error and error to rethrow to null.
   // Step 8. Set script's record to result.
   // Step 9. Set script's base URL to baseURL.
diff --git a/third_party/WebKit/Source/core/script/ModuleScript.h b/third_party/WebKit/Source/core/script/ModuleScript.h
index ee237f00..a6d530b 100644
--- a/third_party/WebKit/Source/core/script/ModuleScript.h
+++ b/third_party/WebKit/Source/core/script/ModuleScript.h
@@ -24,7 +24,7 @@
 // https://html.spec.whatwg.org/multipage/webappapis.html#module-script
 class CORE_EXPORT ModuleScript final : public Script, public TraceWrapperBase {
  public:
-  // https://html.spec.whatwg.org/#creating-a-module-script
+  // https://html.spec.whatwg.org/multipage/webappapis.html#creating-a-module-script
   static ModuleScript* Create(
       const String& source_text,
       Modulator*,
@@ -92,7 +92,7 @@
   // https://html.spec.whatwg.org/multipage/webappapis.html#settings-object
   Member<Modulator> settings_object_;
 
-  // https://html.spec.whatwg.org/multipage/webappapis.html#concept-module-script-module-record
+  // https://html.spec.whatwg.org/multipage/webappapis.html#concept-script-record
   TraceWrapperV8Reference<v8::Module> record_;
 
   // https://html.spec.whatwg.org/multipage/webappapis.html#concept-script-parse-error
@@ -132,7 +132,7 @@
   //   will require moderate code changes (e.g. to move compilation timing).
   TraceWrapperV8Reference<v8::Value> parse_error_;
 
-  // https://html.spec.whatwg.org/multipage/webappapis.html##concept-script-error-to-rethrow
+  // https://html.spec.whatwg.org/multipage/webappapis.html#concept-script-error-to-rethrow
   TraceWrapperV8Reference<v8::Value> error_to_rethrow_;
 
   // For CSP check.
diff --git a/third_party/WebKit/Source/core/script/PendingScript.h b/third_party/WebKit/Source/core/script/PendingScript.h
index a36a5e4..9c4299f 100644
--- a/third_party/WebKit/Source/core/script/PendingScript.h
+++ b/third_party/WebKit/Source/core/script/PendingScript.h
@@ -57,7 +57,8 @@
 // A container for an script after "prepare a script" until it is executed.
 // ScriptLoader creates a PendingScript in ScriptLoader::PrepareScript(), and
 // a Script is created via PendingScript::GetSource() when it becomes ready.
-// When "script is ready" https://html.spec.whatwg.org/#the-script-is-ready,
+// When "script is ready"
+// https://html.spec.whatwg.org/multipage/scripting.html#the-script-is-ready,
 // PendingScriptClient is notified.
 class CORE_EXPORT PendingScript
     : public GarbageCollectedFinalized<PendingScript>,
@@ -93,7 +94,7 @@
   virtual Script* GetSource(const KURL& document_url,
                             bool& error_occurred) const = 0;
 
-  // https://html.spec.whatwg.org/#the-script-is-ready
+  // https://html.spec.whatwg.org/multipage/scripting.html#the-script-is-ready
   virtual bool IsReady() const = 0;
   virtual bool IsExternal() const = 0;
   virtual bool ErrorOccurred() const = 0;
@@ -106,7 +107,7 @@
 
   // Used only for tracing, and can return a null URL.
   // TODO(hiroshige): It's preferable to return the base URL consistently
-  // https://html.spec.whatwg.org/#concept-script-base-url
+  // https://html.spec.whatwg.org/multipage/webappapis.html#concept-script-base-url
   // but it requires further refactoring.
   virtual KURL UrlForTracing() const = 0;
 
diff --git a/third_party/WebKit/Source/core/script/README.md b/third_party/WebKit/Source/core/script/README.md
index 8bbb43a..a7a6fbe 100644
--- a/third_party/WebKit/Source/core/script/README.md
+++ b/third_party/WebKit/Source/core/script/README.md
@@ -8,16 +8,16 @@
 
 This directory implements the following scripting concepts in the HTML spec:
 
-*   [`<script>` elements](https://html.spec.whatwg.org/#the-script-element)
+*   [`<script>` elements](https://html.spec.whatwg.org/multipage/scripting.html#the-script-element)
 *   Interactions between scripts and HTML/XML documents/parsers
-*   A part of [Scripting](https://html.spec.whatwg.org/#scripting)
-    * [scripts](https://html.spec.whatwg.org/#definitions-2)
-        * [classic scripts](https://html.spec.whatwg.org/#classic-script)
-        * [module scripts](https://html.spec.whatwg.org/#module-script)
-    * [Fetching](https://html.spec.whatwg.org/#fetching-scripts) scripts
-    * [creating](https://html.spec.whatwg.org/#creating-scripts) scripts
-    * [calling](https://html.spec.whatwg.org/#calling-scripts) scripts
-    * [Integration with the JavaScript module system](https://html.spec.whatwg.org/#integration-with-the-javascript-module-system)
+*   A part of [Scripting](https://html.spec.whatwg.org/multipage/webappapis.html#scripting)
+    * [scripts](https://html.spec.whatwg.org/multipage/webappapis.html#definitions-2)
+        * [classic scripts](https://html.spec.whatwg.org/multipage/webappapis.html#classic-script)
+        * [module scripts](https://html.spec.whatwg.org/multipage/webappapis.html#module-script)
+    * [Fetching](https://html.spec.whatwg.org/multipage/webappapis.html#fetching-scripts) scripts
+    * [creating](https://html.spec.whatwg.org/multipage/webappapis.html#creating-scripts) scripts
+    * [calling](https://html.spec.whatwg.org/multipage/webappapis.html#calling-scripts) scripts
+    * [Integration with the JavaScript module system](https://html.spec.whatwg.org/multipage/webappapis.html#integration-with-the-javascript-module-system)
 
 ## See Also
 
diff --git a/third_party/WebKit/Source/core/script/Script.h b/third_party/WebKit/Source/core/script/Script.h
index 51d93538..1f74d81 100644
--- a/third_party/WebKit/Source/core/script/Script.h
+++ b/third_party/WebKit/Source/core/script/Script.h
@@ -18,7 +18,7 @@
 
 enum class ScriptType { kClassic, kModule };
 
-// https://html.spec.whatwg.org/#concept-script
+// https://html.spec.whatwg.org/multipage/webappapis.html#concept-script
 class CORE_EXPORT Script : public GarbageCollectedFinalized<Script> {
  public:
   virtual void Trace(blink::Visitor* visitor) {}
@@ -27,8 +27,9 @@
 
   virtual ScriptType GetScriptType() const = 0;
 
-  // https://html.spec.whatwg.org/#run-a-classic-script or
-  // https://html.spec.whatwg.org/#run-a-module-script,
+  // https://html.spec.whatwg.org/multipage/webappapis.html#run-a-classic-script
+  // or
+  // https://html.spec.whatwg.org/multipage/webappapis.html#run-a-module-script,
   // depending on the script type.
   virtual void RunScript(LocalFrame*, const SecurityOrigin*) const = 0;
 
@@ -43,7 +44,7 @@
       : fetch_options_(fetch_options), base_url_(base_url) {}
 
  private:
-  // https://html.spec.whatwg.org/#concept-script-script-fetch-options
+  // https://html.spec.whatwg.org/multipage/webappapis.html#concept-script-script-fetch-options
   const ScriptFetchOptions fetch_options_;
 
   // https://html.spec.whatwg.org/multipage/webappapis.html#concept-script-base-url
diff --git a/third_party/WebKit/Source/core/script/ScriptLoader.cpp b/third_party/WebKit/Source/core/script/ScriptLoader.cpp
index 8f2bde29..3564e5f 100644
--- a/third_party/WebKit/Source/core/script/ScriptLoader.cpp
+++ b/third_party/WebKit/Source/core/script/ScriptLoader.cpp
@@ -73,7 +73,7 @@
       will_execute_when_document_finished_parsing_(false),
       created_during_document_write_(created_during_document_write),
       async_exec_type_(ScriptRunner::kNone) {
-  // https://html.spec.whatwg.org/#already-started
+  // https://html.spec.whatwg.org/multipage/scripting.html#already-started
   // "The cloning steps for script elements must set the "already started"
   //  flag on the copy if it is set on the element being cloned."
   // TODO(hiroshige): Cloning is implemented together with
@@ -83,12 +83,12 @@
     already_started_ = true;
 
   if (parser_inserted) {
-    // https://html.spec.whatwg.org/#parser-inserted
+    // https://html.spec.whatwg.org/multipage/scripting.html#parser-inserted
     // "It is set by the HTML parser and the XML parser
     //  on script elements they insert"
     parser_inserted_ = true;
 
-    // https://html.spec.whatwg.org/#non-blocking
+    // https://html.spec.whatwg.org/multipage/scripting.html#non-blocking
     // "It is unset by the HTML parser and the XML parser
     //  on script elements they insert."
     non_blocking_ = false;
@@ -136,7 +136,7 @@
 }
 
 void ScriptLoader::HandleAsyncAttribute() {
-  // https://html.spec.whatwg.org/#non-blocking
+  // https://html.spec.whatwg.org/multipage/scripting.html#non-blocking
   // "In addition, whenever a script element whose "non-blocking" flag is set
   //  has an async content attribute added, the element's "non-blocking" flag
   //  must be unset."
@@ -190,7 +190,8 @@
 
 }  // namespace
 
-// Step 6 of https://html.spec.whatwg.org/#prepare-a-script
+// Step 6 of
+// https://html.spec.whatwg.org/multipage/scripting.html#prepare-a-script
 bool ScriptLoader::IsValidScriptTypeAndLanguage(
     const String& type,
     const String& language,
@@ -221,7 +222,8 @@
   return nomodule && script_type == ScriptType::kClassic;
 }
 
-// Step 16 of https://html.spec.whatwg.org/#prepare-a-script
+// Step 16 of
+// https://html.spec.whatwg.org/multipage/scripting.html#prepare-a-script
 network::mojom::FetchCredentialsMode ScriptLoader::ModuleScriptCredentialsMode(
     CrossOriginAttributeValue cross_origin) {
   switch (cross_origin) {
@@ -243,7 +245,7 @@
                                       support_legacy_types, out_script_type);
 }
 
-// https://html.spec.whatwg.org/#prepare-a-script
+// https://html.spec.whatwg.org/multipage/scripting.html#prepare-a-script
 bool ScriptLoader::PrepareScript(const TextPosition& script_start_position,
                                  LegacyTypeSupport support_legacy_types) {
   // 1. "If the script element is marked as having "already started", then
@@ -699,7 +701,7 @@
 void ScriptLoader::FetchModuleScriptTree(const KURL& url,
                                          Modulator* modulator,
                                          const ScriptFetchOptions& options) {
-  // https://html.spec.whatwg.org/#prepare-a-script
+  // https://html.spec.whatwg.org/multipage/scripting.html#prepare-a-script
   // 22.6, "module":
   //     "Fetch a module script graph given url, settings object, "script", and
   //      options."
@@ -729,7 +731,7 @@
   resource_keep_alive_ = nullptr;
 }
 
-// https://html.spec.whatwg.org/#execute-the-script-block
+// https://html.spec.whatwg.org/multipage/scripting.html#execute-the-script-block
 void ScriptLoader::ExecuteScriptBlock(PendingScript* pending_script,
                                       const KURL& document_url) {
   DCHECK(pending_script);
@@ -898,7 +900,8 @@
          !element_->IsConnected();
 }
 
-// Step 13 of https://html.spec.whatwg.org/#prepare-a-script
+// Step 13 of
+// https://html.spec.whatwg.org/multipage/scripting.html#prepare-a-script
 bool ScriptLoader::IsScriptForEventSupported() const {
   // 1. "Let for be the value of the for attribute."
   String event_attribute = element_->EventAttributeValue();
diff --git a/third_party/WebKit/Source/core/script/ScriptLoader.h b/third_party/WebKit/Source/core/script/ScriptLoader.h
index 448dc04..ef27647c 100644
--- a/third_party/WebKit/Source/core/script/ScriptLoader.h
+++ b/third_party/WebKit/Source/core/script/ScriptLoader.h
@@ -80,12 +80,12 @@
   static network::mojom::FetchCredentialsMode ModuleScriptCredentialsMode(
       CrossOriginAttributeValue);
 
-  // https://html.spec.whatwg.org/#prepare-a-script
+  // https://html.spec.whatwg.org/multipage/scripting.html#prepare-a-script
   bool PrepareScript(const TextPosition& script_start_position =
                          TextPosition::MinimumPosition(),
                      LegacyTypeSupport = kDisallowLegacyTypeInTypeAttribute);
 
-  // https://html.spec.whatwg.org/#execute-the-script-block
+  // https://html.spec.whatwg.org/multipage/scripting.html#execute-the-script-block
   // The single entry point of script execution.
   // PendingScript::Dispose() is called in ExecuteScriptBlock().
   void ExecuteScriptBlock(PendingScript*, const KURL&);
@@ -143,15 +143,15 @@
   bool IsScriptForEventSupported() const;
 
   // FetchClassicScript corresponds to Step 21.6 of
-  // https://html.spec.whatwg.org/#prepare-a-script
+  // https://html.spec.whatwg.org/multipage/scripting.html#prepare-a-script
   // and must NOT be called from outside of PendingScript().
   //
-  // https://html.spec.whatwg.org/#fetch-a-classic-script
+  // https://html.spec.whatwg.org/multipage/webappapis.html#fetch-a-classic-script
   void FetchClassicScript(const KURL&,
                           Document&,
                           const ScriptFetchOptions&,
                           const WTF::TextEncoding&);
-  // https://html.spec.whatwg.org/#fetch-a-module-script-tree
+  // https://html.spec.whatwg.org/multipage/webappapis.html#fetch-a-module-script-tree
   void FetchModuleScriptTree(const KURL&,
                              Modulator*,
                              const ScriptFetchOptions&);
@@ -172,30 +172,30 @@
   Member<ScriptElementBase> element_;
   WTF::OrdinalNumber start_line_number_;
 
-  // https://html.spec.whatwg.org/#script-processing-model
+  // https://html.spec.whatwg.org/multipage/scripting.html#script-processing-model
   // "A script element has several associated pieces of state.":
 
-  // https://html.spec.whatwg.org/#already-started
+  // https://html.spec.whatwg.org/multipage/scripting.html#already-started
   // "Initially, script elements must have this flag unset"
   bool already_started_ = false;
 
-  // https://html.spec.whatwg.org/#parser-inserted
+  // https://html.spec.whatwg.org/multipage/scripting.html#parser-inserted
   // "Initially, script elements must have this flag unset."
   bool parser_inserted_ = false;
 
-  // https://html.spec.whatwg.org/#non-blocking
+  // https://html.spec.whatwg.org/multipage/scripting.html#non-blocking
   // "Initially, script elements must have this flag set."
   bool non_blocking_ = true;
 
-  // https://html.spec.whatwg.org/#ready-to-be-parser-executed
+  // https://html.spec.whatwg.org/multipage/scripting.html#ready-to-be-parser-executed
   // "Initially, script elements must have this flag unset"
   bool ready_to_be_parser_executed_ = false;
 
-  // https://html.spec.whatwg.org/#concept-script-type
+  // https://html.spec.whatwg.org/multipage/scripting.html#concept-script-type
   // "It is determined when the script is prepared"
   ScriptType script_type_ = ScriptType::kClassic;
 
-  // https://html.spec.whatwg.org/#concept-script-external
+  // https://html.spec.whatwg.org/multipage/scripting.html#concept-script-external
   // "It is determined when the script is prepared"
   bool is_external_script_ = false;
 
diff --git a/third_party/WebKit/Source/core/script/ScriptModuleResolverImpl.cpp b/third_party/WebKit/Source/core/script/ScriptModuleResolverImpl.cpp
index 88b0546..815fb55 100644
--- a/third_party/WebKit/Source/core/script/ScriptModuleResolverImpl.cpp
+++ b/third_party/WebKit/Source/core/script/ScriptModuleResolverImpl.cpp
@@ -54,7 +54,7 @@
     const String& specifier,
     const ScriptModule& referrer,
     ExceptionState& exception_state) {
-  // https://html.spec.whatwg.org/multipage/webappapis.html#hostresolveimportedmodule(referencingmodule,-specifier)
+  // https://html.spec.whatwg.org/multipage/webappapis.html#hostresolveimportedmodule(referencingscriptormodule,-specifier)
   DVLOG(1) << "ScriptModuleResolverImpl::resolve(specifier=\"" << specifier
            << ", referrer.hash=" << ScriptModuleHash::GetHash(referrer) << ")";
 
diff --git a/third_party/WebKit/Source/core/script/ScriptModuleResolverImpl.h b/third_party/WebKit/Source/core/script/ScriptModuleResolverImpl.h
index d879fd2..41faec21 100644
--- a/third_party/WebKit/Source/core/script/ScriptModuleResolverImpl.h
+++ b/third_party/WebKit/Source/core/script/ScriptModuleResolverImpl.h
@@ -46,7 +46,7 @@
   ModuleScript* GetHostDefined(const ScriptModule&) const final;
 
   // Implements "Runtime Semantics: HostResolveImportedModule" per HTML spec.
-  // https://html.spec.whatwg.org/#hostresolveimportedmodule(referencingmodule,-specifier)
+  // https://html.spec.whatwg.org/multipage/webappapis.html#hostresolveimportedmodule(referencingscriptormodule,-specifier))
   ScriptModule Resolve(const String& specifier,
                        const ScriptModule& referrer,
                        ExceptionState&) final;
diff --git a/third_party/WebKit/Source/core/script/XMLParserScriptRunner.cpp b/third_party/WebKit/Source/core/script/XMLParserScriptRunner.cpp
index 065516ed..9a8ea35b 100644
--- a/third_party/WebKit/Source/core/script/XMLParserScriptRunner.cpp
+++ b/third_party/WebKit/Source/core/script/XMLParserScriptRunner.cpp
@@ -13,8 +13,10 @@
 namespace blink {
 
 // Spec links:
-// [Parsing] https://html.spec.whatwg.org/#parsing-xhtml-documents
-// [Prepare] https://html.spec.whatwg.org/#prepare-a-script
+// [Parsing]
+// https://html.spec.whatwg.org/multipage/xhtml.html#parsing-xhtml-documents
+// [Prepare]
+// https://html.spec.whatwg.org/multipage/scripting.html#prepare-a-script
 
 XMLParserScriptRunner::XMLParserScriptRunner(XMLParserScriptRunnerHost* host)
     : host_(host) {}
diff --git a/third_party/WebKit/Source/core/script/XMLParserScriptRunner.h b/third_party/WebKit/Source/core/script/XMLParserScriptRunner.h
index 0f4f6fcc..8333743 100644
--- a/third_party/WebKit/Source/core/script/XMLParserScriptRunner.h
+++ b/third_party/WebKit/Source/core/script/XMLParserScriptRunner.h
@@ -17,7 +17,7 @@
 // XMLParserScriptRunner implements the interaction between an XML parser
 // (XMLDocumentParser) and <script> elements and their loading/execution.
 //
-// https://html.spec.whatwg.org/#parsing-xhtml-documents
+// https://html.spec.whatwg.org/multipage/xhtml.html#parsing-xhtml-documents
 class XMLParserScriptRunner final
     : public GarbageCollectedFinalized<XMLParserScriptRunner>,
       public PendingScriptClient {
@@ -42,7 +42,7 @@
   // from PendingScriptClient
   void PendingScriptFinished(PendingScript*) override;
 
-  // https://html.spec.whatwg.org/#pending-parsing-blocking-script
+  // https://html.spec.whatwg.org/multipage/scripting.html#pending-parsing-blocking-script
   // TODO(crbug/717643): Support module scripts, and turn this into
   // TraceWrapperMember<>.
   Member<PendingScript> parser_blocking_script_;
@@ -50,7 +50,7 @@
   Member<XMLParserScriptRunnerHost> host_;
 
   // TODO(crbug/717643): Implement
-  // https://html.spec.whatwg.org/#list-of-scripts-that-will-execute-when-the-document-has-finished-parsing
+  // https://html.spec.whatwg.org/multipage/scripting.html#list-of-scripts-that-will-execute-when-the-document-has-finished-parsing
   DISALLOW_COPY_AND_ASSIGN(XMLParserScriptRunner);
 };
 
diff --git a/third_party/WebKit/Source/modules/netinfo/NetworkInformation.cpp b/third_party/WebKit/Source/modules/netinfo/NetworkInformation.cpp
index 67c417d..b7fa7c39 100644
--- a/third_party/WebKit/Source/modules/netinfo/NetworkInformation.cpp
+++ b/third_party/WebKit/Source/modules/netinfo/NetworkInformation.cpp
@@ -42,23 +42,6 @@
   return "none";
 }
 
-String EffectiveConnectionTypeToString(WebEffectiveConnectionType type) {
-  switch (type) {
-    case WebEffectiveConnectionType::kTypeUnknown:
-    case WebEffectiveConnectionType::kTypeOffline:
-    case WebEffectiveConnectionType::kType4G:
-      return "4g";
-    case WebEffectiveConnectionType::kTypeSlow2G:
-      return "slow-2g";
-    case WebEffectiveConnectionType::kType2G:
-      return "2g";
-    case WebEffectiveConnectionType::kType3G:
-      return "3g";
-  }
-  NOTREACHED();
-  return "4g";
-}
-
 }  // namespace
 
 NetworkInformation* NetworkInformation::Create(ExecutionContext* context) {
@@ -94,24 +77,28 @@
   // effective_type_ is only updated when listening for events, so ask
   // networkStateNotifier if not listening (crbug.com/379841).
   if (!IsObserving()) {
-    return EffectiveConnectionTypeToString(
+    return NetworkStateNotifier::EffectiveConnectionTypeToString(
         GetNetworkStateNotifier().EffectiveType());
   }
 
   // If observing, return m_type which changes when the event fires, per spec.
-  return EffectiveConnectionTypeToString(effective_type_);
+  return NetworkStateNotifier::EffectiveConnectionTypeToString(effective_type_);
 }
 
 unsigned long NetworkInformation::rtt() const {
-  if (!IsObserving())
-    return RoundRtt(GetNetworkStateNotifier().HttpRtt());
+  if (!IsObserving()) {
+    return GetNetworkStateNotifier().RoundRtt(
+        Host(), GetNetworkStateNotifier().HttpRtt());
+  }
 
   return http_rtt_msec_;
 }
 
 double NetworkInformation::downlink() const {
-  if (!IsObserving())
-    return RoundMbps(GetNetworkStateNotifier().DownlinkThroughputMbps());
+  if (!IsObserving()) {
+    return GetNetworkStateNotifier().RoundMbps(
+        Host(), GetNetworkStateNotifier().DownlinkThroughputMbps());
+  }
 
   return downlink_mbps_;
 }
@@ -131,8 +118,11 @@
     bool save_data) {
   DCHECK(GetExecutionContext()->IsContextThread());
 
-  unsigned long new_http_rtt_msec = RoundRtt(http_rtt);
-  double new_downlink_mbps = RoundMbps(downlink_mbps);
+  const String host = Host();
+  unsigned long new_http_rtt_msec =
+      GetNetworkStateNotifier().RoundRtt(host, http_rtt);
+  double new_downlink_mbps =
+      GetNetworkStateNotifier().RoundMbps(host, downlink_mbps);
 
   // This can happen if the observer removes and then adds itself again
   // during notification, or if |transport_rtt| was the only metric that
@@ -232,9 +222,12 @@
       type_(GetNetworkStateNotifier().ConnectionType()),
       downlink_max_mbps_(GetNetworkStateNotifier().MaxBandwidth()),
       effective_type_(GetNetworkStateNotifier().EffectiveType()),
-      http_rtt_msec_(RoundRtt(GetNetworkStateNotifier().HttpRtt())),
-      downlink_mbps_(
-          RoundMbps(GetNetworkStateNotifier().DownlinkThroughputMbps())),
+      http_rtt_msec_(GetNetworkStateNotifier().RoundRtt(
+          Host(),
+          GetNetworkStateNotifier().HttpRtt())),
+      downlink_mbps_(GetNetworkStateNotifier().RoundMbps(
+          Host(),
+          GetNetworkStateNotifier().DownlinkThroughputMbps())),
       save_data_(GetNetworkStateNotifier().SaveDataEnabled()),
       context_stopped_(false) {
   DCHECK_LE(1u, GetNetworkStateNotifier().RandomizationSalt());
@@ -246,75 +239,8 @@
   ContextLifecycleObserver::Trace(visitor);
 }
 
-double NetworkInformation::GetRandomMultiplier() const {
-  if (!GetExecutionContext())
-    return 0.0;
-
-  // The random number should be a function of the hostname to reduce
-  // cross-origin fingerprinting. The random number should also be a function
-  // of randomized salt which is known only to the device. This prevents
-  // origin from removing noise from the estimates.
-  const String host = GetExecutionContext()->Url().Host();
-  if (!host)
-    return 1.0;
-
-  unsigned hash =
-      StringHash::GetHash(host) + GetNetworkStateNotifier().RandomizationSalt();
-  double random_multiplier = 0.9 + static_cast<double>((hash % 21)) * 0.01;
-  DCHECK_LE(0.90, random_multiplier);
-  DCHECK_GE(1.10, random_multiplier);
-  return random_multiplier;
-}
-
-unsigned long NetworkInformation::RoundRtt(
-    const Optional<TimeDelta>& rtt) const {
-  // Limit the size of the buckets and the maximum reported value to reduce
-  // fingerprinting.
-  static const size_t kBucketSize = 50;
-  static const double kMaxRttMsec = 3.0 * 1000;
-
-  if (!rtt.has_value() || !GetExecutionContext()) {
-    // RTT is unavailable. So, return the fastest value.
-    return 0;
-  }
-
-  double rtt_msec = static_cast<double>(rtt.value().InMilliseconds());
-  rtt_msec *= GetRandomMultiplier();
-  rtt_msec = std::min(rtt_msec, kMaxRttMsec);
-
-  DCHECK_LE(0, rtt_msec);
-  DCHECK_GE(kMaxRttMsec, rtt_msec);
-
-  // Round down to the nearest kBucketSize msec value.
-  return std::round(rtt_msec / kBucketSize) * kBucketSize;
-}
-
-double NetworkInformation::RoundMbps(
-    const Optional<double>& downlink_mbps) const {
-  // Limit the size of the buckets and the maximum reported value to reduce
-  // fingerprinting.
-  static const size_t kBucketSize = 50;
-  static const double kMaxDownlinkKbps = 10.0 * 1000;
-
-  double downlink_kbps = 0;
-  if (!downlink_mbps.has_value()) {
-    // Throughput is unavailable. So, return the fastest value.
-    downlink_kbps = kMaxDownlinkKbps;
-  } else {
-    downlink_kbps = downlink_mbps.value() * 1000;
-  }
-  downlink_kbps *= GetRandomMultiplier();
-
-  downlink_kbps = std::min(downlink_kbps, kMaxDownlinkKbps);
-
-  DCHECK_LE(0, downlink_kbps);
-  DCHECK_GE(kMaxDownlinkKbps, downlink_kbps);
-  // Round down to the nearest kBucketSize kbps value.
-  double downlink_kbps_rounded =
-      std::round(downlink_kbps / kBucketSize) * kBucketSize;
-
-  // Convert from Kbps to Mbps.
-  return downlink_kbps_rounded / 1000;
+const String NetworkInformation::Host() const {
+  return GetExecutionContext() ? GetExecutionContext()->Url().Host() : String();
 }
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/modules/netinfo/NetworkInformation.h b/third_party/WebKit/Source/modules/netinfo/NetworkInformation.h
index 6e66c4a..6a4b199 100644
--- a/third_party/WebKit/Source/modules/netinfo/NetworkInformation.h
+++ b/third_party/WebKit/Source/modules/netinfo/NetworkInformation.h
@@ -74,20 +74,11 @@
   void StartObserving();
   void StopObserving();
 
-  // A random number by which the RTT and downlink estimates are multiplied
-  // with. Adding this noise reduces the chances of cross-origin fingerprinting.
-  double GetRandomMultiplier() const;
-
-  // Rounds |rtt| as per the NetInfo spec and to improve privacy.
-  unsigned long RoundRtt(const Optional<TimeDelta>& rtt) const;
-
-  // Rounds |downlink_mbps| as per the NetInfo spec and to improve privacy. The
-  // returned value is in Mbps.
-  double RoundMbps(const Optional<double>& downlink_mbps) const;
-
   // Whether this object is listening for events from NetworkStateNotifier.
   bool IsObserving() const;
 
+  const String Host() const;
+
   // Touched only on context thread.
   WebConnectionType type_;
 
diff --git a/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.cpp b/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.cpp
index 2fdb30d3..c6a0255 100644
--- a/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.cpp
+++ b/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.cpp
@@ -428,11 +428,11 @@
   // Look for fingerprint being modified. Not allowed.  Handle differences in
   // line endings ('\r\n' vs, '\n' when looking for the end of the fingerprint).
   size_t old_fingerprint_end = old_sdp.Find("\r\n", old_fingerprint_pos + 1);
-  if (old_fingerprint_end == std::string::npos) {
+  if (old_fingerprint_end == WTF::kNotFound) {
     old_fingerprint_end = old_sdp.Find("\n", old_fingerprint_pos + 1);
   }
   size_t new_fingerprint_end = new_sdp.Find("\r\n", new_fingerprint_pos + 1);
-  if (new_fingerprint_end == std::string::npos) {
+  if (new_fingerprint_end == WTF::kNotFound) {
     new_fingerprint_end = new_sdp.Find("\n", new_fingerprint_pos + 1);
   }
   return old_sdp.Substring(old_fingerprint_pos,
diff --git a/third_party/WebKit/Source/platform/network/NetworkStateNotifier.cpp b/third_party/WebKit/Source/platform/network/NetworkStateNotifier.cpp
index b18176b..5e8f6761 100644
--- a/third_party/WebKit/Source/platform/network/NetworkStateNotifier.cpp
+++ b/third_party/WebKit/Source/platform/network/NetworkStateNotifier.cpp
@@ -34,6 +34,7 @@
 #include "platform/wtf/Functional.h"
 #include "platform/wtf/StdLibExtras.h"
 #include "platform/wtf/Threading.h"
+#include "platform/wtf/text/StringHash.h"
 
 namespace blink {
 
@@ -370,4 +371,91 @@
   }
 }
 
+// static
+String NetworkStateNotifier::EffectiveConnectionTypeToString(
+    WebEffectiveConnectionType type) {
+  switch (type) {
+    case WebEffectiveConnectionType::kTypeUnknown:
+    case WebEffectiveConnectionType::kTypeOffline:
+    case WebEffectiveConnectionType::kType4G:
+      return "4g";
+    case WebEffectiveConnectionType::kTypeSlow2G:
+      return "slow-2g";
+    case WebEffectiveConnectionType::kType2G:
+      return "2g";
+    case WebEffectiveConnectionType::kType3G:
+      return "3g";
+  }
+  NOTREACHED();
+  return "4g";
+}
+
+double NetworkStateNotifier::GetRandomMultiplier(const String& host) const {
+  // The random number should be a function of the hostname to reduce
+  // cross-origin fingerprinting. The random number should also be a function
+  // of randomized salt which is known only to the device. This prevents
+  // origin from removing noise from the estimates.
+  if (!host)
+    return 1.0;
+
+  unsigned hash = StringHash::GetHash(host) + RandomizationSalt();
+  double random_multiplier = 0.9 + static_cast<double>((hash % 21)) * 0.01;
+  DCHECK_LE(0.90, random_multiplier);
+  DCHECK_GE(1.10, random_multiplier);
+  return random_multiplier;
+}
+
+unsigned long NetworkStateNotifier::RoundRtt(
+    const String& host,
+    const Optional<TimeDelta>& rtt) const {
+  // Limit the size of the buckets and the maximum reported value to reduce
+  // fingerprinting.
+  static const size_t kBucketSize = 50;
+  static const double kMaxRttMsec = 3.0 * 1000;
+
+  if (!rtt.has_value()) {
+    // RTT is unavailable. So, return the fastest value.
+    return 0;
+  }
+
+  double rtt_msec = static_cast<double>(rtt.value().InMilliseconds());
+  rtt_msec *= GetRandomMultiplier(host);
+  rtt_msec = std::min(rtt_msec, kMaxRttMsec);
+
+  DCHECK_LE(0, rtt_msec);
+  DCHECK_GE(kMaxRttMsec, rtt_msec);
+
+  // Round down to the nearest kBucketSize msec value.
+  return std::round(rtt_msec / kBucketSize) * kBucketSize;
+}
+
+double NetworkStateNotifier::RoundMbps(
+    const String& host,
+    const Optional<double>& downlink_mbps) const {
+  // Limit the size of the buckets and the maximum reported value to reduce
+  // fingerprinting.
+  static const size_t kBucketSize = 50;
+  static const double kMaxDownlinkKbps = 10.0 * 1000;
+
+  double downlink_kbps = 0;
+  if (!downlink_mbps.has_value()) {
+    // Throughput is unavailable. So, return the fastest value.
+    downlink_kbps = kMaxDownlinkKbps;
+  } else {
+    downlink_kbps = downlink_mbps.value() * 1000;
+  }
+  downlink_kbps *= GetRandomMultiplier(host);
+
+  downlink_kbps = std::min(downlink_kbps, kMaxDownlinkKbps);
+
+  DCHECK_LE(0, downlink_kbps);
+  DCHECK_GE(kMaxDownlinkKbps, downlink_kbps);
+  // Round down to the nearest kBucketSize kbps value.
+  double downlink_kbps_rounded =
+      std::round(downlink_kbps / kBucketSize) * kBucketSize;
+
+  // Convert from Kbps to Mbps.
+  return downlink_kbps_rounded / 1000;
+}
+
 }  // namespace blink
diff --git a/third_party/WebKit/Source/platform/network/NetworkStateNotifier.h b/third_party/WebKit/Source/platform/network/NetworkStateNotifier.h
index 3fe4b6b..6af2d9a 100644
--- a/third_party/WebKit/Source/platform/network/NetworkStateNotifier.h
+++ b/third_party/WebKit/Source/platform/network/NetworkStateNotifier.h
@@ -39,6 +39,7 @@
 #include "platform/wtf/ThreadingPrimitives.h"
 #include "platform/wtf/Time.h"
 #include "platform/wtf/Vector.h"
+#include "platform/wtf/text/WTFString.h"
 #include "public/platform/WebConnectionType.h"
 #include "public/platform/WebEffectiveConnectionType.h"
 
@@ -237,6 +238,19 @@
       NetworkStateObserver*,
       scoped_refptr<base::SingleThreadTaskRunner>);
 
+  // Returns the String equivalent for a given WebEffectiveCOnnectionType.
+  static String EffectiveConnectionTypeToString(WebEffectiveConnectionType);
+
+  // Returns |rtt| after adding host-specific random noise, and rounding it as
+  // per the NetInfo spec to improve privacy.
+  unsigned long RoundRtt(const String& host,
+                         const Optional<TimeDelta>& rtt) const;
+
+  // Returns |downlink_mbps| after adding host-specific random noise, and
+  // rounding it as per the NetInfo spec and to improve privacy.
+  double RoundMbps(const String& host,
+                   const Optional<double>& downlink_mbps) const;
+
   // Returns the randomization salt (weak and insecure) that should be used when
   // adding noise to the network quality metrics. This is known only to the
   // device, and is generated only once. This makes it possible to add the same
@@ -299,6 +313,11 @@
                               ObserverList*,
                               scoped_refptr<base::SingleThreadTaskRunner>);
 
+  // A random number by which the RTT and downlink estimates are multiplied
+  // with. The returned random multiplier is a function of the hostname.
+  // Adding this noise reduces the chances of cross-origin fingerprinting.
+  double GetRandomMultiplier(const String& host) const;
+
   mutable Mutex mutex_;
   NetworkState state_;
   bool has_override_;
diff --git a/third_party/WebKit/public/BUILD.gn b/third_party/WebKit/public/BUILD.gn
index 3df9e52..1ab265d 100644
--- a/third_party/WebKit/public/BUILD.gn
+++ b/third_party/WebKit/public/BUILD.gn
@@ -768,6 +768,7 @@
     "platform/modules/permissions/permission.mojom",
     "platform/modules/permissions/permission_status.mojom",
     "platform/modules/presentation/presentation.mojom",
+    "platform/modules/webauth/virtual_authenticator.mojom",
     "platform/modules/webdatabase/web_database.mojom",
     "platform/oom_intervention.mojom",
     "platform/referrer.mojom",
diff --git a/third_party/WebKit/public/common/frame/sandbox_flags.h b/third_party/WebKit/public/common/frame/sandbox_flags.h
index 4ce3b2f..37b63b8 100644
--- a/third_party/WebKit/public/common/frame/sandbox_flags.h
+++ b/third_party/WebKit/public/common/frame/sandbox_flags.h
@@ -9,7 +9,7 @@
 
 // See http://www.whatwg.org/specs/web-apps/current-work/#attr-iframe-sandbox
 // for a list of the sandbox flags.  This enum should be kept in sync with
-// Source/core/dom/SandboxFlags.h, as enforced in SandboxFlags.cpp.
+// Source/core/frame/SandboxFlags.h, as enforced in SandboxFlags.cpp.
 enum class WebSandboxFlags : int {
   kNone = 0,
   kNavigation = 1,
diff --git a/third_party/WebKit/public/platform/modules/webauth/virtual_authenticator.mojom b/third_party/WebKit/public/platform/modules/webauth/virtual_authenticator.mojom
new file mode 100644
index 0000000..d0bf38c
--- /dev/null
+++ b/third_party/WebKit/public/platform/modules/webauth/virtual_authenticator.mojom
@@ -0,0 +1,54 @@
+// Copyright 2018 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 webauth.test.mojom;
+
+import "url/mojom/url.mojom";
+import "third_party/WebKit/public/platform/modules/webauth/authenticator.mojom";
+
+// Application protocol that the virtual authenticator should simulate.
+enum ClientToAuthenticatorProtocol {
+  U2F,
+  CTAP2,
+};
+
+// Attributes that the virtual authenticator should simulate.
+struct VirtualAuthenticatorOptions {
+  ClientToAuthenticatorProtocol protocol;
+  webauth.mojom.AuthenticatorTransport transport;
+  webauth.mojom.AuthenticatorAttachment attachment;
+  bool has_resident_key;
+  bool has_user_verification;
+};
+
+// Encapsulates both public (key handle) and private information associated
+// with a single registration on a single virtual authenticator device.
+struct RegisteredKey {
+  array<uint8> key_handle;
+  array<uint8> application_parameter;
+  // The EC private key in PKCS#8 format.
+  array<uint8> private_key;
+  int32 counter;
+};
+
+// Represents a stateful virtual authenticator device.
+interface VirtualAuthenticator {
+  GetUniqueId() => (string id);
+
+  AddRegistration(RegisteredKey key) => (bool added);
+  GetRegistrations() => (array<RegisteredKey> keys);
+  ClearRegistrations() => ();
+
+  SetUserPresence(bool present) => ();
+  GetUserPresence() => (bool present);
+};
+
+// Manages a virtual environment where the Web Authentication API talks to a
+// set of virtual authenticators instead of real physical devices.
+interface VirtualAuthenticatorManager {
+  CreateAuthenticator(VirtualAuthenticatorOptions options) => (VirtualAuthenticator authenticator);
+  GetAuthenticators() => (array<VirtualAuthenticator> authenticators);
+  RemoveAuthenticator(string id) => (bool removed);
+  ClearAuthenticators() => ();
+};
diff --git a/third_party/WebKit/public/web/WebLocalFrame.h b/third_party/WebKit/public/web/WebLocalFrame.h
index 1dc822f2..0086d1ee4 100644
--- a/third_party/WebKit/public/web/WebLocalFrame.h
+++ b/third_party/WebKit/public/web/WebLocalFrame.h
@@ -798,6 +798,9 @@
   // Load the given URL.
   virtual void LoadRequest(const WebURLRequest&) = 0;
 
+  // Check whether loading has completed based on subframe state, etc.
+  virtual void CheckCompleted() = 0;
+
   // Geometry -----------------------------------------------------------------
 
   // NOTE: These routines do not force page layout so their results may
diff --git a/third_party/WebKit/public/web/WebRemoteFrameClient.h b/third_party/WebKit/public/web/WebRemoteFrameClient.h
index 6e12d0d..b9da1d3 100644
--- a/third_party/WebKit/public/web/WebRemoteFrameClient.h
+++ b/third_party/WebKit/public/web/WebRemoteFrameClient.h
@@ -26,6 +26,10 @@
   // and release any resources associated with it.
   virtual void FrameDetached(DetachType) {}
 
+  // Notifies the remote frame to check whether it is done loading, after one
+  // of its children finishes loading.
+  virtual void CheckCompleted() {}
+
   // Notifies the embedder that a postMessage was issued to a remote frame.
   virtual void ForwardPostMessage(WebLocalFrame* source_frame,
                                   WebRemoteFrame* target_frame,
diff --git a/tools/ipc_fuzzer/fuzzer/fuzzer.cc b/tools/ipc_fuzzer/fuzzer/fuzzer.cc
index c1c9757..5a488bf6 100644
--- a/tools/ipc_fuzzer/fuzzer/fuzzer.cc
+++ b/tools/ipc_fuzzer/fuzzer/fuzzer.cc
@@ -1257,14 +1257,6 @@
 };
 
 template <>
-struct FuzzTraits<PP_KeyInformation> {
-  static bool Fuzz(PP_KeyInformation* p, Fuzzer* fuzzer) {
-    // TODO(mbarbella): This should actually do something.
-    return true;
-  }
-};
-
-template <>
 struct FuzzTraits<PP_NetAddress_Private> {
   static bool Fuzz(PP_NetAddress_Private* p, Fuzzer* fuzzer) {
     p->size = RandInRange(sizeof(p->data) + 1);
diff --git a/tools/ipc_fuzzer/message_tools/message_list.cc b/tools/ipc_fuzzer/message_tools/message_list.cc
index e07f32c..2926b7b 100644
--- a/tools/ipc_fuzzer/message_tools/message_list.cc
+++ b/tools/ipc_fuzzer/message_tools/message_list.cc
@@ -47,16 +47,15 @@
   // Exclude test and other non-browser files from consideration.  Do not
   // include message files used inside the actual chrome browser in this list.
   exemptions.push_back(TestMsgStart);
-  exemptions.push_back(FirefoxImporterUnittestMsgStart);
   exemptions.push_back(ShellMsgStart);
   exemptions.push_back(LayoutTestMsgStart);
-  exemptions.push_back(MetroViewerMsgStart);
-  exemptions.push_back(CCMsgStart);  // Nothing but param traits.
   exemptions.push_back(CastCryptoMsgStart);   // Reserved for chromecast.
   exemptions.push_back(CastChannelMsgStart);  // Reserved for chromecast.
   exemptions.push_back(CastMediaMsgStart);    // Reserved for chromecast.
   exemptions.push_back(IPCTestMsgStart);
-  exemptions.push_back(WorkerMsgStart);  // Now only used by tests.
+  exemptions.push_back(WorkerMsgStart);    // Now only used by tests.
+  exemptions.push_back(ResourceMsgStart);  // Cleanup underway.
+  exemptions.push_back(ChromeUtilityPrintingMsgStart);  // BUILDFLAGS, sigh.
 
 #if !BUILDFLAG(ENABLE_NACL)
   exemptions.push_back(NaClMsgStart);
@@ -81,10 +80,6 @@
   exemptions.push_back(OzoneGpuMsgStart);
 #endif  // !defined(USE_OZONE)
 
-#if !defined(OS_WIN)
-  exemptions.push_back(DWriteFontProxyMsgStart);
-#endif
-
   for (size_t i = 0; i < MSGTABLE_SIZE; ++i) {
     int class_id = IPC_MESSAGE_ID_CLASS(msgtable[i].id);
     file_name = msgtable[i].file;
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 0d6ac847..c90476d6 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -6863,6 +6863,16 @@
   <int value="12" label="CONTEXT_LOST_INVALID_GPU_MESSAGE"/>
 </enum>
 
+<enum name="ContextMenuDOMElementFrame">
+  <summary>The frame that the element was found in.</summary>
+  <int value="0" label="Main frame">
+    Recorded when the element was found in the main frame.
+  </int>
+  <int value="1" label="iframe">
+    Recorded when the element was found in an iframe.
+  </int>
+</enum>
+
 <enum name="ContextMenuOption">
   <summary>The item selected from a context menu</summary>
   <int value="0" label="Open in new tab"/>
@@ -26274,6 +26284,7 @@
   <int value="-844537521" label="HttpFormWarning:disabled"/>
   <int value="-844381918" label="ArcNativeBridgeExperiment:disabled"/>
   <int value="-842438090" label="enable-md-feedback"/>
+  <int value="-839664591" label="enable-web-authentication-testing-api"/>
   <int value="-836123854" label="wallet-service-use-sandbox"/>
   <int value="-835672415" label="PointerEventV1SpecCapturing:disabled"/>
   <int value="-834661509" label="ModalPermissionPrompts:disabled"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 2ce9d98..f269065 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -12310,6 +12310,14 @@
   </summary>
 </histogram>
 
+<histogram name="ContextMenu.DOMElementFrame" enum="ContextMenuDOMElementFrame">
+  <owner>michaeldo@chromium.org</owner>
+  <summary>
+    Logged when the Context Menu will be displayed. Also logs if the element for
+    the last touch was found in the main frame or a iframe. Only logged on iOS.
+  </summary>
+</histogram>
+
 <histogram name="ContextMenu.SaveLinkType" enum="ContextMenuSaveLinkType">
   <owner>qinmin@chromium.org</owner>
   <summary>
diff --git a/tools/perf/contrib/vr_benchmarks/webvr_wpr_pages.py b/tools/perf/contrib/vr_benchmarks/webvr_wpr_pages.py
index 79b087c5..1322a53f 100644
--- a/tools/perf/contrib/vr_benchmarks/webvr_wpr_pages.py
+++ b/tools/perf/contrib/vr_benchmarks/webvr_wpr_pages.py
@@ -92,7 +92,7 @@
     # opening when you enter VR, but we're still viewing a relatively complex
     # WebGL scene, so it's still useful for perf testing
     def UnderNeonLightsInteraction(action_runner, _):
-      action_runner.WaitForNetworkQuiescence()
+      action_runner.WaitForNetworkQuiescence(timeout_in_seconds=30)
       # The VR button doesn't have any unique ID or anything, so instead select
       # based on the unique text in a child div
       action_runner.WaitForElement(text='Start in VR')
diff --git a/tools/perf/fetch_benchmark_deps.py b/tools/perf/fetch_benchmark_deps.py
index 8892fd7..9bb5f39 100755
--- a/tools/perf/fetch_benchmark_deps.py
+++ b/tools/perf/fetch_benchmark_deps.py
@@ -9,6 +9,7 @@
 import optparse
 import os
 import sys
+import logging
 
 from core import benchmark_finders
 from core import path_util
@@ -24,14 +25,14 @@
 
 def _FetchDependenciesIfNeeded(story_set):
   """ Download files needed by a user story set. """
-  if not story_set.wpr_archive_info:
-    return
-
   # Download files in serving_dirs.
   serving_dirs = story_set.serving_dirs
   for directory in serving_dirs:
     cloud_storage.GetFilesInDirectoryIfChanged(directory, story_set.bucket)
 
+  if not story_set.wpr_archive_info:
+    return
+
   # Download WPR files.
   if any(not story.is_local for story in story_set):
     story_set.wpr_archive_info.DownloadArchivesIfNeeded()
@@ -63,7 +64,7 @@
   return [dep[prefix_len:] for dep in deps if dep]
 
 
-def FetchDepsForBenchmark(benchmark, output):
+def FetchDepsForBenchmark(benchmark):
   # Create a dummy options object which hold default values that are expected
   # by Benchmark.CreateStorySet(options) method.
   parser = optparse.OptionParser()
@@ -74,13 +75,13 @@
   # Download files according to specified benchmark.
   _FetchDependenciesIfNeeded(story_set)
 
-  # Print files downloaded.
+  # Log files downloaded.
   deps = _EnumerateDependencies(story_set)
   for dep in deps:
-    print >> output, dep
+    logging.info(dep)
 
 
-def main(args, output):
+def main(args):
   parser = argparse.ArgumentParser(
          description='Fetch the dependencies of perf benchmark(s).')
   parser.add_argument('benchmark_name', type=str, nargs='?')
@@ -88,9 +89,19 @@
                       help=('Force fetching all the benchmarks when '
                             'benchmark_name is not specified'),
                       action='store_true', default=False)
+  parser.add_argument(
+        '-v', '--verbose', action='count', dest='verbosity',
+        help='Increase verbosity level (repeat as needed)')
 
   options = parser.parse_args(args)
 
+  if options.verbosity >= 2:
+    logging.getLogger().setLevel(logging.DEBUG)
+  elif options.verbosity:
+    logging.getLogger().setLevel(logging.INFO)
+  else:
+    logging.getLogger().setLevel(logging.WARNING)
+
   if options.benchmark_name:
     perf_dir = path_util.GetPerfDir()
     benchmark_dirs=[os.path.join(perf_dir, 'benchmarks'),
@@ -101,15 +112,15 @@
         options.benchmark_name, config)
     if not benchmark:
       raise ValueError('No such benchmark: %s' % options.benchmark_name)
-    FetchDepsForBenchmark(benchmark, output)
+    FetchDepsForBenchmark(benchmark)
   else:
     if not options.force:
       raw_input(
           'No benchmark name is specified. Fetching all benchmark deps. '
           'Press enter to continue...')
     for b in benchmark_finders.GetAllPerfBenchmarks():
-      print >> output, ('Fetch dependencies for benchmark %s' % b.Name())
-      FetchDepsForBenchmark(b, output)
+      logging.info('Fetch dependencies for benchmark %s', b.Name())
+      FetchDepsForBenchmark(b)
 
 if __name__ == '__main__':
-  main(sys.argv[1:], sys.stdout)
+  main(sys.argv[1:])
diff --git a/tools/perf/fetch_benchmark_deps_unittest.py b/tools/perf/fetch_benchmark_deps_unittest.py
index 9c2485e..faf909a 100644
--- a/tools/perf/fetch_benchmark_deps_unittest.py
+++ b/tools/perf/fetch_benchmark_deps_unittest.py
@@ -4,14 +4,15 @@
 
 import os
 import unittest
-import StringIO
 
 import mock  # pylint: disable=import-error
 
+from py_utils import cloud_storage
+from telemetry.wpr import archive_info
+
 from core import path_util
 import fetch_benchmark_deps
 
-
 def NormPaths(paths):
   return sorted([os.path.normcase(p) for p in paths.splitlines()])
 
@@ -24,44 +25,34 @@
   py_utils.cloud_storage.GetFilesInDirectoryIfChanged
   """
 
-  def _RunFetchBenchmarkDepsTest(self, benchmark_name,
-                                 expected_fetched_file_paths=None):
-    """Simulates './fetch_benchmark_deps [benchmark_name]'
-
-    It checks if the paths returned are expected and have corresponding sha1
-    checksums. The expected result can be omitted if the dependencies of
-    specified benchmarks are subject to changes.
-
-    Args:
-      benchmark_name: benchmark name
-      expected_fetched_file_paths: the expected result.
-    """
-    args = [benchmark_name]
-    output = StringIO.StringIO()
-    with mock.patch('telemetry.wpr.archive_info.WprArchiveInfo'
-                    '.DownloadArchivesIfNeeded') as mock_download:
+  def testFetchWPRs(self):
+    args = ['smoothness.top_25_smooth']
+    with mock.patch.object(archive_info.WprArchiveInfo,
+        'DownloadArchivesIfNeeded', autospec=True) as mock_download:
       with mock.patch('py_utils.cloud_storage'
                       '.GetFilesInDirectoryIfChanged') as mock_get:
         mock_download.return_value = True
         mock_get.GetFilesInDirectoryIfChanged.return_value = True
-        fetch_benchmark_deps.main(args, output)
-    for f in output.getvalue().splitlines():
-      fullpath = os.path.join(path_util.GetChromiumSrcDir(), f)
-      sha1path = fullpath + '.sha1'
-      self.assertTrue(os.path.isfile(sha1path))
-    if expected_fetched_file_paths:
-      self.assertEquals(expected_fetched_file_paths,
-                        NormPaths(output.getvalue()))
-
-  def testFetchWPRs(self):
-    self._RunFetchBenchmarkDepsTest('smoothness.top_25_smooth')
+        fetch_benchmark_deps.main(args)
+        self.assertEqual(
+            # pylint: disable=protected-access
+            os.path.normpath(mock_download.call_args[0][0]._file_path),
+            os.path.join(path_util.GetPerfStorySetsDir(), 'data',
+            'top_25_smooth.json'))
+        # This benchmark doesn't use any static local files.
+        self.assertFalse(mock_get.called)
 
   def testFetchServingDirs(self):
-    self._RunFetchBenchmarkDepsTest('media.desktop')
-
-  def testFetchOctane(self):
-    octane_wpr_path = os.path.join(
-        os.path.dirname(__file__), 'page_sets', 'data', 'octane_002.wprgo')
-    expected = os.path.relpath(octane_wpr_path,
-                               path_util.GetChromiumSrcDir())
-    self._RunFetchBenchmarkDepsTest('octane', NormPaths(expected))
+    args = ['media.desktop']
+    with mock.patch.object(archive_info.WprArchiveInfo,
+        'DownloadArchivesIfNeeded', autospec=True) as mock_download:
+      with mock.patch('py_utils.cloud_storage'
+                      '.GetFilesInDirectoryIfChanged') as mock_get:
+        mock_download.return_value = True
+        mock_get.GetFilesInDirectoryIfChanged.return_value = True
+        fetch_benchmark_deps.main(args)
+        # This benchmark doesn't use any archive files.
+        self.assertFalse(mock_download.called)
+        mock_get.assert_called_once_with(
+            os.path.join(path_util.GetPerfStorySetsDir(), 'media_cases'),
+            cloud_storage.PARTNER_BUCKET)
diff --git a/tools/perf/process_perf_results.py b/tools/perf/process_perf_results.py
index 4149c6d..06fdb4b2 100755
--- a/tools/perf/process_perf_results.py
+++ b/tools/perf/process_perf_results.py
@@ -56,7 +56,8 @@
   return False
 
 
-def _merge_json_output(output_json, jsons_to_merge, perf_results_link):
+def _merge_json_output(output_json, jsons_to_merge, perf_results_link,
+    perf_results_file_name):
   """Merges the contents of one or more results JSONs.
 
   Args:
@@ -68,7 +69,7 @@
   merged_results = results_merger.merge_test_results(jsons_to_merge)
 
   merged_results['links'] = {
-    'perf results': perf_results_link
+    perf_results_file_name: perf_results_link
   }
 
   with open(output_json, 'w') as f:
@@ -152,11 +153,14 @@
             oauth_file, tmpfile_dir, logdog_dict, is_ref)
         upload_failure = upload_failure or upload_fail
 
-      logdog_file_name = 'perf_results'
+      logdog_file_name = 'Results_Dashboard'
+      if upload_failure:
+        logdog_file_name += '_Upload_Failure'
       _merge_json_output(output_json, test_results_list,
           logdog_helper.text(logdog_file_name,
               json.dumps(logdog_dict, sort_keys=True,
-                  indent=4, separators=(',', ':'))))
+                  indent=4, separators=(',', ':'))),
+          logdog_file_name.replace('_', ' '))
   finally:
     shutil.rmtree(tmpfile_dir)
   return upload_failure
@@ -187,11 +191,15 @@
     logdog_dict[base_benchmark_name]['perf_results_ref'] = \
         output_json_file.get_viewer_url()
   else:
-    logdog_dict[base_benchmark_name]['dashboard_url'] = \
-        upload_results_to_perf_dashboard.GetDashboardUrl(
-            benchmark_name,
-            configuration_name, RESULTS_URL,
-            build_properties['got_revision_cp'])
+    if upload_failure:
+      logdog_dict[base_benchmark_name]['dashboard_url'] = \
+          'upload failed'
+    else:
+      logdog_dict[base_benchmark_name]['dashboard_url'] = \
+          upload_results_to_perf_dashboard.GetDashboardUrl(
+              benchmark_name,
+              configuration_name, RESULTS_URL,
+              build_properties['got_revision_cp'])
     logdog_dict[base_benchmark_name]['perf_results'] = \
         output_json_file.get_viewer_url()
 
diff --git a/ui/arc/notification/arc_notification_content_view.cc b/ui/arc/notification/arc_notification_content_view.cc
index 51ce98e..d874c8d1 100644
--- a/ui/arc/notification/arc_notification_content_view.cc
+++ b/ui/arc/notification/arc_notification_content_view.cc
@@ -333,8 +333,11 @@
   DCHECK(!control_buttons_view_);
   DCHECK(!floating_control_buttons_widget_);
 
-  CHECK_EQ(ArcNotificationView::kViewClassName, parent()->GetClassName());
+  CHECK_EQ(message_center::MessageView::kViewClassName,
+           parent()->GetClassName());
   auto* notification_view = static_cast<ArcNotificationView*>(parent());
+  CHECK_EQ(ArcNotificationView::kMessageViewSubClassName,
+           notification_view->GetMessageViewSubClassName());
 
   // Creates the control_buttons_view_, which collects all control buttons into
   // a horizontal box.
@@ -625,10 +628,14 @@
 }
 
 void ArcNotificationContentView::OnFocus() {
-  CHECK_EQ(ArcNotificationView::kViewClassName, parent()->GetClassName());
+  CHECK_EQ(message_center::MessageView::kViewClassName,
+           parent()->GetClassName());
+  auto* notification_view = static_cast<ArcNotificationView*>(parent());
+  CHECK_EQ(ArcNotificationView::kMessageViewSubClassName,
+           notification_view->GetMessageViewSubClassName());
 
   NativeViewHost::OnFocus();
-  static_cast<ArcNotificationView*>(parent())->OnContentFocused();
+  notification_view->OnContentFocused();
 
   if (surface_ && surface_->GetAXTreeId() != -1)
     Activate();
@@ -640,10 +647,14 @@
     return;
   }
 
-  CHECK_EQ(ArcNotificationView::kViewClassName, parent()->GetClassName());
+  CHECK_EQ(message_center::MessageView::kViewClassName,
+           parent()->GetClassName());
+  auto* notification_view = static_cast<ArcNotificationView*>(parent());
+  CHECK_EQ(ArcNotificationView::kMessageViewSubClassName,
+           notification_view->GetMessageViewSubClassName());
 
   NativeViewHost::OnBlur();
-  static_cast<ArcNotificationView*>(parent())->OnContentBlured();
+  notification_view->OnContentBlured();
 }
 
 void ArcNotificationContentView::Activate() {
diff --git a/ui/arc/notification/arc_notification_view.cc b/ui/arc/notification/arc_notification_view.cc
index d4e6eb9..5fbd1f3 100644
--- a/ui/arc/notification/arc_notification_view.cc
+++ b/ui/arc/notification/arc_notification_view.cc
@@ -23,7 +23,8 @@
 namespace arc {
 
 // static
-const char ArcNotificationView::kViewClassName[] = "ArcNotificationView";
+const char ArcNotificationView::kMessageViewSubClassName[] =
+    "ArcNotificationView";
 
 ArcNotificationView::ArcNotificationView(
     ArcNotificationItem* item,
@@ -96,8 +97,8 @@
   }
 }
 
-const char* ArcNotificationView::GetClassName() const {
-  return kViewClassName;
+const char* ArcNotificationView::GetMessageViewSubClassName() const {
+  return kMessageViewSubClassName;
 }
 
 void ArcNotificationView::UpdateControlButtonsVisibility() {
diff --git a/ui/arc/notification/arc_notification_view.h b/ui/arc/notification/arc_notification_view.h
index 54517b1..cab17b4 100644
--- a/ui/arc/notification/arc_notification_view.h
+++ b/ui/arc/notification/arc_notification_view.h
@@ -22,7 +22,7 @@
 class ArcNotificationView : public message_center::MessageView,
                             public ArcNotificationItem::Observer {
  public:
-  static const char kViewClassName[];
+  static const char kMessageViewSubClassName[];
 
   // |content_view| is a view to be hosted in this view.
   ArcNotificationView(ArcNotificationItem* item,
@@ -53,12 +53,12 @@
   bool IsManuallyExpandedOrCollapsed() const override;
   void OnContainerAnimationStarted() override;
   void OnContainerAnimationEnded() override;
+  const char* GetMessageViewSubClassName() const final;
 
   // views::SlideOutController::Delegate:
   void OnSlideChanged() override;
 
   // Overridden from views::View:
-  const char* GetClassName() const override;
   gfx::Size CalculatePreferredSize() const override;
   void Layout() override;
   bool HasFocus() const override;
diff --git a/ui/aura/mus/input_method_mus.cc b/ui/aura/mus/input_method_mus.cc
index 7366a5b..63491da 100644
--- a/ui/aura/mus/input_method_mus.cc
+++ b/ui/aura/mus/input_method_mus.cc
@@ -45,7 +45,7 @@
 
 ui::EventDispatchDetails InputMethodMus::DispatchKeyEvent(
     ui::KeyEvent* event,
-    std::unique_ptr<EventResultCallback> ack_callback) {
+    EventResultCallback ack_callback) {
   DCHECK(event->type() == ui::ET_KEY_PRESSED ||
          event->type() == ui::ET_KEY_RELEASED);
 
@@ -53,8 +53,8 @@
   if (!GetTextInputClient()) {
     ui::EventDispatchDetails dispatch_details = DispatchKeyEventPostIME(event);
     if (ack_callback) {
-      ack_callback->Run(event->handled() ? EventResult::HANDLED
-                                         : EventResult::UNHANDLED);
+      ack_callback.Run(event->handled() ? EventResult::HANDLED
+                                        : EventResult::UNHANDLED);
     }
     return dispatch_details;
   }
@@ -83,7 +83,8 @@
 }
 
 ui::EventDispatchDetails InputMethodMus::DispatchKeyEvent(ui::KeyEvent* event) {
-  ui::EventDispatchDetails dispatch_details = DispatchKeyEvent(event, nullptr);
+  ui::EventDispatchDetails dispatch_details =
+      DispatchKeyEvent(event, EventResultCallback());
   // Mark the event as handled so that EventGenerator doesn't attempt to
   // deliver event as well.
   event->SetHandled();
@@ -130,7 +131,7 @@
 
 ui::EventDispatchDetails InputMethodMus::SendKeyEventToInputMethod(
     const ui::KeyEvent& event,
-    std::unique_ptr<EventResultCallback> ack_callback) {
+    EventResultCallback ack_callback) {
   if (!input_method_) {
     // This code path is hit in tests that don't connect to the server.
     DCHECK(!ack_callback);
@@ -197,9 +198,9 @@
 }
 
 void InputMethodMus::AckPendingCallbacksUnhandled() {
-  for (auto& callback_ptr : pending_callbacks_) {
-    if (callback_ptr)
-      callback_ptr->Run(EventResult::UNHANDLED);
+  for (auto& callback : pending_callbacks_) {
+    if (callback)
+      std::move(callback).Run(EventResult::UNHANDLED);
   }
   pending_callbacks_.clear();
 }
@@ -210,15 +211,16 @@
   // Remove the callback as DispatchKeyEventPostIME() may lead to calling
   // AckPendingCallbacksUnhandled(), which mutates |pending_callbacks_|.
   DCHECK(!pending_callbacks_.empty());
-  std::unique_ptr<EventResultCallback> ack_callback =
-      std::move(pending_callbacks_.front());
+  EventResultCallback ack_callback = std::move(pending_callbacks_.front());
   pending_callbacks_.pop_front();
 
   // |ack_callback| can be null if the standard form of DispatchKeyEvent() is
   // called instead of the version which provides a callback. In mus+ash we
   // use the version with callback, but some unittests use the standard form.
-  if (ack_callback)
-    ack_callback->Run(handled ? EventResult::HANDLED : EventResult::UNHANDLED);
+  if (ack_callback) {
+    std::move(ack_callback)
+        .Run(handled ? EventResult::HANDLED : EventResult::UNHANDLED);
+  }
 }
 
 }  // namespace aura
diff --git a/ui/aura/mus/input_method_mus.h b/ui/aura/mus/input_method_mus.h
index e086071..ae174653 100644
--- a/ui/aura/mus/input_method_mus.h
+++ b/ui/aura/mus/input_method_mus.h
@@ -33,9 +33,9 @@
   ~InputMethodMus() override;
 
   void Init(service_manager::Connector* connector);
-  ui::EventDispatchDetails DispatchKeyEvent(
-      ui::KeyEvent* event,
-      std::unique_ptr<EventResultCallback> ack_callback) WARN_UNUSED_RESULT;
+  ui::EventDispatchDetails DispatchKeyEvent(ui::KeyEvent* event,
+                                            EventResultCallback ack_callback)
+      WARN_UNUSED_RESULT;
 
   // Overridden from ui::InputMethod:
   void OnFocus() override;
@@ -56,7 +56,7 @@
   // Called from DispatchKeyEvent() to call to the InputMethod.
   ui::EventDispatchDetails SendKeyEventToInputMethod(
       const ui::KeyEvent& event,
-      std::unique_ptr<EventResultCallback> ack_callback) WARN_UNUSED_RESULT;
+      EventResultCallback ack_callback) WARN_UNUSED_RESULT;
 
   // Overridden from ui::InputMethodBase:
   void OnDidChangeFocusedClient(ui::TextInputClient* focused_before,
@@ -89,7 +89,7 @@
   // Callbacks supplied to DispatchKeyEvent() are added here while awaiting
   // the response from the server. These are removed when the response is
   // received (ProcessKeyEventCallback()).
-  base::circular_deque<std::unique_ptr<EventResultCallback>> pending_callbacks_;
+  base::circular_deque<EventResultCallback> pending_callbacks_;
 
   DISALLOW_COPY_AND_ASSIGN(InputMethodMus);
 };
diff --git a/ui/aura/mus/input_method_mus_unittest.cc b/ui/aura/mus/input_method_mus_unittest.cc
index 582e0a2..60614f5 100644
--- a/ui/aura/mus/input_method_mus_unittest.cc
+++ b/ui/aura/mus/input_method_mus_unittest.cc
@@ -104,9 +104,8 @@
     TestInputMethod test_input_method;
     InputMethodMusTestApi::SetInputMethod(&input_method_mus,
                                           &test_input_method);
-    std::unique_ptr<EventResultCallback> callback =
-        std::make_unique<EventResultCallback>(base::Bind(
-            &RunFunctionWithEventResult, &was_event_result_callback_run));
+    EventResultCallback callback =
+        base::Bind(&RunFunctionWithEventResult, &was_event_result_callback_run);
 
     ui::EventDispatchDetails details =
         InputMethodMusTestApi::CallSendKeyEventToInputMethod(
@@ -118,7 +117,7 @@
     // Add a null callback as well, to make sure null is deal with.
     details = InputMethodMusTestApi::CallSendKeyEventToInputMethod(
         &input_method_mus, ui::KeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_RETURN, 0),
-        nullptr);
+        InputMethodMus::EventResultCallback());
     ASSERT_TRUE(!details.dispatcher_destroyed && !details.target_destroyed);
     // The event should have been queued.
     EXPECT_EQ(2u, test_input_method.process_key_event_callbacks()->size());
@@ -140,9 +139,8 @@
   InputMethodMus input_method_mus(&input_method_delegate, &window);
   TestInputMethod test_input_method;
   InputMethodMusTestApi::SetInputMethod(&input_method_mus, &test_input_method);
-  std::unique_ptr<EventResultCallback> callback =
-      std::make_unique<EventResultCallback>(base::Bind(
-          &RunFunctionWithEventResult, &was_event_result_callback_run));
+  EventResultCallback callback =
+      base::Bind(&RunFunctionWithEventResult, &was_event_result_callback_run);
   ui::EventDispatchDetails details =
       InputMethodMusTestApi::CallSendKeyEventToInputMethod(
           &input_method_mus,
@@ -206,9 +204,8 @@
                                                 &test_input_client);
   TestInputMethod test_input_method;
   InputMethodMusTestApi::SetInputMethod(&input_method_mus, &test_input_method);
-  std::unique_ptr<EventResultCallback> callback =
-      std::make_unique<EventResultCallback>(base::Bind(
-          &RunFunctionWithEventResult, &was_event_result_callback_run));
+  EventResultCallback callback =
+      base::Bind(&RunFunctionWithEventResult, &was_event_result_callback_run);
   const ui::KeyEvent key_event(ui::ET_KEY_PRESSED, ui::VKEY_RETURN, 0);
   ui::EventDispatchDetails details =
       InputMethodMusTestApi::CallSendKeyEventToInputMethod(
diff --git a/ui/aura/mus/window_tree_client.cc b/ui/aura/mus/window_tree_client.cc
index e864bea..4a98ad0 100644
--- a/ui/aura/mus/window_tree_client.cc
+++ b/ui/aura/mus/window_tree_client.cc
@@ -86,7 +86,7 @@
 // message loop starts, or upon destruction.
 class EventAckHandler : public base::RunLoop::NestingObserver {
  public:
-  explicit EventAckHandler(std::unique_ptr<EventResultCallback> ack_callback)
+  explicit EventAckHandler(EventResultCallback ack_callback)
       : ack_callback_(std::move(ack_callback)) {
     DCHECK(ack_callback_);
     base::RunLoop::AddNestingObserverOnCurrentThread(this);
@@ -96,8 +96,8 @@
     base::RunLoop::RemoveNestingObserverOnCurrentThread(this);
     if (ack_callback_) {
       NotifyPlatformEventSource();
-      ack_callback_->Run(handled_ ? ui::mojom::EventResult::HANDLED
-                                  : ui::mojom::EventResult::UNHANDLED);
+      ack_callback_.Run(handled_ ? ui::mojom::EventResult::HANDLED
+                                 : ui::mojom::EventResult::UNHANDLED);
     }
   }
 
@@ -118,8 +118,8 @@
     // Otherwise we appear unresponsive for the life of the nested run loop.
     if (ack_callback_) {
       NotifyPlatformEventSource();
-      ack_callback_->Run(ui::mojom::EventResult::HANDLED);
-      ack_callback_.reset();
+      ack_callback_.Run(ui::mojom::EventResult::HANDLED);
+      ack_callback_.Reset();
     }
   }
 
@@ -131,7 +131,7 @@
 #endif
   }
 
-  std::unique_ptr<EventResultCallback> ack_callback_;
+  EventResultCallback ack_callback_;
   bool handled_ = false;
 #if defined(USE_OZONE)
   ui::Event* event_ = nullptr;
@@ -885,11 +885,10 @@
   return window_tree_host_ptr;
 }
 
-std::unique_ptr<EventResultCallback>
-WindowTreeClient::CreateEventResultCallback(int32_t event_id) {
-  return std::make_unique<EventResultCallback>(
-      base::Bind(&ui::mojom::WindowTree::OnWindowInputEventAck,
-                 base::Unretained(tree_), event_id));
+EventResultCallback WindowTreeClient::CreateEventResultCallback(
+    int32_t event_id) {
+  return base::Bind(&ui::mojom::WindowTree::OnWindowInputEventAck,
+                    base::Unretained(tree_), event_id);
 }
 
 void WindowTreeClient::OnReceivedCursorLocationMemory(
diff --git a/ui/aura/mus/window_tree_client.h b/ui/aura/mus/window_tree_client.h
index 44dc350..348994e 100644
--- a/ui/aura/mus/window_tree_client.h
+++ b/ui/aura/mus/window_tree_client.h
@@ -349,8 +349,7 @@
       bool parent_drawn,
       const base::Optional<viz::LocalSurfaceId>& local_surface_id);
 
-  std::unique_ptr<EventResultCallback> CreateEventResultCallback(
-      int32_t event_id);
+  EventResultCallback CreateEventResultCallback(int32_t event_id);
 
   void OnReceivedCursorLocationMemory(mojo::ScopedSharedBufferHandle handle);
 
diff --git a/ui/aura/test/mus/input_method_mus_test_api.h b/ui/aura/test/mus/input_method_mus_test_api.h
index e09c5fa..aa4cc8c 100644
--- a/ui/aura/test/mus/input_method_mus_test_api.h
+++ b/ui/aura/test/mus/input_method_mus_test_api.h
@@ -20,8 +20,7 @@
   static ui::EventDispatchDetails CallSendKeyEventToInputMethod(
       InputMethodMus* input_method_mus,
       const ui::KeyEvent& event,
-      std::unique_ptr<InputMethodMus::EventResultCallback> ack_callback)
-      WARN_UNUSED_RESULT {
+      InputMethodMus::EventResultCallback ack_callback) WARN_UNUSED_RESULT {
     return input_method_mus->SendKeyEventToInputMethod(event,
                                                        std::move(ack_callback));
   }
diff --git a/ui/base/ime/input_method_base.cc b/ui/base/ime/input_method_base.cc
index 3ff2cd0..9d2c040 100644
--- a/ui/base/ime/input_method_base.cc
+++ b/ui/base/ime/input_method_base.cc
@@ -143,17 +143,17 @@
 
 ui::EventDispatchDetails InputMethodBase::DispatchKeyEventPostIME(
     ui::KeyEvent* event,
-    std::unique_ptr<base::OnceCallback<void(bool)>> ack_callback) const {
+    base::OnceCallback<void(bool)> ack_callback) const {
   if (delegate_) {
     ui::EventDispatchDetails details =
         delegate_->DispatchKeyEventPostIME(event);
-    if (ack_callback && !ack_callback->is_null())
-      std::move(*ack_callback).Run(event->stopped_propagation());
+    if (ack_callback)
+      std::move(ack_callback).Run(event->stopped_propagation());
     return details;
   }
 
-  if (ack_callback && !ack_callback->is_null())
-    std::move(*ack_callback).Run(false);
+  if (ack_callback)
+    std::move(ack_callback).Run(false);
   return EventDispatchDetails();
 }
 
diff --git a/ui/base/ime/input_method_base.h b/ui/base/ime/input_method_base.h
index 145735c..f58ff32 100644
--- a/ui/base/ime/input_method_base.h
+++ b/ui/base/ime/input_method_base.h
@@ -100,8 +100,7 @@
 
   virtual ui::EventDispatchDetails DispatchKeyEventPostIME(
       ui::KeyEvent* event,
-      std::unique_ptr<base::OnceCallback<void(bool)>> ack_callback) const
-      WARN_UNUSED_RESULT;
+      base::OnceCallback<void(bool)> ack_callback) const WARN_UNUSED_RESULT;
 
   // Convenience method to notify all observers of TextInputClient changes.
   void NotifyTextInputStateChanged(const TextInputClient* client);
diff --git a/ui/base/ime/input_method_chromeos.cc b/ui/base/ime/input_method_chromeos.cc
index 51c26741..f8d540ac 100644
--- a/ui/base/ime/input_method_chromeos.cc
+++ b/ui/base/ime/input_method_chromeos.cc
@@ -105,8 +105,7 @@
         // TODO(shuchen): Eventually, the language input keys should be handed
         // over to the IME extension to process. And IMF can handle if the IME
         // extension didn't handle.
-        return DispatchKeyEventPostIME(
-            event, std::make_unique<AckCallback>(std::move(ack_callback)));
+        return DispatchKeyEventPostIME(event, std::move(ack_callback));
       }
     }
   }
@@ -121,15 +120,12 @@
       if (ExecuteCharacterComposer(*event)) {
         // Treating as PostIME event if character composer handles key event and
         // generates some IME event,
-        return ProcessKeyEventPostIME(
-            event, std::make_unique<AckCallback>(std::move(ack_callback)),
-            false, true);
+        return ProcessKeyEventPostIME(event, std::move(ack_callback), false,
+                                      true);
       }
-      return ProcessUnfilteredKeyPressEvent(
-          event, std::make_unique<AckCallback>(std::move(ack_callback)));
+      return ProcessUnfilteredKeyPressEvent(event, std::move(ack_callback));
     }
-    return DispatchKeyEventPostIME(
-        event, std::make_unique<AckCallback>(std::move(ack_callback)));
+    return DispatchKeyEventPostIME(event, std::move(ack_callback));
   }
 
   handling_key_event_ = true;
@@ -176,9 +172,8 @@
   }
   ui::EventDispatchDetails details;
   if (event->type() == ET_KEY_PRESSED || event->type() == ET_KEY_RELEASED) {
-    details = ProcessKeyEventPostIME(
-        event, std::make_unique<AckCallback>(std::move(ack_callback)), false,
-        is_handled);
+    details = ProcessKeyEventPostIME(event, std::move(ack_callback), false,
+                                     is_handled);
   }
   handling_key_event_ = false;
   return details;
@@ -361,7 +356,7 @@
 
 ui::EventDispatchDetails InputMethodChromeOS::ProcessKeyEventPostIME(
     ui::KeyEvent* event,
-    std::unique_ptr<AckCallback> ack_callback,
+    AckCallback ack_callback,
     bool skip_process_filtered,
     bool handled) {
   TextInputClient* client = GetTextInputClient();
@@ -378,8 +373,8 @@
   // In case the focus was changed by the key event. The |context_| should have
   // been reset when the focused window changed.
   if (client != GetTextInputClient()) {
-    if (ack_callback && !ack_callback->is_null())
-      std::move(*ack_callback).Run(false);
+    if (ack_callback)
+      std::move(ack_callback).Run(false);
     return dispatch_details;
   }
   if (HasInputMethodResult())
@@ -388,14 +383,14 @@
   // In case the focus was changed when sending input method results to the
   // focused window.
   if (client != GetTextInputClient()) {
-    if (ack_callback && !ack_callback->is_null())
-      std::move(*ack_callback).Run(false);
+    if (ack_callback)
+      std::move(ack_callback).Run(false);
     return dispatch_details;
   }
 
   if (handled) {
-    if (ack_callback && !ack_callback->is_null())
-      std::move(*ack_callback).Run(true);
+    if (ack_callback)
+      std::move(ack_callback).Run(true);
     return dispatch_details;  // IME handled the key event. do not forward.
   }
 
@@ -409,11 +404,11 @@
 
 ui::EventDispatchDetails InputMethodChromeOS::ProcessFilteredKeyPressEvent(
     ui::KeyEvent* event,
-    std::unique_ptr<AckCallback> ack_callback) {
-  auto callback = std::make_unique<AckCallback>(base::Bind(
+    AckCallback ack_callback) {
+  auto callback = base::Bind(
       &InputMethodChromeOS::PostProcessFilteredKeyPressEvent,
       weak_ptr_factory_.GetWeakPtr(), base::Owned(new ui::KeyEvent(*event)),
-      GetTextInputClient(), Passed(&ack_callback)));
+      GetTextInputClient(), Passed(&ack_callback));
 
   if (NeedInsertChar())
     return DispatchKeyEventPostIME(event, std::move(callback));
@@ -434,7 +429,7 @@
 void InputMethodChromeOS::PostProcessFilteredKeyPressEvent(
     ui::KeyEvent* event,
     TextInputClient* prev_client,
-    std::unique_ptr<AckCallback> ack_callback,
+    AckCallback ack_callback,
     bool stopped_propagation) {
   // In case the focus was changed by the key event.
   if (GetTextInputClient() != prev_client)
@@ -442,8 +437,8 @@
 
   if (stopped_propagation) {
     ResetContext();
-    if (ack_callback && !ack_callback->is_null())
-      std::move(*ack_callback).Run(true);
+    if (ack_callback)
+      std::move(ack_callback).Run(true);
     return;
   }
   ignore_result(
@@ -452,24 +447,24 @@
 
 ui::EventDispatchDetails InputMethodChromeOS::ProcessUnfilteredKeyPressEvent(
     ui::KeyEvent* event,
-    std::unique_ptr<AckCallback> ack_callback) {
+    AckCallback ack_callback) {
   return DispatchKeyEventPostIME(
       event,
-      std::make_unique<AckCallback>(base::Bind(
-          &InputMethodChromeOS::PostProcessUnfilteredKeyPressEvent,
-          weak_ptr_factory_.GetWeakPtr(), base::Owned(new ui::KeyEvent(*event)),
-          GetTextInputClient(), Passed(&ack_callback))));
+      base::Bind(&InputMethodChromeOS::PostProcessUnfilteredKeyPressEvent,
+                 weak_ptr_factory_.GetWeakPtr(),
+                 base::Owned(new ui::KeyEvent(*event)), GetTextInputClient(),
+                 Passed(&ack_callback)));
 }
 
 void InputMethodChromeOS::PostProcessUnfilteredKeyPressEvent(
     ui::KeyEvent* event,
     TextInputClient* prev_client,
-    std::unique_ptr<AckCallback> ack_callback,
+    AckCallback ack_callback,
     bool stopped_propagation) {
   if (stopped_propagation) {
     ResetContext();
-    if (ack_callback && !ack_callback->is_null())
-      std::move(*ack_callback).Run(false);
+    if (ack_callback)
+      std::move(ack_callback).Run(false);
     return;
   }
 
@@ -482,8 +477,8 @@
   // We should return here not to send the Tab key event to RWHV.
   TextInputClient* client = GetTextInputClient();
   if (!client || client != prev_client) {
-    if (ack_callback && !ack_callback->is_null())
-      std::move(*ack_callback).Run(false);
+    if (ack_callback)
+      std::move(ack_callback).Run(false);
     return;
   }
 
@@ -494,8 +489,8 @@
   if (ch)
     client->InsertChar(*event);
 
-  if (ack_callback && !ack_callback->is_null())
-    std::move(*ack_callback).Run(false);
+  if (ack_callback)
+    std::move(ack_callback).Run(false);
 }
 
 void InputMethodChromeOS::ProcessInputMethodResult(ui::KeyEvent* event,
diff --git a/ui/base/ime/input_method_chromeos.h b/ui/base/ime/input_method_chromeos.h
index e3bcd5b..d38ecc31 100644
--- a/ui/base/ime/input_method_chromeos.h
+++ b/ui/base/ime/input_method_chromeos.h
@@ -50,7 +50,7 @@
   // Process a key returned from the input method.
   virtual ui::EventDispatchDetails ProcessKeyEventPostIME(
       ui::KeyEvent* event,
-      std::unique_ptr<AckCallback> ack_callback,
+      AckCallback ack_callback,
       bool skip_process_filtered,
       bool handled) WARN_UNUSED_RESULT;
 
@@ -79,26 +79,24 @@
   // when dispatching post IME.
   ui::EventDispatchDetails ProcessFilteredKeyPressEvent(
       ui::KeyEvent* event,
-      std::unique_ptr<AckCallback> ack_callback) WARN_UNUSED_RESULT;
+      AckCallback ack_callback) WARN_UNUSED_RESULT;
 
   // Post processes a key event that was already filtered by the input method.
-  void PostProcessFilteredKeyPressEvent(
-      ui::KeyEvent* event,
-      TextInputClient* prev_client,
-      std::unique_ptr<AckCallback> ack_callback,
-      bool stopped_propagation);
+  void PostProcessFilteredKeyPressEvent(ui::KeyEvent* event,
+                                        TextInputClient* prev_client,
+                                        AckCallback ack_callback,
+                                        bool stopped_propagation);
 
   // Processes a key event that was not filtered by the input method.
   ui::EventDispatchDetails ProcessUnfilteredKeyPressEvent(
       ui::KeyEvent* event,
-      std::unique_ptr<AckCallback> ack_callback) WARN_UNUSED_RESULT;
+      AckCallback ack_callback) WARN_UNUSED_RESULT;
 
   // Post processes a key event that was unfiltered by the input method.
-  void PostProcessUnfilteredKeyPressEvent(
-      ui::KeyEvent* event,
-      TextInputClient* prev_client,
-      std::unique_ptr<AckCallback> ack_callback,
-      bool stopped_propagation);
+  void PostProcessUnfilteredKeyPressEvent(ui::KeyEvent* event,
+                                          TextInputClient* prev_client,
+                                          AckCallback ack_callback,
+                                          bool stopped_propagation);
 
   // Sends input method result caused by the given key event to the focused text
   // input client.
diff --git a/ui/base/ime/input_method_chromeos_unittest.cc b/ui/base/ime/input_method_chromeos_unittest.cc
index 9dff2f2..c826c1f 100644
--- a/ui/base/ime/input_method_chromeos_unittest.cc
+++ b/ui/base/ime/input_method_chromeos_unittest.cc
@@ -70,11 +70,10 @@
   };
 
   // Overridden from InputMethodChromeOS:
-  ui::EventDispatchDetails ProcessKeyEventPostIME(
-      ui::KeyEvent* key_event,
-      std::unique_ptr<AckCallback> ack_callback,
-      bool skip_process_filtered,
-      bool handled) override {
+  ui::EventDispatchDetails ProcessKeyEventPostIME(ui::KeyEvent* key_event,
+                                                  AckCallback ack_callback,
+                                                  bool skip_process_filtered,
+                                                  bool handled) override {
     ui::EventDispatchDetails details =
         InputMethodChromeOS::ProcessKeyEventPostIME(
             key_event, std::move(ack_callback), skip_process_filtered, handled);
@@ -974,7 +973,8 @@
                       0,
                       DomKey::DeadKeyFromCombiningCharacter('^'),
                       EventTimeForNow());
-  ime_->ProcessKeyEventPostIME(&eventA, nullptr, false, true);
+  ime_->ProcessKeyEventPostIME(&eventA, InputMethodChromeOS::AckCallback(),
+                               false, true);
 
   const ui::KeyEvent& key_event = dispatched_key_event_;
 
diff --git a/ui/gl/gl_surface_glx.cc b/ui/gl/gl_surface_glx.cc
index 4b051e1..cfca601 100644
--- a/ui/gl/gl_surface_glx.cc
+++ b/ui/gl/gl_surface_glx.cc
@@ -346,8 +346,8 @@
       const gfx::VSyncProvider::UpdateVSyncCallback& callback) override {
     // Only one outstanding request per surface.
     if (!pending_callback_) {
-      pending_callback_ =
-          std::make_unique<gfx::VSyncProvider::UpdateVSyncCallback>(callback);
+      DCHECK(callback);
+      pending_callback_ = callback;
       vsync_thread_->task_runner()->PostTask(
           FROM_HERE,
           base::BindOnce(&SGIVideoSyncProviderThreadShim::GetVSyncParameters,
@@ -370,8 +370,7 @@
   void PendingCallbackRunner(const base::TimeTicks timebase,
                              const base::TimeDelta interval) {
     DCHECK(pending_callback_);
-    pending_callback_->Run(timebase, interval);
-    pending_callback_.reset();
+    std::move(pending_callback_).Run(timebase, interval);
   }
 
   scoped_refptr<SGIVideoSyncThread> vsync_thread_;
@@ -379,7 +378,7 @@
   // Thread shim through which the sync provider is accessed on |vsync_thread_|.
   std::unique_ptr<SGIVideoSyncProviderThreadShim> shim_;
 
-  std::unique_ptr<gfx::VSyncProvider::UpdateVSyncCallback> pending_callback_;
+  gfx::VSyncProvider::UpdateVSyncCallback pending_callback_;
 
   // Raw pointers to sync primitives owned by the shim_.
   // These will only be referenced before we post a task to destroy
diff --git a/ui/message_center/views/message_view.h b/ui/message_center/views/message_view.h
index 3419947..9fc85c5 100644
--- a/ui/message_center/views/message_view.h
+++ b/ui/message_center/views/message_view.h
@@ -62,6 +62,7 @@
   virtual bool IsCloseButtonFocused() const = 0;
   virtual void RequestFocusOnCloseButton() = 0;
   virtual void UpdateControlButtonsVisibility() = 0;
+  virtual const char* GetMessageViewSubClassName() const = 0;
 
   virtual void SetExpanded(bool expanded);
   virtual bool IsExpanded() const;
@@ -90,8 +91,10 @@
   void OnFocus() override;
   void OnBlur() override;
   void Layout() override;
-  const char* GetClassName() const override;
   void OnGestureEvent(ui::GestureEvent* event) override;
+  // Subclasses of MessageView shouldn't use this method to distinguish classes.
+  // Instead, use GetMessageViewSubClassName().
+  const char* GetClassName() const final;
 
   // message_center::SlideOutController::Delegate
   ui::Layer* GetSlideOutLayer() override;
diff --git a/ui/message_center/views/notification_view.cc b/ui/message_center/views/notification_view.cc
index 9f98271..1e374253 100644
--- a/ui/message_center/views/notification_view.cc
+++ b/ui/message_center/views/notification_view.cc
@@ -145,6 +145,8 @@
 
 // NotificationView ////////////////////////////////////////////////////////////
 
+const char NotificationView::kMessageViewSubClassName[] = "NotificationView";
+
 void NotificationView::CreateOrUpdateViews(const Notification& notification) {
   CreateOrUpdateTitleView(notification);
   CreateOrUpdateMessageView(notification);
@@ -635,6 +637,10 @@
   return control_buttons_view_;
 }
 
+const char* NotificationView::GetMessageViewSubClassName() const {
+  return kMessageViewSubClassName;
+}
+
 int NotificationView::GetMessageLineLimit(int title_lines, int width) const {
   // Image notifications require that the image must be kept flush against
   // their icons, but we can allow more text if no image.
diff --git a/ui/message_center/views/notification_view.h b/ui/message_center/views/notification_view.h
index af6611b8..cb96773 100644
--- a/ui/message_center/views/notification_view.h
+++ b/ui/message_center/views/notification_view.h
@@ -33,6 +33,8 @@
 class MESSAGE_CENTER_EXPORT NotificationView : public MessageView,
                                                public views::ButtonListener {
  public:
+  static const char kMessageViewSubClassName[];
+
   explicit NotificationView(const Notification& notification);
   ~NotificationView() override;
 
@@ -52,6 +54,7 @@
   void RequestFocusOnCloseButton() override;
   void UpdateControlButtonsVisibility() override;
   NotificationControlButtonsView* GetControlButtonsView() const override;
+  const char* GetMessageViewSubClassName() const final;
 
  private:
   FRIEND_TEST_ALL_PREFIXES(NotificationViewTest, CreateOrUpdateTest);
diff --git a/ui/message_center/views/notification_view_md.cc b/ui/message_center/views/notification_view_md.cc
index 4deadb0..9e49c1e5 100644
--- a/ui/message_center/views/notification_view_md.cc
+++ b/ui/message_center/views/notification_view_md.cc
@@ -170,6 +170,10 @@
 
 }  // anonymous namespace
 
+// static
+const char NotificationViewMD::kMessageViewSubClassName[] =
+    "NotificationViewMD";
+
 // ItemView ////////////////////////////////////////////////////////////////////
 
 ItemView::ItemView(const NotificationItem& item) {
@@ -1310,6 +1314,10 @@
     MessageView::OnSettingsButtonPressed(event);
 }
 
+const char* NotificationViewMD::GetMessageViewSubClassName() const {
+  return kMessageViewSubClassName;
+}
+
 void NotificationViewMD::Activate() {
   GetWidget()->widget_delegate()->set_can_activate(true);
   GetWidget()->Activate();
diff --git a/ui/message_center/views/notification_view_md.h b/ui/message_center/views/notification_view_md.h
index 3c291e50..23c3e5e 100644
--- a/ui/message_center/views/notification_view_md.h
+++ b/ui/message_center/views/notification_view_md.h
@@ -220,6 +220,8 @@
       public NotificationInputDelegate,
       public views::ButtonListener {
  public:
+  static const char kMessageViewSubClassName[];
+
   explicit NotificationViewMD(const Notification& notification);
   ~NotificationViewMD() override;
 
@@ -255,8 +257,8 @@
   void SetExpanded(bool expanded) override;
   bool IsManuallyExpandedOrCollapsed() const override;
   void SetManuallyExpandedOrCollapsed(bool value) override;
-
   void OnSettingsButtonPressed(const ui::Event& event) override;
+  const char* GetMessageViewSubClassName() const final;
 
   // views::InkDropObserver:
   void InkDropAnimationStarted() override;
diff --git a/ui/views/cocoa/bridged_native_widget.h b/ui/views/cocoa/bridged_native_widget.h
index 64be7882..8b8a250 100644
--- a/ui/views/cocoa/bridged_native_widget.h
+++ b/ui/views/cocoa/bridged_native_widget.h
@@ -268,9 +268,6 @@
   // update its draggable region.
   void SetDraggable(bool draggable);
 
-  // Called by |mouse_down_monitor_| to close a bubble.
-  void OnRightMouseDownWithBubble(NSEvent* event);
-
   // Overridden from CocoaMouseCaptureDelegate:
   void PostCapturedEvent(NSEvent* event) override;
   void OnMouseCaptureLost() override;
@@ -360,9 +357,6 @@
   // the compositor arrives to avoid "blinking".
   bool initial_visibility_suppressed_ = false;
 
-  // Right mouse down monitor for bubble widget.
-  id mouse_down_monitor_;
-
   AssociatedViews associated_views_;
 
   DISALLOW_COPY_AND_ASSIGN(BridgedNativeWidget);
diff --git a/ui/views/cocoa/bridged_native_widget.mm b/ui/views/cocoa/bridged_native_widget.mm
index d88cba9..d98b00d 100644
--- a/ui/views/cocoa/bridged_native_widget.mm
+++ b/ui/views/cocoa/bridged_native_widget.mm
@@ -399,8 +399,7 @@
       target_fullscreen_state_(false),
       in_fullscreen_transition_(false),
       window_visible_(false),
-      wants_to_be_visible_(false),
-      mouse_down_monitor_(nullptr) {
+      wants_to_be_visible_(false) {
   if (BridgedNativeWidget::ShouldUseDragEventMonitor())
     SetupDragEventMonitor();
 
@@ -448,17 +447,6 @@
              name:NSControlTintDidChangeNotification
            object:nil];
 
-  // Right-clicks outside a bubble should dismiss them, but that doesn't cause
-  // loss of focus on Mac, so add an event monitor to detect.
-  if (params.type == Widget::InitParams::TYPE_BUBBLE) {
-    mouse_down_monitor_ = [NSEvent
-        addLocalMonitorForEventsMatchingMask:NSRightMouseDownMask
-        handler:^NSEvent* (NSEvent* event) {
-          OnRightMouseDownWithBubble(event);
-          return event;
-        }];
-  }
-
   // Validate the window's initial state, otherwise the bridge's initial
   // tracking state will be incorrect.
   DCHECK(![window_ isVisible]);
@@ -798,10 +786,6 @@
     parent_ = nullptr;
   }
   [[NSNotificationCenter defaultCenter] removeObserver:window_delegate_];
-  if (mouse_down_monitor_) {
-    [NSEvent removeMonitor:mouse_down_monitor_];
-    mouse_down_monitor_ = nullptr;
-  }
 
   [show_animation_ stopAnimation];  // If set, calls OnShowAnimationComplete().
   DCHECK(!show_animation_);
@@ -1584,26 +1568,4 @@
   [window_ setMovableByWindowBackground:YES];
 }
 
-void BridgedNativeWidget::OnRightMouseDownWithBubble(NSEvent* event) {
-  NSWindow* target = [event window];
-  if ([target isSheet])
-    return;
-
-  // Do not close the bubble if the event happened on a window with a higher
-  // level.  For example, the content of a browser action bubble opens a
-  // calendar picker window with NSPopUpMenuWindowLevel, and a date selection
-  // closes the picker window, but it should not close the bubble.
-  if ([target level] > [window_ level])
-    return;
-
-  // If the event is in |window_|'s hierarchy, do not close the bubble.
-  while (target) {
-    if (target == window_.get())
-      return;
-    target = [target parentWindow];
-  }
-
-  OnWindowKeyStatusChangedTo(false);
-}
-
 }  // namespace views
diff --git a/ui/views/widget/widget_unittest.cc b/ui/views/widget/widget_unittest.cc
index 76a9b283..b978aab 100644
--- a/ui/views/widget/widget_unittest.cc
+++ b/ui/views/widget/widget_unittest.cc
@@ -3226,13 +3226,7 @@
 
 // Tests that frame Layout is called when a widget goes fullscreen without
 // changing its size or title.
-// Fails on Mac, but only on bots. http://crbug.com/607403.
-#if defined(OS_MACOSX)
-#define MAYBE_FullscreenFrameLayout DISABLED_FullscreenFrameLayout
-#else
-#define MAYBE_FullscreenFrameLayout FullscreenFrameLayout
-#endif
-TEST_F(WidgetTest, MAYBE_FullscreenFrameLayout) {
+TEST_F(WidgetTest, FullscreenFrameLayout) {
   WidgetAutoclosePtr widget(CreateTopLevelPlatformWidget());
   FullscreenAwareFrame* frame = new FullscreenAwareFrame(widget.get());
   widget->non_client_view()->SetFrameView(frame);  // Owns |frame|.